diff --git a/.github/workflows/cargo-build-test.yml b/.github/workflows/cargo-build-test.yml
deleted file mode 100644
index cafaa58..0000000
--- a/.github/workflows/cargo-build-test.yml
+++ /dev/null
@@ -1,22 +0,0 @@
-name: Rust
-
-on:
- push:
- branches: [ "master" ]
- pull_request:
- branches: [ "master" ]
-
-env:
- CARGO_TERM_COLOR: always
-
-jobs:
- build:
-
- runs-on: ubuntu-22.04
-
- steps:
- - uses: actions/checkout@v3
- - name: Build
- run: cargo build --verbose
- - name: Run tests
- run: cargo test --verbose
diff --git a/.github/workflows/deploy wasm to gh-pages.yml b/.github/workflows/deploy wasm to gh-pages.yml
deleted file mode 100644
index 1a5bb6f..0000000
--- a/.github/workflows/deploy wasm to gh-pages.yml
+++ /dev/null
@@ -1,34 +0,0 @@
-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 6d00d4c..529ab8d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,19 +1,11 @@
# Build files, documentation, benchmarks
target
-wasm/index.css
-wasm/index.html
-docs/gifs/*
+docs/*
# VSCode/IDE config files
-Cargo.lock
.vscode/*
.rustfmt.toml
.prettierignore
-.prettierrc.json
-# Save files, morgue files
-savegame.json
-morgue
-
-# A default user config will be written on first run, if not present
-config.toml
\ No newline at end of file
+# Savegame
+savegame.json
\ No newline at end of file
diff --git a/Cargo.lock b/Cargo.lock
new file mode 100644
index 0000000..35d24e7
--- /dev/null
+++ b/Cargo.lock
@@ -0,0 +1,3358 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "ab_glyph_rasterizer"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046"
+
+[[package]]
+name = "adler"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
+
+[[package]]
+name = "adler32"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234"
+
+[[package]]
+name = "ahash"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e8fd72866655d1904d6b0997d0b07ba561047d070fbe29de039031c641b61217"
+
+[[package]]
+name = "aho-corasick"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "andrew"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c4afb09dd642feec8408e33f92f3ffc4052946f6b20f32fb99c1f58cd4fa7cf"
+dependencies = [
+ "bitflags 1.3.2",
+ "rusttype",
+ "walkdir",
+ "xdg",
+ "xml-rs",
+]
+
+[[package]]
+name = "android_glue"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "000444226fcff248f2bc4c7625be32c63caccfecc2723a2b9f78a7487a49c407"
+
+[[package]]
+name = "anes"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299"
+
+[[package]]
+name = "anstyle"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3a30da5c5f2d5e72842e00bcb57657162cdabef0931f40e2deb9b4140440cecd"
+
+[[package]]
+name = "anyhow"
+version = "1.0.71"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8"
+
+[[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.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42"
+
+[[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.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3c1d1b160817fb74eebedccd678055cd688d1a73dc1a14519fa30ff4c9a5bdee"
+dependencies = [
+ "byteorder",
+ "lazy_static",
+ "parking_lot 0.11.2",
+ "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 = "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 0.9.1",
+]
+
+[[package]]
+name = "bracket-geometry"
+version = "0.8.7"
+source = "git+https://github.com/amethyst/bracket-lib.git?rev=851f6f08675444fb6fa088b9e67bee9fd75554c6#851f6f08675444fb6fa088b9e67bee9fd75554c6"
+dependencies = [
+ "serde",
+ "ultraviolet 0.9.1",
+]
+
+[[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.2",
+ "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.5",
+]
+
+[[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",
+ "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",
+]
+
+[[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 0.4.1",
+ "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 0.4.1",
+ "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 = "git+https://github.com/amethyst/bracket-lib.git?rev=851f6f08675444fb6fa088b9e67bee9fd75554c6#851f6f08675444fb6fa088b9e67bee9fd75554c6"
+dependencies = [
+ "bracket-color 0.8.7",
+ "bracket-embedding",
+ "byteorder",
+ "flate2",
+]
+
+[[package]]
+name = "bracket-terminal"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "460594df0b3364cae6ce5a5de4d787b293d20df0deffed4a942c10b1e3d50b1d"
+dependencies = [
+ "anyhow",
+ "bracket-color 0.8.2",
+ "bracket-geometry 0.8.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "byteorder",
+ "console_error_panic_hook",
+ "flate2",
+ "glow 0.10.0",
+ "glutin 0.26.0",
+ "image 0.23.14",
+ "lazy_static",
+ "object-pool",
+ "parking_lot 0.11.2",
+ "rand",
+ "ultraviolet 0.8.1",
+ "wasm-bindgen",
+ "wasm-timer",
+ "web-sys",
+ "winit 0.24.0",
+]
+
+[[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",
+ "bracket-embedding",
+ "bracket-geometry 0.8.7 (git+https://github.com/amethyst/bracket-lib.git?rev=851f6f08675444fb6fa088b9e67bee9fd75554c6)",
+ "bracket-rex",
+ "console_error_panic_hook",
+ "glow 0.11.2",
+ "glutin 0.29.1",
+ "image 0.24.6",
+ "lazy_static",
+ "object-pool",
+ "parking_lot 0.12.1",
+ "rand",
+ "ultraviolet 0.9.1",
+ "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.6.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b036167e76041694579972c28cf4877b4f92da222560ddb49008937b6a6727c"
+dependencies = [
+ "log",
+ "nix 0.18.0",
+]
+
+[[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.79"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f"
+
+[[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.3.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1640e5cc7fb47dbb8338fd471b105e7ed6c3cb2aeb00c2e067127ffd3764a05d"
+dependencies = [
+ "clap_builder",
+]
+
+[[package]]
+name = "clap_builder"
+version = "4.3.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "98c59138d527eeaf9b53f35a77fcc1fad9d883116070c63d5de1c7dc7b00c72b"
+dependencies = [
+ "anstyle",
+ "clap_lex",
+]
+
+[[package]]
+name = "clap_lex"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b"
+
+[[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.23.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c54201c07dcf3a5ca33fececb8042aed767ee4bfd5a0235a8ceabcda956044b2"
+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"
+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 0.24.1",
+ "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 0.3.9",
+]
+
+[[package]]
+name = "cty"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35"
+
+[[package]]
+name = "darling"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858"
+dependencies = [
+ "darling_core 0.10.2",
+ "darling_macro 0.10.2",
+]
+
+[[package]]
+name = "darling"
+version = "0.13.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c"
+dependencies = [
+ "darling_core 0.13.4",
+ "darling_macro 0.13.4",
+]
+
+[[package]]
+name = "darling_core"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b"
+dependencies = [
+ "fnv",
+ "ident_case",
+ "proc-macro2",
+ "quote",
+ "strsim 0.9.3",
+ "syn 1.0.109",
+]
+
+[[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 0.10.0",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "darling_macro"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72"
+dependencies = [
+ "darling_core 0.10.2",
+ "quote",
+ "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 0.13.4",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "deflate"
+version = "0.8.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "73770f8e1fe7d64df17ca66ad28994a0a623ea497fa69486e14984e715c5d174"
+dependencies = [
+ "adler32",
+ "byteorder",
+]
+
+[[package]]
+name = "derivative"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 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.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b11f15d1e3268f140f68d390637d5e76d849782d971ae7063e0da69fe9709a76"
+dependencies = [
+ "libloading 0.6.7",
+]
+
+[[package]]
+name = "dlib"
+version = "0.5.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 0.3.9",
+ "wio",
+]
+
+[[package]]
+name = "either"
+version = "1.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91"
+
+[[package]]
+name = "equivalent"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "88bffebc5d80432c9b140ee17875ff173a8ab62faad5b257da912bd2f6c1c0a1"
+
+[[package]]
+name = "errno"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a"
+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.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743"
+dependencies = [
+ "crc32fast",
+ "miniz_oxide 0.7.1",
+]
+
+[[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.23",
+]
+
+[[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 = "fuchsia-zircon"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82"
+dependencies = [
+ "bitflags 1.3.2",
+ "fuchsia-zircon-sys",
+]
+
+[[package]]
+name = "fuchsia-zircon-sys"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7"
+
+[[package]]
+name = "futures"
+version = "0.1.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3a471a38ef8ed83cd6e40aa59c1ffe17db6855c18e3604d9c4ed8c08ebc28678"
+
+[[package]]
+name = "getrandom"
+version = "0.2.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.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "945be163fdb893227410c8b44c2412dade922585b262d1daa6a7e96135217d4c"
+dependencies = [
+ "js-sys",
+ "slotmap",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[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.26.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ae1cbb9176b9151c4ce03f012e3cd1c6c18c4be79edeaeb3d99f5d8085c5fa3"
+dependencies = [
+ "android_glue",
+ "cgl",
+ "cocoa 0.23.0",
+ "core-foundation 0.9.3",
+ "glutin_egl_sys",
+ "glutin_emscripten_sys",
+ "glutin_gles2_sys",
+ "glutin_glx_sys",
+ "glutin_wgl_sys",
+ "lazy_static",
+ "libloading 0.6.7",
+ "log",
+ "objc",
+ "osmesa-sys",
+ "parking_lot 0.11.2",
+ "wayland-client 0.28.6",
+ "wayland-egl 0.28.6",
+ "winapi 0.3.9",
+ "winit 0.24.0",
+]
+
+[[package]]
+name = "glutin"
+version = "0.29.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "444c9ad294fdcaf20ccf6726b78f380b5450275540c9b68ab62f49726ad1c713"
+dependencies = [
+ "cgl",
+ "cocoa 0.24.1",
+ "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 0.29.5",
+ "wayland-egl 0.29.5",
+ "winapi 0.3.9",
+ "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 0.3.9",
+]
+
+[[package]]
+name = "glutin_emscripten_sys"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "80de4146df76e8a6c32b03007bc764ff3249dcaeb4f675d68a06caf1bac363f1"
+
+[[package]]
+name = "glutin_gles2_sys"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e8094e708b730a7c8a1954f4f8a31880af00eb8a1c5b5bf85d28a0a3c6d69103"
+dependencies = [
+ "gl_generator",
+ "objc",
+]
+
+[[package]]
+name = "glutin_glx_sys"
+version = "0.1.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 = "home"
+version = "0.5.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb"
+dependencies = [
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "ident_case"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
+
+[[package]]
+name = "image"
+version = "0.23.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24ffcb7e7244a9bf19d35bf2883b9c080c4ced3c07a9895572178cdb8f13f6a1"
+dependencies = [
+ "bytemuck",
+ "byteorder",
+ "color_quant",
+ "jpeg-decoder 0.1.22",
+ "num-iter",
+ "num-rational 0.3.2",
+ "num-traits",
+ "png 0.16.8",
+]
+
+[[package]]
+name = "image"
+version = "0.24.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "527909aa81e20ac3a44803521443a765550f09b5130c2c2fa1ea59c2f8f50a3a"
+dependencies = [
+ "bytemuck",
+ "byteorder",
+ "color_quant",
+ "jpeg-decoder 0.3.0",
+ "num-rational 0.4.1",
+ "num-traits",
+ "png 0.17.9",
+]
+
+[[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 = "iovec"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e"
+dependencies = [
+ "libc",
+]
+
+[[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.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62b02a5381cc465bd3041d84623d0fa3b66738b52b8e2fc3bab8ad63ab032f4a"
+
+[[package]]
+name = "jni-sys"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130"
+
+[[package]]
+name = "jpeg-decoder"
+version = "0.1.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "229d53d58899083193af11e15917b5640cd40b29ff475a1fe4ef725deb02d0f2"
+
+[[package]]
+name = "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 = "kernel32-sys"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
+dependencies = [
+ "winapi 0.2.8",
+ "winapi-build",
+]
+
+[[package]]
+name = "khronos_api"
+version = "3.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc"
+
+[[package]]
+name = "lazy_static"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+
+[[package]]
+name = "lazycell"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
+
+[[package]]
+name = "libc"
+version = "0.2.147"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3"
+
+[[package]]
+name = "libloading"
+version = "0.6.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "351a32417a12d5f7e82c368a66781e307834dae04c6ce0cd4456d52989229883"
+dependencies = [
+ "cfg-if 1.0.0",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "libloading"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f"
+dependencies = [
+ "cfg-if 1.0.0",
+ "winapi 0.3.9",
+]
+
+[[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.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09fc20d2ca12cb9f044c93e3bd6d32d523e6e2ec3db4f7b2939cd99026ecd3f0"
+
+[[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.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4"
+
+[[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.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
+
+[[package]]
+name = "memmap2"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9b70ca2a6103ac8b665dc150b142ef0e4e89df640c9e6cf295d189c3caebe5a"
+dependencies = [
+ "libc",
+]
+
+[[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.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "791daaae1ed6889560f8c4359194f56648355540573244a5448a83ba1ecc7435"
+dependencies = [
+ "adler32",
+]
+
+[[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.6.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4afd66f5b91bf2a3bc13fad0e21caedac168ca4c707504e75585648ae80e4cc4"
+dependencies = [
+ "cfg-if 0.1.10",
+ "fuchsia-zircon",
+ "fuchsia-zircon-sys",
+ "iovec",
+ "kernel32-sys",
+ "libc",
+ "log",
+ "miow",
+ "net2",
+ "slab",
+ "winapi 0.2.8",
+]
+
+[[package]]
+name = "mio"
+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 = "mio-extras"
+version = "2.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "52403fe290012ce777c4626790c8951324a2b9e3316b3143779c72b029742f19"
+dependencies = [
+ "lazycell",
+ "log",
+ "mio 0.6.23",
+ "slab",
+]
+
+[[package]]
+name = "miow"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ebd808424166322d4a38da87083bfddd3ac4c131334ed55856112eb06d46944d"
+dependencies = [
+ "kernel32-sys",
+ "net2",
+ "winapi 0.2.8",
+ "ws2_32-sys",
+]
+
+[[package]]
+name = "mopa"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a785740271256c230f57462d3b83e52f998433a7062fc18f96d5999474a9f915"
+
+[[package]]
+name = "ndk"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5eb167c1febed0a496639034d0c76b3b74263636045db5489eee52143c246e73"
+dependencies = [
+ "jni-sys",
+ "ndk-sys 0.2.2",
+ "num_enum 0.4.3",
+ "thiserror",
+]
+
+[[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 0.5.11",
+ "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 0.5.11",
+ "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.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bdf399b8b7a39c6fb153c4ec32c72fd5fe789df24a647f229c239aa7adb15241"
+dependencies = [
+ "lazy_static",
+ "libc",
+ "log",
+ "ndk 0.2.1",
+ "ndk-macro 0.2.0",
+ "ndk-sys 0.2.2",
+]
+
+[[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 0.3.0",
+ "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 0.3.0",
+ "ndk-sys 0.4.1+23.1.7779620",
+ "once_cell",
+ "parking_lot 0.12.1",
+]
+
+[[package]]
+name = "ndk-macro"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05d1c6307dc424d0f65b9b06e94f88248e6305726b14729fd67a5e47b2dc481d"
+dependencies = [
+ "darling 0.10.2",
+ "proc-macro-crate 0.1.5",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "ndk-macro"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0df7ac00c4672f9d5aece54ee3347520b7e20f158656c7db2e6de01902eb7a6c"
+dependencies = [
+ "darling 0.13.4",
+ "proc-macro-crate 1.3.1",
+ "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 = "net2"
+version = "0.2.39"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b13b648036a2339d06de780866fbdfda0dde886de7b3af2ddeba8b14f4ee34ac"
+dependencies = [
+ "cfg-if 0.1.10",
+ "libc",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "nix"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "83450fe6a6142ddd95fb064b746083fc4ef1705fe81f64a64e1d4b39f54a1055"
+dependencies = [
+ "bitflags 1.3.2",
+ "cc",
+ "cfg-if 0.1.10",
+ "libc",
+]
+
+[[package]]
+name = "nix"
+version = "0.20.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa9b4819da1bc61c0ea48b63b7bc8604064dd43013e7cc325df098d49cd7c18a"
+dependencies = [
+ "bitflags 1.3.2",
+ "cc",
+ "cfg-if 1.0.0",
+ "libc",
+]
+
+[[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-iter"
+version = "0.1.43"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252"
+dependencies = [
+ "autocfg",
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-rational"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07"
+dependencies = [
+ "autocfg",
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-rational"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0"
+dependencies = [
+ "autocfg",
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "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.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca565a7df06f3d4b485494f25ba05da1435950f4dc263440eda7a6fa9b8e36e4"
+dependencies = [
+ "derivative",
+ "num_enum_derive 0.4.3",
+]
+
+[[package]]
+name = "num_enum"
+version = "0.5.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9"
+dependencies = [
+ "num_enum_derive 0.5.11",
+]
+
+[[package]]
+name = "num_enum_derive"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ffa5a33ddddfee04c0283a7653987d634e880347e96b5b2ed64de07efb59db9d"
+dependencies = [
+ "proc-macro-crate 0.1.5",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[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 1.3.1",
+ "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 = "owned_ttf_parser"
+version = "0.15.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05e6affeb1632d6ff6a23d2cd40ffed138e82f1532571a26f527c8a284bb2fbb"
+dependencies = [
+ "ttf-parser",
+]
+
+[[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 0.3.9",
+]
+
+[[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.16.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3c3287920cb847dee3de33d301c463fba14dda99db24214ddf93f83d3021f4c6"
+dependencies = [
+ "bitflags 1.3.2",
+ "crc32fast",
+ "deflate",
+ "miniz_oxide 0.3.7",
+]
+
+[[package]]
+name = "png"
+version = "0.17.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "59871cc5b6cce7eaccca5a802b4173377a1c2ba90654246789a8fa2334426d11"
+dependencies = [
+ "bitflags 1.3.2",
+ "crc32fast",
+ "fdeflate",
+ "flate2",
+ "miniz_oxide 0.7.1",
+]
+
+[[package]]
+name = "proc-macro-crate"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785"
+dependencies = [
+ "toml",
+]
+
+[[package]]
+name = "proc-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.63"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b368fba921b0dce7e60f5e04ec15e565b3303972b42bcfde1d0713b881959eb"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "573015e8ab27661678357f27dc26460738fd2b6c86e46f386fde94cb5d913105"
+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.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e28f55143d0548dad60bb4fbdc835a3d7ac6acc3324506450c5fdd6e42903a76"
+dependencies = [
+ "libc",
+ "raw-window-handle 0.4.3",
+]
+
+[[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.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "89089e897c013b3deb627116ae56a6955a72b8bed395c9526af31c9fe528b484"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-automata",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa250384981ea14565685dea16a9ccc4d1c541a13f82b9c168572264d1df8c56"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2ab07dc67230e4a4718e70fd5c20055a4334b121f1f9db8fe63ef39ce9b8c846"
+
+[[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-llyrl"
+version = "0.1.0"
+dependencies = [
+ "bracket-lib 0.8.7 (git+https://github.com/amethyst/bracket-lib.git?rev=851f6f08675444fb6fa088b9e67bee9fd75554c6)",
+ "criterion",
+ "lazy_static",
+ "regex",
+ "rltk",
+ "serde",
+ "serde_json",
+ "specs",
+ "specs-derive",
+]
+
+[[package]]
+name = "rustix"
+version = "0.38.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac5ffa1efe7548069688cd7028f32591853cd7b5b756d41bcffd2353e4fc75b4"
+dependencies = [
+ "bitflags 2.3.3",
+ "errno",
+ "libc",
+ "linux-raw-sys",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "rusttype"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3ff8374aa04134254b7995b63ad3dc41c7f7236f69528b28553da7d72efaa967"
+dependencies = [
+ "ab_glyph_rasterizer",
+ "owned_ttf_parser",
+]
+
+[[package]]
+name = "ryu"
+version = "1.0.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fe232bdf6be8c8de797b22184ee71118d63780ea42ac85b61d1baa6d3b782ae9"
+
+[[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.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62a7484307bd40f8f7ccbacccac730108f2cae119a3b11c74485b48aa9ea650f"
+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.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
+
+[[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.166"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d01b7404f9d441d3ad40e6a636a7782c377d2abdbe4fa2440e2edcc2f4f10db8"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.166"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5dd83d6dde2b6b2d466e14d9d1acce8816dedee94f735eac6395808b3483c6d6"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.23",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0f1e14e89be7aa4c4b78bdbdc9eb5bf8517829a600ae8eaa39a6e1d960b5185c"
+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.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "238abfbb77c1915110ad968465608b68e869e0772622c9656714e73e5a1a522f"
+
+[[package]]
+name = "slab"
+version = "0.4.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d"
+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.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4750c76fd5d3ac95fa3ed80fe667d6a3d8590a960e5b575b98eea93339a80b80"
+dependencies = [
+ "andrew",
+ "bitflags 1.3.2",
+ "calloop 0.6.5",
+ "dlib 0.4.2",
+ "lazy_static",
+ "log",
+ "memmap2 0.1.0",
+ "nix 0.18.0",
+ "wayland-client 0.28.6",
+ "wayland-cursor 0.28.6",
+ "wayland-protocols 0.28.6",
+]
+
+[[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 0.5.2",
+ "lazy_static",
+ "log",
+ "memmap2 0.3.1",
+ "nix 0.22.3",
+ "pkg-config",
+ "wayland-client 0.29.5",
+ "wayland-cursor 0.29.5",
+ "wayland-protocols 0.29.5",
+]
+
+[[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 0.5.2",
+ "lazy_static",
+ "log",
+ "memmap2 0.5.10",
+ "nix 0.24.3",
+ "pkg-config",
+ "wayland-client 0.29.5",
+ "wayland-cursor 0.29.5",
+ "wayland-protocols 0.29.5",
+]
+
+[[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.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c"
+
+[[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.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "59fb7d6d8281a51045d62b8eb3a7d1ce347b76f312af50cd3dc0af39c87c1737"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "thiserror"
+version = "1.0.41"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c16a64ba9387ef3fdae4f9c1a7f07a0997fce91985c0336f1ddc1822b3b37802"
+dependencies = [
+ "thiserror-impl",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "1.0.41"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d14928354b01c4d6a4f0e549069adef399a284e7995c7ccca94e8a07a5346c59"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.23",
+]
+
+[[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 0.17.9",
+ "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.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c500344a19072298cd05a7224b3c0c629348b78692bf48466c5238656e315a78"
+dependencies = [
+ "indexmap",
+ "toml_datetime",
+ "winnow",
+]
+
+[[package]]
+name = "ttf-parser"
+version = "0.15.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b3e06c9b9d80ed6b745c7159c40b311ad2916abb34a49e9be2653b90db0d8dd"
+
+[[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.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "16b9e3507eba17043af05c8a72fce3ec2c24b58945f45732e71dbc6646d904a7"
+dependencies = [
+ "wide 0.6.5",
+]
+
+[[package]]
+name = "ultraviolet"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca0b28b9a6ce66d47e3c5666aa738c5ec5223fcdd4c263f3edc98ab6fef618b3"
+dependencies = [
+ "wide 0.7.10",
+]
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "22049a19f4a68748a168c0fc439f9516686aa045927ff767eca0a85101fb6e73"
+
+[[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.23",
+ "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.23",
+ "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.28.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3ab332350e502f159382201394a78e3cc12d0f04db863429260164ea40e0355"
+dependencies = [
+ "bitflags 1.3.2",
+ "downcast-rs",
+ "libc",
+ "nix 0.20.0",
+ "scoped-tls",
+ "wayland-commons 0.28.6",
+ "wayland-scanner 0.28.6",
+ "wayland-sys 0.28.6",
+]
+
+[[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 0.29.5",
+ "wayland-scanner 0.29.5",
+ "wayland-sys 0.29.5",
+]
+
+[[package]]
+name = "wayland-commons"
+version = "0.28.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a21817947c7011bbd0a27e11b17b337bfd022e8544b071a2641232047966fbda"
+dependencies = [
+ "nix 0.20.0",
+ "once_cell",
+ "smallvec",
+ "wayland-sys 0.28.6",
+]
+
+[[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 0.29.5",
+]
+
+[[package]]
+name = "wayland-cursor"
+version = "0.28.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be610084edd1586d45e7bdd275fe345c7c1873598caa464c4fb835dee70fa65a"
+dependencies = [
+ "nix 0.20.0",
+ "wayland-client 0.28.6",
+ "xcursor",
+]
+
+[[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 0.29.5",
+ "xcursor",
+]
+
+[[package]]
+name = "wayland-egl"
+version = "0.28.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "99ba1ab1e18756b23982d36f08856d521d7df45015f404a2d7c4f0b2d2f66956"
+dependencies = [
+ "wayland-client 0.28.6",
+ "wayland-sys 0.28.6",
+]
+
+[[package]]
+name = "wayland-egl"
+version = "0.29.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "402de949f81a012926d821a2d659f930694257e76dd92b6e0042ceb27be4107d"
+dependencies = [
+ "wayland-client 0.29.5",
+ "wayland-sys 0.29.5",
+]
+
+[[package]]
+name = "wayland-protocols"
+version = "0.28.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "286620ea4d803bacf61fa087a4242ee316693099ee5a140796aaba02b29f861f"
+dependencies = [
+ "bitflags 1.3.2",
+ "wayland-client 0.28.6",
+ "wayland-commons 0.28.6",
+ "wayland-scanner 0.28.6",
+]
+
+[[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 0.29.5",
+ "wayland-commons 0.29.5",
+ "wayland-scanner 0.29.5",
+]
+
+[[package]]
+name = "wayland-scanner"
+version = "0.28.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce923eb2deb61de332d1f356ec7b6bf37094dc5573952e1c8936db03b54c03f1"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "xml-rs",
+]
+
+[[package]]
+name = "wayland-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.28.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d841fca9aed7febf9bed2e9796c49bf58d4152ceda8ac949ebe00868d8f0feb8"
+dependencies = [
+ "dlib 0.5.2",
+ "lazy_static",
+ "pkg-config",
+]
+
+[[package]]
+name = "wayland-sys"
+version = "0.29.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be12ce1a3c39ec7dba25594b97b42cb3195d54953ddb9d3d95a7c3902bc6e9d4"
+dependencies = [
+ "dlib 0.5.2",
+ "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.6.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "46bbe7c604a27ca0b05c5503221e76da628225b568e6f1280b42dbad3b72d89b"
+dependencies = [
+ "bytemuck",
+ "safe_arch 0.5.2",
+]
+
+[[package]]
+name = "wide"
+version = "0.7.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "40018623e2dba2602a9790faba8d33f2ebdebf4b86561b83928db735f8784728"
+dependencies = [
+ "bytemuck",
+ "safe_arch 0.7.0",
+]
+
+[[package]]
+name = "winapi"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
+
+[[package]]
+name = "winapi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+dependencies = [
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
+]
+
+[[package]]
+name = "winapi-build"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-util"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
+dependencies = [
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+
+[[package]]
+name = "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.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc 0.48.0",
+ "windows_i686_gnu 0.48.0",
+ "windows_i686_msvc 0.48.0",
+ "windows_x86_64_gnu 0.48.0",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc 0.48.0",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc"
+
+[[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.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3"
+
+[[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.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241"
+
+[[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.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00"
+
+[[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.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953"
+
+[[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.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"
+
+[[package]]
+name = "winit"
+version = "0.24.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "da4eda6fce0eb84bd0a33e3c8794eb902e1033d0a1d5a31bc4f19b1b4bbff597"
+dependencies = [
+ "bitflags 1.3.2",
+ "cocoa 0.24.1",
+ "core-foundation 0.9.3",
+ "core-graphics 0.22.3",
+ "core-video-sys",
+ "dispatch",
+ "instant",
+ "lazy_static",
+ "libc",
+ "log",
+ "mio 0.6.23",
+ "mio-extras",
+ "ndk 0.2.1",
+ "ndk-glue 0.2.1",
+ "ndk-sys 0.2.2",
+ "objc",
+ "parking_lot 0.11.2",
+ "percent-encoding",
+ "raw-window-handle 0.3.4",
+ "smithay-client-toolkit 0.12.3",
+ "wasm-bindgen",
+ "wayland-client 0.28.6",
+ "web-sys",
+ "winapi 0.3.9",
+ "x11-dl",
+]
+
+[[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 0.24.1",
+ "core-foundation 0.9.3",
+ "core-graphics 0.22.3",
+ "core-video-sys",
+ "dispatch",
+ "instant",
+ "lazy_static",
+ "libc",
+ "log",
+ "mio 0.8.8",
+ "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 0.29.5",
+ "wayland-protocols 0.29.5",
+ "web-sys",
+ "winapi 0.3.9",
+ "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 0.24.1",
+ "core-foundation 0.9.3",
+ "core-graphics 0.22.3",
+ "dispatch",
+ "instant",
+ "libc",
+ "log",
+ "mio 0.8.8",
+ "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 0.29.5",
+ "wayland-protocols 0.29.5",
+ "web-sys",
+ "windows-sys 0.36.1",
+ "x11-dl",
+]
+
+[[package]]
+name = "winnow"
+version = "0.4.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a9482fe6ceabdf32f3966bfdd350ba69256a97c30253dc616fe0005af24f164e"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "wio"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5d129932f4644ac2396cb456385cbf9e63b5b30c6e8dc4820bdca4eb082037a5"
+dependencies = [
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "ws2_32-sys"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e"
+dependencies = [
+ "winapi 0.2.8",
+ "winapi-build",
+]
+
+[[package]]
+name = "x11-dl"
+version = "2.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 = "xdg"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "688597db5a750e9cad4511cb94729a078e274308099a0382b5b8203bbc767fee"
+dependencies = [
+ "home",
+]
+
+[[package]]
+name = "xml-rs"
+version = "0.8.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a56c84a8ccd4258aed21c92f70c0f6dea75356b6892ae27c24139da456f9336"
diff --git a/Cargo.toml b/Cargo.toml
index 55d7645..543c203 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,18 +1,18 @@
[package]
-name = "rust-rl"
-version = "0.1.4"
+name = "rust-llyrl"
+version = "0.1.0"
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"] }
regex = "1.3.6"
specs = { version = "0.16.1", features = ["serde"] }
specs-derive = "0.4.1"
serde = { version = "1.0.93", features = ["derive"]}
serde_json = "1.0.39"
-toml = "0.5"
lazy_static = "1.4.0"
[dev-dependencies]
@@ -20,12 +20,4 @@ criterion = { version = "^0.5" }
[[bench]]
name = "systems_benchmark"
-harness = false
-
-# Enable max optimizations for dependencies, but not for our code:
-[profile.dev.package."*"]
-opt-level = 3
-
-# Enable only a small amount of optimization in debug mode
-# [profile.dev]
-# opt-level = 1
\ No newline at end of file
+harness = false
\ No newline at end of file
diff --git a/README.md b/README.md
index c1809cf..7f9463e 100644
--- a/README.md
+++ b/README.md
@@ -1,19 +1,15 @@
-## a roguelike in rust, playable @ [llyw.co.uk/rl/](https://llyw.co.uk/rl/)
+## a roguelike in rust, playable @ [llywelwyn.github.io](https://llywelwyn.github.io/)
#### using _rltk/bracket-lib_, and _specs_
-[](https://github.com/Llywelwyn/rust-rl/actions/workflows/cargo-build-test.yml)
-
-check out the page in the header for the wasm version, pick [a release](https://github.com/Llywelwyn/rust-rl/releases), or build manually with:
-
-`git clone https://github.com/Llywelwyn/rust-rl/ && cd rust-rl && cargo build --release`,
-

+this year for roguelikedev does the complete tutorial, i'm following along with thebracket's [_roguelike tutorial - in rust_](https://bfnightly.bracketproductions.com). for most of the 8 weeks, i'll probably just be working through the content rather than diverging too much into doing my own thing, since it's lengthy and i'd rather finish in time. that said, the ultimate aim here is to strip out the vast majority of the existing entities and replace them with my own, using the systems and components from the tutorial as a jumping-off point for something of my own making.
+
+i'll try to remember to update the web version on my page at the end of every week
+
---
-
- boring details about the sprint where this project started
week 1
@@ -97,64 +93,5 @@ check out the page in the header for the wasm version, pick [a release](https://

-
-
----
-
-
- week 5
-
-- not a whole lot
- - busy week for me, so the only things i managed this week were finishing up some small things from the previous week. i started on combining logs that happen on the same tick (You hit the goblin. The goblin hits you.), and fixed up the _chance to spawn a guy each turn_ system to work with the groupsize flags, so there's a chance to spawn a pack of creatures each game turn rather than packs only spawning on map generation.
-
-
-
----
-
-
- week 6
-
-- visuals (contd.)
- - i'll start here, because it pretty much shows all the other things i did this week in the one image. the biggest change is nixing the rainbow colours i did in week 4 - having all the names on the sidebar and inventory be coloured by the colour of their glyph made for a difficult to parse ui. i swapped everything out for being coloured by their rarity (white for common and nonmagical items, grey for unidentified, and green-to-gold for uncommon-legendary rarities), and decided to add the glyph of the entity beside the name. overall, a big win i think. it provides more information more cleanly.
- 
-
-- backtracking
- - short and sweet, maps are persistent now. entities don't get deleted when you descend, they just get frozen, and you can return anytime. stair-dancing is a thing now, and something i haven't decided how to handle yet.
-
-- item identification (no BUC yet!)
- - unique schemes for unidentified items in the big categories (i.e. "effervescent green potions", "octagonal wands", and "GIB BERISH scrolls"), as well as the option of defining one-off obfuscated names for special cases
-
-- encumbrance
- - varying levels of being overweight, with the limit determined by strength, slowing entities down by ~25% per level over unencumbered. right now it's pretty forgiving, and i'd probably like it to stay that way. my ideal balance here would be roughly how it ends up in 5e DnD: everyone can carry a good supply of consumables, but strength characters usually don't carry a much higher quantity of items than anyone else, because the strongest armour is extremely heavy. sort of like a soft strength requirement for the heaviest gear - rather than requiring specific stats or levels to equip it, it's heavy enough that you need to be strong to lug it around. but if someone weaker wanted to, they could, they'd just have to leave some other items behind to do so. or take the speed penalty for being encumbered
-
-
-
----
-
-
- week 7
-
-- character creation!
- - it doesn't look too pretty yet, but i managed to get it done in time. classes and ancestries are selectable, with ancestries determining some intrinsic bonuses (dwarves are hardy, catfolk are fast and have claws, etc.) and attribute maximums, and classes determining starting equipment and the actual attribute rolls. along with this, i expanded entity reactions - now a shared ancestry is taken into account first of all, and it checks faction if it doesn't manage to find anything. this means humans wont attack other humans, dwarves wont be attacked by gnomes and other dwarves, etc.
-
- 
-
-
-- proper identification and beatitude
- - item-ID is split from beatitudes as it should be, scrolls of identify and remove curse are in, and blessed/cursed effects are applied for a bunch of things.
-
- 
-
-
-- better AI
- - straight from thebracket, with a handful of tweaks of my own, i've finally atomised AI into adjacent, visible, chase, flee, and default systems. most notably,rather than hostile mobs attacking everything and passive mobs doing nothing, every mob has a faction, and most mobs have an ancestry. like mentioned above, mobs will take all this into account when determining how they want to react to any other entity. i see a lot of places to expand on this in the future, like going into alignments and other increasingly-specific reasons why any entity might want to murder another. or make friends with them. taming comes to mind here.
-
-- an effects system
- - instead of randomly doing things all around the codebase, everything is in the process of being moved over to an effects system. to put it very simply, there's a big list of every effect that needs to take place on the next tick, and each tick the queue is iterated through, the next effect is checked against a list of every entity that died this turn to make sure that it should still take place (no dead mobs still getting their attacks off), and then it makes the event happen if appropriate. if not, it just gets tossed out. it's all super modular, so effects can pretty much be applied to everything. the same damage and targeting effects work for item use and traps going off, or an entity swinging their sword, for example. i made use of this new system by adding in some aoe scrolls, like mass function and mass healing. see below for blindness improving telepathy range, and nice new particle effects.
-
- 
- 
-
-
diff --git a/benches/systems_benchmark.rs b/benches/systems_benchmark.rs
index c750fed..3bde091 100644
--- a/benches/systems_benchmark.rs
+++ b/benches/systems_benchmark.rs
@@ -1,12 +1,12 @@
-use criterion::{ black_box, criterion_group, criterion_main, Criterion };
-use bracket_lib::prelude::*;
+use criterion::{black_box, criterion_group, criterion_main, Criterion};
+use rltk::RGB;
/// Benchmarks methods from rltk used to desaturate non-visible tiles.
// Greyscale is significantly faster, but generally looks worse - the
// third alternative is directly setting the desaturated value, if it
// is known in advance.
fn nonvisible_benchmark(c: &mut Criterion) {
- let bg = black_box(RGB::from_f32(0.4, 0.0, 0.0));
+ let bg = black_box(RGB::from_f32(0.4, 0., 0.));
c.bench_function("rgb -> greyscale", |b| b.iter(|| bg.to_greyscale()));
c.bench_function("rgb -> desaturate", |b| b.iter(|| bg.desaturate()));
diff --git a/changelog.md b/changelog.md
deleted file mode 100644
index 4976351..0000000
--- a/changelog.md
+++ /dev/null
@@ -1,20 +0,0 @@
-## 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/docs/ascii_encyclopedia.txt b/docs/ascii_encyclopedia.txt
deleted file mode 100644
index 2972c1e..0000000
--- a/docs/ascii_encyclopedia.txt
+++ /dev/null
@@ -1,35 +0,0 @@
-a - insects A -
-b - B -
-c - chickens C -
-d - canines D -
-e - E -
-f - felines F -
-g - goblins G - gnomes
-h - humanoids H -
-i - I -
-j - J -
-k - kobolds K -
-l - L -
-m - M -
-n - N -
-o - orcs O - ogres
-p - P -
-q - quadrupeds Q -
-r - rats R -
-s - spiders S -
-t - T -
-u - horses U -
-v - V -
-w - W -
-x - X -
-y - Y -
-z - zombies Z -
-@ - humans
-
-notes
-1. zombie takes priority over the creature's original glyph
-2. @ is for human-sized creatures - i.e. humans, changelings
- h is used for everything else - i.e. dwarfs, halflings
-3. purple is reserved for captain/leader entiites - i.e. orc captain
-4. similar creatures use similar colours - i.e. little dog, dog, large dog
-
diff --git a/docs/combat_system.txt b/docs/combat_system.txt
deleted file mode 100644
index 44e2f65..0000000
--- a/docs/combat_system.txt
+++ /dev/null
@@ -1,55 +0,0 @@
-DETERMINING IF AN ATTACK HITS OR NOT:
-
-1. Whenever someone makes an attack, a flat 1d20 attack roll is made.
-2. A target number is generated, depending on the mode of attack, made
- up of some combination of the following:
- - ATTACKER'S HIT BONUSES:
- - level
- - any relevant str/dex attribute bonuses
- - any relevant skill modifiers
- - any to-hit modifiers from equipment
- - any to-hit modifiers from status effects
- - DEFENDER'S ARMOUR CLASS*:
- - base armour class
- - any relevant skill modifiers
- - any ac modifiers from equipment
- - any ac modifiers from status effects
- - MISCELLANEOUS MODIFIERS:
- - melee attacks always have a +1 bonus
- - monsters gain a +10 bonus to-hit players
-3. The attack roll is compared against the target number.
-4. If the attack roll is less than the target, the attack hits.**
-5. If an attack hits, it deals:
- - a roll of the weapon's damage die
- - plus any relevant attribute bonuses
- - plus any relevant skill modifiers
- - MINUS a roll of the defender's AC, if the AC is negative.
-
-notes
- * when AC is less than 0, it is treated as a random number from -1 to the value. e.g. -10 AC could be anywhere from -1 to -10.
- ** functionally identical to rolling 1d20 + to-hit, and needing to roll higher than the defender's AC. this system just ends up
- being easier to work with when involving additional modifiers, as you don't need to decide if they're a to-hit bonus or an
- AC modifier -- they just always get added/subtracted from the target number that must be rolled against.
-
-Simple example, with positive AC:
-- You have an AC of 4, and the monster has a +1 to-hit, with a 1d8 damage weapon.
-- The monster must roll less than 10 (monster v. player) + 1 (to-hit) + 4 (ac) = 15 to hit you.
-- The monster has a 70% hit chance.
-- It rolls a 12, which is lower than 15, so it hits.
-- It rolls 1d8 for damage, and gets a 6.
-- You take 6 points of damage.
-
-Complex example, with negative AC:
-- You have an AC of -14, and the monster has a +3 to-hit, with a 1d8 damage weapon.
-- The monster must roll less than 10 (monster v. player) + 3 (to-hit) - 1d14 (ac) to hit you.
-- At best (AC rolls a 1), the monster must roll less than 12 to hit you. 55% hit chance.
-- At worst (AC rolls a 14), the monster must roll less than -1 to hit you. Impossible.
-- It rolls a 9, and your AC rolls a 2. 9 is less than 11 (10 + 3 - 2), so it hits.
-- It rolls 1d8 for damage, and gets a 6.
-bloodstains: if starts on bloodied tile, remove blood + heal, gain xp, grow (little dog -> dog), etc.
-- You have negative AC, so you roll 1d14 for damage reduction, and get an 8.
-- The total damage is 6 - 8 = -2, but damage can't be negative, so you take 1 point of damage.
-
-tl;dr
-1. Lower AC is better
-2. Aim for 0 AC - it's an important breakpoint. Every point of AC before 0 counts for a lot.
diff --git a/raws/ancestries.json b/raws/ancestries.json
deleted file mode 100644
index 932e488..0000000
--- a/raws/ancestries.json
+++ /dev/null
@@ -1,22 +0,0 @@
-[
- {
- "id": "human",
- "allies": []
- },
- {
- "id": "elf",
- "allies": []
- },
- {
- "id": "dwarf",
- "allies": ["gnome"]
- },
- {
- "id": "gnome",
- "allies": ["dwarf"]
- },
- {
- "id": "catfolk",
- "allies": []
- }
-]
diff --git a/raws/factions.json b/raws/factions.json
deleted file mode 100644
index 136f3dc..0000000
--- a/raws/factions.json
+++ /dev/null
@@ -1,26 +0,0 @@
-[
- {
- "id": "player",
- "responses": {}
- },
- {
- "id": "mindless",
- "responses": { "default": "attack" }
- },
- {
- "id": "neutral",
- "responses": { "default": "ignore", "hostile": "flee", "mindless": "flee", "carnivore": "flee" }
- },
- {
- "id": "hostile",
- "responses": { "default": "attack", "hostile": "ignore" }
- },
- {
- "id": "herbivore",
- "responses": { "default": "flee", "herbivores": "ignore" }
- },
- {
- "id": "carnivore",
- "responses": { "default": "ignore", "herbivores": "attack", "player": "attack", "neutral": "attack" }
- }
-]
diff --git a/raws/items.json b/raws/items.json
index 7599afe..8ec6e2c 100644
--- a/raws/items.json
+++ b/raws/items.json
@@ -3,214 +3,83 @@
"id": "potion_health",
"name": { "name": "potion of health", "plural": "potions of health" },
"renderable": { "glyph": "!", "fg": "#FF00FF", "bg": "#000000", "order": 2 },
- "class": "potion",
- "weight": 1,
- "value": 50,
- "flags": ["CONSUMABLE", "DESTRUCTIBLE", "STACKABLE"],
- "effects": { "heal": "4d4+2" },
- "magic": { "class": "uncommon", "naming": "potion" }
+ "flags": ["CONSUMABLE", "DESTRUCTIBLE"],
+ "effects": { "provides_healing": "12" }
},
{
"id": "potion_health_weak",
"name": { "name": "potion of lesser health", "plural": "potions of lesser health" },
"renderable": { "glyph": "!", "fg": "#FF00FF", "bg": "#000000", "order": 2 },
- "class": "potion",
- "weight": 1,
- "value": 25,
- "flags": ["CONSUMABLE", "DESTRUCTIBLE", "STACKABLE"],
- "effects": { "heal": "2d4+2" },
- "magic": { "class": "uncommon", "naming": "potion" }
- },
- {
- "id": "scroll_identify",
- "name": { "name": "scroll of identify", "plural": "scrolls of identify" },
- "renderable": { "glyph": "?", "fg": "#0FFFFF", "bg": "#000000", "order": 2 },
- "class": "scroll",
- "weight": 0.5,
- "value": 100,
- "flags": ["CONSUMABLE", "DESTRUCTIBLE", "STACKABLE", "IDENTIFY"],
- "magic": { "class": "uncommon", "naming": "scroll" }
- },
- {
- "id": "scroll_removecurse",
- "name": { "name": "scroll of remove curse", "plural": "scrolls of remove curse" },
- "renderable": { "glyph": "?", "fg": "#0FFFFF", "bg": "#000000", "order": 2 },
- "class": "scroll",
- "weight": 0.5,
- "value": 200,
- "flags": ["CONSUMABLE", "DESTRUCTIBLE", "STACKABLE", "REMOVE_CURSE"],
- "magic": { "class": "rare", "naming": "scroll" }
- },
- {
- "id": "scroll_health",
- "name": { "name": "scroll of healing word", "plural": "scrolls of healing word" },
- "renderable": { "glyph": "?", "fg": "#00FFFF", "bg": "#000000", "order": 2 },
- "class": "scroll",
- "weight": 0.5,
- "value": 50,
- "flags": ["CONSUMABLE", "DESTRUCTIBLE", "STACKABLE"],
- "effects": { "particle_line": "*;-;#53f06d;75.0;#f9ff9f;100.0", "ranged": "12", "heal": "1d4+2" },
- "magic": { "class": "uncommon", "naming": "scroll" }
- },
- {
- "id": "scroll_mass_health",
- "name": { "name": "scroll of mass healing word", "plural": "scrolls of mass healing word" },
- "renderable": { "glyph": "?", "fg": "#00FFFF", "bg": "#000000", "order": 2 },
- "class": "scroll",
- "weight": 0.5,
- "value": 200,
- "flags": ["CONSUMABLE", "DESTRUCTIBLE", "STACKABLE"],
- "effects": { "particle": "*;#53f06d;200.0", "ranged": "12", "aoe": "3", "heal": "1d4+2" },
- "magic": { "class": "rare", "naming": "scroll" }
+ "flags": ["CONSUMABLE", "DESTRUCTIBLE"],
+ "effects": { "provides_healing": "6" }
},
{
"id": "scroll_magicmissile",
"name": { "name": "scroll of magic missile", "plural": "scrolls of magic missile" },
"renderable": { "glyph": "?", "fg": "#00FFFF", "bg": "#000000", "order": 2 },
- "class": "scroll",
- "weight": 0.5,
- "value": 50,
- "flags": ["CONSUMABLE", "DESTRUCTIBLE", "STACKABLE"],
- "effects": { "particle_line": "*;-;#00b7ff;75.0;#f4fc83;100.0", "ranged": "12", "damage": "3d4+3;magic" },
- "magic": { "class": "uncommon", "naming": "scroll" }
- },
- {
- "id": "scroll_embers",
- "name": { "name": "scroll of embers", "plural": "scrolls of embers" },
- "renderable": { "glyph": "?", "fg": "#00FFFF", "bg": "#000000", "order": 2 },
- "class": "scroll",
- "weight": 0.5,
- "value": 100,
- "flags": ["CONSUMABLE", "DESTRUCTIBLE", "STACKABLE"],
- "effects": { "particle": "*;#FFA500;200.0", "ranged": "10", "damage": "4d6;fire", "aoe": "2" },
- "magic": { "class": "uncommon", "naming": "scroll" }
+ "flags": ["CONSUMABLE", "DESTRUCTIBLE"],
+ "effects": { "ranged": "12", "damage": "10" }
},
{
"id": "scroll_fireball",
"name": { "name": "scroll of fireball", "plural": "scrolls of fireball" },
"renderable": { "glyph": "?", "fg": "#00FFFF", "bg": "#000000", "order": 2 },
- "class": "scroll",
- "weight": 0.5,
- "value": 200,
- "flags": ["CONSUMABLE", "DESTRUCTIBLE", "STACKABLE"],
- "effects": {
- "particle_burst": "▓;*;~;#FFA500;#000000;500.0;#ffd381;60.0",
- "ranged": "10",
- "damage": "8d6;fire",
- "aoe": "3"
- },
- "magic": { "class": "rare", "naming": "scroll" }
+ "flags": ["CONSUMABLE", "DESTRUCTIBLE"],
+ "effects": { "ranged": "10", "damage": "15", "aoe": "3" }
+ },
+ {
+ "id": "scroll_fireball_c",
+ "name": { "name": "cursed scroll of fireball", "plural": "cursed scrolls of fireball" },
+ "renderable": { "glyph": "?", "fg": "#00FFFF", "bg": "#000000", "order": 2 },
+ "flags": ["CONSUMABLE", "DESTRUCTIBLE", "CURSED"],
+ "effects": { "ranged": "10", "damage": "15", "aoe": "3" }
},
{
"id": "scroll_confusion",
"name": { "name": "scroll of confusion", "plural": "scrolls of confusion" },
"renderable": { "glyph": "?", "fg": "#00FFFF", "bg": "#000000", "order": 2 },
- "class": "scroll",
- "weight": 0.5,
- "value": 100,
- "flags": ["CONSUMABLE", "DESTRUCTIBLE", "STACKABLE"],
- "effects": { "particle_line": "*;-;#ad56a6;75.0;#cacaca;100.0", "ranged": "10", "confusion": "4" },
- "magic": { "class": "uncommon", "naming": "scroll" }
- },
- {
- "id": "scroll_mass_confusion",
- "name": { "name": "scroll of mass confusion", "plural": "scrolls of mass confusion" },
- "renderable": { "glyph": "?", "fg": "#00FFFF", "bg": "#000000", "order": 2 },
- "class": "scroll",
- "weight": 0.5,
- "value": 200,
- "flags": ["CONSUMABLE", "DESTRUCTIBLE", "STACKABLE"],
- "effects": { "particle": "*;#ad56a6;200.0", "ranged": "10", "aoe": "3", "confusion": "3" },
- "magic": { "class": "veryrare", "naming": "scroll" }
+ "flags": ["CONSUMABLE", "DESTRUCTIBLE"],
+ "effects": { "ranged": "10", "confusion": "4" }
},
{
"id": "scroll_magicmap",
"name": { "name": "scroll of magic mapping", "plural": "scrolls of magic mapping" },
"renderable": { "glyph": "?", "fg": "#00FFFF", "bg": "#000000", "order": 2 },
- "class": "scroll",
- "weight": 0.5,
- "value": 50,
- "flags": ["CONSUMABLE", "DESTRUCTIBLE", "STACKABLE", "MAGICMAP"],
- "effects": {},
- "magic": { "class": "common", "naming": "scroll" }
+ "flags": ["CONSUMABLE", "DESTRUCTIBLE"],
+ "effects": { "magicmapper": "" }
+ },
+ {
+ "id": "scroll_magicmap_c",
+ "name": { "name": "cursed scroll of magic mapping", "plural": "cursed scrolls of magic mapping" },
+ "renderable": { "glyph": "?", "fg": "#00FFFF", "bg": "#000000", "order": 2 },
+ "flags": ["CONSUMABLE", "DESTRUCTIBLE", "CURSED"],
+ "effects": { "magicmapper": "" }
},
{
"id": "equip_dagger",
"name": { "name": "dagger", "plural": "daggers" },
"renderable": { "glyph": ")", "fg": "#808080", "bg": "#000000", "order": 2 },
- "class": "weapon",
- "weight": 1,
- "value": 2,
- "flags": ["EQUIP_MELEE"],
- "equip": { "flag": "FINESSE", "damage": "1d4", "to_hit": 0 }
+ "flags": ["EQUIP_MELEE", "FINESSE"],
+ "effects": { "base_damage": "1d4"}
},
{
"id": "equip_shortsword",
"name": { "name": "shortsword", "plural": "shortswords" },
"renderable": { "glyph": ")", "fg": "#C0C0C0", "bg": "#000000", "order": 2 },
- "class": "weapon",
- "weight": 2,
- "value": 10,
- "flags": ["EQUIP_MELEE"],
- "equip": { "flag": "STRENGTH", "damage": "1d6", "to_hit": 0 }
- },
- {
- "id": "equip_rapier",
- "name": { "name": "rapier", "plural": "rapiers" },
- "renderable": { "glyph": ")", "fg": "#C0C0C0", "bg": "#000000", "order": 2 },
- "class": "weapon",
- "weight": 2,
- "value": 10,
- "flags": ["EQUIP_MELEE"],
- "equip": { "flag": "FINESSE", "damage": "1d8", "to_hit": 0 }
- },
- {
- "id": "equip_pitchfork",
- "name": { "name": "pitchfork", "plural": "pitchforks" },
- "renderable": { "glyph": ")", "fg": "#C0C0C0", "bg": "#000000", "order": 2 },
- "class": "weapon",
- "weight": 2,
- "value": 5,
- "flags": ["EQUIP_MELEE"],
- "equip": { "flag": "FINESSE", "damage": "1d6", "to_hit": 0 }
- },
- {
- "id": "equip_sickle",
- "name": { "name": "sickle", "plural": "sickles" },
- "renderable": { "glyph": ")", "fg": "#C0C0C0", "bg": "#000000", "order": 2 },
- "class": "weapon",
- "weight": 2,
- "value": 5,
- "flags": ["EQUIP_MELEE"],
- "equip": { "flag": "FINESSE", "damage": "1d6", "to_hit": 0 }
- },
- {
- "id": "equip_handaxe",
- "name": { "name": "handaxe", "plural": "handaxes" },
- "renderable": { "glyph": ")", "fg": "#C0C0C0", "bg": "#000000", "order": 2 },
- "class": "weapon",
- "weight": 2,
- "value": 5,
- "flags": ["EQUIP_MELEE"],
- "equip": { "flag": "STRENGTH", "damage": "1d6", "to_hit": 0 }
+ "flags": ["EQUIP_MELEE", "STRENGTH"],
+ "effects": { "base_damage": "1d6"}
},
{
"id": "equip_longsword",
"name": { "name": "longsword", "plural": "longswords" },
"renderable": { "glyph": ")", "fg": "#FFF8DC", "bg": "#000000", "order": 2 },
- "class": "weapon",
- "weight": 3,
- "value": 15,
- "flags": ["EQUIP_MELEE"],
- "equip": { "flag": "STRENGTH", "damage": "1d8", "to_hit": 0 }
+ "flags": ["EQUIP_MELEE", "STRENGTH"],
+ "effects": { "base_damage": "1d8" }
},
{
"id": "equip_smallshield",
"name": { "name": "buckler", "plural": "bucklers" },
"renderable": { "glyph": "[", "fg": "#808080", "bg": "#000000", "order": 2 },
- "class": "armour",
- "weight": 2,
- "value": 5,
"flags": ["EQUIP_SHIELD"],
"effects": { "ac": "1" }
},
@@ -218,29 +87,20 @@
"id": "equip_mediumshield",
"name": { "name": "medium shield", "plural": "medium shields" },
"renderable": { "glyph": "[", "fg": "#C0C0C0", "bg": "#000000", "order": 2 },
- "class": "armour",
- "weight": 6,
- "value": 10,
"flags": ["EQUIP_SHIELD"],
- "effects": { "ac": "2", "to_hit": "-1" }
+ "effects": { "ac": "2", "melee_power_bonus": "-1" }
},
{
"id": "equip_largeshield",
"name": { "name": "large shield", "plural": "large shields" },
"renderable": { "glyph": "[", "fg": "#FFF8DC", "bg": "#000000", "order": 2 },
- "class": "armour",
- "weight": 12,
- "value": 35,
"flags": ["EQUIP_SHIELD"],
- "effects": { "ac": "3", "to_hit": "-2" }
+ "effects": { "ac": "4", "melee_power_bonus": "-2" }
},
{
"id": "equip_body_weakleather",
"name": { "name": "leather jacket", "plural": "leather jackets" },
"renderable": { "glyph": "[", "fg": "#aa6000", "bg": "#000000", "order": 2 },
- "class": "armour",
- "weight": 8,
- "value": 5,
"flags": ["EQUIP_BODY"],
"effects": { "ac": "1" }
},
@@ -248,9 +108,6 @@
"id": "equip_body_leather",
"name": { "name": "leather chestpiece", "plural": "leather chestpiece" },
"renderable": { "glyph": "[", "fg": "#aa6000", "bg": "#000000", "order": 2 },
- "class": "armour",
- "weight": 10,
- "value": 10,
"flags": ["EQUIP_BODY"],
"effects": { "ac": "2" }
},
@@ -258,9 +115,6 @@
"id": "equip_body_studdedleather",
"name": { "name": "studded leather chestpiece", "plural": "studded leather chestpieces" },
"renderable": { "glyph": "[", "fg": "#aa6000", "bg": "#000000", "order": 2 },
- "class": "armour",
- "weight": 13,
- "value": 45,
"flags": ["EQUIP_BODY"],
"effects": { "ac": "3" }
},
@@ -268,9 +122,6 @@
"id": "equip_body_ringmail_o",
"name": { "name": "orcish ring mail", "plural": "orcish ring mail" },
"renderable": { "glyph": "[", "fg": "#aa6000", "bg": "#000000", "order": 2 },
- "class": "armour",
- "weight": 45,
- "value": 50,
"flags": ["EQUIP_BODY"],
"effects": { "ac": "3" }
},
@@ -278,9 +129,6 @@
"id": "equip_body_ringmail",
"name": { "name": "ring mail", "plural": "ring mail" },
"renderable": { "glyph": "[", "fg": "#aa6000", "bg": "#000000", "order": 2 },
- "class": "armour",
- "weight": 45,
- "value": 70,
"flags": ["EQUIP_BODY"],
"effects": { "ac": "4" }
},
@@ -288,9 +136,6 @@
"id": "equip_head_leather",
"name": { "name": "leather cap", "plural": "leather caps" },
"renderable": { "glyph": "[", "fg": "#aa6000", "bg": "#000000", "order": 2 },
- "class": "armour",
- "weight": 2,
- "value": 10,
"flags": ["EQUIP_HEAD"],
"effects": { "ac": "1" }
},
@@ -298,9 +143,6 @@
"id": "equip_head_elvish",
"name": { "name": "elvish leather helm", "plural": "elvish leather helms" },
"renderable": { "glyph": "[", "fg": "#aa6000", "bg": "#000000", "order": 2 },
- "class": "armour",
- "weight": 2,
- "value": 25,
"flags": ["EQUIP_HEAD"],
"effects": { "ac": "2" }
},
@@ -308,9 +150,6 @@
"id": "equip_head_o",
"name": { "name": "orcish helm", "plural": "orcish helm" },
"renderable": { "glyph": "[", "fg": "#aa6000", "bg": "#000000", "order": 2 },
- "class": "armour",
- "weight": 6,
- "value": 25,
"flags": ["EQUIP_HEAD"],
"effects": { "ac": "2" }
},
@@ -318,9 +157,6 @@
"id": "equip_head_iron",
"name": { "name": "iron helm", "plural": "iron helm" },
"renderable": { "glyph": "[", "fg": "#aa6000", "bg": "#000000", "order": 2 },
- "class": "armour",
- "weight": 10,
- "value": 45,
"flags": ["EQUIP_HEAD"],
"effects": { "ac": "3" }
},
@@ -328,18 +164,12 @@
"id": "equip_feet_leather",
"name": { "name": "leather shoes", "plural": "leather shoes" },
"renderable": { "glyph": "[", "fg": "#aa6000", "bg": "#000000", "order": 2 },
- "class": "armour",
- "weight": 2,
- "value": 10,
"flags": ["EQUIP_FEET"]
},
{
"id": "equip_feet_elvish",
"name": { "name": "elvish leather shoes", "plural": "elvish leather shoes" },
"renderable": { "glyph": "[", "fg": "#aa6000", "bg": "#000000", "order": 2 },
- "class": "armour",
- "weight": 2,
- "value": 25,
"flags": ["EQUIP_FEET"],
"effects": { "ac": "1" }
},
@@ -347,9 +177,6 @@
"id": "equip_feet_o",
"name": { "name": "orcish boots", "plural": "orcish boots" },
"renderable": { "glyph": "[", "fg": "#aa6000", "bg": "#000000", "order": 2 },
- "class": "armour",
- "weight": 6,
- "value": 25,
"flags": ["EQUIP_FEET"],
"effects": { "ac": "1" }
},
@@ -357,9 +184,6 @@
"id": "equip_feet_iron",
"name": { "name": "iron boots", "plural": "iron boots" },
"renderable": { "glyph": "[", "fg": "#aa6000", "bg": "#000000", "order": 2 },
- "class": "armour",
- "weight": 10,
- "value": 45,
"flags": ["EQUIP_FEET"],
"effects": { "ac": "2" }
},
@@ -367,9 +191,6 @@
"id": "equip_neck_protection",
"name": { "name": "amulet of protection", "plural": "amulets of protection" },
"renderable": { "glyph": "\"", "fg": "#aa6000", "bg": "#000000", "order": 2 },
- "class": "amulet",
- "weight": 1,
- "value": 200,
"flags": ["EQUIP_NECK"],
"effects": { "ac": "1" }
},
@@ -377,9 +198,6 @@
"id": "equip_back_protection",
"name": { "name": "cloak of protection", "plural": "cloaks of protection" },
"renderable": { "glyph": "[", "fg": "#aa6000", "bg": "#000000", "order": 2 },
- "class": "armour",
- "weight": 1,
- "value": 200,
"flags": ["EQUIP_BACK"],
"effects": { "ac": "1" }
},
@@ -387,62 +205,40 @@
"id": "wand_magicmissile",
"name": { "name": "wand of magic missile", "plural": "wands of magic missile" },
"renderable": { "glyph": "/", "fg": "#00FFFF", "bg": "#000000", "order": 2 },
- "class": "wand",
- "weight": 2,
- "value": 100,
- "flags": ["CHARGES"],
- "effects": { "ranged": "12", "damage": "3d4+3;magic" },
- "magic": { "class": "uncommon", "naming": "wand" }
+ "flags": ["WAND"],
+ "effects": { "ranged": "12", "damage": "10" }
},
{
"id": "wand_fireball",
"name": { "name": "wand of fireball", "plural": "wands of fireball" },
"renderable": { "glyph": "/", "fg": "#00FFFF", "bg": "#000000", "order": 2 },
- "class": "wand",
- "weight": 2,
- "value": 300,
- "flags": ["CHARGES"],
- "effects": { "ranged": "10", "damage": "8d6;fire", "aoe": "3" },
- "magic": { "class": "rare", "naming": "wand" }
+ "flags": ["WAND"],
+ "effects": { "ranged": "10", "damage": "15", "aoe": "3" }
},
{
"id": "wand_confusion",
"name": { "name": "wand of confusion", "plural": "wands of confusion" },
"renderable": { "glyph": "/", "fg": "#00FFFF", "bg": "#000000", "order": 2 },
- "class": "wand",
- "weight": 2,
- "value": 200,
- "flags": ["CHARGES"],
- "effects": { "ranged": "10", "confusion": "4" },
- "magic": { "class": "uncommon", "naming": "wand" }
+ "flags": ["WAND"],
+ "effects": { "ranged": "10", "confusion": "4" }
},
{
"id": "wand_digging",
"name": { "name": "wand of digging", "plural": "wands of digging" },
"renderable": { "glyph": "/", "fg": "#00FFFF", "bg": "#000000", "order": 2 },
- "class": "wand",
- "weight": 2,
- "value": 300,
- "flags": ["CHARGES", "DIGGER"],
- "effects": { "ranged": "10" },
- "magic": { "class": "rare", "naming": "wand" }
+ "flags": ["WAND"],
+ "effects": { "ranged": "10", "digger": "" }
},
{
"id": "food_rations",
"name": { "name": "rations", "plural": "rations" },
"renderable": { "glyph": "%", "fg": "#FFA07A", "bg": "#000000", "order": 2 },
- "class": "comestible",
- "weight": 1,
- "value": 1,
- "flags": ["FOOD", "CONSUMABLE", "STACKABLE"]
+ "flags": ["FOOD", "CONSUMABLE"]
},
{
"id": "food_apple",
"name": { "name": "apple", "plural": "apples" },
"renderable": { "glyph": "%", "fg": "#00FF00", "bg": "#000000", "order": 2 },
- "class": "comestible",
- "weight": 0.5,
- "value": 1,
- "flags": ["FOOD", "CONSUMABLE", "STACKABLE"]
+ "flags": ["FOOD", "CONSUMABLE"]
}
]
diff --git a/raws/mobs.json b/raws/mobs.json
index ddd6556..177bace 100644
--- a/raws/mobs.json
+++ b/raws/mobs.json
@@ -3,7 +3,7 @@
"id": "npc_barkeep",
"name": "barkeep",
"renderable": { "glyph": "@", "fg": "#EE82EE", "bg": "#000000", "order": 1 },
- "flags": ["NEUTRAL", "IS_HUMAN"],
+ "flags": ["BYSTANDER", "BLOCKS_TILE"],
"vision_range": 4,
"quips": ["Drink?", "Something to eat?", "Don't go out on an empty stomach."]
},
@@ -11,7 +11,7 @@
"id": "npc_townsperson",
"name": "townsperson",
"renderable": { "glyph": "@", "fg": "#9fa86c", "bg": "#000000", "order": 1 },
- "flags": ["NEUTRAL", "RANDOM_PATH", "IS_HUMAN"],
+ "flags": ["BYSTANDER", "BLOCKS_TILE"],
"vision_range": 4,
"quips": ["Hello!", "Good morning.", ""]
},
@@ -19,7 +19,7 @@
"id": "npc_drunk",
"name": "drunk",
"renderable": { "glyph": "@", "fg": "#a0a83c", "bg": "#000000", "order": 1 },
- "flags": ["NEUTRAL", "IS_HUMAN"],
+ "flags": ["BYSTANDER", "BLOCKS_TILE"],
"vision_range": 4,
"quips": ["Hic!", "H-Hic'.", "Get me 'nother, would you?"]
},
@@ -27,7 +27,7 @@
"id": "npc_fisher",
"name": "fisher",
"renderable": { "glyph": "@", "fg": "#3ca3a8", "bg": "#000000", "order": 1 },
- "flags": ["NEUTRAL", "IS_HUMAN"],
+ "flags": ["BYSTANDER", "BLOCKS_TILE"],
"vision_range": 4,
"quips": ["Hey."]
},
@@ -35,7 +35,7 @@
"id": "npc_dockworker",
"name": "dock worker",
"renderable": { "glyph": "@", "fg": "#68d8de", "bg": "#000000", "order": 1 },
- "flags": ["NEUTRAL", "IS_HUMAN"],
+ "flags": ["BYSTANDER", "BLOCKS_TILE"],
"vision_range": 4,
"quips": ["No boat for a few days.", "Not much for us to do."]
},
@@ -43,7 +43,7 @@
"id": "npc_priest",
"name": "priest",
"renderable": { "glyph": "@", "fg": "#FFFFFF", "bg": "#000000", "order": 1 },
- "flags": ["NEUTRAL", "IS_HUMAN"],
+ "flags": ["BYSTANDER", "BLOCKS_TILE"],
"vision_range": 4,
"quips": ["Light's givings.", "", "Bless you."]
},
@@ -51,7 +51,7 @@
"id": "npc_miner",
"name": "miner",
"renderable": { "glyph": "@", "fg": "#946123", "bg": "#000000", "order": 1 },
- "flags": ["NEUTRAL", "IS_HUMAN"],
+ "flags": ["BYSTANDER", "BLOCKS_TILE"],
"vision_range": 4,
"attacks": [{ "name": "hits", "hit_bonus": 0, "damage": "1d8" }],
"quips": ["You're not borrowing my pick."]
@@ -60,8 +60,9 @@
"id": "npc_guard",
"name": "smalltown guard",
"renderable": { "glyph": "@", "fg": "#034efc", "bg": "#000000", "order": 1 },
- "flags": ["NEUTRAL", "RANDOM_PATH", "IS_HUMAN"],
+ "flags": ["BYSTANDER", "BLOCKS_TILE"],
"level": 2,
+ "vision_range": 4,
"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?"]
@@ -70,8 +71,9 @@
"id": "rat",
"name": "rat",
"renderable": { "glyph": "r", "fg": "#aa6000", "bg": "#000000", "order": 1 },
- "flags": [],
+ "flags": ["MONSTER", "BLOCKS_TILE"],
"bac": 6,
+ "vision_range": 8,
"attacks": [{ "name": "bites", "hit_bonus": 0, "damage": "1d2" }],
"loot": { "table": "food", "chance": 0.1 }
},
@@ -79,42 +81,47 @@
"id": "chicken",
"name": "chicken",
"renderable": { "glyph": "c", "fg": "#BB6000", "bg": "#000000", "order": 1 },
- "flags": ["HERBIVORE"],
+ "flags": ["BYSTANDER", "BLOCKS_TILE"],
"bac": 8,
+ "vision_range": 4,
"attacks": [{ "name": "bites", "hit_bonus": 0, "damage": "1d3" }]
},
{
"id": "deer_little",
"name": "fawn",
"renderable": { "glyph": "q", "fg": "#a57037", "bg": "#000000", "order": 1 },
- "flags": ["HERBIVORE"],
+ "flags": ["BYSTANDER", "BLOCKS_TILE"],
"bac": 8,
+ "vision_range": 8,
"attacks": [{ "name": "kicks", "hit_bonus": 0, "damage": "1d2" }]
},
{
"id": "sheep_little",
"name": "lamb",
"renderable": { "glyph": "q", "fg": "#e7e7e7", "bg": "#000000", "order": 1 },
- "flags": ["HERBIVORE", "SMALL_GROUP"],
+ "flags": ["BYSTANDER", "BLOCKS_TILE", "SMALL_GROUP"],
"bac": 10,
+ "vision_range": 4,
"attacks": [{ "name": "kicks", "hit_bonus": 0, "damage": "1d2" }]
},
{
"id": "chicken_little",
"name": "chick",
"renderable": { "glyph": "c", "fg": "#fae478", "bg": "#000000", "order": 1 },
- "flags": ["HERBIVORE"],
+ "flags": ["BYSTANDER", "BLOCKS_TILE"],
"bac": 10,
+ "vision_range": 4,
"attacks": [{ "name": "bites", "hit_bonus": 0, "damage": "1d2" }]
},
{
"id": "horse_little",
"name": "pony",
"renderable": { "glyph": "u", "fg": "#b36c29", "bg": "#000000", "order": 1 },
- "flags": ["HERBIVORE", "MULTIATTACK"],
+ "flags": ["BYSTANDER", "BLOCKS_TILE", "MULTIATTACK"],
"level": 3,
"bac": 6,
"speed": 16,
+ "vision_range": 8,
"attacks": [
{ "name": "kicks", "hit_bonus": 0, "damage": "1d6" },
{ "name": "bites", "hit_bonus": 0, "damage": "1d2" }
@@ -125,10 +132,11 @@
"id": "horse",
"name": "horse",
"renderable": { "glyph": "u", "fg": "#744d29", "bg": "#000000", "order": 1 },
- "flags": ["MULTIATTACK"],
+ "flags": ["MONSTER", "BLOCKS_TILE", "MULTIATTACK"],
"level": 5,
"bac": 5,
"speed": 20,
+ "vision_range": 8,
"attacks": [
{ "name": "kicks", "hit_bonus": 0, "damage": "1d8" },
{ "name": "bites", "hit_bonus": 0, "damage": "1d3" }
@@ -138,10 +146,11 @@
"id": "horse_large",
"name": "warhorse",
"renderable": { "glyph": "u", "fg": "#8a3520", "bg": "#000000", "order": 1 },
- "flags": ["MULTIATTACK"],
+ "flags": ["MONSTER", "BLOCKS_TILE", "MULTIATTACK"],
"level": 7,
"bac": 4,
"speed": 24,
+ "vision_range": 8,
"attacks": [
{ "name": "kicks", "hit_bonus": 0, "damage": "1d10" },
{ "name": "bites", "hit_bonus": 0, "damage": "1d4" }
@@ -151,9 +160,10 @@
"id": "rat_giant",
"name": "giant rat",
"renderable": { "glyph": "r", "fg": "#bb8000", "bg": "#000000", "order": 1 },
- "flags": ["SMALL_GROUP"],
+ "flags": ["MONSTER", "BLOCKS_TILE", "SMALL_GROUP"],
"level": 1,
"bac": 7,
+ "vision_range": 8,
"attacks": [{ "name": "bites", "hit_bonus": 0, "damage": "1d3" }],
"loot": { "table": "scrolls", "chance": 0.05 }
},
@@ -161,10 +171,11 @@
"id": "dog_little",
"name": "little dog",
"renderable": { "glyph": "d", "fg": "#FFFFFF", "bg": "#000000", "order": 1 },
- "flags": ["NEUTRAL"],
+ "flags": ["BYSTANDER", "BLOCKS_TILE"],
"level": 2,
"bac": 6,
"speed": 18,
+ "vision_range": 12,
"quips": ["", "", ""],
"attacks": [{ "name": "bites", "hit_bonus": 0, "damage": "1d6" }]
},
@@ -172,40 +183,43 @@
"id": "dog",
"name": "dog",
"renderable": { "glyph": "d", "fg": "#EEEEEE", "bg": "#000000", "order": 1 },
- "flags": [],
+ "flags": ["MONSTER", "BLOCKS_TILE"],
"level": 4,
"bac": 5,
"speed": 16,
+ "vision_range": 12,
"attacks": [{ "name": "bites", "hit_bonus": 0, "damage": "1d6" }]
},
{
"id": "dog_large",
"name": "large dog",
"renderable": { "glyph": "d", "fg": "#DDDDDD", "bg": "#000000", "order": 1 },
- "flags": [],
+ "flags": ["MONSTER", "BLOCKS_TILE"],
"level": 6,
"bac": 4,
"speed": 15,
+ "vision_range": 12,
"attacks": [{ "name": "bites", "hit_bonus": 0, "damage": "2d4" }]
},
{
"id": "gnome",
"name": "gnome",
"renderable": { "glyph": "G", "fg": "#AA5500", "bg": "#000000", "order": 1 },
- "flags": ["SMALL_GROUP", "IS_GNOME"],
+ "flags": ["MONSTER", "BLOCKS_TILE", "SMALL_GROUP"],
"level": 1,
"speed": 6,
+ "vision_range": 12,
"attacks": [{ "name": "claws", "hit_bonus": 0, "damage": "1d6" }],
"loot": { "table": "wands", "chance": 0.05 }
},
{
"id": "zombie_gnome",
"name": "gnome zombie",
- "renderable": { "glyph": "z", "fg": "#AA5500", "bg": "#000000", "order": 1 },
- "flags": ["MINDLESS"],
+ "renderable": { "glyph": "G", "fg": "#AA5500", "bg": "#000000", "order": 1 },
+ "flags": ["MONSTER", "BLOCKS_TILE"],
"level": 1,
"speed": 6,
- "vision_range": 12,
+ "vision_range": 7,
"attacks": [{ "name": "claws", "hit_bonus": 0, "damage": "1d4" }],
"loot": { "table": "wands", "chance": 0.05 }
},
@@ -213,18 +227,20 @@
"id": "goblin",
"name": "goblin",
"renderable": { "glyph": "g", "fg": "#00FF00", "bg": "#000000", "order": 1 },
- "flags": [],
+ "flags": ["MONSTER", "BLOCKS_TILE"],
"level": 1,
"speed": 9,
+ "vision_range": 12,
"attacks": [{ "name": "hits", "hit_bonus": 0, "damage": "1d4" }]
},
{
"id": "kobold",
"name": "kobold",
"renderable": { "glyph": "k", "fg": "#AA5500", "bg": "#000000", "order": 1 },
- "flags": [],
+ "flags": ["MONSTER", "BLOCKS_TILE"],
"level": 1,
"speed": 6,
+ "vision_range": 7,
"attacks": [{ "name": "hits", "hit_bonus": 0, "damage": "1d4" }],
"loot": { "table": "food", "chance": 0.05 }
},
@@ -232,10 +248,10 @@
"id": "zombie_kobold",
"name": "kobold zombie",
"renderable": { "glyph": "z", "fg": "#AA5500", "bg": "#000000", "order": 1 },
- "flags": ["MINDLESS"],
+ "flags": ["MONSTER", "BLOCKS_TILE"],
"level": 1,
"speed": 6,
- "vision_range": 12,
+ "vision_range": 7,
"attacks": [{ "name": "claws", "hit_bonus": 0, "damage": "1d4" }],
"loot": { "table": "scrolls", "chance": 0.05 }
},
@@ -243,10 +259,10 @@
"id": "kobold_large",
"name": "large kobold",
"renderable": { "glyph": "k", "fg": "#70461b", "bg": "#000000", "order": 1 },
- "flags": [],
+ "flags": ["MONSTER", "BLOCKS_TILE"],
"level": 1,
"speed": 6,
- "vision_range": 12,
+ "vision_range": 8,
"attacks": [{ "name": "hits", "hit_bonus": 0, "damage": "1d6" }],
"loot": { "table": "food", "chance": 0.05 }
},
@@ -254,11 +270,11 @@
"id": "zombie_orc",
"name": "orc zombie",
"renderable": { "glyph": "z", "fg": "#dbd830", "bg": "#000000", "order": 1 },
- "flags": ["MINDLESS"],
+ "flags": ["MONSTER", "BLOCKS_TILE"],
"level": 2,
"bac": 9,
"speed": 6,
- "vision_range": 12,
+ "vision_range": 8,
"attacks": [{ "name": "claws", "hit_bonus": 0, "damage": "1d6" }],
"loot": { "table": "potions", "chance": 0.05 }
},
@@ -266,11 +282,12 @@
"id": "dwarf",
"name": "dwarf",
"renderable": { "glyph": "h", "fg": "#d61b1b", "bg": "#000000", "order": 1 },
- "flags": ["IS_DWARF"],
+ "flags": ["MONSTER", "BLOCKS_TILE"],
"level": 2,
"bac": 10,
"speed": 6,
- "attacks": [{ "name": "hacks", "hit_bonus": 0, "damage": "1d8" }],
+ "vision_range": 8,
+ "attacks": [{ "name": "claws", "hit_bonus": 0, "damage": "1d8" }],
"equipped": ["equip_feet_iron"],
"loot": { "table": "equipment", "chance": 0.05 }
},
@@ -278,11 +295,11 @@
"id": "zombie_dwarf",
"name": "dwarf zombie",
"renderable": { "glyph": "z", "fg": "#d61b1b", "bg": "#000000", "order": 1 },
- "flags": ["MINDLESS"],
+ "flags": ["MONSTER", "BLOCKS_TILE"],
"level": 2,
"bac": 9,
"speed": 6,
- "vision_range": 12,
+ "vision_range": 8,
"attacks": [{ "name": "claws", "hit_bonus": 0, "damage": "1d6" }],
"loot": { "table": "equipment", "chance": 0.05 }
},
@@ -290,10 +307,10 @@
"id": "kobold_captain",
"name": "kobold captain",
"renderable": { "glyph": "k", "fg": "#9331ac", "bg": "#000000", "order": 1 },
- "flags": [],
+ "flags": ["MONSTER", "BLOCKS_TILE"],
"level": 2,
"speed": 6,
- "vision_range": 12,
+ "vision_range": 7,
"attacks": [{ "name": "hits", "hit_bonus": 0, "damage": "2d4" }],
"loot": { "table": "food", "chance": 0.05 }
},
@@ -301,101 +318,60 @@
"id": "spider_cave",
"name": "cave spider",
"renderable": { "glyph": "s", "fg": "#6b6b6b", "bg": "#000000", "order": 1 },
- "flags": ["SMALL_GROUP"],
+ "flags": ["MONSTER", "BLOCKS_TILE", "SMALL_GROUP"],
"level": 1,
"bac": 3,
"speed": 12,
+ "vision_range": 12,
"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"],
+ "flags": ["MONSTER", "BLOCKS_TILE", "SMALL_GROUP"],
"bac": 7,
+ "vision_range": 12,
"attacks": [{ "name": "bites", "hit_bonus": 0, "damage": "1d2" }]
},
{
"id": "fox",
"name": "fox",
"renderable": { "glyph": "d", "fg": "#FF0000", "bg": "#000000", "order": 1 },
- "flags": ["CARNIVORE"],
+ "flags": ["MONSTER", "BLOCKS_TILE"],
"bac": 7,
+ "vision_range": 12,
"attacks": [{ "name": "bites", "hit_bonus": 0, "damage": "1d3" }]
},
{
"id": "coyote",
"name": "coyote",
"renderable": { "glyph": "d", "fg": "#6E3215", "bg": "#000000", "order": 1 },
- "flags": ["CARNIVORE", "SMALL_GROUP"],
+ "flags": ["MONSTER", "BLOCKS_TILE", "SMALL_GROUP"],
"level": 1,
"bac": 7,
+ "vision_range": 12,
"attacks": [{ "name": "bites", "hit_bonus": 0, "damage": "1d4" }]
},
{
"id": "wolf",
"name": "wolf",
"renderable": { "glyph": "d", "fg": "#5E4225", "bg": "#000000", "order": 1 },
- "flags": ["CARNIVORE"],
+ "flags": ["MONSTER", "BLOCKS_TILE"],
"level": 5,
"bac": 4,
+ "vision_range": 12,
"attacks": [{ "name": "bites", "hit_bonus": 0, "damage": "2d4" }]
},
{
"id": "goblin_chieftain",
"name": "goblin chieftain",
- "renderable": { "glyph": "g", "fg": "#9331ac", "bg": "#000000", "order": 1 },
- "flags": [],
+ "renderable": { "glyph": "G", "fg": "#00FF00", "bg": "#000000", "order": 1 },
+ "flags": ["MONSTER", "BLOCKS_TILE"],
"level": 2,
"speed": 9,
+ "vision_range": 12,
"attacks": [{ "name": "hits", "hit_bonus": 0, "damage": "1d8" }],
"loot": { "table": "wands", "chance": 0.05 }
},
@@ -403,9 +379,10 @@
"id": "orc",
"name": "orc",
"renderable": { "glyph": "o", "fg": "#00FF00", "bg": "#000000", "order": 1 },
- "flags": ["SMALL_GROUP"],
+ "flags": ["MONSTER", "BLOCKS_TILE", "SMALL_GROUP"],
"level": 1,
"speed": 9,
+ "vision_range": 12,
"attacks": [{ "name": "hits", "hit_bonus": 0, "damage": "1d6" }],
"loot": { "table": "equipment", "chance": 0.05 }
},
@@ -413,9 +390,10 @@
"id": "orc_hill",
"name": "hill orc",
"renderable": { "glyph": "o", "fg": "#dbd830", "bg": "#000000", "order": 1 },
- "flags": ["LARGE_GROUP"],
+ "flags": ["MONSTER", "BLOCKS_TILE", "LARGE_GROUP"],
"level": 2,
"speed": 9,
+ "vision_range": 11,
"attacks": [{ "name": "hits", "hit_bonus": 0, "damage": "1d6" }],
"loot": { "table": "equipment", "chance": 0.05 }
},
@@ -423,91 +401,26 @@
"id": "orc_captain",
"name": "orc captain",
"renderable": { "glyph": "o", "fg": "#9331ac", "bg": "#000000", "order": 1 },
- "flags": ["MULTIATTACK"],
+ "flags": ["MONSTER", "BLOCKS_TILE", "MULTIATTACK"],
"level": 5,
"speed": 5,
+ "vision_range": 12,
"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",
- "renderable": { "glyph": "O", "fg": "#10A70d", "bg": "#000000", "order": 1 },
- "flags": ["SMALL_GROUP"],
+ "renderable": { "glyph": "O", "fg": "#00FF00", "bg": "#000000", "order": 1 },
+ "flags": ["MONSTER", "BLOCKS_TILE", "SMALL_GROUP"],
"level": 5,
"bac": 5,
"speed": 10,
+ "vision_range": 8,
"attacks": [{ "name": "hits", "hit_bonus": 0, "damage": "2d5" }],
"loot": { "table": "food", "chance": 0.05 }
- },
- {
- "id": "treant_small",
- "name": "treant sapling",
- "renderable": { "glyph": "♠️", "fg": "#10570d", "bg": "#000000", "order": 1 },
- "flags": ["LARGE_GROUP", "GREEN_BLOOD", "FIRE_WEAK"],
- "level": 2,
- "bac": 12,
- "speed": 3,
- "attacks": [{ "name": "lashes", "hit_bonus": 4, "damage": "1d8" }],
- "loot": { "table": "scrolls", "chance": 0.05 }
}
]
diff --git a/raws/props.json b/raws/props.json
index 0c48291..91d244c 100644
--- a/raws/props.json
+++ b/raws/props.json
@@ -3,82 +3,62 @@
"id": "door",
"name": "door",
"renderable": { "glyph": "+", "fg": "#00FFFF", "bg": "#000000", "order": 2 },
- "flags": ["DOOR"]
+ "flags": ["BLOCKS_TILE", "BLOCKS_VISIBILITY", "DOOR", "PROP"]
},
{
"id": "prop_altar",
"name": "altar",
"renderable": { "glyph": "_", "fg": "#FFFFFF", "bg": "#000000", "order": 2 },
- "flags": ["ENTRY_TRIGGER"],
- "effects": { "heal": "8d8" }
+ "flags": ["PROP"]
},
{
"id": "prop_keg",
"name": "keg",
"renderable": { "glyph": "φ", "fg": "#AAAAAA", "bg": "#000000", "order": 2 },
- "flags": []
+ "flags": ["PROP"]
},
{
"id": "prop_table",
"name": "table",
"renderable": { "glyph": "-", "fg": "#AAAAAA", "bg": "#000000", "order": 2 },
- "flags": []
- },
- {
- "id": "prop_hay",
- "name": "hay",
- "renderable": { "glyph": "%", "fg": "#c7ad39", "bg": "#000000", "order": 2 },
- "flags": []
- },
- {
- "id": "prop_statue",
- "name": "statue",
- "renderable": { "glyph": "@", "fg": "#ffffff", "bg": "#000000", "order": 2 },
- "flags": []
+ "flags": ["PROP"]
},
{
"id": "prop_bed",
"name": "bed",
"renderable": { "glyph": "=", "fg": "#AAAAAA", "bg": "#000000", "order": 2 },
- "flags": []
+ "flags": ["PROP"]
},
{
"id": "prop_chair",
"name": "chair",
"renderable": { "glyph": "└", "fg": "#AAAAAA", "bg": "#000000", "order": 2 },
- "flags": []
+ "flags": ["PROP"]
},
{
"id": "prop_candle",
"name": "candle",
"renderable": { "glyph": "Ä", "fg": "#FFA500", "bg": "#000000", "order": 2 },
- "flags": []
+ "flags": ["PROP"]
},
{
"id": "trap_bear",
"name": "bear trap",
- "renderable": { "glyph": "^", "fg": "#e6e6e6", "bg": "#000000", "order": 2 },
+ "renderable": { "glyph": "^", "fg": "#C0C0C0", "bg": "#000000", "order": 2 },
"flags": ["HIDDEN", "ENTRY_TRIGGER", "SINGLE_ACTIVATION"],
- "effects": { "damage": "2d4" }
- },
- {
- "id": "trap_mini_mine",
- "name": "mini-mine",
- "renderable": { "glyph": "^", "fg": "#ff1e00", "bg": "#000000", "order": 2 },
- "flags": ["ENTRY_TRIGGER", "SINGLE_ACTIVATION"],
- "effects": { "damage": "2d4", "aoe": "3" }
+ "effects": { "damage": "6" }
},
{
"id": "trap_stonefall",
"name": "stonefall trap",
- "renderable": { "glyph": "^", "fg": "#beb5a7", "bg": "#000000", "order": 2 },
+ "renderable": { "glyph": "^", "fg": "#C0C0C0", "bg": "#000000", "order": 2 },
"flags": ["HIDDEN", "ENTRY_TRIGGER", "SINGLE_ACTIVATION"],
- "effects": { "damage": "2d10" }
+ "effects": { "damage": "12" }
},
{
"id": "trap_confusion",
"name": "magic trap",
- "renderable": { "glyph": "^", "fg": "#df07df", "bg": "#000000", "order": 2 },
+ "renderable": { "glyph": "^", "fg": "#800080", "bg": "#000000", "order": 2 },
"flags": ["HIDDEN", "ENTRY_TRIGGER", "SINGLE_ACTIVATION"],
"effects": { "confusion": "3" }
}
diff --git a/raws/spawn_tables.json b/raws/spawn_tables.json
index b624a80..a7be6c2 100644
--- a/raws/spawn_tables.json
+++ b/raws/spawn_tables.json
@@ -2,12 +2,8 @@
{
"id": "equipment",
"table": [
- { "id": "equip_pitchfork", "weight": 1, "difficulty": 1},
- { "id": "equip_sickle", "weight": 1, "difficulty": 1},
- { "id": "equip_handaxe", "weight": 1, "difficulty": 1},
{ "id": "equip_dagger", "weight": 3, "difficulty": 1},
{ "id": "equip_shortsword", "weight": 3, "difficulty": 1},
- { "id": "equip_rapier", "weight": 2, "difficulty": 1},
{ "id": "equip_smallshield", "weight": 3, "difficulty": 1},
{ "id": "equip_mediumshield", "weight": 2, "difficulty": 1},
{ "id": "equip_body_weakleather", "weight": 4, "difficulty": 1},
@@ -29,123 +25,81 @@
{ "id": "equip_feet_iron", "weight": 2, "difficulty": 4}
]
},
- {
- "id": "villager_equipment",
- "table": [
- { "id": "equip_pitchfork", "weight": 1, "difficulty": 1},
- { "id": "equip_sickle", "weight": 1, "difficulty": 1},
- { "id": "equip_handaxe", "weight": 1, "difficulty": 1}
- ]
- },
{
"id": "potions",
"table": [
- { "id": "potion_health_weak", "weight": 6, "difficulty": 1},
- { "id": "potion_health", "weight": 3, "difficulty": 1}
+ { "id": "potion_health_weak", "weight": 6, "difficulty": 1},
+ { "id": "potion_health", "weight": 3, "difficulty": 1}
]
},
{
"id": "scrolls",
"table": [
- { "id": "scroll_identify", "weight": 3, "difficulty": 1},
- { "id": "scroll_removecurse", "weight": 2, "difficulty": 1},
- { "id": "scroll_confusion", "weight": 2, "difficulty": 1},
- { "id": "scroll_magicmap", "weight": 2, "difficulty": 1},
- { "id": "scroll_embers", "weight": 2, "difficulty": 2},
- { "id": "scroll_health", "weight": 2, "difficulty": 2},
- { "id": "scroll_fireball", "weight": 2, "difficulty": 2},
- { "id": "scroll_mass_health", "weight": 1, "difficulty": 2},
- { "id": "scroll_mass_confusion", "weight": 1, "difficulty": 3}
+ { "id": "scroll_confusion", "weight": 2, "difficulty": 1},
+ { "id": "scroll_magicmap_c", "weight": 2, "difficulty": 1},
+ { "id": "scroll_magicmap", "weight": 2, "difficulty": 1},
+ { "id": "scroll_fireball", "weight": 2, "difficulty": 2},
+ { "id": "scroll_fireball_c", "weight": 2, "difficulty": 2}
]
},
{
"id": "wands",
"table": [
- { "id": "wand_magicmissile", "weight": 1, "difficulty": 1},
- { "id": "wand_confusion", "weight": 1, "difficulty": 1},
- { "id": "wand_digging", "weight": 1, "difficulty": 1},
- { "id": "wand_fireball", "weight": 1, "difficulty": 2}
+ { "id": "wand_magicmissile", "weight": 1, "difficulty": 1},
+ { "id": "wand_confusion", "weight": 1, "difficulty": 1},
+ { "id": "wand_digging", "weight": 1, "difficulty": 1},
+ { "id": "wand_fireball", "weight": 1, "difficulty": 2}
]
},
{
"id": "food",
"table": [
- { "id": "food_rations", "weight": 1, "difficulty": 1},
- { "id": "food_apple", "weight": 1, "difficulty": 1}
+ { "id": "food_rations", "weight": 1, "difficulty": 1},
+ { "id": "food_apple", "weight": 1, "difficulty": 1}
]
},
{
"id": "mobs",
"table": [
- { "id": "sheep_little", "weight": 1, "difficulty": 0},
- { "id": "chicken", "weight": 1, "difficulty": 1},
- { "id": "rat", "weight": 1, "difficulty": 1},
- { "id": "goblin", "weight": 3, "difficulty": 1},
- { "id": "kobold", "weight": 1, "difficulty": 1},
- { "id": "fox", "weight": 1, "difficulty": 1},
- { "id": "jackal", "weight": 4, "difficulty": 1},
- { "id": "deer_little", "weight": 1, "difficulty": 1},
- { "id": "treant_small", "weight": 1, "difficulty": 1},
- { "id": "zombie_kobold", "weight": 1, "difficulty": 1},
- { "id": "zombie_gnome", "weight": 1, "difficulty": 2},
- { "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},
- { "id": "spider_cave", "weight": 2, "difficulty": 3},
- { "id": "kobold_captain", "weight": 1, "difficulty": 3},
- { "id": "dog_little", "weight": 1, "difficulty": 3},
- { "id": "orc", "weight": 2, "difficulty": 3},
- { "id": "goblin_chieftain", "weight": 1, "difficulty": 3},
- { "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}
- ]
- },
- {
- "id": "squad_goblin",
- "table": [
- { "id": "goblin", "weight": 3, "difficulty": 1}
- ]
- },
- {
- "id": "squad_kobold",
- "table": [
- { "id": "kobold", "weight": 3, "difficulty": 1},
- { "id": "kobold_large", "weight": 2, "difficulty": 2}
- ]
- },
- {
- "id": "squad_orc",
- "table": [
- { "id": "orc", "weight": 2, "difficulty": 2},
- { "id": "orc_hill", "weight": 1, "difficulty": 4}
+ { "id": "sheep_little", "weight": 1, "difficulty": 0},
+ { "id": "chicken", "weight": 1, "difficulty": 1},
+ { "id": "rat", "weight": 1, "difficulty": 1},
+ { "id": "goblin", "weight": 3, "difficulty": 1},
+ { "id": "kobold", "weight": 1, "difficulty": 1},
+ { "id": "fox", "weight": 1, "difficulty": 1},
+ { "id": "jackal", "weight": 4, "difficulty": 1},
+ { "id": "deer_little", "weight": 1, "difficulty": 1},
+ { "id": "zombie_kobold", "weight": 1, "difficulty": 1},
+ { "id": "zombie_gnome", "weight": 1, "difficulty": 2},
+ { "id": "kobold_large", "weight": 1, "difficulty": 2},
+ { "id": "rat_giant", "weight": 2, "difficulty": 2},
+ { "id": "coyote", "weight": 4, "difficulty": 2},
+ { "id": "zombie_orc", "weight": 1, "difficulty": 3},
+ { "id": "zombie_dwarf", "weight": 1, "difficulty": 3},
+ { "id": "gnome", "weight": 1, "difficulty": 3},
+ { "id": "spider_cave", "weight": 2, "difficulty": 3},
+ { "id": "kobold_captain", "weight": 1, "difficulty": 3},
+ { "id": "dog_little", "weight": 1, "difficulty": 3},
+ { "id": "orc", "weight": 2, "difficulty": 3},
+ { "id": "goblin_chieftain", "weight": 1, "difficulty": 3},
+ { "id": "dwarf", "weight": 3, "difficulty": 4},
+ { "id": "orc_hill", "weight": 1, "difficulty": 4},
+ { "id": "horse_little", "weight": 2, "difficulty": 4},
+ { "id": "dog", "weight": 1, "difficulty": 5},
+ { "id": "wolf", "weight": 2, "difficulty": 6},
+ { "id": "orc_captain", "weight": 1, "difficulty": 7},
+ { "id": "dog_large", "weight": 1, "difficulty": 7},
+ { "id": "horse", "weight": 2, "difficulty": 7},
+ { "id": "ogre", "weight": 1, "difficulty": 7},
+ { "id": "horse_large", "weight": 2, "difficulty": 9}
]
},
{
"id": "traps",
"table": [
- { "id": "trap_bear", "weight": 2, "difficulty": 1},
- { "id": "trap_confusion", "weight": 1, "difficulty": 1},
- { "id": "trap_mini_mine", "weight": 1, "difficulty": 3},
- { "id": "trap_stonefall", "weight": 1, "difficulty": 5}
+ { "id": "trap_bear", "weight": 2, "difficulty": 1},
+ { "id": "trap_confusion", "weight": 1, "difficulty": 1},
+ { "id": "trap_stonefall", "weight": 1, "difficulty": 5}
]
}
]
diff --git a/resources/terminal10x10_gs_tc.png b/resources/terminal10x10_gs_tc.png
new file mode 100644
index 0000000..5e0cdc9
Binary files /dev/null and b/resources/terminal10x10_gs_tc.png differ
diff --git a/resources/terminal8x8.jpg b/resources/terminal8x8.jpg
new file mode 100644
index 0000000..9f4d79d
Binary files /dev/null and b/resources/terminal8x8.jpg differ
diff --git a/resources/terminal_10x16.png b/resources/terminal_10x16.png
new file mode 100644
index 0000000..e40aa99
Binary files /dev/null and b/resources/terminal_10x16.png differ
diff --git a/resources/vga8x16.png b/resources/vga8x16.png
new file mode 100644
index 0000000..913e32c
Binary files /dev/null and b/resources/vga8x16.png differ
diff --git a/src/ai/adjacent_ai_system.rs b/src/ai/adjacent_ai_system.rs
deleted file mode 100644
index 5586948..0000000
--- a/src/ai/adjacent_ai_system.rs
+++ /dev/null
@@ -1,94 +0,0 @@
-use crate::{ raws::Reaction, Faction, HasAncestry, Map, Position, TakingTurn, WantsToMelee };
-use specs::prelude::*;
-
-pub struct AdjacentAI {}
-
-impl<'a> System<'a> for AdjacentAI {
- #[allow(clippy::type_complexity)]
- type SystemData = (
- WriteStorage<'a, TakingTurn>,
- ReadStorage<'a, Faction>,
- ReadStorage<'a, HasAncestry>,
- ReadStorage<'a, Position>,
- ReadExpect<'a, Map>,
- WriteStorage<'a, WantsToMelee>,
- Entities<'a>,
- ReadExpect<'a, Entity>,
- );
-
- fn run(&mut self, data: Self::SystemData) {
- let (mut turns, factions, ancestries, positions, map, mut want_melee, entities, player) = data;
-
- let mut turn_done: Vec = Vec::new();
- for (entity, _turn, pos) in (&entities, &turns, &positions).join() {
- if entity != *player {
- let mut reactions: Vec<(Entity, Reaction)> = Vec::new();
- let idx = map.xy_idx(pos.x, pos.y);
- let w = map.width;
- let h = map.height;
- // Add possible reactions to adjacents for each direction
- if pos.x > 0 {
- evaluate(entity, idx - 1, &ancestries, &factions, &mut reactions);
- }
- if pos.x < w - 1 {
- evaluate(entity, idx + 1, &ancestries, &factions, &mut reactions);
- }
- if pos.y > 0 {
- evaluate(entity, idx - (w as usize), &ancestries, &factions, &mut reactions);
- }
- if pos.y < h - 1 {
- evaluate(entity, idx + (w as usize), &ancestries, &factions, &mut reactions);
- }
- if pos.y > 0 && pos.x > 0 {
- evaluate(entity, idx - (w as usize) - 1, &ancestries, &factions, &mut reactions);
- }
- if pos.y > 0 && pos.x < w - 1 {
- evaluate(entity, idx - (w as usize) + 1, &ancestries, &factions, &mut reactions);
- }
- if pos.y < h - 1 && pos.x > 0 {
- evaluate(entity, idx + (w as usize) - 1, &ancestries, &factions, &mut reactions);
- }
- if pos.y < h - 1 && pos.x < w - 1 {
- evaluate(entity, idx + (w as usize) + 1, &ancestries, &factions, &mut reactions);
- }
-
- let mut done = false;
- for reaction in reactions.iter() {
- if let Reaction::Attack = reaction.1 {
- want_melee.insert(entity, WantsToMelee { target: reaction.0 }).expect("Error inserting melee");
- done = true;
- }
- }
-
- if done {
- turn_done.push(entity);
- }
- }
- }
-
- // Remove turn marker for those that are done
- for done in turn_done.iter() {
- turns.remove(*done);
- }
- }
-}
-
-/// Evaluates all possible reactions between this faction and all entities on a given tile idx.
-fn evaluate(
- entity: Entity,
- idx: usize,
- ancestries: &ReadStorage,
- factions: &ReadStorage,
- reactions: &mut Vec<(Entity, Reaction)>
-) {
- crate::spatial::for_each_tile_content(idx, |other_entity| {
- let result = crate::raws::get_reactions(
- entity,
- other_entity,
- &factions,
- &ancestries,
- &crate::raws::RAWS.lock().unwrap()
- );
- reactions.push((other_entity, result));
- });
-}
diff --git a/src/ai/approach_ai_system.rs b/src/ai/approach_ai_system.rs
deleted file mode 100644
index c3cc2ca..0000000
--- a/src/ai/approach_ai_system.rs
+++ /dev/null
@@ -1,105 +0,0 @@
-use crate::{ EntityMoved, Map, Position, TakingTurn, Telepath, Viewshed, WantsToApproach };
-use bracket_lib::prelude::*;
-use specs::prelude::*;
-
-pub struct ApproachAI {}
-
-impl<'a> System<'a> for ApproachAI {
- #[allow(clippy::type_complexity)]
- type SystemData = (
- WriteStorage<'a, TakingTurn>,
- WriteStorage<'a, WantsToApproach>,
- WriteStorage<'a, Position>,
- WriteExpect<'a, Map>,
- WriteStorage<'a, Viewshed>,
- WriteStorage<'a, Telepath>,
- WriteStorage<'a, EntityMoved>,
- Entities<'a>,
- );
-
- fn run(&mut self, data: Self::SystemData) {
- let (
- mut turns,
- mut wants_to_approach,
- mut positions,
- mut map,
- mut viewsheds,
- mut telepaths,
- mut entity_moved,
- entities,
- ) = data;
- let mut turn_done: Vec = Vec::new();
- for (entity, mut pos, approach, mut viewshed, _turn) in (
- &entities,
- &mut positions,
- &wants_to_approach,
- &mut viewsheds,
- &turns,
- ).join() {
- turn_done.push(entity);
- let target_idxs = if
- let Some(paths) = get_adjacent_unblocked(&map, approach.idx as usize)
- {
- paths
- } else {
- continue;
- };
- let mut path: Option = None;
- let idx = map.xy_idx(pos.x, pos.y);
- for tar_idx in target_idxs {
- 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()
- {
- path = Some(potential_path);
- }
- }
- }
- let path = if path.is_some() {
- path.unwrap()
- } else {
- continue;
- };
- if path.success && path.steps.len() > 1 {
- let idx = map.xy_idx(pos.x, pos.y);
- pos.x = (path.steps[1] as i32) % map.width;
- pos.y = (path.steps[1] as i32) / map.width;
- 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;
- if let Some(telepath) = telepaths.get_mut(entity) {
- telepath.dirty = true;
- }
- }
- }
- wants_to_approach.clear();
- for done in turn_done.iter() {
- turns.remove(*done);
- }
- }
-}
-
-/// Try to get an unblocked index within one tile of a given idx, or None.
-pub fn get_adjacent_unblocked(map: &WriteExpect