diff --git a/.github/bors.toml b/.github/bors.toml index 9e5402d19b..115d3142c6 100644 --- a/.github/bors.toml +++ b/.github/bors.toml @@ -1,9 +1,7 @@ use_squash_merge = true cut_body_after = "_ _ _" -pr_status = [ - "Validate conventional PR title", -] status = [ + "Lint commit message", "Check Rust formatting", "Clippy correctness checks (%)", "Build Docs", diff --git a/.github/workflows/bors-commit-lint.yml b/.github/workflows/bors-commit-lint.yml new file mode 100644 index 0000000000..604694f350 --- /dev/null +++ b/.github/workflows/bors-commit-lint.yml @@ -0,0 +1,18 @@ +name: Lint commit message +on: + push: + branches: + - staging + - trying + +jobs: + commitlint: + name: Lint commit message + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 2 + - uses: wagoid/commitlint-github-action@v5 + with: + commitDepth: 1 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bbbf3db7fd..14d776491c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -31,8 +31,7 @@ jobs: matrix: config: - { target: "x86_64-unknown-linux-gnu", target_dir: "target" } - # Disable WASM Target until we fix WASM compile - # - { target: 'wasm32-unknown-unknown', target_dir: 'web-target' } + - { target: 'wasm32-unknown-unknown', target_dir: 'web-target' } steps: - name: Install dependencies run: | diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 61d9d0af87..06689c9038 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -49,8 +49,7 @@ jobs: - name: Build Rustdoc run: | - cargo doc --no-deps -p bones_matchmaker_proto - cargo doc --no-deps + cargo doc --workspace --no-deps mv target/doc book/src/developers/rustdoc - name: Build MDBook @@ -59,8 +58,9 @@ jobs: mdbook build - name: Deploy 🚀 - uses: peaceiris/actions-gh-pages@v3 + uses: JamesIves/github-pages-deploy-action@4.1.3 if: ${{ github.ref == 'refs/heads/main' }} with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./book/dist + branch: gh-pages + folder: ./book/dist + target-folder: book diff --git a/.github/workflows/lint-pr.yml b/.github/workflows/pul-requests.yml similarity index 77% rename from .github/workflows/lint-pr.yml rename to .github/workflows/pul-requests.yml index 3814b17424..77ea8f261b 100644 --- a/.github/workflows/lint-pr.yml +++ b/.github/workflows/pul-requests.yml @@ -1,4 +1,4 @@ -name: "Lint PR" +name: Pull Requests on: pull_request_target: @@ -14,4 +14,4 @@ jobs: steps: - uses: amannn/action-semantic-pull-request@v5 env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/web-demo.yml b/.github/workflows/web-demo.yml index bf01f17e38..669cb2dce0 100644 --- a/.github/workflows/web-demo.yml +++ b/.github/workflows/web-demo.yml @@ -1,15 +1,11 @@ name: Publish Web Demo on: - - workflow_dispatch - # Disable temporarily while web build is broken - # - # push: - # tags: - # - "v*" - # branches: - # - bevy-rewrite - # - main + push: + tags: + - "v*" + branches: + - main jobs: publish-web-demo: @@ -49,19 +45,17 @@ jobs: branch: gh-pages folder: web-target/wasm-release target-folder: player/${{ github.ref_name }} - ssh-key: ${{ secrets.MASTER_GH_PAGES_DEPLOY_KEY }} - # - name: Symlink Latest Build - # run: | - # mkdir latest-symlink-dir - # ln -s ./${{ github.ref_name }} latest - # mv latest latest-symlink-dir + - name: Symlink Latest Build + run: | + mkdir latest-symlink-dir + ln -s ./${{ github.ref_name }} latest + mv latest latest-symlink-dir - # - name: Deploy Symlinked Latest Build 🚀 - # uses: JamesIves/github-pages-deploy-action@4.1.3 - # with: - # branch: gh-pages - # folder: latest-symlink-dir - # clean: false - # target-folder: player - # ssh-key: ${{ secrets.MASTER_GH_PAGES_DEPLOY_KEY }} + - name: Deploy Symlinked Latest Build 🚀 + uses: JamesIves/github-pages-deploy-action@4.1.3 + with: + branch: gh-pages + folder: latest-symlink-dir + clean: false + target-folder: player diff --git a/Cargo.lock b/Cargo.lock index e6ebe65248..39614e025e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "ab_glyph" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dcdbc68024b653943864d436fe8a24b028095bc1cf91a8926f8241e4aaffe59" +checksum = "e5568a4aa5ba8adf5175c5c460b030e27d8893412976cc37bef0e4fbc16cfbba" dependencies = [ "ab_glyph_rasterizer", "owned_ttf_parser", @@ -18,15 +18,6 @@ version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "330223a1aecc308757b9926e9391c9b47f8ef2dbd8aea9df88312aea18c5e8d6" -[[package]] -name = "addr2line" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97" -dependencies = [ - "gimli", -] - [[package]] name = "adler" version = "1.0.2" @@ -45,7 +36,7 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" dependencies = [ - "getrandom 0.2.8", + "getrandom", "once_cell", "version_check", ] @@ -56,8 +47,7 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf6ccdb167abbf410dcb915cabd428929d7f6a04980b54a11f26a39f1c7f7107" dependencies = [ - "cfg-if 1.0.0", - "getrandom 0.2.8", + "cfg-if", "once_cell", "version_check", ] @@ -71,6 +61,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "aligned-vec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" + [[package]] name = "alsa" version = "0.6.0" @@ -101,14 +97,14 @@ checksum = "85965b6739a430150bdd138e2374a98af0c3ee0d030b3bb7fc3bddff58d0102e" [[package]] name = "android_logger" -version = "0.10.1" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9ed09b18365ed295d722d0b5ed59c01b79a826ff2d2a8f73d5ecca8e6fb2f66" +checksum = "8619b80c242aa7bd638b5c7ddd952addeecb71f69c75e33f1d47b2804f8f883a" dependencies = [ "android_log-sys", "env_logger", - "lazy_static", "log", + "once_cell", ] [[package]] @@ -142,24 +138,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc120354d1b5ec6d7aaf4876b602def75595937b5e15d356eb554ab5177e08bb" dependencies = [ "clipboard-win", - "core-graphics 0.22.3", + "core-graphics", "image 0.23.14", "log", "objc", "objc-foundation", "objc_id", - "parking_lot 0.12.1", + "parking_lot", "thiserror", "winapi", "x11rb", ] -[[package]] -name = "arrayvec" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" - [[package]] name = "arrayvec" version = "0.7.2" @@ -168,9 +158,9 @@ checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" [[package]] name = "ash" -version = "0.37.1+1.3.235" +version = "0.37.2+1.3.238" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "911015c962d56e2e4052f40182ca5462ba60a3d2ff04e827c365a0ab3d65726d" +checksum = "28bf19c1f0a470be5fbf7522a308a05df06610252c5bcf5143e1b23f629a9a03" dependencies = [ "libloading", ] @@ -181,7 +171,7 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf46fee83e5ccffc220104713af3292ff9bc7c64c7de289f66dae8e38d826833" dependencies = [ - "concurrent-queue", + "concurrent-queue 2.0.0", "event-listener", "futures-core", ] @@ -194,32 +184,12 @@ checksum = "17adb73da160dfb475c183343c8cccd80721ea5a605d3eb57125f0a7b7a92d0b" dependencies = [ "async-lock", "async-task", - "concurrent-queue", + "concurrent-queue 2.0.0", "fastrand", "futures-lite", "slab", ] -[[package]] -name = "async-io" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c374dda1ed3e7d8f0d9ba58715f924862c63eae6849c92d3a18e7fbde9e2794" -dependencies = [ - "async-lock", - "autocfg", - "concurrent-queue", - "futures-lite", - "libc", - "log", - "parking", - "polling", - "slab", - "socket2", - "waker-fn", - "windows-sys 0.42.0", -] - [[package]] name = "async-lock" version = "2.6.0" @@ -242,17 +212,11 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5450eca8ce5abcfd5520727e975ebab30ccca96030550406b0ca718b224ead10" -[[package]] -name = "atomic-waker" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "065374052e7df7ee4047b1160cca5e1467a12351a40b3da123c870ba0b8eda2a" - [[package]] name = "atomic_refcell" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73b5e5f48b927f04e952dedc932f31995a65a0bf65ec971c74436e51bf6e970d" +checksum = "857253367827bd9d0fd973f0ef15506a96e79e41b0ad7aa691203a4e3214f6c8" [[package]] name = "autocfg" @@ -261,19 +225,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] -name = "backtrace" -version = "0.3.67" +name = "base-x" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233d376d6d185f2a3093e58f283f60f880315b6c60075b01f36b3b85154564ca" -dependencies = [ - "addr2line", - "cc", - "cfg-if 1.0.0", - "libc", - "miniz_oxide 0.6.2", - "object", - "rustc-demangle", -] +checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" [[package]] name = "base64" @@ -281,69 +236,79 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" +[[package]] +name = "base64" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" + [[package]] name = "bevy" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea147ef1ebb92d41294cfad804c40de151b174c711ce6e0a4a40eba23eae1a4" +checksum = "dae99b246505811f5bc19d2de1e406ec5d2816b421d58fa223779eb576f472c9" dependencies = [ "bevy_internal", ] [[package]] name = "bevy-inspector-egui" -version = "0.13.0" +version = "0.16.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e18f673a7040930e20c899ad5e98d62f5db702a742c9cd96b5862d051a7b5da" +checksum = "5d57e85cf3aed73e4f8e5d06aab17966f0f4adc61c325e4e15878c55c74ed3b5" dependencies = [ - "bevy", "bevy-inspector-egui-derive", + "bevy_app", + "bevy_asset", + "bevy_core", + "bevy_core_pipeline", + "bevy_ecs", "bevy_egui", - "image 0.23.14", + "bevy_hierarchy", + "bevy_log", + "bevy_math", + "bevy_pbr", + "bevy_reflect", + "bevy_render", + "bevy_utils", + "egui", + "image 0.24.5", + "once_cell", "pretty-type-name", + "smallvec", ] [[package]] name = "bevy-inspector-egui-derive" -version = "0.13.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ce0a659fdb2c31c2ae7f2ee8020fa758aff458a4ae4dc4e55bc27dcc31ef487" +checksum = "8927db6cc2e377e3148ab6cc8404c4d4af45ed93bc30acfbcca2404edccde9fb" dependencies = [ "proc-macro2", "quote", "syn", ] -[[package]] -name = "bevy-parallax" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "848290b802a0315343b65eba37dc258194689b5df40fbd808aa2dec75bf812a3" -dependencies = [ - "bevy", - "serde", -] - [[package]] name = "bevy_app" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e4ae0a6ed2adf3b153511b4645241660a93f747c05ecd1e5a909dafc803cad4" +checksum = "536e4d0018347478545ed8b6cb6e57b9279ee984868e81b7c0e78e0fb3222e42" dependencies = [ "bevy_derive", "bevy_ecs", "bevy_reflect", - "bevy_tasks", "bevy_utils", + "downcast-rs", "wasm-bindgen", "web-sys", ] [[package]] name = "bevy_asset" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ec773c861a7e9d9978771f59f385500ec6da3a1ab5487705cddb054393d3d19" +checksum = "6db1bb550168304df69c867c09125e1aae7ff51cf21575396e1598bf293442c4" dependencies = [ "anyhow", "bevy_app", @@ -357,9 +322,9 @@ dependencies = [ "downcast-rs", "fastrand", "js-sys", - "ndk-glue 0.5.2", + "ndk-glue", "notify", - "parking_lot 0.12.1", + "parking_lot", "serde", "thiserror", "wasm-bindgen", @@ -369,9 +334,9 @@ dependencies = [ [[package]] name = "bevy_core" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c53172003d5cde7780870b5403c66c8ede3581faf3e510e916d8b4baa5b538d2" +checksum = "96299aceb3c8362cb4aa39ff81c7ef758a5f4e768d16b5046a91628eff114ac0" dependencies = [ "bevy_app", "bevy_ecs", @@ -380,31 +345,34 @@ dependencies = [ "bevy_tasks", "bevy_utils", "bytemuck", + "serde", ] [[package]] name = "bevy_core_pipeline" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e60efd10d593f6d122f2687f74c09ad55835a8f999c35bed6380ddd8e6ff7f2" +checksum = "dc128a9860aadf16fb343ae427f2768986fd91dce64d945455acda9759c48014" dependencies = [ "bevy_app", "bevy_asset", "bevy_derive", "bevy_ecs", + "bevy_math", "bevy_reflect", "bevy_render", "bevy_transform", "bevy_utils", + "bitflags", "radsort", "serde", ] [[package]] name = "bevy_derive" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e6345431bbe6d7b6c165cd860ecd0b35da929779571259c5df970ac256d45f9" +checksum = "7baf73c58d41c353c6fd08e6764a2e7420c9f19e8227b391c50981db6d0282a6" dependencies = [ "bevy_macro_utils", "quote", @@ -413,11 +381,12 @@ dependencies = [ [[package]] name = "bevy_diagnostic" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58ac9f4c2815f412be4b6e21e4b299cdafa710f651d064f6d40b2a8377a0d17c" +checksum = "63bf96ec7980fa25b77ff6c72dfafada477936c0dab76c1edf6c028c0e5fe0e4" dependencies = [ "bevy_app", + "bevy_core", "bevy_ecs", "bevy_log", "bevy_time", @@ -426,9 +395,9 @@ dependencies = [ [[package]] name = "bevy_ecs" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c174066a24ed8a14d15ea58b0aea1c1f5c763f4bb36ebdc2b1dc78026007d0f5" +checksum = "d4c071d7c6bc9801253485e05d0c257284150de755391902746837ba21c0cf74" dependencies = [ "async-channel", "bevy_ecs_macros", @@ -437,27 +406,18 @@ dependencies = [ "bevy_tasks", "bevy_utils", "downcast-rs", + "event-listener", "fixedbitset", "fxhash", "serde", "thread_local", ] -[[package]] -name = "bevy_ecs_dynamic" -version = "0.1.0" -source = "git+https://github.com/jakobhellermann/bevy_ecs_dynamic?rev=aa7a051a49bd134cfd8c169542e16526bf2b36b3#aa7a051a49bd134cfd8c169542e16526bf2b36b3" -dependencies = [ - "bevy_ecs", - "bevy_reflect", - "fixedbitset", -] - [[package]] name = "bevy_ecs_macros" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc50c39e49e8febccc74e8e731680adb0cb4aef1f53275740cbaa95c6da71f4f" +checksum = "c15bd45438eeb681ad74f2d205bb07a5699f98f9524462a30ec764afab2742ce" dependencies = [ "bevy_macro_utils", "proc-macro2", @@ -465,22 +425,11 @@ dependencies = [ "syn", ] -[[package]] -name = "bevy_ecs_tilemap" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef56c77808aa1fc7379ce538bd9a1e4048794203b4f591f2d06131fc613a1cc" -dependencies = [ - "bevy", - "log", - "regex", -] - [[package]] name = "bevy_egui" -version = "0.16.1" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d365761fd6a5c227b1f88f38b560287334accb69cfe938443e27615464edc897" +checksum = "f93fab81b00d664b7fd09c74eadcc8ab4a608649af1fb355647cd43f95f38ec6" dependencies = [ "arboard", "bevy", @@ -491,9 +440,9 @@ dependencies = [ [[package]] name = "bevy_encase_derive" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68bc194009c5e9b97da64a08142dd183c264885d99c985cf849868103018adf1" +checksum = "962b6bb0d30e92ec2e6c29837acce9e55b920733a634e7c3c5fd5a514bea7a24" dependencies = [ "bevy_macro_utils", "encase_derive_impl", @@ -501,14 +450,15 @@ dependencies = [ [[package]] name = "bevy_fluent" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97073140587e1d731a583695c64b3a4410ba5edf9b3f79aae56ab63d0aab0384" +checksum = "b76fd2fd9c24ecf87bdf6c41bef009825d380c6e260016dac1e6d428d9e0dc69" dependencies = [ "anyhow", "bevy", "fluent", "fluent-langneg", + "fluent_content", "globset", "indexmap", "intl-memoizer", @@ -523,32 +473,19 @@ dependencies = [ [[package]] name = "bevy_framepace" -version = "0.7.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327027bd161a95a03962d03ba4cf71013a8d2500bf288838f6046278806cb383" -dependencies = [ - "bevy", -] - -[[package]] -name = "bevy_ggrs" -version = "0.10.0" -source = "git+https://github.com/zicklag/bevy_ggrs.git?branch=jumpy#306683bbad3ed12e81175879a1ecb020d1873ea1" +checksum = "b5ae983870b93cdc5bc3484dd6928d7c3217e4a31ccbe4dfb0680dc00c06b47f" dependencies = [ "bevy", - "bytemuck", - "ggrs", - "instant", - "log", - "parking_lot 0.12.1", - "tracing", + "wasm_thread", ] [[package]] name = "bevy_gilrs" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb15a3427d9707be92b457e5d66900b02d853b475c21dd8662bdda387ba9f24e" +checksum = "4af552dad82f854b2fae24f36a389fd8ee99d65fe86ae876e854e70d53ff16d9" dependencies = [ "bevy_app", "bevy_ecs", @@ -559,11 +496,14 @@ dependencies = [ [[package]] name = "bevy_hierarchy" -version = "0.8.1" -source = "git+https://github.com/zicklag/bevy.git?branch=dont-error-on-non-mapped-children-entities#0db2b8e67b8cd848fdad2a98bebead4cfce6b336" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8dd6d50c48c6e1bcb5e08a768b765323292bb3bf3a439b992754c57ffb85b23a" dependencies = [ "bevy_app", + "bevy_core", "bevy_ecs", + "bevy_log", "bevy_reflect", "bevy_utils", "smallvec", @@ -571,22 +511,24 @@ dependencies = [ [[package]] name = "bevy_input" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1821c4b760ba6ddb4fe61806e9cc33f40b09a884557aca4553a29b8c7d73c6b4" +checksum = "3378b5171284f4c4c0e8307081718a9fe458f846444616bd82d69110dcabca51" dependencies = [ "bevy_app", "bevy_ecs", "bevy_math", + "bevy_reflect", "bevy_utils", "serde", + "thiserror", ] [[package]] name = "bevy_internal" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee63ad1e3f95a26ff2c227fadb1534a7bfe3a098e0e45c347f2f2575a573d9bc" +checksum = "4c46014b7e885b1311de06b6039e448454a4db55b8d35464798ba88faa186e11" dependencies = [ "bevy_app", "bevy_asset", @@ -604,40 +546,38 @@ dependencies = [ "bevy_ptr", "bevy_reflect", "bevy_render", - "bevy_scene", "bevy_sprite", "bevy_tasks", - "bevy_text", "bevy_time", "bevy_transform", - "bevy_ui", "bevy_utils", "bevy_window", "bevy_winit", - "ndk-glue 0.5.2", + "ndk-glue", ] [[package]] name = "bevy_kira_audio" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0379febb94c497ac6f6b5c0ef27775f7302f65dc780a33dbcec0c743a474b5f4" +checksum = "b310ffe1c870e6ca5f0db228953f68af5a861302ec759edae43450f5835a0ece" dependencies = [ "anyhow", "bevy", "kira", - "parking_lot 0.12.1", + "parking_lot", "thiserror", ] [[package]] name = "bevy_log" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "092daf498887814a064331dfcd1cf487a5ddab01fd38629b84a35b8b664462a1" +checksum = "6c480bac54cf4ae76edc3ae9ae3fa7c5e1b385e7f2111ef5ec3fd00cf3a7998b" dependencies = [ "android_log-sys", "bevy_app", + "bevy_ecs", "bevy_utils", "console_error_panic_hook", "tracing-log", @@ -647,9 +587,9 @@ dependencies = [ [[package]] name = "bevy_macro_utils" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43fb5137e5198302d7c6c33d1e454cf48a586e7c6fd12f4860f12863951e16b9" +checksum = "022bb69196deeea691b6997414af85bbd7f2b34a8914c4aa7a7ff4dfa44f7677" dependencies = [ "quote", "syn", @@ -658,31 +598,33 @@ dependencies = [ [[package]] name = "bevy_math" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "531f2b90c7e861a96f418b3d560131b3354c5e67a67eba3953a45a56ea0114d2" +checksum = "d434c77ab766c806ed9062ef8a7285b3b02b47df51f188d4496199c3ac062eaf" dependencies = [ "glam", + "serde", ] [[package]] name = "bevy_mikktspace" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "941e7d3d4e1dbb735f040e4cdc1558be1d3c38d43f1d9fdbb039c39a7849a00b" +checksum = "bbfb5908d33fd613069be516180b8f138aaaf6e41c36b1fd98c6c29c00c24a13" dependencies = [ "glam", ] [[package]] name = "bevy_pbr" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "176073021a4caeb8b448f24ce790fb57fde74b114f345064a8b102d2f7bed905" +checksum = "310b1f260a475d81445623e138e1b7245759a42310bc1f84b550a3f4ff8763bf" dependencies = [ "bevy_app", "bevy_asset", "bevy_core_pipeline", + "bevy_derive", "bevy_ecs", "bevy_math", "bevy_reflect", @@ -697,9 +639,9 @@ dependencies = [ [[package]] name = "bevy_prototype_lyon" -version = "0.6.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9e44f5ffcbac7114ed9377e6bc875e845c76e5ebb3a5a018169dc37ba5b78d0" +checksum = "0c063aff10ca720d5cadf9cf669800eff2166f6f28cf7f20648ece1c3bdb2442" dependencies = [ "bevy", "lyon_tessellation", @@ -708,16 +650,17 @@ dependencies = [ [[package]] name = "bevy_ptr" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9960c19e582b43cebe1894b6679520a4f50802d1cc5b6fa432f8d685ed232f09" +checksum = "8ec44f7655039546bc5d34d98de877083473f3e9b2b81d560c528d6d74d3eff4" [[package]] name = "bevy_reflect" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fc689dd7a7df3b3768884a4754711d406aa302ea48da483c03b52715fa95045" +checksum = "6deae303a7f69dc243b2fa35b5e193cc920229f448942080c8eb2dbd9de6d37a" dependencies = [ + "bevy_math", "bevy_ptr", "bevy_reflect_derive", "bevy_utils", @@ -725,7 +668,7 @@ dependencies = [ "erased-serde", "glam", "once_cell", - "parking_lot 0.12.1", + "parking_lot", "serde", "smallvec", "thiserror", @@ -733,11 +676,12 @@ dependencies = [ [[package]] name = "bevy_reflect_derive" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c36fa5100832c787c10558d31632ddc454c221e8dfacbbef836938f59614754" +checksum = "a2bf4cb9cd5acb4193f890f36cb63679f1502e2de025e66a63b194b8b133d018" dependencies = [ "bevy_macro_utils", + "bit-set", "proc-macro2", "quote", "syn", @@ -746,9 +690,9 @@ dependencies = [ [[package]] name = "bevy_render" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "600bcef85c7efac6e38ed725707f0e5b7c59b510430034ba2f743f472493f845" +checksum = "2e3282a8f8779d2aced93207fbed73f740937c6c2bd27bd84f0799b081c7fca5" dependencies = [ "anyhow", "bevy_app", @@ -769,7 +713,6 @@ dependencies = [ "bevy_window", "bitflags", "codespan-reporting", - "copyless", "downcast-rs", "encase", "futures-lite", @@ -778,7 +721,7 @@ dependencies = [ "image 0.24.5", "naga", "once_cell", - "parking_lot 0.12.1", + "parking_lot", "regex", "serde", "smallvec", @@ -789,9 +732,9 @@ dependencies = [ [[package]] name = "bevy_render_macros" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1be90adc9e5d5808833e363670818da5fe68ccafd7ca983a457f90957d2a430b" +checksum = "b7acae697776ac05bea523e1725cf2660c91c53abe72c66782ea1e1b9eedb572" dependencies = [ "bevy_macro_utils", "proc-macro2", @@ -800,36 +743,26 @@ dependencies = [ ] [[package]] -name = "bevy_scene" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a045d575d2c8f776d8ea965363c81660243fefbfc3712ead938b00dfd6797216" +name = "bevy_simple_tilemap" +version = "0.10.0" +source = "git+https://github.com/zicklag/bevy_simple_tilemap.git?branch=build/slim-down-bevy-dependencies#d06f17e74bf51091b49b4ccfdb2a64c9000d1509" dependencies = [ - "anyhow", - "bevy_app", - "bevy_asset", - "bevy_derive", - "bevy_ecs", - "bevy_hierarchy", - "bevy_reflect", - "bevy_render", - "bevy_transform", - "bevy_utils", - "ron", - "serde", - "thiserror", - "uuid", + "bevy", + "bitflags", + "bytemuck", + "rayon", ] [[package]] name = "bevy_sprite" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69c419f3db09d7ac1f4d45e0874d349d5d6f47f48bc10d55cd0da36413e2331e" +checksum = "5ec01c7db7f698d95bcb70708527c3ae6bcdc78fc247abe74f935cae8f0a1145" dependencies = [ "bevy_app", "bevy_asset", "bevy_core_pipeline", + "bevy_derive", "bevy_ecs", "bevy_log", "bevy_math", @@ -839,134 +772,73 @@ dependencies = [ "bevy_utils", "bitflags", "bytemuck", - "copyless", "fixedbitset", "guillotiere", "rectangle-pack", - "serde", "thiserror", ] -[[package]] -name = "bevy_system_graph" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01982006dc7d468bc38c6362066299bcffeb742066483b131cd1acc3648ecb5f" -dependencies = [ - "bevy_ecs", - "bevy_utils", -] - [[package]] name = "bevy_tasks" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b753acb3d5b9dbfd77038560fe1893c17d4ee0a4242c2ee70da9d59430537" +checksum = "680b16b53df9c9f24681dd95f4d772d83760bd19adf8bca00f358a3aad997853" dependencies = [ "async-channel", "async-executor", - "event-listener", + "async-task", + "concurrent-queue 1.2.4", "futures-lite", - "num_cpus", "once_cell", "wasm-bindgen-futures", ] -[[package]] -name = "bevy_text" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c265b7515faf55a3b92fd6ce0ab65dd246f247e11d737d6f5cdaf49c2be42c63" -dependencies = [ - "ab_glyph", - "anyhow", - "bevy_app", - "bevy_asset", - "bevy_ecs", - "bevy_math", - "bevy_reflect", - "bevy_render", - "bevy_sprite", - "bevy_transform", - "bevy_utils", - "bevy_window", - "glyph_brush_layout", - "serde", - "thiserror", -] - [[package]] name = "bevy_time" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22830665b8476292b861216383fd79922aef2b540f9fd09d49144e3e5e94550e" +checksum = "1a5c38a6d3ea929c7f81e6adf5a6c62cf7e8c40f5106c2174d6057e9d8ea624d" dependencies = [ "bevy_app", "bevy_ecs", "bevy_reflect", "bevy_utils", "crossbeam-channel", + "serde", ] [[package]] name = "bevy_transform" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4bb8760f03e9667e7499a5ceec1f7630fc3e45702781ac0df56cb969e8ae668" +checksum = "ba13c57a040b89767191a6f6d720a635b7792793628bfa41a9e38b7026484aec" dependencies = [ "bevy_app", "bevy_ecs", "bevy_hierarchy", "bevy_math", "bevy_reflect", + "serde", ] [[package]] name = "bevy_tweening" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "164bcb41708fa1aeb435b6bba6cae61777b9f8cf3e18b207bb6209ca5b970e77" +checksum = "6d38b2abf5518df10c3c32ee57a54b9ba7067f3bd1c137b912e286d573962145" dependencies = [ "bevy", "interpolation", ] -[[package]] -name = "bevy_ui" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "062ce086de1a4a470e5df48cb5c16a1dc97ab610e635cafabdef26c4a1ef5756" -dependencies = [ - "bevy_app", - "bevy_asset", - "bevy_core_pipeline", - "bevy_derive", - "bevy_ecs", - "bevy_hierarchy", - "bevy_input", - "bevy_log", - "bevy_math", - "bevy_reflect", - "bevy_render", - "bevy_sprite", - "bevy_text", - "bevy_transform", - "bevy_utils", - "bevy_window", - "bytemuck", - "serde", - "smallvec", - "taffy", -] - [[package]] name = "bevy_utils" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6e9aa1866c1cf7ee000f281ce9e90d02d701f5c7380a107252017e58e2f5246" +checksum = "16750aae52cd35bd7b60eb61cee883420b250e11b4a290b8d44b2b2941795739" dependencies = [ "ahash 0.7.6", - "getrandom 0.2.8", + "getrandom", "hashbrown", "instant", "tracing", @@ -975,24 +847,25 @@ dependencies = [ [[package]] name = "bevy_window" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707dbbebfac72b1e63e874e7a11a345feab8c440355c0bd71e6dff26709fba9a" +checksum = "0a44d3f3bd54a2261f4f57f614bf7bccc8d2832761493c0cd7dab81d98cc151e" dependencies = [ "bevy_app", "bevy_ecs", "bevy_input", "bevy_math", + "bevy_reflect", "bevy_utils", - "raw-window-handle", - "web-sys", + "raw-window-handle 0.5.0", + "serde", ] [[package]] name = "bevy_winit" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98b15fee4b75472e3441b0c7221467303e4ce59b342a94a328e447e7cdb5a43c" +checksum = "c7b7e647ecd0b3577468da37767dcdd7c26ca9f80da0060b2ec4c77336b6d2e1" dependencies = [ "approx", "bevy_app", @@ -1002,21 +875,12 @@ dependencies = [ "bevy_utils", "bevy_window", "crossbeam-channel", - "raw-window-handle", + "raw-window-handle 0.5.0", "wasm-bindgen", "web-sys", "winit", ] -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - [[package]] name = "bindgen" version = "0.61.0" @@ -1052,28 +916,18 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" -[[package]] -name = "bitfield" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d7e60934ceec538daadb9d8432424ed043a904d8e0243f3c6446bce549a46ac" - -[[package]] -name = "bitfield-rle" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f8acc105b7bd3ed61e4bb7ad3e3b3f2a8da72205b2e0408cf71a499e8f57dd0" -dependencies = [ - "failure", - "varinteger", -] - [[package]] name = "bitflags" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitset-core" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f421f1bcb30aa9d851a03c2920ab5d96ca920d5786645a597b5fc37922f8b89e" + [[package]] name = "block" version = "0.1.6" @@ -1081,42 +935,107 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" [[package]] -name = "blocking" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c67b173a56acffd6d2326fb7ab938ba0b00a71480e14902b2591c87bc5741e8" +name = "bones_asset" +version = "0.1.0" +source = "git+https://github.com/fishfolk/bones#e3d70fa9cf2bb6f1346750dbb7f7b968d4fd8387" dependencies = [ - "async-channel", - "async-lock", - "async-task", - "atomic-waker", - "fastrand", - "futures-lite", + "bevy_asset", + "bones_bevy_utils", + "bones_ecs", + "bones_has_load_progress", + "serde", + "type_ulid", + "ulid", +] + +[[package]] +name = "bones_bevy_asset" +version = "0.1.0" +source = "git+https://github.com/fishfolk/bones#e3d70fa9cf2bb6f1346750dbb7f7b968d4fd8387" +dependencies = [ + "bevy_app", + "bevy_asset", + "bevy_reflect", + "bevy_utils", + "bones_bevy_asset_macros", + "bones_bevy_utils", + "bones_lib", + "glam", + "serde", + "serde_json", + "serde_yaml", + "type_ulid", + "uuid", +] + +[[package]] +name = "bones_bevy_asset_macros" +version = "0.1.0" +source = "git+https://github.com/fishfolk/bones#e3d70fa9cf2bb6f1346750dbb7f7b968d4fd8387" +dependencies = [ + "proc-macro2", + "quote", + "regex", + "syn", + "ulid", ] [[package]] -name = "bones_camera_shake" +name = "bones_bevy_renderer" version = "0.1.0" -source = "git+https://github.com/fishfolk/bones?branch=bevy-0.8#9982c714a4306c5b703a2711e1974a90f296aa69" +source = "git+https://github.com/fishfolk/bones#e3d70fa9cf2bb6f1346750dbb7f7b968d4fd8387" dependencies = [ "bevy", - "noise", + "bevy_simple_tilemap", + "bones_bevy_asset", + "bones_lib", + "glam", + "serde", + "serde_json", + "serde_yaml", + "type_ulid", +] + +[[package]] +name = "bones_bevy_utils" +version = "0.1.0" +source = "git+https://github.com/fishfolk/bones#e3d70fa9cf2bb6f1346750dbb7f7b968d4fd8387" +dependencies = [ + "bevy_ecs", + "type_ulid", +] + +[[package]] +name = "bones_ecs" +version = "0.1.0" +source = "git+https://github.com/fishfolk/bones#e3d70fa9cf2bb6f1346750dbb7f7b968d4fd8387" +dependencies = [ + "aligned-vec", + "anyhow", + "atomic_refcell", + "bevy_derive", + "bitset-core", + "bytemuck", + "either", + "fxhash", + "itertools", + "thiserror", + "type_ulid", ] [[package]] name = "bones_has_load_progress" version = "0.1.0" -source = "git+https://github.com/fishfolk/bones.git#80cc48f29de61dbadf187040decef003f1e70001" +source = "git+https://github.com/fishfolk/bones#e3d70fa9cf2bb6f1346750dbb7f7b968d4fd8387" dependencies = [ "bevy", - "bevy_egui", "bones_has_load_progress_macros", ] [[package]] name = "bones_has_load_progress_macros" version = "0.1.0" -source = "git+https://github.com/fishfolk/bones.git#80cc48f29de61dbadf187040decef003f1e70001" +source = "git+https://github.com/fishfolk/bones#e3d70fa9cf2bb6f1346750dbb7f7b968d4fd8387" dependencies = [ "proc-macro2", "quote", @@ -1124,21 +1043,50 @@ dependencies = [ ] [[package]] -name = "bones_matchmaker_proto" +name = "bones_input" version = "0.1.0" -source = "git+https://github.com/fishfolk/bones.git#80cc48f29de61dbadf187040decef003f1e70001" +source = "git+https://github.com/fishfolk/bones#e3d70fa9cf2bb6f1346750dbb7f7b968d4fd8387" dependencies = [ + "glam", + "type_ulid", +] + +[[package]] +name = "bones_lib" +version = "0.1.0" +source = "git+https://github.com/fishfolk/bones#e3d70fa9cf2bb6f1346750dbb7f7b968d4fd8387" +dependencies = [ + "bones_asset", + "bones_bevy_utils", + "bones_ecs", + "bones_input", + "bones_render", "serde", - "ulid", + "type_ulid", +] + +[[package]] +name = "bones_render" +version = "0.1.0" +source = "git+https://github.com/fishfolk/bones#e3d70fa9cf2bb6f1346750dbb7f7b968d4fd8387" +dependencies = [ + "bevy_transform", + "bones_asset", + "bones_bevy_utils", + "bones_ecs", + "glam", + "serde", + "type_ulid", ] [[package]] name = "bstr" -version = "0.2.17" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" +checksum = "b45ea9b00a7b3f2988e9a65ad3917e62123c38dba709b666506207be96d1790b" dependencies = [ "memchr", + "serde", ] [[package]] @@ -1209,12 +1157,6 @@ dependencies = [ "nom", ] -[[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" @@ -1277,21 +1219,15 @@ dependencies = [ [[package]] name = "clipboard-win" -version = "4.4.2" +version = "4.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4ab1b92798304eedc095b53942963240037c0516452cb11aeba709d420b2219" +checksum = "7191c27c2357d9b7ef96baac1773290d4ca63b24205b82a3fd8a0637afcf0362" dependencies = [ "error-code", "str-buf", "winapi", ] -[[package]] -name = "cobs" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" - [[package]] name = "cocoa" version = "0.24.1" @@ -1301,8 +1237,8 @@ dependencies = [ "bitflags", "block", "cocoa-foundation", - "core-foundation 0.9.3", - "core-graphics 0.22.3", + "core-foundation", + "core-graphics", "foreign-types", "libc", "objc", @@ -1316,7 +1252,7 @@ checksum = "7ade49b65d560ca58c403a479bb396592b155c0185eada742ee323d1d68d6318" dependencies = [ "bitflags", "block", - "core-foundation 0.9.3", + "core-foundation", "core-graphics-types", "foreign-types", "libc", @@ -1349,6 +1285,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "concurrent-queue" +version = "1.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af4780a44ab5696ea9e28294517f1fffb421a83a25af521333c838635509db9c" +dependencies = [ + "cache-padded", +] + [[package]] name = "concurrent-queue" version = "2.0.0" @@ -1364,7 +1309,7 @@ version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "wasm-bindgen", ] @@ -1374,56 +1319,22 @@ version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "58baae561b85ca19b3122a9ddd35c8ec40c3bcd14fe89921824eae73f7baffbf" -[[package]] -name = "copyless" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2df960f5d869b2dd8532793fde43eb5427cceb126c929747a26823ab0eeb536" - -[[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.3", + "core-foundation-sys", "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.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" -[[package]] -name = "core-graphics" -version = "0.19.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3889374e6ea6ab25dba90bb5d96202f61108058361f6dc72e8b03e6f8bbe923" -dependencies = [ - "bitflags", - "core-foundation 0.7.0", - "foreign-types", - "libc", -] - [[package]] name = "core-graphics" version = "0.22.3" @@ -1431,7 +1342,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" dependencies = [ "bitflags", - "core-foundation 0.9.3", + "core-foundation", "core-graphics-types", "foreign-types", "libc", @@ -1444,24 +1355,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3a68b68b3446082644c91ac778bf50cd4104bfb002b5a6a7c44cca5a2c70788b" dependencies = [ "bitflags", - "core-foundation 0.9.3", + "core-foundation", "foreign-types", "libc", ] -[[package]] -name = "core-video-sys" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34ecad23610ad9757664d644e369246edde1803fcb43ed72876565098a5d3828" -dependencies = [ - "cfg-if 0.1.10", - "core-foundation-sys 0.7.0", - "core-graphics 0.19.2", - "libc", - "objc", -] - [[package]] name = "coreaudio-rs" version = "0.10.0" @@ -1483,28 +1381,27 @@ dependencies = [ [[package]] name = "cpal" -version = "0.13.5" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74117836a5124f3629e4b474eed03e479abaf98988b4bb317e29f08cfe0e4116" +checksum = "f342c1b63e185e9953584ff2199726bf53850d96610a310e3aca09e9405a2d0b" dependencies = [ "alsa", - "core-foundation-sys 0.8.3", + "core-foundation-sys", "coreaudio-rs", - "jni", + "jni 0.19.0", "js-sys", - "lazy_static", "libc", "mach", - "ndk 0.6.0", - "ndk-glue 0.6.2", - "nix 0.23.2", + "ndk 0.7.0", + "ndk-context", "oboe", - "parking_lot 0.11.2", + "once_cell", + "parking_lot", "stdweb", "thiserror", "wasm-bindgen", "web-sys", - "winapi", + "windows 0.37.0", ] [[package]] @@ -1513,7 +1410,7 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] @@ -1522,8 +1419,32 @@ version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01a9af1f4c2ef74bb8aa1f7e19706bc72d03598c8a570bb5de72243c7a9d9d5a" +dependencies = [ + "autocfg", + "cfg-if", "crossbeam-utils", + "memoffset 0.7.1", + "scopeguard", ] [[package]] @@ -1532,7 +1453,16 @@ version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", +] + +[[package]] +name = "csscolorparser" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb2a7d3066da2de787b7f032c736763eb7ae5d355f81a68bab2675a96008b0bf" +dependencies = [ + "phf", ] [[package]] @@ -1617,6 +1547,15 @@ dependencies = [ "dirs-sys", ] +[[package]] +name = "dirs" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" +dependencies = [ + "dirs-sys", +] + [[package]] name = "dirs-sys" version = "0.3.7" @@ -1628,6 +1567,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "discard" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" + [[package]] name = "dispatch" version = "0.2.0" @@ -1651,11 +1596,20 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" +[[package]] +name = "ecolor" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b601108bca3af7650440ace4ca55b2daf52c36f2635be3587d77b16efd8d0691" +dependencies = [ + "bytemuck", +] + [[package]] name = "egui" -version = "0.19.0" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc9fcd393c3daaaf5909008a1d948319d538b79c51871e4df0993260260a94e4" +checksum = "65a5e883a316e53866977450eecfbcac9c48109c2ab3394af29feb83fcde4ea9" dependencies = [ "ahash 0.8.2", "epaint", @@ -1664,11 +1618,12 @@ dependencies = [ [[package]] name = "egui_extras" -version = "0.19.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f698f685bb0ad39e87109e2f695ded0bccde77d5d40bbf7590cb5561c1e3039d" +checksum = "1975cd88ff7430f93b29e6b9868b648a8ff6a43b08b9ff8474ee0a648bd8f9a6" dependencies = [ "egui", + "serde", ] [[package]] @@ -1679,18 +1634,18 @@ checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" [[package]] name = "emath" -version = "0.19.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9542a40106fdba943a055f418d1746a050e1a903a049b030c2b097d4686a33cf" +checksum = "5277249c8c3430e7127e4f2c40a77485e7baf11ae132ce9b3253a8ed710df0a0" dependencies = [ "bytemuck", ] [[package]] name = "encase" -version = "0.3.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a516181e9a36e8982cb37933c5e7dba638c42938cacde46ee4e5b4156f881b9" +checksum = "48ec50086547d597b5c871a78399ec04a14828a6a5c445a61ed4687c540edec6" dependencies = [ "const_panic", "encase_derive", @@ -1700,18 +1655,18 @@ dependencies = [ [[package]] name = "encase_derive" -version = "0.3.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5b802412eea315f29f2bb2da3a5963cd6121f56eaa06aebcdc0c54eea578f22" +checksum = "dda93e9714c7683c474f49a461a2ae329471d2bda43c4302d41c6d8339579e92" dependencies = [ "encase_derive_impl", ] [[package]] name = "encase_derive_impl" -version = "0.3.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f2f4de457d974f548d2c2a16f709ebd81013579e543bd1a9b19ced88132c2cf" +checksum = "ec27b639e942eb0297513b81cc6d87c50f6c77dc8c37af00a39ed5db3b9657ee" dependencies = [ "proc-macro2", "quote", @@ -1724,14 +1679,14 @@ version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] name = "env_logger" -version = "0.8.4" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a19187fea3ac7e84da7dacf48de0c45d63c6a76f9490dae389aead16c243fce3" +checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0" dependencies = [ "log", "regex", @@ -1739,17 +1694,18 @@ dependencies = [ [[package]] name = "epaint" -version = "0.19.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ba04741be7f6602b1a1b28f1082cce45948a7032961c52814f8946b28493300" +checksum = "de14b65fe5e423e0058f77a8beb2c863b056d0566d6c4ce0d097aa5814cb705a" dependencies = [ "ab_glyph", "ahash 0.8.2", "atomic_refcell", "bytemuck", + "ecolor", "emath", "nohash-hasher", - "parking_lot 0.12.1", + "parking_lot", ] [[package]] @@ -1807,28 +1763,6 @@ version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" -[[package]] -name = "failure" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86" -dependencies = [ - "backtrace", - "failure_derive", -] - -[[package]] -name = "failure_derive" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "synstructure", -] - [[package]] name = "fastrand" version = "1.8.0" @@ -1844,7 +1778,7 @@ version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4e884668cd0c7480504233e951174ddc3b382f7c2666e3b7310b5c4e7b0c37f9" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "libc", "redox_syscall", "windows-sys 0.42.0", @@ -1866,12 +1800,6 @@ dependencies = [ "miniz_oxide 0.6.2", ] -[[package]] -name = "float-cmp" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75224bec9bfe1a65e2d34132933f2de7fe79900c96a0174307554244ece8150e" - [[package]] name = "float_next_after" version = "0.1.5" @@ -1925,6 +1853,20 @@ dependencies = [ "thiserror", ] +[[package]] +name = "fluent_content" +version = "0.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a582c297515a2fb08cbaa1166498dd18b11ba0e4d7c9cad5b10386a6a2208c8a" +dependencies = [ + "fluent", + "fluent-langneg", + "intl-memoizer", + "thiserror", + "tracing", + "unic-langid", +] + [[package]] name = "fnv" version = "1.0.7" @@ -1964,12 +1906,48 @@ dependencies = [ "libc", ] +[[package]] +name = "futures" +version = "0.3.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38390104763dc37a5145a53c29c63c1290b5d316d6086ec32c293f6736051bb0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ba265a92256105f45b719605a571ffe2d1f0fea3807304b522c1d778f79eed" +dependencies = [ + "futures-core", + "futures-sink", +] + [[package]] name = "futures-core" version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04909a7a7e4633ae6c4a9ab280aeb86da1236243a77b694a49eacd659a4bd3ac" +[[package]] +name = "futures-executor" +version = "0.3.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7acc85df6714c176ab5edf386123fafe217be88c0840ec11f199441134a074e2" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + [[package]] name = "futures-io" version = "0.3.25" @@ -1992,33 +1970,63 @@ dependencies = [ ] [[package]] -name = "fxhash" -version = "0.2.1" +name = "futures-macro" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +checksum = "bdfb8ce053d86b91919aad980c220b1fb8401a9394410e1c289ed7e66b61835d" dependencies = [ - "byteorder", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "gethostname" -version = "0.2.3" +name = "futures-sink" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e" -dependencies = [ - "libc", - "winapi", -] +checksum = "39c15cf1a4aa79df40f1bb462fb39676d0ad9e366c2a33b590d7c66f4f81fcf9" [[package]] -name = "getrandom" -version = "0.1.16" +name = "futures-task" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +checksum = "2ffb393ac5d9a6eaa9d3fdf37ae2776656b706e200c8e16b1bdb227f5198e6ea" + +[[package]] +name = "futures-util" +version = "0.3.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "197676987abd2f9cadff84926f410af1c183608d36641465df73ae8211dc65d6" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "gethostname" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e" dependencies = [ - "cfg-if 1.0.0", "libc", - "wasi 0.9.0+wasi-snapshot-preview1", + "winapi", ] [[package]] @@ -2027,33 +2035,18 @@ version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "js-sys", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", "wasm-bindgen", ] -[[package]] -name = "ggrs" -version = "0.9.2" -source = "git+https://github.com/gschup/ggrs#3d4adea97ed5268d376cc44663e43c3a32359dbe" -dependencies = [ - "bincode", - "bitfield-rle", - "bytemuck", - "instant", - "js-sys", - "parking_lot 0.11.2", - "rand 0.8.5", - "serde", -] - [[package]] name = "gilrs" -version = "0.9.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6ba7c37bf8ea7ba0c3e3795dfa1a7771b1e47c4bb417c4d27c7b338d79685f" +checksum = "7d0342acdc7b591d171212e17c9350ca02383b86d5f9af33c6e3598e03a6c57e" dependencies = [ "fnv", "gilrs-core", @@ -2064,36 +2057,29 @@ dependencies = [ [[package]] name = "gilrs-core" -version = "0.4.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96a8d94a7fc5afd27e894e08a4cfe5a49237f85bcc7140e90721bad3399c7d02" +checksum = "6789d356476c3280a4e15365d23f62b4b4f1bcdac81fdd552f65807bce4666dd" dependencies = [ - "core-foundation 0.9.3", + "core-foundation", "io-kit-sys", "js-sys", "libc", "libudev-sys", "log", - "nix 0.24.3", - "rusty-xinput", + "nix 0.25.1", "uuid", "vec_map", "wasm-bindgen", "web-sys", - "winapi", + "windows 0.43.0", ] -[[package]] -name = "gimli" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dec7af912d60cdbd3677c1af9352ebae6fb8394d165568a2234df0fa00f87793" - [[package]] name = "glam" -version = "0.21.3" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "518faa5064866338b013ff9b2350dc318e14cc4fcd6cb8206d7e7c9886c98815" +checksum = "12f597d56c1bd55a811a1be189459e8fad2bbc272616375602443bdfb37fa774" dependencies = [ "bytemuck", "serde", @@ -2101,15 +2087,15 @@ dependencies = [ [[package]] name = "glob" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "globset" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a1e17342619edbc21a964c2afbeb6c820c6a2560032872f397bb97ea127bd0a" +checksum = "029d74589adefde59de1a0c4f4732695c32805624aec7b68d91503d4dba79afc" dependencies = [ "aho-corasick", "bstr", @@ -2130,17 +2116,6 @@ dependencies = [ "web-sys", ] -[[package]] -name = "glyph_brush_layout" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc32c2334f00ca5ac3695c5009ae35da21da8c62d255b5b96d56e2597a637a38" -dependencies = [ - "ab_glyph", - "approx", - "xi-unicode", -] - [[package]] name = "gpu-alloc" version = "0.5.3" @@ -2190,26 +2165,6 @@ dependencies = [ "svg_fmt", ] -[[package]] -name = "hash32" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" -dependencies = [ - "byteorder", -] - -[[package]] -name = "hash32-derive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59d2aba832b60be25c1b169146b27c64115470981b128ed84c8db18c1b03c6ff" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "hashbrown" version = "0.12.3" @@ -2243,9 +2198,9 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "hexasphere" -version = "7.2.1" +version = "8.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaadafd1beb6ad34cff5521987017ece5848f9ad5401fdb039bff896a643add4" +checksum = "619ce654558681d7d0a7809e1b20249c7032ff13ee6baa7bb7ff64f7f28a906a" dependencies = [ "glam", "once_cell", @@ -2334,19 +2289,13 @@ dependencies = [ "libc", ] -[[package]] -name = "inplace_it" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e567468c50f3d4bc7397702e09b380139f9b9288b4e909b070571007f8b5bf78" - [[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", + "cfg-if", "js-sys", "wasm-bindgen", "web-sys", @@ -2383,15 +2332,15 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7789f7f3c9686f96164f5109d69152de759e76e284f736bd57661c6df5091919" dependencies = [ - "core-foundation-sys 0.8.3", + "core-foundation-sys", "mach", ] [[package]] name = "io-lifetimes" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46112a93252b123d31a119a8d1a1ac19deac4fac6e0e8b0df58f0d4e5870e63c" +checksum = "e7d6c6f8c91b4b9ed43484ad1a938e393caf35960fce7f82a040497207bd8e9e" dependencies = [ "libc", "windows-sys 0.42.0", @@ -2426,9 +2375,9 @@ checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440" [[package]] name = "iyes_loopless" -version = "0.8.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20f42b3a59033b3372129b84850a6d39e02c25f3f170c4f8b84232b775602bb0" +checksum = "c47fd2cbdb1d7f295c25e6bfccfd78a84b6eef3055bc9f01b34ae861721b01ee" dependencies = [ "bevy_app", "bevy_ecs", @@ -2450,6 +2399,20 @@ dependencies = [ "walkdir", ] +[[package]] +name = "jni" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "039022cdf4d7b1cf548d31f60ae783138e5fd42013f6271049d7df7afadef96c" +dependencies = [ + "cesu8", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", +] + [[package]] name = "jni-sys" version = "0.3.0" @@ -2486,59 +2449,63 @@ version = "0.5.1" dependencies = [ "anyhow", "async-channel", - "base64", + "base64 0.21.0", "bevy", "bevy-inspector-egui", - "bevy-parallax", - "bevy_ecs_dynamic", - "bevy_ecs_tilemap", "bevy_egui", "bevy_fluent", "bevy_framepace", - "bevy_ggrs", "bevy_kira_audio", "bevy_prototype_lyon", - "bevy_system_graph", "bevy_tweening", - "bitfield", - "blocking", - "bones_camera_shake", - "bones_has_load_progress", - "bones_matchmaker_proto", + "bones_bevy_asset", + "bones_bevy_renderer", + "bones_lib", "bytemuck", - "bytes", "clap", "directories", "egui_extras", "either", "fluent", + "fluent_content", "fnv", "futures-lite", - "getrandom 0.2.8", + "getrandom", "iyes_loopless", + "jumpy_core", "leafwing-input-manager", "log", "mimalloc", "normalize-path", - "numquant", "once_cell", - "postcard", - "quinn", - "quinn_runtime_bevy", - "rand 0.8.5", - "rustls", + "rand", "serde", "serde_json", "serde_yaml", - "sys-locale", "thiserror", "tracing", - "turborand", + "type_ulid", "unic-langid", "wasm-bindgen", "web-sys", ] +[[package]] +name = "jumpy_core" +version = "0.1.0" +dependencies = [ + "bevy", + "bones_bevy_asset", + "bones_lib", + "bytemuck", + "csscolorparser", + "glam", + "hex", + "serde", + "tracing", + "type_ulid", +] + [[package]] name = "khronos-egl" version = "4.1.0" @@ -2552,9 +2519,9 @@ dependencies = [ [[package]] name = "kira" -version = "0.6.1" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556d90f602ffc4996630769a645035b041786d1b927a17cfbc6a9c3000e62de9" +checksum = "cec4348608a23d372acceb18871ed6be4aa2036f135d48eabffe59258368e1fd" dependencies = [ "atomic-arena", "cpal", @@ -2596,9 +2563,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "leafwing-input-manager" -version = "0.6.1" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32953f440c0c48698cf354a78ccdb4fda4cb6ca1846f326e1280021fa333e158" +checksum = "4cbad9c683a5a2527e8cb3abc57d03af52e22ab9be1cc9b51e780c73e4a244be" dependencies = [ "bevy", "derive_more", @@ -2610,9 +2577,9 @@ dependencies = [ [[package]] name = "leafwing_input_manager_macros" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d98664cb644020e9c60d50c49a4630eb0a44aa15008d859208c538d75a4216b9" +checksum = "5ec3d0a4b25f0e6a66547cc3a1eb98b8477814db58de8035063f3db42353a7de" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -2632,15 +2599,21 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "winapi", ] +[[package]] +name = "libm" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "348108ab3fba42ec82ff6e9564fc4ca0247bdccdc68dd8af9764bbc79c3c8ffb" + [[package]] name = "libmimalloc-sys" -version = "0.1.28" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04d1c67deb83e6b75fa4fe3309e09cfeade12e7721d95322af500d3814ea60c9" +checksum = "dd8c7cbf8b89019683667e347572e6d55a7df7ea36b0c4ce69961b0cde67b174" dependencies = [ "cc", "libc", @@ -2678,37 +2651,39 @@ version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] name = "lyon_geom" -version = "0.17.7" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71d89ccbdafd83d259403e22061be27bccc3254bba65cdc5303250c4227c8c8e" +checksum = "74df1ff0a0147282eb10699537a03baa7d31972b58984a1d44ce0624043fe8ad" dependencies = [ - "arrayvec 0.5.2", + "arrayvec", "euclid", "num-traits", ] [[package]] name = "lyon_path" -version = "0.17.7" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0a59fdf767ca0d887aa61d1b48d4bbf6a124c1a45503593f7d38ab945bfbc0" +checksum = "7da8358c012e5651e4619cfd0b5b75c0f77866181a01b0909aab4bae14adf660" dependencies = [ "lyon_geom", + "num-traits", ] [[package]] name = "lyon_tessellation" -version = "0.17.10" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7230e08dd0638048e46f387f255dbe7a7344a3e6705beab53242b5af25635760" +checksum = "2e48a1d4a9cef1075ebe0afbf16521db6c7942e6563c136fb15676dafc5135d7" dependencies = [ "float_next_after", "lyon_path", + "thiserror", ] [[package]] @@ -2753,6 +2728,15 @@ dependencies = [ "autocfg", ] +[[package]] +name = "memoffset" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +dependencies = [ + "autocfg", +] + [[package]] name = "metal" version = "0.24.0" @@ -2769,9 +2753,9 @@ dependencies = [ [[package]] name = "mimalloc" -version = "0.1.32" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2374e2999959a7b583e1811a1ddbf1d3a4b9496eceb9746f1192a59d871eca" +checksum = "9dcb174b18635f7561a0c6c9fc2ce57218ac7523cf72c50af80e2d79ab8f3ba1" dependencies = [ "libmimalloc-sys", ] @@ -2818,15 +2802,15 @@ checksum = "e5d732bc30207a6423068df043e3d02e0735b155ad7ce1a6f76fe2baa5b158de" dependencies = [ "libc", "log", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", "windows-sys 0.42.0", ] [[package]] name = "naga" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f50357e1167a3ab92d6b3c7f4bf5f7fd13fde3f4b28bf0d5ea07b5100fdb6c0" +checksum = "262d2840e72dbe250e8cf2f522d080988dfca624c4112c096238a4845f591707" dependencies = [ "bit-set", "bitflags", @@ -2846,27 +2830,28 @@ dependencies = [ [[package]] name = "ndk" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d868f654c72e75f8687572699cdabe755f03effbb62542768e995d5b8d699d" +checksum = "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4" dependencies = [ "bitflags", "jni-sys", - "ndk-sys 0.2.2", + "ndk-sys 0.3.0", "num_enum", "thiserror", ] [[package]] name = "ndk" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4" +checksum = "451422b7e4718271c8b5b3aadf5adedba43dc76312454b387e98fae0fc951aa0" dependencies = [ "bitflags", "jni-sys", - "ndk-sys 0.3.0", + "ndk-sys 0.4.1+23.1.7779620", "num_enum", + "raw-window-handle 0.5.0", "thiserror", ] @@ -2878,33 +2863,19 @@ checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" [[package]] name = "ndk-glue" -version = "0.5.2" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c71bee8ea72d685477e28bd004cfe1bf99c754d688cd78cad139eae4089484d4" +checksum = "0434fabdd2c15e0aab768ca31d5b7b333717f03cf02037d5a0a3ff3c278ed67f" dependencies = [ "android_logger", - "lazy_static", "libc", "log", - "ndk 0.5.0", + "ndk 0.7.0", "ndk-context", "ndk-macro", - "ndk-sys 0.2.2", -] - -[[package]] -name = "ndk-glue" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d0c4a7b83860226e6b4183edac21851f05d5a51756e97a1144b7f5a6b63e65f" -dependencies = [ - "lazy_static", - "libc", - "log", - "ndk 0.6.0", - "ndk-context", - "ndk-macro", - "ndk-sys 0.3.0", + "ndk-sys 0.4.1+23.1.7779620", + "once_cell", + "parking_lot", ] [[package]] @@ -2922,15 +2893,18 @@ dependencies = [ [[package]] name = "ndk-sys" -version = "0.2.2" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1bcdd74c20ad5d95aacd60ef9ba40fdf77f767051040541df557b7a9b2a2121" +checksum = "6e5a6ae77c8ee183dcbbba6150e2e6b9f3f4196a7666c02a715a95692ec1fa97" +dependencies = [ + "jni-sys", +] [[package]] name = "ndk-sys" -version = "0.3.0" +version = "0.4.1+23.1.7779620" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e5a6ae77c8ee183dcbbba6150e2e6b9f3f4196a7666c02a715a95692ec1fa97" +checksum = "3cf2aae958bd232cac5069850591667ad422d263686d75b52a065f9badeee5a3" dependencies = [ "jni-sys", ] @@ -2943,9 +2917,9 @@ checksum = "e4916f159ed8e5de0082076562152a76b7a1f64a01fd9d1e0fea002c37624faf" dependencies = [ "bitflags", "cc", - "cfg-if 1.0.0", + "cfg-if", "libc", - "memoffset", + "memoffset 0.6.5", ] [[package]] @@ -2956,19 +2930,20 @@ checksum = "8f3790c00a0150112de0f4cd161e3d7fc4b2d8a5542ffc35f099a2562aecb35c" dependencies = [ "bitflags", "cc", - "cfg-if 1.0.0", + "cfg-if", "libc", - "memoffset", + "memoffset 0.6.5", ] [[package]] name = "nix" -version = "0.24.3" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" +checksum = "f346ff70e7dbfd675fe90590b92d59ef2de15a8779ae305ebcbfd3f0caf59be4" dependencies = [ + "autocfg", "bitflags", - "cfg-if 1.0.0", + "cfg-if", "libc", ] @@ -2978,21 +2953,11 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" -[[package]] -name = "noise" -version = "0.7.0" -source = "git+https://github.com/bsurmanski/noise-rs?rev=5abdde1b819eccc47e74969c15e1b56ae5a055d6#5abdde1b819eccc47e74969c15e1b56ae5a055d6" -dependencies = [ - "num-traits", - "rand 0.7.3", - "rand_xorshift", -] - [[package]] name = "nom" -version = "7.1.1" +version = "7.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" +checksum = "e5507769c4919c998e69e49c839d9dc6e693ede4cc4290d6ad8b41d4f09c548c" dependencies = [ "memchr", "minimal-lexical", @@ -3006,9 +2971,9 @@ checksum = "cf22e319b2e3cb517350572e3b70c6822e0a520abfb5c78f690e829a73e8d9f2" [[package]] name = "notify" -version = "5.0.0-pre.15" +version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "553f9844ad0b0824605c20fb55a661679782680410abfb1a8144c2e7e437e7a7" +checksum = "ed2c66da08abae1c024c01d635253e402341b4060a12e99b31c7594063bf490a" dependencies = [ "bitflags", "crossbeam-channel", @@ -3093,6 +3058,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ "autocfg", + "libm", ] [[package]] @@ -3126,12 +3092,6 @@ dependencies = [ "syn", ] -[[package]] -name = "numquant" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54809e43d79aa532432c0d03c6adf62fdd96f2e152b90cef6cd9a316c3da4d99" - [[package]] name = "objc" version = "0.2.7" @@ -3171,22 +3131,13 @@ dependencies = [ "objc", ] -[[package]] -name = "object" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "239da7f290cfa979f43f85a8efeee9a8a76d0827c356d37f9d3d7254d6b537fb" -dependencies = [ - "memchr", -] - [[package]] name = "oboe" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "27f63c358b4fa0fbcfefd7c8be5cfc39c08ce2389f5325687e7762a48d30a5c1" dependencies = [ - "jni", + "jni 0.19.0", "ndk 0.6.0", "ndk-context", "num-derive", @@ -3205,15 +3156,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860" - -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +checksum = "6f61fba1741ea2b3d6a1e3178721804bb716a68a6aeba1149b5d52e3d464ea66" [[package]] name = "os_str_bytes" @@ -3229,9 +3174,9 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "owned_ttf_parser" -version = "0.17.1" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18904d3c65493a9f0d7542293d1a7f69bfdc309a6b9ef4f46dc3e58b0577edc5" +checksum = "2a5f3c7ca08b6879e7965fb25e24d1f5eeb32ea73f9ad99b3854778a38c57e93" dependencies = [ "ttf-parser", ] @@ -3242,17 +3187,6 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" -[[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" @@ -3260,30 +3194,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ "lock_api", - "parking_lot_core 0.9.5", -] - -[[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", - "smallvec", - "winapi", + "parking_lot_core", ] [[package]] name = "parking_lot_core" -version = "0.9.5" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ff9f3fef3968a3ec5945535ed654cb38ff72d7495a25619e2247fb15a2ed9ba" +checksum = "ba1ef8814b5c993410bb3adfad7a5ed269563e4a2f90c41f5d85be7fb47133bf" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "libc", "redox_syscall", "smallvec", @@ -3322,31 +3242,59 @@ dependencies = [ ] [[package]] -name = "pin-project" -version = "1.0.12" +name = "phf" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" +checksum = "928c6535de93548188ef63bb7c4036bd415cd8f36ad25af44b9789b2ee72a48c" dependencies = [ - "pin-project-internal", + "phf_macros", + "phf_shared", ] [[package]] -name = "pin-project-internal" -version = "1.0.12" +name = "phf_generator" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" +checksum = "b1181c94580fa345f50f19d738aaa39c0ed30a600d95cb2d3e23f94266f14fbf" dependencies = [ + "phf_shared", + "rand", +] + +[[package]] +name = "phf_macros" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92aacdc5f16768709a569e913f7451034034178b05bdc8acda226659a3dccc66" +dependencies = [ + "phf_generator", + "phf_shared", "proc-macro2", "quote", "syn", ] +[[package]] +name = "phf_shared" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1fb5f6f826b772a8d4c0394209441e7d37cbbb967ae9c7e0e8134365c9ee676" +dependencies = [ + "siphasher", +] + [[package]] name = "pin-project-lite" version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + [[package]] name = "pkg-config" version = "0.3.26" @@ -3377,30 +3325,6 @@ dependencies = [ "miniz_oxide 0.6.2", ] -[[package]] -name = "polling" -version = "2.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22122d5ec4f9fe1b3916419b76be1e80bcb93f618d071d2edf841b137b2a2bd6" -dependencies = [ - "autocfg", - "cfg-if 1.0.0", - "libc", - "log", - "wepoll-ffi", - "windows-sys 0.42.0", -] - -[[package]] -name = "postcard" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c2b180dc0bade59f03fd005cb967d3f1e5f69b13922dad0cd6e047cb8af2363" -dependencies = [ - "cobs", - "serde", -] - [[package]] name = "pp-rs" version = "0.2.1" @@ -3472,72 +3396,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74605f360ce573babfe43964cbe520294dcb081afbf8c108fc6e23036b4da2df" -[[package]] -name = "quinn" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445cbfe2382fa023c4f2f3c7e1c95c03dcc1df2bf23cebcb2b13e1402c4394d1" -dependencies = [ - "bytes", - "futures-io", - "pin-project-lite", - "quinn-proto", - "quinn-udp", - "rustc-hash", - "rustls", - "thiserror", - "tokio", - "tracing", - "webpki", -] - -[[package]] -name = "quinn-proto" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72ef4ced82a24bb281af338b9e8f94429b6eca01b4e66d899f40031f074e74c9" -dependencies = [ - "bytes", - "rand 0.8.5", - "ring", - "rustc-hash", - "rustls", - "rustls-native-certs", - "slab", - "thiserror", - "tinyvec", - "tracing", - "webpki", -] - -[[package]] -name = "quinn-udp" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "641538578b21f5e5c8ea733b736895576d0fe329bb883b937db6f4d163dbaaf4" -dependencies = [ - "libc", - "quinn-proto", - "socket2", - "tracing", - "windows-sys 0.42.0", -] - -[[package]] -name = "quinn_runtime_bevy" -version = "0.1.0" -source = "git+https://github.com/fishfolk/bones.git#80cc48f29de61dbadf187040decef003f1e70001" -dependencies = [ - "async-executor", - "async-io", - "bevy_tasks", - "futures-lite", - "pin-project", - "quinn", - "quinn-proto", - "quinn-udp", -] - [[package]] name = "quote" version = "1.0.23" @@ -3553,19 +3411,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17fd96390ed3feda12e1dfe2645ed587e0bea749e319333f104a33ff62f77a0b" -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc", -] - [[package]] name = "rand" version = "0.8.5" @@ -3573,18 +3418,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", + "rand_chacha", + "rand_core", ] [[package]] @@ -3594,58 +3429,62 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core 0.6.4", + "rand_core", ] [[package]] name = "rand_core" -version = "0.5.1" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.1.16", + "getrandom", ] [[package]] -name = "rand_core" -version = "0.6.4" +name = "range-alloc" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.8", -] +checksum = "63e935c45e09cc6dcf00d2f0b2d630a58f4095320223d47fc68918722f0538b6" [[package]] -name = "rand_hc" -version = "0.2.0" +name = "raw-window-handle" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +checksum = "b800beb9b6e7d2df1fe337c9e3d04e3af22a124460fb4c30fcc22c9117cefb41" dependencies = [ - "rand_core 0.5.1", + "cty", ] [[package]] -name = "rand_xorshift" -version = "0.2.0" +name = "raw-window-handle" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77d416b86801d23dde1aa643023b775c3a462efc0ed96443add11546cdf1dca8" +checksum = "ed7e3d950b66e19e0c372f3fa3fbbcf85b1746b571f74e0c2af6042a5c93420a" dependencies = [ - "rand_core 0.5.1", + "cty", ] [[package]] -name = "range-alloc" -version = "0.1.2" +name = "rayon" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63e935c45e09cc6dcf00d2f0b2d630a58f4095320223d47fc68918722f0538b6" +checksum = "6db3a213adf02b3bcfd2d3846bb41cb22857d131789e01df434fb7e7bc0759b7" +dependencies = [ + "either", + "rayon-core", +] [[package]] -name = "raw-window-handle" -version = "0.4.3" +name = "rayon-core" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b800beb9b6e7d2df1fe337c9e3d04e3af22a124460fb4c30fcc22c9117cefb41" +checksum = "cac410af5d00ab6884528b4ab69d1e8e146e8d471201800fa1b4524126de6ad3" dependencies = [ - "cty", + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-utils", + "num_cpus", ] [[package]] @@ -3669,16 +3508,16 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" dependencies = [ - "getrandom 0.2.8", + "getrandom", "redox_syscall", "thiserror", ] [[package]] name = "regex" -version = "1.7.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a" +checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733" dependencies = [ "aho-corasick", "memchr", @@ -3706,109 +3545,53 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1382d1f0a252c4bf97dc20d979a2fdd05b024acd7c2ed0f7595d7817666a157" -[[package]] -name = "ring" -version = "0.16.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" -dependencies = [ - "cc", - "libc", - "once_cell", - "spin", - "untrusted", - "web-sys", - "winapi", -] - [[package]] name = "ringbuf" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f65af18d50f789e74aaf23bbb3f65dcd22a3cb6e029b5bced149f6bd57c5c2a2" -dependencies = [ - "cache-padded", -] - -[[package]] -name = "ron" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88073939a61e5b7680558e6be56b419e208420c2adb92be54921fa6b72283f1a" -dependencies = [ - "base64", - "bitflags", - "serde", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustix" -version = "0.36.5" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3807b5d10909833d3e9acd1eb5fb988f79376ff10fce42937de71a449c4c588" +checksum = "89e68dd9c1d8f7bb0c664e1556b1521809bc6fa62d92bb3b813adf8611caa0eb" dependencies = [ - "bitflags", - "errno", - "io-lifetimes", - "libc", - "linux-raw-sys", - "windows-sys 0.42.0", + "crossbeam-utils", ] [[package]] -name = "rustls" -version = "0.20.7" +name = "ron" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "539a2bfe908f471bfa933876bd1eb6a19cf2176d375f82ef7f99530a40e48c2c" +checksum = "300a51053b1cb55c80b7a9fde4120726ddf25ca241a1cbb926626f62fb136bff" dependencies = [ - "log", - "ring", - "sct", - "webpki", + "base64 0.13.1", + "bitflags", + "serde", ] [[package]] -name = "rustls-native-certs" -version = "0.6.2" +name = "rustc-hash" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0167bac7a9f490495f3c33013e7722b53cb087ecbe082fb0c6387c96f634ea50" -dependencies = [ - "openssl-probe", - "rustls-pemfile", - "schannel", - "security-framework", -] +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] -name = "rustls-pemfile" -version = "1.0.1" +name = "rustc_version" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0864aeff53f8c05aa08d86e5ef839d3dfcf07aeba2db32f12db0ef716e87bd55" +checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" dependencies = [ - "base64", + "semver", ] [[package]] -name = "rusty-xinput" -version = "1.2.0" +name = "rustix" +version = "0.36.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2aa654bc32eb9ca14cce1a084abc9dfe43949a4547c35269a094c39272db3bb" +checksum = "4feacf7db682c6c329c4ede12649cd36ecab0f3be5b7d74e6a20304725db4549" dependencies = [ - "lazy_static", - "log", - "winapi", + "bitflags", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "windows-sys 0.42.0", ] [[package]] @@ -3826,16 +3609,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "schannel" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2" -dependencies = [ - "lazy_static", - "windows-sys 0.36.1", -] - [[package]] name = "scopeguard" version = "1.1.0" @@ -3843,58 +3616,40 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] -name = "sct" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "security-framework" -version = "2.7.0" +name = "self_cell" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bc1bb97804af6631813c55739f771071e0f2ed33ee20b68c86ec505d906356c" -dependencies = [ - "bitflags", - "core-foundation 0.9.3", - "core-foundation-sys 0.8.3", - "libc", - "security-framework-sys", -] +checksum = "1ef965a420fe14fdac7dd018862966a4c14094f900e1650bbc71ddd7d580c8af" [[package]] -name = "security-framework-sys" -version = "2.6.1" +name = "semver" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" +checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" dependencies = [ - "core-foundation-sys 0.8.3", - "libc", + "semver-parser", ] [[package]] -name = "self_cell" -version = "0.10.2" +name = "semver-parser" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ef965a420fe14fdac7dd018862966a4c14094f900e1650bbc71ddd7d580c8af" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.151" +version = "1.0.152" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fed41fc1a24994d044e6db6935e69511a1153b52c15eb42493b26fa87feba0" +checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.151" +version = "1.0.152" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "255abe9a125a985c05190d687b320c12f9b1f0b99445e608c21ba0782c719ad8" +checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e" dependencies = [ "proc-macro2", "quote", @@ -3925,6 +3680,15 @@ dependencies = [ "unsafe-libyaml", ] +[[package]] +name = "sha1" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1da05c97445caa12d05e848c4a4fcbbea29e748ac28f7e80e9b010392063770" +dependencies = [ + "sha1_smol", +] + [[package]] name = "sha1_smol" version = "1.0.0" @@ -3948,9 +3712,9 @@ checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" [[package]] name = "siphasher" -version = "0.2.3" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b8de496cf83d4ed58b6be86c3a275b8602f6ffe98d3024a869e124147a9a3ac" +checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" [[package]] name = "slab" @@ -3980,36 +3744,69 @@ dependencies = [ ] [[package]] -name = "socket2" -version = "0.4.7" +name = "spirv" +version = "0.2.0+1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" +checksum = "246bfa38fe3db3f1dfc8ca5a2cdeb7348c78be2112740cc0ec8ef18b6d94f830" dependencies = [ - "libc", - "winapi", + "bitflags", + "num-traits", ] [[package]] -name = "spin" -version = "0.5.2" +name = "static_assertions" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] -name = "spirv" -version = "0.2.0+1.5.4" +name = "stdweb" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "246bfa38fe3db3f1dfc8ca5a2cdeb7348c78be2112740cc0ec8ef18b6d94f830" +checksum = "d022496b16281348b52d0e30ae99e01a73d737b2f45d38fed4edf79f9325a1d5" dependencies = [ - "bitflags", - "num-traits", + "discard", + "rustc_version", + "stdweb-derive", + "stdweb-internal-macros", + "stdweb-internal-runtime", + "wasm-bindgen", ] [[package]] -name = "stdweb" -version = "0.1.3" +name = "stdweb-derive" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c87a60a40fccc84bef0652345bbbbbe20a605bf5d0ce81719fc476f5c03b50ef" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "serde_derive", + "syn", +] + +[[package]] +name = "stdweb-internal-macros" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58fa5ff6ad0d98d1ffa8cb115892b6e69d67799f6763e162a1c9db421dc22e11" +dependencies = [ + "base-x", + "proc-macro2", + "quote", + "serde", + "serde_derive", + "serde_json", + "sha1", + "syn", +] + +[[package]] +name = "stdweb-internal-runtime" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef5430c8e36b713e13b48a9f709cc21e046723fe44ce34587b73a830203b533e" +checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0" [[package]] name = "str-buf" @@ -4031,11 +3828,10 @@ checksum = "8fb1df15f412ee2e9dfc1c504260fa695c1c3f10fe9f4a6ee2d2184d7d6450e2" [[package]] name = "svgtypes" -version = "0.5.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c536faaff1a10837cfe373142583f6e27d81e96beba339147e77b67c9f260ff" +checksum = "22975e8a2bac6a76bb54f898a6b18764633b00e780330f0b689f65afb3975564" dependencies = [ - "float-cmp", "siphasher", ] @@ -4069,7 +3865,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "199a6417cd4115bac79289b64b859358ea050b7add0ceb364dc991f628c5b347" dependencies = [ - "arrayvec 0.7.2", + "arrayvec", "bitflags", "bytemuck", "lazy_static", @@ -4121,44 +3917,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "synstructure" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "unicode-xid", -] - -[[package]] -name = "sys-locale" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3358acbb4acd4146138b9bda219e904a6bb5aaaa237f8eed06f4d6bc1580ecee" -dependencies = [ - "js-sys", - "libc", - "wasm-bindgen", - "web-sys", - "winapi", -] - -[[package]] -name = "taffy" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec27dea659b100d489dffa57cf0efc6d7bfefb119af817b92cc14006c0b214e3" -dependencies = [ - "arrayvec 0.7.2", - "hash32", - "hash32-derive", - "num-traits", - "typenum", -] - [[package]] name = "termcolor" version = "1.1.3" @@ -4232,17 +3990,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" -[[package]] -name = "tokio" -version = "1.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eab6d665857cc6ca78d6e80303a02cea7a7851e85dfbd77cbdc09bd129f1ef46" -dependencies = [ - "autocfg", - "pin-project-lite", - "windows-sys 0.42.0", -] - [[package]] name = "toml" version = "0.5.10" @@ -4258,7 +4005,7 @@ version = "0.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -4327,20 +4074,9 @@ dependencies = [ [[package]] name = "ttf-parser" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "375812fa44dab6df41c195cd2f7fecb488f6c09fbaafb62807488cefab642bff" - -[[package]] -name = "turborand" -version = "0.8.3" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c966547fb89f2d5bd1736e5caf8a9b1e5473d34e1246799274eaabcac1b8fbe" -dependencies = [ - "getrandom 0.2.8", - "instant", - "serde", -] +checksum = "0609f771ad9c6155384897e1df4d948e692667cc0588548b68eb44d052b27633" [[package]] name = "type-map" @@ -4352,10 +4088,24 @@ dependencies = [ ] [[package]] -name = "typenum" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +name = "type_ulid" +version = "0.1.0" +source = "git+https://github.com/fishfolk/bones#e3d70fa9cf2bb6f1346750dbb7f7b968d4fd8387" +dependencies = [ + "type_ulid_macros", + "ulid", +] + +[[package]] +name = "type_ulid_macros" +version = "0.1.0" +source = "git+https://github.com/fishfolk/bones#e3d70fa9cf2bb6f1346750dbb7f7b968d4fd8387" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "ulid", +] [[package]] name = "ulid" @@ -4363,8 +4113,7 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13a3aaa69b04e5b66cc27309710a569ea23593612387d67daaf102e73aa974fd" dependencies = [ - "rand 0.8.5", - "serde", + "rand", ] [[package]] @@ -4425,12 +4174,6 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc7ed8ba44ca06be78ea1ad2c3682a43349126c8818054231ee6f4748012aed2" -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - [[package]] name = "url" version = "2.3.1" @@ -4448,7 +4191,7 @@ version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "422ee0de9031b5b948b97a8fc04e3aa35230001a722ddd27943e0be31564ce4c" dependencies = [ - "getrandom 0.2.8", + "getrandom", "serde", "sha1_smol", ] @@ -4459,12 +4202,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" -[[package]] -name = "varinteger" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ea29db9f94ff08bb619656b8120878f280526f71dc88b5262c958a510181812" - [[package]] name = "vec_map" version = "0.8.2" @@ -4494,12 +4231,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -4512,7 +4243,7 @@ version = "0.2.83" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "wasm-bindgen-macro", ] @@ -4537,7 +4268,7 @@ version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23639446165ca5a5de86ae1d8896b737ae80319560fbaa4c2887b7da6e7ebd7d" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "js-sys", "wasm-bindgen", "web-sys", @@ -4572,6 +4303,19 @@ version = "0.2.83" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" +[[package]] +name = "wasm_thread" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a52fc987e67957cab58160d1ea273a2886972ef6f59c7fa0c02e9fe2c8e11706" +dependencies = [ + "async-channel", + "futures", + "js-sys", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "web-sys" version = "0.3.60" @@ -4584,26 +4328,20 @@ dependencies = [ [[package]] name = "webbrowser" -version = "0.7.1" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc6a3cffdb686fbb24d9fb8f03a213803277ed2300f11026a3afe1f108dc021b" +checksum = "e74f5ff7786c4c21f61ba8e30ea29c9745f06fca0a4a02d083b3c662583399e8" dependencies = [ - "jni", - "ndk-glue 0.6.2", + "core-foundation", + "dirs", + "jni 0.20.0", + "log", + "ndk-context", + "objc", + "raw-window-handle 0.5.0", "url", "web-sys", - "widestring", - "winapi", -] - -[[package]] -name = "webpki" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" -dependencies = [ - "ring", - "untrusted", + "windows 0.43.0", ] [[package]] @@ -4612,28 +4350,20 @@ version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb" -[[package]] -name = "wepoll-ffi" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d743fdedc5c64377b5fc2bc036b01c7fd642205a0d96356034ae3404d49eb7fb" -dependencies = [ - "cc", -] - [[package]] name = "wgpu" -version = "0.13.1" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "277e967bf8b7820a76852645a6bce8bbd31c32fda2042e82d8e3ea75fda8892d" +checksum = "81f643110d228fd62a60c5ed2ab56c4d5b3704520bd50561174ec4ec74932937" dependencies = [ - "arrayvec 0.7.2", + "arrayvec", "js-sys", "log", "naga", - "parking_lot 0.12.1", - "raw-window-handle", + "parking_lot", + "raw-window-handle 0.5.0", "smallvec", + "static_assertions", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -4644,22 +4374,21 @@ dependencies = [ [[package]] name = "wgpu-core" -version = "0.13.2" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b92788dec9d0c1bed849a1b83f01b2ee12819bf04a79c90f68e4173f7b5ba2" +checksum = "6000d1284ef8eec6076fd5544a73125fd7eb9b635f18dceeb829d826f41724ca" dependencies = [ - "arrayvec 0.7.2", + "arrayvec", "bit-vec", "bitflags", "cfg_aliases", "codespan-reporting", - "copyless", "fxhash", "log", "naga", - "parking_lot 0.12.1", + "parking_lot", "profiling", - "raw-window-handle", + "raw-window-handle 0.5.0", "smallvec", "thiserror", "web-sys", @@ -4669,12 +4398,12 @@ dependencies = [ [[package]] name = "wgpu-hal" -version = "0.13.2" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20cbdfc3d0637dba3d5536b93adef3d26023a0b96f0e1ee5ee9560a401d9f646" +checksum = "3cc320a61acb26be4f549c9b1b53405c10a223fbfea363ec39474c32c348d12f" dependencies = [ "android_system_properties", - "arrayvec 0.7.2", + "arrayvec", "ash", "bit-set", "bitflags", @@ -4686,7 +4415,6 @@ dependencies = [ "glow", "gpu-alloc", "gpu-descriptor", - "inplace_it", "js-sys", "khronos-egl", "libloading", @@ -4694,11 +4422,12 @@ dependencies = [ "metal", "naga", "objc", - "parking_lot 0.12.1", + "parking_lot", "profiling", "range-alloc", - "raw-window-handle", + "raw-window-handle 0.5.0", "renderdoc-sys", + "smallvec", "thiserror", "wasm-bindgen", "web-sys", @@ -4708,19 +4437,13 @@ dependencies = [ [[package]] name = "wgpu-types" -version = "0.13.2" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f762cbc08e1a51389859cf9c199c7aef544789cf3510889aab12c607f701604" +checksum = "fb6b28ef22cac17b9109b25b3bf8c9a103eeb293d7c5f78653979b09140375f6" dependencies = [ "bitflags", ] -[[package]] -name = "widestring" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17882f045410753661207383517a6f62ec3dbeb6a4ed2acce01f0728238d1983" - [[package]] name = "winapi" version = "0.3.9" @@ -4761,6 +4484,34 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57b543186b344cc61c85b5aab0d2e3adf4e0f99bc076eff9aa5927bcc0b8a647" +dependencies = [ + "windows_aarch64_msvc 0.37.0", + "windows_i686_gnu 0.37.0", + "windows_i686_msvc 0.37.0", + "windows_x86_64_gnu 0.37.0", + "windows_x86_64_msvc 0.37.0", +] + +[[package]] +name = "windows" +version = "0.43.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04662ed0e3e5630dfa9b26e4cb823b817f1a9addda855d973a9458c236556244" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc 0.42.1", + "windows_i686_gnu 0.42.1", + "windows_i686_msvc 0.42.1", + "windows_x86_64_gnu 0.42.1", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc 0.42.1", +] + [[package]] name = "windows-sys" version = "0.36.1" @@ -4781,19 +4532,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" dependencies = [ "windows_aarch64_gnullvm", - "windows_aarch64_msvc 0.42.0", - "windows_i686_gnu 0.42.0", - "windows_i686_msvc 0.42.0", - "windows_x86_64_gnu 0.42.0", + "windows_aarch64_msvc 0.42.1", + "windows_i686_gnu 0.42.1", + "windows_i686_msvc 0.42.1", + "windows_x86_64_gnu 0.42.1", "windows_x86_64_gnullvm", - "windows_x86_64_msvc 0.42.0", + "windows_x86_64_msvc 0.42.1", ] [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.0" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e" +checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" [[package]] name = "windows_aarch64_msvc" @@ -4803,9 +4554,15 @@ checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" [[package]] name = "windows_aarch64_msvc" -version = "0.42.0" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2623277cb2d1c216ba3b578c0f3cf9cdebeddb6e66b1b218bb33596ea7769c3a" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4" +checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" [[package]] name = "windows_i686_gnu" @@ -4815,9 +4572,15 @@ checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" [[package]] name = "windows_i686_gnu" -version = "0.42.0" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3925fd0b0b804730d44d4b6278c50f9699703ec49bcd628020f46f4ba07d9e1" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7" +checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" [[package]] name = "windows_i686_msvc" @@ -4827,9 +4590,15 @@ checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" [[package]] name = "windows_i686_msvc" -version = "0.42.0" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce907ac74fe331b524c1298683efbf598bb031bc84d5e274db2083696d07c57c" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246" +checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" [[package]] name = "windows_x86_64_gnu" @@ -4839,15 +4608,21 @@ checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" [[package]] name = "windows_x86_64_gnu" -version = "0.42.0" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2babfba0828f2e6b32457d5341427dcbb577ceef556273229959ac23a10af33d" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed" +checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.0" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028" +checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" [[package]] name = "windows_x86_64_msvc" @@ -4857,37 +4632,42 @@ checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" [[package]] name = "windows_x86_64_msvc" -version = "0.42.0" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4dd6dc7df2d84cf7b33822ed5b86318fb1781948e9663bacd047fc9dd52259d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5" +checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" [[package]] name = "winit" -version = "0.26.1" +version = "0.27.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b43cc931d58b99461188607efd7acb2a093e65fc621f54cad78517a6063e73a" +checksum = "bb796d6fbd86b2fd896c9471e6f04d39d750076ebe5680a3958f00f5ab97657c" dependencies = [ "bitflags", "cocoa", - "core-foundation 0.9.3", - "core-graphics 0.22.3", - "core-video-sys", + "core-foundation", + "core-graphics", "dispatch", "instant", - "lazy_static", "libc", "log", "mio", - "ndk 0.5.0", - "ndk-glue 0.5.2", - "ndk-sys 0.2.2", + "ndk 0.7.0", + "ndk-glue", "objc", - "parking_lot 0.11.2", + "once_cell", + "parking_lot", "percent-encoding", - "raw-window-handle", + "raw-window-handle 0.4.3", + "raw-window-handle 0.5.0", "wasm-bindgen", "web-sys", - "winapi", + "windows-sys 0.36.1", "x11-dl", ] @@ -4913,9 +4693,3 @@ dependencies = [ "winapi", "winapi-wsapoll", ] - -[[package]] -name = "xi-unicode" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a67300977d3dc3f8034dae89778f502b6ba20b269527b3223ba59c0cf393bb8a" diff --git a/Cargo.toml b/Cargo.toml index e17b3129aa..2187765206 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,12 @@ license = "MIT OR Apache-2.0" edition = "2021" default-run = "jumpy" +[workspace] +members = [ + ".", + "core", +] + [features] default = ["render"] render = [ @@ -17,58 +23,47 @@ render = [ ] [dependencies] + anyhow = "1.0.58" async-channel = "1.7.1" -base64 = "0.13.0" -bevy-inspector-egui = { version = "0.13.0" } -bevy-parallax = "0.2.0" -bevy_ecs_dynamic = { git = "https://github.com/jakobhellermann/bevy_ecs_dynamic", rev = "aa7a051a49bd134cfd8c169542e16526bf2b36b3" } -bevy_ecs_tilemap = { version = "0.7.0", features = ["atlas"] } -bevy_egui = "0.16.1" -bevy_fluent = "0.4.0" -bevy_framepace = "0.7" -bevy_ggrs = { git = "https://github.com/zicklag/bevy_ggrs.git", branch = "jumpy" } -bevy_kira_audio = { version = "0.12.0", features = ["ogg"], default-features = false } -# bevy_mod_js_scripting = { git = "https://github.com/zicklag/bevy_mod_js_scripting.git", branch = "jumpy" } -bevy_prototype_lyon = "0.6.0" -bevy_system_graph = "0.3.0" -bevy_tweening = { version = "0.5", default-features = false } -bitfield = "0.14.0" -blocking = "1.2.0" -bones_has_load_progress = { git = "https://github.com/fishfolk/bones.git", features = ["bevy_egui"] } -bones_matchmaker_proto = { git = "https://github.com/fishfolk/bones.git" } -bones_camera_shake = { git = "https://github.com/fishfolk/bones", branch = "bevy-0.8" } +base64 = "0.21.0" +bevy-inspector-egui = { version = "0.16.0" } +bevy_egui = "0.18.0" +bevy_fluent = "0.5.0" +bevy_framepace = "0.9.1" +bevy_kira_audio = { version = "0.13.0", features = ["ogg"], default-features = false } +bevy_prototype_lyon = "0.7.2" +bevy_tweening = { version = "0.6.0", default-features = false } +bones_bevy_asset = { git = "https://github.com/fishfolk/bones" } +bones_bevy_renderer = { git = "https://github.com/fishfolk/bones" } +bones_lib = { git = "https://github.com/fishfolk/bones", features = ["bevy"] } bytemuck = "1.12.3" -bytes = "1.2.1" clap = { version = "4.0.18", features = ["derive", "env"] } directories = "4.0.1" -egui_extras = "0.19.0" +egui_extras = "0.20.0" either = "1.8.0" fluent = "0.16.0" +fluent_content = "0.0.3" fnv = "1.0.7" futures-lite = "1.12.0" getrandom = { version = "0.2", features = ["js"] } -iyes_loopless = "0.8.0" -leafwing-input-manager = { version = "0.6.1", default-features = false } +iyes_loopless = "0.9.1" +jumpy_core = { path = "./core" } +leafwing-input-manager = { version = "0.7.1", default-features = false } log = { version = "0.4.17", features = ["release_max_level_debug"] } -mimalloc = { version = "0.1.32", default-features = false } normalize-path = "0.2.0" -numquant = "0.2.0" -once_cell = "1.13.0" -postcard = { version = "1.0.2", default-features = false, features = ["alloc", "use-std"] } +once_cell = "1.17.0" rand = "0.8.5" -rustls = { version = "0.20.7", features = ["dangerous_configuration", "quic"] } serde = { version = "1.0.137", features = ["derive"] } serde_json = "1.0.89" serde_yaml = "0.9.2" -sys-locale = "0.2.1" thiserror = "1.0.31" tracing = { version = "0.1.37", features = ["release_max_level_debug"] } -turborand = { version = "0.8.0", features = ["atomic", "serialize"] } +type_ulid = { git = "https://github.com/fishfolk/bones.git" } unic-langid = "0.9.0" [dependencies.bevy] -version = "0.8" +version = "0.9.1" default-features = false features = [ "x11", @@ -82,17 +77,11 @@ wasm-bindgen = "0.2.83" web-sys = { version = "0.3", features = ["Window","Location","Storage"] } [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -quinn = { version = "0.9", default-features = false, features = ["futures-io", "native-certs", "tls-rustls"] } -quinn_runtime_bevy = { git = "https://github.com/fishfolk/bones.git" } +mimalloc = { version = "0.1.32", default-features = false } -[profile.dev.package."*"] +[profile.dev] opt-level = 3 # Set this to 3 if the game becomes slow to respond during gameplay -debug = true [profile.release] lto = true codegen-units = 1 # Improved rapier physics perf, so it might help other stuff, too - -[patch.crates-io] -# Fix for https://github.com/bevyengine/bevy/issues/6790 -bevy_hierarchy = { git = "https://github.com/zicklag/bevy.git", branch = "dont-error-on-non-mapped-children-entities" } diff --git a/README.md b/README.md index e9517fc358..ea81dcb30c 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,14 @@ Fish Folk: Jumpy is a tactical 2D shooter, played by up to 4 players online or on a shared screen. Aim either left or right; the rest is up to clever movement and positioning in this fish-on-fish brawler! For more information about our origin story (Duck Game et.al.) and big-picture plans, see our [design document](https://www.notion.so/erlendsh/Fish-Fight-1647ed74217e4e38a59bd28f4f5bc81a). +## Web Demo + +Jumpy runs in the browser! You can play [web demo][web_demo] to try out the game, without needing to install anything on your computer. + +We recommend using the Chrome browser or other derivatives for best performance, or if you have issues with other browsers. + +[web_demo]: https://fishfolk.github.io/jumpy/player/latest/ + ### Key Features (WIP) - 2 to 4 players in either Local Multiplayer or Online Play diff --git a/assets/default.core.yaml b/assets/default.core.yaml new file mode 100644 index 0000000000..3129ec9f08 --- /dev/null +++ b/assets/default.core.yaml @@ -0,0 +1,36 @@ +camera_height: 448 + +physics: + terminal_velocity: 30 + friction_lerp: 0.85 + stop_threshold: 1.0 + gravity: 1 + +players: + - player/skins/catty/catty.player.yaml + - player/skins/fishy/fishy.player.yaml + - player/skins/lionfishy/lionfishy.player.yaml + - player/skins/orcy/orcy.player.yaml + - player/skins/pescy/pescy.player.yaml + - player/skins/sharky/sharky.player.yaml + +stable_maps: + - map/levels/level1.map.yaml + - map/levels/level2.map.yaml + - map/levels/level3.map.yaml + - map/levels/level4.map.yaml + +experimental_maps: + # - map/levels/lev01.map.json # Renamed to Level 1 + - map/levels/lev02.map.json + - map/levels/lev03.map.json + # - map/levels/lev04.map.json # Renamed to Level 4 + - map/levels/lev05.map.json + - map/levels/lev06.map.json + # - map/levels/lev07.map.json # Renamed to Level 3 + - map/levels/zyrafa01.map.json + - map/levels/zyrafa02.map.json + - map/levels/zyrafa03.map.json + - map/levels/zyrafa04.map.json + - map/levels/zyrafa05.map.json + # - map/levels/zyrafa06.map.json # Renamed to Level 2 diff --git a/assets/default.game.yaml b/assets/default.game.yaml index 4e93003ccb..665ef2d903 100644 --- a/assets/default.game.yaml +++ b/assets/default.game.yaml @@ -1,38 +1,4 @@ -camera_height: 448 -clear_color: 27233B -physics: - terminal_velocity: 30 - friction_lerp: 0.85 - stop_threshold: 1.0 - -players: - - player/skins/catty/catty.player.yaml - - player/skins/fishy/fishy.player.yaml - - player/skins/lionfishy/lionfishy.player.yaml - - player/skins/orcy/orcy.player.yaml - - player/skins/sharky/sharky.player.yaml - - player/skins/pescy/pescy.player.yaml - -stable_maps: - - map/levels/level1.map.yaml - - map/levels/level2.map.yaml - - map/levels/level3.map.yaml - - map/levels/level4.map.yaml - -experimental_maps: - # - map/levels/lev01.map.json # Renamed to Level 1 - - map/levels/lev02.map.json - - map/levels/lev03.map.json - # - map/levels/lev04.map.json # Renamed to Level 4 - - map/levels/lev05.map.json - - map/levels/lev06.map.json - # - map/levels/lev07.map.json # Renamed to Level 3 - - map/levels/zyrafa01.map.json - - map/levels/zyrafa02.map.json - - map/levels/zyrafa03.map.json - - map/levels/zyrafa04.map.json - - map/levels/zyrafa05.map.json - # - map/levels/zyrafa06.map.json # Renamed to Level 2 +core: default.core.yaml playlist: - music/across_the_pond.ogg @@ -116,7 +82,7 @@ default_settings: slide: !Keyboard Slash ui_theme: - scale: 0.65 + scale: 0.60 colors: positive: 3EC761 @@ -139,6 +105,7 @@ ui_theme: bg_stroke: 181425 text: FFFFFF menu: *default + debug_window_fill: 262B44 font_families: fairfax: ui/FairfaxSM.ttf diff --git a/assets/map/elements/decoration/anemones/anemones.atlas.yaml b/assets/elements/decoration/anemones/anemones.atlas.yaml similarity index 100% rename from assets/map/elements/decoration/anemones/anemones.atlas.yaml rename to assets/elements/decoration/anemones/anemones.atlas.yaml diff --git a/assets/map/elements/decoration/anemones/anemones.element.yaml b/assets/elements/decoration/anemones/anemones.element.yaml similarity index 100% rename from assets/map/elements/decoration/anemones/anemones.element.yaml rename to assets/elements/decoration/anemones/anemones.element.yaml diff --git a/assets/map/elements/decoration/anemones/anemones.png b/assets/elements/decoration/anemones/anemones.png similarity index 100% rename from assets/map/elements/decoration/anemones/anemones.png rename to assets/elements/decoration/anemones/anemones.png diff --git a/assets/map/elements/decoration/seaweed/seaweed.atlas.yaml b/assets/elements/decoration/seaweed/seaweed.atlas.yaml similarity index 100% rename from assets/map/elements/decoration/seaweed/seaweed.atlas.yaml rename to assets/elements/decoration/seaweed/seaweed.atlas.yaml diff --git a/assets/map/elements/decoration/seaweed/seaweed.element.yaml b/assets/elements/decoration/seaweed/seaweed.element.yaml similarity index 100% rename from assets/map/elements/decoration/seaweed/seaweed.element.yaml rename to assets/elements/decoration/seaweed/seaweed.element.yaml diff --git a/assets/map/elements/decoration/seaweed/seaweed.png b/assets/elements/decoration/seaweed/seaweed.png similarity index 100% rename from assets/map/elements/decoration/seaweed/seaweed.png rename to assets/elements/decoration/seaweed/seaweed.png diff --git a/assets/map/elements/environment/crab/crab.atlas.yaml b/assets/elements/environment/crab/crab.atlas.yaml similarity index 100% rename from assets/map/elements/environment/crab/crab.atlas.yaml rename to assets/elements/environment/crab/crab.atlas.yaml diff --git a/assets/map/elements/environment/crab/crab.element.yaml b/assets/elements/environment/crab/crab.element.yaml similarity index 100% rename from assets/map/elements/environment/crab/crab.element.yaml rename to assets/elements/environment/crab/crab.element.yaml diff --git a/assets/map/elements/environment/crab/crab.png b/assets/elements/environment/crab/crab.png similarity index 100% rename from assets/map/elements/environment/crab/crab.png rename to assets/elements/environment/crab/crab.png diff --git a/assets/map/elements/environment/fish_school/fish_school.element.yaml b/assets/elements/environment/fish_school/fish_school.element.yaml similarity index 100% rename from assets/map/elements/environment/fish_school/fish_school.element.yaml rename to assets/elements/environment/fish_school/fish_school.element.yaml diff --git a/assets/map/elements/environment/player_spawner/player_spawner.element.yaml b/assets/elements/environment/player_spawner/player_spawner.element.yaml similarity index 100% rename from assets/map/elements/environment/player_spawner/player_spawner.element.yaml rename to assets/elements/environment/player_spawner/player_spawner.element.yaml diff --git a/assets/map/elements/environment/sproinger/jump.ogg b/assets/elements/environment/sproinger/jump.ogg similarity index 100% rename from assets/map/elements/environment/sproinger/jump.ogg rename to assets/elements/environment/sproinger/jump.ogg diff --git a/assets/map/elements/environment/sproinger/sproinger.atlas.yaml b/assets/elements/environment/sproinger/sproinger.atlas.yaml similarity index 100% rename from assets/map/elements/environment/sproinger/sproinger.atlas.yaml rename to assets/elements/environment/sproinger/sproinger.atlas.yaml diff --git a/assets/elements/environment/sproinger/sproinger.element.yaml b/assets/elements/environment/sproinger/sproinger.element.yaml new file mode 100644 index 0000000000..1eec502680 --- /dev/null +++ b/assets/elements/environment/sproinger/sproinger.element.yaml @@ -0,0 +1,9 @@ +name: Sproinger +category: Gameplay +builtin: !Sproinger + atlas: ./sproinger.atlas.yaml + sound: ./jump.ogg + sound_volume: 0.1 + body_size: [8, 8] + body_offset: [0, 0] + spring_velocity: 20 \ No newline at end of file diff --git a/assets/map/elements/environment/sproinger/sproinger.png b/assets/elements/environment/sproinger/sproinger.png similarity index 100% rename from assets/map/elements/environment/sproinger/sproinger.png rename to assets/elements/environment/sproinger/sproinger.png diff --git a/assets/map/elements/item/blunderbass/blunderbass.element.yaml b/assets/elements/item/blunderbass/blunderbass.element.yaml similarity index 100% rename from assets/map/elements/item/blunderbass/blunderbass.element.yaml rename to assets/elements/item/blunderbass/blunderbass.element.yaml diff --git a/assets/map/elements/item/cannon/cannon.element.yaml b/assets/elements/item/cannon/cannon.element.yaml similarity index 100% rename from assets/map/elements/item/cannon/cannon.element.yaml rename to assets/elements/item/cannon/cannon.element.yaml diff --git a/assets/map/elements/item/crate/crate.atlas.yaml b/assets/elements/item/crate/crate.atlas.yaml similarity index 100% rename from assets/map/elements/item/crate/crate.atlas.yaml rename to assets/elements/item/crate/crate.atlas.yaml diff --git a/assets/map/elements/item/crate/crate.element.yaml b/assets/elements/item/crate/crate.element.yaml similarity index 100% rename from assets/map/elements/item/crate/crate.element.yaml rename to assets/elements/item/crate/crate.element.yaml diff --git a/assets/map/elements/item/crate/crate.png b/assets/elements/item/crate/crate.png similarity index 100% rename from assets/map/elements/item/crate/crate.png rename to assets/elements/item/crate/crate.png diff --git a/assets/map/elements/item/crate/crate_breaking.atlas.yaml b/assets/elements/item/crate/crate_breaking.atlas.yaml similarity index 100% rename from assets/map/elements/item/crate/crate_breaking.atlas.yaml rename to assets/elements/item/crate/crate_breaking.atlas.yaml diff --git a/assets/map/elements/item/crate/crate_breaking.png b/assets/elements/item/crate/crate_breaking.png similarity index 100% rename from assets/map/elements/item/crate/crate_breaking.png rename to assets/elements/item/crate/crate_breaking.png diff --git a/assets/map/elements/item/crate/fuse.ogg b/assets/elements/item/crate/fuse.ogg similarity index 100% rename from assets/map/elements/item/crate/fuse.ogg rename to assets/elements/item/crate/fuse.ogg diff --git a/assets/map/elements/item/grenade/explosion.atlas.yaml b/assets/elements/item/grenade/explosion.atlas.yaml similarity index 100% rename from assets/map/elements/item/grenade/explosion.atlas.yaml rename to assets/elements/item/grenade/explosion.atlas.yaml diff --git a/assets/map/elements/item/grenade/explosion.ogg b/assets/elements/item/grenade/explosion.ogg similarity index 100% rename from assets/map/elements/item/grenade/explosion.ogg rename to assets/elements/item/grenade/explosion.ogg diff --git a/assets/map/elements/item/grenade/explosion.png b/assets/elements/item/grenade/explosion.png similarity index 100% rename from assets/map/elements/item/grenade/explosion.png rename to assets/elements/item/grenade/explosion.png diff --git a/assets/map/elements/item/grenade/fuse.ogg b/assets/elements/item/grenade/fuse.ogg similarity index 100% rename from assets/map/elements/item/grenade/fuse.ogg rename to assets/elements/item/grenade/fuse.ogg diff --git a/assets/map/elements/item/grenade/grenade.atlas.yaml b/assets/elements/item/grenade/grenade.atlas.yaml similarity index 100% rename from assets/map/elements/item/grenade/grenade.atlas.yaml rename to assets/elements/item/grenade/grenade.atlas.yaml diff --git a/assets/map/elements/item/grenade/grenade.element.yaml b/assets/elements/item/grenade/grenade.element.yaml similarity index 100% rename from assets/map/elements/item/grenade/grenade.element.yaml rename to assets/elements/item/grenade/grenade.element.yaml diff --git a/assets/map/elements/item/grenade/grenade.png b/assets/elements/item/grenade/grenade.png similarity index 100% rename from assets/map/elements/item/grenade/grenade.png rename to assets/elements/item/grenade/grenade.png diff --git a/assets/map/elements/item/kick_bomb/explosion.atlas.yaml b/assets/elements/item/kick_bomb/explosion.atlas.yaml similarity index 100% rename from assets/map/elements/item/kick_bomb/explosion.atlas.yaml rename to assets/elements/item/kick_bomb/explosion.atlas.yaml diff --git a/assets/map/elements/item/kick_bomb/explosion.ogg b/assets/elements/item/kick_bomb/explosion.ogg similarity index 100% rename from assets/map/elements/item/kick_bomb/explosion.ogg rename to assets/elements/item/kick_bomb/explosion.ogg diff --git a/assets/map/elements/item/kick_bomb/explosion.png b/assets/elements/item/kick_bomb/explosion.png similarity index 100% rename from assets/map/elements/item/kick_bomb/explosion.png rename to assets/elements/item/kick_bomb/explosion.png diff --git a/assets/map/elements/item/kick_bomb/fuse.ogg b/assets/elements/item/kick_bomb/fuse.ogg similarity index 100% rename from assets/map/elements/item/kick_bomb/fuse.ogg rename to assets/elements/item/kick_bomb/fuse.ogg diff --git a/assets/map/elements/item/kick_bomb/kick_bomb.atlas.yaml b/assets/elements/item/kick_bomb/kick_bomb.atlas.yaml similarity index 100% rename from assets/map/elements/item/kick_bomb/kick_bomb.atlas.yaml rename to assets/elements/item/kick_bomb/kick_bomb.atlas.yaml diff --git a/assets/map/elements/item/kick_bomb/kick_bomb.element.yaml b/assets/elements/item/kick_bomb/kick_bomb.element.yaml similarity index 100% rename from assets/map/elements/item/kick_bomb/kick_bomb.element.yaml rename to assets/elements/item/kick_bomb/kick_bomb.element.yaml diff --git a/assets/map/elements/item/kick_bomb/kick_bomb.png b/assets/elements/item/kick_bomb/kick_bomb.png similarity index 100% rename from assets/map/elements/item/kick_bomb/kick_bomb.png rename to assets/elements/item/kick_bomb/kick_bomb.png diff --git a/assets/map/elements/item/machine_gun/machine_gun.element.yaml b/assets/elements/item/machine_gun/machine_gun.element.yaml similarity index 100% rename from assets/map/elements/item/machine_gun/machine_gun.element.yaml rename to assets/elements/item/machine_gun/machine_gun.element.yaml diff --git a/assets/map/elements/item/mine/arm.ogg b/assets/elements/item/mine/arm.ogg similarity index 100% rename from assets/map/elements/item/mine/arm.ogg rename to assets/elements/item/mine/arm.ogg diff --git a/assets/map/elements/item/mine/explosion.atlas.yaml b/assets/elements/item/mine/explosion.atlas.yaml similarity index 100% rename from assets/map/elements/item/mine/explosion.atlas.yaml rename to assets/elements/item/mine/explosion.atlas.yaml diff --git a/assets/map/elements/item/mine/explosion.ogg b/assets/elements/item/mine/explosion.ogg similarity index 100% rename from assets/map/elements/item/mine/explosion.ogg rename to assets/elements/item/mine/explosion.ogg diff --git a/assets/map/elements/item/mine/explosion.png b/assets/elements/item/mine/explosion.png similarity index 100% rename from assets/map/elements/item/mine/explosion.png rename to assets/elements/item/mine/explosion.png diff --git a/assets/map/elements/item/mine/mine.atlas.yaml b/assets/elements/item/mine/mine.atlas.yaml similarity index 100% rename from assets/map/elements/item/mine/mine.atlas.yaml rename to assets/elements/item/mine/mine.atlas.yaml diff --git a/assets/map/elements/item/mine/mine.element.yaml b/assets/elements/item/mine/mine.element.yaml similarity index 100% rename from assets/map/elements/item/mine/mine.element.yaml rename to assets/elements/item/mine/mine.element.yaml diff --git a/assets/map/elements/item/mine/mine.png b/assets/elements/item/mine/mine.png similarity index 100% rename from assets/map/elements/item/mine/mine.png rename to assets/elements/item/mine/mine.png diff --git a/assets/map/elements/item/musket/musket.element.yaml b/assets/elements/item/musket/musket.element.yaml similarity index 100% rename from assets/map/elements/item/musket/musket.element.yaml rename to assets/elements/item/musket/musket.element.yaml diff --git a/assets/map/elements/item/sniper_rifle/sniper_rifle.element.yaml b/assets/elements/item/sniper_rifle/sniper_rifle.element.yaml similarity index 100% rename from assets/map/elements/item/sniper_rifle/sniper_rifle.element.yaml rename to assets/elements/item/sniper_rifle/sniper_rifle.element.yaml diff --git a/assets/map/elements/item/stomp_boots/stomp_boots.atlas.yaml b/assets/elements/item/stomp_boots/stomp_boots.atlas.yaml similarity index 100% rename from assets/map/elements/item/stomp_boots/stomp_boots.atlas.yaml rename to assets/elements/item/stomp_boots/stomp_boots.atlas.yaml diff --git a/assets/map/elements/item/stomp_boots/stomp_boots.element.yaml b/assets/elements/item/stomp_boots/stomp_boots.element.yaml similarity index 100% rename from assets/map/elements/item/stomp_boots/stomp_boots.element.yaml rename to assets/elements/item/stomp_boots/stomp_boots.element.yaml diff --git a/assets/map/elements/item/stomp_boots/stomp_boots.png b/assets/elements/item/stomp_boots/stomp_boots.png similarity index 100% rename from assets/map/elements/item/stomp_boots/stomp_boots.png rename to assets/elements/item/stomp_boots/stomp_boots.png diff --git a/assets/map/elements/item/stomp_boots/stomp_boots_icon.atlas.yaml b/assets/elements/item/stomp_boots/stomp_boots_icon.atlas.yaml similarity index 100% rename from assets/map/elements/item/stomp_boots/stomp_boots_icon.atlas.yaml rename to assets/elements/item/stomp_boots/stomp_boots_icon.atlas.yaml diff --git a/assets/map/elements/item/stomp_boots/stomp_boots_icon.png b/assets/elements/item/stomp_boots/stomp_boots_icon.png similarity index 100% rename from assets/map/elements/item/stomp_boots/stomp_boots_icon.png rename to assets/elements/item/stomp_boots/stomp_boots_icon.png diff --git a/assets/map/elements/item/sword/sword.atlas.yaml b/assets/elements/item/sword/sword.atlas.yaml similarity index 100% rename from assets/map/elements/item/sword/sword.atlas.yaml rename to assets/elements/item/sword/sword.atlas.yaml diff --git a/assets/map/elements/item/sword/sword.element.yaml b/assets/elements/item/sword/sword.element.yaml similarity index 67% rename from assets/map/elements/item/sword/sword.element.yaml rename to assets/elements/item/sword/sword.element.yaml index b673660329..89b3821481 100644 --- a/assets/map/elements/item/sword/sword.element.yaml +++ b/assets/elements/item/sword/sword.element.yaml @@ -3,8 +3,13 @@ category: Weapons builtin: !Sword atlas: ./sword.atlas.yaml sound: ./sword.ogg + sound_volume: 0.05 + body_size: [64, 16] angular_velocity: -0.04 can_rotate: true arm_delay: 0.4 - bouncyness: 0.3 + bounciness: 0.3 throw_velocity: [1, 4] + cooldown_frames: 22 + + \ No newline at end of file diff --git a/assets/map/elements/item/sword/sword.ogg b/assets/elements/item/sword/sword.ogg similarity index 100% rename from assets/map/elements/item/sword/sword.ogg rename to assets/elements/item/sword/sword.ogg diff --git a/assets/map/elements/item/sword/sword.png b/assets/elements/item/sword/sword.png similarity index 100% rename from assets/map/elements/item/sword/sword.png rename to assets/elements/item/sword/sword.png diff --git a/assets/locales/en-US/menu.ftl b/assets/locales/en-US/menu.ftl index 8eed40ad3b..5f31ab63a2 100644 --- a/assets/locales/en-US/menu.ftl +++ b/assets/locales/en-US/menu.ftl @@ -3,7 +3,6 @@ local-game = Local Game online-game = Online Game main-menu = Main Menu map-editor = Map Editor -editor = Map Editor settings = Settings paused = Paused diff --git a/assets/map/elements/environment/sproinger/sproinger.element.yaml b/assets/map/elements/environment/sproinger/sproinger.element.yaml deleted file mode 100644 index 476cf2c43c..0000000000 --- a/assets/map/elements/environment/sproinger/sproinger.element.yaml +++ /dev/null @@ -1,5 +0,0 @@ -name: Sproinger -category: Gameplay -builtin: !Sproinger - atlas: ./sproinger.atlas.yaml - sound: ./jump.ogg \ No newline at end of file diff --git a/assets/map/levels/lev01.map.json b/assets/map/levels/lev01.map.json index ea27e89715..8e43cdd531 100644 --- a/assets/map/levels/lev01.map.json +++ b/assets/map/levels/lev01.map.json @@ -900,7 +900,7 @@ "idx": 15 } ], - "tilemap": "../resources/default_tileset.png" + "tilemap": "../resources/default_tileset.atlas.yaml" } } }, @@ -911,72 +911,72 @@ "elements": [ { "pos": [434.74872000000005, 361.5], - "element": "../elements/environment/sproinger/sproinger.element.yaml" + "element": "/elements/environment/sproinger/sproinger.element.yaml" }, { "pos": [84.00005999999999, 201.5], - "element": "../elements/environment/sproinger/sproinger.element.yaml" + "element": "/elements/environment/sproinger/sproinger.element.yaml" }, { "pos": [787.7431999999999, 201.5], - "element": "../elements/environment/sproinger/sproinger.element.yaml" + "element": "/elements/environment/sproinger/sproinger.element.yaml" }, { "pos": [90.666664, 121.5], - "element": "../elements/decoration/anemones/anemones.element.yaml" + "element": "/elements/decoration/anemones/anemones.element.yaml" }, { "pos": [776, 121.5], - "element": "../elements/decoration/anemones/anemones.element.yaml" + "element": "/elements/decoration/anemones/anemones.element.yaml" }, { "pos": [672, 121.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" }, { "pos": [192, 121.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" }, { "pos": [448, 121.5], - "element": "../elements/decoration/anemones/anemones.element.yaml" + "element": "/elements/decoration/anemones/anemones.element.yaml" }, { "pos": [437.2876, 377.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" }, { "pos": [608, 313.5], - "element": "../elements/decoration/anemones/anemones.element.yaml" + "element": "/elements/decoration/anemones/anemones.element.yaml" }, { "pos": [441.66668000000004, 569.5], - "element": "../elements/decoration/anemones/anemones.element.yaml" + "element": "/elements/decoration/anemones/anemones.element.yaml" }, { "pos": [256, 313.5], - "element": "../elements/decoration/anemones/anemones.element.yaml" + "element": "/elements/decoration/anemones/anemones.element.yaml" }, { "pos": [291.83331999999996, 601.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" }, { "pos": [777.6371999999999, 409.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" }, { "pos": [576, 601.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" }, { "pos": [88, 409.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" }, - { - "pos": [100, 100], - "element": "../elements/environment/crab/crab.element.yaml" - } + { + "pos": [100, 100], + "element": "/elements/environment/crab/crab.element.yaml" + } ] } } @@ -988,63 +988,63 @@ "elements": [ { "pos": [536, 309.5], - "element": "../elements/item/musket/musket.element.yaml" + "element": "/elements/item/musket/musket.element.yaml" }, { "pos": [292.22720000000004, 609.5], - "element": "../elements/environment/fish_school/fish_school.element.yaml" + "element": "/elements/environment/fish_school/fish_school.element.yaml" }, { "pos": [552, 289.5], - "element": "../elements/environment/crab/crab.element.yaml" + "element": "/elements/environment/crab/crab.element.yaml" }, { "pos": [496, 545.5], - "element": "../elements/environment/crab/crab.element.yaml" + "element": "/elements/environment/crab/crab.element.yaml" }, { "pos": [184, 155.5], - "element": "../elements/environment/fish_school/fish_school.element.yaml" + "element": "/elements/environment/fish_school/fish_school.element.yaml" }, { "pos": [772.4570000000001, 425.5], - "element": "../elements/environment/fish_school/fish_school.element.yaml" + "element": "/elements/environment/fish_school/fish_school.element.yaml" }, { "pos": [312.0556, 311.5], - "element": "../elements/item/musket/musket.element.yaml" + "element": "/elements/item/musket/musket.element.yaml" }, { "pos": [132.024688, 121.5], - "element": "../elements/item/machine_gun/machine_gun.element.yaml" + "element": "/elements/item/machine_gun/machine_gun.element.yaml" }, { "pos": [561, 599.5], - "element": "../elements/item/sword/sword.element.yaml" + "element": "/elements/item/sword/sword.element.yaml" }, { "pos": [272, 593.5], - "element": "../elements/item/sword/sword.element.yaml" + "element": "/elements/item/sword/sword.element.yaml" }, { "pos": [171.57139999999998, 409.5], - "element": "../elements/item/kick_bomb/kick_bomb.element.yaml" + "element": "/elements/item/kick_bomb/kick_bomb.element.yaml" }, { "pos": [712, 393.5], - "element": "../elements/item/mine/mine.element.yaml" + "element": "/elements/item/mine/mine.element.yaml" }, { "pos": [720.9998, 121.5], - "element": "../elements/item/cannon/cannon.element.yaml" + "element": "/elements/item/cannon/cannon.element.yaml" }, { "pos": [312, 105.5], - "element": "../elements/environment/sproinger/sproinger.element.yaml" + "element": "/elements/environment/sproinger/sproinger.element.yaml" }, { "pos": [576, 105.5], - "element": "../elements/environment/sproinger/sproinger.element.yaml" + "element": "/elements/environment/sproinger/sproinger.element.yaml" } ] } @@ -1057,19 +1057,19 @@ "elements": [ { "pos": [268.33334, 640], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" }, { "pos": [124.16667, 224.50002999999998], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" }, { "pos": [701.74677, 225.11905000000002], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" }, { "pos": [559.6667, 640], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" } ] } diff --git a/assets/map/levels/lev02.map.json b/assets/map/levels/lev02.map.json index 3a93773796..d994d6189f 100644 --- a/assets/map/levels/lev02.map.json +++ b/assets/map/levels/lev02.map.json @@ -708,7 +708,7 @@ "idx": 7 } ], - "tilemap": "../resources/default_tileset.png" + "tilemap": "../resources/default_tileset.atlas.yaml" } } }, @@ -719,43 +719,43 @@ "elements": [ { "pos": [792, 441.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" }, { "pos": [56, 153.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" }, { "pos": [238.5, 537.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" }, { "pos": [480, 537.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" }, { "pos": [709.8334, 185.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" }, { "pos": [272, 217.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" }, { "pos": [517.09736, 121.5], - "element": "../elements/decoration/anemones/anemones.element.yaml" + "element": "/elements/decoration/anemones/anemones.element.yaml" }, { "pos": [56, 345.5], - "element": "../elements/decoration/anemones/anemones.element.yaml" + "element": "/elements/decoration/anemones/anemones.element.yaml" }, { "pos": [593.0972999999999, 345.5], - "element": "../elements/decoration/anemones/anemones.element.yaml" + "element": "/elements/decoration/anemones/anemones.element.yaml" }, { "pos": [654.43066, 601.5], - "element": "../elements/decoration/anemones/anemones.element.yaml" + "element": "/elements/decoration/anemones/anemones.element.yaml" } ] } @@ -768,63 +768,63 @@ "elements": [ { "pos": [828.2152000000001, 535.5], - "element": "../elements/item/grenade/grenade.element.yaml" + "element": "/elements/item/grenade/grenade.element.yaml" }, { "pos": [432, 265.5], - "element": "../elements/environment/crab/crab.element.yaml" + "element": "/elements/environment/crab/crab.element.yaml" }, { "pos": [629.8823199999999, 585.5], - "element": "../elements/environment/crab/crab.element.yaml" + "element": "/elements/environment/crab/crab.element.yaml" }, { "pos": [154.72724, 521.5], - "element": "../elements/environment/crab/crab.element.yaml" + "element": "/elements/environment/crab/crab.element.yaml" }, { "pos": [272, 231.5], - "element": "../elements/environment/fish_school/fish_school.element.yaml" + "element": "/elements/environment/fish_school/fish_school.element.yaml" }, { "pos": [794.5715399999999, 441.5], - "element": "../elements/environment/fish_school/fish_school.element.yaml" + "element": "/elements/environment/fish_school/fish_school.element.yaml" }, { "pos": [232.00011999999998, 545.5], - "element": "../elements/environment/fish_school/fish_school.element.yaml" + "element": "/elements/environment/fish_school/fish_school.element.yaml" }, { "pos": [600, 593.5], - "element": "../elements/item/sniper_rifle/sniper_rifle.element.yaml" + "element": "/elements/item/sniper_rifle/sniper_rifle.element.yaml" }, { "pos": [64, 425.5], - "element": "../elements/item/mine/mine.element.yaml" + "element": "/elements/item/mine/mine.element.yaml" }, { "pos": [592, 349.5], - "element": "../elements/item/musket/musket.element.yaml" + "element": "/elements/item/musket/musket.element.yaml" }, { "pos": [230.33337999999998, 209.5], - "element": "../elements/item/musket/musket.element.yaml" + "element": "/elements/item/musket/musket.element.yaml" }, { "pos": [727.3334, 169.5], - "element": "../elements/environment/sproinger/sproinger.element.yaml" + "element": "/elements/environment/sproinger/sproinger.element.yaml" }, { "pos": [162.37097999999997, 49.5], - "element": "../elements/item/sword/sword.element.yaml" + "element": "/elements/item/sword/sword.element.yaml" }, { "pos": [423.3406, 283.5], - "element": "../elements/item/sword/sword.element.yaml" + "element": "/elements/item/sword/sword.element.yaml" }, { "pos": [296, 617.5], - "element": "../elements/item/musket/musket.element.yaml" + "element": "/elements/item/musket/musket.element.yaml" } ] } @@ -837,19 +837,19 @@ "elements": [ { "pos": [98.210815, 149.42273], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" }, { "pos": [271.61115, 538.24544], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" }, { "pos": [787.6791, 444.16577], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" }, { "pos": [650.2078, 181.11685], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" } ] } diff --git a/assets/map/levels/lev03.map.json b/assets/map/levels/lev03.map.json index 44ef9232b1..5a420e31f6 100644 --- a/assets/map/levels/lev03.map.json +++ b/assets/map/levels/lev03.map.json @@ -3335,7 +3335,7 @@ "idx": 8 } ], - "tilemap": "../resources/default_tileset.png" + "tilemap": "../resources/default_tileset.atlas.yaml" } } }, @@ -3346,47 +3346,47 @@ "elements": [ { "pos": [720, 217.5], - "element": "../elements/decoration/anemones/anemones.element.yaml" + "element": "/elements/decoration/anemones/anemones.element.yaml" }, { "pos": [808.5, 345.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" }, { "pos": [266.5, 473.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" }, { "pos": [896, 761.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" }, { "pos": [560, 729.5], - "element": "../elements/decoration/anemones/anemones.element.yaml" + "element": "/elements/decoration/anemones/anemones.element.yaml" }, { "pos": [832, 761.5], - "element": "../elements/decoration/anemones/anemones.element.yaml" + "element": "/elements/decoration/anemones/anemones.element.yaml" }, { "pos": [288, 761.5], - "element": "../elements/decoration/anemones/anemones.element.yaml" + "element": "/elements/decoration/anemones/anemones.element.yaml" }, { "pos": [407.33331999999996, 217.5], - "element": "../elements/decoration/anemones/anemones.element.yaml" + "element": "/elements/decoration/anemones/anemones.element.yaml" }, { "pos": [395.16668000000004, 601.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" }, { "pos": [880, 601.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" }, { "pos": [224, 761.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" } ] } @@ -3399,63 +3399,63 @@ "elements": [ { "pos": [800, 273.5], - "element": "../elements/item/grenade/grenade.element.yaml" + "element": "/elements/item/grenade/grenade.element.yaml" }, { "pos": [248.51263999999998, 329.5], - "element": "../elements/environment/sproinger/sproinger.element.yaml" + "element": "/elements/environment/sproinger/sproinger.element.yaml" }, { "pos": [872, 337.5], - "element": "../elements/environment/sproinger/sproinger.element.yaml" + "element": "/elements/environment/sproinger/sproinger.element.yaml" }, { "pos": [376, 641.5], - "element": "../elements/environment/fish_school/fish_school.element.yaml" + "element": "/elements/environment/fish_school/fish_school.element.yaml" }, { "pos": [808, 587.5], - "element": "../elements/environment/crab/crab.element.yaml" + "element": "/elements/environment/crab/crab.element.yaml" }, { "pos": [256, 481.5], - "element": "../elements/environment/fish_school/fish_school.element.yaml" + "element": "/elements/environment/fish_school/fish_school.element.yaml" }, { "pos": [249.27784000000003, 801.5], - "element": "../elements/environment/fish_school/fish_school.element.yaml" + "element": "/elements/environment/fish_school/fish_school.element.yaml" }, { "pos": [869.5455400000001, 793.5], - "element": "../elements/environment/fish_school/fish_school.element.yaml" + "element": "/elements/environment/fish_school/fish_school.element.yaml" }, { "pos": [792, 377.5], - "element": "../elements/environment/fish_school/fish_school.element.yaml" + "element": "/elements/environment/fish_school/fish_school.element.yaml" }, { "pos": [543.6886, 713.5], - "element": "../elements/environment/crab/crab.element.yaml" + "element": "/elements/environment/crab/crab.element.yaml" }, { "pos": [552, 745.5], - "element": "../elements/item/musket/musket.element.yaml" + "element": "/elements/item/musket/musket.element.yaml" }, { "pos": [450.66668000000004, 249.5], - "element": "../elements/item/sword/sword.element.yaml" + "element": "/elements/item/sword/sword.element.yaml" }, { "pos": [301.33331999999996, 623.5], - "element": "../elements/item/sword/sword.element.yaml" + "element": "/elements/item/sword/sword.element.yaml" }, { "pos": [896, 625.5], - "element": "../elements/item/sword/sword.element.yaml" + "element": "/elements/item/sword/sword.element.yaml" }, { "pos": [746.6666, 257.5], - "element": "../elements/item/sword/sword.element.yaml" + "element": "/elements/item/sword/sword.element.yaml" } ] } @@ -3468,19 +3468,19 @@ "elements": [ { "pos": [255.66667, 351.3333], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" }, { "pos": [367.83334, 611.83334], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" }, { "pos": [864.6515, 352.1667], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" }, { "pos": [751, 608.33334], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" } ] } diff --git a/assets/map/levels/lev04.map.json b/assets/map/levels/lev04.map.json index 2aefe62081..6c30161669 100644 --- a/assets/map/levels/lev04.map.json +++ b/assets/map/levels/lev04.map.json @@ -905,7 +905,7 @@ "idx": 8 } ], - "tilemap": "../resources/default_tileset.png" + "tilemap": "../resources/default_tileset.atlas.yaml" } } }, @@ -916,63 +916,63 @@ "elements": [ { "pos": [984.5712799999999, 247.5], - "element": "../elements/item/sniper_rifle/sniper_rifle.element.yaml" + "element": "/elements/item/sniper_rifle/sniper_rifle.element.yaml" }, { "pos": [107.42859999999999, 225.5], - "element": "../elements/item/blunderbass/blunderbass.element.yaml" + "element": "/elements/item/blunderbass/blunderbass.element.yaml" }, { "pos": [560, 271.5], - "element": "../elements/environment/crab/crab.element.yaml" + "element": "/elements/environment/crab/crab.element.yaml" }, { "pos": [480, 427.5], - "element": "../elements/environment/crab/crab.element.yaml" + "element": "/elements/environment/crab/crab.element.yaml" }, { "pos": [888, 139.5], - "element": "../elements/environment/fish_school/fish_school.element.yaml" + "element": "/elements/environment/fish_school/fish_school.element.yaml" }, { "pos": [88, 353.5], - "element": "../elements/environment/fish_school/fish_school.element.yaml" + "element": "/elements/environment/fish_school/fish_school.element.yaml" }, { "pos": [896, 121.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" }, { "pos": [496, 121.5], - "element": "../elements/decoration/anemones/anemones.element.yaml" + "element": "/elements/decoration/anemones/anemones.element.yaml" }, { "pos": [1000, 121.5], - "element": "../elements/decoration/anemones/anemones.element.yaml" + "element": "/elements/decoration/anemones/anemones.element.yaml" }, { "pos": [288, 121.5], - "element": "../elements/decoration/anemones/anemones.element.yaml" + "element": "/elements/decoration/anemones/anemones.element.yaml" }, { "pos": [112, 121.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" }, { "pos": [736.3635999999999, 441.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" }, { "pos": [96, 345.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" }, { "pos": [328, 441.5], - "element": "../elements/decoration/anemones/anemones.element.yaml" + "element": "/elements/decoration/anemones/anemones.element.yaml" }, { "pos": [968, 257.5], - "element": "../elements/decoration/anemones/anemones.element.yaml" + "element": "/elements/decoration/anemones/anemones.element.yaml" } ] } @@ -985,55 +985,55 @@ "elements": [ { "pos": [120.40002000000001, 129.5], - "element": "../elements/item/crate/crate.element.yaml" + "element": "/elements/item/crate/crate.element.yaml" }, { "pos": [1024, 137.5], - "element": "../elements/item/crate/crate.element.yaml" + "element": "/elements/item/crate/crate.element.yaml" }, { "pos": [111.40014, 337.5], - "element": "../elements/item/crate/crate.element.yaml" + "element": "/elements/item/crate/crate.element.yaml" }, { "pos": [1043.9714, 329.5], - "element": "../elements/item/crate/crate.element.yaml" + "element": "/elements/item/crate/crate.element.yaml" }, { "pos": [392, 433.5], - "element": "../elements/item/crate/crate.element.yaml" + "element": "/elements/item/crate/crate.element.yaml" }, { "pos": [677.2236, 433.5], - "element": "../elements/item/crate/crate.element.yaml" + "element": "/elements/item/crate/crate.element.yaml" }, { "pos": [616, 111.5], - "element": "../elements/item/musket/musket.element.yaml" + "element": "/elements/item/musket/musket.element.yaml" }, { "pos": [808, 463.5], - "element": "../elements/item/sword/sword.element.yaml" + "element": "/elements/item/sword/sword.element.yaml" }, { "pos": [536.1025999999999, 441.5], - "element": "../elements/item/sword/sword.element.yaml" + "element": "/elements/item/sword/sword.element.yaml" }, { "pos": [884, 145.5], - "element": "../elements/item/sword/sword.element.yaml" + "element": "/elements/item/sword/sword.element.yaml" }, { "pos": [277.7143, 121.5], - "element": "../elements/item/sword/sword.element.yaml" + "element": "/elements/item/sword/sword.element.yaml" }, { "pos": [800, 425.5], - "element": "../elements/item/mine/mine.element.yaml" + "element": "/elements/item/mine/mine.element.yaml" }, { "pos": [564.9702, 105.5], - "element": "../elements/environment/sproinger/sproinger.element.yaml" + "element": "/elements/environment/sproinger/sproinger.element.yaml" } ] } @@ -1046,19 +1046,19 @@ "elements": [ { "pos": [176.83333, 120.83334000000002], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" }, { "pos": [947, 119.33334000000002], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" }, { "pos": [137.42857, 346.71428000000003], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" }, { "pos": [973.857, 347.85715], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" } ] } diff --git a/assets/map/levels/lev05.map.json b/assets/map/levels/lev05.map.json index 6bba00f467..583da5e893 100644 --- a/assets/map/levels/lev05.map.json +++ b/assets/map/levels/lev05.map.json @@ -843,7 +843,7 @@ "idx": 10 } ], - "tilemap": "../resources/default_tileset.png" + "tilemap": "../resources/default_tileset.atlas.yaml" } } }, @@ -854,39 +854,39 @@ "elements": [ { "pos": [723.2670800000001, 169.5], - "element": "../elements/environment/sproinger/sproinger.element.yaml" + "element": "/elements/environment/sproinger/sproinger.element.yaml" }, { "pos": [664, 185.5], - "element": "../elements/decoration/anemones/anemones.element.yaml" + "element": "/elements/decoration/anemones/anemones.element.yaml" }, { "pos": [1357, 377.5], - "element": "../elements/decoration/anemones/anemones.element.yaml" + "element": "/elements/decoration/anemones/anemones.element.yaml" }, { "pos": [776.3334, 345.5], - "element": "../elements/decoration/anemones/anemones.element.yaml" + "element": "/elements/decoration/anemones/anemones.element.yaml" }, { "pos": [496, 185.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" }, { "pos": [1008, 441.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" }, { "pos": [104, 377.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" }, { "pos": [328, 441.5], - "element": "../elements/decoration/anemones/anemones.element.yaml" + "element": "/elements/decoration/anemones/anemones.element.yaml" }, { "pos": [1136.3332, 281.5], - "element": "../elements/decoration/anemones/anemones.element.yaml" + "element": "/elements/decoration/anemones/anemones.element.yaml" } ] } @@ -899,63 +899,63 @@ "elements": [ { "pos": [859.96912, 437.5], - "element": "../elements/item/grenade/grenade.element.yaml" + "element": "/elements/item/grenade/grenade.element.yaml" }, { "pos": [952, 185.5], - "element": "../elements/item/kick_bomb/kick_bomb.element.yaml" + "element": "/elements/item/kick_bomb/kick_bomb.element.yaml" }, { "pos": [376, 437.5], - "element": "../elements/item/sniper_rifle/sniper_rifle.element.yaml" + "element": "/elements/item/sniper_rifle/sniper_rifle.element.yaml" }, { "pos": [1104.6666, 441.5], - "element": "../elements/item/cannon/cannon.element.yaml" + "element": "/elements/item/cannon/cannon.element.yaml" }, { "pos": [918.5881400000001, 427.5], - "element": "../elements/environment/crab/crab.element.yaml" + "element": "/elements/environment/crab/crab.element.yaml" }, { "pos": [461.2156, 429.5], - "element": "../elements/environment/crab/crab.element.yaml" + "element": "/elements/environment/crab/crab.element.yaml" }, { "pos": [1012.6668, 449.5], - "element": "../elements/environment/fish_school/fish_school.element.yaml" + "element": "/elements/environment/fish_school/fish_school.element.yaml" }, { "pos": [740, 335.5], - "element": "../elements/environment/crab/crab.element.yaml" + "element": "/elements/environment/crab/crab.element.yaml" }, { "pos": [496, 203.5], - "element": "../elements/environment/fish_school/fish_school.element.yaml" + "element": "/elements/environment/fish_school/fish_school.element.yaml" }, { "pos": [480.72724000000005, 169.5], - "element": "../elements/item/mine/mine.element.yaml" + "element": "/elements/item/mine/mine.element.yaml" }, { "pos": [686.0571199999999, 329.5], - "element": "../elements/item/musket/musket.element.yaml" + "element": "/elements/item/musket/musket.element.yaml" }, { "pos": [1123, 273.5], - "element": "../elements/item/sword/sword.element.yaml" + "element": "/elements/item/sword/sword.element.yaml" }, { "pos": [579.6668, 433.5], - "element": "../elements/item/sword/sword.element.yaml" + "element": "/elements/item/sword/sword.element.yaml" }, { "pos": [907, 433.5], - "element": "../elements/item/sword/sword.element.yaml" + "element": "/elements/item/sword/sword.element.yaml" }, { "pos": [288, 273.5], - "element": "../elements/item/sword/sword.element.yaml" + "element": "/elements/item/sword/sword.element.yaml" } ] } @@ -968,11 +968,11 @@ "elements": [ { "pos": [114.5, 399], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" }, { "pos": [1334.3334, 399], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" } ] } diff --git a/assets/map/levels/lev06.map.json b/assets/map/levels/lev06.map.json index 5fe66e1dc7..743379a36a 100644 --- a/assets/map/levels/lev06.map.json +++ b/assets/map/levels/lev06.map.json @@ -842,7 +842,7 @@ "idx": 9 } ], - "tilemap": "../resources/default_tileset.png" + "tilemap": "../resources/default_tileset.atlas.yaml" } } }, @@ -853,35 +853,35 @@ "elements": [ { "pos": [743.6666, 377.5], - "element": "../elements/decoration/anemones/anemones.element.yaml" + "element": "/elements/decoration/anemones/anemones.element.yaml" }, { "pos": [585.2456, 441.5], - "element": "../elements/decoration/anemones/anemones.element.yaml" + "element": "/elements/decoration/anemones/anemones.element.yaml" }, { "pos": [400, 377.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" }, { "pos": [96, 377.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" }, { "pos": [396, 601.5], - "element": "../elements/decoration/anemones/anemones.element.yaml" + "element": "/elements/decoration/anemones/anemones.element.yaml" }, { "pos": [200, 569.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" }, { "pos": [677.3334, 185.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" }, { "pos": [97.333328, 185.5], - "element": "../elements/decoration/anemones/anemones.element.yaml" + "element": "/elements/decoration/anemones/anemones.element.yaml" } ] } @@ -894,67 +894,67 @@ "elements": [ { "pos": [760, 585.5], - "element": "../elements/item/crate/crate.element.yaml" + "element": "/elements/item/crate/crate.element.yaml" }, { "pos": [221.48572000000001, 319.5], - "element": "../elements/item/kick_bomb/kick_bomb.element.yaml" + "element": "/elements/item/kick_bomb/kick_bomb.element.yaml" }, { "pos": [179.0589, 425.5], - "element": "../elements/environment/sproinger/sproinger.element.yaml" + "element": "/elements/environment/sproinger/sproinger.element.yaml" }, { "pos": [630.4404, 425.5], - "element": "../elements/environment/sproinger/sproinger.element.yaml" + "element": "/elements/environment/sproinger/sproinger.element.yaml" }, { "pos": [599.3334, 297.5], - "element": "../elements/item/musket/musket.element.yaml" + "element": "/elements/item/musket/musket.element.yaml" }, { "pos": [403, 395.5], - "element": "../elements/environment/fish_school/fish_school.element.yaml" + "element": "/elements/environment/fish_school/fish_school.element.yaml" }, { "pos": [192, 587.5], - "element": "../elements/environment/fish_school/fish_school.element.yaml" + "element": "/elements/environment/fish_school/fish_school.element.yaml" }, { "pos": [664, 203.5], - "element": "../elements/environment/fish_school/fish_school.element.yaml" + "element": "/elements/environment/fish_school/fish_school.element.yaml" }, { "pos": [282.00012000000004, 559.5], - "element": "../elements/environment/crab/crab.element.yaml" + "element": "/elements/environment/crab/crab.element.yaml" }, { "pos": [562.7273, 553.5], - "element": "../elements/environment/crab/crab.element.yaml" + "element": "/elements/environment/crab/crab.element.yaml" }, { "pos": [251.57886000000002, 431.5], - "element": "../elements/item/musket/musket.element.yaml" + "element": "/elements/item/musket/musket.element.yaml" }, { "pos": [56, 593.5], - "element": "../elements/item/sword/sword.element.yaml" + "element": "/elements/item/sword/sword.element.yaml" }, { "pos": [708, 177.5], - "element": "../elements/item/sword/sword.element.yaml" + "element": "/elements/item/sword/sword.element.yaml" }, { "pos": [152.00006000000002, 177.5], - "element": "../elements/item/sword/sword.element.yaml" + "element": "/elements/item/sword/sword.element.yaml" }, { "pos": [477.3334, 585.5], - "element": "../elements/item/mine/mine.element.yaml" + "element": "/elements/item/mine/mine.element.yaml" }, { "pos": [401.64703999999995, 41.5], - "element": "../elements/environment/sproinger/sproinger.element.yaml" + "element": "/elements/environment/sproinger/sproinger.element.yaml" } ] } @@ -967,19 +967,19 @@ "elements": [ { "pos": [161.33333, 186], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" }, { "pos": [641.3333, 184], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" }, { "pos": [671.6667, 604.3333333], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" }, { "pos": [129.33333, 606], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" } ] } diff --git a/assets/map/levels/lev07.map.json b/assets/map/levels/lev07.map.json index a165ef77f3..e3da9967ef 100644 --- a/assets/map/levels/lev07.map.json +++ b/assets/map/levels/lev07.map.json @@ -1141,7 +1141,7 @@ "idx": 8 } ], - "tilemap": "../resources/default_tileset.png" + "tilemap": "../resources/default_tileset.atlas.yaml" } } }, @@ -1152,39 +1152,39 @@ "elements": [ { "pos": [48, 233.5], - "element": "../elements/environment/sproinger/sproinger.element.yaml" + "element": "/elements/environment/sproinger/sproinger.element.yaml" }, { "pos": [820, 233.5], - "element": "../elements/environment/sproinger/sproinger.element.yaml" + "element": "/elements/environment/sproinger/sproinger.element.yaml" }, { "pos": [792, 249.5], - "element": "../elements/decoration/anemones/anemones.element.yaml" + "element": "/elements/decoration/anemones/anemones.element.yaml" }, { "pos": [48, 249.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" }, { "pos": [312, 153.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" }, { "pos": [312, 473.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" }, { "pos": [248, 473.5], - "element": "../elements/decoration/anemones/anemones.element.yaml" + "element": "/elements/decoration/anemones/anemones.element.yaml" }, { "pos": [600, 473.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" }, { "pos": [536, 153.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" } ] } @@ -1197,59 +1197,59 @@ "elements": [ { "pos": [65.399994, 471.5], - "element": "../elements/item/grenade/grenade.element.yaml" + "element": "/elements/item/grenade/grenade.element.yaml" }, { "pos": [824, 469.5], - "element": "../elements/item/grenade/grenade.element.yaml" + "element": "/elements/item/grenade/grenade.element.yaml" }, { "pos": [441.41045999999994, 143.5], - "element": "../elements/environment/crab/crab.element.yaml" + "element": "/elements/environment/crab/crab.element.yaml" }, { "pos": [310.07714, 203.5], - "element": "../elements/environment/fish_school/fish_school.element.yaml" + "element": "/elements/environment/fish_school/fish_school.element.yaml" }, { "pos": [528, 203.5], - "element": "../elements/environment/fish_school/fish_school.element.yaml" + "element": "/elements/environment/fish_school/fish_school.element.yaml" }, { "pos": [304, 525.5], - "element": "../elements/environment/fish_school/fish_school.element.yaml" + "element": "/elements/environment/fish_school/fish_school.element.yaml" }, { "pos": [592, 513.5], - "element": "../elements/environment/fish_school/fish_school.element.yaml" + "element": "/elements/environment/fish_school/fish_school.element.yaml" }, { "pos": [560, 299.5], - "element": "../elements/environment/crab/crab.element.yaml" + "element": "/elements/environment/crab/crab.element.yaml" }, { "pos": [296, 303.5], - "element": "../elements/environment/crab/crab.element.yaml" + "element": "/elements/environment/crab/crab.element.yaml" }, { "pos": [568, 137.5], - "element": "../elements/item/musket/musket.element.yaml" + "element": "/elements/item/musket/musket.element.yaml" }, { "pos": [328.11425999999994, 145.5], - "element": "../elements/item/musket/musket.element.yaml" + "element": "/elements/item/musket/musket.element.yaml" }, { "pos": [416, 369.5], - "element": "../elements/item/sword/sword.element.yaml" + "element": "/elements/item/sword/sword.element.yaml" }, { "pos": [568, 483.5], - "element": "../elements/item/sword/sword.element.yaml" + "element": "/elements/item/sword/sword.element.yaml" }, { "pos": [308, 479.5], - "element": "../elements/item/sword/sword.element.yaml" + "element": "/elements/item/sword/sword.element.yaml" } ] } @@ -1262,19 +1262,19 @@ "elements": [ { "pos": [253.37262, 487.27], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" }, { "pos": [572.10425, 478.44417999999996], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" }, { "pos": [195.5694, 173.61493000000002], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" }, { "pos": [628.5847, 161.02252], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" } ] } diff --git a/assets/map/levels/level1.map.yaml b/assets/map/levels/level1.map.yaml index 10ed2a86cf..bcd17bfecc 100644 --- a/assets/map/levels/level1.map.yaml +++ b/assets/map/levels/level1.map.yaml @@ -62,7 +62,7 @@ tile_size: layers: - id: main layer kind: !tile - tilemap: ../resources/default_tileset.png + tilemap: ../resources/default_tileset.atlas.yaml has_collision: true tiles: - pos: @@ -1146,170 +1146,170 @@ layers: - pos: - 434 - 361 - element: ../elements/environment/sproinger/sproinger.element.yaml + element: /elements/environment/sproinger/sproinger.element.yaml - pos: - 80 - 202 - element: ../elements/environment/sproinger/sproinger.element.yaml + element: /elements/environment/sproinger/sproinger.element.yaml - pos: - 784 - 202 - element: ../elements/environment/sproinger/sproinger.element.yaml + element: /elements/environment/sproinger/sproinger.element.yaml - pos: - 288.0 - 105.5 - element: ../elements/environment/sproinger/sproinger.element.yaml + element: /elements/environment/sproinger/sproinger.element.yaml - pos: - 576.0 - 105.5 - element: ../elements/environment/sproinger/sproinger.element.yaml + element: /elements/environment/sproinger/sproinger.element.yaml - pos: - 90.666664 - 121.5 - element: ../elements/decoration/anemones/anemones.element.yaml + element: /elements/decoration/anemones/anemones.element.yaml - pos: - 776.0 - 121.5 - element: ../elements/decoration/anemones/anemones.element.yaml + element: /elements/decoration/anemones/anemones.element.yaml - pos: - 672.0 - 121.5 - element: ../elements/decoration/seaweed/seaweed.element.yaml + element: /elements/decoration/seaweed/seaweed.element.yaml - pos: - 192.0 - 121.5 - element: ../elements/decoration/seaweed/seaweed.element.yaml + element: /elements/decoration/seaweed/seaweed.element.yaml - pos: - 448.0 - 121.5 - element: ../elements/decoration/anemones/anemones.element.yaml + element: /elements/decoration/anemones/anemones.element.yaml - pos: - 437.2876 - 377.5 - element: ../elements/decoration/seaweed/seaweed.element.yaml + element: /elements/decoration/seaweed/seaweed.element.yaml - pos: - 608.0 - 313.5 - element: ../elements/decoration/anemones/anemones.element.yaml + element: /elements/decoration/anemones/anemones.element.yaml - pos: - 441.6667 - 569.5 - element: ../elements/decoration/anemones/anemones.element.yaml + element: /elements/decoration/anemones/anemones.element.yaml - pos: - 256.0 - 313.5 - element: ../elements/decoration/anemones/anemones.element.yaml + element: /elements/decoration/anemones/anemones.element.yaml - pos: - 291.8333 - 601.5 - element: ../elements/decoration/seaweed/seaweed.element.yaml + element: /elements/decoration/seaweed/seaweed.element.yaml - pos: - 777.6372 - 409.5 - element: ../elements/decoration/seaweed/seaweed.element.yaml + element: /elements/decoration/seaweed/seaweed.element.yaml - pos: - 576.0 - 601.5 - element: ../elements/decoration/seaweed/seaweed.element.yaml + element: /elements/decoration/seaweed/seaweed.element.yaml - pos: - 88.0 - 409.5 - element: ../elements/decoration/seaweed/seaweed.element.yaml + element: /elements/decoration/seaweed/seaweed.element.yaml - pos: - 80.0 - 230.0 - element: ../elements/environment/crab/crab.element.yaml + element: /elements/environment/crab/crab.element.yaml - id: items kind: !element elements: - pos: - 365 - 110 - element: ../elements/item/stomp_boots/stomp_boots.element.yaml + element: /elements/item/stomp_boots/stomp_boots.element.yaml - pos: - 536.0 - 309.5 - element: ../elements/item/grenade/grenade.element.yaml + element: /elements/item/grenade/grenade.element.yaml - pos: - 738 - 111 - element: ../elements/item/grenade/grenade.element.yaml + element: /elements/item/grenade/grenade.element.yaml - pos: - 643 - 520 - element: ../elements/item/grenade/grenade.element.yaml + element: /elements/item/grenade/grenade.element.yaml - pos: - 223 - 520 - element: ../elements/item/grenade/grenade.element.yaml + element: /elements/item/grenade/grenade.element.yaml - pos: - 131 - 111 - element: ../elements/item/grenade/grenade.element.yaml + element: /elements/item/grenade/grenade.element.yaml - pos: - 719.0 - 400.5 - element: ../elements/item/crate/crate.element.yaml + element: /elements/item/crate/crate.element.yaml - pos: - 143 - 410 - element: ../elements/item/mine/mine.element.yaml + element: /elements/item/mine/mine.element.yaml - pos: - 292.2272 - 609.5 - element: ../elements/environment/fish_school/fish_school.element.yaml + element: /elements/environment/fish_school/fish_school.element.yaml - pos: - 552.0 - 289.5 - element: ../elements/environment/crab/crab.element.yaml + element: /elements/environment/crab/crab.element.yaml - pos: - 496.0 - 545.5 - element: ../elements/environment/crab/crab.element.yaml + element: /elements/environment/crab/crab.element.yaml - pos: - 184.0 - 155.5 - element: ../elements/environment/fish_school/fish_school.element.yaml + element: /elements/environment/fish_school/fish_school.element.yaml - pos: - 772.457 - 425.5 - element: ../elements/environment/fish_school/fish_school.element.yaml + element: /elements/environment/fish_school/fish_school.element.yaml - pos: - 312.0556 - 311.5 - element: ../elements/item/grenade/grenade.element.yaml + element: /elements/item/grenade/grenade.element.yaml - pos: - 132.02469 - 121.5 - element: ../elements/item/machine_gun/machine_gun.element.yaml + element: /elements/item/machine_gun/machine_gun.element.yaml - pos: - 561.0 - 599.5 - element: ../elements/item/sword/sword.element.yaml + element: /elements/item/sword/sword.element.yaml - pos: - 272.0 - 593.5 - element: ../elements/item/sword/sword.element.yaml + element: /elements/item/sword/sword.element.yaml - pos: - 171.5714 - 409.5 - element: ../elements/item/kick_bomb/kick_bomb.element.yaml + element: /elements/item/kick_bomb/kick_bomb.element.yaml - id: spawners kind: !element elements: - pos: - 268.33334 - 640.0 - element: ../elements/environment/player_spawner/player_spawner.element.yaml + element: /elements/environment/player_spawner/player_spawner.element.yaml - pos: - 124.16667 - 224.50003 - element: ../elements/environment/player_spawner/player_spawner.element.yaml + element: /elements/environment/player_spawner/player_spawner.element.yaml - pos: - 701.74677 - 225.11905 - element: ../elements/environment/player_spawner/player_spawner.element.yaml + element: /elements/environment/player_spawner/player_spawner.element.yaml - pos: - 559.6667 - 640.0 - element: ../elements/environment/player_spawner/player_spawner.element.yaml + element: /elements/environment/player_spawner/player_spawner.element.yaml diff --git a/assets/map/levels/level2.map.yaml b/assets/map/levels/level2.map.yaml index a00d699269..723a328e2a 100644 --- a/assets/map/levels/level2.map.yaml +++ b/assets/map/levels/level2.map.yaml @@ -62,7 +62,7 @@ tile_size: layers: - id: main layer kind: !tile - tilemap: ../resources/default_tileset.png + tilemap: ../resources/default_tileset.atlas.yaml has_collision: true tiles: - pos: @@ -756,138 +756,138 @@ layers: - pos: - 336 - 74 - element: ../elements/environment/sproinger/sproinger.element.yaml + element: /elements/environment/sproinger/sproinger.element.yaml - pos: - 752 - 74 - element: ../elements/environment/sproinger/sproinger.element.yaml + element: /elements/environment/sproinger/sproinger.element.yaml - pos: - 944 - 74 - element: ../elements/environment/sproinger/sproinger.element.yaml + element: /elements/environment/sproinger/sproinger.element.yaml - pos: - 536.0 - 185.5 - element: ../elements/decoration/anemones/anemones.element.yaml + element: /elements/decoration/anemones/anemones.element.yaml - pos: - 216.0 - 89.5 - element: ../elements/decoration/seaweed/seaweed.element.yaml + element: /elements/decoration/seaweed/seaweed.element.yaml - pos: - 440.0 - 89.5 - element: ../elements/decoration/seaweed/seaweed.element.yaml + element: /elements/decoration/seaweed/seaweed.element.yaml - pos: - 888.0 - 217.5 - element: ../elements/decoration/seaweed/seaweed.element.yaml + element: /elements/decoration/seaweed/seaweed.element.yaml - pos: - 760.0 - 89.5 - element: ../elements/decoration/seaweed/seaweed.element.yaml + element: /elements/decoration/seaweed/seaweed.element.yaml - pos: - 408.0 - 281.5 - element: ../elements/decoration/seaweed/seaweed.element.yaml + element: /elements/decoration/seaweed/seaweed.element.yaml - pos: - 920.0 - 89.5 - element: ../elements/decoration/anemones/anemones.element.yaml + element: /elements/decoration/anemones/anemones.element.yaml - pos: - 120.0 - 89.5 - element: ../elements/decoration/anemones/anemones.element.yaml + element: /elements/decoration/anemones/anemones.element.yaml - pos: - 222.6668 - 127.5 - element: ../elements/environment/fish_school/fish_school.element.yaml + element: /elements/environment/fish_school/fish_school.element.yaml - pos: - 446.0 - 185.5 - element: ../elements/environment/fish_school/fish_school.element.yaml + element: /elements/environment/fish_school/fish_school.element.yaml - pos: - 891.3332 - 241.5 - element: ../elements/environment/fish_school/fish_school.element.yaml + element: /elements/environment/fish_school/fish_school.element.yaml - pos: - 712.0001 - 73.5 - element: ../elements/environment/crab/crab.element.yaml + element: /elements/environment/crab/crab.element.yaml - pos: - 478.6667 - 265.5 - element: ../elements/environment/crab/crab.element.yaml + element: /elements/environment/crab/crab.element.yaml - id: items kind: !element elements: - pos: - 706.8572 - 337.5 - element: ../elements/item/sword/sword.element.yaml + element: /elements/item/sword/sword.element.yaml - pos: - 224.0 - 311.5 - element: ../elements/item/sword/sword.element.yaml + element: /elements/item/sword/sword.element.yaml - pos: - 500 - 263 - element: ../elements/item/mine/mine.element.yaml + element: /elements/item/mine/mine.element.yaml - pos: - 180 - 178 - element: ../elements/item/crate/crate.element.yaml + element: /elements/item/crate/crate.element.yaml - pos: - 994 - 81 - element: ../elements/item/crate/crate.element.yaml + element: /elements/item/crate/crate.element.yaml - pos: - 800 - 207 - element: ../elements/item/crate/crate.element.yaml + element: /elements/item/crate/crate.element.yaml - pos: - - 449 + - 449 - 276 - element: ../elements/item/crate/crate.element.yaml + element: /elements/item/crate/crate.element.yaml - pos: - 854 - 207 - element: ../elements/item/grenade/grenade.element.yaml + element: /elements/item/grenade/grenade.element.yaml - pos: - 644 - 89 - element: ../elements/item/grenade/grenade.element.yaml + element: /elements/item/grenade/grenade.element.yaml - pos: - 93 - 89 - element: ../elements/item/grenade/grenade.element.yaml + element: /elements/item/grenade/grenade.element.yaml - pos: - 262 - 89 - element: ../elements/item/grenade/grenade.element.yaml + element: /elements/item/grenade/grenade.element.yaml - id: spawners kind: !element elements: - pos: - 160.0 - 192.0 - element: ../elements/environment/player_spawner/player_spawner.element.yaml + element: /elements/environment/player_spawner/player_spawner.element.yaml - pos: - 290.0 - 96.0 - element: ../elements/environment/player_spawner/player_spawner.element.yaml + element: /elements/environment/player_spawner/player_spawner.element.yaml - pos: - 576.0 - 192.0 - element: ../elements/environment/player_spawner/player_spawner.element.yaml + element: /elements/environment/player_spawner/player_spawner.element.yaml - pos: - 704.0 - 96.0 - element: ../elements/environment/player_spawner/player_spawner.element.yaml + element: /elements/environment/player_spawner/player_spawner.element.yaml - pos: - 800.0 - 224.0 - element: ../elements/environment/player_spawner/player_spawner.element.yaml + element: /elements/environment/player_spawner/player_spawner.element.yaml - pos: - 960.0 - 96.0 - element: ../elements/environment/player_spawner/player_spawner.element.yaml + element: /elements/environment/player_spawner/player_spawner.element.yaml diff --git a/assets/map/levels/level3.map.yaml b/assets/map/levels/level3.map.yaml index a8d51f4e3f..898340fa33 100644 --- a/assets/map/levels/level3.map.yaml +++ b/assets/map/levels/level3.map.yaml @@ -62,7 +62,7 @@ tile_size: layers: - id: main layer kind: !tile - tilemap: ../resources/default_tileset.png + tilemap: ../resources/default_tileset.atlas.yaml has_collision: true tiles: - pos: @@ -1421,142 +1421,142 @@ layers: - pos: - 48.0 - 234 - element: ../elements/environment/sproinger/sproinger.element.yaml + element: /elements/environment/sproinger/sproinger.element.yaml - pos: - 816.0 - 234 - element: ../elements/environment/sproinger/sproinger.element.yaml + element: /elements/environment/sproinger/sproinger.element.yaml - pos: - 792.0 - 249.5 - element: ../elements/decoration/anemones/anemones.element.yaml + element: /elements/decoration/anemones/anemones.element.yaml - pos: - 48.0 - 249.5 - element: ../elements/decoration/seaweed/seaweed.element.yaml + element: /elements/decoration/seaweed/seaweed.element.yaml - pos: - 312.0 - 153.5 - element: ../elements/decoration/seaweed/seaweed.element.yaml + element: /elements/decoration/seaweed/seaweed.element.yaml - pos: - 312.0 - 473.5 - element: ../elements/decoration/seaweed/seaweed.element.yaml + element: /elements/decoration/seaweed/seaweed.element.yaml - pos: - 248.0 - 473.5 - element: ../elements/decoration/anemones/anemones.element.yaml + element: /elements/decoration/anemones/anemones.element.yaml - pos: - 600.0 - 473.5 - element: ../elements/decoration/seaweed/seaweed.element.yaml + element: /elements/decoration/seaweed/seaweed.element.yaml - pos: - 536.0 - 153.5 - element: ../elements/decoration/seaweed/seaweed.element.yaml + element: /elements/decoration/seaweed/seaweed.element.yaml - id: items kind: !element elements: - pos: - 441.41046 - 143.5 - element: ../elements/environment/crab/crab.element.yaml + element: /elements/environment/crab/crab.element.yaml - pos: - 310.07715 - 203.5 - element: ../elements/environment/fish_school/fish_school.element.yaml + element: /elements/environment/fish_school/fish_school.element.yaml - pos: - 528.0 - 203.5 - element: ../elements/environment/fish_school/fish_school.element.yaml + element: /elements/environment/fish_school/fish_school.element.yaml - pos: - 304.0 - 525.5 - element: ../elements/environment/fish_school/fish_school.element.yaml + element: /elements/environment/fish_school/fish_school.element.yaml - pos: - 592.0 - 513.5 - element: ../elements/environment/fish_school/fish_school.element.yaml + element: /elements/environment/fish_school/fish_school.element.yaml - pos: - 560.0 - 299.5 - element: ../elements/environment/crab/crab.element.yaml + element: /elements/environment/crab/crab.element.yaml - pos: - 296.0 - 303.5 - element: ../elements/environment/crab/crab.element.yaml + element: /elements/environment/crab/crab.element.yaml - pos: - 700 - 148 - element: ../elements/item/mine/mine.element.yaml + element: /elements/item/mine/mine.element.yaml - pos: - 177 - 148 - element: ../elements/item/mine/mine.element.yaml + element: /elements/item/mine/mine.element.yaml - pos: - 65.399994 - 471.5 - element: ../elements/item/grenade/grenade.element.yaml + element: /elements/item/grenade/grenade.element.yaml - pos: - 800.0 - 469.5 - element: ../elements/item/grenade/grenade.element.yaml + element: /elements/item/grenade/grenade.element.yaml - pos: - 549 - 475 - element: ../elements/item/grenade/grenade.element.yaml + element: /elements/item/grenade/grenade.element.yaml - pos: - 304 - 475 - element: ../elements/item/grenade/grenade.element.yaml + element: /elements/item/grenade/grenade.element.yaml - pos: - 104 - 374 - element: ../elements/item/grenade/grenade.element.yaml + element: /elements/item/grenade/grenade.element.yaml - pos: - 760 - 363 - element: ../elements/item/grenade/grenade.element.yaml + element: /elements/item/grenade/grenade.element.yaml - pos: - 428 - 159 - element: ../elements/item/stomp_boots/stomp_boots.element.yaml + element: /elements/item/stomp_boots/stomp_boots.element.yaml - pos: - 416.0 - 369.5 - element: ../elements/item/sword/sword.element.yaml + element: /elements/item/sword/sword.element.yaml - pos: - 567 - 306 - element: ../elements/item/crate/crate.element.yaml + element: /elements/item/crate/crate.element.yaml - pos: - 300 - 306 - element: ../elements/item/crate/crate.element.yaml + element: /elements/item/crate/crate.element.yaml - pos: - 557 - 161 - element: ../elements/item/crate/crate.element.yaml + element: /elements/item/crate/crate.element.yaml - pos: - 345 - 161 - element: ../elements/item/crate/crate.element.yaml + element: /elements/item/crate/crate.element.yaml - id: spawners kind: !element elements: - pos: - 253.37262 - 487.27 - element: ../elements/environment/player_spawner/player_spawner.element.yaml + element: /elements/environment/player_spawner/player_spawner.element.yaml - pos: - 572.10425 - 478.44418 - element: ../elements/environment/player_spawner/player_spawner.element.yaml + element: /elements/environment/player_spawner/player_spawner.element.yaml - pos: - 240.5694 - 173.61493 - element: ../elements/environment/player_spawner/player_spawner.element.yaml + element: /elements/environment/player_spawner/player_spawner.element.yaml - pos: - 628.5847 - 161.02252 - element: ../elements/environment/player_spawner/player_spawner.element.yaml + element: /elements/environment/player_spawner/player_spawner.element.yaml diff --git a/assets/map/levels/level4.map.yaml b/assets/map/levels/level4.map.yaml index a841b0425f..4f6b37d8c2 100644 --- a/assets/map/levels/level4.map.yaml +++ b/assets/map/levels/level4.map.yaml @@ -62,7 +62,7 @@ tile_size: layers: - id: main layer kind: !tile - tilemap: ../resources/default_tileset.png + tilemap: ../resources/default_tileset.atlas.yaml has_collision: true tiles: - pos: @@ -1166,126 +1166,126 @@ layers: - pos: - 560 - 106 - element: ../elements/environment/sproinger/sproinger.element.yaml + element: /elements/environment/sproinger/sproinger.element.yaml - pos: - 984.5713 - 247.5 - element: ../elements/item/sniper_rifle/sniper_rifle.element.yaml + element: /elements/item/sniper_rifle/sniper_rifle.element.yaml - pos: - 560.0 - 271.5 - element: ../elements/environment/crab/crab.element.yaml + element: /elements/environment/crab/crab.element.yaml - pos: - 480.0 - 427.5 - element: ../elements/environment/crab/crab.element.yaml + element: /elements/environment/crab/crab.element.yaml - pos: - 888.0 - 139.5 - element: ../elements/environment/fish_school/fish_school.element.yaml + element: /elements/environment/fish_school/fish_school.element.yaml - pos: - 88.0 - 353.5 - element: ../elements/environment/fish_school/fish_school.element.yaml + element: /elements/environment/fish_school/fish_school.element.yaml - pos: - 896.0 - 121.5 - element: ../elements/decoration/seaweed/seaweed.element.yaml + element: /elements/decoration/seaweed/seaweed.element.yaml - pos: - 496.0 - 121.5 - element: ../elements/decoration/anemones/anemones.element.yaml + element: /elements/decoration/anemones/anemones.element.yaml - pos: - 1000.0 - 121.5 - element: ../elements/decoration/anemones/anemones.element.yaml + element: /elements/decoration/anemones/anemones.element.yaml - pos: - 288.0 - 121.5 - element: ../elements/decoration/anemones/anemones.element.yaml + element: /elements/decoration/anemones/anemones.element.yaml - pos: - 112.0 - 121.5 - element: ../elements/decoration/seaweed/seaweed.element.yaml + element: /elements/decoration/seaweed/seaweed.element.yaml - pos: - 736.3636 - 441.5 - element: ../elements/decoration/seaweed/seaweed.element.yaml + element: /elements/decoration/seaweed/seaweed.element.yaml - pos: - 96.0 - 345.5 - element: ../elements/decoration/seaweed/seaweed.element.yaml + element: /elements/decoration/seaweed/seaweed.element.yaml - pos: - 328.0 - 441.5 - element: ../elements/decoration/anemones/anemones.element.yaml + element: /elements/decoration/anemones/anemones.element.yaml - pos: - 968.0 - 249.5 - element: ../elements/decoration/anemones/anemones.element.yaml + element: /elements/decoration/anemones/anemones.element.yaml - id: items kind: !element elements: - pos: - 562 - 275 - element: ../elements/item/sword/sword.element.yaml + element: /elements/item/sword/sword.element.yaml - pos: - 1038 - 130 - element: ../elements/item/stomp_boots/stomp_boots.element.yaml + element: /elements/item/stomp_boots/stomp_boots.element.yaml - pos: - 76 - 130 - element: ../elements/item/stomp_boots/stomp_boots.element.yaml + element: /elements/item/stomp_boots/stomp_boots.element.yaml - pos: - 1024 - 258 - element: ../elements/item/mine/mine.element.yaml + element: /elements/item/mine/mine.element.yaml - pos: - 127 - 257 - element: ../elements/item/mine/mine.element.yaml + element: /elements/item/mine/mine.element.yaml - pos: - 385 - 446 - element: ../elements/item/grenade/grenade.element.yaml + element: /elements/item/grenade/grenade.element.yaml - pos: - 800 - 446 - element: ../elements/item/grenade/grenade.element.yaml + element: /elements/item/grenade/grenade.element.yaml - pos: - 1023 - 352 - element: ../elements/item/grenade/grenade.element.yaml + element: /elements/item/grenade/grenade.element.yaml - pos: - 128 - 352 - element: ../elements/item/grenade/grenade.element.yaml + element: /elements/item/grenade/grenade.element.yaml - pos: - 247 - 124 - element: ../elements/item/grenade/grenade.element.yaml + element: /elements/item/grenade/grenade.element.yaml - pos: - 822 - 124 - element: ../elements/item/grenade/grenade.element.yaml + element: /elements/item/grenade/grenade.element.yaml - id: spawners kind: !element elements: - pos: - 176.83333 - 120.83334 - element: ../elements/environment/player_spawner/player_spawner.element.yaml + element: /elements/environment/player_spawner/player_spawner.element.yaml - pos: - 947.0 - 119.33334 - element: ../elements/environment/player_spawner/player_spawner.element.yaml + element: /elements/environment/player_spawner/player_spawner.element.yaml - pos: - 137.42857 - 346.7143 - element: ../elements/environment/player_spawner/player_spawner.element.yaml + element: /elements/environment/player_spawner/player_spawner.element.yaml - pos: - 973.857 - 347.85715 - element: ../elements/environment/player_spawner/player_spawner.element.yaml + element: /elements/environment/player_spawner/player_spawner.element.yaml diff --git a/assets/map/levels/test_level.map.json b/assets/map/levels/test_level.map.json index 8950140e84..abc1ef889d 100644 --- a/assets/map/levels/test_level.map.json +++ b/assets/map/levels/test_level.map.json @@ -871,7 +871,7 @@ "idx": 8 } ], - "tilemap": "../resources/default_tileset.png" + "tilemap": "../resources/default_tileset.atlas.yaml" } } }, @@ -882,11 +882,11 @@ "elements": [ { "pos": [336, 441.5], - "element": "../elements/decoration/anemones/anemones.element.yaml" + "element": "/elements/decoration/anemones/anemones.element.yaml" }, { "pos": [667.6116999999999, 441.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" } ] } @@ -899,127 +899,127 @@ "elements": [ { "pos": [813.7638, 43.5], - "element": "../elements/item/starfish_launcher/starfish_launcher.element.yaml" + "element": "/elements/item/starfish_launcher/starfish_launcher.element.yaml" }, { "pos": [336, 97.5], - "element": "../elements/environment/fish_school/fish_school.element.yaml" + "element": "/elements/environment/fish_school/fish_school.element.yaml" }, { "pos": [488, 223.5], - "element": "../elements/environment/fish_school/fish_school.element.yaml" + "element": "/elements/environment/fish_school/fish_school.element.yaml" }, { "pos": [653.7488000000001, 465.5], - "element": "../elements/environment/fish_school/fish_school.element.yaml" + "element": "/elements/environment/fish_school/fish_school.element.yaml" }, { "pos": [505.7092, 555.5], - "element": "../elements/environment/crab/crab.element.yaml" + "element": "/elements/environment/crab/crab.element.yaml" }, { "pos": [661.04712, 303.5], - "element": "../elements/environment/crab/crab.element.yaml" + "element": "/elements/environment/crab/crab.element.yaml" }, { "pos": [433.38, 427.5], - "element": "../elements/environment/crab/crab.element.yaml" + "element": "/elements/environment/crab/crab.element.yaml" }, { "pos": [624, 425.5], - "element": "../elements/environment/crab/crab.element.yaml" + "element": "/elements/environment/crab/crab.element.yaml" }, { "pos": [544, 49.5], - "element": "../elements/environment/crab/crab.element.yaml" + "element": "/elements/environment/crab/crab.element.yaml" }, { "pos": [732.7508, 425.5], - "element": "../elements/item/trident/trident.element.yaml" + "element": "/elements/item/trident/trident.element.yaml" }, { "pos": [550.0372, 305.5], - "element": "../elements/item/crown_hat/crown_hat.element.yaml" + "element": "/elements/item/crown_hat/crown_hat.element.yaml" }, { "pos": [328, 325.5], - "element": "../elements/item/cowboy_hat/cowboy_hat.element.yaml" + "element": "/elements/item/cowboy_hat/cowboy_hat.element.yaml" }, { "pos": [451, 345.5], - "element": "../elements/item/chest_hat/chest_hat.element.yaml" + "element": "/elements/item/chest_hat/chest_hat.element.yaml" }, { "pos": [752, 153.5], - "element": "../elements/item/chefs_hat/chefs_hat.element.yaml" + "element": "/elements/item/chefs_hat/chefs_hat.element.yaml" }, { "pos": [680, 169.5], - "element": "../elements/item/bucket_hat/bucket_hat.element.yaml" + "element": "/elements/item/bucket_hat/bucket_hat.element.yaml" }, { "pos": [361, 179.5], - "element": "../elements/item/pirate_hat/pirate_hat.element.yaml" + "element": "/elements/item/pirate_hat/pirate_hat.element.yaml" }, { "pos": [80, 41.5], - "element": "../elements/environment/sproinger/sproinger.element.yaml" + "element": "/elements/environment/sproinger/sproinger.element.yaml" }, { "pos": [48, 361.5], - "element": "../elements/environment/sproinger/sproinger.element.yaml" + "element": "/elements/environment/sproinger/sproinger.element.yaml" }, { "pos": [913.75, 41.5], - "element": "../elements/environment/sproinger/sproinger.element.yaml" + "element": "/elements/environment/sproinger/sproinger.element.yaml" }, { "pos": [944, 361.5], - "element": "../elements/environment/sproinger/sproinger.element.yaml" + "element": "/elements/environment/sproinger/sproinger.element.yaml" }, { "pos": [200, 209.5], - "element": "../elements/item/sword/sword.element.yaml" + "element": "/elements/item/sword/sword.element.yaml" }, { "pos": [208, 585.5], - "element": "../elements/item/grenade/grenade.element.yaml" + "element": "/elements/item/grenade/grenade.element.yaml" }, { "pos": [208, 459.5], - "element": "../elements/item/turtle_shell/turtle_shell.element.yaml" + "element": "/elements/item/turtle_shell/turtle_shell.element.yaml" }, { "pos": [208, 329.5], - "element": "../elements/item/machine_gun/machine_gun.element.yaml" + "element": "/elements/item/machine_gun/machine_gun.element.yaml" }, { "pos": [793.3334, 669.5], - "element": "../elements/item/cannon/cannon.element.yaml" + "element": "/elements/item/cannon/cannon.element.yaml" }, { "pos": [804, 315.5], - "element": "../elements/item/mine/mine.element.yaml" + "element": "/elements/item/mine/mine.element.yaml" }, { "pos": [445.77790000000005, 51.5], - "element": "../elements/item/sniper_rifle/sniper_rifle.element.yaml" + "element": "/elements/item/sniper_rifle/sniper_rifle.element.yaml" }, { "pos": [792, 161.5], - "element": "../elements/item/musket/musket.element.yaml" + "element": "/elements/item/musket/musket.element.yaml" }, { "pos": [624, 57.5], - "element": "../elements/item/kick_bomb/kick_bomb.element.yaml" + "element": "/elements/item/kick_bomb/kick_bomb.element.yaml" }, { "pos": [200, 57.5], - "element": "../elements/item/blunderbuss/blunderbuss.element.yaml" + "element": "/elements/item/blunderbuss/blunderbuss.element.yaml" }, { "pos": [303.9424, 183.5], - "element": "../elements/item/crate/crate.element.yaml" + "element": "/elements/item/crate/crate.element.yaml" } ] } @@ -1032,11 +1032,11 @@ "elements": [ { "pos": [255.66667, 63], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" }, { "pos": [715.6667, 64.33330000000001], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" } ] } diff --git a/assets/map/levels/zyrafa01.map.json b/assets/map/levels/zyrafa01.map.json index 2e166daea3..44b196bb79 100644 --- a/assets/map/levels/zyrafa01.map.json +++ b/assets/map/levels/zyrafa01.map.json @@ -558,7 +558,7 @@ "idx": 9 } ], - "tilemap": "../resources/default_tileset.png" + "tilemap": "../resources/default_tileset.atlas.yaml" } } }, @@ -569,23 +569,23 @@ "elements": [ { "pos": [344, 185.5], - "element": "../elements/decoration/anemones/anemones.element.yaml" + "element": "/elements/decoration/anemones/anemones.element.yaml" }, { "pos": [152, 345.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" }, { "pos": [760, 345.5], - "element": "../elements/decoration/anemones/anemones.element.yaml" + "element": "/elements/decoration/anemones/anemones.element.yaml" }, { "pos": [376, 281.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" }, { "pos": [664, 185.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" } ] } @@ -598,55 +598,55 @@ "elements": [ { "pos": [728, 341.5], - "element": "../elements/item/grenade/grenade.element.yaml" + "element": "/elements/item/grenade/grenade.element.yaml" }, { "pos": [97, 345.5], - "element": "../elements/item/kick_bomb/kick_bomb.element.yaml" + "element": "/elements/item/kick_bomb/kick_bomb.element.yaml" }, { "pos": [448, 209.5], - "element": "../elements/environment/crab/crab.element.yaml" + "element": "/elements/environment/crab/crab.element.yaml" }, { "pos": [440, 365.5], - "element": "../elements/environment/crab/crab.element.yaml" + "element": "/elements/environment/crab/crab.element.yaml" }, { "pos": [787.846, 345.5], - "element": "../elements/environment/crab/crab.element.yaml" + "element": "/elements/environment/crab/crab.element.yaml" }, { "pos": [656, 209.5], - "element": "../elements/environment/fish_school/fish_school.element.yaml" + "element": "/elements/environment/fish_school/fish_school.element.yaml" }, { "pos": [152.92298, 373.5], - "element": "../elements/environment/fish_school/fish_school.element.yaml" + "element": "/elements/environment/fish_school/fish_school.element.yaml" }, { "pos": [704, 345.5], - "element": "../elements/item/sword/sword.element.yaml" + "element": "/elements/item/sword/sword.element.yaml" }, { "pos": [271.76469999999995, 393.5], - "element": "../elements/item/mine/mine.element.yaml" + "element": "/elements/item/mine/mine.element.yaml" }, { "pos": [95.42862, 337.5], - "element": "../elements/item/sword/sword.element.yaml" + "element": "/elements/item/sword/sword.element.yaml" }, { "pos": [432, 169.5], - "element": "../elements/item/blunderbass/blunderbass.element.yaml" + "element": "/elements/item/blunderbass/blunderbass.element.yaml" }, { "pos": [616, 393.5], - "element": "../elements/item/mine/mine.element.yaml" + "element": "/elements/item/mine/mine.element.yaml" }, { "pos": [439.05884000000003, 361.5], - "element": "../elements/item/musket/musket.element.yaml" + "element": "/elements/item/musket/musket.element.yaml" } ] } @@ -659,19 +659,19 @@ "elements": [ { "pos": [128, 352], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" }, { "pos": [736, 352], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" }, { "pos": [256, 192], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" }, { "pos": [608, 192], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" } ] } diff --git a/assets/map/levels/zyrafa02.map.json b/assets/map/levels/zyrafa02.map.json index 81df1f5b0f..4f76841e49 100644 --- a/assets/map/levels/zyrafa02.map.json +++ b/assets/map/levels/zyrafa02.map.json @@ -1,2766 +1,1608 @@ { - "name": "zyrafa02", - "background_color": "7EA8A6", - "grid_size": [ - 23, - 26 - ], - "tile_size": [ - 32, - 32 - ], - "layers": [ - { - "id": "main layer", - "kind": { - "tile": { - "has_collision": true, - "tiles": [ - { - "pos": [ - 0, - 25 - ], - "idx": 8 - }, - { - "pos": [ - 1, - 25 - ], - "idx": 8 - }, - { - "pos": [ - 2, - 25 - ], - "idx": 8 - }, - { - "pos": [ - 3, - 25 - ], - "idx": 8 - }, - { - "pos": [ - 4, - 25 - ], - "idx": 8 - }, - { - "pos": [ - 5, - 25 - ], - "idx": 8 - }, - { - "pos": [ - 6, - 25 - ], - "idx": 8 - }, - { - "pos": [ - 7, - 25 - ], - "idx": 8 - }, - { - "pos": [ - 8, - 25 - ], - "idx": 8 - }, - { - "pos": [ - 9, - 25 - ], - "idx": 8 - }, - { - "pos": [ - 10, - 25 - ], - "idx": 8 - }, - { - "pos": [ - 11, - 25 - ], - "idx": 8 - }, - { - "pos": [ - 12, - 25 - ], - "idx": 8 - }, - { - "pos": [ - 13, - 25 - ], - "idx": 8 - }, - { - "pos": [ - 14, - 25 - ], - "idx": 8 - }, - { - "pos": [ - 15, - 25 - ], - "idx": 8 - }, - { - "pos": [ - 16, - 25 - ], - "idx": 8 - }, - { - "pos": [ - 17, - 25 - ], - "idx": 8 - }, - { - "pos": [ - 18, - 25 - ], - "idx": 8 - }, - { - "pos": [ - 19, - 25 - ], - "idx": 8 - }, - { - "pos": [ - 20, - 25 - ], - "idx": 8 - }, - { - "pos": [ - 21, - 25 - ], - "idx": 8 - }, - { - "pos": [ - 22, - 25 - ], - "idx": 8 - }, - { - "pos": [ - 0, - 24 - ], - "idx": 8 - }, - { - "pos": [ - 1, - 24 - ], - "idx": 8 - }, - { - "pos": [ - 2, - 24 - ], - "idx": 8 - }, - { - "pos": [ - 3, - 24 - ], - "idx": 8 - }, - { - "pos": [ - 4, - 24 - ], - "idx": 8 - }, - { - "pos": [ - 5, - 24 - ], - "idx": 8 - }, - { - "pos": [ - 6, - 24 - ], - "idx": 8 - }, - { - "pos": [ - 7, - 24 - ], - "idx": 8 - }, - { - "pos": [ - 8, - 24 - ], - "idx": 8 - }, - { - "pos": [ - 9, - 24 - ], - "idx": 8 - }, - { - "pos": [ - 10, - 24 - ], - "idx": 8 - }, - { - "pos": [ - 11, - 24 - ], - "idx": 8 - }, - { - "pos": [ - 12, - 24 - ], - "idx": 8 - }, - { - "pos": [ - 13, - 24 - ], - "idx": 8 - }, - { - "pos": [ - 14, - 24 - ], - "idx": 8 - }, - { - "pos": [ - 15, - 24 - ], - "idx": 8 - }, - { - "pos": [ - 16, - 24 - ], - "idx": 8 - }, - { - "pos": [ - 17, - 24 - ], - "idx": 8 - }, - { - "pos": [ - 18, - 24 - ], - "idx": 8 - }, - { - "pos": [ - 19, - 24 - ], - "idx": 8 - }, - { - "pos": [ - 20, - 24 - ], - "idx": 8 - }, - { - "pos": [ - 21, - 24 - ], - "idx": 8 - }, - { - "pos": [ - 22, - 24 - ], - "idx": 8 - }, - { - "pos": [ - 0, - 23 - ], - "idx": 8 - }, - { - "pos": [ - 1, - 23 - ], - "idx": 8 - }, - { - "pos": [ - 2, - 23 - ], - "idx": 8 - }, - { - "pos": [ - 3, - 23 - ], - "idx": 8 - }, - { - "pos": [ - 4, - 23 - ], - "idx": 8 - }, - { - "pos": [ - 5, - 23 - ], - "idx": 8 - }, - { - "pos": [ - 6, - 23 - ], - "idx": 8 - }, - { - "pos": [ - 7, - 23 - ], - "idx": 8 - }, - { - "pos": [ - 8, - 23 - ], - "idx": 8 - }, - { - "pos": [ - 9, - 23 - ], - "idx": 8 - }, - { - "pos": [ - 10, - 23 - ], - "idx": 8 - }, - { - "pos": [ - 11, - 23 - ], - "idx": 8 - }, - { - "pos": [ - 12, - 23 - ], - "idx": 8 - }, - { - "pos": [ - 13, - 23 - ], - "idx": 8 - }, - { - "pos": [ - 14, - 23 - ], - "idx": 8 - }, - { - "pos": [ - 15, - 23 - ], - "idx": 8 - }, - { - "pos": [ - 16, - 23 - ], - "idx": 8 - }, - { - "pos": [ - 17, - 23 - ], - "idx": 8 - }, - { - "pos": [ - 18, - 23 - ], - "idx": 8 - }, - { - "pos": [ - 19, - 23 - ], - "idx": 8 - }, - { - "pos": [ - 20, - 23 - ], - "idx": 8 - }, - { - "pos": [ - 21, - 23 - ], - "idx": 8 - }, - { - "pos": [ - 22, - 23 - ], - "idx": 8 - }, - { - "pos": [ - 0, - 22 - ], - "idx": 3 - }, - { - "pos": [ - 1, - 22 - ], - "idx": 8 - }, - { - "pos": [ - 2, - 22 - ], - "idx": 8 - }, - { - "pos": [ - 3, - 22 - ], - "idx": 4 - }, - { - "pos": [ - 4, - 22 - ], - "idx": 4 - }, - { - "pos": [ - 5, - 22 - ], - "idx": 15 - }, - { - "pos": [ - 6, - 22 - ], - "idx": 15 - }, - { - "pos": [ - 7, - 22 - ], - "idx": 15 - }, - { - "pos": [ - 8, - 22 - ], - "idx": 15 - }, - { - "pos": [ - 9, - 22 - ], - "idx": 15 - }, - { - "pos": [ - 10, - 22 - ], - "idx": 15 - }, - { - "pos": [ - 11, - 22 - ], - "idx": 15 - }, - { - "pos": [ - 12, - 22 - ], - "idx": 15 - }, - { - "pos": [ - 13, - 22 - ], - "idx": 15 - }, - { - "pos": [ - 14, - 22 - ], - "idx": 15 - }, - { - "pos": [ - 15, - 22 - ], - "idx": 15 - }, - { - "pos": [ - 16, - 22 - ], - "idx": 15 - }, - { - "pos": [ - 17, - 22 - ], - "idx": 15 - }, - { - "pos": [ - 18, - 22 - ], - "idx": 5 - }, - { - "pos": [ - 19, - 22 - ], - "idx": 5 - }, - { - "pos": [ - 20, - 22 - ], - "idx": 8 - }, - { - "pos": [ - 21, - 22 - ], - "idx": 8 - }, - { - "pos": [ - 22, - 22 - ], - "idx": 3 - }, - { - "pos": [ - 0, - 21 - ], - "idx": 10 - }, - { - "pos": [ - 1, - 21 - ], - "idx": 8 - }, - { - "pos": [ - 2, - 21 - ], - "idx": 4 - }, - { - "pos": [ - 3, - 21 - ], - "idx": 16 - }, - { - "pos": [ - 4, - 21 - ], - "idx": 9 - }, - { - "pos": [ - 18, - 21 - ], - "idx": 7 - }, - { - "pos": [ - 19, - 21 - ], - "idx": 14 - }, - { - "pos": [ - 20, - 21 - ], - "idx": 5 - }, - { - "pos": [ - 21, - 21 - ], - "idx": 8 - }, - { - "pos": [ - 22, - 21 - ], - "idx": 10 - }, - { - "pos": [ - 0, - 20 - ], - "idx": 10 - }, - { - "pos": [ - 1, - 20 - ], - "idx": 8 - }, - { - "pos": [ - 2, - 20 - ], - "idx": 4 - }, - { - "pos": [ - 3, - 20 - ], - "idx": 15 - }, - { - "pos": [ - 4, - 20 - ], - "idx": 16 - }, - { - "pos": [ - 18, - 20 - ], - "idx": 14 - }, - { - "pos": [ - 19, - 20 - ], - "idx": 15 - }, - { - "pos": [ - 20, - 20 - ], - "idx": 5 - }, - { - "pos": [ - 21, - 20 - ], - "idx": 8 - }, - { - "pos": [ - 22, - 20 - ], - "idx": 10 - }, - { - "pos": [ - 0, - 19 - ], - "idx": 10 - }, - { - "pos": [ - 1, - 19 - ], - "idx": 8 - }, - { - "pos": [ - 2, - 19 - ], - "idx": 9 - }, - { - "pos": [ - 20, - 19 - ], - "idx": 7 - }, - { - "pos": [ - 21, - 19 - ], - "idx": 8 - }, - { - "pos": [ - 22, - 19 - ], - "idx": 10 - }, - { - "pos": [ - 0, - 18 - ], - "idx": 10 - }, - { - "pos": [ - 1, - 18 - ], - "idx": 8 - }, - { - "pos": [ - 2, - 18 - ], - "idx": 9 - }, - { - "pos": [ - 20, - 18 - ], - "idx": 7 - }, - { - "pos": [ - 21, - 18 - ], - "idx": 8 - }, - { - "pos": [ - 22, - 18 - ], - "idx": 10 - }, - { - "pos": [ - 0, - 17 - ], - "idx": 10 - }, - { - "pos": [ - 1, - 17 - ], - "idx": 8 - }, - { - "pos": [ - 2, - 17 - ], - "idx": 9 - }, - { - "pos": [ - 20, - 17 - ], - "idx": 7 - }, - { - "pos": [ - 21, - 17 - ], - "idx": 8 - }, - { - "pos": [ - 22, - 17 - ], - "idx": 10 - }, - { - "pos": [ - 0, - 16 - ], - "idx": 10 - }, - { - "pos": [ - 1, - 16 - ], - "idx": 8 - }, - { - "pos": [ - 2, - 16 - ], - "idx": 9 - }, - { - "pos": [ - 20, - 16 - ], - "idx": 7 - }, - { - "pos": [ - 21, - 16 - ], - "idx": 8 - }, - { - "pos": [ - 22, - 16 - ], - "idx": 10 - }, - { - "pos": [ - 0, - 15 - ], - "idx": 10 - }, - { - "pos": [ - 1, - 15 - ], - "idx": 8 - }, - { - "pos": [ - 2, - 15 - ], - "idx": 9 - }, - { - "pos": [ - 7, - 15 - ], - "idx": 56, - "jump_through": true - }, - { - "pos": [ - 8, - 15 - ], - "idx": 58, - "jump_through": true - }, - { - "pos": [ - 9, - 15 - ], - "idx": 58, - "jump_through": true - }, - { - "pos": [ - 10, - 15 - ], - "idx": 58, - "jump_through": true - }, - { - "pos": [ - 11, - 15 - ], - "idx": 24 - }, - { - "pos": [ - 12, - 15 - ], - "idx": 58, - "jump_through": true - }, - { - "pos": [ - 13, - 15 - ], - "idx": 58, - "jump_through": true - }, - { - "pos": [ - 14, - 15 - ], - "idx": 58, - "jump_through": true - }, - { - "pos": [ - 15, - 15 - ], - "idx": 60, - "jump_through": true - }, - { - "pos": [ - 20, - 15 - ], - "idx": 7 - }, - { - "pos": [ - 21, - 15 - ], - "idx": 8 - }, - { - "pos": [ - 22, - 15 - ], - "idx": 10 - }, - { - "pos": [ - 0, - 14 - ], - "idx": 10 - }, - { - "pos": [ - 1, - 14 - ], - "idx": 8 - }, - { - "pos": [ - 2, - 14 - ], - "idx": 9 - }, - { - "pos": [ - 20, - 14 - ], - "idx": 7 - }, - { - "pos": [ - 21, - 14 - ], - "idx": 8 - }, - { - "pos": [ - 22, - 14 - ], - "idx": 10 - }, - { - "pos": [ - 0, - 13 - ], - "idx": 10 - }, - { - "pos": [ - 1, - 13 - ], - "idx": 8 - }, - { - "pos": [ - 2, - 13 - ], - "idx": 9 - }, - { - "pos": [ - 3, - 13 - ], - "idx": 58, - "jump_through": true - }, - { - "pos": [ - 4, - 13 - ], - "idx": 60, - "jump_through": true - }, - { - "pos": [ - 18, - 13 - ], - "idx": 56, - "jump_through": true - }, - { - "pos": [ - 19, - 13 - ], - "idx": 58, - "jump_through": true - }, - { - "pos": [ - 20, - 13 - ], - "idx": 7 - }, - { - "pos": [ - 21, - 13 - ], - "idx": 8 - }, - { - "pos": [ - 22, - 13 - ], - "idx": 10 - }, - { - "pos": [ - 0, - 12 - ], - "idx": 10 - }, - { - "pos": [ - 1, - 12 - ], - "idx": 8 - }, - { - "pos": [ - 2, - 12 - ], - "idx": 9 - }, - { - "pos": [ - 20, - 12 - ], - "idx": 7 - }, - { - "pos": [ - 21, - 12 - ], - "idx": 8 - }, - { - "pos": [ - 22, - 12 - ], - "idx": 10 - }, - { - "pos": [ - 0, - 11 - ], - "idx": 10 - }, - { - "pos": [ - 1, - 11 - ], - "idx": 8 - }, - { - "pos": [ - 2, - 11 - ], - "idx": 9 - }, - { - "pos": [ - 20, - 11 - ], - "idx": 7 - }, - { - "pos": [ - 21, - 11 - ], - "idx": 8 - }, - { - "pos": [ - 22, - 11 - ], - "idx": 10 - }, - { - "pos": [ - 0, - 10 - ], - "idx": 10 - }, - { - "pos": [ - 1, - 10 - ], - "idx": 8 - }, - { - "pos": [ - 2, - 10 - ], - "idx": 9 - }, - { - "pos": [ - 6, - 10 - ], - "idx": 56, - "jump_through": true - }, - { - "pos": [ - 7, - 10 - ], - "idx": 58, - "jump_through": true - }, - { - "pos": [ - 8, - 10 - ], - "idx": 58, - "jump_through": true - }, - { - "pos": [ - 9, - 10 - ], - "idx": 58, - "jump_through": true - }, - { - "pos": [ - 10, - 10 - ], - "idx": 21 - }, - { - "pos": [ - 11, - 10 - ], - "idx": 22 - }, - { - "pos": [ - 12, - 10 - ], - "idx": 23 - }, - { - "pos": [ - 13, - 10 - ], - "idx": 58, - "jump_through": true - }, - { - "pos": [ - 14, - 10 - ], - "idx": 58, - "jump_through": true - }, - { - "pos": [ - 15, - 10 - ], - "idx": 58, - "jump_through": true - }, - { - "pos": [ - 16, - 10 - ], - "idx": 60, - "jump_through": true - }, - { - "pos": [ - 20, - 10 - ], - "idx": 7 - }, - { - "pos": [ - 21, - 10 - ], - "idx": 8 - }, - { - "pos": [ - 22, - 10 - ], - "idx": 10 - }, - { - "pos": [ - 0, - 9 - ], - "idx": 10 - }, - { - "pos": [ - 1, - 9 - ], - "idx": 8 - }, - { - "pos": [ - 2, - 9 - ], - "idx": 9 - }, - { - "pos": [ - 10, - 9 - ], - "idx": 7 - }, - { - "pos": [ - 11, - 9 - ], - "idx": 8 - }, - { - "pos": [ - 12, - 9 - ], - "idx": 9 - }, - { - "pos": [ - 20, - 9 - ], - "idx": 7 - }, - { - "pos": [ - 21, - 9 - ], - "idx": 8 - }, - { - "pos": [ - 22, - 9 - ], - "idx": 10 - }, - { - "pos": [ - 0, - 8 - ], - "idx": 10 - }, - { - "pos": [ - 1, - 8 - ], - "idx": 8 - }, - { - "pos": [ - 2, - 8 - ], - "idx": 9 - }, - { - "pos": [ - 10, - 8 - ], - "idx": 7 - }, - { - "pos": [ - 11, - 8 - ], - "idx": 8 - }, - { - "pos": [ - 12, - 8 - ], - "idx": 9 - }, - { - "pos": [ - 20, - 8 - ], - "idx": 7 - }, - { - "pos": [ - 21, - 8 - ], - "idx": 8 - }, - { - "pos": [ - 22, - 8 - ], - "idx": 10 - }, - { - "pos": [ - 0, - 7 - ], - "idx": 10 - }, - { - "pos": [ - 1, - 7 - ], - "idx": 8 - }, - { - "pos": [ - 2, - 7 - ], - "idx": 9 - }, - { - "pos": [ - 3, - 7 - ], - "idx": 58, - "jump_through": true - }, - { - "pos": [ - 4, - 7 - ], - "idx": 60, - "jump_through": true - }, - { - "pos": [ - 10, - 7 - ], - "idx": 14 - }, - { - "pos": [ - 11, - 7 - ], - "idx": 15 - }, - { - "pos": [ - 12, - 7 - ], - "idx": 16 - }, - { - "pos": [ - 18, - 7 - ], - "idx": 56, - "jump_through": true - }, - { - "pos": [ - 19, - 7 - ], - "idx": 58, - "jump_through": true - }, - { - "pos": [ - 20, - 7 - ], - "idx": 7 - }, - { - "pos": [ - 21, - 7 - ], - "idx": 8 - }, - { - "pos": [ - 22, - 7 - ], - "idx": 10 - }, - { - "pos": [ - 0, - 6 - ], - "idx": 10 - }, - { - "pos": [ - 1, - 6 - ], - "idx": 8 - }, - { - "pos": [ - 2, - 6 - ], - "idx": 9 - }, - { - "pos": [ - 20, - 6 - ], - "idx": 7 - }, - { - "pos": [ - 21, - 6 - ], - "idx": 8 - }, - { - "pos": [ - 22, - 6 - ], - "idx": 10 - }, - { - "pos": [ - 0, - 5 - ], - "idx": 10 - }, - { - "pos": [ - 1, - 5 - ], - "idx": 8 - }, - { - "pos": [ - 2, - 5 - ], - "idx": 9 - }, - { - "pos": [ - 3, - 5 - ], - "idx": 1 - }, - { - "pos": [ - 4, - 5 - ], - "idx": 2 - }, - { - "pos": [ - 18, - 5 - ], - "idx": 0 - }, - { - "pos": [ - 19, - 5 - ], - "idx": 1 - }, - { - "pos": [ - 20, - 5 - ], - "idx": 7 - }, - { - "pos": [ - 21, - 5 - ], - "idx": 8 - }, - { - "pos": [ - 22, - 5 - ], - "idx": 10 - }, - { - "pos": [ - 0, - 4 - ], - "idx": 17 - }, - { - "pos": [ - 1, - 4 - ], - "idx": 8 - }, - { - "pos": [ - 2, - 4 - ], - "idx": 11 - }, - { - "pos": [ - 3, - 4 - ], - "idx": 1 - }, - { - "pos": [ - 4, - 4 - ], - "idx": 1 - }, - { - "pos": [ - 5, - 4 - ], - "idx": 1 - }, - { - "pos": [ - 6, - 4 - ], - "idx": 1 - }, - { - "pos": [ - 7, - 4 - ], - "idx": 1 - }, - { - "pos": [ - 8, - 4 - ], - "idx": 1 - }, - { - "pos": [ - 9, - 4 - ], - "idx": 1 - }, - { - "pos": [ - 10, - 4 - ], - "idx": 1 - }, - { - "pos": [ - 11, - 4 - ], - "idx": 1 - }, - { - "pos": [ - 12, - 4 - ], - "idx": 1 - }, - { - "pos": [ - 13, - 4 - ], - "idx": 1 - }, - { - "pos": [ - 14, - 4 - ], - "idx": 1 - }, - { - "pos": [ - 15, - 4 - ], - "idx": 1 - }, - { - "pos": [ - 16, - 4 - ], - "idx": 1 - }, - { - "pos": [ - 17, - 4 - ], - "idx": 1 - }, - { - "pos": [ - 18, - 4 - ], - "idx": 1 - }, - { - "pos": [ - 19, - 4 - ], - "idx": 1 - }, - { - "pos": [ - 20, - 4 - ], - "idx": 12 - }, - { - "pos": [ - 21, - 4 - ], - "idx": 8 - }, - { - "pos": [ - 22, - 4 - ], - "idx": 17 - }, - { - "pos": [ - 0, - 3 - ], - "idx": 8 - }, - { - "pos": [ - 1, - 3 - ], - "idx": 8 - }, - { - "pos": [ - 2, - 3 - ], - "idx": 8 - }, - { - "pos": [ - 3, - 3 - ], - "idx": 8 - }, - { - "pos": [ - 4, - 3 - ], - "idx": 8 - }, - { - "pos": [ - 5, - 3 - ], - "idx": 8 - }, - { - "pos": [ - 6, - 3 - ], - "idx": 8 - }, - { - "pos": [ - 7, - 3 - ], - "idx": 8 - }, - { - "pos": [ - 8, - 3 - ], - "idx": 8 - }, - { - "pos": [ - 9, - 3 - ], - "idx": 8 - }, - { - "pos": [ - 10, - 3 - ], - "idx": 8 - }, - { - "pos": [ - 11, - 3 - ], - "idx": 8 - }, - { - "pos": [ - 12, - 3 - ], - "idx": 8 - }, - { - "pos": [ - 13, - 3 - ], - "idx": 8 - }, - { - "pos": [ - 14, - 3 - ], - "idx": 8 - }, - { - "pos": [ - 15, - 3 - ], - "idx": 8 - }, - { - "pos": [ - 16, - 3 - ], - "idx": 8 - }, - { - "pos": [ - 17, - 3 - ], - "idx": 8 - }, - { - "pos": [ - 18, - 3 - ], - "idx": 8 - }, - { - "pos": [ - 19, - 3 - ], - "idx": 8 - }, - { - "pos": [ - 20, - 3 - ], - "idx": 8 - }, - { - "pos": [ - 21, - 3 - ], - "idx": 8 - }, - { - "pos": [ - 22, - 3 - ], - "idx": 8 - }, - { - "pos": [ - 0, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 1, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 2, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 3, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 4, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 5, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 6, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 7, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 8, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 9, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 10, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 11, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 12, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 13, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 14, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 15, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 16, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 17, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 18, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 19, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 20, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 21, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 22, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 0, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 1, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 2, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 3, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 4, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 5, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 6, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 7, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 8, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 9, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 10, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 11, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 12, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 13, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 14, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 15, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 16, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 17, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 18, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 19, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 20, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 21, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 22, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 0, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 1, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 2, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 3, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 4, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 5, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 6, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 7, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 8, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 9, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 10, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 11, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 12, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 13, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 14, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 15, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 16, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 17, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 18, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 19, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 20, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 21, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 22, - 0 - ], - "idx": 8 + "name": "zyrafa02", + "background_color": "7EA8A6", + "grid_size": [23, 26], + "tile_size": [32, 32], + "layers": [ + { + "id": "main layer", + "kind": { + "tile": { + "has_collision": true, + "tiles": [ + { + "pos": [0, 25], + "idx": 8 + }, + { + "pos": [1, 25], + "idx": 8 + }, + { + "pos": [2, 25], + "idx": 8 + }, + { + "pos": [3, 25], + "idx": 8 + }, + { + "pos": [4, 25], + "idx": 8 + }, + { + "pos": [5, 25], + "idx": 8 + }, + { + "pos": [6, 25], + "idx": 8 + }, + { + "pos": [7, 25], + "idx": 8 + }, + { + "pos": [8, 25], + "idx": 8 + }, + { + "pos": [9, 25], + "idx": 8 + }, + { + "pos": [10, 25], + "idx": 8 + }, + { + "pos": [11, 25], + "idx": 8 + }, + { + "pos": [12, 25], + "idx": 8 + }, + { + "pos": [13, 25], + "idx": 8 + }, + { + "pos": [14, 25], + "idx": 8 + }, + { + "pos": [15, 25], + "idx": 8 + }, + { + "pos": [16, 25], + "idx": 8 + }, + { + "pos": [17, 25], + "idx": 8 + }, + { + "pos": [18, 25], + "idx": 8 + }, + { + "pos": [19, 25], + "idx": 8 + }, + { + "pos": [20, 25], + "idx": 8 + }, + { + "pos": [21, 25], + "idx": 8 + }, + { + "pos": [22, 25], + "idx": 8 + }, + { + "pos": [0, 24], + "idx": 8 + }, + { + "pos": [1, 24], + "idx": 8 + }, + { + "pos": [2, 24], + "idx": 8 + }, + { + "pos": [3, 24], + "idx": 8 + }, + { + "pos": [4, 24], + "idx": 8 + }, + { + "pos": [5, 24], + "idx": 8 + }, + { + "pos": [6, 24], + "idx": 8 + }, + { + "pos": [7, 24], + "idx": 8 + }, + { + "pos": [8, 24], + "idx": 8 + }, + { + "pos": [9, 24], + "idx": 8 + }, + { + "pos": [10, 24], + "idx": 8 + }, + { + "pos": [11, 24], + "idx": 8 + }, + { + "pos": [12, 24], + "idx": 8 + }, + { + "pos": [13, 24], + "idx": 8 + }, + { + "pos": [14, 24], + "idx": 8 + }, + { + "pos": [15, 24], + "idx": 8 + }, + { + "pos": [16, 24], + "idx": 8 + }, + { + "pos": [17, 24], + "idx": 8 + }, + { + "pos": [18, 24], + "idx": 8 + }, + { + "pos": [19, 24], + "idx": 8 + }, + { + "pos": [20, 24], + "idx": 8 + }, + { + "pos": [21, 24], + "idx": 8 + }, + { + "pos": [22, 24], + "idx": 8 + }, + { + "pos": [0, 23], + "idx": 8 + }, + { + "pos": [1, 23], + "idx": 8 + }, + { + "pos": [2, 23], + "idx": 8 + }, + { + "pos": [3, 23], + "idx": 8 + }, + { + "pos": [4, 23], + "idx": 8 + }, + { + "pos": [5, 23], + "idx": 8 + }, + { + "pos": [6, 23], + "idx": 8 + }, + { + "pos": [7, 23], + "idx": 8 + }, + { + "pos": [8, 23], + "idx": 8 + }, + { + "pos": [9, 23], + "idx": 8 + }, + { + "pos": [10, 23], + "idx": 8 + }, + { + "pos": [11, 23], + "idx": 8 + }, + { + "pos": [12, 23], + "idx": 8 + }, + { + "pos": [13, 23], + "idx": 8 + }, + { + "pos": [14, 23], + "idx": 8 + }, + { + "pos": [15, 23], + "idx": 8 + }, + { + "pos": [16, 23], + "idx": 8 + }, + { + "pos": [17, 23], + "idx": 8 + }, + { + "pos": [18, 23], + "idx": 8 + }, + { + "pos": [19, 23], + "idx": 8 + }, + { + "pos": [20, 23], + "idx": 8 + }, + { + "pos": [21, 23], + "idx": 8 + }, + { + "pos": [22, 23], + "idx": 8 + }, + { + "pos": [0, 22], + "idx": 3 + }, + { + "pos": [1, 22], + "idx": 8 + }, + { + "pos": [2, 22], + "idx": 8 + }, + { + "pos": [3, 22], + "idx": 4 + }, + { + "pos": [4, 22], + "idx": 4 + }, + { + "pos": [5, 22], + "idx": 15 + }, + { + "pos": [6, 22], + "idx": 15 + }, + { + "pos": [7, 22], + "idx": 15 + }, + { + "pos": [8, 22], + "idx": 15 + }, + { + "pos": [9, 22], + "idx": 15 + }, + { + "pos": [10, 22], + "idx": 15 + }, + { + "pos": [11, 22], + "idx": 15 + }, + { + "pos": [12, 22], + "idx": 15 + }, + { + "pos": [13, 22], + "idx": 15 + }, + { + "pos": [14, 22], + "idx": 15 + }, + { + "pos": [15, 22], + "idx": 15 + }, + { + "pos": [16, 22], + "idx": 15 + }, + { + "pos": [17, 22], + "idx": 15 + }, + { + "pos": [18, 22], + "idx": 5 + }, + { + "pos": [19, 22], + "idx": 5 + }, + { + "pos": [20, 22], + "idx": 8 + }, + { + "pos": [21, 22], + "idx": 8 + }, + { + "pos": [22, 22], + "idx": 3 + }, + { + "pos": [0, 21], + "idx": 10 + }, + { + "pos": [1, 21], + "idx": 8 + }, + { + "pos": [2, 21], + "idx": 4 + }, + { + "pos": [3, 21], + "idx": 16 + }, + { + "pos": [4, 21], + "idx": 9 + }, + { + "pos": [18, 21], + "idx": 7 + }, + { + "pos": [19, 21], + "idx": 14 + }, + { + "pos": [20, 21], + "idx": 5 + }, + { + "pos": [21, 21], + "idx": 8 + }, + { + "pos": [22, 21], + "idx": 10 + }, + { + "pos": [0, 20], + "idx": 10 + }, + { + "pos": [1, 20], + "idx": 8 + }, + { + "pos": [2, 20], + "idx": 4 + }, + { + "pos": [3, 20], + "idx": 15 + }, + { + "pos": [4, 20], + "idx": 16 + }, + { + "pos": [18, 20], + "idx": 14 + }, + { + "pos": [19, 20], + "idx": 15 + }, + { + "pos": [20, 20], + "idx": 5 + }, + { + "pos": [21, 20], + "idx": 8 + }, + { + "pos": [22, 20], + "idx": 10 + }, + { + "pos": [0, 19], + "idx": 10 + }, + { + "pos": [1, 19], + "idx": 8 + }, + { + "pos": [2, 19], + "idx": 9 + }, + { + "pos": [20, 19], + "idx": 7 + }, + { + "pos": [21, 19], + "idx": 8 + }, + { + "pos": [22, 19], + "idx": 10 + }, + { + "pos": [0, 18], + "idx": 10 + }, + { + "pos": [1, 18], + "idx": 8 + }, + { + "pos": [2, 18], + "idx": 9 + }, + { + "pos": [20, 18], + "idx": 7 + }, + { + "pos": [21, 18], + "idx": 8 + }, + { + "pos": [22, 18], + "idx": 10 + }, + { + "pos": [0, 17], + "idx": 10 + }, + { + "pos": [1, 17], + "idx": 8 + }, + { + "pos": [2, 17], + "idx": 9 + }, + { + "pos": [20, 17], + "idx": 7 + }, + { + "pos": [21, 17], + "idx": 8 + }, + { + "pos": [22, 17], + "idx": 10 + }, + { + "pos": [0, 16], + "idx": 10 + }, + { + "pos": [1, 16], + "idx": 8 + }, + { + "pos": [2, 16], + "idx": 9 + }, + { + "pos": [20, 16], + "idx": 7 + }, + { + "pos": [21, 16], + "idx": 8 + }, + { + "pos": [22, 16], + "idx": 10 + }, + { + "pos": [0, 15], + "idx": 10 + }, + { + "pos": [1, 15], + "idx": 8 + }, + { + "pos": [2, 15], + "idx": 9 + }, + { + "pos": [7, 15], + "idx": 56, + "jump_through": true + }, + { + "pos": [8, 15], + "idx": 58, + "jump_through": true + }, + { + "pos": [9, 15], + "idx": 58, + "jump_through": true + }, + { + "pos": [10, 15], + "idx": 58, + "jump_through": true + }, + { + "pos": [11, 15], + "idx": 24 + }, + { + "pos": [12, 15], + "idx": 58, + "jump_through": true + }, + { + "pos": [13, 15], + "idx": 58, + "jump_through": true + }, + { + "pos": [14, 15], + "idx": 58, + "jump_through": true + }, + { + "pos": [15, 15], + "idx": 60, + "jump_through": true + }, + { + "pos": [20, 15], + "idx": 7 + }, + { + "pos": [21, 15], + "idx": 8 + }, + { + "pos": [22, 15], + "idx": 10 + }, + { + "pos": [0, 14], + "idx": 10 + }, + { + "pos": [1, 14], + "idx": 8 + }, + { + "pos": [2, 14], + "idx": 9 + }, + { + "pos": [20, 14], + "idx": 7 + }, + { + "pos": [21, 14], + "idx": 8 + }, + { + "pos": [22, 14], + "idx": 10 + }, + { + "pos": [0, 13], + "idx": 10 + }, + { + "pos": [1, 13], + "idx": 8 + }, + { + "pos": [2, 13], + "idx": 9 + }, + { + "pos": [3, 13], + "idx": 58, + "jump_through": true + }, + { + "pos": [4, 13], + "idx": 60, + "jump_through": true + }, + { + "pos": [18, 13], + "idx": 56, + "jump_through": true + }, + { + "pos": [19, 13], + "idx": 58, + "jump_through": true + }, + { + "pos": [20, 13], + "idx": 7 + }, + { + "pos": [21, 13], + "idx": 8 + }, + { + "pos": [22, 13], + "idx": 10 + }, + { + "pos": [0, 12], + "idx": 10 + }, + { + "pos": [1, 12], + "idx": 8 + }, + { + "pos": [2, 12], + "idx": 9 + }, + { + "pos": [20, 12], + "idx": 7 + }, + { + "pos": [21, 12], + "idx": 8 + }, + { + "pos": [22, 12], + "idx": 10 + }, + { + "pos": [0, 11], + "idx": 10 + }, + { + "pos": [1, 11], + "idx": 8 + }, + { + "pos": [2, 11], + "idx": 9 + }, + { + "pos": [20, 11], + "idx": 7 + }, + { + "pos": [21, 11], + "idx": 8 + }, + { + "pos": [22, 11], + "idx": 10 + }, + { + "pos": [0, 10], + "idx": 10 + }, + { + "pos": [1, 10], + "idx": 8 + }, + { + "pos": [2, 10], + "idx": 9 + }, + { + "pos": [6, 10], + "idx": 56, + "jump_through": true + }, + { + "pos": [7, 10], + "idx": 58, + "jump_through": true + }, + { + "pos": [8, 10], + "idx": 58, + "jump_through": true + }, + { + "pos": [9, 10], + "idx": 58, + "jump_through": true + }, + { + "pos": [10, 10], + "idx": 21 + }, + { + "pos": [11, 10], + "idx": 22 + }, + { + "pos": [12, 10], + "idx": 23 + }, + { + "pos": [13, 10], + "idx": 58, + "jump_through": true + }, + { + "pos": [14, 10], + "idx": 58, + "jump_through": true + }, + { + "pos": [15, 10], + "idx": 58, + "jump_through": true + }, + { + "pos": [16, 10], + "idx": 60, + "jump_through": true + }, + { + "pos": [20, 10], + "idx": 7 + }, + { + "pos": [21, 10], + "idx": 8 + }, + { + "pos": [22, 10], + "idx": 10 + }, + { + "pos": [0, 9], + "idx": 10 + }, + { + "pos": [1, 9], + "idx": 8 + }, + { + "pos": [2, 9], + "idx": 9 + }, + { + "pos": [10, 9], + "idx": 7 + }, + { + "pos": [11, 9], + "idx": 8 + }, + { + "pos": [12, 9], + "idx": 9 + }, + { + "pos": [20, 9], + "idx": 7 + }, + { + "pos": [21, 9], + "idx": 8 + }, + { + "pos": [22, 9], + "idx": 10 + }, + { + "pos": [0, 8], + "idx": 10 + }, + { + "pos": [1, 8], + "idx": 8 + }, + { + "pos": [2, 8], + "idx": 9 + }, + { + "pos": [10, 8], + "idx": 7 + }, + { + "pos": [11, 8], + "idx": 8 + }, + { + "pos": [12, 8], + "idx": 9 + }, + { + "pos": [20, 8], + "idx": 7 + }, + { + "pos": [21, 8], + "idx": 8 + }, + { + "pos": [22, 8], + "idx": 10 + }, + { + "pos": [0, 7], + "idx": 10 + }, + { + "pos": [1, 7], + "idx": 8 + }, + { + "pos": [2, 7], + "idx": 9 + }, + { + "pos": [3, 7], + "idx": 58, + "jump_through": true + }, + { + "pos": [4, 7], + "idx": 60, + "jump_through": true + }, + { + "pos": [10, 7], + "idx": 14 + }, + { + "pos": [11, 7], + "idx": 15 + }, + { + "pos": [12, 7], + "idx": 16 + }, + { + "pos": [18, 7], + "idx": 56, + "jump_through": true + }, + { + "pos": [19, 7], + "idx": 58, + "jump_through": true + }, + { + "pos": [20, 7], + "idx": 7 + }, + { + "pos": [21, 7], + "idx": 8 + }, + { + "pos": [22, 7], + "idx": 10 + }, + { + "pos": [0, 6], + "idx": 10 + }, + { + "pos": [1, 6], + "idx": 8 + }, + { + "pos": [2, 6], + "idx": 9 + }, + { + "pos": [20, 6], + "idx": 7 + }, + { + "pos": [21, 6], + "idx": 8 + }, + { + "pos": [22, 6], + "idx": 10 + }, + { + "pos": [0, 5], + "idx": 10 + }, + { + "pos": [1, 5], + "idx": 8 + }, + { + "pos": [2, 5], + "idx": 9 + }, + { + "pos": [3, 5], + "idx": 1 + }, + { + "pos": [4, 5], + "idx": 2 + }, + { + "pos": [18, 5], + "idx": 0 + }, + { + "pos": [19, 5], + "idx": 1 + }, + { + "pos": [20, 5], + "idx": 7 + }, + { + "pos": [21, 5], + "idx": 8 + }, + { + "pos": [22, 5], + "idx": 10 + }, + { + "pos": [0, 4], + "idx": 17 + }, + { + "pos": [1, 4], + "idx": 8 + }, + { + "pos": [2, 4], + "idx": 11 + }, + { + "pos": [3, 4], + "idx": 1 + }, + { + "pos": [4, 4], + "idx": 1 + }, + { + "pos": [5, 4], + "idx": 1 + }, + { + "pos": [6, 4], + "idx": 1 + }, + { + "pos": [7, 4], + "idx": 1 + }, + { + "pos": [8, 4], + "idx": 1 + }, + { + "pos": [9, 4], + "idx": 1 + }, + { + "pos": [10, 4], + "idx": 1 + }, + { + "pos": [11, 4], + "idx": 1 + }, + { + "pos": [12, 4], + "idx": 1 + }, + { + "pos": [13, 4], + "idx": 1 + }, + { + "pos": [14, 4], + "idx": 1 + }, + { + "pos": [15, 4], + "idx": 1 + }, + { + "pos": [16, 4], + "idx": 1 + }, + { + "pos": [17, 4], + "idx": 1 + }, + { + "pos": [18, 4], + "idx": 1 + }, + { + "pos": [19, 4], + "idx": 1 + }, + { + "pos": [20, 4], + "idx": 12 + }, + { + "pos": [21, 4], + "idx": 8 + }, + { + "pos": [22, 4], + "idx": 17 + }, + { + "pos": [0, 3], + "idx": 8 + }, + { + "pos": [1, 3], + "idx": 8 + }, + { + "pos": [2, 3], + "idx": 8 + }, + { + "pos": [3, 3], + "idx": 8 + }, + { + "pos": [4, 3], + "idx": 8 + }, + { + "pos": [5, 3], + "idx": 8 + }, + { + "pos": [6, 3], + "idx": 8 + }, + { + "pos": [7, 3], + "idx": 8 + }, + { + "pos": [8, 3], + "idx": 8 + }, + { + "pos": [9, 3], + "idx": 8 + }, + { + "pos": [10, 3], + "idx": 8 + }, + { + "pos": [11, 3], + "idx": 8 + }, + { + "pos": [12, 3], + "idx": 8 + }, + { + "pos": [13, 3], + "idx": 8 + }, + { + "pos": [14, 3], + "idx": 8 + }, + { + "pos": [15, 3], + "idx": 8 + }, + { + "pos": [16, 3], + "idx": 8 + }, + { + "pos": [17, 3], + "idx": 8 + }, + { + "pos": [18, 3], + "idx": 8 + }, + { + "pos": [19, 3], + "idx": 8 + }, + { + "pos": [20, 3], + "idx": 8 + }, + { + "pos": [21, 3], + "idx": 8 + }, + { + "pos": [22, 3], + "idx": 8 + }, + { + "pos": [0, 2], + "idx": 8 + }, + { + "pos": [1, 2], + "idx": 8 + }, + { + "pos": [2, 2], + "idx": 8 + }, + { + "pos": [3, 2], + "idx": 8 + }, + { + "pos": [4, 2], + "idx": 8 + }, + { + "pos": [5, 2], + "idx": 8 + }, + { + "pos": [6, 2], + "idx": 8 + }, + { + "pos": [7, 2], + "idx": 8 + }, + { + "pos": [8, 2], + "idx": 8 + }, + { + "pos": [9, 2], + "idx": 8 + }, + { + "pos": [10, 2], + "idx": 8 + }, + { + "pos": [11, 2], + "idx": 8 + }, + { + "pos": [12, 2], + "idx": 8 + }, + { + "pos": [13, 2], + "idx": 8 + }, + { + "pos": [14, 2], + "idx": 8 + }, + { + "pos": [15, 2], + "idx": 8 + }, + { + "pos": [16, 2], + "idx": 8 + }, + { + "pos": [17, 2], + "idx": 8 + }, + { + "pos": [18, 2], + "idx": 8 + }, + { + "pos": [19, 2], + "idx": 8 + }, + { + "pos": [20, 2], + "idx": 8 + }, + { + "pos": [21, 2], + "idx": 8 + }, + { + "pos": [22, 2], + "idx": 8 + }, + { + "pos": [0, 1], + "idx": 8 + }, + { + "pos": [1, 1], + "idx": 8 + }, + { + "pos": [2, 1], + "idx": 8 + }, + { + "pos": [3, 1], + "idx": 8 + }, + { + "pos": [4, 1], + "idx": 8 + }, + { + "pos": [5, 1], + "idx": 8 + }, + { + "pos": [6, 1], + "idx": 8 + }, + { + "pos": [7, 1], + "idx": 8 + }, + { + "pos": [8, 1], + "idx": 8 + }, + { + "pos": [9, 1], + "idx": 8 + }, + { + "pos": [10, 1], + "idx": 8 + }, + { + "pos": [11, 1], + "idx": 8 + }, + { + "pos": [12, 1], + "idx": 8 + }, + { + "pos": [13, 1], + "idx": 8 + }, + { + "pos": [14, 1], + "idx": 8 + }, + { + "pos": [15, 1], + "idx": 8 + }, + { + "pos": [16, 1], + "idx": 8 + }, + { + "pos": [17, 1], + "idx": 8 + }, + { + "pos": [18, 1], + "idx": 8 + }, + { + "pos": [19, 1], + "idx": 8 + }, + { + "pos": [20, 1], + "idx": 8 + }, + { + "pos": [21, 1], + "idx": 8 + }, + { + "pos": [22, 1], + "idx": 8 + }, + { + "pos": [0, 0], + "idx": 8 + }, + { + "pos": [1, 0], + "idx": 8 + }, + { + "pos": [2, 0], + "idx": 8 + }, + { + "pos": [3, 0], + "idx": 8 + }, + { + "pos": [4, 0], + "idx": 8 + }, + { + "pos": [5, 0], + "idx": 8 + }, + { + "pos": [6, 0], + "idx": 8 + }, + { + "pos": [7, 0], + "idx": 8 + }, + { + "pos": [8, 0], + "idx": 8 + }, + { + "pos": [9, 0], + "idx": 8 + }, + { + "pos": [10, 0], + "idx": 8 + }, + { + "pos": [11, 0], + "idx": 8 + }, + { + "pos": [12, 0], + "idx": 8 + }, + { + "pos": [13, 0], + "idx": 8 + }, + { + "pos": [14, 0], + "idx": 8 + }, + { + "pos": [15, 0], + "idx": 8 + }, + { + "pos": [16, 0], + "idx": 8 + }, + { + "pos": [17, 0], + "idx": 8 + }, + { + "pos": [18, 0], + "idx": 8 + }, + { + "pos": [19, 0], + "idx": 8 + }, + { + "pos": [20, 0], + "idx": 8 + }, + { + "pos": [21, 0], + "idx": 8 + }, + { + "pos": [22, 0], + "idx": 8 + } + ], + "tilemap": "../resources/default_tileset.atlas.yaml" + } } - ], - "tilemap": "../resources/default_tileset.png" - } - } - }, - { - "id": "decorations", - "kind": { - "element": { - "elements": [ - { - "pos": [ - 440, - 185.5 - ], - "element": "../elements/decoration/anemones/anemones.element.yaml" - }, - { - "pos": [ - 216, - 185.5 - ], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" - }, - { - "pos": [ - 376, - 377.5 - ], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" - }, - { - "pos": [ - 600, - 217.5 - ], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" - }, - { - "pos": [ - 120, - 473.5 - ], - "element": "../elements/decoration/anemones/anemones.element.yaml" + }, + { + "id": "decorations", + "kind": { + "element": { + "elements": [ + { + "pos": [440, 185.5], + "element": "/elements/decoration/anemones/anemones.element.yaml" + }, + { + "pos": [216, 185.5], + "element": "/elements/decoration/seaweed/seaweed.element.yaml" + }, + { + "pos": [376, 377.5], + "element": "/elements/decoration/seaweed/seaweed.element.yaml" + }, + { + "pos": [600, 217.5], + "element": "/elements/decoration/seaweed/seaweed.element.yaml" + }, + { + "pos": [120, 473.5], + "element": "/elements/decoration/anemones/anemones.element.yaml" + } + ] + } } - ] - } - } - }, - { - "id": "items", - "kind": { - "element": { - "elements": [ - { - "pos": [ - 436.90920000000006, - 363.5 - ], - "element": "../elements/environment/crab/crab.element.yaml" - }, - { - "pos": [ - 373.33326, - 513.5 - ], - "element": "../elements/environment/crab/crab.element.yaml" - }, - { - "pos": [ - 381.99987999999996, - 401.5 - ], - "element": "../elements/environment/fish_school/fish_school.element.yaml" - }, - { - "pos": [ - 216.49993999999998, - 209.5 - ], - "element": "../elements/environment/fish_school/fish_school.element.yaml" - }, - { - "pos": [ - 264, - 521.5 - ], - "element": "../elements/item/musket/musket.element.yaml" - }, - { - "pos": [ - 455.11120000000005, - 521.5 - ], - "element": "../elements/item/musket/musket.element.yaml" - }, - { - "pos": [ - 232.22222, - 367.5 - ], - "element": "../elements/item/musket/musket.element.yaml" - }, - { - "pos": [ - 488, - 361.5 - ], - "element": "../elements/item/musket/musket.element.yaml" - }, - { - "pos": [ - 352, - 177.5 - ], - "element": "../elements/item/sword/sword.element.yaml" + }, + { + "id": "items", + "kind": { + "element": { + "elements": [ + { + "pos": [436.90920000000006, 363.5], + "element": "/elements/environment/crab/crab.element.yaml" + }, + { + "pos": [373.33326, 513.5], + "element": "/elements/environment/crab/crab.element.yaml" + }, + { + "pos": [381.99987999999996, 401.5], + "element": "/elements/environment/fish_school/fish_school.element.yaml" + }, + { + "pos": [216.49993999999998, 209.5], + "element": "/elements/environment/fish_school/fish_school.element.yaml" + }, + { + "pos": [264, 521.5], + "element": "/elements/item/musket/musket.element.yaml" + }, + { + "pos": [455.11120000000005, 521.5], + "element": "/elements/item/musket/musket.element.yaml" + }, + { + "pos": [232.22222, 367.5], + "element": "/elements/item/musket/musket.element.yaml" + }, + { + "pos": [488, 361.5], + "element": "/elements/item/musket/musket.element.yaml" + }, + { + "pos": [352, 177.5], + "element": "/elements/item/sword/sword.element.yaml" + } + ] + } } - ] - } - } - }, - { - "id": "spawners", - "kind": { - "element": { - "elements": [ - { - "pos": [ - 128, - 480 - ], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" - }, - { - "pos": [ - 608, - 480 - ], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" - }, - { - "pos": [ - 128, - 288 - ], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" - }, - { - "pos": [ - 608, - 288 - ], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" + }, + { + "id": "spawners", + "kind": { + "element": { + "elements": [ + { + "pos": [128, 480], + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" + }, + { + "pos": [608, 480], + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" + }, + { + "pos": [128, 288], + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" + }, + { + "pos": [608, 288], + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" + } + ] + } } - ] } - } - } - ], - "background_layers": [ - { - "image": "../resources/background_04.png", - "speed": 0, - "tile_size": [ - 896, - 480 - ], - "z": -110, - "position": [ - 0, - 360 - ], - "scale": 2 - }, - { - "image": "../resources/background_03.png", - "speed": 0.74, - "tile_size": [ - 896, - 480 - ], - "z": -109, - "position": [ - 0, - 360 - ], - "scale": 2 - }, - { - "image": "../resources/background_02.png", - "speed": 0.82, - "tile_size": [ - 896, - 480 - ], - "z": -108, - "position": [ - 0, - 360 - ], - "scale": 2 - }, - { - "image": "../resources/background_01.png", - "speed": 100, - "tile_size": [ - 896, - 480 - ], - "z": -107, - "position": [ - 0, - 360 - ], - "scale": 2 - } - ] -} \ No newline at end of file + ], + "background_layers": [ + { + "image": "../resources/background_04.png", + "speed": 0, + "tile_size": [896, 480], + "z": -110, + "position": [0, 360], + "scale": 2 + }, + { + "image": "../resources/background_03.png", + "speed": 0.74, + "tile_size": [896, 480], + "z": -109, + "position": [0, 360], + "scale": 2 + }, + { + "image": "../resources/background_02.png", + "speed": 0.82, + "tile_size": [896, 480], + "z": -108, + "position": [0, 360], + "scale": 2 + }, + { + "image": "../resources/background_01.png", + "speed": 100, + "tile_size": [896, 480], + "z": -107, + "position": [0, 360], + "scale": 2 + } + ] +} diff --git a/assets/map/levels/zyrafa03.map.json b/assets/map/levels/zyrafa03.map.json index 09b50190ca..25370025af 100644 --- a/assets/map/levels/zyrafa03.map.json +++ b/assets/map/levels/zyrafa03.map.json @@ -1,2077 +1,1204 @@ { - "name": "zyrafa03", - "background_color": "7EA8A6", - "grid_size": [ - 27, - 22 - ], - "tile_size": [ - 32, - 32 - ], - "layers": [ - { - "id": "main layer", - "kind": { - "tile": { - "has_collision": true, - "tiles": [ - { - "pos": [ - 0, - 21 - ], - "idx": 8 - }, - { - "pos": [ - 1, - 21 - ], - "idx": 8 - }, - { - "pos": [ - 2, - 21 - ], - "idx": 8 - }, - { - "pos": [ - 3, - 21 - ], - "idx": 8 - }, - { - "pos": [ - 4, - 21 - ], - "idx": 8 - }, - { - "pos": [ - 5, - 21 - ], - "idx": 8 - }, - { - "pos": [ - 6, - 21 - ], - "idx": 8 - }, - { - "pos": [ - 7, - 21 - ], - "idx": 8 - }, - { - "pos": [ - 8, - 21 - ], - "idx": 8 - }, - { - "pos": [ - 9, - 21 - ], - "idx": 8 - }, - { - "pos": [ - 10, - 21 - ], - "idx": 8 - }, - { - "pos": [ - 11, - 21 - ], - "idx": 8 - }, - { - "pos": [ - 12, - 21 - ], - "idx": 8 - }, - { - "pos": [ - 13, - 21 - ], - "idx": 8 - }, - { - "pos": [ - 14, - 21 - ], - "idx": 8 - }, - { - "pos": [ - 15, - 21 - ], - "idx": 8 - }, - { - "pos": [ - 16, - 21 - ], - "idx": 8 - }, - { - "pos": [ - 17, - 21 - ], - "idx": 8 - }, - { - "pos": [ - 18, - 21 - ], - "idx": 8 - }, - { - "pos": [ - 19, - 21 - ], - "idx": 8 - }, - { - "pos": [ - 20, - 21 - ], - "idx": 8 - }, - { - "pos": [ - 21, - 21 - ], - "idx": 8 - }, - { - "pos": [ - 22, - 21 - ], - "idx": 8 - }, - { - "pos": [ - 23, - 21 - ], - "idx": 8 - }, - { - "pos": [ - 24, - 21 - ], - "idx": 8 - }, - { - "pos": [ - 25, - 21 - ], - "idx": 8 - }, - { - "pos": [ - 26, - 21 - ], - "idx": 8 - }, - { - "pos": [ - 0, - 20 - ], - "idx": 4 - }, - { - "pos": [ - 1, - 20 - ], - "idx": 15 - }, - { - "pos": [ - 2, - 20 - ], - "idx": 15 - }, - { - "pos": [ - 3, - 20 - ], - "idx": 15 - }, - { - "pos": [ - 4, - 20 - ], - "idx": 15 - }, - { - "pos": [ - 5, - 20 - ], - "idx": 15 - }, - { - "pos": [ - 6, - 20 - ], - "idx": 15 - }, - { - "pos": [ - 7, - 20 - ], - "idx": 15 - }, - { - "pos": [ - 8, - 20 - ], - "idx": 15 - }, - { - "pos": [ - 9, - 20 - ], - "idx": 15 - }, - { - "pos": [ - 10, - 20 - ], - "idx": 15 - }, - { - "pos": [ - 11, - 20 - ], - "idx": 15 - }, - { - "pos": [ - 12, - 20 - ], - "idx": 15 - }, - { - "pos": [ - 13, - 20 - ], - "idx": 15 - }, - { - "pos": [ - 14, - 20 - ], - "idx": 15 - }, - { - "pos": [ - 15, - 20 - ], - "idx": 15 - }, - { - "pos": [ - 16, - 20 - ], - "idx": 15 - }, - { - "pos": [ - 17, - 20 - ], - "idx": 15 - }, - { - "pos": [ - 18, - 20 - ], - "idx": 15 - }, - { - "pos": [ - 19, - 20 - ], - "idx": 15 - }, - { - "pos": [ - 20, - 20 - ], - "idx": 15 - }, - { - "pos": [ - 21, - 20 - ], - "idx": 15 - }, - { - "pos": [ - 22, - 20 - ], - "idx": 15 - }, - { - "pos": [ - 23, - 20 - ], - "idx": 15 - }, - { - "pos": [ - 24, - 20 - ], - "idx": 15 - }, - { - "pos": [ - 25, - 20 - ], - "idx": 15 - }, - { - "pos": [ - 26, - 20 - ], - "idx": 5 - }, - { - "pos": [ - 0, - 19 - ], - "idx": 9 - }, - { - "pos": [ - 1, - 19 - ], - "idx": 58 - }, - { - "pos": [ - 2, - 19 - ], - "idx": 58 - }, - { - "pos": [ - 3, - 19 - ], - "idx": 58 - }, - { - "pos": [ - 4, - 19 - ], - "idx": 58 - }, - { - "pos": [ - 5, - 19 - ], - "idx": 58 - }, - { - "pos": [ - 6, - 19 - ], - "idx": 58 - }, - { - "pos": [ - 7, - 19 - ], - "idx": 58 - }, - { - "pos": [ - 8, - 19 - ], - "idx": 58 - }, - { - "pos": [ - 9, - 19 - ], - "idx": 58 - }, - { - "pos": [ - 10, - 19 - ], - "idx": 58 - }, - { - "pos": [ - 11, - 19 - ], - "idx": 58 - }, - { - "pos": [ - 12, - 19 - ], - "idx": 58 - }, - { - "pos": [ - 13, - 19 - ], - "idx": 58 - }, - { - "pos": [ - 14, - 19 - ], - "idx": 58 - }, - { - "pos": [ - 15, - 19 - ], - "idx": 58 - }, - { - "pos": [ - 16, - 19 - ], - "idx": 58 - }, - { - "pos": [ - 17, - 19 - ], - "idx": 58 - }, - { - "pos": [ - 18, - 19 - ], - "idx": 58 - }, - { - "pos": [ - 19, - 19 - ], - "idx": 58 - }, - { - "pos": [ - 20, - 19 - ], - "idx": 58 - }, - { - "pos": [ - 21, - 19 - ], - "idx": 58 - }, - { - "pos": [ - 22, - 19 - ], - "idx": 58 - }, - { - "pos": [ - 23, - 19 - ], - "idx": 58 - }, - { - "pos": [ - 24, - 19 - ], - "idx": 58 - }, - { - "pos": [ - 25, - 19 - ], - "idx": 58 - }, - { - "pos": [ - 26, - 19 - ], - "idx": 7 - }, - { - "pos": [ - 0, - 18 - ], - "idx": 9 - }, - { - "pos": [ - 26, - 18 - ], - "idx": 7 - }, - { - "pos": [ - 0, - 17 - ], - "idx": 9 - }, - { - "pos": [ - 26, - 17 - ], - "idx": 7 - }, - { - "pos": [ - 0, - 16 - ], - "idx": 9 - }, - { - "pos": [ - 26, - 16 - ], - "idx": 7 - }, - { - "pos": [ - 0, - 15 - ], - "idx": 9 - }, - { - "pos": [ - 26, - 15 - ], - "idx": 7 - }, - { - "pos": [ - 0, - 14 - ], - "idx": 9 - }, - { - "pos": [ - 26, - 14 - ], - "idx": 7 - }, - { - "pos": [ - 0, - 13 - ], - "idx": 9 - }, - { - "pos": [ - 6, - 13 - ], - "idx": 21 - }, - { - "pos": [ - 7, - 13 - ], - "idx": 22 - }, - { - "pos": [ - 8, - 13 - ], - "idx": 22 - }, - { - "pos": [ - 9, - 13 - ], - "idx": 22 - }, - { - "pos": [ - 10, - 13 - ], - "idx": 23 - }, - { - "pos": [ - 16, - 13 - ], - "idx": 21 - }, - { - "pos": [ - 17, - 13 - ], - "idx": 22 - }, - { - "pos": [ - 18, - 13 - ], - "idx": 22 - }, - { - "pos": [ - 19, - 13 - ], - "idx": 22 - }, - { - "pos": [ - 20, - 13 - ], - "idx": 23 - }, - { - "pos": [ - 26, - 13 - ], - "idx": 7 - }, - { - "pos": [ - 0, - 12 - ], - "idx": 9 - }, - { - "pos": [ - 26, - 12 - ], - "idx": 7 - }, - { - "pos": [ - 0, - 11 - ], - "idx": 9 - }, - { - "pos": [ - 26, - 11 - ], - "idx": 7 - }, - { - "pos": [ - 0, - 10 - ], - "idx": 9 - }, - { - "pos": [ - 1, - 10 - ], - "idx": 58 - }, - { - "pos": [ - 2, - 10 - ], - "idx": 60 - }, - { - "pos": [ - 12, - 10 - ], - "idx": 56 - }, - { - "pos": [ - 13, - 10 - ], - "idx": 58 - }, - { - "pos": [ - 14, - 10 - ], - "idx": 60 - }, - { - "pos": [ - 24, - 10 - ], - "idx": 56 - }, - { - "pos": [ - 25, - 10 - ], - "idx": 58 - }, - { - "pos": [ - 26, - 10 - ], - "idx": 7 - }, - { - "pos": [ - 0, - 9 - ], - "idx": 9 - }, - { - "pos": [ - 26, - 9 - ], - "idx": 7 - }, - { - "pos": [ - 0, - 8 - ], - "idx": 9 - }, - { - "pos": [ - 26, - 8 - ], - "idx": 7 - }, - { - "pos": [ - 0, - 7 - ], - "idx": 9 - }, - { - "pos": [ - 13, - 7 - ], - "idx": 3 - }, - { - "pos": [ - 26, - 7 - ], - "idx": 7 - }, - { - "pos": [ - 0, - 6 - ], - "idx": 11 - }, - { - "pos": [ - 1, - 6 - ], - "idx": 1 - }, - { - "pos": [ - 2, - 6 - ], - "idx": 1 - }, - { - "pos": [ - 3, - 6 - ], - "idx": 2 - }, - { - "pos": [ - 13, - 6 - ], - "idx": 10 - }, - { - "pos": [ - 23, - 6 - ], - "idx": 0 - }, - { - "pos": [ - 24, - 6 - ], - "idx": 1 - }, - { - "pos": [ - 25, - 6 - ], - "idx": 1 - }, - { - "pos": [ - 26, - 6 - ], - "idx": 12 - }, - { - "pos": [ - 0, - 5 - ], - "idx": 8 - }, - { - "pos": [ - 1, - 5 - ], - "idx": 8 - }, - { - "pos": [ - 2, - 5 - ], - "idx": 11 - }, - { - "pos": [ - 3, - 5 - ], - "idx": 9 - }, - { - "pos": [ - 13, - 5 - ], - "idx": 10 - }, - { - "pos": [ - 23, - 5 - ], - "idx": 7 - }, - { - "pos": [ - 24, - 5 - ], - "idx": 12 - }, - { - "pos": [ - 25, - 5 - ], - "idx": 8 - }, - { - "pos": [ - 26, - 5 - ], - "idx": 8 - }, - { - "pos": [ - 0, - 4 - ], - "idx": 8 - }, - { - "pos": [ - 1, - 4 - ], - "idx": 8 - }, - { - "pos": [ - 2, - 4 - ], - "idx": 8 - }, - { - "pos": [ - 3, - 4 - ], - "idx": 9 - }, - { - "pos": [ - 13, - 4 - ], - "idx": 10 - }, - { - "pos": [ - 23, - 4 - ], - "idx": 7 - }, - { - "pos": [ - 24, - 4 - ], - "idx": 8 - }, - { - "pos": [ - 25, - 4 - ], - "idx": 8 - }, - { - "pos": [ - 26, - 4 - ], - "idx": 8 - }, - { - "pos": [ - 0, - 3 - ], - "idx": 8 - }, - { - "pos": [ - 1, - 3 - ], - "idx": 8 - }, - { - "pos": [ - 2, - 3 - ], - "idx": 8 - }, - { - "pos": [ - 3, - 3 - ], - "idx": 11 - }, - { - "pos": [ - 4, - 3 - ], - "idx": 1 - }, - { - "pos": [ - 5, - 3 - ], - "idx": 1 - }, - { - "pos": [ - 6, - 3 - ], - "idx": 1 - }, - { - "pos": [ - 7, - 3 - ], - "idx": 1 - }, - { - "pos": [ - 8, - 3 - ], - "idx": 1 - }, - { - "pos": [ - 9, - 3 - ], - "idx": 1 - }, - { - "pos": [ - 10, - 3 - ], - "idx": 1 - }, - { - "pos": [ - 11, - 3 - ], - "idx": 1 - }, - { - "pos": [ - 12, - 3 - ], - "idx": 1 - }, - { - "pos": [ - 13, - 3 - ], - "idx": 6 - }, - { - "pos": [ - 14, - 3 - ], - "idx": 1 - }, - { - "pos": [ - 15, - 3 - ], - "idx": 1 - }, - { - "pos": [ - 16, - 3 - ], - "idx": 1 - }, - { - "pos": [ - 17, - 3 - ], - "idx": 1 - }, - { - "pos": [ - 18, - 3 - ], - "idx": 1 - }, - { - "pos": [ - 19, - 3 - ], - "idx": 1 - }, - { - "pos": [ - 20, - 3 - ], - "idx": 1 - }, - { - "pos": [ - 21, - 3 - ], - "idx": 1 - }, - { - "pos": [ - 22, - 3 - ], - "idx": 1 - }, - { - "pos": [ - 23, - 3 - ], - "idx": 12 - }, - { - "pos": [ - 24, - 3 - ], - "idx": 8 - }, - { - "pos": [ - 25, - 3 - ], - "idx": 8 - }, - { - "pos": [ - 26, - 3 - ], - "idx": 8 - }, - { - "pos": [ - 0, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 1, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 2, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 3, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 4, - 2 - ], - "idx": 1 - }, - { - "pos": [ - 5, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 6, - 2 - ], - "idx": 1 - }, - { - "pos": [ - 7, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 8, - 2 - ], - "idx": 1 - }, - { - "pos": [ - 9, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 10, - 2 - ], - "idx": 1 - }, - { - "pos": [ - 11, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 12, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 13, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 14, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 15, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 16, - 2 - ], - "idx": 1 - }, - { - "pos": [ - 17, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 18, - 2 - ], - "idx": 1 - }, - { - "pos": [ - 19, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 20, - 2 - ], - "idx": 1 - }, - { - "pos": [ - 21, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 22, - 2 - ], - "idx": 1 - }, - { - "pos": [ - 23, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 24, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 25, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 26, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 0, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 1, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 2, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 3, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 4, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 5, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 6, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 7, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 8, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 9, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 10, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 11, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 12, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 13, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 14, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 15, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 16, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 17, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 18, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 19, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 20, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 21, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 22, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 23, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 24, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 25, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 26, - 1 - ], - "idx": 8 - }, - { - "pos": [ - 0, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 1, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 2, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 3, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 4, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 5, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 6, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 7, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 8, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 9, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 10, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 11, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 12, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 13, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 14, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 15, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 16, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 17, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 18, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 19, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 20, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 21, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 22, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 23, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 24, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 25, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 26, - 0 - ], - "idx": 8 + "name": "zyrafa03", + "background_color": "7EA8A6", + "grid_size": [27, 22], + "tile_size": [32, 32], + "layers": [ + { + "id": "main layer", + "kind": { + "tile": { + "has_collision": true, + "tiles": [ + { + "pos": [0, 21], + "idx": 8 + }, + { + "pos": [1, 21], + "idx": 8 + }, + { + "pos": [2, 21], + "idx": 8 + }, + { + "pos": [3, 21], + "idx": 8 + }, + { + "pos": [4, 21], + "idx": 8 + }, + { + "pos": [5, 21], + "idx": 8 + }, + { + "pos": [6, 21], + "idx": 8 + }, + { + "pos": [7, 21], + "idx": 8 + }, + { + "pos": [8, 21], + "idx": 8 + }, + { + "pos": [9, 21], + "idx": 8 + }, + { + "pos": [10, 21], + "idx": 8 + }, + { + "pos": [11, 21], + "idx": 8 + }, + { + "pos": [12, 21], + "idx": 8 + }, + { + "pos": [13, 21], + "idx": 8 + }, + { + "pos": [14, 21], + "idx": 8 + }, + { + "pos": [15, 21], + "idx": 8 + }, + { + "pos": [16, 21], + "idx": 8 + }, + { + "pos": [17, 21], + "idx": 8 + }, + { + "pos": [18, 21], + "idx": 8 + }, + { + "pos": [19, 21], + "idx": 8 + }, + { + "pos": [20, 21], + "idx": 8 + }, + { + "pos": [21, 21], + "idx": 8 + }, + { + "pos": [22, 21], + "idx": 8 + }, + { + "pos": [23, 21], + "idx": 8 + }, + { + "pos": [24, 21], + "idx": 8 + }, + { + "pos": [25, 21], + "idx": 8 + }, + { + "pos": [26, 21], + "idx": 8 + }, + { + "pos": [0, 20], + "idx": 4 + }, + { + "pos": [1, 20], + "idx": 15 + }, + { + "pos": [2, 20], + "idx": 15 + }, + { + "pos": [3, 20], + "idx": 15 + }, + { + "pos": [4, 20], + "idx": 15 + }, + { + "pos": [5, 20], + "idx": 15 + }, + { + "pos": [6, 20], + "idx": 15 + }, + { + "pos": [7, 20], + "idx": 15 + }, + { + "pos": [8, 20], + "idx": 15 + }, + { + "pos": [9, 20], + "idx": 15 + }, + { + "pos": [10, 20], + "idx": 15 + }, + { + "pos": [11, 20], + "idx": 15 + }, + { + "pos": [12, 20], + "idx": 15 + }, + { + "pos": [13, 20], + "idx": 15 + }, + { + "pos": [14, 20], + "idx": 15 + }, + { + "pos": [15, 20], + "idx": 15 + }, + { + "pos": [16, 20], + "idx": 15 + }, + { + "pos": [17, 20], + "idx": 15 + }, + { + "pos": [18, 20], + "idx": 15 + }, + { + "pos": [19, 20], + "idx": 15 + }, + { + "pos": [20, 20], + "idx": 15 + }, + { + "pos": [21, 20], + "idx": 15 + }, + { + "pos": [22, 20], + "idx": 15 + }, + { + "pos": [23, 20], + "idx": 15 + }, + { + "pos": [24, 20], + "idx": 15 + }, + { + "pos": [25, 20], + "idx": 15 + }, + { + "pos": [26, 20], + "idx": 5 + }, + { + "pos": [0, 19], + "idx": 9 + }, + { + "pos": [1, 19], + "idx": 58 + }, + { + "pos": [2, 19], + "idx": 58 + }, + { + "pos": [3, 19], + "idx": 58 + }, + { + "pos": [4, 19], + "idx": 58 + }, + { + "pos": [5, 19], + "idx": 58 + }, + { + "pos": [6, 19], + "idx": 58 + }, + { + "pos": [7, 19], + "idx": 58 + }, + { + "pos": [8, 19], + "idx": 58 + }, + { + "pos": [9, 19], + "idx": 58 + }, + { + "pos": [10, 19], + "idx": 58 + }, + { + "pos": [11, 19], + "idx": 58 + }, + { + "pos": [12, 19], + "idx": 58 + }, + { + "pos": [13, 19], + "idx": 58 + }, + { + "pos": [14, 19], + "idx": 58 + }, + { + "pos": [15, 19], + "idx": 58 + }, + { + "pos": [16, 19], + "idx": 58 + }, + { + "pos": [17, 19], + "idx": 58 + }, + { + "pos": [18, 19], + "idx": 58 + }, + { + "pos": [19, 19], + "idx": 58 + }, + { + "pos": [20, 19], + "idx": 58 + }, + { + "pos": [21, 19], + "idx": 58 + }, + { + "pos": [22, 19], + "idx": 58 + }, + { + "pos": [23, 19], + "idx": 58 + }, + { + "pos": [24, 19], + "idx": 58 + }, + { + "pos": [25, 19], + "idx": 58 + }, + { + "pos": [26, 19], + "idx": 7 + }, + { + "pos": [0, 18], + "idx": 9 + }, + { + "pos": [26, 18], + "idx": 7 + }, + { + "pos": [0, 17], + "idx": 9 + }, + { + "pos": [26, 17], + "idx": 7 + }, + { + "pos": [0, 16], + "idx": 9 + }, + { + "pos": [26, 16], + "idx": 7 + }, + { + "pos": [0, 15], + "idx": 9 + }, + { + "pos": [26, 15], + "idx": 7 + }, + { + "pos": [0, 14], + "idx": 9 + }, + { + "pos": [26, 14], + "idx": 7 + }, + { + "pos": [0, 13], + "idx": 9 + }, + { + "pos": [6, 13], + "idx": 21 + }, + { + "pos": [7, 13], + "idx": 22 + }, + { + "pos": [8, 13], + "idx": 22 + }, + { + "pos": [9, 13], + "idx": 22 + }, + { + "pos": [10, 13], + "idx": 23 + }, + { + "pos": [16, 13], + "idx": 21 + }, + { + "pos": [17, 13], + "idx": 22 + }, + { + "pos": [18, 13], + "idx": 22 + }, + { + "pos": [19, 13], + "idx": 22 + }, + { + "pos": [20, 13], + "idx": 23 + }, + { + "pos": [26, 13], + "idx": 7 + }, + { + "pos": [0, 12], + "idx": 9 + }, + { + "pos": [26, 12], + "idx": 7 + }, + { + "pos": [0, 11], + "idx": 9 + }, + { + "pos": [26, 11], + "idx": 7 + }, + { + "pos": [0, 10], + "idx": 9 + }, + { + "pos": [1, 10], + "idx": 58 + }, + { + "pos": [2, 10], + "idx": 60 + }, + { + "pos": [12, 10], + "idx": 56 + }, + { + "pos": [13, 10], + "idx": 58 + }, + { + "pos": [14, 10], + "idx": 60 + }, + { + "pos": [24, 10], + "idx": 56 + }, + { + "pos": [25, 10], + "idx": 58 + }, + { + "pos": [26, 10], + "idx": 7 + }, + { + "pos": [0, 9], + "idx": 9 + }, + { + "pos": [26, 9], + "idx": 7 + }, + { + "pos": [0, 8], + "idx": 9 + }, + { + "pos": [26, 8], + "idx": 7 + }, + { + "pos": [0, 7], + "idx": 9 + }, + { + "pos": [13, 7], + "idx": 3 + }, + { + "pos": [26, 7], + "idx": 7 + }, + { + "pos": [0, 6], + "idx": 11 + }, + { + "pos": [1, 6], + "idx": 1 + }, + { + "pos": [2, 6], + "idx": 1 + }, + { + "pos": [3, 6], + "idx": 2 + }, + { + "pos": [13, 6], + "idx": 10 + }, + { + "pos": [23, 6], + "idx": 0 + }, + { + "pos": [24, 6], + "idx": 1 + }, + { + "pos": [25, 6], + "idx": 1 + }, + { + "pos": [26, 6], + "idx": 12 + }, + { + "pos": [0, 5], + "idx": 8 + }, + { + "pos": [1, 5], + "idx": 8 + }, + { + "pos": [2, 5], + "idx": 11 + }, + { + "pos": [3, 5], + "idx": 9 + }, + { + "pos": [13, 5], + "idx": 10 + }, + { + "pos": [23, 5], + "idx": 7 + }, + { + "pos": [24, 5], + "idx": 12 + }, + { + "pos": [25, 5], + "idx": 8 + }, + { + "pos": [26, 5], + "idx": 8 + }, + { + "pos": [0, 4], + "idx": 8 + }, + { + "pos": [1, 4], + "idx": 8 + }, + { + "pos": [2, 4], + "idx": 8 + }, + { + "pos": [3, 4], + "idx": 9 + }, + { + "pos": [13, 4], + "idx": 10 + }, + { + "pos": [23, 4], + "idx": 7 + }, + { + "pos": [24, 4], + "idx": 8 + }, + { + "pos": [25, 4], + "idx": 8 + }, + { + "pos": [26, 4], + "idx": 8 + }, + { + "pos": [0, 3], + "idx": 8 + }, + { + "pos": [1, 3], + "idx": 8 + }, + { + "pos": [2, 3], + "idx": 8 + }, + { + "pos": [3, 3], + "idx": 11 + }, + { + "pos": [4, 3], + "idx": 1 + }, + { + "pos": [5, 3], + "idx": 1 + }, + { + "pos": [6, 3], + "idx": 1 + }, + { + "pos": [7, 3], + "idx": 1 + }, + { + "pos": [8, 3], + "idx": 1 + }, + { + "pos": [9, 3], + "idx": 1 + }, + { + "pos": [10, 3], + "idx": 1 + }, + { + "pos": [11, 3], + "idx": 1 + }, + { + "pos": [12, 3], + "idx": 1 + }, + { + "pos": [13, 3], + "idx": 6 + }, + { + "pos": [14, 3], + "idx": 1 + }, + { + "pos": [15, 3], + "idx": 1 + }, + { + "pos": [16, 3], + "idx": 1 + }, + { + "pos": [17, 3], + "idx": 1 + }, + { + "pos": [18, 3], + "idx": 1 + }, + { + "pos": [19, 3], + "idx": 1 + }, + { + "pos": [20, 3], + "idx": 1 + }, + { + "pos": [21, 3], + "idx": 1 + }, + { + "pos": [22, 3], + "idx": 1 + }, + { + "pos": [23, 3], + "idx": 12 + }, + { + "pos": [24, 3], + "idx": 8 + }, + { + "pos": [25, 3], + "idx": 8 + }, + { + "pos": [26, 3], + "idx": 8 + }, + { + "pos": [0, 2], + "idx": 8 + }, + { + "pos": [1, 2], + "idx": 8 + }, + { + "pos": [2, 2], + "idx": 8 + }, + { + "pos": [3, 2], + "idx": 8 + }, + { + "pos": [4, 2], + "idx": 1 + }, + { + "pos": [5, 2], + "idx": 8 + }, + { + "pos": [6, 2], + "idx": 1 + }, + { + "pos": [7, 2], + "idx": 8 + }, + { + "pos": [8, 2], + "idx": 1 + }, + { + "pos": [9, 2], + "idx": 8 + }, + { + "pos": [10, 2], + "idx": 1 + }, + { + "pos": [11, 2], + "idx": 8 + }, + { + "pos": [12, 2], + "idx": 8 + }, + { + "pos": [13, 2], + "idx": 8 + }, + { + "pos": [14, 2], + "idx": 8 + }, + { + "pos": [15, 2], + "idx": 8 + }, + { + "pos": [16, 2], + "idx": 1 + }, + { + "pos": [17, 2], + "idx": 8 + }, + { + "pos": [18, 2], + "idx": 1 + }, + { + "pos": [19, 2], + "idx": 8 + }, + { + "pos": [20, 2], + "idx": 1 + }, + { + "pos": [21, 2], + "idx": 8 + }, + { + "pos": [22, 2], + "idx": 1 + }, + { + "pos": [23, 2], + "idx": 8 + }, + { + "pos": [24, 2], + "idx": 8 + }, + { + "pos": [25, 2], + "idx": 8 + }, + { + "pos": [26, 2], + "idx": 8 + }, + { + "pos": [0, 1], + "idx": 8 + }, + { + "pos": [1, 1], + "idx": 8 + }, + { + "pos": [2, 1], + "idx": 8 + }, + { + "pos": [3, 1], + "idx": 8 + }, + { + "pos": [4, 1], + "idx": 8 + }, + { + "pos": [5, 1], + "idx": 8 + }, + { + "pos": [6, 1], + "idx": 8 + }, + { + "pos": [7, 1], + "idx": 8 + }, + { + "pos": [8, 1], + "idx": 8 + }, + { + "pos": [9, 1], + "idx": 8 + }, + { + "pos": [10, 1], + "idx": 8 + }, + { + "pos": [11, 1], + "idx": 8 + }, + { + "pos": [12, 1], + "idx": 8 + }, + { + "pos": [13, 1], + "idx": 8 + }, + { + "pos": [14, 1], + "idx": 8 + }, + { + "pos": [15, 1], + "idx": 8 + }, + { + "pos": [16, 1], + "idx": 8 + }, + { + "pos": [17, 1], + "idx": 8 + }, + { + "pos": [18, 1], + "idx": 8 + }, + { + "pos": [19, 1], + "idx": 8 + }, + { + "pos": [20, 1], + "idx": 8 + }, + { + "pos": [21, 1], + "idx": 8 + }, + { + "pos": [22, 1], + "idx": 8 + }, + { + "pos": [23, 1], + "idx": 8 + }, + { + "pos": [24, 1], + "idx": 8 + }, + { + "pos": [25, 1], + "idx": 8 + }, + { + "pos": [26, 1], + "idx": 8 + }, + { + "pos": [0, 0], + "idx": 8 + }, + { + "pos": [1, 0], + "idx": 8 + }, + { + "pos": [2, 0], + "idx": 8 + }, + { + "pos": [3, 0], + "idx": 8 + }, + { + "pos": [4, 0], + "idx": 8 + }, + { + "pos": [5, 0], + "idx": 8 + }, + { + "pos": [6, 0], + "idx": 8 + }, + { + "pos": [7, 0], + "idx": 8 + }, + { + "pos": [8, 0], + "idx": 8 + }, + { + "pos": [9, 0], + "idx": 8 + }, + { + "pos": [10, 0], + "idx": 8 + }, + { + "pos": [11, 0], + "idx": 8 + }, + { + "pos": [12, 0], + "idx": 8 + }, + { + "pos": [13, 0], + "idx": 8 + }, + { + "pos": [14, 0], + "idx": 8 + }, + { + "pos": [15, 0], + "idx": 8 + }, + { + "pos": [16, 0], + "idx": 8 + }, + { + "pos": [17, 0], + "idx": 8 + }, + { + "pos": [18, 0], + "idx": 8 + }, + { + "pos": [19, 0], + "idx": 8 + }, + { + "pos": [20, 0], + "idx": 8 + }, + { + "pos": [21, 0], + "idx": 8 + }, + { + "pos": [22, 0], + "idx": 8 + }, + { + "pos": [23, 0], + "idx": 8 + }, + { + "pos": [24, 0], + "idx": 8 + }, + { + "pos": [25, 0], + "idx": 8 + }, + { + "pos": [26, 0], + "idx": 8 + } + ], + "tilemap": "../resources/default_tileset.atlas.yaml" + } } - ], - "tilemap": "../resources/default_tileset.png" - } - } - }, - { - "id": "decorations", - "kind": { - "element": { - "elements": [ - { - "pos": [ - 52, - 233.5 - ], - "element": "../elements/environment/sproinger/sproinger.element.yaml" - }, - { - "pos": [ - 792, - 249.5 - ], - "element": "../elements/decoration/anemones/anemones.element.yaml" - }, - { - "pos": [ - 88, - 249.5 - ], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" - }, - { - "pos": [ - 312, - 153.5 - ], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" - }, - { - "pos": [ - 312, - 473.5 - ], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" - }, - { - "pos": [ - 248, - 473.5 - ], - "element": "../elements/decoration/anemones/anemones.element.yaml" - }, - { - "pos": [ - 600, - 473.5 - ], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" - }, - { - "pos": [ - 536, - 153.5 - ], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + }, + { + "id": "decorations", + "kind": { + "element": { + "elements": [ + { + "pos": [52, 233.5], + "element": "/elements/environment/sproinger/sproinger.element.yaml" + }, + { + "pos": [792, 249.5], + "element": "/elements/decoration/anemones/anemones.element.yaml" + }, + { + "pos": [88, 249.5], + "element": "/elements/decoration/seaweed/seaweed.element.yaml" + }, + { + "pos": [312, 153.5], + "element": "/elements/decoration/seaweed/seaweed.element.yaml" + }, + { + "pos": [312, 473.5], + "element": "/elements/decoration/seaweed/seaweed.element.yaml" + }, + { + "pos": [248, 473.5], + "element": "/elements/decoration/anemones/anemones.element.yaml" + }, + { + "pos": [600, 473.5], + "element": "/elements/decoration/seaweed/seaweed.element.yaml" + }, + { + "pos": [536, 153.5], + "element": "/elements/decoration/seaweed/seaweed.element.yaml" + } + ] + } } - ] - } - } - }, - { - "id": "items", - "kind": { - "element": { - "elements": [ - { - "pos": [ - 607.8462, - 481.5 - ], - "element": "../elements/environment/fish_school/fish_school.element.yaml" - }, - { - "pos": [ - 313.81812, - 491.5 - ], - "element": "../elements/environment/fish_school/fish_school.element.yaml" - }, - { - "pos": [ - 528, - 181.5 - ], - "element": "../elements/environment/fish_school/fish_school.element.yaml" - }, - { - "pos": [ - 403.41186000000005, - 137.5 - ], - "element": "../elements/environment/sproinger/sproinger.element.yaml" - }, - { - "pos": [ - 468.28576, - 137.5 - ], - "element": "../elements/environment/sproinger/sproinger.element.yaml" - }, - { - "pos": [ - 822.3335, - 233.5 - ], - "element": "../elements/environment/sproinger/sproinger.element.yaml" - }, - { - "pos": [ - 568, - 137.5 - ], - "element": "../elements/item/musket/musket.element.yaml" - }, - { - "pos": [ - 288, - 143.5 - ], - "element": "../elements/item/musket/musket.element.yaml" - }, - { - "pos": [ - 416, - 369.5 - ], - "element": "../elements/item/sword/sword.element.yaml" - }, - { - "pos": [ - 584.25, - 465.5 - ], - "element": "../elements/item/sword/sword.element.yaml" - }, - { - "pos": [ - 308, - 479.5 - ], - "element": "../elements/item/sword/sword.element.yaml" + }, + { + "id": "items", + "kind": { + "element": { + "elements": [ + { + "pos": [607.8462, 481.5], + "element": "/elements/environment/fish_school/fish_school.element.yaml" + }, + { + "pos": [313.81812, 491.5], + "element": "/elements/environment/fish_school/fish_school.element.yaml" + }, + { + "pos": [528, 181.5], + "element": "/elements/environment/fish_school/fish_school.element.yaml" + }, + { + "pos": [403.41186000000005, 137.5], + "element": "/elements/environment/sproinger/sproinger.element.yaml" + }, + { + "pos": [468.28576, 137.5], + "element": "/elements/environment/sproinger/sproinger.element.yaml" + }, + { + "pos": [822.3335, 233.5], + "element": "/elements/environment/sproinger/sproinger.element.yaml" + }, + { + "pos": [568, 137.5], + "element": "/elements/item/musket/musket.element.yaml" + }, + { + "pos": [288, 143.5], + "element": "/elements/item/musket/musket.element.yaml" + }, + { + "pos": [416, 369.5], + "element": "/elements/item/sword/sword.element.yaml" + }, + { + "pos": [584.25, 465.5], + "element": "/elements/item/sword/sword.element.yaml" + }, + { + "pos": [308, 479.5], + "element": "/elements/item/sword/sword.element.yaml" + } + ] + } } - ] - } - } - }, - { - "id": "spawners", - "kind": { - "element": { - "elements": [ - { - "pos": [ - 64, - 384 - ], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" - }, - { - "pos": [ - 800, - 384 - ], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" - }, - { - "pos": [ - 192, - 160 - ], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" - }, - { - "pos": [ - 672, - 160 - ], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" + }, + { + "id": "spawners", + "kind": { + "element": { + "elements": [ + { + "pos": [64, 384], + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" + }, + { + "pos": [800, 384], + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" + }, + { + "pos": [192, 160], + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" + }, + { + "pos": [672, 160], + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" + } + ] + } } - ] } - } - } - ], - "background_layers": [ - { - "image": "../resources/background_04.png", - "speed": 0, - "tile_size": [ - 896, - 480 - ], - "z": -110, - "position": [ - 0, - 360 - ], - "scale": 2 - }, - { - "image": "../resources/background_03.png", - "speed": 0.74, - "tile_size": [ - 896, - 480 - ], - "z": -109, - "position": [ - 0, - 360 - ], - "scale": 2 - }, - { - "image": "../resources/background_02.png", - "speed": 0.82, - "tile_size": [ - 896, - 480 - ], - "z": -108, - "position": [ - 0, - 360 - ], - "scale": 2 - }, - { - "image": "../resources/background_01.png", - "speed": 100, - "tile_size": [ - 896, - 480 - ], - "z": -107, - "position": [ - 0, - 360 - ], - "scale": 2 - } - ] -} \ No newline at end of file + ], + "background_layers": [ + { + "image": "../resources/background_04.png", + "speed": 0, + "tile_size": [896, 480], + "z": -110, + "position": [0, 360], + "scale": 2 + }, + { + "image": "../resources/background_03.png", + "speed": 0.74, + "tile_size": [896, 480], + "z": -109, + "position": [0, 360], + "scale": 2 + }, + { + "image": "../resources/background_02.png", + "speed": 0.82, + "tile_size": [896, 480], + "z": -108, + "position": [0, 360], + "scale": 2 + }, + { + "image": "../resources/background_01.png", + "speed": 100, + "tile_size": [896, 480], + "z": -107, + "position": [0, 360], + "scale": 2 + } + ] +} diff --git a/assets/map/levels/zyrafa04.map.json b/assets/map/levels/zyrafa04.map.json index 93d7face1f..056486d5e0 100644 --- a/assets/map/levels/zyrafa04.map.json +++ b/assets/map/levels/zyrafa04.map.json @@ -1563,7 +1563,7 @@ "idx": 8 } ], - "tilemap": "../resources/default_tileset.png" + "tilemap": "../resources/default_tileset.atlas.yaml" } } }, @@ -1574,23 +1574,23 @@ "elements": [ { "pos": [472, 281.5], - "element": "../elements/decoration/anemones/anemones.element.yaml" + "element": "/elements/decoration/anemones/anemones.element.yaml" }, { "pos": [168, 217.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" }, { "pos": [440, 473.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" }, { "pos": [888, 217.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" }, { "pos": [952, 345.5], - "element": "../elements/decoration/anemones/anemones.element.yaml" + "element": "/elements/decoration/anemones/anemones.element.yaml" } ] } @@ -1603,55 +1603,55 @@ "elements": [ { "pos": [116.28711000000001, 201.5], - "element": "../elements/environment/sproinger/sproinger.element.yaml" + "element": "/elements/environment/sproinger/sproinger.element.yaml" }, { "pos": [982, 201.5], - "element": "../elements/environment/sproinger/sproinger.element.yaml" + "element": "/elements/environment/sproinger/sproinger.element.yaml" }, { "pos": [608, 465.5], - "element": "../elements/item/sword/sword.element.yaml" + "element": "/elements/item/sword/sword.element.yaml" }, { "pos": [173.83886, 233.5], - "element": "../elements/environment/fish_school/fish_school.element.yaml" + "element": "/elements/environment/fish_school/fish_school.element.yaml" }, { "pos": [880, 243.5], - "element": "../elements/environment/fish_school/fish_school.element.yaml" + "element": "/elements/environment/fish_school/fish_school.element.yaml" }, { "pos": [432, 481.5], - "element": "../elements/environment/fish_school/fish_school.element.yaml" + "element": "/elements/environment/fish_school/fish_school.element.yaml" }, { "pos": [900.6666, 329.5], - "element": "../elements/item/musket/musket.element.yaml" + "element": "/elements/item/musket/musket.element.yaml" }, { "pos": [251.00006000000002, 209.5], - "element": "../elements/item/grenade/grenade.element.yaml" + "element": "/elements/item/grenade/grenade.element.yaml" }, { "pos": [155.33334000000002, 337.5], - "element": "../elements/item/musket/musket.element.yaml" + "element": "/elements/item/musket/musket.element.yaml" }, { "pos": [548.2855999999999, 265.5], - "element": "../elements/environment/sproinger/sproinger.element.yaml" + "element": "/elements/environment/sproinger/sproinger.element.yaml" }, { "pos": [864, 209.5], - "element": "../elements/item/grenade/grenade.element.yaml" + "element": "/elements/item/grenade/grenade.element.yaml" }, { "pos": [616, 275.5], - "element": "../elements/item/grenade/grenade.element.yaml" + "element": "/elements/item/grenade/grenade.element.yaml" }, { "pos": [488, 279.5], - "element": "../elements/item/grenade/grenade.element.yaml" + "element": "/elements/item/grenade/grenade.element.yaml" } ] } @@ -1664,19 +1664,19 @@ "elements": [ { "pos": [126.57143, 348.2857], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" }, { "pos": [959.2857, 353.28568], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" }, { "pos": [896, 224], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" }, { "pos": [192, 224], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" } ] } diff --git a/assets/map/levels/zyrafa05.map.json b/assets/map/levels/zyrafa05.map.json index f6fbd2cfb1..5f03b28799 100644 --- a/assets/map/levels/zyrafa05.map.json +++ b/assets/map/levels/zyrafa05.map.json @@ -503,7 +503,7 @@ "idx": 9 } ], - "tilemap": "../resources/default_tileset.png" + "tilemap": "../resources/default_tileset.atlas.yaml" } } }, @@ -514,27 +514,27 @@ "elements": [ { "pos": [778.3076000000001, 265.5], - "element": "../elements/environment/fish_school/fish_school.element.yaml" + "element": "/elements/environment/fish_school/fish_school.element.yaml" }, { "pos": [440, 345.5], - "element": "../elements/decoration/anemones/anemones.element.yaml" + "element": "/elements/decoration/anemones/anemones.element.yaml" }, { "pos": [107.14286000000001, 249.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" }, { "pos": [472, 537.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" }, { "pos": [786.5715399999999, 249.5], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" + "element": "/elements/decoration/seaweed/seaweed.element.yaml" }, { "pos": [568, 537.5], - "element": "../elements/decoration/anemones/anemones.element.yaml" + "element": "/elements/decoration/anemones/anemones.element.yaml" } ] } @@ -547,43 +547,43 @@ "elements": [ { "pos": [96, 281.5], - "element": "../elements/environment/fish_school/fish_school.element.yaml" + "element": "/elements/environment/fish_school/fish_school.element.yaml" }, { "pos": [512, 331.5], - "element": "../elements/environment/crab/crab.element.yaml" + "element": "/elements/environment/crab/crab.element.yaml" }, { "pos": [464, 557.5], - "element": "../elements/environment/fish_school/fish_school.element.yaml" + "element": "/elements/environment/fish_school/fish_school.element.yaml" }, { "pos": [181.53846, 233.5], - "element": "../elements/environment/sproinger/sproinger.element.yaml" + "element": "/elements/environment/sproinger/sproinger.element.yaml" }, { "pos": [848.9231, 233.5], - "element": "../elements/environment/sproinger/sproinger.element.yaml" + "element": "/elements/environment/sproinger/sproinger.element.yaml" }, { "pos": [536, 329.5], - "element": "../elements/item/musket/musket.element.yaml" + "element": "/elements/item/musket/musket.element.yaml" }, { "pos": [384.00005999999996, 535.5], - "element": "../elements/item/sword/sword.element.yaml" + "element": "/elements/item/sword/sword.element.yaml" }, { "pos": [608, 535.5], - "element": "../elements/item/sword/sword.element.yaml" + "element": "/elements/item/sword/sword.element.yaml" }, { "pos": [216, 533.5], - "element": "../elements/item/grenade/grenade.element.yaml" + "element": "/elements/item/grenade/grenade.element.yaml" }, { "pos": [888, 535.5], - "element": "../elements/item/grenade/grenade.element.yaml" + "element": "/elements/item/grenade/grenade.element.yaml" } ] } @@ -596,19 +596,19 @@ "elements": [ { "pos": [172.61539, 533.69228], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" }, { "pos": [224, 256], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" }, { "pos": [800, 256], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" }, { "pos": [842.1539, 531.38458], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" } ] } diff --git a/assets/map/levels/zyrafa06.map.json b/assets/map/levels/zyrafa06.map.json index bd981f429c..0544e3000e 100644 --- a/assets/map/levels/zyrafa06.map.json +++ b/assets/map/levels/zyrafa06.map.json @@ -1,1271 +1,746 @@ { - "name": "zyrafa06", - "background_color": "7EA8A6", - "grid_size": [ - 34, - 14 - ], - "tile_size": [ - 32, - 32 - ], - "layers": [ - { - "id": "main layer", - "kind": { - "tile": { - "has_collision": true, - "tiles": [ - { - "pos": [ - 21, - 9 - ], - "idx": 56, - "jump_through": true - }, - { - "pos": [ - 22, - 9 - ], - "idx": 58, - "jump_through": true - }, - { - "pos": [ - 23, - 9 - ], - "idx": 60, - "jump_through": true - }, - { - "pos": [ - 6, - 8 - ], - "idx": 56, - "jump_through": true - }, - { - "pos": [ - 7, - 8 - ], - "idx": 58, - "jump_through": true - }, - { - "pos": [ - 8, - 8 - ], - "idx": 60, - "jump_through": true - }, - { - "pos": [ - 11, - 7 - ], - "idx": 0 - }, - { - "pos": [ - 12, - 7 - ], - "idx": 1 - }, - { - "pos": [ - 13, - 7 - ], - "idx": 1 - }, - { - "pos": [ - 14, - 7 - ], - "idx": 1 - }, - { - "pos": [ - 15, - 7 - ], - "idx": 1 - }, - { - "pos": [ - 16, - 7 - ], - "idx": 2 - }, - { - "pos": [ - 11, - 6 - ], - "idx": 7 - }, - { - "pos": [ - 12, - 6 - ], - "idx": 8 - }, - { - "pos": [ - 13, - 6 - ], - "idx": 8 - }, - { - "pos": [ - 14, - 6 - ], - "idx": 8 - }, - { - "pos": [ - 15, - 6 - ], - "idx": 8 - }, - { - "pos": [ - 16, - 6 - ], - "idx": 9 - }, - { - "pos": [ - 11, - 5 - ], - "idx": 7 - }, - { - "pos": [ - 12, - 5 - ], - "idx": 8 - }, - { - "pos": [ - 13, - 5 - ], - "idx": 8 - }, - { - "pos": [ - 14, - 5 - ], - "idx": 8 - }, - { - "pos": [ - 15, - 5 - ], - "idx": 8 - }, - { - "pos": [ - 16, - 5 - ], - "idx": 9 - }, - { - "pos": [ - 24, - 5 - ], - "idx": 0 - }, - { - "pos": [ - 25, - 5 - ], - "idx": 1 - }, - { - "pos": [ - 26, - 5 - ], - "idx": 1 - }, - { - "pos": [ - 27, - 5 - ], - "idx": 1 - }, - { - "pos": [ - 28, - 5 - ], - "idx": 2 - }, - { - "pos": [ - 4, - 4 - ], - "idx": 0 - }, - { - "pos": [ - 5, - 4 - ], - "idx": 1 - }, - { - "pos": [ - 6, - 4 - ], - "idx": 2 - }, - { - "pos": [ - 11, - 4 - ], - "idx": 7 - }, - { - "pos": [ - 12, - 4 - ], - "idx": 8 - }, - { - "pos": [ - 13, - 4 - ], - "idx": 8 - }, - { - "pos": [ - 14, - 4 - ], - "idx": 8 - }, - { - "pos": [ - 15, - 4 - ], - "idx": 0 - }, - { - "pos": [ - 16, - 4 - ], - "idx": 1 - }, - { - "pos": [ - 17, - 4 - ], - "idx": 1 - }, - { - "pos": [ - 18, - 4 - ], - "idx": 2 - }, - { - "pos": [ - 24, - 4 - ], - "idx": 7 - }, - { - "pos": [ - 25, - 4 - ], - "idx": 8 - }, - { - "pos": [ - 26, - 4 - ], - "idx": 8 - }, - { - "pos": [ - 27, - 4 - ], - "idx": 8 - }, - { - "pos": [ - 28, - 4 - ], - "idx": 9 - }, - { - "pos": [ - 4, - 3 - ], - "idx": 7 - }, - { - "pos": [ - 5, - 3 - ], - "idx": 8 - }, - { - "pos": [ - 6, - 3 - ], - "idx": 9 - }, - { - "pos": [ - 11, - 3 - ], - "idx": 7 - }, - { - "pos": [ - 12, - 3 - ], - "idx": 8 - }, - { - "pos": [ - 13, - 3 - ], - "idx": 8 - }, - { - "pos": [ - 14, - 3 - ], - "idx": 8 - }, - { - "pos": [ - 15, - 3 - ], - "idx": 7 - }, - { - "pos": [ - 16, - 3 - ], - "idx": 8 - }, - { - "pos": [ - 17, - 3 - ], - "idx": 8 - }, - { - "pos": [ - 18, - 3 - ], - "idx": 9 - }, - { - "pos": [ - 24, - 3 - ], - "idx": 7 - }, - { - "pos": [ - 25, - 3 - ], - "idx": 8 - }, - { - "pos": [ - 26, - 3 - ], - "idx": 8 - }, - { - "pos": [ - 27, - 3 - ], - "idx": 8 - }, - { - "pos": [ - 28, - 3 - ], - "idx": 9 - }, - { - "pos": [ - 4, - 2 - ], - "idx": 7 - }, - { - "pos": [ - 5, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 6, - 2 - ], - "idx": 9 - }, - { - "pos": [ - 11, - 2 - ], - "idx": 7 - }, - { - "pos": [ - 12, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 13, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 14, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 15, - 2 - ], - "idx": 7 - }, - { - "pos": [ - 16, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 17, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 18, - 2 - ], - "idx": 9 - }, - { - "pos": [ - 24, - 2 - ], - "idx": 7 - }, - { - "pos": [ - 25, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 26, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 27, - 2 - ], - "idx": 8 - }, - { - "pos": [ - 28, - 2 - ], - "idx": 9 - }, - { - "pos": [ - 2, - 1 - ], - "idx": 0 - }, - { - "pos": [ - 3, - 1 - ], - "idx": 1 - }, - { - "pos": [ - 4, - 1 - ], - "idx": 1 - }, - { - "pos": [ - 5, - 1 - ], - "idx": 1 - }, - { - "pos": [ - 6, - 1 - ], - "idx": 1 - }, - { - "pos": [ - 7, - 1 - ], - "idx": 1 - }, - { - "pos": [ - 8, - 1 - ], - "idx": 1 - }, - { - "pos": [ - 9, - 1 - ], - "idx": 1 - }, - { - "pos": [ - 10, - 1 - ], - "idx": 1 - }, - { - "pos": [ - 11, - 1 - ], - "idx": 1 - }, - { - "pos": [ - 12, - 1 - ], - "idx": 1 - }, - { - "pos": [ - 13, - 1 - ], - "idx": 1 - }, - { - "pos": [ - 14, - 1 - ], - "idx": 1 - }, - { - "pos": [ - 15, - 1 - ], - "idx": 1 - }, - { - "pos": [ - 16, - 1 - ], - "idx": 1 - }, - { - "pos": [ - 17, - 1 - ], - "idx": 1 - }, - { - "pos": [ - 18, - 1 - ], - "idx": 1 - }, - { - "pos": [ - 19, - 1 - ], - "idx": 1 - }, - { - "pos": [ - 20, - 1 - ], - "idx": 1 - }, - { - "pos": [ - 21, - 1 - ], - "idx": 1 - }, - { - "pos": [ - 22, - 1 - ], - "idx": 1 - }, - { - "pos": [ - 23, - 1 - ], - "idx": 1 - }, - { - "pos": [ - 24, - 1 - ], - "idx": 1 - }, - { - "pos": [ - 25, - 1 - ], - "idx": 1 - }, - { - "pos": [ - 26, - 1 - ], - "idx": 1 - }, - { - "pos": [ - 27, - 1 - ], - "idx": 1 - }, - { - "pos": [ - 28, - 1 - ], - "idx": 1 - }, - { - "pos": [ - 29, - 1 - ], - "idx": 1 - }, - { - "pos": [ - 30, - 1 - ], - "idx": 1 - }, - { - "pos": [ - 31, - 1 - ], - "idx": 2 - }, - { - "pos": [ - 2, - 0 - ], - "idx": 7 - }, - { - "pos": [ - 3, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 4, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 5, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 6, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 7, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 8, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 9, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 10, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 11, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 12, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 13, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 14, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 15, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 16, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 17, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 18, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 19, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 20, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 21, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 22, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 23, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 24, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 25, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 26, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 27, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 28, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 29, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 30, - 0 - ], - "idx": 8 - }, - { - "pos": [ - 31, - 0 - ], - "idx": 9 + "name": "zyrafa06", + "background_color": "7EA8A6", + "grid_size": [34, 14], + "tile_size": [32, 32], + "layers": [ + { + "id": "main layer", + "kind": { + "tile": { + "has_collision": true, + "tiles": [ + { + "pos": [21, 9], + "idx": 56, + "jump_through": true + }, + { + "pos": [22, 9], + "idx": 58, + "jump_through": true + }, + { + "pos": [23, 9], + "idx": 60, + "jump_through": true + }, + { + "pos": [6, 8], + "idx": 56, + "jump_through": true + }, + { + "pos": [7, 8], + "idx": 58, + "jump_through": true + }, + { + "pos": [8, 8], + "idx": 60, + "jump_through": true + }, + { + "pos": [11, 7], + "idx": 0 + }, + { + "pos": [12, 7], + "idx": 1 + }, + { + "pos": [13, 7], + "idx": 1 + }, + { + "pos": [14, 7], + "idx": 1 + }, + { + "pos": [15, 7], + "idx": 1 + }, + { + "pos": [16, 7], + "idx": 2 + }, + { + "pos": [11, 6], + "idx": 7 + }, + { + "pos": [12, 6], + "idx": 8 + }, + { + "pos": [13, 6], + "idx": 8 + }, + { + "pos": [14, 6], + "idx": 8 + }, + { + "pos": [15, 6], + "idx": 8 + }, + { + "pos": [16, 6], + "idx": 9 + }, + { + "pos": [11, 5], + "idx": 7 + }, + { + "pos": [12, 5], + "idx": 8 + }, + { + "pos": [13, 5], + "idx": 8 + }, + { + "pos": [14, 5], + "idx": 8 + }, + { + "pos": [15, 5], + "idx": 8 + }, + { + "pos": [16, 5], + "idx": 9 + }, + { + "pos": [24, 5], + "idx": 0 + }, + { + "pos": [25, 5], + "idx": 1 + }, + { + "pos": [26, 5], + "idx": 1 + }, + { + "pos": [27, 5], + "idx": 1 + }, + { + "pos": [28, 5], + "idx": 2 + }, + { + "pos": [4, 4], + "idx": 0 + }, + { + "pos": [5, 4], + "idx": 1 + }, + { + "pos": [6, 4], + "idx": 2 + }, + { + "pos": [11, 4], + "idx": 7 + }, + { + "pos": [12, 4], + "idx": 8 + }, + { + "pos": [13, 4], + "idx": 8 + }, + { + "pos": [14, 4], + "idx": 8 + }, + { + "pos": [15, 4], + "idx": 0 + }, + { + "pos": [16, 4], + "idx": 1 + }, + { + "pos": [17, 4], + "idx": 1 + }, + { + "pos": [18, 4], + "idx": 2 + }, + { + "pos": [24, 4], + "idx": 7 + }, + { + "pos": [25, 4], + "idx": 8 + }, + { + "pos": [26, 4], + "idx": 8 + }, + { + "pos": [27, 4], + "idx": 8 + }, + { + "pos": [28, 4], + "idx": 9 + }, + { + "pos": [4, 3], + "idx": 7 + }, + { + "pos": [5, 3], + "idx": 8 + }, + { + "pos": [6, 3], + "idx": 9 + }, + { + "pos": [11, 3], + "idx": 7 + }, + { + "pos": [12, 3], + "idx": 8 + }, + { + "pos": [13, 3], + "idx": 8 + }, + { + "pos": [14, 3], + "idx": 8 + }, + { + "pos": [15, 3], + "idx": 7 + }, + { + "pos": [16, 3], + "idx": 8 + }, + { + "pos": [17, 3], + "idx": 8 + }, + { + "pos": [18, 3], + "idx": 9 + }, + { + "pos": [24, 3], + "idx": 7 + }, + { + "pos": [25, 3], + "idx": 8 + }, + { + "pos": [26, 3], + "idx": 8 + }, + { + "pos": [27, 3], + "idx": 8 + }, + { + "pos": [28, 3], + "idx": 9 + }, + { + "pos": [4, 2], + "idx": 7 + }, + { + "pos": [5, 2], + "idx": 8 + }, + { + "pos": [6, 2], + "idx": 9 + }, + { + "pos": [11, 2], + "idx": 7 + }, + { + "pos": [12, 2], + "idx": 8 + }, + { + "pos": [13, 2], + "idx": 8 + }, + { + "pos": [14, 2], + "idx": 8 + }, + { + "pos": [15, 2], + "idx": 7 + }, + { + "pos": [16, 2], + "idx": 8 + }, + { + "pos": [17, 2], + "idx": 8 + }, + { + "pos": [18, 2], + "idx": 9 + }, + { + "pos": [24, 2], + "idx": 7 + }, + { + "pos": [25, 2], + "idx": 8 + }, + { + "pos": [26, 2], + "idx": 8 + }, + { + "pos": [27, 2], + "idx": 8 + }, + { + "pos": [28, 2], + "idx": 9 + }, + { + "pos": [2, 1], + "idx": 0 + }, + { + "pos": [3, 1], + "idx": 1 + }, + { + "pos": [4, 1], + "idx": 1 + }, + { + "pos": [5, 1], + "idx": 1 + }, + { + "pos": [6, 1], + "idx": 1 + }, + { + "pos": [7, 1], + "idx": 1 + }, + { + "pos": [8, 1], + "idx": 1 + }, + { + "pos": [9, 1], + "idx": 1 + }, + { + "pos": [10, 1], + "idx": 1 + }, + { + "pos": [11, 1], + "idx": 1 + }, + { + "pos": [12, 1], + "idx": 1 + }, + { + "pos": [13, 1], + "idx": 1 + }, + { + "pos": [14, 1], + "idx": 1 + }, + { + "pos": [15, 1], + "idx": 1 + }, + { + "pos": [16, 1], + "idx": 1 + }, + { + "pos": [17, 1], + "idx": 1 + }, + { + "pos": [18, 1], + "idx": 1 + }, + { + "pos": [19, 1], + "idx": 1 + }, + { + "pos": [20, 1], + "idx": 1 + }, + { + "pos": [21, 1], + "idx": 1 + }, + { + "pos": [22, 1], + "idx": 1 + }, + { + "pos": [23, 1], + "idx": 1 + }, + { + "pos": [24, 1], + "idx": 1 + }, + { + "pos": [25, 1], + "idx": 1 + }, + { + "pos": [26, 1], + "idx": 1 + }, + { + "pos": [27, 1], + "idx": 1 + }, + { + "pos": [28, 1], + "idx": 1 + }, + { + "pos": [29, 1], + "idx": 1 + }, + { + "pos": [30, 1], + "idx": 1 + }, + { + "pos": [31, 1], + "idx": 2 + }, + { + "pos": [2, 0], + "idx": 7 + }, + { + "pos": [3, 0], + "idx": 8 + }, + { + "pos": [4, 0], + "idx": 8 + }, + { + "pos": [5, 0], + "idx": 8 + }, + { + "pos": [6, 0], + "idx": 8 + }, + { + "pos": [7, 0], + "idx": 8 + }, + { + "pos": [8, 0], + "idx": 8 + }, + { + "pos": [9, 0], + "idx": 8 + }, + { + "pos": [10, 0], + "idx": 8 + }, + { + "pos": [11, 0], + "idx": 8 + }, + { + "pos": [12, 0], + "idx": 8 + }, + { + "pos": [13, 0], + "idx": 8 + }, + { + "pos": [14, 0], + "idx": 8 + }, + { + "pos": [15, 0], + "idx": 8 + }, + { + "pos": [16, 0], + "idx": 8 + }, + { + "pos": [17, 0], + "idx": 8 + }, + { + "pos": [18, 0], + "idx": 8 + }, + { + "pos": [19, 0], + "idx": 8 + }, + { + "pos": [20, 0], + "idx": 8 + }, + { + "pos": [21, 0], + "idx": 8 + }, + { + "pos": [22, 0], + "idx": 8 + }, + { + "pos": [23, 0], + "idx": 8 + }, + { + "pos": [24, 0], + "idx": 8 + }, + { + "pos": [25, 0], + "idx": 8 + }, + { + "pos": [26, 0], + "idx": 8 + }, + { + "pos": [27, 0], + "idx": 8 + }, + { + "pos": [28, 0], + "idx": 8 + }, + { + "pos": [29, 0], + "idx": 8 + }, + { + "pos": [30, 0], + "idx": 8 + }, + { + "pos": [31, 0], + "idx": 9 + } + ], + "tilemap": "../resources/default_tileset.atlas.yaml" + } } - ], - "tilemap": "../resources/default_tileset.png" - } - } - }, - { - "id": "decorations", - "kind": { - "element": { - "elements": [ - { - "pos": [ - 536, - 185.5 - ], - "element": "../elements/decoration/anemones/anemones.element.yaml" - }, - { - "pos": [ - 216, - 89.5 - ], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" - }, - { - "pos": [ - 440, - 89.5 - ], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" - }, - { - "pos": [ - 888, - 217.5 - ], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" - }, - { - "pos": [ - 760, - 89.5 - ], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" - }, - { - "pos": [ - 408, - 281.5 - ], - "element": "../elements/decoration/seaweed/seaweed.element.yaml" - }, - { - "pos": [ - 920, - 89.5 - ], - "element": "../elements/decoration/anemones/anemones.element.yaml" - }, - { - "pos": [ - 120, - 89.5 - ], - "element": "../elements/decoration/anemones/anemones.element.yaml" + }, + { + "id": "decorations", + "kind": { + "element": { + "elements": [ + { + "pos": [536, 185.5], + "element": "/elements/decoration/anemones/anemones.element.yaml" + }, + { + "pos": [216, 89.5], + "element": "/elements/decoration/seaweed/seaweed.element.yaml" + }, + { + "pos": [440, 89.5], + "element": "/elements/decoration/seaweed/seaweed.element.yaml" + }, + { + "pos": [888, 217.5], + "element": "/elements/decoration/seaweed/seaweed.element.yaml" + }, + { + "pos": [760, 89.5], + "element": "/elements/decoration/seaweed/seaweed.element.yaml" + }, + { + "pos": [408, 281.5], + "element": "/elements/decoration/seaweed/seaweed.element.yaml" + }, + { + "pos": [920, 89.5], + "element": "/elements/decoration/anemones/anemones.element.yaml" + }, + { + "pos": [120, 89.5], + "element": "/elements/decoration/anemones/anemones.element.yaml" + } + ] + } } - ] - } - } - }, - { - "id": "items", - "kind": { - "element": { - "elements": [ - { - "pos": [ - 222.66680000000002, - 127.5 - ], - "element": "../elements/environment/fish_school/fish_school.element.yaml" - }, - { - "pos": [ - 446, - 185.5 - ], - "element": "../elements/environment/fish_school/fish_school.element.yaml" - }, - { - "pos": [ - 712.0001199999999, - 73.5 - ], - "element": "../elements/environment/crab/crab.element.yaml" - }, - { - "pos": [ - 891.3332, - 241.5 - ], - "element": "../elements/environment/fish_school/fish_school.element.yaml" - }, - { - "pos": [ - 478.66668000000004, - 265.5 - ], - "element": "../elements/environment/crab/crab.element.yaml" - }, - { - "pos": [ - 256, - 73.5 - ], - "element": "../elements/item/musket/musket.element.yaml" - }, - { - "pos": [ - 652.5714, - 73.5 - ], - "element": "../elements/item/musket/musket.element.yaml" - }, - { - "pos": [ - 456, - 285.5 - ], - "element": "../elements/item/kick_bomb/kick_bomb.element.yaml" - }, - { - "pos": [ - 1015.1428000000001, - 95.5 - ], - "element": "../elements/item/kick_bomb/kick_bomb.element.yaml" - }, - { - "pos": [ - 343.11120000000005, - 73.5 - ], - "element": "../elements/environment/sproinger/sproinger.element.yaml" - }, - { - "pos": [ - 758.1110799999999, - 73.5 - ], - "element": "../elements/environment/sproinger/sproinger.element.yaml" - }, - { - "pos": [ - 949.4359199999999, - 73.5 - ], - "element": "../elements/environment/sproinger/sproinger.element.yaml" - }, - { - "pos": [ - 706.8571999999999, - 337.5 - ], - "element": "../elements/item/sword/sword.element.yaml" - }, - { - "pos": [ - 224, - 311.5 - ], - "element": "../elements/item/sword/sword.element.yaml" + }, + { + "id": "items", + "kind": { + "element": { + "elements": [ + { + "pos": [222.66680000000002, 127.5], + "element": "/elements/environment/fish_school/fish_school.element.yaml" + }, + { + "pos": [446, 185.5], + "element": "/elements/environment/fish_school/fish_school.element.yaml" + }, + { + "pos": [712.0001199999999, 73.5], + "element": "/elements/environment/crab/crab.element.yaml" + }, + { + "pos": [891.3332, 241.5], + "element": "/elements/environment/fish_school/fish_school.element.yaml" + }, + { + "pos": [478.66668000000004, 265.5], + "element": "/elements/environment/crab/crab.element.yaml" + }, + { + "pos": [256, 73.5], + "element": "/elements/item/musket/musket.element.yaml" + }, + { + "pos": [652.5714, 73.5], + "element": "/elements/item/musket/musket.element.yaml" + }, + { + "pos": [456, 285.5], + "element": "/elements/item/kick_bomb/kick_bomb.element.yaml" + }, + { + "pos": [1015.1428000000001, 95.5], + "element": "/elements/item/kick_bomb/kick_bomb.element.yaml" + }, + { + "pos": [343.11120000000005, 73.5], + "element": "/elements/environment/sproinger/sproinger.element.yaml" + }, + { + "pos": [758.1110799999999, 73.5], + "element": "/elements/environment/sproinger/sproinger.element.yaml" + }, + { + "pos": [949.4359199999999, 73.5], + "element": "/elements/environment/sproinger/sproinger.element.yaml" + }, + { + "pos": [706.8571999999999, 337.5], + "element": "/elements/item/sword/sword.element.yaml" + }, + { + "pos": [224, 311.5], + "element": "/elements/item/sword/sword.element.yaml" + } + ] + } } - ] - } - } - }, - { - "id": "spawners", - "kind": { - "element": { - "elements": [ - { - "pos": [ - 160, - 192 - ], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" - }, - { - "pos": [ - 320, - 96 - ], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" - }, - { - "pos": [ - 576, - 192 - ], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" - }, - { - "pos": [ - 704, - 96 - ], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" - }, - { - "pos": [ - 800, - 224 - ], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" - }, - { - "pos": [ - 960, - 96 - ], - "element": "../elements/environment/player_spawner/player_spawner.element.yaml" + }, + { + "id": "spawners", + "kind": { + "element": { + "elements": [ + { + "pos": [160, 192], + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" + }, + { + "pos": [320, 96], + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" + }, + { + "pos": [576, 192], + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" + }, + { + "pos": [704, 96], + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" + }, + { + "pos": [800, 224], + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" + }, + { + "pos": [960, 96], + "element": "/elements/environment/player_spawner/player_spawner.element.yaml" + } + ] + } } - ] } - } - } - ], - "background_layers": [ - { - "image": "../resources/background_04.png", - "speed": 0, - "tile_size": [ - 896, - 480 - ], - "z": -110, - "position": [ - 0, - 360 - ], - "scale": 2 - }, - { - "image": "../resources/background_03.png", - "speed": 0.74, - "tile_size": [ - 896, - 480 - ], - "z": -109, - "position": [ - 0, - 360 - ], - "scale": 2 - }, - { - "image": "../resources/background_02.png", - "speed": 0.82, - "tile_size": [ - 896, - 480 - ], - "z": -108, - "position": [ - 0, - 360 - ], - "scale": 2 - }, - { - "image": "../resources/background_01.png", - "speed": 100, - "tile_size": [ - 896, - 480 - ], - "z": -107, - "position": [ - 0, - 360 - ], - "scale": 2 - } - ] -} \ No newline at end of file + ], + "background_layers": [ + { + "image": "../resources/background_04.png", + "speed": 0, + "tile_size": [896, 480], + "z": -110, + "position": [0, 360], + "scale": 2 + }, + { + "image": "../resources/background_03.png", + "speed": 0.74, + "tile_size": [896, 480], + "z": -109, + "position": [0, 360], + "scale": 2 + }, + { + "image": "../resources/background_02.png", + "speed": 0.82, + "tile_size": [896, 480], + "z": -108, + "position": [0, 360], + "scale": 2 + }, + { + "image": "../resources/background_01.png", + "speed": 100, + "tile_size": [896, 480], + "z": -107, + "position": [0, 360], + "scale": 2 + } + ] +} diff --git a/assets/map/resources/default_tileset.atlas.yaml b/assets/map/resources/default_tileset.atlas.yaml new file mode 100644 index 0000000000..72fe1a15b4 --- /dev/null +++ b/assets/map/resources/default_tileset.atlas.yaml @@ -0,0 +1,4 @@ +image: ./default_tileset.png +tile_size: [32, 32] +columns: 7 +rows: 9 \ No newline at end of file diff --git a/assets/player/skins/catty/catty.atlas.yaml b/assets/player/skins/catty/catty.atlas.yaml new file mode 100644 index 0000000000..52a045f202 --- /dev/null +++ b/assets/player/skins/catty/catty.atlas.yaml @@ -0,0 +1,4 @@ +image: ./catty.png +tile_size: [96, 80] +columns: 14 +rows: 7 diff --git a/assets/player/skins/catty/catty.player.yaml b/assets/player/skins/catty/catty.player.yaml index 7dc8ed0ca2..8d60f707c9 100644 --- a/assets/player/skins/catty/catty.player.yaml +++ b/assets/player/skins/catty/catty.player.yaml @@ -4,39 +4,50 @@ sounds: jump: ../../sounds/jump.ogg jump_volume: 0.05 land: ../../sounds/land.ogg - land_volume: 0.05 + land_volume: 0.025 grab: ../../sounds/grab.ogg grab_volume: 0.05 drop: ../../sounds/drop.ogg drop_volume: 0.05 -movement: - air_move_speed: 7 +stats: + air_move_speed: 6 + walk_speed: 6 + jump_speed: 14 slow_fall_speed: 1.5 -spritesheet: - image: catty.png - tile_size: [96, 80] - columns: 14 - rows: 7 +atlas: ./catty.atlas.yaml +body_size: [32, 48] +gravity: 1 - animation_fps: 9 - animations: - idle: - frames: [0, 13] - repeat: true - fall: - frames: [42, 42] - repeat: false - rise: - frames: [28, 28] - repeat: false - walk: - frames: [14, 19] - repeat: true - crouch: - frames: [56, 56] - repeat: false - death_1: - frames: [70, 76] - repeat: false +animations: + idle: + start: 0 + end: 13 + fps: &fps 9 + repeat: true + fall: + start: 42 + end: 42 + fps: *fps + repeat: false + rise: + start: 28 + end: 28 + fps: *fps + repeat: false + walk: + start: 14 + end: 19 + fps: *fps + repeat: true + crouch: + start: 56 + end: 56 + fps: *fps + repeat: false + death_1: + start: 70 + end: 76 + fps: *fps + repeat: false diff --git a/assets/player/skins/fishy/fishy.atlas.yaml b/assets/player/skins/fishy/fishy.atlas.yaml new file mode 100644 index 0000000000..a131ca063b --- /dev/null +++ b/assets/player/skins/fishy/fishy.atlas.yaml @@ -0,0 +1,4 @@ +image: ./fishy.png +tile_size: [96, 80] +columns: 14 +rows: 7 diff --git a/assets/player/skins/fishy/fishy.player.yaml b/assets/player/skins/fishy/fishy.player.yaml index 1e0004a64f..2251c10fe7 100644 --- a/assets/player/skins/fishy/fishy.player.yaml +++ b/assets/player/skins/fishy/fishy.player.yaml @@ -4,39 +4,50 @@ sounds: jump: ../../sounds/jump.ogg jump_volume: 0.05 land: ../../sounds/land.ogg - land_volume: 0.05 + land_volume: 0.025 grab: ../../sounds/grab.ogg grab_volume: 0.05 drop: ../../sounds/drop.ogg drop_volume: 0.05 -movement: - air_move_speed: 7 +stats: + air_move_speed: 6 + walk_speed: 6 + jump_speed: 14 slow_fall_speed: 1.5 -spritesheet: - image: fishy.png - tile_size: [96, 80] - columns: 14 - rows: 7 +atlas: ./fishy.atlas.yaml +body_size: [32, 48] +gravity: 1 - animation_fps: 9 - animations: - idle: - frames: [0, 13] - repeat: true - fall: - frames: [42, 42] - repeat: false - rise: - frames: [28, 28] - repeat: false - walk: - frames: [14, 19] - repeat: true - crouch: - frames: [56, 56] - repeat: false - death_1: - frames: [70, 76] - repeat: false +animations: + idle: + start: 0 + end: 13 + fps: &fps 9 + repeat: true + fall: + start: 42 + end: 42 + fps: *fps + repeat: false + rise: + start: 28 + end: 28 + fps: *fps + repeat: false + walk: + start: 14 + end: 19 + fps: *fps + repeat: true + crouch: + start: 56 + end: 56 + fps: *fps + repeat: false + death_1: + start: 70 + end: 76 + fps: *fps + repeat: false diff --git a/assets/player/skins/lionfishy/lionfishy.atlas.yaml b/assets/player/skins/lionfishy/lionfishy.atlas.yaml new file mode 100644 index 0000000000..85cdf87624 --- /dev/null +++ b/assets/player/skins/lionfishy/lionfishy.atlas.yaml @@ -0,0 +1,4 @@ +image: ./lionfishy.png +tile_size: [96, 80] +columns: 14 +rows: 7 diff --git a/assets/player/skins/lionfishy/lionfishy.player.yaml b/assets/player/skins/lionfishy/lionfishy.player.yaml index 7606197947..f59ea9891a 100644 --- a/assets/player/skins/lionfishy/lionfishy.player.yaml +++ b/assets/player/skins/lionfishy/lionfishy.player.yaml @@ -4,39 +4,50 @@ sounds: jump: ../../sounds/jump.ogg jump_volume: 0.05 land: ../../sounds/land.ogg - land_volume: 0.05 + land_volume: 0.025 grab: ../../sounds/grab.ogg grab_volume: 0.05 drop: ../../sounds/drop.ogg drop_volume: 0.05 -movement: - air_move_speed: 7 +stats: + air_move_speed: 6 + walk_speed: 6 + jump_speed: 14 slow_fall_speed: 1.5 -spritesheet: - image: lionfishy.png - tile_size: [96, 80] - columns: 14 - rows: 7 +atlas: ./lionfishy.atlas.yaml +body_size: [32, 48] +gravity: 1 - animation_fps: 9 - animations: - idle: - frames: [0, 13] - repeat: true - fall: - frames: [42, 42] - repeat: false - rise: - frames: [28, 28] - repeat: false - walk: - frames: [14, 19] - repeat: true - crouch: - frames: [56, 56] - repeat: false - death_1: - frames: [70, 76] - repeat: false +animations: + idle: + start: 0 + end: 13 + fps: &fps 9 + repeat: true + fall: + start: 42 + end: 42 + fps: *fps + repeat: false + rise: + start: 28 + end: 28 + fps: *fps + repeat: false + walk: + start: 14 + end: 19 + fps: *fps + repeat: true + crouch: + start: 56 + end: 56 + fps: *fps + repeat: false + death_1: + start: 70 + end: 76 + fps: *fps + repeat: false diff --git a/assets/player/skins/orcy/orcy.atlas.yaml b/assets/player/skins/orcy/orcy.atlas.yaml new file mode 100644 index 0000000000..4803242e71 --- /dev/null +++ b/assets/player/skins/orcy/orcy.atlas.yaml @@ -0,0 +1,4 @@ +image: ./orcy.png +tile_size: [96, 80] +columns: 14 +rows: 7 diff --git a/assets/player/skins/orcy/orcy.player.yaml b/assets/player/skins/orcy/orcy.player.yaml index 1481fb44d8..e8da1671bd 100644 --- a/assets/player/skins/orcy/orcy.player.yaml +++ b/assets/player/skins/orcy/orcy.player.yaml @@ -4,39 +4,50 @@ sounds: jump: ../../sounds/jump.ogg jump_volume: 0.05 land: ../../sounds/land.ogg - land_volume: 0.05 + land_volume: 0.025 grab: ../../sounds/grab.ogg grab_volume: 0.05 drop: ../../sounds/drop.ogg drop_volume: 0.05 -movement: - air_move_speed: 7 +stats: + air_move_speed: 6 + walk_speed: 6 + jump_speed: 14 slow_fall_speed: 1.5 -spritesheet: - image: orcy.png - tile_size: [96, 80] - columns: 14 - rows: 7 +atlas: ./orcy.atlas.yaml +body_size: [32, 48] +gravity: 1 - animation_fps: 9 - animations: - idle: - frames: [0, 13] - repeat: true - fall: - frames: [42, 42] - repeat: false - rise: - frames: [28, 28] - repeat: false - walk: - frames: [14, 19] - repeat: true - crouch: - frames: [56, 56] - repeat: false - death_1: - frames: [70, 76] - repeat: false +animations: + idle: + start: 0 + end: 13 + fps: &fps 9 + repeat: true + fall: + start: 42 + end: 42 + fps: *fps + repeat: false + rise: + start: 28 + end: 28 + fps: *fps + repeat: false + walk: + start: 14 + end: 19 + fps: *fps + repeat: true + crouch: + start: 56 + end: 56 + fps: *fps + repeat: false + death_1: + start: 70 + end: 76 + fps: *fps + repeat: false diff --git a/assets/player/skins/pescy/pescy.atlas.yaml b/assets/player/skins/pescy/pescy.atlas.yaml new file mode 100644 index 0000000000..93781a8f09 --- /dev/null +++ b/assets/player/skins/pescy/pescy.atlas.yaml @@ -0,0 +1,4 @@ +image: ./pescy.png +tile_size: [96, 80] +columns: 14 +rows: 7 diff --git a/assets/player/skins/pescy/pescy.player.yaml b/assets/player/skins/pescy/pescy.player.yaml index eaca25132d..c99a671d0e 100644 --- a/assets/player/skins/pescy/pescy.player.yaml +++ b/assets/player/skins/pescy/pescy.player.yaml @@ -4,39 +4,50 @@ sounds: jump: ../../sounds/jump.ogg jump_volume: 0.05 land: ../../sounds/land.ogg - land_volume: 0.05 + land_volume: 0.025 grab: ../../sounds/grab.ogg grab_volume: 0.05 drop: ../../sounds/drop.ogg drop_volume: 0.05 -movement: - air_move_speed: 7 +stats: + air_move_speed: 6 + walk_speed: 6 + jump_speed: 14 slow_fall_speed: 1.5 -spritesheet: - image: pescy.png - tile_size: [96, 80] - columns: 14 - rows: 7 +atlas: ./pescy.atlas.yaml +body_size: [32, 48] +gravity: 1 - animation_fps: 9 - animations: - idle: - frames: [0, 13] - repeat: true - fall: - frames: [42, 42] - repeat: false - rise: - frames: [28, 28] - repeat: false - walk: - frames: [14, 19] - repeat: true - crouch: - frames: [56, 56] - repeat: false - death_1: - frames: [70, 76] - repeat: false +animations: + idle: + start: 0 + end: 13 + fps: &fps 9 + repeat: true + fall: + start: 42 + end: 42 + fps: *fps + repeat: false + rise: + start: 28 + end: 28 + fps: *fps + repeat: false + walk: + start: 14 + end: 19 + fps: *fps + repeat: true + crouch: + start: 56 + end: 56 + fps: *fps + repeat: false + death_1: + start: 70 + end: 76 + fps: *fps + repeat: false diff --git a/assets/player/skins/sharky/sharky.atlas.yaml b/assets/player/skins/sharky/sharky.atlas.yaml new file mode 100644 index 0000000000..f044955b92 --- /dev/null +++ b/assets/player/skins/sharky/sharky.atlas.yaml @@ -0,0 +1,4 @@ +image: ./sharky.png +tile_size: [96, 80] +columns: 14 +rows: 7 diff --git a/assets/player/skins/sharky/sharky.player.yaml b/assets/player/skins/sharky/sharky.player.yaml index 1b079230a1..cff250a51c 100644 --- a/assets/player/skins/sharky/sharky.player.yaml +++ b/assets/player/skins/sharky/sharky.player.yaml @@ -4,39 +4,50 @@ sounds: jump: ../../sounds/jump.ogg jump_volume: 0.05 land: ../../sounds/land.ogg - land_volume: 0.05 + land_volume: 0.025 grab: ../../sounds/grab.ogg grab_volume: 0.05 drop: ../../sounds/drop.ogg drop_volume: 0.05 -movement: - air_move_speed: 7 +stats: + air_move_speed: 6 + walk_speed: 6 + jump_speed: 14 slow_fall_speed: 1.5 -spritesheet: - image: sharky.png - tile_size: [96, 80] - columns: 14 - rows: 7 +atlas: ./sharky.atlas.yaml +body_size: [32, 48] +gravity: 1 - animation_fps: 9 - animations: - idle: - frames: [0, 13] - repeat: true - fall: - frames: [42, 42] - repeat: false - rise: - frames: [28, 28] - repeat: false - walk: - frames: [14, 19] - repeat: true - crouch: - frames: [56, 56] - repeat: false - death_1: - frames: [70, 76] - repeat: false +animations: + idle: + start: 0 + end: 13 + fps: &fps 9 + repeat: true + fall: + start: 42 + end: 42 + fps: *fps + repeat: false + rise: + start: 28 + end: 28 + fps: *fps + repeat: false + walk: + start: 14 + end: 19 + fps: *fps + repeat: true + crouch: + start: 56 + end: 56 + fps: *fps + repeat: false + death_1: + start: 70 + end: 76 + fps: *fps + repeat: false diff --git a/clippy.toml b/clippy.toml index 5e30523c24..6b52d081c9 100644 --- a/clippy.toml +++ b/clippy.toml @@ -1 +1 @@ -type-complexity-threshold = 300 +type-complexity-threshold = 400 diff --git a/core/Cargo.toml b/core/Cargo.toml new file mode 100644 index 0000000000..754f1b9fff --- /dev/null +++ b/core/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "jumpy_core" +version = "0.1.0" +edition = "2021" + +[dependencies] +bones_bevy_asset = { git = "https://github.com/fishfolk/bones" } +bones_lib = { git = "https://github.com/fishfolk/bones", features = ["serde"] } +type_ulid = { git = "https://github.com/fishfolk/bones" } + +bytemuck = { version = "1.12.3", features = ["derive"] } +glam = { version = "0.22.0", features = ["bytemuck"] } +serde = { version = "1.0.152", features = ["derive"] } +tracing = "0.1.37" +hex = "0.4.3" +csscolorparser = "0.6.2" + +[dependencies.bevy] +version = "0.9.0" +default-features = false +features = [ + "bevy_asset" +] diff --git a/core/README.md b/core/README.md new file mode 100644 index 0000000000..b362b89bc1 --- /dev/null +++ b/core/README.md @@ -0,0 +1,3 @@ +# Jumpy Core + +This crate contains the core Jumpy game loop. Encapsulating the game core here makes it independent whatever framework/engine runs the game loop and makes it easier to make deterministic. diff --git a/core/src/camera.rs b/core/src/camera.rs new file mode 100644 index 0000000000..d6d6b3194a --- /dev/null +++ b/core/src/camera.rs @@ -0,0 +1,101 @@ +use crate::prelude::*; + +pub fn install(session: &mut GameSession) { + // Spawn the camera + session + .world + .run_system( + |mut entities: ResMut, + mut cameras: CompMut, + mut transforms: CompMut| { + let ent = entities.create(); + + cameras.insert(ent, default()); + transforms.insert(ent, default()); + }, + ) + .unwrap(); + + session + .stages + .add_system_to_stage(CoreStage::Last, camera_controller); +} + +fn camera_controller( + meta: Res, + entities: Res, + map_handle: Res, + map_assets: BevyAssets, + mut cameras: CompMut, + mut transforms: CompMut, + player_indexes: Comp, + window: Res, +) { + const CAMERA_PADDING: f32 = 300.0; + const MOVE_LERP_FACTOR: f32 = 0.1; + const ZOOM_IN_LERP_FACTOR: f32 = 0.04; + const ZOOM_OUT_LERP_FACTOR: f32 = 0.1; + const MIN_BOUND: f32 = 350.0; + + let Some(map) = map_assets.get(&map_handle.get_bevy_handle()) else { + return; + }; + let Some((camera_ent, (camera, camera_transform))) = entities.iter_with((&mut cameras, &mut transforms)).next() else { + return + }; + let mut camera_transform = *camera_transform; + + let window_aspect = window.size.x / window.size.y; + let default_height = meta.camera_height; + let mut scale = camera.height / default_height; + let default_width = window_aspect * default_height; + + let map_width = map.tile_size.x * map.grid_size.x as f32; + let map_height = map.tile_size.y * map.grid_size.y as f32; + let min_player_pos = Vec2::new(-CAMERA_PADDING, -CAMERA_PADDING); + let max_player_pos = Vec2::new(map_width + CAMERA_PADDING, map_height + CAMERA_PADDING); + + let mut middle_point = Vec2::ZERO; + let mut min = Vec2::new(100000.0, 100000.0); + let mut max = Vec2::new(-100000.0, -100000.0); + + let players: Vec<&Transform> = entities + .iter_with((&player_indexes, &transforms)) + .map(|x| x.1 .1) + .collect(); + + let player_count = players.len(); + + for player_transform in &players { + let pos = player_transform.translation.truncate(); + let pos = pos.max(min_player_pos).min(max_player_pos); + middle_point += pos; + + min.x = pos.x.min(min.x); + min.y = pos.y.min(min.y); + max.x = pos.x.max(max.x); + max.y = pos.y.max(max.y); + } + + middle_point /= player_count.max(1) as f32; + + let size = (max - min) + CAMERA_PADDING; + let size = size.max(Vec2::splat(MIN_BOUND)); + + let rh = size.y / default_height; + let rw = size.x / default_width; + let r_target = if rh > rw { rh } else { rw }; + let r_diff = r_target - scale; + // We zoom out twice as fast as we zoom in + if r_diff > 0.0 { + scale += r_diff * ZOOM_OUT_LERP_FACTOR; + } else { + scale += r_diff * ZOOM_IN_LERP_FACTOR; + } + + let delta = camera_transform.translation.truncate() - middle_point; + let dist = delta * MOVE_LERP_FACTOR; + camera.height = scale * default_height; + camera_transform.translation -= dist.extend(0.0); + transforms.insert(camera_ent, camera_transform); +} diff --git a/core/src/damage.rs b/core/src/damage.rs new file mode 100644 index 0000000000..b5ef648bd6 --- /dev/null +++ b/core/src/damage.rs @@ -0,0 +1,67 @@ +//! Systems and components related to damage/kill zones + +use crate::{physics::collisions::Rect, prelude::*}; + +pub fn install(session: &mut GameSession) { + session + .stages + .add_system_to_stage(CoreStage::PostUpdate, kill_players_in_damage_region); +} + +/// A rectangular damage region. +/// +/// While this _might_ change in the future, damage regions will kill players immediately, so there +/// is no "damage" field. +#[derive(Debug, Clone, Default, TypeUlid)] +#[ulid = "01GP1X5MBXZNEC4Y0WF5AKCA3Z"] +pub struct DamageRegion { + /// The size of the damage region in pixels + pub size: Vec2, +} + +impl DamageRegion { + /// Get the collision rectangle of this damage region, given it's transform. + pub fn collider_rect(&self, position: Vec3) -> Rect { + Rect::new(position.x, position.y, self.size.x, self.size.y) + } +} + +/// A component that may be added to a damage region entity to indicate the triggering entity. +/// +/// If this entity is a player, it will not be harmed by the damage region. +#[derive(Debug, Clone, TypeUlid)] +#[ulid = "01GP1X4NM7GMEKKZ4FEZ1RK3T0"] +pub struct DamageRegionOwner(pub Entity); + +/// System that will eliminate players that are intersecting with a damage region. +fn kill_players_in_damage_region( + entities: Res, + player_indexes: Comp, + transforms: Comp, + damage_regions: Comp, + damage_region_owners: Comp, + bodies: Comp, + mut player_events: ResMut, +) { + for (player_ent, (_idx, transform, body)) in + entities.iter_with((&player_indexes, &transforms, &bodies)) + { + let player_rect = body.collider_rect(transform.translation); + for (ent, (damage_region, transform)) in entities.iter_with((&damage_regions, &transforms)) + { + let owner = damage_region_owners.get(ent); + // Don't damage the player that owns this damage region + if let Some(owner) = owner { + if owner.0 == player_ent { + continue; + } + } + + let damage_rect = damage_region.collider_rect(transform.translation); + + if player_rect.overlaps(&damage_rect) { + player_events.kill(player_ent); + } + } + } +} diff --git a/core/src/elements.rs b/core/src/elements.rs new file mode 100644 index 0000000000..aabae22bb8 --- /dev/null +++ b/core/src/elements.rs @@ -0,0 +1,23 @@ +use crate::prelude::*; + +pub mod decoration; +pub mod player_spawner; +pub mod sproinger; +pub mod sword; + +/// Marker component added to map elements that have been hydrated. +#[derive(Clone, TypeUlid)] +#[ulid = "01GP42Q5GCY5Y4JC7SQ1YRHYKN"] +pub struct MapElementHydrated; + +/// Component containing an element's metadata handle. +#[derive(Clone, TypeUlid, Deref, DerefMut, Default)] +#[ulid = "01GP421CHN323T2614F19PA5E9"] +pub struct ElementHandle(pub Handle); + +pub fn install(session: &mut GameSession) { + decoration::install(session); + player_spawner::install(session); + sproinger::install(session); + sword::install(session); +} diff --git a/core/src/elements/decoration.rs b/core/src/elements/decoration.rs new file mode 100644 index 0000000000..4c36ca42a7 --- /dev/null +++ b/core/src/elements/decoration.rs @@ -0,0 +1,54 @@ +use crate::prelude::*; + +pub fn install(session: &mut GameSession) { + session + .stages + .add_system_to_stage(CoreStage::First, hydrate); +} + +fn hydrate( + entities: Res, + mut hydrated: CompMut, + element_handles: Comp, + element_assets: BevyAssets, + mut atlas_sprites: CompMut, + mut animated_sprites: CompMut, +) { + let mut not_hydrated_bitset = hydrated.bitset().clone(); + not_hydrated_bitset.bit_not(); + not_hydrated_bitset.bit_and(element_handles.bitset()); + + for entity in entities.iter_with_bitset(¬_hydrated_bitset) { + let element_handle = element_handles.get(entity).unwrap(); + let Some(element_meta) = element_assets.get(&element_handle.get_bevy_handle()) else { + continue; + }; + + if let BuiltinElementKind::AnimatedDecoration { + start_frame, + end_frame, + fps, + atlas, + } = &element_meta.builtin + { + hydrated.insert(entity, MapElementHydrated); + atlas_sprites.insert( + entity, + AtlasSprite { + atlas: atlas.clone(), + ..default() + }, + ); + animated_sprites.insert( + entity, + AnimatedSprite { + start: *start_frame, + end: *end_frame, + fps: *fps, + repeat: true, + ..default() + }, + ); + } + } +} diff --git a/core/src/elements/player_spawner.rs b/core/src/elements/player_spawner.rs new file mode 100644 index 0000000000..dd00a99f23 --- /dev/null +++ b/core/src/elements/player_spawner.rs @@ -0,0 +1,81 @@ +use crate::{prelude::*, MAX_PLAYERS}; + +pub fn install(session: &mut GameSession) { + session + .stages + .add_system_to_stage(CoreStage::First, hydrate) + .add_system_to_stage(CoreStage::First, update); +} + +/// Marker component for player spawners. +#[derive(Clone, Debug, TypeUlid)] +#[ulid = "01GP4YT7VARRVHFWJ46HNSN09P"] +pub struct PlayerSpawner; + +/// Resource that stores the next spawner to use when spawning a player. +#[derive(Clone, Debug, TypeUlid, Default)] +#[ulid = "01GP4YVEQGVQATG3KSPC0SD37N"] +pub struct CurrentSpawner(pub usize); + +fn hydrate( + entities: Res, + mut hydrated: CompMut, + element_handles: Comp, + element_assets: BevyAssets, + mut player_spawners: CompMut, +) { + let mut not_hydrated_bitset = hydrated.bitset().clone(); + not_hydrated_bitset.bit_not(); + not_hydrated_bitset.bit_and(element_handles.bitset()); + + for entity in entities.iter_with_bitset(¬_hydrated_bitset) { + let element_handle = element_handles.get(entity).unwrap(); + let Some(element_meta) = element_assets.get(&element_handle.get_bevy_handle()) else { + continue; + }; + + if let BuiltinElementKind::PlayerSpawner = &element_meta.builtin { + hydrated.insert(entity, MapElementHydrated); + player_spawners.insert(entity, PlayerSpawner); + } + } +} + +fn update( + mut entities: ResMut, + mut current_spawner: ResMut, + player_spawners: Comp, + mut player_indexes: CompMut, + mut transforms: CompMut, + player_inputs: Res, +) { + let alive_players = entities + .iter_with(&player_indexes) + .map(|(_ent, pidx)| pidx.0) + .collect::>(); + let spawn_points = entities + .iter_with((&player_spawners, &transforms)) + .map(|(_ent, (_spawner, transform))| transform.translation) + .collect::>(); + + // For every player + for i in 0..MAX_PLAYERS { + let player = &player_inputs.players[i]; + + // If the player is active, but not alive + if player.active && !alive_players.contains(&i) { + // Increment the spawner index + current_spawner.0 += 1; + current_spawner.0 %= spawn_points.len().max(1); + + let mut spawn_point = *spawn_points.get(current_spawner.0).unwrap(); + + // Make sure each player spawns at a different z level + spawn_point.z += i as f32 * 0.1; + + let player_ent = entities.create(); + player_indexes.insert(player_ent, PlayerIdx(i)); + transforms.insert(player_ent, Transform::from_translation(spawn_point)); + } + } +} diff --git a/core/src/elements/sproinger.rs b/core/src/elements/sproinger.rs new file mode 100644 index 0000000000..75d080fb49 --- /dev/null +++ b/core/src/elements/sproinger.rs @@ -0,0 +1,111 @@ +use crate::prelude::*; + +pub fn install(session: &mut GameSession) { + session + .stages + .add_system_to_stage(CoreStage::PreUpdate, hydrate) + .add_system_to_stage(CoreStage::PostUpdate, update); +} + +#[derive(Clone, Debug, TypeUlid, Default)] +#[ulid = "01GP9K01SC9YDTQBYK16EK7ZYD"] +pub struct Sproinger { + pub frame: u32, + pub sproinging: bool, +} + +fn hydrate( + entities: Res, + mut hydrated: CompMut, + element_handles: Comp, + element_assets: BevyAssets, + mut sproingers: CompMut, + mut atlas_sprites: CompMut, + mut bodies: CompMut, +) { + let mut not_hydrated_bitset = hydrated.bitset().clone(); + not_hydrated_bitset.bit_not(); + not_hydrated_bitset.bit_and(element_handles.bitset()); + + for entity in entities.iter_with_bitset(¬_hydrated_bitset) { + let element_handle = element_handles.get(entity).unwrap(); + let Some(element_meta) = element_assets.get(&element_handle.get_bevy_handle()) else { + continue; + }; + + if let BuiltinElementKind::Sproinger { + atlas, + body_size, + body_offset, + .. + } = &element_meta.builtin + { + hydrated.insert(entity, MapElementHydrated); + atlas_sprites.insert(entity, AtlasSprite::new(atlas.clone())); + bodies.insert( + entity, + KinematicBody { + size: *body_size, + offset: *body_offset, + has_mass: false, + ..default() + }, + ); + sproingers.insert(entity, sproinger::default()); + } + } +} + +fn update( + entities: Res, + element_handles: Comp, + element_assets: BevyAssets, + mut sproingers: CompMut, + mut atlas_sprites: CompMut, + mut bodies: CompMut, + collision_world: CollisionWorld, + mut audio_events: ResMut, +) { + for (entity, (sproinger, sprite)) in entities.iter_with((&mut sproingers, &mut atlas_sprites)) { + let element_handle = element_handles.get(entity).unwrap(); + let Some(element_meta) = element_assets.get(&element_handle.get_bevy_handle()) else { + continue; + }; + + let BuiltinElementKind::Sproinger { + sound, + sound_volume, + spring_velocity, + .. + } = &element_meta.builtin else { + unreachable!(); + }; + + if sproinger.sproinging { + match sproinger.frame { + 1 => { + audio_events.play(sound.clone(), *sound_volume); + sprite.index = 2 + } + 4 => sprite.index = 3, + 8 => sprite.index = 4, + 12 => sprite.index = 5, + x if x >= 20 => { + sprite.index = 0; + sproinger.sproinging = false; + sproinger.frame = 0; + } + _ => (), + } + sproinger.frame += 1; + } else { + for collider_ent in collision_world.actor_collisions(entity) { + let mut body = bodies.get_mut(collider_ent).unwrap(); + + body.velocity.y = *spring_velocity; + + sproinger.sproinging = true; + } + } + } +} diff --git a/core/src/elements/sword.rs b/core/src/elements/sword.rs new file mode 100644 index 0000000000..9500eb5388 --- /dev/null +++ b/core/src/elements/sword.rs @@ -0,0 +1,317 @@ +use crate::{damage::DamageRegion, prelude::*}; + +pub fn install(session: &mut GameSession) { + session + .stages + .add_system_to_stage(CoreStage::PreUpdate, hydrate) + .add_system_to_stage(CoreStage::Last, update) + .add_system_to_stage(CoreStage::Last, spawn_damage_regions); +} + +#[derive(Copy, Clone, Debug, TypeUlid, Default)] +#[ulid = "01GP9NA6ZQGMC0YY9K2XFJH9KA"] +pub struct Sword { + pub state: SwordState, + pub dropped_time: f32, +} + +#[derive(Default, Clone, Copy, Debug)] +pub enum SwordState { + #[default] + Idle, + Swinging { + frame: usize, + }, + Cooldown { + frame: usize, + }, +} + +fn hydrate( + game_meta: Res, + mut entities: ResMut, + mut hydrated: CompMut, + mut element_handles: CompMut, + element_assets: BevyAssets, + mut swords: CompMut, + mut atlas_sprites: CompMut, + mut bodies: CompMut, + mut transforms: CompMut, + mut items: CompMut, + mut respawn_points: CompMut, +) { + let mut not_hydrated_bitset = hydrated.bitset().clone(); + not_hydrated_bitset.bit_not(); + not_hydrated_bitset.bit_and(element_handles.bitset()); + + let spawners = entities + .iter_with_bitset(¬_hydrated_bitset) + .collect::>(); + + for spawner_ent in spawners { + let transform = *transforms.get(spawner_ent).unwrap(); + let element_handle = element_handles.get(spawner_ent).unwrap(); + let Some(element_meta) = element_assets.get(&element_handle.get_bevy_handle()) else { + continue; + }; + + if let BuiltinElementKind::Sword { + atlas, + body_size, + body_offset, + can_rotate, + bounciness, + .. + } = &element_meta.builtin + { + hydrated.insert(spawner_ent, MapElementHydrated); + + let entity = entities.create(); + items.insert(entity, Item); + swords.insert(entity, Sword::default()); + atlas_sprites.insert(entity, AtlasSprite::new(atlas.clone())); + respawn_points.insert(entity, MapRespawnPoint(transform.translation)); + transforms.insert(entity, transform); + element_handles.insert(entity, element_handle.clone()); + hydrated.insert(entity, MapElementHydrated); + bodies.insert( + entity, + KinematicBody { + size: *body_size, + offset: *body_offset, + has_mass: true, + has_friction: true, + can_rotate: *can_rotate, + bounciness: *bounciness, + gravity: game_meta.physics.gravity, + ..default() + }, + ); + } + } +} + +#[derive(Clone, TypeUlid, Default, Deref, DerefMut)] +#[ulid = "01GP9W74TET7QMND26S7G7NCA9"] +struct PendingDamageRegions(Vec<(Vec2, Vec2, Entity)>); + +fn update( + entities: Res, + element_handles: Comp, + element_assets: BevyAssets, + collision_world: CollisionWorld, + mut audio_events: ResMut, + mut transforms: CompMut, + mut swords: CompMut, + mut sprites: CompMut, + mut bodies: CompMut, + mut items_used: CompMut, + mut items_dropped: CompMut, + player_indexes: Comp, + inventories: Comp, + mut player_events: ResMut, + mut pending_damage_regions: ResMut, +) { + // Collect player inventories + #[derive(Copy, Clone)] + struct Inv { + player: Entity, + item: Entity, + } + let mut player_inventories: [Option; MAX_PLAYERS] = [None; MAX_PLAYERS]; + for (player, (idx, inventory)) in entities.iter_with((&player_indexes, &inventories)) { + if let Some(item) = inventory.0 { + player_inventories[idx.0] = Some(Inv { player, item }); + } + } + + for (entity, (sword, element_handle)) in entities.iter_with((&mut swords, &element_handles)) { + let Some(element_meta) = element_assets.get(&element_handle.get_bevy_handle()) else { + continue; + }; + + let BuiltinElementKind::Sword { + cooldown_frames, + sound, + sound_volume, + arm_delay, + throw_velocity, + angular_velocity, + .. + } = &element_meta.builtin else { + unreachable!(); + }; + + // If the item is being held + if let Some(inventory) = player_inventories + .iter() + .find_map(|x| x.filter(|x| x.item == entity)) + { + let player = inventory.player; + let body = bodies.get_mut(entity).unwrap(); + + // Deactivate collisions while being held + body.is_deactivated = true; + + // Flip the sprite to match the player orientation + let flip = sprites.get(player).unwrap().flip_x; + let sprite = sprites.get_mut(entity).unwrap(); + sprite.flip_x = flip; + let flip_factor = if flip { -1.0 } else { 1.0 }; + + let player_translation = transforms.get(player).unwrap().translation; + let transform = transforms.get_mut(entity).unwrap(); + let offset = Vec3::new(13.0 * flip_factor, 21.0, 1.0); + transform.translation = player_translation + offset; + transform.rotation = Quat::IDENTITY; + + // Reset the sword animation if we're not swinging it + if !matches!(sword.state, SwordState::Swinging { .. }) { + sprite.index = 4; + } + + let mut next_state = None; + match &mut sword.state { + SwordState::Idle => (), + SwordState::Swinging { frame } => { + // If we're at the end of the swinging animation + if sprite.index >= 11 { + // Go to cooldown frames + next_state = Some(SwordState::Cooldown { frame: 0 }); + + // If we're still swinging + } else { + // Set the current attack frame to the animation index + sprite.index = 8 + *frame / 3; + } + + // TODO: Move all these constants to the builtin item config + match *frame / 3 { + 0 => pending_damage_regions.push(( + Vec2::new( + player_translation.x + 20.0 * flip_factor, + player_translation.y + 20.0, + ), + Vec2::new(30.0, 70.0), + player, + )), + 1 => pending_damage_regions.push(( + Vec2::new( + player_translation.x + 25.0 * flip_factor, + player_translation.y + 20.0, + ), + Vec2::new(40.0, 50.0), + player, + )), + 2 => pending_damage_regions.push(( + Vec2::new( + player_translation.x + 20.0 * flip_factor, + player_translation.y, + ), + Vec2::new(40.0, 50.0), + player, + )), + _ => (), + } + + *frame += 1; + } + SwordState::Cooldown { frame } => { + if *frame >= *cooldown_frames { + next_state = Some(SwordState::Idle); + } else { + *frame += 1; + } + } + } + + if let Some(next) = next_state { + sword.state = next; + } + + // If the item is being used + let item_used = items_used.get(entity).is_some(); + if item_used { + items_used.remove(entity); + if matches!(sword.state, SwordState::Idle) { + sprite.index = 8; + sword.state = SwordState::Swinging { frame: 0 }; + audio_events.play(sound.clone(), *sound_volume); + } + } + } else { + let body = bodies.get_mut(entity).unwrap(); + sword.dropped_time += 1.0 / crate::FPS as f32; + + let is_on_floor = body.is_on_ground || body.is_on_platform; + let is_deals_damage = (is_on_floor && body.velocity.x != 0.0) + || (!is_on_floor && body.velocity != Vec2::ZERO); + if is_deals_damage && sword.dropped_time >= *arm_delay { + collision_world + .actor_collisions(entity) + .into_iter() + .filter(|&x| player_indexes.contains(x)) + .for_each(|player| player_events.kill(player)); + } + } + + // If the item was dropped + if let Some(dropped) = items_dropped.get(entity).copied() { + let player = dropped.player; + sword.dropped_time = 0.0; + + items_dropped.remove(entity); + let player_translation = transforms.get(dropped.player).unwrap().translation; + let player_velocity = bodies.get(player).unwrap().velocity; + + let body = bodies.get_mut(entity).unwrap(); + let sprite = sprites.get_mut(entity).unwrap(); + + // Re-activate physics + body.is_deactivated = false; + + // Put sword in rest position + sprite.index = 0; + + if player_velocity != Vec2::ZERO { + let horizontal_flip_factor = if sprite.flip_x { + Vec2::new(-1.0, 1.0) + } else { + Vec2::ONE + }; + body.velocity = *throw_velocity * horizontal_flip_factor + player_velocity; + body.angular_velocity = *angular_velocity * if sprite.flip_x { -1.0 } else { 1.0 }; + } + body.is_spawning = true; + + let transform = transforms.get_mut(entity).unwrap(); + transform.translation.y = player_translation.y; + transform.translation.x = player_translation.x; + transform.translation.z = player_translation.z; + } + } +} + +/// NOTE: This is in a separate system because the [`CollisionWorld`] param in the system above +/// requires an immutable borrow of [`Res`] internally, which conflicts with our need to +/// borrow [`ResMut`] so that we can spawn entities. +/// +/// TODO: We should add a command-queue abstraction like Bevy's `Commands` to bones ECS to help +/// allow queueing these kinds of operations and preventing the need for using separate systems. +fn spawn_damage_regions( + mut entities: ResMut, + mut pending_damage_regions: ResMut, + mut transforms: CompMut, + mut damage_regions: CompMut, + mut damage_region_owners: CompMut, + mut lifetimes: CompMut, +) { + for (pos, size, owner) in pending_damage_regions.0.drain(..) { + let entity = entities.create(); + + transforms.insert(entity, Transform::from_translation(pos.extend(0.0))); + damage_regions.insert(entity, DamageRegion { size }); + damage_region_owners.insert(entity, DamageRegionOwner(owner)); + lifetimes.insert(entity, Lifetime::new(2.0 / 60.0)); + } +} diff --git a/core/src/input.rs b/core/src/input.rs new file mode 100644 index 0000000000..fa802028ef --- /dev/null +++ b/core/src/input.rs @@ -0,0 +1,57 @@ +use crate::{prelude::*, MAX_PLAYERS}; + +pub fn install(session: &mut GameSession) { + session.world.resources.init::(); +} + +/// The inputs for each player in this simulation frame. +#[derive(Clone, Debug, TypeUlid)] +#[ulid = "01GP233N26N8DQAAS1WDGYM14X"] +pub struct PlayerInputs { + pub players: Vec, +} + +impl Default for PlayerInputs { + fn default() -> Self { + Self { + players: vec![default(); MAX_PLAYERS], + // has_updated: false, + } + } +} + +/// Player input, not just controls, but also other status that comes from the player, such as the +/// selected player and whether the player is actually active. +#[derive(Default, Clone, Debug, TypeUlid)] +#[ulid = "01GP2356AYJ5NW8GJ3WF0TCCY3"] +pub struct PlayerInput { + /// The player is currently "connected" and actively providing input. + pub active: bool, + /// This may be a null handle if a player hasn't been selected yet + pub selected_player: Handle, + /// The player control input + pub control: PlayerControl, + /// The player control input from the last fixed update + pub previous_control: PlayerControl, +} + +/// Player control input state +#[derive(Default, Clone, Debug)] +#[repr(C)] +pub struct PlayerControl { + pub move_direction: Vec2, + pub just_moved: bool, + pub moving: bool, + + pub jump_pressed: bool, + pub jump_just_pressed: bool, + + pub shoot_pressed: bool, + pub shoot_just_pressed: bool, + + pub grab_pressed: bool, + pub grab_just_pressed: bool, + + pub slide_pressed: bool, + pub slide_just_pressed: bool, +} diff --git a/core/src/item.rs b/core/src/item.rs new file mode 100644 index 0000000000..05be2e20df --- /dev/null +++ b/core/src/item.rs @@ -0,0 +1,26 @@ +use crate::prelude::*; + +/// Marker component for items. +/// +/// Items are any entity that players can pick up and use. +#[derive(Clone, Copy, TypeUlid)] +#[ulid = "01GP4DBSEB3R6ZNBNNTSY36GW4"] +pub struct Item; + +/// Marker component added to items when they are dropped. +#[derive(Clone, Copy, TypeUlid)] +#[ulid = "01GP4DH23M7M2CXVWADPZHW54F"] +pub struct ItemDropped { + /// The player that dropped the item + pub player: Entity, +} + +/// Marker component added to items when they are grabbed. +#[derive(Clone, Copy, TypeUlid)] +#[ulid = "01GP4DJ2RPYTDPKSKEK8JKK9VT"] +pub struct ItemGrabbed; + +/// Marker component added to items when they are used. +#[derive(Clone, Copy, TypeUlid)] +#[ulid = "01GP4DJ84TFB8Z7H9VY7Y0R47H"] +pub struct ItemUsed; diff --git a/core/src/lib.rs b/core/src/lib.rs new file mode 100644 index 0000000000..d68a170bcd --- /dev/null +++ b/core/src/lib.rs @@ -0,0 +1,53 @@ +#![doc = include_str!("../README.md")] +#![doc(html_logo_url = "https://avatars.githubusercontent.com/u/87333478?s=200&v=4")] +// This cfg_attr is needed because `rustdoc::all` includes lints not supported on stable +#![cfg_attr(doc, allow(unknown_lints))] +#![deny(rustdoc::all)] +#![allow(clippy::too_many_arguments)] + +/// Prelude for inside the crate +mod prelude { + pub use { + crate::{ + damage::*, elements::*, input::*, item::*, lifetime::*, map::*, metadata::*, + physics::*, player::*, session::*, MAX_PLAYERS, + }, + bones_bevy_asset::{BevyAssets, BonesBevyAsset, BonesBevyAssetLoad}, + bones_lib::prelude::*, + bytemuck::{Pod, Zeroable}, + glam::*, + serde::{Deserialize, Serialize}, + std::sync::Arc, + tracing::{debug, error, info, trace, warn}, + }; +} + +/// Prelude for use outside the crate +pub mod bevy_prelude { + pub use { + crate::{ + metadata::*, + session::{GameSession, GameSessionInfo}, + MAX_PLAYERS, + }, + bones_lib::prelude as bones, + }; +} + +pub mod camera; +pub mod damage; +pub mod elements; +pub mod input; +pub mod item; +pub mod lifetime; +pub mod map; +pub mod metadata; +pub mod physics; +pub mod player; +pub mod session; +pub mod testing; + +/// The target fixed frames-per-second that the game sumulation runs at. + +pub const FPS: f32 = 60.0; +pub const MAX_PLAYERS: usize = 4; diff --git a/core/src/lifetime.rs b/core/src/lifetime.rs new file mode 100644 index 0000000000..d34b0c5637 --- /dev/null +++ b/core/src/lifetime.rs @@ -0,0 +1,48 @@ +//! Module providing entity lifetime components and systems + +use crate::{prelude::*, FPS}; + +pub fn install(session: &mut GameSession) { + session + .stages + .add_system_to_stage(CoreStage::PostUpdate, lifetime_system); +} + +/// The lifetime state of an entity +/// +/// > **Note:** The age represents how long the entity has had the [`Lifetime`] component on it, not +/// > necessarily how long since the entity was spawned, if the [`Lifetime`] component was added +/// > later, after it was spawned. +/// > +/// > Also, the age and lifetime are public, subject to other system's modification. +#[derive(Copy, Clone, Default, TypeUlid)] +#[ulid = "01GP9SS1WH06QC352CZ8BKSTZE"] +pub struct Lifetime { + /// How long the entity should be allowed to live in seconds. + pub lifetime: f32, + /// How long the entity has lived in seconds. + pub age: f32, +} + +impl Lifetime { + pub fn new(lifetime: f32) -> Self { + Self { + lifetime, + ..default() + } + } +} + +/// Despawns entities that have an expired lifetime +fn lifetime_system(mut entities: ResMut, mut lifetimes: CompMut) { + let mut to_kill = Vec::new(); + for (entity, mut lifetime) in &mut entities.iter_with(&mut lifetimes) { + lifetime.age += 1.0 / FPS; + if lifetime.age > lifetime.lifetime { + to_kill.push(entity); + } + } + for entity in to_kill { + entities.kill(entity); + } +} diff --git a/core/src/map.rs b/core/src/map.rs new file mode 100644 index 0000000000..83535e614b --- /dev/null +++ b/core/src/map.rs @@ -0,0 +1,136 @@ +use crate::prelude::{collisions::TileCollision, *}; + +pub fn install(session: &mut GameSession) { + session + .stages + .add_system_to_stage(CoreStage::First, spawn_map) + .add_system_to_stage(CoreStage::First, handle_out_of_bounds_players_and_items); +} + +/// Resource containing the map metadata for this game session. +#[derive(Clone, TypeUlid, Deref, DerefMut, Default)] +#[ulid = "01GP2H6K9H3JEEMXFCKV4TGMWZ"] +pub struct MapHandle(pub Handle); + +/// Resource indicating whether the map has been spawned. +#[derive(Clone, TypeUlid, Default, Deref, DerefMut)] +#[ulid = "01GP3Z38HKE37JB6GRHHPPTY38"] +pub struct MapSpawned(pub bool); + +#[derive(Clone, TypeUlid, Default, Deref, DerefMut)] +#[ulid = "01GP9NY0Y50Y2A8M4A7E9NN8VE"] +pub struct MapRespawnPoint(pub Vec3); + +fn spawn_map( + mut entities: ResMut, + mut clear_color: ResMut, + map_handle: Res, + map_assets: BevyAssets, + mut map_spawned: ResMut, + mut tiles: CompMut, + mut tile_layers: CompMut, + mut transforms: CompMut, + mut element_handles: CompMut, + mut tile_collisions: CompMut, +) { + if map_spawned.0 { + return; + } + let Some(map) = map_assets.get(&map_handle.get_bevy_handle()) else { + return; + }; + map_spawned.0 = true; + **clear_color = map.background_color.0; + + for (i, layer) in map.layers.iter().enumerate() { + let layer_z = -1000.0 + i as f32; + match &layer.kind { + MapLayerKind::Tile(tile_layer_meta) => { + let mut tile_layer = TileLayer::new( + map.grid_size, + map.tile_size, + tile_layer_meta.tilemap.clone(), + ); + + for tile_meta in &tile_layer_meta.tiles { + let tile_ent = entities.create(); + tile_layer.set(tile_meta.pos, Some(tile_ent)); + tiles.insert( + tile_ent, + Tile { + idx: tile_meta.idx as usize, + ..default() + }, + ); + tile_collisions.insert( + tile_ent, + if tile_meta.jump_through { + TileCollision::JUMP_THROUGH + } else { + TileCollision::SOLID + }, + ); + } + let layer_ent = entities.create(); + tile_layers.insert(layer_ent, tile_layer); + transforms.insert( + layer_ent, + Transform::from_translation(Vec3::new(0.0, 0.0, layer_z)), + ); + } + MapLayerKind::Element(element_layer_meta) => { + for element_meta in &element_layer_meta.elements { + let element_ent = entities.create(); + + transforms.insert( + element_ent, + Transform::from_translation(element_meta.pos.extend(layer_z)), + ); + element_handles + .insert(element_ent, ElementHandle(element_meta.element.clone())); + } + } + } + } +} + +fn handle_out_of_bounds_players_and_items( + entities: Res, + mut transforms: CompMut, + player_indexes: Comp, + map_handle: Res, + map_assets: BevyAssets, + mut player_events: ResMut, + map_respawn_points: Comp, +) { + const KILL_ZONE_BORDER: f32 = 500.0; + let Some(map) = map_assets.get(&map_handle.get_bevy_handle()) else { + return; + }; + + let map_width = map.grid_size.x as f32 * map.tile_size.x; + let left_kill_zone = -KILL_ZONE_BORDER; + let right_kill_zone = map_width + KILL_ZONE_BORDER; + let bottom_kill_zone = -KILL_ZONE_BORDER; + + // Kill out of bounds players + for (player_ent, (_player_idx, transform)) in entities.iter_with((&player_indexes, &transforms)) + { + let pos = transform.translation; + + if pos.x < left_kill_zone || pos.x > right_kill_zone || pos.y < bottom_kill_zone { + player_events.kill(player_ent); + } + } + + // Reset out of bound item positions + for (_ent, (respawn_point, transform)) in + entities.iter_with((&map_respawn_points, &mut transforms)) + { + let pos = transform.translation; + + if pos.x < left_kill_zone || pos.x > right_kill_zone || pos.y < bottom_kill_zone { + transform.translation = respawn_point.0; + } + } +} diff --git a/core/src/metadata.rs b/core/src/metadata.rs new file mode 100644 index 0000000000..001a341fa7 --- /dev/null +++ b/core/src/metadata.rs @@ -0,0 +1,55 @@ +//! Core game metadata + +use serde::Deserializer; + +use crate::prelude::*; + +mod common; +mod element; +mod map; +mod player; + +pub use common::*; +pub use element::*; +pub use map::*; +pub use player::*; + +/// Resource containing the session's [`CoreMeta`]. +/// +/// This is wrapped in an [`Arc`] because it doesn't change over the course of a game, and because +/// it makes it very cheap to clone during game snapshots. +#[derive(::bevy::prelude::Resource, Deref, DerefMut, TypeUlid, Clone, Default, Debug)] +#[ulid = "01GNFXQXM8FCTD1JPDTJ796A25"] +pub struct CoreMetaArc(pub Arc); + +pub struct JumpyCoreAssetsPlugin; +impl ::bevy::prelude::Plugin for JumpyCoreAssetsPlugin { + fn build(&self, app: &mut ::bevy::prelude::App) { + use bones_bevy_asset::BonesBevyAssetAppExt; + app.add_bones_asset::() + .add_bones_asset::() + .add_bones_asset::() + .add_bones_asset::(); + } +} + +#[derive(BonesBevyAsset, Clone, Debug, Deserialize, TypeUlid, Default)] +#[asset_id = "core"] +#[ulid = "01GNWT2Q8EZ5CEV3MHWNMGEEA6"] +#[serde(deny_unknown_fields)] +pub struct CoreMeta { + pub camera_height: f32, + pub physics: PhysicsMeta, + pub players: Vec>, + pub stable_maps: Vec>, + pub experimental_maps: Vec>, +} + +#[derive(BonesBevyAssetLoad, Deserialize, Clone, Debug, Default)] +#[serde(deny_unknown_fields)] +pub struct PhysicsMeta { + pub gravity: f32, + pub terminal_velocity: f32, + pub friction_lerp: f32, + pub stop_threshold: f32, +} diff --git a/core/src/metadata/common.rs b/core/src/metadata/common.rs new file mode 100644 index 0000000000..753bf9fa6d --- /dev/null +++ b/core/src/metadata/common.rs @@ -0,0 +1,44 @@ +use super::*; +use serde::{Deserialize, Deserializer}; + +#[derive(Clone, Copy, Debug)] +pub struct ColorMeta(pub [f32; 4]); +impl bones_bevy_asset::BonesBevyAssetLoad for ColorMeta {} + +impl Default for ColorMeta { + fn default() -> Self { + Self([0.0, 0.0, 0.0, 1.0]) + } +} + +impl<'de> Deserialize<'de> for ColorMeta { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + deserializer.deserialize_str(ColorVisitor) + } +} + +struct ColorVisitor; +impl<'de> serde::de::Visitor<'de> for ColorVisitor { + type Value = ColorMeta; + + fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { + formatter.write_str("A hex-encoded RGB or RGBA color") + } + + fn visit_str(self, v: &str) -> Result + where + E: serde::de::Error, + { + Ok(ColorMeta( + csscolorparser::parse(v) + .map(|x| { + let [r, g, b, a] = x.to_array(); + [r as f32, g as f32, b as f32, a as f32] + }) + .map_err(|e| E::custom(e))?, + )) + } +} diff --git a/core/src/metadata/element.rs b/core/src/metadata/element.rs new file mode 100644 index 0000000000..e122ed675f --- /dev/null +++ b/core/src/metadata/element.rs @@ -0,0 +1,189 @@ +use super::*; + +#[derive(BonesBevyAsset, TypeUlid, Deserialize, Clone, Debug, Default)] +#[asset_id = "element"] +#[ulid = "01GP28EQQVVQHDA0C9C4168C7W"] +#[serde(deny_unknown_fields)] +pub struct ElementMeta { + pub name: String, + pub category: String, + #[serde(default)] + pub builtin: BuiltinElementKind, + + /// The size of the bounding rect for the element in the editor + #[serde(default = "editor_size_default")] + pub editor_size: Vec2, +} + +fn editor_size_default() -> Vec2 { + Vec2::splat(16.0) +} + +/// The kind of built-in +#[derive(BonesBevyAssetLoad, Deserialize, Clone, Debug, Default)] +#[serde(deny_unknown_fields)] +pub enum BuiltinElementKind { + /// This is not a built-in item + #[default] + None, + /// Player spawner + PlayerSpawner, + /// Grenades item + Grenade { + body_size: Vec2, + body_offset: Vec2, + grab_offset: Vec2, + damage_region_size: Vec2, + damage_region_lifetime: f32, + throw_velocity: Vec2, + explosion_lifetime: f32, + explosion_frames: usize, + explosion_fps: f32, + explosion_sound: Handle, + fuse_sound: String, + #[serde(skip)] + fuse_sound_handle: Handle, + /// The time in seconds before a grenade explodes + fuse_time: f32, + #[serde(default)] + can_rotate: bool, + /// The grenade atlas + atlas: Handle, + explosion_atlas: Handle, + #[serde(default)] + bouncyness: f32, + #[serde(default)] + angular_velocity: f32, + }, + /// An animated decoration such as seaweed or anemones + AnimatedDecoration { + start_frame: usize, + end_frame: usize, + fps: f32, + atlas: Handle, + }, + /// A crab roaming on the ocean floor + Crab { + start_frame: usize, + end_frame: usize, + fps: f32, + comfortable_spawn_distance: f32, + comfortable_scared_distance: f32, + same_level_threshold: f32, + walk_speed: f32, + run_speed: f32, + /// 45 fix updates per second, so if this is 45 the maximum delay between actions + /// will be 1 second + timer_delay_max: u8, + atlas: Handle, + }, + /// This is a sproinger + Sproinger { + atlas: Handle, + sound: Handle, + sound_volume: f32, + body_size: Vec2, + body_offset: Vec2, + spring_velocity: f32, + }, + /// This is a sword + Sword { + atlas: Handle, + sound: Handle, + sound_volume: f32, + body_size: Vec2, + #[serde(default)] + body_offset: Vec2, + angular_velocity: f32, + can_rotate: bool, + arm_delay: f32, + bounciness: f32, + throw_velocity: Vec2, + cooldown_frames: usize, + }, + /// The throwable crate item + Crate { + atlas: Handle, + + breaking_atlas: Handle, + breaking_anim_frames: usize, + breaking_anim_fps: f32, + + break_sound: Handle, + + throw_velocity: Vec2, + + body_size: Vec2, + body_offset: Vec2, + grab_offset: Vec2, + // How long to wait before despawning a thrown crate, if it hans't it anything yet. + break_timeout: f32, + }, + /// The mine item + Mine { + atlas: Handle, + + damage_region_size: Vec2, + damage_region_lifetime: f32, + explosion_atlas: Handle, + explosion_anim_frames: usize, + explosion_anim_fps: f32, + + arm_sound: String, + armed_anim_start: usize, + armed_anim_end: usize, + armed_anim_fps: f32, + #[serde(skip)] + arm_sound_handle: Handle, + explosion_sound: String, + #[serde(skip)] + explosion_sound_handle: Handle, + + throw_velocity: Vec2, + /// The delay after throwing the mine, before it becomes armed and will blow up on contact. + arm_delay: f32, + + body_size: Vec2, + body_offset: Vec2, + grab_offset: Vec2, + }, + + StompBoots { + map_icon: Handle, + player_decoration: Handle, + + body_size: Vec2, + body_offset: Vec2, + grab_offset: Vec2, + }, + KickBomb { + body_size: Vec2, + body_offset: Vec2, + grab_offset: Vec2, + damage_region_size: Vec2, + damage_region_lifetime: f32, + throw_velocity: Vec2, + explosion_lifetime: f32, + explosion_frames: usize, + explosion_fps: f32, + explosion_sound: String, + #[serde(skip)] + explosion_sound_handle: Handle, + fuse_sound: String, + #[serde(skip)] + fuse_sound_handle: Handle, + /// The time in seconds before a grenade explodes + fuse_time: f32, + #[serde(default)] + can_rotate: bool, + /// The grenade atlas + atlas: Handle, + explosion_atlas: Handle, + #[serde(default)] + bouncyness: f32, + #[serde(default)] + angular_velocity: f32, + #[serde(default)] + arm_delay: f32, + }, +} diff --git a/core/src/metadata/map.rs b/core/src/metadata/map.rs new file mode 100644 index 0000000000..4d8e49bd28 --- /dev/null +++ b/core/src/metadata/map.rs @@ -0,0 +1,97 @@ +use super::*; +#[derive(BonesBevyAsset, Deserialize, Clone, TypeUlid, Debug)] +#[ulid = "01GP264BT87MAAHMEK52Y5P7BW"] +#[asset_id = "map"] +pub struct MapMeta { + pub name: String, + /// The parallax background layers + #[serde(default)] + pub background_layers: Vec, + /// The background color of the map, behind the parallax layers + pub background_color: ColorMeta, + /// Size of the map in tiles + pub grid_size: UVec2, + /// The size of the tiles in pixels + pub tile_size: Vec2, + /// The layers of the map + pub layers: Vec, +} + +#[derive(BonesBevyAssetLoad, Deserialize, Clone, Debug)] +#[serde(deny_unknown_fields)] +#[serde(default)] +pub struct ParallaxLayerMeta { + pub speed: f32, + pub image: Handle, + pub tile_size: Vec2, + pub cols: usize, + pub rows: usize, + pub scale: f32, + pub z: f32, + pub transition_factor: f32, + pub position: Vec2, +} + +impl Default for ParallaxLayerMeta { + fn default() -> Self { + Self { + speed: default(), + image: default(), + tile_size: default(), + cols: 1, + rows: 1, + scale: 1.0, + z: default(), + transition_factor: 1.0, + position: default(), + } + } +} + +#[derive(BonesBevyAssetLoad, Deserialize, Clone, Debug)] +#[serde(deny_unknown_fields)] +pub struct MapLayerMeta { + pub id: String, + pub kind: MapLayerKind, + #[asset(deserialize_only)] + #[serde(skip)] + pub entity: Option, +} + +#[derive(BonesBevyAssetLoad, Deserialize, Clone, Debug)] +#[serde(deny_unknown_fields)] +#[serde(rename_all = "snake_case")] +pub enum MapLayerKind { + Tile(MapTileLayer), + Element(ElementLayer), +} + +#[derive(BonesBevyAssetLoad, Deserialize, Clone, Debug, Default)] +#[serde(deny_unknown_fields)] +pub struct MapTileLayer { + pub tilemap: Handle, + pub has_collision: bool, + pub tiles: Vec, +} + +#[derive(BonesBevyAssetLoad, Deserialize, Clone, Debug, Default)] +#[serde(deny_unknown_fields)] +pub struct ElementLayer { + pub elements: Vec, +} + +#[derive(BonesBevyAssetLoad, Deserialize, Clone, Debug, Default)] +#[serde(deny_unknown_fields)] +pub struct ElementSpawn { + pub pos: Vec2, + pub element: Handle, +} + +#[derive(BonesBevyAssetLoad, Deserialize, Serialize, Clone, Debug)] +#[serde(deny_unknown_fields)] +pub struct MapTileMeta { + pub pos: UVec2, + pub idx: u32, + #[serde(default)] + pub jump_through: bool, +} diff --git a/core/src/metadata/player.rs b/core/src/metadata/player.rs new file mode 100644 index 0000000000..0e90705d5b --- /dev/null +++ b/core/src/metadata/player.rs @@ -0,0 +1,49 @@ +use super::*; + +#[derive(BonesBevyAsset, Clone, Debug, Default, Deserialize, TypeUlid)] +#[asset_id = "player"] +#[ulid = "01GNWTRN89YRFNFTV3KZZ6H8TK"] +pub struct PlayerMeta { + pub name: String, + pub atlas: Handle, + pub body_size: Vec2, + pub gravity: f32, + pub sounds: PlayerSounds, + pub stats: PlayerStats, + + #[serde(deserialize_with = "deserialize_arc")] + #[asset(deserialize_only)] + pub animations: Arc>, +} + +#[derive(BonesBevyAssetLoad, Deserialize, Clone, Debug, Default)] +#[serde(deny_unknown_fields)] +pub struct PlayerStats { + pub jump_speed: f32, + pub slow_fall_speed: f32, + pub air_move_speed: f32, + pub walk_speed: f32, +} + +#[derive(BonesBevyAssetLoad, Deserialize, Clone, Debug, Default)] +#[serde(deny_unknown_fields)] +pub struct PlayerSounds { + pub land_volume: f32, + pub land: Handle, + + pub jump_volume: f32, + pub jump: Handle, + + pub grab_volume: f32, + pub grab: Handle, + + pub drop_volume: f32, + pub drop: Handle, +} + +fn deserialize_arc<'de, T: Deserialize<'de>, D: Deserializer<'de>>( + deserializer: D, +) -> Result, D::Error> { + let item = T::deserialize(deserializer)?; + Ok(Arc::new(item)) +} diff --git a/src/physics.rs b/core/src/physics.rs similarity index 56% rename from src/physics.rs rename to core/src/physics.rs index a7f37131cf..43a79678d8 100644 --- a/src/physics.rs +++ b/core/src/physics.rs @@ -1,51 +1,15 @@ -use bevy::math::vec2; +use crate::prelude::*; -use crate::{metadata::GameMeta, prelude::*}; - -use self::collisions::{Actor, Collider, CollisionWorld, Rect, TileCollision}; +use self::collisions::{Actor, Collider, Rect, TileCollision}; +pub use collisions::CollisionWorld; pub mod collisions; -pub mod debug; - -pub struct PhysicsPlugin; - -#[derive(StageLabel)] -pub enum PhysicsStages { - Hydrate, - UpdatePhysics, -} -impl Plugin for PhysicsPlugin { - fn build(&self, app: &mut App) { - app.world.init_component::(); - app.register_type::() - .register_type::() - .extend_rollback_plugin(|plugin| { - plugin - .register_rollback_type::() - .register_rollback_type::() - .register_rollback_type::() - }) - .extend_rollback_schedule(|schedule| { - schedule - .add_stage_after( - RollbackStage::PostUpdate, - PhysicsStages::Hydrate, - SystemStage::parallel().with_system(hydrate_physics_bodies), - ) - .add_stage_after( - PhysicsStages::Hydrate, - PhysicsStages::UpdatePhysics, - SystemStage::parallel().with_system( - update_kinematic_bodies - .run_in_state(GameState::InGame) - .run_not_in_state(InGameState::Paused), - ), - ); - }); - - app.add_plugin(debug::PhysicsDebugRenderPlugin); - } +pub fn install(session: &mut GameSession) { + session + .stages + .add_system_to_stage(CoreStage::PostUpdate, hydrate_physics_bodies) + .add_system_to_stage(CoreStage::PostUpdate, update_kinematic_bodies); } /// A kinematic physics body @@ -54,14 +18,17 @@ impl Plugin for PhysicsPlugin { /// they are standing on, etc. /// /// For now, all kinematic bodies have axis-aligned, rectangular colliders. This may or may not change in the future. -#[derive(Reflect, Component, Default, Debug, Clone, Serialize, Deserialize)] -#[reflect(Component, Default)] +#[derive(Default, Debug, Clone, Copy, TypeUlid)] +#[ulid = "01GNF5NRJR7CXZ9NKEBQEGN8R1"] +#[repr(C)] pub struct KinematicBody { pub velocity: Vec2, pub offset: Vec2, pub size: Vec2, /// Angular velocity in degrees per second pub angular_velocity: f32, + pub gravity: f32, + pub bounciness: f32, pub is_on_ground: bool, pub was_on_ground: bool, /// Will be `true` if the body is currently on top of a platform/jumpthrough tile @@ -70,9 +37,7 @@ pub struct KinematicBody { pub has_mass: bool, pub has_friction: bool, pub can_rotate: bool, - pub bouncyness: f32, pub is_deactivated: bool, - pub gravity: f32, /// Whether or not the body should fall through jump_through platforms pub fall_through: bool, /// Indicates that we should reset the collider like it was just added to the world. @@ -93,38 +58,49 @@ impl KinematicBody { } } -#[derive(Component)] -struct KinematicBodyCollider; - fn hydrate_physics_bodies( - mut commands: Commands, - bodies: Query<(Entity, &Transform, &KinematicBody), Without>, + entities: Res, + transforms: Comp, + bodies: Comp, + mut colliders: CompMut, + mut actors: CompMut, ) { - for (entity, transform, body) in &bodies { + let mut needs_hydrate = colliders.bitset().clone(); + needs_hydrate.bit_not(); + needs_hydrate.bit_and(bodies.bitset()); + + for entity in entities.iter_with_bitset(&needs_hydrate) { + let transform = transforms.get(entity).unwrap(); + let body = bodies.get(entity).unwrap(); + if body.size.x.round() as i32 % 2 != 0 || body.size.y.round() as i32 % 2 != 0 { warn!( "TODO: Non-even widths and heights for colliders may currently \ behave incorrectly, getting stuck in walls." ); } - commands - .entity(entity) - .insert(Collider { + + colliders.insert( + entity, + Collider { pos: transform.translation.truncate() + body.offset, width: body.size.x, height: body.size.y, ..default() - }) - .insert(Actor); + }, + ); + actors.insert(entity, Actor); } } fn update_kinematic_bodies( - game: Res, + game: Res, + entities: Res, + mut bodies: CompMut, + mut transforms: CompMut, mut collision_world: CollisionWorld, - mut bodies: Query<(Entity, &mut KinematicBody, &mut Transform)>, ) { - for (actor, mut body, mut transform) in &mut bodies { + for (entity, (body, transform)) in entities.iter_with((&mut bodies, &mut transforms)) { if body.is_deactivated { continue; } @@ -134,19 +110,19 @@ fn update_kinematic_bodies( if body.has_mass { // Shove objects out of walls while collision_world.collide_solids(position, body.size.x, body.size.y) - == TileCollision::Solid + == TileCollision::SOLID { let rect = collisions::Rect::new(position.x, position.y, body.size.x, body.size.y); match ( - collision_world.collide_tag(1, rect.top_left(), 0.0, 0.0) - == TileCollision::Solid, - collision_world.collide_tag(1, rect.top_right(), 0.0, 0.0) - == TileCollision::Solid, - collision_world.collide_tag(1, rect.bottom_right(), 0.0, 0.0) - == TileCollision::Solid, - collision_world.collide_tag(1, rect.bottom_left(), 0.0, 0.0) - == TileCollision::Solid, + collision_world.collide_tag(default(), rect.top_left(), 0.0, 0.0) + == TileCollision::SOLID, + collision_world.collide_tag(default(), rect.top_right(), 0.0, 0.0) + == TileCollision::SOLID, + collision_world.collide_tag(default(), rect.bottom_right(), 0.0, 0.0) + == TileCollision::SOLID, + collision_world.collide_tag(default(), rect.bottom_left(), 0.0, 0.0) + == TileCollision::SOLID, ) { // Check for collisions on each side of the rectangle (false, false, _, _) => position.y += 1.0, @@ -163,33 +139,33 @@ fn update_kinematic_bodies( } if body.is_spawning { - collision_world.add_actor(actor, position, body.size.x, body.size.y); + collision_world.add_actor(entity, position, body.size.x, body.size.y); body.is_spawning = false; } if body.fall_through { - collision_world.descent(actor); + collision_world.descent(entity); } - collision_world.set_actor_position(actor, position); + collision_world.set_actor_position(entity, position); { let position = position + vec2(0.0, -1.0); body.was_on_ground = body.is_on_ground; - body.is_on_ground = collision_world.collide_check(actor, position); + body.is_on_ground = collision_world.collide_check(entity, position); let tile = collision_world.collide_solids(position, body.size.x, body.size.y); - body.is_on_platform = tile == TileCollision::JumpThrough; + body.is_on_platform = tile == TileCollision::JUMP_THROUGH; } - if !collision_world.move_h(actor, body.velocity.x) { - body.velocity.x *= -body.bouncyness; + if !collision_world.move_h(entity, body.velocity.x) { + body.velocity.x *= -body.bounciness; } - if !collision_world.move_v(actor, body.velocity.y) { - body.velocity.y *= -body.bouncyness; + if !collision_world.move_v(entity, body.velocity.y) { + body.velocity.y *= -body.bounciness; } if !body.is_on_ground && body.has_mass { @@ -202,7 +178,7 @@ fn update_kinematic_bodies( if body.can_rotate { apply_rotation( - &mut transform, + transform, body.velocity, body.angular_velocity, body.is_on_ground, @@ -217,7 +193,7 @@ fn update_kinematic_bodies( } transform.translation = - (collision_world.actor_pos(actor) - body.offset).extend(transform.translation.z); + (collision_world.actor_pos(entity) - body.offset).extend(transform.translation.z); } } @@ -232,7 +208,7 @@ fn apply_rotation( if is_on_ground { angle += velocity.x.abs() * angular_velocity; } else { - angle += (angular_velocity * crate::FPS as f32).to_radians(); + angle += (angular_velocity * crate::FPS).to_radians(); } transform.rotation = Quat::from_rotation_z(angle); diff --git a/src/physics/collisions.rs b/core/src/physics/collisions.rs similarity index 52% rename from src/physics/collisions.rs rename to core/src/physics/collisions.rs index 0c9361f338..d9aef0bbbc 100644 --- a/src/physics/collisions.rs +++ b/core/src/physics/collisions.rs @@ -5,17 +5,14 @@ //! - //! - -use bevy::{ecs::system::SystemParam, math::vec2}; -use bevy_ecs_tilemap::{ - prelude::{TilemapGridSize, TilemapTileSize}, - tiles::TileStorage, -}; +use std::collections::HashSet; -use crate::prelude::*; +use bytemuck::Zeroable; -use std::collections::HashSet; +use crate::prelude::*; -#[derive(Debug)] +#[derive(Debug, Copy, Clone, Pod, Zeroable)] +#[repr(C)] pub struct Rect { min: Vec2, max: Vec2, @@ -102,55 +99,112 @@ impl Rect { } } -#[derive(Component, DerefMut, Deref)] -pub struct CollisionLayerTag(pub u8); +/// Macro to "derive" ( not really a derive macro ) SystemParam for a struct. +macro_rules! impl_system_param { + ( + pub struct $t:ident<'a> { + $( + $f_name:ident: $f_ty:ty + ),* + $(,)? + } + ) => { + pub struct $t<'a> { + $( + $f_name: $f_ty + ),* + } -impl Default for CollisionLayerTag { - fn default() -> Self { - Self(1) - } + impl<'a> SystemParam for $t<'a> { + type State = ( + $( + <$f_ty as SystemParam>::State + ),* + ); + type Param<'p> = $t<'p>; + + fn initialize(world: &mut World) { + $( + <$f_ty as SystemParam>::initialize(world); + )* + } + + fn get_state(world: &World) -> Self::State { + ( + $( + <$f_ty as SystemParam>::get_state(world) + ),* + ) + } + + fn borrow(state: &mut Self::State) -> Self::Param<'_> { + let ( + $( + $f_name + ),* + ) = state; + let ( + $( + $f_name + ),* + ) = ( + $( + <$f_ty as SystemParam>::borrow($f_name) + ),* + ); + + Self::Param { + $( + $f_name + ),* + } + } + } + }; } -#[derive(SystemParam)] -pub struct CollisionWorld<'w, 's> { - pub commands: Commands<'w, 's>, - pub static_tiled_layers: Query< - 'w, - 's, - ( - &'static mut TileStorage, - &'static TilemapGridSize, - &'static TilemapTileSize, - &'static CollisionLayerTag, - ), - >, - pub tile_collisions: Query<'w, 's, &'static mut TileCollision>, - pub solids: Query<'w, 's, &'static mut Collider, (With, Without)>, - pub actors: Query<'w, 's, (Entity, &'static mut Collider), With>, +impl_system_param! { + pub struct CollisionWorld<'a> { + entities: Res<'a, Entities>, + + // Each collider is either an actor or a solid + actors: CompMut<'a, Actor>, + solids: CompMut<'a, Solid>, + colliders: CompMut<'a, Collider>, + + tile_layers: Comp<'a, TileLayer>, + tile_collision_tags: Comp<'a, TileCollisionTag>, + tile_collisions: Comp<'a, TileCollision>, + } } -#[derive(Component, Reflect, Default, Clone, Debug)] -#[reflect(Component, Default)] +/// An actor in the physics simulation. +#[derive(Default, Clone, Copy, Debug, Pod, Zeroable, TypeUlid)] +#[ulid = "01GNF73PE03HFCE5MP8WC8ZKB6"] +#[repr(C)] pub struct Actor; -#[derive(Component, Reflect, Default, Clone, Debug)] -#[reflect(Component, Default)] +/// A solid in the physics simulation. +#[derive(Default, Clone, Copy, Debug, Pod, Zeroable, TypeUlid)] +#[ulid = "01GNF73B5D1M7JYN0F65HMR2MW"] +#[repr(C)] pub struct Solid; -#[derive(Reflect, Component, Default, Clone, Debug, Serialize, Deserialize)] -#[reflect(Component, Default)] +/// A collider body in the physics simulation. +#[derive(Default, Clone, Debug, TypeUlid)] +#[ulid = "01GNF72YMMDM831S0TGAR2SWZ9"] +#[repr(C)] pub struct Collider { - pub collidable: bool, - pub squished: bool, pub pos: Vec2, pub width: f32, pub height: f32, pub x_remainder: f32, pub y_remainder: f32, - #[reflect(ignore)] - pub squishers: HashSet, + pub collidable: bool, + pub squished: bool, pub descent: bool, pub seen_wood: bool, + pub squishers: HashSet, } impl Collider { @@ -159,90 +213,115 @@ impl Collider { } } -#[derive(Component, Reflect, Default, PartialEq, Eq, Clone, Copy, Debug)] -#[reflect_value(Component, Default, PartialEq)] -pub enum TileCollision { - #[default] - Empty, - Solid, - JumpThrough, - Collider, +#[derive(Clone, Debug, TypeUlid, PartialEq, Eq, Copy)] +#[ulid = "01GNQKQGJMMF6AY8DRVY5YY4TF"] +#[repr(C)] +pub struct TileCollisionTag(u8); + +impl Default for TileCollisionTag { + fn default() -> Self { + Self(1) + } +} + +#[derive(Default, PartialEq, Eq, Clone, Copy, Debug, TypeUlid)] +#[ulid = "01GNF746HB9N9GE9E2KG4X7X4K"] +#[repr(transparent)] +pub struct TileCollision(pub u8); + +impl TileCollision { + pub const EMPTY: TileCollision = TileCollision(0); + pub const SOLID: TileCollision = TileCollision(1); + pub const JUMP_THROUGH: TileCollision = TileCollision(2); + pub const COLLIDER: TileCollision = TileCollision(3); } impl TileCollision { fn or(self, other: TileCollision) -> TileCollision { match (self, other) { - (TileCollision::Empty, TileCollision::Empty) => TileCollision::Empty, - (TileCollision::JumpThrough, TileCollision::JumpThrough) => TileCollision::JumpThrough, - (TileCollision::JumpThrough, TileCollision::Empty) => TileCollision::JumpThrough, - (TileCollision::Empty, TileCollision::JumpThrough) => TileCollision::JumpThrough, - _ => TileCollision::Solid, + (TileCollision::EMPTY, TileCollision::EMPTY) => TileCollision::EMPTY, + (TileCollision::JUMP_THROUGH, TileCollision::JUMP_THROUGH) => { + TileCollision::JUMP_THROUGH + } + (TileCollision::JUMP_THROUGH, TileCollision::EMPTY) => TileCollision::JUMP_THROUGH, + (TileCollision::EMPTY, TileCollision::JUMP_THROUGH) => TileCollision::JUMP_THROUGH, + _ => TileCollision::SOLID, } } } -impl<'w, 's> CollisionWorld<'w, 's> { +impl<'a> CollisionWorld<'a> { #[allow(unused)] pub fn add_actor(&mut self, actor: Entity, pos: Vec2, width: f32, height: f32) { let mut descent = false; let mut seen_wood = false; let tile = self.collide_solids(pos, width, height); - if tile == TileCollision::JumpThrough { + if tile == TileCollision::JUMP_THROUGH { descent = true; seen_wood = true; } - self.commands.entity(actor).insert(Collider { - collidable: true, - squished: false, - pos, - width, - height, - x_remainder: 0., - y_remainder: 0., - squishers: HashSet::new(), - descent, - seen_wood, - }); + self.colliders.insert( + actor, + Collider { + collidable: true, + squished: false, + pos, + width, + height, + x_remainder: 0., + y_remainder: 0., + squishers: HashSet::new(), + descent, + seen_wood, + }, + ); } #[allow(unused)] pub fn add_solid(&mut self, solid: Entity, pos: Vec2, width: f32, height: f32) { - self.commands.entity(solid).insert(Collider { - collidable: true, - squished: false, - pos, - width, - height, - x_remainder: 0., - y_remainder: 0., - squishers: HashSet::new(), - descent: false, - seen_wood: false, - }); + self.colliders.insert( + solid, + Collider { + collidable: true, + squished: false, + pos, + width, + height, + x_remainder: 0., + y_remainder: 0., + squishers: HashSet::new(), + descent: false, + seen_wood: false, + }, + ); } pub fn set_actor_position(&mut self, entity: Entity, pos: Vec2) { - let mut collider = self.actors.get_mut(entity).unwrap().1; - - collider.x_remainder = 0.0; - collider.y_remainder = 0.0; - collider.pos = pos; + if self.actors.contains(entity) { + if let Some(collider) = self.colliders.get_mut(entity) { + collider.x_remainder = 0.0; + collider.y_remainder = 0.0; + collider.pos = pos; + } + } } /// Returns the collisions that one actor has with any other actors pub fn actor_collisions(&self, entity: Entity) -> Vec { let mut collisions = Vec::new(); - let Ok((_, collider)) = self.actors.get(entity) else { + if !self.actors.contains(entity) { + return collisions; + } + let Some(collider) = self.colliders.get(entity) else { return collisions; }; - let rect = collider.rect(); - let mut actors = self.actors.iter().collect::>(); - // Sort for determinism's sake. ( Maybe entity's aren't deterministic, though...? ) - actors.sort_by_key(|x| x.0); + let rect = collider.rect(); - for (other_entity, collider) in actors { + for (other_entity, (_actor, collider)) in + self.entities.iter_with((&self.actors, &self.colliders)) + { if entity == other_entity { continue; } @@ -257,12 +336,15 @@ impl<'w, 's> CollisionWorld<'w, 's> { #[allow(unused)] pub fn descent(&mut self, entity: Entity) { - let mut collider = self.actors.get_mut(entity).unwrap().1; - collider.descent = true; + if self.actors.contains(entity) { + let mut collider = self.colliders.get_mut(entity).unwrap(); + collider.descent = true; + } } pub fn move_v(&mut self, entity: Entity, dy: f32) -> bool { - let mut collider = self.actors.get(entity).unwrap().1.clone(); + assert!(self.actors.contains(entity)); + let mut collider = self.colliders.get(entity).unwrap().clone(); collider.y_remainder += dy; @@ -279,22 +361,22 @@ impl<'w, 's> CollisionWorld<'w, 's> { ); // collider wants to go down and collided with jumpthrough tile - if tile == TileCollision::JumpThrough && collider.descent { + if tile == TileCollision::JUMP_THROUGH && collider.descent { collider.seen_wood = true; } // collider wants to go up and encoutered jumpthrough obstace - if tile == TileCollision::JumpThrough && sign > 0 { + if tile == TileCollision::JUMP_THROUGH && sign > 0 { collider.seen_wood = true; collider.descent = true; } - if tile == TileCollision::Empty - || (tile == TileCollision::JumpThrough && collider.descent) + if tile == TileCollision::EMPTY + || (tile == TileCollision::JUMP_THROUGH && collider.descent) { collider.pos.y += sign as f32; move_ -= sign; } else { collider.pos.y = collider.pos.y.floor(); - *self.actors.get_mut(entity).unwrap().1 = collider; + *self.colliders.get_mut(entity).unwrap() = collider; return false; } @@ -303,17 +385,18 @@ impl<'w, 's> CollisionWorld<'w, 's> { // Final check, if we are out of woods after the move - reset wood flags let tile = self.collide_solids(collider.pos, collider.width, collider.height); - if tile != TileCollision::JumpThrough { + if tile != TileCollision::JUMP_THROUGH { collider.seen_wood = false; collider.descent = false; } - *self.actors.get_mut(entity).unwrap().1 = collider; + *self.colliders.get_mut(entity).unwrap() = collider; true } pub fn move_h(&mut self, entity: Entity, dx: f32) -> bool { - let mut collider = self.actors.get(entity).unwrap().1.clone(); + assert!(self.actors.contains(entity)); + let mut collider = self.colliders.get(entity).unwrap().clone(); collider.x_remainder += dx; let mut move_ = collider.x_remainder.round() as i32; @@ -327,27 +410,28 @@ impl<'w, 's> CollisionWorld<'w, 's> { collider.width, collider.height, ); - if tile == TileCollision::JumpThrough { + if tile == TileCollision::JUMP_THROUGH { collider.descent = true; collider.seen_wood = true; } - if tile == TileCollision::Empty || tile == TileCollision::JumpThrough { + if tile == TileCollision::EMPTY || tile == TileCollision::JUMP_THROUGH { collider.pos.x += sign as f32; move_ -= sign; } else { collider.pos.x = collider.pos.x.floor(); - *self.actors.get_mut(entity).unwrap().1 = collider; + *self.colliders.get_mut(entity).unwrap() = collider; return false; } } } - *self.actors.get_mut(entity).unwrap().1 = collider; + *self.colliders.get_mut(entity).unwrap() = collider; true } #[allow(unused)] pub fn solid_move(&mut self, solid: Entity, dx: f32, dy: f32) { - let mut collider = self.solids.get_mut(solid).unwrap(); + assert!(self.solids.contains(solid)); + let mut collider = self.colliders.get_mut(solid).unwrap(); collider.x_remainder += dx; collider.y_remainder += dy; @@ -365,7 +449,8 @@ impl<'w, 's> CollisionWorld<'w, 's> { collider.height, ); - for (actor, mut actor_collider) in &mut self.actors { + for actor in self.entities.iter_with_bitset(self.actors.bitset()) { + let actor_collider = self.colliders.get_mut(actor).unwrap(); let rider_rect = Rect::new( actor_collider.pos.x, actor_collider.pos.y + actor_collider.height - 1.0, @@ -387,21 +472,21 @@ impl<'w, 's> CollisionWorld<'w, 's> { } } - self.solids.get_mut(solid).unwrap().collidable = false; + self.colliders.get_mut(solid).unwrap().collidable = false; for actor in riding_actors { self.move_h(actor, move_x as f32); } for actor in pushing_actors { let squished = !self.move_h(actor, move_x as f32); if squished { - let mut collider = self.actors.get_mut(actor).unwrap().1; + let mut collider = self.colliders.get_mut(actor).unwrap(); collider.squished = true; collider.squishers.insert(solid); } } - self.solids.get_mut(solid).unwrap().collidable = true; + self.colliders.get_mut(solid).unwrap().collidable = true; - let mut collider = self.solids.get_mut(solid).unwrap(); + let mut collider = self.colliders.get_mut(solid).unwrap(); if move_x != 0 { collider.x_remainder -= move_x as f32; collider.pos.x += move_x as f32; @@ -414,63 +499,87 @@ impl<'w, 's> CollisionWorld<'w, 's> { #[allow(unused)] pub fn solid_at(&self, pos: Vec2) -> bool { - self.tag_at(pos, 1) + self.tag_at(pos, TileCollisionTag::default()) } #[allow(unused)] - pub fn tag_at(&self, pos: Vec2, tag: u8) -> bool { - for (storage, grid_size, tile_size, layer_tag) in &self.static_tiled_layers { + pub fn tag_at(&self, pos: Vec2, tag: TileCollisionTag) -> bool { + for (entity, tile_layer) in self.entities.iter_with(&self.tile_layers) { + let TileLayer { + tiles, + grid_size, + tile_size, + .. + } = tile_layer; + let x = (pos.x / tile_size.y) as i32; let y = (pos.y / tile_size.x) as i32; + let tile_entity = tile_layer.get(UVec2::new(x as _, y as _)); if x >= 0 && x < grid_size.x as i32 && y >= 0 && y < grid_size.y as i32 - && storage.get(&UVec2::new(x as _, y as _).into()).is_some() + && tile_entity.is_some() { - return **layer_tag == tag; + let tile_tag = tile_entity + .map(|e| self.tile_collision_tags.get(e).copied().unwrap_or_default()); + return tile_tag == Some(tag); } } - self.solids - .iter() - .any(|solid| solid.collidable && solid.rect().contains(pos)) + self.entities + .iter_with((&self.solids, &self.colliders)) + .any(|(_, (_, collider))| collider.collidable && collider.rect().contains(pos)) } pub fn collide_solids(&self, pos: Vec2, width: f32, height: f32) -> TileCollision { - let tile = self.collide_tag(1, pos, width, height); - if tile != TileCollision::Empty { + let tile = self.collide_tag(TileCollisionTag::default(), pos, width, height); + if tile != TileCollision::EMPTY { return tile; } - self.solids - .iter() - .find(|solid| { - solid.collidable - && solid + self.entities + .iter_with((&self.solids, &self.colliders)) + .find(|(_entity, (_solid, collider))| { + collider.collidable + && collider .rect() .overlaps(&Rect::new(pos.x, pos.y, width, height)) }) - .map_or(TileCollision::Empty, |_| TileCollision::Collider) - } + .map_or(TileCollision::EMPTY, |_| TileCollision::COLLIDER) + } + + pub fn collide_tag( + &self, + tag: TileCollisionTag, + pos: Vec2, + width: f32, + height: f32, + ) -> TileCollision { + for (_, tile_layer) in self.entities.iter_with(&self.tile_layers) { + let TileLayer { + grid_size, + tile_size, + .. + } = tile_layer; - pub fn collide_tag(&self, tag: u8, pos: Vec2, width: f32, height: f32) -> TileCollision { - for (storage, grid_size, tile_size, layer_tag) in &self.static_tiled_layers { let check = |pos: Vec2| { let y = (pos.y / tile_size.x) as i32; let x = (pos.x / tile_size.y) as i32; + let tile_entity = tile_layer.get(UVec2::new(x as _, y as _)); + let tile_tag = tile_entity + .map(|e| self.tile_collision_tags.get(e).copied().unwrap_or_default()); if x >= 0 && x < grid_size.x as i32 && y >= 0 && y < grid_size.y as i32 - && **layer_tag == tag + && tile_tag == Some(tag) { - storage - .get(&UVec2::new(x as _, y as _).into()) + tile_entity .map(|entity| *self.tile_collisions.get(entity).unwrap()) .unwrap_or_default() } else { - TileCollision::Empty + TileCollision::EMPTY } }; @@ -481,7 +590,7 @@ impl<'w, 's> CollisionWorld<'w, 's> { .or(check(pos + vec2(hw, hh))) .or(check(pos + vec2(hw, -hh))); - if tile != TileCollision::Empty { + if tile != TileCollision::EMPTY { return tile; } @@ -493,7 +602,7 @@ impl<'w, 's> CollisionWorld<'w, 's> { x < pos.x + hw - 1. } { let tile = check(vec2(x, pos.y - hh)).or(check(vec2(x, pos.y + hh))); - if tile != TileCollision::Empty { + if tile != TileCollision::EMPTY { return tile; } } @@ -507,44 +616,49 @@ impl<'w, 's> CollisionWorld<'w, 's> { y < pos.y + hh - 1. } { let tile = check(vec2(pos.x - hw, y)).or(check(vec2(pos.x + hw, y))); - if tile != TileCollision::Empty { + if tile != TileCollision::EMPTY { return tile; } } } } - TileCollision::Empty + TileCollision::EMPTY } #[allow(unused)] pub fn squished(&self, actor: Entity) -> bool { - self.actors.get(actor).unwrap().1.squished + assert!(self.actors.contains(actor)); + self.colliders.get(actor).unwrap().squished } pub fn actor_pos(&self, actor: Entity) -> Vec2 { - self.actors.get(actor).unwrap().1.pos + assert!(self.actors.contains(actor)); + self.colliders.get(actor).unwrap().pos } #[allow(unused)] pub fn solid_pos(&self, solid: Entity) -> Vec2 { - self.solids.get(solid).unwrap().pos + assert!(self.solids.contains(solid)); + self.colliders.get(solid).unwrap().pos } - pub fn collide_check(&self, collider: Entity, pos: Vec2) -> bool { - let collider = self.actors.get(collider).unwrap().1; + pub fn collide_check(&self, actor: Entity, pos: Vec2) -> bool { + assert!(self.actors.contains(actor)); + let collider = self.colliders.get(actor).unwrap(); let tile = self.collide_solids(pos, collider.width, collider.height); if collider.descent { - tile == TileCollision::Solid || tile == TileCollision::Collider + tile == TileCollision::SOLID || tile == TileCollision::COLLIDER } else { - tile == TileCollision::Solid - || tile == TileCollision::Collider - || tile == TileCollision::JumpThrough + tile == TileCollision::SOLID + || tile == TileCollision::COLLIDER + || tile == TileCollision::JUMP_THROUGH } } - pub fn get_collider(&self, collider: Entity) -> &Collider { - self.actors.get(collider).unwrap().1 + pub fn get_collider(&self, actor: Entity) -> &Collider { + assert!(self.actors.contains(actor)); + self.colliders.get(actor).unwrap() } } diff --git a/core/src/player.rs b/core/src/player.rs new file mode 100644 index 0000000000..a184653050 --- /dev/null +++ b/core/src/player.rs @@ -0,0 +1,212 @@ +use std::collections::VecDeque; + +use crate::{item::ItemGrabbed, physics::KinematicBody, prelude::*}; + +mod state; +use bones_lib::animation::AnimationBankSprite; +pub use state::*; + +pub fn install(session: &mut GameSession) { + state::install(session); + + // Add other player systems + session + .stages + .add_system_to_stage(CoreStage::PostUpdate, handle_player_events) + .add_system_to_stage(CoreStage::First, hydrate_players); +} + +/// The player index, for example Player 1, Player 2, and so on. +#[derive(Clone, TypeUlid)] +#[ulid = "01GP49B2AMTYB6W8DWKBRF27FT"] +pub struct PlayerIdx(pub usize); + +/// An intventory component, indicating that entiy +#[derive(Clone, TypeUlid, Default, Deref, DerefMut)] +#[ulid = "01GP4D6M2QBSKZMEZMM22YGG41"] +pub struct Inventory(pub Option); + +/// Marker component indicating that a player has been killed. +/// +/// This usually means their death animation is playing, and they are about to be de-spawned. +#[derive(Clone, TypeUlid)] +#[ulid = "01GP49AK25A8S9G2GYNAVE4PTN"] +pub struct PlayerKilled; + +/// Resource containing the player event queue. +#[derive(Clone, TypeUlid, Debug, Default)] +#[ulid = "01GP49AK25A8S9G2GYNAVE4PTN"] +pub struct PlayerEvents { + pub queue: VecDeque, +} + +impl PlayerEvents { + /// Send a player event. + pub fn send(&mut self, event: PlayerEvent) { + self.queue.push_back(event); + } + + #[inline] + pub fn set_inventory(&mut self, player: Entity, item: Option) { + self.queue + .push_back(PlayerEvent::SetInventory { player, item }) + } + + #[inline] + pub fn use_item(&mut self, player: Entity) { + self.queue.push_back(PlayerEvent::UseItem { player }) + } + + #[inline] + pub fn kill(&mut self, player: Entity) { + self.queue.push_back(PlayerEvent::Kill { player }) + } + + #[inline] + pub fn despawn(&mut self, player: Entity) { + self.queue.push_back(PlayerEvent::Despawn { player }) + } +} + +/// Events that can be used to trigger player actions, such as killing, setting inventory, etc. +#[derive(Clone, Debug)] +pub enum PlayerEvent { + /// Kill a player. + /// + /// > **Note:** This doesn't despawn the player, it just puts the player into it's death animation. + Kill { player: Entity }, + /// Despawn a player. + /// + /// > **Note:** This is different than the [`Kill`][Self::Kill] event in that it immediately + /// > removes the player from the world, while [`Kill`][Self::Kill] will usually cause the + /// > player to enter the death animation. + /// > + /// > [`Despawn`][Self::Despawn] is usually sent at the end of the player death animation. + Despawn { player: Entity }, + /// Set the player's inventory + SetInventory { + player: Entity, + item: Option, + }, + /// Have the player use the item they are carrying, if any. + UseItem { player: Entity }, +} + +fn handle_player_events( + mut entities: ResMut, + mut player_events: ResMut, + mut players_killed: CompMut, + mut items_grabbed: CompMut, + mut items_dropped: CompMut, + mut items_used: CompMut, + mut inventories: CompMut, + player_indexes: Comp, +) { + while let Some(event) = player_events.queue.pop_front() { + match event { + PlayerEvent::Kill { player } => { + if players_killed.contains(player) { + // No need to kill him again + continue; + } + + let Some(idx) = player_indexes.get(player) else { + // Not a player, just ignore it. + warn!("Tried to kill non-player entity."); + continue; + }; + + debug!("Killing player: {}", idx.0); + + // Drop any items the player was carrying + player_events + .queue + .push_front(PlayerEvent::SetInventory { player, item: None }); + + players_killed.insert(player, PlayerKilled); + } + PlayerEvent::Despawn { player } => { + if player_indexes.contains(player) { + entities.kill(player); + } else { + warn!("Tried to despawn non-player entity."); + } + } + PlayerEvent::SetInventory { player, item } => { + let inventory = inventories.get(player).cloned().unwrap_or_default(); + + // If there was a previous item, drop it + if let Some(item) = inventory.0 { + items_dropped.insert(item, ItemDropped { player }); + } + + // If there is a new item, grab it + if let Some(item) = item { + items_grabbed.insert(item, ItemGrabbed); + } + + // Update the inventory + inventories.insert(player, Inventory(item)); + } + PlayerEvent::UseItem { player } => { + // If the player has an item + if let Some(item) = inventories.get(player).and_then(|x| x.0) { + // Use it + items_used.insert(item, ItemUsed); + } + } + } + } +} + +fn hydrate_players( + entities: Res, + player_inputs: Res, + player_indexes: Comp, + player_assets: BevyAssets, + mut player_states: CompMut, + mut inventories: CompMut, + mut animation_bank_sprites: CompMut, + mut atlas_sprites: CompMut, + mut kinematic_bodies: CompMut, +) { + let mut not_hydrated_bitset = player_states.bitset().clone(); + not_hydrated_bitset.bit_not(); + not_hydrated_bitset.bit_and(player_indexes.bitset()); + + for entity in entities.iter_with_bitset(¬_hydrated_bitset) { + let player_idx = player_indexes.get(entity).unwrap(); + let player_handle = &player_inputs.players[player_idx.0].selected_player; + + let Some(meta) = player_assets.get(&player_handle.get_bevy_handle()) else { + continue; + }; + + let animation_bank_sprite = AnimationBankSprite { + current: "idle".try_into().unwrap(), + animations: meta.animations.clone(), + last_animation: default(), + }; + + player_states.insert(entity, default()); + animation_bank_sprites.insert(entity, animation_bank_sprite); + inventories.insert(entity, default()); + atlas_sprites.insert( + entity, + AtlasSprite { + atlas: meta.atlas.clone(), + ..default() + }, + ); + kinematic_bodies.insert( + entity, + KinematicBody { + size: meta.body_size, + has_mass: true, + has_friction: true, + gravity: meta.gravity, + ..default() + }, + ); + } +} diff --git a/core/src/player/state.rs b/core/src/player/state.rs new file mode 100644 index 0000000000..ce656b3daa --- /dev/null +++ b/core/src/player/state.rs @@ -0,0 +1,106 @@ +use super::*; + +pub use stage::*; +mod stage; + +use states::*; +mod states; + +/// The state of the player controller. +#[derive(Clone, TypeUlid, Default)] +#[ulid = "01GP4E4BH47RN41QS66QBD679Q"] +pub struct PlayerState { + /// The ID for the current state. + pub current: Key, + /// The number of frames that this state has been active. + pub age: u64, + /// The ID of the state that the player was in in the last frame. + pub last: Key, +} + +/// Helper macro that adds the `player_state_transition` and `handle_player_state` systems from +/// `module` to the appropriate stages. +macro_rules! add_state_module { + ($session:ident, $module:ident) => { + $session + .stages + .add_system_to_stage(PlayerStateStage, $module::player_state_transition); + $session + .stages + .add_system_to_stage(CoreStage::PreUpdate, $module::handle_player_state); + }; +} + +pub fn install(session: &mut GameSession) { + // Add the player state stage + session + .stages + .insert_stage_before(CoreStage::PreUpdate, PlayerStateStageImpl::new()); + + session + .stages + .add_system_to_stage(CoreStage::Last, update_player_state_age); + + add_state_module!(session, default); + add_state_module!(session, idle); + add_state_module!(session, crouch); + add_state_module!(session, midair); + add_state_module!(session, walk); + add_state_module!(session, dead); +} + +fn update_player_state_age(entities: Res, mut player_states: CompMut) { + for (_ent, state) in entities.iter_with(&mut player_states) { + state.age = state.age.saturating_add(1); + } +} + +fn use_drop_or_grab_items( + player_ent: Entity, + meta: &PlayerMeta, + control: &PlayerControl, + inventory: &Inventory, + collision_world: &CollisionWorld, + items: &Comp, + held_items: &[Entity], + player_events: &mut PlayerEvents, + audio_events: &mut AudioEvents, +) { + // If we are grabbing + if control.grab_just_pressed { + if inventory.is_none() { + // If we don't have an item + let colliders = collision_world + // Get all things colliding with the player + .actor_collisions(player_ent) + .into_iter() + // Filter out anything not an item + .filter(|ent| items.contains(*ent)) + // Filter out any items held by other players + .filter(|ent| !held_items.contains(ent)) + .collect::>(); + + // Grab the first item we are touching + if let Some(item) = colliders.get(0) { + // Add the item to the player inventory + player_events.set_inventory(player_ent, Some(*item)); + + // Play grab sound + audio_events.play(meta.sounds.grab.clone(), meta.sounds.grab_volume); + } + + // If we are already carrying an item + } else { + // Drop it + player_events.set_inventory(player_ent, None); + + // Play drop sound + audio_events.play(meta.sounds.drop.clone(), meta.sounds.drop_volume); + } + } + + // If we are using an item + if control.shoot_just_pressed && inventory.is_some() { + player_events.use_item(player_ent); + } +} diff --git a/core/src/player/state/stage.rs b/core/src/player/state/stage.rs new file mode 100644 index 0000000000..14ada0fac0 --- /dev/null +++ b/core/src/player/state/stage.rs @@ -0,0 +1,108 @@ +use super::*; + +#[derive(Debug)] +pub struct PlayerStateStage; + +impl StageLabel for PlayerStateStage { + fn name(&self) -> String { + format!("{:?}", self) + } + + fn id(&self) -> Ulid { + PlayerStateStageImpl::ID + } +} + +#[derive(Debug, Default)] +pub struct PlayerStateStageImpl { + systems: Vec, +} + +impl PlayerStateStageImpl { + pub fn new() -> Self { + default() + } +} + +impl PlayerStateStageImpl { + pub const ID: Ulid = Ulid(2022686805174362721866480948664103805); +} + +impl SystemStage for PlayerStateStageImpl { + fn id(&self) -> Ulid { + Self::ID + } + + fn name(&self) -> String { + format!("{:?}", self) + } + + fn initialize(&mut self, world: &mut World) { + world.components.init::(); + world.components.init::(); + for system in &mut self.systems { + system.initialize(world); + } + } + + fn run(&mut self, world: &World) -> SystemResult { + trace!("Starting player state transitions"); + loop { + // Get the current player states + let last_player_states = world.run_initialized_system( + |entities: Res, + player_indexes: Comp, + player_states: Comp| { + let mut states = [None; MAX_PLAYERS]; + for (_ent, (idx, state)) in + entities.iter_with((&player_indexes, &player_states)) + { + states[idx.0] = Some(state.current); + } + + Ok(states) + }, + )?; + trace!(?last_player_states, "Checcking current states"); + + trace!("Running state transitions"); + // Run all of the player state systems + for system in &mut self.systems { + system.run(world)?; + } + + // Get whether the states have changed + let has_changed = world.run_initialized_system( + move |entities: Res, + player_indexes: Comp, + mut player_states: CompMut| { + let mut has_changed = false; + for (_ent, (idx, state)) in + entities.iter_with((&player_indexes, &mut player_states)) + { + let old_state = last_player_states[idx.0].unwrap(); + + if old_state != state.current { + state.last = old_state; + state.age = 0; + has_changed = true; + } + } + + Ok(has_changed) + }, + )?; + + // If the states haven't changed + if !has_changed { + trace!("No state changes, done with state transition loop"); + // Then we are finished applying player state transitions + break Ok(()); + } + } + } + + fn add_system(&mut self, system: System) { + self.systems.push(system) + } +} diff --git a/core/src/player/state/states.rs b/core/src/player/state/states.rs new file mode 100644 index 0000000000..d7cb5f3629 --- /dev/null +++ b/core/src/player/state/states.rs @@ -0,0 +1,8 @@ +use super::*; + +pub mod crouch; +pub mod dead; +pub mod default; +pub mod idle; +pub mod midair; +pub mod walk; diff --git a/core/src/player/state/states/crouch.rs b/core/src/player/state/states/crouch.rs new file mode 100644 index 0000000000..d7269b2256 --- /dev/null +++ b/core/src/player/state/states/crouch.rs @@ -0,0 +1,54 @@ +use super::*; + +pub const ID: Key = key!("core::crouch"); + +pub fn player_state_transition( + entities: Res, + player_inputs: Res, + player_indexes: Comp, + mut player_states: CompMut, + bodies: Comp, +) { + for (_ent, (state, player_idx, body)) in + entities.iter_with((&mut player_states, &player_indexes, &bodies)) + { + if state.current != ID { + continue; + } + let control = &player_inputs.players[player_idx.0].control; + + if !body.is_on_ground || control.move_direction.y > -0.5 { + state.current = idle::ID; + } + } +} + +pub fn handle_player_state( + entities: Res, + player_inputs: Res, + player_states: Comp, + player_indexes: Comp, + mut animations: CompMut, + mut bodies: CompMut, +) { + for (_ent, (state, player_idx, animation, body)) in entities.iter_with(( + &player_states, + &player_indexes, + &mut animations, + &mut bodies, + )) { + if state.current != ID { + continue; + } + + if state.age == 0 { + animation.current = key!("crouch"); + } + + let control = &player_inputs.players[player_idx.0].control; + + if control.jump_just_pressed { + body.fall_through = true; + } + } +} diff --git a/core/src/player/state/states/dead.rs b/core/src/player/state/states/dead.rs new file mode 100644 index 0000000000..b37cb81f00 --- /dev/null +++ b/core/src/player/state/states/dead.rs @@ -0,0 +1,34 @@ +use super::*; + +pub const ID: Key = key!("core::dead"); + +pub fn player_state_transition( + entities: Res, + killed_players: Comp, + mut player_states: CompMut, +) { + for (_ent, (state, _killed)) in entities.iter_with((&mut player_states, &killed_players)) { + state.current = ID; + } +} + +pub fn handle_player_state( + entities: Res, + player_states: Comp, + mut animations: CompMut, + mut player_events: ResMut, +) { + for (player_ent, (state, animation)) in entities.iter_with((&player_states, &mut animations)) { + if state.current != ID { + continue; + }; + + if state.age == 0 { + animation.current = key!("death_1"); + } + + if state.age >= 80 { + player_events.despawn(player_ent); + } + } +} diff --git a/core/src/player/state/states/default.rs b/core/src/player/state/states/default.rs new file mode 100644 index 0000000000..d2eeb2e326 --- /dev/null +++ b/core/src/player/state/states/default.rs @@ -0,0 +1,13 @@ +use super::*; + +pub fn player_state_transition(entities: Res, mut player_states: CompMut) { + for (_ent, state) in entities.iter_with(&mut player_states) { + // If the current state is the default, meaningless state + if state.current == default() { + state.current = idle::ID; + } + } +} + +// We don't do anything for the default state +pub fn handle_player_state() {} diff --git a/core/src/player/state/states/idle.rs b/core/src/player/state/states/idle.rs new file mode 100644 index 0000000000..0a95057e51 --- /dev/null +++ b/core/src/player/state/states/idle.rs @@ -0,0 +1,101 @@ +use super::*; + +pub const ID: Key = key!("core::idle"); + +pub fn player_state_transition( + entities: Res, + player_inputs: Res, + player_indexes: Comp, + mut player_states: CompMut, + bodies: Comp, +) { + for (_ent, (player_idx, player_state, body)) in + entities.iter_with((&player_indexes, &mut player_states, &bodies)) + { + if player_state.current != ID { + continue; + } + + let control = &player_inputs.players[player_idx.0].control; + + if !body.is_on_ground { + player_state.current = midair::ID; + } else if control.move_direction.y < -0.5 { + player_state.current = crouch::ID; + } else if control.move_direction.x != 0.0 { + player_state.current = walk::ID; + } + } +} + +pub fn handle_player_state( + entities: Res, + player_inputs: Res, + player_indexes: Comp, + player_states: Comp, + player_assets: BevyAssets, + mut inventories: CompMut, + mut sprites: CompMut, + mut bodies: CompMut, + items: Comp, + mut player_events: ResMut, + mut audio_events: ResMut, + collision_world: CollisionWorld, +) { + // Collect a list of items that are being held by players + let held_items = entities + .iter_with(&inventories) + .filter_map(|(_ent, inventory)| inventory.0) + .collect::>(); + + let players = entities.iter_with(( + &player_states, + &player_indexes, + &mut sprites, + &mut bodies, + &mut inventories, + )); + for (player_ent, (player_state, player_idx, animation, body, inventory)) in players { + if player_state.current != ID { + continue; + } + let meta_handle = player_inputs.players[player_idx.0] + .selected_player + .get_bevy_handle(); + let Some(meta) = player_assets.get(&meta_handle) else { + continue; + }; + + // If this is the first frame of this state + if player_state.age == 0 { + // set our animation to idle + animation.current = key!("idle"); + } + + let control = &player_inputs.players[player_idx.0].control; + + use_drop_or_grab_items( + player_ent, + meta, + control, + inventory, + &collision_world, + &items, + &held_items, + &mut player_events, + &mut audio_events, + ); + + // If we are jumping + if control.jump_just_pressed { + // Play jump sound + audio_events.play(meta.sounds.jump.clone(), meta.sounds.jump_volume); + + // Move up + body.velocity.y = meta.stats.jump_speed; + } + + // Since we are idling, don't move + body.velocity.x = 0.0; + } +} diff --git a/core/src/player/state/states/midair.rs b/core/src/player/state/states/midair.rs new file mode 100644 index 0000000000..06c929a122 --- /dev/null +++ b/core/src/player/state/states/midair.rs @@ -0,0 +1,113 @@ +use super::*; + +pub const ID: Key = key!("core::midair"); + +pub fn player_state_transition( + entities: Res, + player_inputs: Res, + player_indexes: Comp, + player_assets: BevyAssets, + mut player_states: CompMut, + bodies: Comp, + mut audio_events: ResMut, +) { + for (_ent, (player_idx, player_state, body)) in + entities.iter_with((&player_indexes, &mut player_states, &bodies)) + { + let meta_handle = player_inputs.players[player_idx.0] + .selected_player + .get_bevy_handle(); + let Some(meta) = player_assets.get(&meta_handle) else { + continue; + }; + if player_state.current != ID { + continue; + } + + if body.is_on_ground { + // Play land sound + audio_events.play(meta.sounds.land.clone(), meta.sounds.land_volume); + // Switch to idle state + player_state.current = idle::ID; + } + } +} + +pub fn handle_player_state( + entities: Res, + player_inputs: Res, + player_indexes: Comp, + player_states: Comp, + player_assets: BevyAssets, + mut inventories: CompMut, + mut sprites: CompMut, + mut animations: CompMut, + mut bodies: CompMut, + items: Comp, + mut player_events: ResMut, + mut audio_events: ResMut, + collision_world: CollisionWorld, +) { + // Collect a list of items that are being held by players + let held_items = entities + .iter_with(&inventories) + .filter_map(|(_ent, inventory)| inventory.0) + .collect::>(); + + let players = entities.iter_with(( + &player_states, + &player_indexes, + &mut animations, + &mut sprites, + &mut bodies, + &mut inventories, + )); + for (player_ent, (player_state, player_idx, animation, sprite, body, inventory)) in players { + if player_state.current != ID { + continue; + } + let meta_handle = player_inputs.players[player_idx.0] + .selected_player + .get_bevy_handle(); + let Some(meta) = player_assets.get(&meta_handle) else { + continue; + }; + let control = &player_inputs.players[player_idx.0].control; + + if body.velocity.y > 0.0 { + animation.current = key!("rise"); + } else { + animation.current = key!("fall"); + } + + use_drop_or_grab_items( + player_ent, + meta, + control, + inventory, + &collision_world, + &items, + &held_items, + &mut player_events, + &mut audio_events, + ); + + // Limit fall speed if holding jump button + if control.jump_pressed { + body.velocity.y = body.velocity.y.max(-meta.stats.slow_fall_speed); + } + + // Add controls + body.velocity.x = control.move_direction.x * meta.stats.air_move_speed; + + // Fall through platforms + body.fall_through = control.move_direction.y < -0.5 && control.jump_pressed; + + // Point in movement direction + if control.move_direction.x > 0.0 { + sprite.flip_x = false; + } else if control.move_direction.x < 0.0 { + sprite.flip_x = true; + } + } +} diff --git a/core/src/player/state/states/walk.rs b/core/src/player/state/states/walk.rs new file mode 100644 index 0000000000..39e16abae4 --- /dev/null +++ b/core/src/player/state/states/walk.rs @@ -0,0 +1,107 @@ +use super::*; + +pub const ID: Key = key!("core::walk"); + +pub fn player_state_transition( + entities: Res, + player_inputs: Res, + player_indexes: Comp, + mut player_states: CompMut, + bodies: Comp, +) { + for (_ent, (player_idx, player_state, body)) in + entities.iter_with((&player_indexes, &mut player_states, &bodies)) + { + if player_state.current != ID { + continue; + } + + let control = &player_inputs.players[player_idx.0].control; + + if !body.is_on_ground { + player_state.current = midair::ID; + } else if control.move_direction.y < -0.5 { + player_state.current = crouch::ID; + } else if control.move_direction.x == 0.0 { + player_state.current = idle::ID; + } + } +} + +pub fn handle_player_state( + entities: Res, + player_inputs: Res, + player_indexes: Comp, + player_states: Comp, + player_assets: BevyAssets, + mut inventories: CompMut, + mut sprites: CompMut, + mut animations: CompMut, + mut bodies: CompMut, + items: Comp, + mut player_events: ResMut, + mut audio_events: ResMut, + collision_world: CollisionWorld, +) { + // Collect a list of items that are being held by players + let held_items = entities + .iter_with(&inventories) + .filter_map(|(_ent, inventory)| inventory.0) + .collect::>(); + + let players = entities.iter_with(( + &player_states, + &player_indexes, + &mut animations, + &mut sprites, + &mut bodies, + &mut inventories, + )); + for (player_ent, (player_state, player_idx, animation, sprite, body, inventory)) in players { + if player_state.current != ID { + continue; + } + let meta_handle = player_inputs.players[player_idx.0] + .selected_player + .get_bevy_handle(); + let Some(meta) = player_assets.get(&meta_handle) else { + continue; + }; + let control = &player_inputs.players[player_idx.0].control; + + // If this is the first frame of this state + if player_state.age == 0 { + // set our animation + animation.current = key!("walk"); + } + use_drop_or_grab_items( + player_ent, + meta, + control, + inventory, + &collision_world, + &items, + &held_items, + &mut player_events, + &mut audio_events, + ); + + // If we are jumping + if control.jump_just_pressed { + audio_events.play(meta.sounds.jump.clone(), meta.sounds.jump_volume); + + // Move up + body.velocity.y = meta.stats.jump_speed; + } + + // Walk in movement direction + body.velocity.x = control.move_direction.x * meta.stats.walk_speed; + + // Point in movement direction + if control.move_direction.x > 0.0 { + sprite.flip_x = false; + } else if control.move_direction.x < 0.0 { + sprite.flip_x = true; + } + } +} diff --git a/core/src/session.rs b/core/src/session.rs new file mode 100644 index 0000000000..c5321f0465 --- /dev/null +++ b/core/src/session.rs @@ -0,0 +1,144 @@ +use crate::prelude::*; + +/// The implementation of a Jumpy game session. +/// +/// This session allows you to do things like: +/// +/// - Provide input +/// - Snapshot/Restore game state +/// - Access the session's ECS [`World`] +pub struct GameSession { + pub world: World, + pub stages: SystemStages, + pub scratch_world: Option<::bevy::ecs::world::World>, + pub info: GameSessionInfo, +} + +/// Information needed to start a game session. +#[derive(Debug, Clone)] +pub struct GameSessionInfo { + /// The core metadata. + pub meta: Arc, + /// The selected map + pub map: Handle, + /// The player selections. + pub player_info: [Option>; MAX_PLAYERS], +} + +impl GameSession { + /// Create a new game session + pub fn new(mut info: GameSessionInfo) -> Self { + // Create session + let mut session = Self { + world: default(), + stages: SystemStages::with_core_stages(), + scratch_world: Some(::bevy::ecs::world::World::new()), + info: info.clone(), + }; + + // Install modules + crate::testing::install(&mut session); + crate::physics::install(&mut session); + crate::input::install(&mut session); + crate::map::install(&mut session); + crate::elements::install(&mut session); + crate::player::install(&mut session); + crate::camera::install(&mut session); + crate::damage::install(&mut session); + crate::lifetime::install(&mut session); + + // Initialize systems + for stage in &mut session.stages.stages { + stage.initialize(&mut session.world); + } + + // Initialize time resource + session.world.resources.init::