From 3ce73ff9120376e7c3341875d161a530963d847e Mon Sep 17 00:00:00 2001
From: Louis Capitanchik <contact@louiscap.co>
Date: Sat, 15 Apr 2023 17:18:35 +0100
Subject: [PATCH] Update to bevy 0.10

---
 .gitattributes                         |    1 +
 .gitlab-ci.yml                         |   10 +-
 Cargo.lock                             | 1174 +++++++++++++-----------
 Cargo.toml                             |   18 +-
 Makefile                               |   16 +-
 assets/splash_sting.mp3                |    3 -
 assets/splash_sting.ogg                |    3 +
 game_core/Cargo.toml                   |    9 +-
 game_core/src/assets/loader.rs         |    2 +
 game_core/src/assets/mod.rs            |   13 +-
 game_core/src/assets/resources.rs      |    3 +
 game_core/src/assets/startup.rs        |   19 +-
 game_core/src/main.rs                  |   15 +-
 game_core/src/splash_screen/mod.rs     |   10 +-
 game_core/src/splash_screen/systems.rs |   10 +-
 game_core/src/system/camera.rs         |   69 +-
 game_core/src/system/flow.rs           |  106 ++-
 game_core/src/system/keycode.rs        |  169 ++++
 game_core/src/system/mod.rs            |    5 +-
 game_core/src/system/resources.rs      |   30 +-
 game_core/src/system/utilities.rs      |   22 +
 game_core/src/system/web.rs            |   15 +-
 game_core/src/system/window.rs         |   94 +-
 23 files changed, 1178 insertions(+), 638 deletions(-)
 delete mode 100644 assets/splash_sting.mp3
 create mode 100644 assets/splash_sting.ogg
 create mode 100644 game_core/src/system/keycode.rs

diff --git a/.gitattributes b/.gitattributes
index cd6be07..5d89bba 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -2,3 +2,4 @@
 *.png filter=lfs diff=lfs merge=lfs -text
 *.wav filter=lfs diff=lfs merge=lfs -text
 *.ttf filter=lfs diff=lfs merge=lfs -text
+*.ogg filter=lfs diff=lfs merge=lfs -text
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 0867f1b..10be7d8 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -22,7 +22,7 @@ build-windows:
       - .cargo/bin/
       - target/
   script:
-    - cargo build --release -p ${BINARY_FOLDER} --target x86_64-pc-windows-gnu
+    - cargo build --release --features "embed" -p ${BINARY_FOLDER} --target x86_64-pc-windows-gnu
   artifacts:
     expire_in: 1 day
     paths:
@@ -44,7 +44,7 @@ build-linux:
       - .cargo/bin/
       - target/
   script:
-    - cargo build --release -p ${BINARY_FOLDER} --target x86_64-unknown-linux-gnu
+    - cargo build --release --features "embed" -p ${BINARY_FOLDER} --target x86_64-unknown-linux-gnu
   artifacts:
     expire_in: 1 day
     paths:
@@ -95,7 +95,7 @@ build-web:
     - mkdir "${CI_PROJECT_DIR}/${BINARY_FOLDER}/dist"
     - make assets
     - sed -i 's#public_url = "/"#public_url = "./"#' "${CI_PROJECT_DIR}/${BINARY_FOLDER}/Trunk.toml"
-    - cd "${CI_PROJECT_DIR}/${BINARY_FOLDER}" && trunk build --release
+    - cd "${CI_PROJECT_DIR}/${BINARY_FOLDER}" && trunk build --features "embed" --release
     - cd "${CI_PROJECT_DIR}"
   artifacts:
     expire_in: 1 day
@@ -113,8 +113,8 @@ package-all:
     - cp target/x86_64-unknown-linux-gnu/release/${BINARY_NAME} "dist/${BINARY_NAME}"
     - cp target/x86_64-pc-windows-gnu/release/${BINARY_NAME}.exe "dist/${BINARY_NAME}.exe"
 #    - cp target/aarch64-unknown-linux-gnu/release/${BINARY_NAME} "dist/${BINARY_NAME}.arm64"
-    - cd "${CI_PROJECT_DIR}/dist" && zip -r "windows.zip" "./${BINARY_NAME}.exe" ./assets
-    - cd "${CI_PROJECT_DIR}/dist" && zip -r "linux.x86.zip" "./${BINARY_NAME}" ./assets
+    - cd "${CI_PROJECT_DIR}/dist" && zip -r "windows.zip" "./${BINARY_NAME}.exe" # ./assets
+    - cd "${CI_PROJECT_DIR}/dist" && zip -r "linux.x86.zip" "./${BINARY_NAME}" # ./assets
 #    - cd "${CI_PROJECT_DIR}/dist" && zip -r "linux.arm64.zip" "./${BINARY_NAME}.arm64" ./assets
     - cd "${CI_PROJECT_DIR}/${BINARY_FOLDER}/dist" && zip -r "web.zip" ./*
     - cd "${CI_PROJECT_DIR}" && mv "${CI_PROJECT_DIR}/game_core/dist/web.zip" "${CI_PROJECT_DIR}/dist/web.zip"
diff --git a/Cargo.lock b/Cargo.lock
index 2fc492e..cd56954 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -4,9 +4,9 @@ version = 3
 
 [[package]]
 name = "ab_glyph"
-version = "0.2.18"
+version = "0.2.20"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4dcdbc68024b653943864d436fe8a24b028095bc1cf91a8926f8241e4aaffe59"
+checksum = "fe21446ad43aa56417a767f3e2f3d7c4ca522904de1dd640529a76e9c5c3b33c"
 dependencies = [
  "ab_glyph_rasterizer",
  "owned_ttf_parser",
@@ -14,9 +14,71 @@ dependencies = [
 
 [[package]]
 name = "ab_glyph_rasterizer"
-version = "0.1.7"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046"
+
+[[package]]
+name = "accesskit"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "704d532b1cd3d912bb37499c55a81ac748cc1afa737eedd100ba441acdd47d38"
+
+[[package]]
+name = "accesskit_consumer"
+version = "0.14.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "48ba8b23cfca3944012ee2e5c71c02077a400e034c720eed6bd927cb6b4d1fd9"
+dependencies = [
+ "accesskit",
+]
+
+[[package]]
+name = "accesskit_macos"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "58d062544d6cc36f4213323b7cb3a0d74ddff4b0d2311ab5e7596f4278bb2cc9"
+dependencies = [
+ "accesskit",
+ "accesskit_consumer",
+ "objc2",
+ "once_cell",
+]
+
+[[package]]
+name = "accesskit_windows"
+version = "0.13.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "330223a1aecc308757b9926e9391c9b47f8ef2dbd8aea9df88312aea18c5e8d6"
+checksum = "aaf5b3c3828397ee832ba4a72fb1a4ace10f781e31885f774cbd531014059115"
+dependencies = [
+ "accesskit",
+ "accesskit_consumer",
+ "arrayvec",
+ "once_cell",
+ "paste",
+ "windows 0.44.0",
+]
+
+[[package]]
+name = "accesskit_winit"
+version = "0.12.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fbcb615217efc79c4bed3094c4ca76c4bc554751d1da16f3ed4ba0459b1e8f31"
+dependencies = [
+ "accesskit",
+ "accesskit_macos",
+ "accesskit_windows",
+ "winit",
+]
+
+[[package]]
+name = "addr2line"
+version = "0.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97"
+dependencies = [
+ "gimli",
+]
 
 [[package]]
 name = "adler"
@@ -67,23 +129,35 @@ dependencies = [
 ]
 
 [[package]]
-name = "android_log-sys"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85965b6739a430150bdd138e2374a98af0c3ee0d030b3bb7fc3bddff58d0102e"
-
-[[package]]
-name = "android_logger"
-version = "0.11.1"
+name = "android-activity"
+version = "0.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b5e9dd62f37dea550caf48c77591dc50bd1a378ce08855be1a0c42a97b7550fb"
+checksum = "7c77a0045eda8b888c76ea473c2b0515ba6f471d318f8927c5c72240937035a6"
 dependencies = [
- "android_log-sys",
- "env_logger",
+ "android-properties",
+ "bitflags",
+ "cc",
+ "jni-sys",
+ "libc",
  "log",
- "once_cell",
+ "ndk 0.7.0",
+ "ndk-context",
+ "ndk-sys 0.4.1+23.1.7779620",
+ "num_enum",
 ]
 
+[[package]]
+name = "android-properties"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04"
+
+[[package]]
+name = "android_log-sys"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85965b6739a430150bdd138e2374a98af0c3ee0d030b3bb7fc3bddff58d0102e"
+
 [[package]]
 name = "android_system_properties"
 version = "0.1.5"
@@ -116,9 +190,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",
 ]
@@ -129,7 +203,7 @@ version = "1.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "cf46fee83e5ccffc220104713af3292ff9bc7c64c7de289f66dae8e38d826833"
 dependencies = [
- "concurrent-queue 2.0.0",
+ "concurrent-queue",
  "event-listener",
  "futures-core",
 ]
@@ -142,7 +216,7 @@ checksum = "17adb73da160dfb475c183343c8cccd80721ea5a605d3eb57125f0a7b7a92d0b"
 dependencies = [
  "async-lock",
  "async-task",
- "concurrent-queue 2.0.0",
+ "concurrent-queue",
  "fastrand",
  "futures-lite",
  "slab",
@@ -176,6 +250,21 @@ version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
 
+[[package]]
+name = "backtrace"
+version = "0.3.67"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "233d376d6d185f2a3093e58f283f60f880315b6c60075b01f36b3b85154564ca"
+dependencies = [
+ "addr2line",
+ "cc",
+ "cfg-if",
+ "libc",
+ "miniz_oxide",
+ "object",
+ "rustc-demangle",
+]
+
 [[package]]
 name = "base-x"
 version = "0.2.11"
@@ -190,18 +279,30 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"
 
 [[package]]
 name = "bevy"
-version = "0.9.1"
+version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dae99b246505811f5bc19d2de1e406ec5d2816b421d58fa223779eb576f472c9"
+checksum = "b93f906133305915d63f04108e6873c1b93a6605fe374b8f3391f6bda093e396"
 dependencies = [
  "bevy_internal",
 ]
 
+[[package]]
+name = "bevy_a11y"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "037c4063f7dac1a5d596eb47f40782a04ca5838dc4274dbbadc90eb81efe5169"
+dependencies = [
+ "accesskit",
+ "bevy_app",
+ "bevy_derive",
+ "bevy_ecs",
+]
+
 [[package]]
 name = "bevy_app"
-version = "0.9.1"
+version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "536e4d0018347478545ed8b6cb6e57b9279ee984868e81b7c0e78e0fb3222e42"
+checksum = "01db46963eb9486f7884121527ec69751d0e448f9e1d5329e80ea3424118a31a"
 dependencies = [
  "bevy_derive",
  "bevy_ecs",
@@ -214,9 +315,9 @@ dependencies = [
 
 [[package]]
 name = "bevy_asset"
-version = "0.9.1"
+version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6db1bb550168304df69c867c09125e1aae7ff51cf21575396e1598bf293442c4"
+checksum = "98609b4b0694a23bde0628aed626644967991f167aad9db2afb68dacb0017540"
 dependencies = [
  "anyhow",
  "bevy_app",
@@ -226,11 +327,11 @@ dependencies = [
  "bevy_reflect",
  "bevy_tasks",
  "bevy_utils",
+ "bevy_winit",
  "crossbeam-channel",
  "downcast-rs",
  "fastrand",
  "js-sys",
- "ndk-glue",
  "notify",
  "parking_lot",
  "serde",
@@ -242,9 +343,9 @@ dependencies = [
 
 [[package]]
 name = "bevy_core"
-version = "0.9.1"
+version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "96299aceb3c8362cb4aa39ff81c7ef758a5f4e768d16b5046a91628eff114ac0"
+checksum = "0ee53d7b4691b57207d72e996992c995a53f3e8d21ca7151ca3956d9ce7d232e"
 dependencies = [
  "bevy_app",
  "bevy_ecs",
@@ -258,9 +359,9 @@ dependencies = [
 
 [[package]]
 name = "bevy_core_pipeline"
-version = "0.9.1"
+version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc128a9860aadf16fb343ae427f2768986fd91dce64d945455acda9759c48014"
+checksum = "093ae5ced77251602ad6e43521e2acc1a5570bf85b80f232f1a7fdd43b50f8d8"
 dependencies = [
  "bevy_app",
  "bevy_asset",
@@ -278,20 +379,20 @@ dependencies = [
 
 [[package]]
 name = "bevy_derive"
-version = "0.9.1"
+version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7baf73c58d41c353c6fd08e6764a2e7420c9f19e8227b391c50981db6d0282a6"
+checksum = "dff0add5ab4a6b2b7e86e18f9043bb48b6386faa3b56abaa0ed97a3d669a1992"
 dependencies = [
  "bevy_macro_utils",
  "quote",
- "syn",
+ "syn 1.0.105",
 ]
 
 [[package]]
 name = "bevy_diagnostic"
-version = "0.9.1"
+version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "63bf96ec7980fa25b77ff6c72dfafada477936c0dab76c1edf6c028c0e5fe0e4"
+checksum = "64c778422643b0adee9e82abbd07e1e906eb9947c274a9b18e0f7fbf137d4c34"
 dependencies = [
  "bevy_app",
  "bevy_core",
@@ -299,13 +400,14 @@ dependencies = [
  "bevy_log",
  "bevy_time",
  "bevy_utils",
+ "sysinfo",
 ]
 
 [[package]]
 name = "bevy_ecs"
-version = "0.9.1"
+version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d4c071d7c6bc9801253485e05d0c257284150de755391902746837ba21c0cf74"
+checksum = "bed2f74687ccf13046c0f8e3b00dc61d7e656877b4a1380cf04635bb74d8e586"
 dependencies = [
  "async-channel",
  "bevy_ecs_macros",
@@ -316,77 +418,48 @@ dependencies = [
  "downcast-rs",
  "event-listener",
  "fixedbitset",
- "fxhash",
+ "rustc-hash",
  "serde",
  "thread_local",
 ]
 
 [[package]]
 name = "bevy_ecs_macros"
-version = "0.9.1"
+version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c15bd45438eeb681ad74f2d205bb07a5699f98f9524462a30ec764afab2742ce"
+checksum = "a97fd126a0db7b30fb1833614b3a657b44ac88485741c33b2780e25de0f96d78"
 dependencies = [
  "bevy_macro_utils",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.105",
 ]
 
 [[package]]
-name = "bevy_ecs_tilemap"
-version = "0.9.0"
+name = "bevy_embedded_assets"
+version = "0.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ce7f9fa49f364602ac0901d5f181445529b23fb0623e39e791548f8a6e8c2b5"
+checksum = "2a1d4ecf67c553196cfdef560cf0748f1f699db5a86ed2aa211c958e2a379451"
 dependencies = [
  "bevy",
- "log",
- "regex",
+ "cargo-emit",
 ]
 
 [[package]]
 name = "bevy_encase_derive"
-version = "0.9.1"
+version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "962b6bb0d30e92ec2e6c29837acce9e55b920733a634e7c3c5fd5a514bea7a24"
+checksum = "c086ebdc1f5522787d63772943277cc74a279445fb65db4d58c2c5330654648e"
 dependencies = [
  "bevy_macro_utils",
  "encase_derive_impl",
 ]
 
-[[package]]
-name = "bevy_gltf"
-version = "0.9.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e853e346ba412354e02292c7aa5b9a9dccdfa748e273b1b7ebf8f6a172f89712"
-dependencies = [
- "anyhow",
- "base64",
- "bevy_app",
- "bevy_asset",
- "bevy_core",
- "bevy_core_pipeline",
- "bevy_ecs",
- "bevy_hierarchy",
- "bevy_log",
- "bevy_math",
- "bevy_pbr",
- "bevy_reflect",
- "bevy_render",
- "bevy_scene",
- "bevy_tasks",
- "bevy_transform",
- "bevy_utils",
- "gltf",
- "percent-encoding",
- "thiserror",
-]
-
 [[package]]
 name = "bevy_hierarchy"
-version = "0.9.1"
+version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8dd6d50c48c6e1bcb5e08a768b765323292bb3bf3a439b992754c57ffb85b23a"
+checksum = "9d04099865a13d1fd8bf3c044a80148cb3d23bfe8c3d5f082dda2ce091d85532"
 dependencies = [
  "bevy_app",
  "bevy_core",
@@ -399,9 +472,9 @@ dependencies = [
 
 [[package]]
 name = "bevy_input"
-version = "0.9.1"
+version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3378b5171284f4c4c0e8307081718a9fe458f846444616bd82d69110dcabca51"
+checksum = "a15d40aa636bb656967ac16ca36066ab7a7bb9179e1b0390c5705e54208e8fd7"
 dependencies = [
  "bevy_app",
  "bevy_ecs",
@@ -414,10 +487,11 @@ dependencies = [
 
 [[package]]
 name = "bevy_internal"
-version = "0.9.1"
+version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c46014b7e885b1311de06b6039e448454a4db55b8d35464798ba88faa186e11"
+checksum = "862b11931c5874cb00778ffb715fc526ee49e52a493d3bcf50e8010f301858b3"
 dependencies = [
+ "bevy_a11y",
  "bevy_app",
  "bevy_asset",
  "bevy_core",
@@ -425,7 +499,6 @@ dependencies = [
  "bevy_derive",
  "bevy_diagnostic",
  "bevy_ecs",
- "bevy_gltf",
  "bevy_hierarchy",
  "bevy_input",
  "bevy_log",
@@ -434,6 +507,7 @@ dependencies = [
  "bevy_ptr",
  "bevy_reflect",
  "bevy_render",
+ "bevy_scene",
  "bevy_sprite",
  "bevy_tasks",
  "bevy_text",
@@ -443,14 +517,13 @@ dependencies = [
  "bevy_utils",
  "bevy_window",
  "bevy_winit",
- "ndk-glue",
 ]
 
 [[package]]
 name = "bevy_kira_audio"
-version = "0.13.0"
+version = "0.15.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b310ffe1c870e6ca5f0db228953f68af5a861302ec759edae43450f5835a0ece"
+checksum = "468257f6c7980d847aba0e9b6c9e4ff4045598510637d6e484b5f290c00a1f92"
 dependencies = [
  "anyhow",
  "bevy",
@@ -461,9 +534,9 @@ dependencies = [
 
 [[package]]
 name = "bevy_log"
-version = "0.9.1"
+version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6c480bac54cf4ae76edc3ae9ae3fa7c5e1b385e7f2111ef5ec3fd00cf3a7998b"
+checksum = "25980c90ceaad34d09a53291e72ca56fcc754a974cd4654fffcf5b68b283b7a7"
 dependencies = [
  "android_log-sys",
  "bevy_app",
@@ -477,20 +550,20 @@ dependencies = [
 
 [[package]]
 name = "bevy_macro_utils"
-version = "0.9.1"
+version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "022bb69196deeea691b6997414af85bbd7f2b34a8914c4aa7a7ff4dfa44f7677"
+checksum = "5b2fee53b2497cdc3bffff2ddf52afa751242424a5fd0d51d227d4dab081d0d9"
 dependencies = [
  "quote",
- "syn",
- "toml",
+ "syn 1.0.105",
+ "toml_edit",
 ]
 
 [[package]]
 name = "bevy_math"
-version = "0.9.1"
+version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d434c77ab766c806ed9062ef8a7285b3b02b47df51f188d4496199c3ac062eaf"
+checksum = "da6a1109d06fe947990db032e719e162414cf9bf7a478dcc52742f1c7136c42a"
 dependencies = [
  "glam",
  "serde",
@@ -498,18 +571,18 @@ dependencies = [
 
 [[package]]
 name = "bevy_mikktspace"
-version = "0.9.1"
+version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bbfb5908d33fd613069be516180b8f138aaaf6e41c36b1fd98c6c29c00c24a13"
+checksum = "39106bc2ee21fce9496d2e15e0ba7925dff63e3eae10f7c1fc0094b56ad9f2bb"
 dependencies = [
  "glam",
 ]
 
 [[package]]
 name = "bevy_pbr"
-version = "0.9.1"
+version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "310b1f260a475d81445623e138e1b7245759a42310bc1f84b550a3f4ff8763bf"
+checksum = "4f507cef55812aa70c2ec2b30fb996eb285fa7497d974cf03f76ec49c77fbe27"
 dependencies = [
  "bevy_app",
  "bevy_asset",
@@ -529,15 +602,15 @@ dependencies = [
 
 [[package]]
 name = "bevy_ptr"
-version = "0.9.1"
+version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ec44f7655039546bc5d34d98de877083473f3e9b2b81d560c528d6d74d3eff4"
+checksum = "0c4b88451d4c5a353bff67dbaa937b6886efd26ae114769c17f2b35099c7a4de"
 
 [[package]]
 name = "bevy_reflect"
-version = "0.9.1"
+version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6deae303a7f69dc243b2fa35b5e193cc920229f448942080c8eb2dbd9de6d37a"
+checksum = "9fc3979471890e336f3ba87961ef3ecd45c331cf2cb2f582c885e541af228b48"
 dependencies = [
  "bevy_math",
  "bevy_ptr",
@@ -555,25 +628,26 @@ dependencies = [
 
 [[package]]
 name = "bevy_reflect_derive"
-version = "0.9.1"
+version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a2bf4cb9cd5acb4193f890f36cb63679f1502e2de025e66a63b194b8b133d018"
+checksum = "2bc7ea7c9bc2c531eb29ba5619976613d6680453ff5dd4a7fcd08848e8bec5ad"
 dependencies = [
  "bevy_macro_utils",
  "bit-set",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.105",
  "uuid",
 ]
 
 [[package]]
 name = "bevy_render"
-version = "0.9.1"
+version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2e3282a8f8779d2aced93207fbed73f740937c6c2bd27bd84f0799b081c7fca5"
+checksum = "ee1e126226f0a4d439bf82fe07c1104f894a6a365888e3eba7356f9647e77a83"
 dependencies = [
  "anyhow",
+ "async-channel",
  "bevy_app",
  "bevy_asset",
  "bevy_core",
@@ -586,6 +660,7 @@ dependencies = [
  "bevy_mikktspace",
  "bevy_reflect",
  "bevy_render_macros",
+ "bevy_tasks",
  "bevy_time",
  "bevy_transform",
  "bevy_utils",
@@ -595,7 +670,6 @@ dependencies = [
  "downcast-rs",
  "encase",
  "futures-lite",
- "hex",
  "hexasphere",
  "image",
  "naga",
@@ -607,25 +681,26 @@ dependencies = [
  "thiserror",
  "thread_local",
  "wgpu",
+ "wgpu-hal",
 ]
 
 [[package]]
 name = "bevy_render_macros"
-version = "0.9.1"
+version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b7acae697776ac05bea523e1725cf2660c91c53abe72c66782ea1e1b9eedb572"
+checksum = "652f8c4d9577c6e6a8b3dfd8a4ce331e8b6ecdbb99636a4b2701dec50104d6bc"
 dependencies = [
  "bevy_macro_utils",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.105",
 ]
 
 [[package]]
 name = "bevy_scene"
-version = "0.9.1"
+version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ea9c66a628c833d53bae54fe94cbc0d3f12c29e9d2e6c3f2356d45ad57db0c8c"
+checksum = "1de59637d27726251091120ce6f63917328ffd60aaccbda4d65a615873aff631"
 dependencies = [
  "anyhow",
  "bevy_app",
@@ -645,9 +720,9 @@ dependencies = [
 
 [[package]]
 name = "bevy_sprite"
-version = "0.9.1"
+version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5ec01c7db7f698d95bcb70708527c3ae6bcdc78fc247abe74f935cae8f0a1145"
+checksum = "c110358fe3651a5796fd1c07989635680738f5b5c7e9b8a463dd50d12bb78410"
 dependencies = [
  "bevy_app",
  "bevy_asset",
@@ -670,14 +745,14 @@ dependencies = [
 
 [[package]]
 name = "bevy_tasks"
-version = "0.9.1"
+version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "680b16b53df9c9f24681dd95f4d772d83760bd19adf8bca00f358a3aad997853"
+checksum = "3de86364316e151aeb0897eaaa917c3ad5ee5ef1471a939023cf7f2d5ab76955"
 dependencies = [
  "async-channel",
  "async-executor",
  "async-task",
- "concurrent-queue 1.2.4",
+ "concurrent-queue",
  "futures-lite",
  "once_cell",
  "wasm-bindgen-futures",
@@ -685,9 +760,9 @@ dependencies = [
 
 [[package]]
 name = "bevy_text"
-version = "0.9.1"
+version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "60c74c1bdaabde7db28f6728aa13bc7b1d744a2201b2bbfd83d2224404c57f5c"
+checksum = "995188f59dc06da3fc951e1f58a105cde2c817d5330ae67ddc0a140f46482f6b"
 dependencies = [
  "ab_glyph",
  "anyhow",
@@ -708,9 +783,9 @@ dependencies = [
 
 [[package]]
 name = "bevy_time"
-version = "0.9.1"
+version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a5c38a6d3ea929c7f81e6adf5a6c62cf7e8c40f5106c2174d6057e9d8ea624d"
+checksum = "d3edbd605df1bced312eb9888d6be3d5a5fcac3d4140038bbe3233d218399eef"
 dependencies = [
  "bevy_app",
  "bevy_ecs",
@@ -718,13 +793,14 @@ dependencies = [
  "bevy_utils",
  "crossbeam-channel",
  "serde",
+ "thiserror",
 ]
 
 [[package]]
 name = "bevy_transform"
-version = "0.9.1"
+version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ba13c57a040b89767191a6f6d720a635b7792793628bfa41a9e38b7026484aec"
+checksum = "24383dfb97d8a14b17721ecfdf58556eff5ea9a4b2a3d91accf2b472783880b0"
 dependencies = [
  "bevy_app",
  "bevy_ecs",
@@ -734,12 +810,23 @@ dependencies = [
  "serde",
 ]
 
+[[package]]
+name = "bevy_tweening"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7adaf4294484caea3707d280198ad06dd53b9e9adbb0816618c7edce11c990d6"
+dependencies = [
+ "bevy",
+ "interpolation",
+]
+
 [[package]]
 name = "bevy_ui"
-version = "0.9.1"
+version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "60e82ace6156f11fcdf2319102ff8fb8367b82d1e32b7d05d387a1963602f965"
+checksum = "cb597aeed4e1bf5e6913879c3e22a7d50a843b822a7f71a4a80ebdfdf79e68d4"
 dependencies = [
+ "bevy_a11y",
  "bevy_app",
  "bevy_asset",
  "bevy_core_pipeline",
@@ -765,23 +852,37 @@ dependencies = [
 
 [[package]]
 name = "bevy_utils"
-version = "0.9.1"
+version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "16750aae52cd35bd7b60eb61cee883420b250e11b4a290b8d44b2b2941795739"
+checksum = "0a88ebbca55d360d72e9fe78df0d22e25cd419933c9559e79dae2757f7c4d066"
 dependencies = [
  "ahash",
+ "bevy_utils_proc_macros",
  "getrandom",
  "hashbrown",
  "instant",
+ "petgraph",
+ "thiserror",
  "tracing",
  "uuid",
 ]
 
+[[package]]
+name = "bevy_utils_proc_macros"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "630b92e32fa5cd7917c7d4fdbf63a90af958b01e096239f71bc4f8f3cf40c0d2"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.105",
+]
+
 [[package]]
 name = "bevy_window"
-version = "0.9.1"
+version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0a44d3f3bd54a2261f4f57f614bf7bccc8d2832761493c0cd7dab81d98cc151e"
+checksum = "ad31234754268fbe12050290b0496e2296252a16995a38f94bfb9680a4f09fda"
 dependencies = [
  "bevy_app",
  "bevy_ecs",
@@ -789,25 +890,30 @@ dependencies = [
  "bevy_math",
  "bevy_reflect",
  "bevy_utils",
- "raw-window-handle 0.5.0",
+ "raw-window-handle",
  "serde",
 ]
 
 [[package]]
 name = "bevy_winit"
-version = "0.9.1"
+version = "0.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c7b7e647ecd0b3577468da37767dcdd7c26ca9f80da0060b2ec4c77336b6d2e1"
+checksum = "cf17bd6330f7e633b7c56754c776511a8f52cde4bf54c0278f34d7527548f253"
 dependencies = [
+ "accesskit_winit",
  "approx",
+ "bevy_a11y",
  "bevy_app",
+ "bevy_derive",
  "bevy_ecs",
+ "bevy_hierarchy",
  "bevy_input",
  "bevy_math",
  "bevy_utils",
  "bevy_window",
  "crossbeam-channel",
- "raw-window-handle 0.5.0",
+ "once_cell",
+ "raw-window-handle",
  "wasm-bindgen",
  "web-sys",
  "winit",
@@ -830,7 +936,7 @@ dependencies = [
  "regex",
  "rustc-hash",
  "shlex",
- "syn",
+ "syn 1.0.105",
 ]
 
 [[package]]
@@ -860,6 +966,25 @@ version = "0.1.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a"
 
+[[package]]
+name = "block-sys"
+version = "0.1.0-beta.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fa55741ee90902547802152aaf3f8e5248aab7e21468089560d4c8840561146"
+dependencies = [
+ "objc-sys",
+]
+
+[[package]]
+name = "block2"
+version = "0.2.0-alpha.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8dd9e63c1744f755c2f60332b88de39d341e5e86239014ad839bd71c106dec42"
+dependencies = [
+ "block-sys",
+ "objc2-encode",
+]
+
 [[package]]
 name = "bumpalo"
 version = "3.11.1"
@@ -883,7 +1008,7 @@ checksum = "5fe233b960f12f8007e3db2d136e3cb1c291bfd7396e384ee76025fc1a3932b4"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.105",
 ]
 
 [[package]]
@@ -898,12 +1023,6 @@ version = "1.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "dfb24e866b15a1af2a1b663f10c6b6b8f397a84aadb828f12e5b289ec23a3a3c"
 
-[[package]]
-name = "cache-padded"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c1db59621ec70f09c5e9b597b220c7a2b43611f4710dc03ceb8748637775692c"
-
 [[package]]
 name = "calloop"
 version = "0.10.3"
@@ -917,6 +1036,12 @@ dependencies = [
  "vec_map",
 ]
 
+[[package]]
+name = "cargo-emit"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1582e1c9e755dd6ad6b224dcffb135d199399a4568d454bd89fe515ca8425695"
+
 [[package]]
 name = "cc"
 version = "1.0.77"
@@ -964,37 +1089,6 @@ dependencies = [
  "libloading",
 ]
 
-[[package]]
-name = "cocoa"
-version = "0.24.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a"
-dependencies = [
- "bitflags",
- "block",
- "cocoa-foundation",
- "core-foundation",
- "core-graphics",
- "foreign-types",
- "libc",
- "objc",
-]
-
-[[package]]
-name = "cocoa-foundation"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ade49b65d560ca58c403a479bb396592b155c0185eada742ee323d1d68d6318"
-dependencies = [
- "bitflags",
- "block",
- "core-foundation",
- "core-graphics-types",
- "foreign-types",
- "libc",
- "objc",
-]
-
 [[package]]
 name = "codespan-reporting"
 version = "0.11.1"
@@ -1011,6 +1105,12 @@ version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
 
+[[package]]
+name = "com-rs"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bf43edc576402991846b093a7ca18a3477e0ef9c588cde84964b5d3e43016642"
+
 [[package]]
 name = "combine"
 version = "4.6.6"
@@ -1021,15 +1121,6 @@ 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"
@@ -1137,7 +1228,7 @@ dependencies = [
  "thiserror",
  "wasm-bindgen",
  "web-sys",
- "windows",
+ "windows 0.37.0",
 ]
 
 [[package]]
@@ -1176,50 +1267,15 @@ checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35"
 
 [[package]]
 name = "d3d12"
-version = "0.5.0"
+version = "0.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "827914e1f53b1e0e025ecd3d967a7836b7bcb54520f90e21ef8df7b4d88a2759"
+checksum = "d8f0de2f5a8e7bd4a9eec0e3c781992a4ce1724f68aec7d7a3715344de8b39da"
 dependencies = [
  "bitflags",
  "libloading",
  "winapi",
 ]
 
-[[package]]
-name = "darling"
-version = "0.13.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c"
-dependencies = [
- "darling_core",
- "darling_macro",
-]
-
-[[package]]
-name = "darling_core"
-version = "0.13.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610"
-dependencies = [
- "fnv",
- "ident_case",
- "proc-macro2",
- "quote",
- "strsim",
- "syn",
-]
-
-[[package]]
-name = "darling_macro"
-version = "0.13.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835"
-dependencies = [
- "darling_core",
- "quote",
- "syn",
-]
-
 [[package]]
 name = "discard"
 version = "1.0.4"
@@ -1249,9 +1305,9 @@ checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650"
 
 [[package]]
 name = "encase"
-version = "0.4.0"
+version = "0.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c6bdd416eb91cd6fb73a22fbc9fa1ea013641cce1a58905c31623ff9c562e811"
+checksum = "e6591f13a63571c4821802eb5b10fd1155b1290bce87086440003841c8c3909b"
 dependencies = [
  "const_panic",
  "encase_derive",
@@ -1261,22 +1317,22 @@ dependencies = [
 
 [[package]]
 name = "encase_derive"
-version = "0.4.0"
+version = "0.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "df06cd7ea02426c2a0a164656bf116813584b461b8a7bb059b7941ab981105d3"
+checksum = "4f1da6deed1f8b6f5909616ffa695f63a5de54d6a0f084fa715c70c8ed3abac9"
 dependencies = [
  "encase_derive_impl",
 ]
 
 [[package]]
 name = "encase_derive_impl"
-version = "0.4.0"
+version = "0.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b299aab48b9a897ddd730dde2b5550af7c90ec6779c78e3c70f4c28d9337663f"
+checksum = "ae489d58959f3c4cdd1250866a05acfb341469affe4fced71aff3ba228be1693"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.105",
 ]
 
 [[package]]
@@ -1288,16 +1344,6 @@ dependencies = [
  "cfg-if",
 ]
 
-[[package]]
-name = "env_logger"
-version = "0.9.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7"
-dependencies = [
- "log",
- "regex",
-]
-
 [[package]]
 name = "erased-serde"
 version = "0.3.23"
@@ -1339,7 +1385,7 @@ checksum = "4b9663d381d07ae25dc88dbdf27df458faa83a9b25336bcac83d5e452b5fc9d3"
 dependencies = [
  "cfg-if",
  "libc",
- "redox_syscall",
+ "redox_syscall 0.2.16",
  "windows-sys 0.42.0",
 ]
 
@@ -1359,12 +1405,6 @@ dependencies = [
  "miniz_oxide",
 ]
 
-[[package]]
-name = "fnv"
-version = "1.0.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
-
 [[package]]
 name = "foreign-types"
 version = "0.3.2"
@@ -1431,11 +1471,14 @@ version = "0.1.0"
 dependencies = [
  "anyhow",
  "bevy",
+ "bevy_embedded_assets",
+ "bevy_tweening",
  "fastrand",
- "iyes_loopless",
  "log",
  "micro_banimate",
+ "micro_bevy_web_utils",
  "micro_musicbox",
+ "num-traits",
  "serde",
  "serde_json",
  "thiserror",
@@ -1455,11 +1498,17 @@ dependencies = [
  "wasm-bindgen",
 ]
 
+[[package]]
+name = "gimli"
+version = "0.27.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ad0a93d233ebf96623465aad4046a8d3aa4da22d4f4beba5388838c8a434bbb4"
+
 [[package]]
 name = "glam"
-version = "0.22.0"
+version = "0.23.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "12f597d56c1bd55a811a1be189459e8fad2bbc272616375602443bdfb37fa774"
+checksum = "8e4afd9ad95555081e109fe1d21f2a30c691b5f0919c67dfa690a2e1eb6bd51c"
 dependencies = [
  "bytemuck",
  "serde",
@@ -1473,9 +1522,9 @@ checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574"
 
 [[package]]
 name = "glow"
-version = "0.11.2"
+version = "0.12.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d8bd5877156a19b8ac83a29b2306fe20537429d318f3ff0a1a2119f8d9c61919"
+checksum = "4e007a07a24de5ecae94160f141029e9a347282cfe25d1d58d85d845cf3130f1"
 dependencies = [
  "js-sys",
  "slotmap",
@@ -1483,41 +1532,6 @@ dependencies = [
  "web-sys",
 ]
 
-[[package]]
-name = "gltf"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "00e0a0eace786193fc83644907097285396360e9e82e30f81a21e9b1ba836a3e"
-dependencies = [
- "byteorder",
- "gltf-json",
- "lazy_static",
-]
-
-[[package]]
-name = "gltf-derive"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bdd53d6e284bb2bf02a6926e4cc4984978c1990914d6cd9deae4e31cf37cd113"
-dependencies = [
- "inflections",
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "gltf-json"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9949836a9ec5e7f83f76fb9bbcbc77f254a577ebbdb0820867bc11979ef97cad"
-dependencies = [
- "gltf-derive",
- "serde",
- "serde_derive",
- "serde_json",
-]
-
 [[package]]
 name = "glyph_brush_layout"
 version = "0.2.3"
@@ -1548,6 +1562,19 @@ dependencies = [
  "bitflags",
 ]
 
+[[package]]
+name = "gpu-allocator"
+version = "0.21.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "434618454f74b63f9b39328298097256977c41ea0ba9d75a47238b77790b6163"
+dependencies = [
+ "backtrace",
+ "log",
+ "thiserror",
+ "winapi",
+ "windows 0.43.0",
+]
+
 [[package]]
 name = "gpu-descriptor"
 version = "0.2.3"
@@ -1578,26 +1605,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"
@@ -1609,32 +1616,35 @@ dependencies = [
 ]
 
 [[package]]
-name = "hex"
-version = "0.4.3"
+name = "hassle-rs"
+version = "0.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
+checksum = "90601c6189668c7345fc53842cb3f3a3d872203d523be1b3cb44a36a3e62fb85"
+dependencies = [
+ "bitflags",
+ "com-rs",
+ "libc",
+ "libloading",
+ "thiserror",
+ "widestring",
+ "winapi",
+]
 
 [[package]]
 name = "hexasphere"
-version = "8.0.0"
+version = "8.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "619ce654558681d7d0a7809e1b20249c7032ff13ee6baa7bb7ff64f7f28a906a"
+checksum = "bd41d443f978bfa380a6dad58b62a08c43bcb960631f13e9d015b911eaf73588"
 dependencies = [
  "glam",
  "once_cell",
 ]
 
 [[package]]
-name = "hexf-parse"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df"
-
-[[package]]
-name = "ident_case"
-version = "1.0.1"
+name = "hexf-parse"
+version = "0.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
+checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df"
 
 [[package]]
 name = "image"
@@ -1661,12 +1671,6 @@ dependencies = [
  "hashbrown",
 ]
 
-[[package]]
-name = "inflections"
-version = "1.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a257582fdcde896fd96463bf2d40eefea0580021c0712a0e2b028b60b47a837a"
-
 [[package]]
 name = "inotify"
 version = "0.9.6"
@@ -1700,22 +1704,16 @@ dependencies = [
 ]
 
 [[package]]
-name = "itoa"
-version = "1.0.4"
+name = "interpolation"
+version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4217ad341ebadf8d8e724e264f13e593e0648f5b3e94b3896a5df283be015ecc"
+checksum = "d3b7357d2bbc5ee92f8e899ab645233e43d21407573cceb37fed8bc3dede2c02"
 
 [[package]]
-name = "iyes_loopless"
-version = "0.9.1"
+name = "itoa"
+version = "1.0.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c47fd2cbdb1d7f295c25e6bfccfd78a84b6eef3055bc9f01b34ae861721b01ee"
-dependencies = [
- "bevy_app",
- "bevy_ecs",
- "bevy_time",
- "bevy_utils",
-]
+checksum = "4217ad341ebadf8d8e724e264f13e593e0648f5b3e94b3896a5df283be015ecc"
 
 [[package]]
 name = "jni"
@@ -1912,22 +1910,35 @@ dependencies = [
 
 [[package]]
 name = "micro_banimate"
-version = "0.2.1"
+version = "0.5.0-beta.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "db0f957d47035e81cda7636e2c9e17aa8fb8816a29bd1739935893b605ad4a09"
+checksum = "bd0e8e0e1e65ec56f8c714f75cc3c93f61ce31227469e95ec5f438dca13bf81a"
 dependencies = [
  "anyhow",
  "bevy",
- "bevy_ecs_tilemap",
  "serde",
  "serde_json",
 ]
 
+[[package]]
+name = "micro_bevy_web_utils"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0cf1bdf828257b02298c2277bfe364b160ec2a4e2ab6cd34877e8ed48bc96478"
+dependencies = [
+ "bevy_ecs",
+ "bevy_input",
+ "bevy_math",
+ "serde",
+ "serde_json",
+ "wasm-bindgen",
+]
+
 [[package]]
 name = "micro_musicbox"
-version = "0.5.0"
+version = "0.6.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f7cd331da7327ecb5727449abb3a63654bd92003bf9a95eed8c9b0d4a93098eb"
+checksum = "c581586c97190dce37df66c8df15d85254fa0371a8eee56f6790f231fb68f3bf"
 dependencies = [
  "bevy",
  "bevy_kira_audio",
@@ -1962,9 +1973,9 @@ dependencies = [
 
 [[package]]
 name = "naga"
-version = "0.10.0"
+version = "0.11.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "262d2840e72dbe250e8cf2f522d080988dfca624c4112c096238a4845f591707"
+checksum = "5eafe22a23b797c9bc227c6c896419b26b5bb88fa903417a3adaed08778850d5"
 dependencies = [
  "bit-set",
  "bitflags",
@@ -2005,7 +2016,7 @@ dependencies = [
  "jni-sys",
  "ndk-sys 0.4.1+23.1.7779620",
  "num_enum",
- "raw-window-handle 0.5.0",
+ "raw-window-handle",
  "thiserror",
 ]
 
@@ -2015,36 +2026,6 @@ version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b"
 
-[[package]]
-name = "ndk-glue"
-version = "0.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0434fabdd2c15e0aab768ca31d5b7b333717f03cf02037d5a0a3ff3c278ed67f"
-dependencies = [
- "android_logger",
- "libc",
- "log",
- "ndk 0.7.0",
- "ndk-context",
- "ndk-macro",
- "ndk-sys 0.4.1+23.1.7779620",
- "once_cell",
- "parking_lot",
-]
-
-[[package]]
-name = "ndk-macro"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0df7ac00c4672f9d5aece54ee3347520b7e20f158656c7db2e6de01902eb7a6c"
-dependencies = [
- "darling",
- "proc-macro-crate",
- "proc-macro2",
- "quote",
- "syn",
-]
-
 [[package]]
 name = "ndk-sys"
 version = "0.3.0"
@@ -2129,6 +2110,15 @@ dependencies = [
  "winapi",
 ]
 
+[[package]]
+name = "ntapi"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bc51db7b362b205941f71232e56c625156eb9a929f8cf74a428fd5bc094a4afc"
+dependencies = [
+ "winapi",
+]
+
 [[package]]
 name = "nu-ansi-term"
 version = "0.46.0"
@@ -2147,7 +2137,7 @@ checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.105",
 ]
 
 [[package]]
@@ -2198,7 +2188,7 @@ dependencies = [
  "proc-macro-crate",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.105",
 ]
 
 [[package]]
@@ -2211,6 +2201,32 @@ dependencies = [
  "objc_exception",
 ]
 
+[[package]]
+name = "objc-sys"
+version = "0.2.0-beta.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df3b9834c1e95694a05a828b59f55fa2afec6288359cda67146126b3f90a55d7"
+
+[[package]]
+name = "objc2"
+version = "0.3.0-beta.3.patch-leaks.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e01640f9f2cb1220bbe80325e179e532cb3379ebcd1bf2279d703c19fe3a468"
+dependencies = [
+ "block2",
+ "objc-sys",
+ "objc2-encode",
+]
+
+[[package]]
+name = "objc2-encode"
+version = "2.0.0-pre.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "abfcac41015b00a120608fdaa6938c44cb983fee294351cc4bac7638b4e50512"
+dependencies = [
+ "objc-sys",
+]
+
 [[package]]
 name = "objc_exception"
 version = "0.1.2"
@@ -2220,6 +2236,15 @@ dependencies = [
  "cc",
 ]
 
+[[package]]
+name = "object"
+version = "0.30.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ea86265d3d3dcb6a27fc51bd29a4bf387fae9d2986b823079d4986af253eb439"
+dependencies = [
+ "memchr",
+]
+
 [[package]]
 name = "oboe"
 version = "0.4.6"
@@ -2249,6 +2274,18 @@ version = "1.16.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860"
 
+[[package]]
+name = "orbclient"
+version = "0.3.44"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0e9829e16c5e112e94efb5e2ad1fe17f8c1c99bb0fcdc8c65c44e935d904767d"
+dependencies = [
+ "cfg-if",
+ "redox_syscall 0.2.16",
+ "wasm-bindgen",
+ "web-sys",
+]
+
 [[package]]
 name = "overload"
 version = "0.1.1"
@@ -2257,9 +2294,9 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
 
 [[package]]
 name = "owned_ttf_parser"
-version = "0.17.1"
+version = "0.18.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "18904d3c65493a9f0d7542293d1a7f69bfdc309a6b9ef4f46dc3e58b0577edc5"
+checksum = "e25e9fb15717794fae58ab55c26e044103aad13186fbb625893f9a3bbcc24228"
 dependencies = [
  "ttf-parser",
 ]
@@ -2288,11 +2325,17 @@ checksum = "7ff9f3fef3968a3ec5945535ed654cb38ff72d7495a25619e2247fb15a2ed9ba"
 dependencies = [
  "cfg-if",
  "libc",
- "redox_syscall",
+ "redox_syscall 0.2.16",
  "smallvec",
  "windows-sys 0.42.0",
 ]
 
+[[package]]
+name = "paste"
+version = "1.0.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79"
+
 [[package]]
 name = "peeking_take_while"
 version = "0.1.2"
@@ -2361,9 +2404,9 @@ dependencies = [
 
 [[package]]
 name = "proc-macro2"
-version = "1.0.47"
+version = "1.0.56"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725"
+checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435"
 dependencies = [
  "unicode-ident",
 ]
@@ -2376,9 +2419,9 @@ checksum = "74605f360ce573babfe43964cbe520294dcb081afbf8c108fc6e23036b4da2df"
 
 [[package]]
 name = "quote"
-version = "1.0.21"
+version = "1.0.26"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179"
+checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc"
 dependencies = [
  "proc-macro2",
 ]
@@ -2395,15 +2438,6 @@ version = "0.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "63e935c45e09cc6dcf00d2f0b2d630a58f4095320223d47fc68918722f0538b6"
 
-[[package]]
-name = "raw-window-handle"
-version = "0.4.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b800beb9b6e7d2df1fe337c9e3d04e3af22a124460fb4c30fcc22c9117cefb41"
-dependencies = [
- "cty",
-]
-
 [[package]]
 name = "raw-window-handle"
 version = "0.5.0"
@@ -2428,6 +2462,15 @@ dependencies = [
  "bitflags",
 ]
 
+[[package]]
+name = "redox_syscall"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
+dependencies = [
+ "bitflags",
+]
+
 [[package]]
 name = "regex"
 version = "1.7.0"
@@ -2480,6 +2523,12 @@ dependencies = [
  "serde",
 ]
 
+[[package]]
+name = "rustc-demangle"
+version = "0.1.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d4a36c42d1873f9a77c53bde094f9664d9891bc604a45b4798fd2c389ed12e5b"
+
 [[package]]
 name = "rustc-hash"
 version = "1.1.0"
@@ -2545,29 +2594,29 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
 
 [[package]]
 name = "serde"
-version = "1.0.148"
+version = "1.0.160"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e53f64bb4ba0191d6d0676e1b141ca55047d83b74f5607e6d8eb88126c52c2dc"
+checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c"
 dependencies = [
  "serde_derive",
 ]
 
 [[package]]
 name = "serde_derive"
-version = "1.0.148"
+version = "1.0.160"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a55492425aa53521babf6137309e7d34c20bbfbbfcfe2c7f3a047fd1f6b92c0c"
+checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 2.0.15",
 ]
 
 [[package]]
 name = "serde_json"
-version = "1.0.89"
+version = "1.0.96"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "020ff22c755c2ed3f8cf162dbb41a7268d934702f3ed3631656ea597e08fc3db"
+checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1"
 dependencies = [
  "itoa",
  "ryu",
@@ -2690,7 +2739,7 @@ dependencies = [
  "quote",
  "serde",
  "serde_derive",
- "syn",
+ "syn 1.0.105",
 ]
 
 [[package]]
@@ -2706,7 +2755,7 @@ dependencies = [
  "serde_derive",
  "serde_json",
  "sha1",
- "syn",
+ "syn 1.0.105",
 ]
 
 [[package]]
@@ -2715,12 +2764,6 @@ version = "0.1.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0"
 
-[[package]]
-name = "strsim"
-version = "0.10.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
-
 [[package]]
 name = "svg_fmt"
 version = "0.4.1"
@@ -2734,29 +2777,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "17033fe05e4f7f10a6ad602c272bafd2520b2e5cdd9feb61494d9cdce08e002f"
 dependencies = [
  "lazy_static",
- "symphonia-bundle-mp3",
+ "symphonia-codec-vorbis",
  "symphonia-core",
+ "symphonia-format-ogg",
  "symphonia-metadata",
 ]
 
 [[package]]
-name = "symphonia-bundle-mp3"
-version = "0.5.1"
+name = "symphonia-codec-vorbis"
+version = "0.5.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "db5d3d53535ae2b7d0e39e82f683cac5398a6c8baca25ff1183e107d13959d3e"
+checksum = "7dfed6f7b6bfa21d7cef1acefc8eae5db80df1608a1aca91871b07cbd28d7b74"
 dependencies = [
- "bitflags",
- "lazy_static",
  "log",
  "symphonia-core",
- "symphonia-metadata",
+ "symphonia-utils-xiph",
 ]
 
 [[package]]
 name = "symphonia-core"
-version = "0.5.1"
+version = "0.5.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "199a6417cd4115bac79289b64b859358ea050b7add0ceb364dc991f628c5b347"
+checksum = "6b9567e2d8a5f866b2f94f5d366d811e0c6826babcff6d37de9e1a6690d38869"
 dependencies = [
  "arrayvec",
  "bitflags",
@@ -2765,11 +2807,23 @@ dependencies = [
  "log",
 ]
 
+[[package]]
+name = "symphonia-format-ogg"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "474df6e86b871dcb56913130bada1440245f483057c4a2d8a2981455494c4439"
+dependencies = [
+ "log",
+ "symphonia-core",
+ "symphonia-metadata",
+ "symphonia-utils-xiph",
+]
+
 [[package]]
 name = "symphonia-metadata"
-version = "0.5.1"
+version = "0.5.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ed71acf6b5e6e8bee1509597b86365a06b78c1d73218df47357620a6fe5997b"
+checksum = "acd35c263223ef6161000be79b124a75de3e065eea563bf3ef169b3e94c7bb2e"
 dependencies = [
  "encoding_rs",
  "lazy_static",
@@ -2777,6 +2831,16 @@ dependencies = [
  "symphonia-core",
 ]
 
+[[package]]
+name = "symphonia-utils-xiph"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce340a6c33ac06cb42de01220308ec056e8a2a3d5cc664aaf34567392557136b"
+dependencies = [
+ "symphonia-core",
+ "symphonia-metadata",
+]
+
 [[package]]
 name = "syn"
 version = "1.0.105"
@@ -2788,17 +2852,40 @@ dependencies = [
  "unicode-ident",
 ]
 
+[[package]]
+name = "syn"
+version = "2.0.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "sysinfo"
+version = "0.28.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b4c2f3ca6693feb29a89724516f016488e9aafc7f37264f898593ee4b942f31b"
+dependencies = [
+ "cfg-if",
+ "core-foundation-sys",
+ "libc",
+ "ntapi",
+ "once_cell",
+ "winapi",
+]
+
 [[package]]
 name = "taffy"
-version = "0.1.0"
+version = "0.3.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec27dea659b100d489dffa57cf0efc6d7bfefb119af817b92cc14006c0b214e3"
+checksum = "fab62c50c3d17993e7f0c72932e51ceeac5ec2b51c225fda8529d606159c99d8"
 dependencies = [
  "arrayvec",
- "hash32",
- "hash32-derive",
  "num-traits",
- "typenum",
+ "slotmap",
 ]
 
 [[package]]
@@ -2827,7 +2914,7 @@ checksum = "982d17546b47146b28f7c22e3d08465f6b8903d0ea13c1660d9d84a6e7adcdbb"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.105",
 ]
 
 [[package]]
@@ -2848,6 +2935,23 @@ dependencies = [
  "serde",
 ]
 
+[[package]]
+name = "toml_datetime"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3ab8ed2edee10b50132aed5f331333428b011c99402b5a534154ed15746f9622"
+
+[[package]]
+name = "toml_edit"
+version = "0.19.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "239410c8609e8125456927e6707163a3b1fdb40561e4b803bc041f466ccfdc13"
+dependencies = [
+ "indexmap",
+ "toml_datetime",
+ "winnow",
+]
+
 [[package]]
 name = "tracing"
 version = "0.1.37"
@@ -2868,7 +2972,7 @@ checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.105",
 ]
 
 [[package]]
@@ -2923,15 +3027,9 @@ dependencies = [
 
 [[package]]
 name = "ttf-parser"
-version = "0.17.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "375812fa44dab6df41c195cd2f7fecb488f6c09fbaafb62807488cefab642bff"
-
-[[package]]
-name = "typenum"
-version = "1.15.0"
+version = "0.18.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987"
+checksum = "0609f771ad9c6155384897e1df4d948e692667cc0588548b68eb44d052b27633"
 
 [[package]]
 name = "unicode-ident"
@@ -3023,7 +3121,7 @@ dependencies = [
  "once_cell",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.105",
  "wasm-bindgen-shared",
 ]
 
@@ -3057,7 +3155,7 @@ checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.105",
  "wasm-bindgen-backend",
  "wasm-bindgen-shared",
 ]
@@ -3152,16 +3250,18 @@ dependencies = [
 
 [[package]]
 name = "wgpu"
-version = "0.14.2"
+version = "0.15.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "81f643110d228fd62a60c5ed2ab56c4d5b3704520bd50561174ec4ec74932937"
+checksum = "d14c6bfcf3b10f4273f522a95994553c0a5f2934976e62e61a720ae4bc2eb8f2"
 dependencies = [
  "arrayvec",
+ "cfg-if",
  "js-sys",
  "log",
  "naga",
  "parking_lot",
- "raw-window-handle 0.5.0",
+ "profiling",
+ "raw-window-handle",
  "smallvec",
  "static_assertions",
  "wasm-bindgen",
@@ -3174,21 +3274,20 @@ dependencies = [
 
 [[package]]
 name = "wgpu-core"
-version = "0.14.2"
+version = "0.15.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6000d1284ef8eec6076fd5544a73125fd7eb9b635f18dceeb829d826f41724ca"
+checksum = "7131408d940e335792645a98f03639573b0480e9e2e7cddbbab74f7c6d9f3fff"
 dependencies = [
  "arrayvec",
  "bit-vec",
  "bitflags",
- "cfg_aliases",
  "codespan-reporting",
  "fxhash",
  "log",
  "naga",
  "parking_lot",
  "profiling",
- "raw-window-handle 0.5.0",
+ "raw-window-handle",
  "smallvec",
  "thiserror",
  "web-sys",
@@ -3198,9 +3297,9 @@ dependencies = [
 
 [[package]]
 name = "wgpu-hal"
-version = "0.14.1"
+version = "0.15.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3cc320a61acb26be4f549c9b1b53405c10a223fbfea363ec39474c32c348d12f"
+checksum = "82e95792925fe3d58950b9a5c2a191caa145e2bc570e2d233f0d7320f6a8e814"
 dependencies = [
  "android_system_properties",
  "arrayvec",
@@ -3214,9 +3313,12 @@ dependencies = [
  "fxhash",
  "glow",
  "gpu-alloc",
+ "gpu-allocator",
  "gpu-descriptor",
+ "hassle-rs",
  "js-sys",
  "khronos-egl",
+ "libc",
  "libloading",
  "log",
  "metal",
@@ -3225,7 +3327,7 @@ dependencies = [
  "parking_lot",
  "profiling",
  "range-alloc",
- "raw-window-handle 0.5.0",
+ "raw-window-handle",
  "renderdoc-sys",
  "smallvec",
  "thiserror",
@@ -3237,13 +3339,21 @@ dependencies = [
 
 [[package]]
 name = "wgpu-types"
-version = "0.14.1"
+version = "0.15.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fb6b28ef22cac17b9109b25b3bf8c9a103eeb293d7c5f78653979b09140375f6"
+checksum = "ecf8cfcbf98f94cc8bd5981544c687140cf9d3948e2ab83849367ead2cd737cf"
 dependencies = [
  "bitflags",
+ "js-sys",
+ "web-sys",
 ]
 
+[[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"
@@ -3289,16 +3399,51 @@ dependencies = [
 ]
 
 [[package]]
-name = "windows-sys"
-version = "0.36.1"
+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.2",
+ "windows_i686_gnu 0.42.2",
+ "windows_i686_msvc 0.42.2",
+ "windows_x86_64_gnu 0.42.2",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc 0.42.2",
+]
+
+[[package]]
+name = "windows"
+version = "0.44.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9e745dab35a0c4c77aa3ce42d595e13d2003d6902d6b08c9ef5fc326d08da12b"
+dependencies = [
+ "windows-implement",
+ "windows-interface",
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-implement"
+version = "0.44.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6ce87ca8e3417b02dc2a8a22769306658670ec92d78f1bd420d6310a67c245c6"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.105",
+]
+
+[[package]]
+name = "windows-interface"
+version = "0.44.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2"
+checksum = "853f69a591ecd4f810d29f17e902d40e349fb05b0b11fff63b08b826bfe39c7f"
 dependencies = [
- "windows_aarch64_msvc 0.36.1",
- "windows_i686_gnu 0.36.1",
- "windows_i686_msvc 0.36.1",
- "windows_x86_64_gnu 0.36.1",
- "windows_x86_64_msvc 0.36.1",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.105",
 ]
 
 [[package]]
@@ -3308,43 +3453,55 @@ 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.2",
+ "windows_i686_gnu 0.42.2",
+ "windows_i686_msvc 0.42.2",
+ "windows_x86_64_gnu 0.42.2",
  "windows_x86_64_gnullvm",
- "windows_x86_64_msvc 0.42.0",
+ "windows_x86_64_msvc 0.42.2",
 ]
 
 [[package]]
-name = "windows_aarch64_gnullvm"
-version = "0.42.0"
+name = "windows-sys"
+version = "0.45.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e"
+checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
+dependencies = [
+ "windows-targets",
+]
 
 [[package]]
-name = "windows_aarch64_msvc"
-version = "0.36.1"
+name = "windows-targets"
+version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47"
+checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc 0.42.2",
+ "windows_i686_gnu 0.42.2",
+ "windows_i686_msvc 0.42.2",
+ "windows_x86_64_gnu 0.42.2",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc 0.42.2",
+]
 
 [[package]]
-name = "windows_aarch64_msvc"
-version = "0.37.0"
+name = "windows_aarch64_gnullvm"
+version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2623277cb2d1c216ba3b578c0f3cf9cdebeddb6e66b1b218bb33596ea7769c3a"
+checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
 
 [[package]]
 name = "windows_aarch64_msvc"
-version = "0.42.0"
+version = "0.37.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4"
+checksum = "2623277cb2d1c216ba3b578c0f3cf9cdebeddb6e66b1b218bb33596ea7769c3a"
 
 [[package]]
-name = "windows_i686_gnu"
-version = "0.36.1"
+name = "windows_aarch64_msvc"
+version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6"
+checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
 
 [[package]]
 name = "windows_i686_gnu"
@@ -3354,15 +3511,9 @@ checksum = "d3925fd0b0b804730d44d4b6278c50f9699703ec49bcd628020f46f4ba07d9e1"
 
 [[package]]
 name = "windows_i686_gnu"
-version = "0.42.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7"
-
-[[package]]
-name = "windows_i686_msvc"
-version = "0.36.1"
+version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024"
+checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
 
 [[package]]
 name = "windows_i686_msvc"
@@ -3372,15 +3523,9 @@ checksum = "ce907ac74fe331b524c1298683efbf598bb031bc84d5e274db2083696d07c57c"
 
 [[package]]
 name = "windows_i686_msvc"
-version = "0.42.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246"
-
-[[package]]
-name = "windows_x86_64_gnu"
-version = "0.36.1"
+version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1"
+checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
 
 [[package]]
 name = "windows_x86_64_gnu"
@@ -3390,21 +3535,15 @@ checksum = "2babfba0828f2e6b32457d5341427dcbb577ceef556273229959ac23a10af33d"
 
 [[package]]
 name = "windows_x86_64_gnu"
-version = "0.42.0"
+version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed"
+checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
 
 [[package]]
 name = "windows_x86_64_gnullvm"
-version = "0.42.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028"
-
-[[package]]
-name = "windows_x86_64_msvc"
-version = "0.36.1"
+version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680"
+checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
 
 [[package]]
 name = "windows_x86_64_msvc"
@@ -3414,18 +3553,19 @@ checksum = "f4dd6dc7df2d84cf7b33822ed5b86318fb1781948e9663bacd047fc9dd52259d"
 
 [[package]]
 name = "windows_x86_64_msvc"
-version = "0.42.0"
+version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5"
+checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
 
 [[package]]
 name = "winit"
-version = "0.27.5"
+version = "0.28.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bb796d6fbd86b2fd896c9471e6f04d39d750076ebe5680a3958f00f5ab97657c"
+checksum = "4f504e8c117b9015f618774f8d58cd4781f5a479bc41079c064f974cbb253874"
 dependencies = [
+ "android-activity",
  "bitflags",
- "cocoa",
+ "cfg_aliases",
  "core-foundation",
  "core-graphics",
  "dispatch",
@@ -3434,22 +3574,32 @@ dependencies = [
  "log",
  "mio",
  "ndk 0.7.0",
- "ndk-glue",
- "objc",
+ "objc2",
  "once_cell",
- "parking_lot",
+ "orbclient",
  "percent-encoding",
- "raw-window-handle 0.4.3",
- "raw-window-handle 0.5.0",
+ "raw-window-handle",
+ "redox_syscall 0.3.5",
  "smithay-client-toolkit",
  "wasm-bindgen",
  "wayland-client",
+ "wayland-commons",
  "wayland-protocols",
+ "wayland-scanner",
  "web-sys",
- "windows-sys 0.36.1",
+ "windows-sys 0.45.0",
  "x11-dl",
 ]
 
+[[package]]
+name = "winnow"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ae8970b36c66498d8ff1d66685dc86b91b29db0c7739899012f63a63814b4b28"
+dependencies = [
+ "memchr",
+]
+
 [[package]]
 name = "x11-dl"
 version = "2.20.1"
diff --git a/Cargo.toml b/Cargo.toml
index 1686bec..78f5b7d 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -16,23 +16,27 @@ log = "0.4.17"
 thiserror = "1.0.37"
 serde = "1.0.147"
 serde_json = "1.0.87"
-iyes_loopless = "0.9.1"
+num-traits = "0.2.15"
 
-micro_musicbox = { version = "0.5.0", features = ["mp3"] }
-micro_banimate = "0.2.1"
-micro_bevy_web_utils = "0.1.0"
+micro_musicbox = { version = "0.6.2", features = ["ogg"] }
+micro_banimate = "0.5.0-beta.2"
+micro_bevy_web_utils = "0.2.0"
+
+bevy_embedded_assets = "0.7.0"
+bevy_tweening = "0.7.0"
 
 [workspace.dependencies.bevy]
-version = "0.9.1"
+version = "0.10.1"
 default-features = false
 features = [
     "bevy_asset",
-    "render",
+    "bevy_sprite",
     "bevy_winit",
     "png",
     "hdr",
     "x11",
     "wayland",
     "serialize",
-    "filesystem_watcher"
+    "filesystem_watcher",
+    "bevy_core_pipeline",
 ]
diff --git a/Makefile b/Makefile
index 34f9ed6..4de73e3 100644
--- a/Makefile
+++ b/Makefile
@@ -20,19 +20,25 @@ setup-wayland: linux-deps wayland-deps cargo-deps
 assets:
 	@echo "Beep Boop, No assets needed to be built"
 
+
 run:
 	RUSTFLAGS="-Awarnings" \
-	cargo run -p game_core
+	cargo run --release --features "bevy/dynamic_linking" -p game_core
+
+dirty-build:
+	RUSTFLAGS="-Awarnings" \
+	cargo build --release --features "embed" -p game_core
 
 run-web:
+	RUSTFLAGS="-Awarnings" \
 	cd game_core && trunk serve
 
 check:
-	cargo check --release --features "bevy/dynamic" -p game_core
+	cargo check --release -p game_core
 
 build-windows: clean_dist top_tail
 	docker run --rm --name "${PROJECT_NAME}-build-windows" -v "$(CURRENT_DIRECTORY):/app" -w /app --user $(shell id -u):$(shell id -g) r.lcr.gr/microhacks/bevy-builder \
-		cargo build --release -p game_core --target x86_64-pc-windows-gnu
+		cargo build --release --features "embed" -p game_core --target x86_64-pc-windows-gnu
 	mkdir -p dist
 	cp -r assets dist/assets
 	cp target/x86_64-pc-windows-gnu/release/game_core.exe "dist/${PROJECT_NAME}.exe"
@@ -40,14 +46,14 @@ build-windows: clean_dist top_tail
 
 build-linux: clean_dist top_tail
 	docker run --rm --name "${PROJECT_NAME}-build-linux" -v "$(CURRENT_DIRECTORY):/app" -w /app --user $(shell id -u):$(shell id -g) r.lcr.gr/microhacks/bevy-builder \
-		cargo build --release -p game_core --target x86_64-unknown-linux-gnu
+		cargo build --release --features "embed" -p game_core --target x86_64-unknown-linux-gnu
 	mkdir -p dist
 	cp -r assets dist/assets
 	cp target/x86_64-unknown-linux-gnu/release/game_core "dist/${PROJECT_NAME}"
 	cd dist && zip -r "${PROJECT_NAME}-linux.zip" "./${PROJECT_NAME}" ./assets
 
 build-web: top_tail
-	cd game_core && trunk build --release
+	cd game_core && trunk build --features "embed" --release
 	cd game_core/dist && zip -r "${PROJECT_NAME}-web.zip" ./*
 
 clean_dist:
diff --git a/assets/splash_sting.mp3 b/assets/splash_sting.mp3
deleted file mode 100644
index 60969e2..0000000
--- a/assets/splash_sting.mp3
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:0b87909a495423ff0ad6870cbcb0af34a6b1f30b3b44c261aded03b910d79cde
-size 187080
diff --git a/assets/splash_sting.ogg b/assets/splash_sting.ogg
new file mode 100644
index 0000000..2021cd8
--- /dev/null
+++ b/assets/splash_sting.ogg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6bdee7232315c9e502fe583c3efc53ab30619c51c3c10d00e58c5415eaa3639c
+size 93940
diff --git a/game_core/Cargo.toml b/game_core/Cargo.toml
index f7f7b8b..3ee762e 100644
--- a/game_core/Cargo.toml
+++ b/game_core/Cargo.toml
@@ -5,8 +5,15 @@ edition = "2021"
 
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
+[features]
+
+default = []
+embed = []
+
 [dependencies]
 bevy.workspace = true
+bevy_tweening.workspace = true
+bevy_embedded_assets.workspace = true
 
 fastrand.workspace = true
 anyhow.workspace = true
@@ -14,7 +21,7 @@ log.workspace = true
 thiserror.workspace = true
 serde.workspace = true
 serde_json.workspace = true
-iyes_loopless.workspace = true
+num-traits.workspace = true
 
 micro_banimate.workspace = true
 micro_musicbox.workspace = true
diff --git a/game_core/src/assets/loader.rs b/game_core/src/assets/loader.rs
index a66028a..710473b 100644
--- a/game_core/src/assets/loader.rs
+++ b/game_core/src/assets/loader.rs
@@ -4,6 +4,7 @@ use bevy::asset::LoadState;
 use bevy::ecs::system::SystemParam;
 use bevy::prelude::*;
 use bevy::reflect::TypeUuid;
+use micro_banimate::definitions::AnimationSet;
 use micro_musicbox::prelude::AudioSource;
 
 use crate::assets::{AssetHandles, FixedAssetNameMapping, SpriteSheetConfig};
@@ -55,6 +56,7 @@ impl<'w, 's> AssetTypeLoader<'w, 's> {
 	load_basic_type!(load_images, Image => images);
 	load_basic_type!(load_audio, AudioSource => sounds);
 	load_basic_type!(load_font, Font => fonts);
+	load_basic_type!(load_animation, AnimationSet => animations);
 
 	pub fn load_spritesheet(
 		&mut self,
diff --git a/game_core/src/assets/mod.rs b/game_core/src/assets/mod.rs
index 5fc030e..0cef22e 100644
--- a/game_core/src/assets/mod.rs
+++ b/game_core/src/assets/mod.rs
@@ -2,13 +2,11 @@ mod loader;
 mod resources;
 mod startup;
 
-use bevy::app::{App, Plugin};
-use iyes_loopless::condition::ConditionSet;
-use iyes_loopless::prelude::AppLooplessStateExt;
+use bevy::prelude::*;
 pub use loader::AssetTypeLoader;
 pub use resources::{AssetHandles, AssetNameMapping, FixedAssetNameMapping, SpriteSheetConfig};
 
-use crate::system::flow::AppState;
+use crate::system::flow::{AppScheduleExt, AppState};
 
 pub struct AssetsPlugin;
 impl Plugin for AssetsPlugin {
@@ -16,11 +14,6 @@ impl Plugin for AssetsPlugin {
 		app.init_resource::<AssetHandles>()
 			.add_enter_system(AppState::Preload, startup::start_preload_resources)
 			.add_enter_system(AppState::Preload, startup::start_load_resources)
-			.add_system_set(
-				ConditionSet::new()
-					.run_in_state(AppState::Setup)
-					.with_system(startup::check_load_resources)
-					.into(),
-			);
+			.add_system(startup::check_load_resources.in_set(OnUpdate(AppState::Setup)));
 	}
 }
diff --git a/game_core/src/assets/resources.rs b/game_core/src/assets/resources.rs
index 0800d96..425f79b 100644
--- a/game_core/src/assets/resources.rs
+++ b/game_core/src/assets/resources.rs
@@ -1,5 +1,6 @@
 use bevy::prelude::*;
 use bevy::utils::HashMap;
+use micro_banimate::definitions::AnimationSet;
 use micro_musicbox::prelude::AudioSource;
 use micro_musicbox::utilities::{SuppliesAudio, TrackType};
 
@@ -37,6 +38,7 @@ pub struct AssetHandles {
 	pub atlas: HashMap<String, Handle<TextureAtlas>>,
 	pub sounds: HashMap<String, Handle<AudioSource>>,
 	pub fonts: HashMap<String, Handle<Font>>,
+	pub animations: HashMap<String, Handle<AnimationSet>>
 }
 
 macro_rules! fetch_wrapper {
@@ -66,6 +68,7 @@ impl AssetHandles {
 	fetch_wrapper!(atlas, TextureAtlas => atlas);
 	fetch_wrapper!(sound, AudioSource => sounds);
 	fetch_wrapper!(font, Font => fonts);
+	fetch_wrapper!(animation, AnimationSet => animations);
 }
 
 impl SuppliesAudio for AssetHandles {
diff --git a/game_core/src/assets/startup.rs b/game_core/src/assets/startup.rs
index cb6d71e..8f0ae56 100644
--- a/game_core/src/assets/startup.rs
+++ b/game_core/src/assets/startup.rs
@@ -1,25 +1,30 @@
 use bevy::asset::LoadState;
 use bevy::prelude::*;
-use iyes_loopless::prelude::NextState;
 
 use crate::assets::AssetTypeLoader;
 use crate::system::flow::AppState;
 
-pub fn start_preload_resources(mut commands: Commands) {
+pub fn start_preload_resources(
+	mut _commands: Commands,
+	mut next_state: ResMut<NextState<AppState>>,
+) {
 	// TODO: Add preload commands here
-
-	commands.insert_resource(NextState(AppState::Setup))
+	next_state.set(AppState::Setup);
 }
 
 pub fn start_load_resources(mut loader: AssetTypeLoader) {
 	loader.load_images(&[("splash.png", "splash")]);
-	loader.load_audio(&[("splash_sting.mp3", "splash_sting")]);
+	loader.load_audio(&[("splash_sting.ogg", "splash_sting")]);
 }
 
-pub fn check_load_resources(mut commands: Commands, loader: AssetTypeLoader) {
+pub fn check_load_resources(
+	mut commands: Commands,
+	loader: AssetTypeLoader,
+	mut next_state: ResMut<NextState<AppState>>,
+) {
 	let load_states = loader.get_all_load_state();
 	if load_states.iter().all(|state| *state == LoadState::Loaded) {
 		log::info!("Assets loaded successfully");
-		commands.insert_resource(NextState(AppState::Splash))
+		next_state.set(AppState::Splash);
 	}
 }
diff --git a/game_core/src/main.rs b/game_core/src/main.rs
index 1eda1ba..7ba758c 100644
--- a/game_core/src/main.rs
+++ b/game_core/src/main.rs
@@ -1,22 +1,15 @@
 use bevy::prelude::*;
 use game_core::assets::AssetHandles;
 use game_core::system::flow::AppState;
-use game_core::system::resources::InitAppPlugins;
-use iyes_loopless::prelude::AppLooplessStateExt;
-use micro_musicbox::CombinedAudioPlugins;
-// use remote_events::RemoteEventPlugin;
 
 fn main() {
 	App::new()
-		.add_loopless_state(AppState::Preload)
-		.add_plugins(InitAppPlugins)
+		.add_state::<AppState>()
+		.add_plugins(game_core::system::resources::InitAppPlugins)
 		.add_plugin(game_core::assets::AssetsPlugin)
-		.add_plugins(CombinedAudioPlugins::<AssetHandles>::new())
+		.add_plugins(micro_musicbox::CombinedAudioPlugins::<AssetHandles>::new())
+		.add_plugins(micro_banimate::BanimatePluginGroup)
 		.add_plugin(game_core::splash_screen::SplashScreenPlugin)
 		.add_plugin(game_core::system::camera::CameraManagementPlugin)
-		// .add_plugin(RemoteEventPlugin::<
-		// 	game_core::multiplayer::OutgoingEvent,
-		// 	game_core::multiplayer::IncomingEvent,
-		// >::new())
 		.run();
 }
diff --git a/game_core/src/splash_screen/mod.rs b/game_core/src/splash_screen/mod.rs
index c7043c8..6a44354 100644
--- a/game_core/src/splash_screen/mod.rs
+++ b/game_core/src/splash_screen/mod.rs
@@ -1,7 +1,6 @@
 use bevy::prelude::*;
-use iyes_loopless::prelude::{AppLooplessStateExt, ConditionSet};
 
-use crate::system::flow::AppState;
+use crate::system::flow::{AppScheduleExt, AppState};
 
 mod components;
 mod systems;
@@ -10,12 +9,7 @@ pub struct SplashScreenPlugin;
 impl Plugin for SplashScreenPlugin {
 	fn build(&self, app: &mut App) {
 		app.add_enter_system(AppState::Splash, systems::setup_splash_screen)
-			.add_system_set(
-				ConditionSet::new()
-					.run_in_state(AppState::Splash)
-					.with_system(systems::tick_splash_system)
-					.into(),
-			)
+			.add_system(systems::tick_splash_system.in_set(OnUpdate(AppState::Splash)))
 			.add_exit_system(AppState::Splash, systems::remove_splash_entities);
 	}
 }
diff --git a/game_core/src/splash_screen/systems.rs b/game_core/src/splash_screen/systems.rs
index 9f7d47e..1cd7f4f 100644
--- a/game_core/src/splash_screen/systems.rs
+++ b/game_core/src/splash_screen/systems.rs
@@ -1,6 +1,5 @@
 use bevy::prelude::*;
 use bevy::render::texture::ImageSampler;
-use iyes_loopless::state::NextState;
 use micro_musicbox::music_box::MusicBox;
 
 use crate::assets::AssetHandles;
@@ -33,6 +32,7 @@ pub fn setup_splash_screen(
 	mut image_assets: ResMut<Assets<Image>>,
 	handles: Res<AssetHandles>,
 	mut music_box: MusicBox<AssetHandles>,
+	mut next_state: ResMut<NextState<AppState>>,
 ) {
 	let (window_width, window_height) = virtual_size();
 
@@ -40,7 +40,7 @@ pub fn setup_splash_screen(
 		Some(handle) => handle,
 		None => {
 			log::error!("No splash image was found; Skipping");
-			commands.insert_resource(NextState(AppState::Menu));
+			next_state.set(AppState::Menu);
 			return;
 		}
 	};
@@ -48,7 +48,7 @@ pub fn setup_splash_screen(
 		.get_mut(handle)
 		.expect("An image was stored without the handle being persisted");
 
-	commands.insert_resource(ClearColor(Color::hex("001122").unwrap()));
+	commands.insert_resource(bevy::prelude::ClearColor(Color::hex("001122").unwrap()));
 
 	let scale_factor = match window_width > window_height {
 		true => window_height / image_data.texture_descriptor.size.height as f32,
@@ -92,8 +92,8 @@ pub fn setup_splash_screen(
 }
 
 pub fn tick_splash_system(
-	mut commands: Commands,
 	time: Res<Time>,
+	mut next_state: ResMut<NextState<AppState>>,
 	mut query: Query<(&mut Sprite, &mut SplashAnimation, &mut SplashAnimationTimer)>,
 ) {
 	let tick = time.delta_seconds();
@@ -115,7 +115,7 @@ pub fn tick_splash_system(
 					*anims = *anim.clone();
 				}
 				None => {
-					commands.insert_resource(NextState(AppState::Menu));
+					next_state.set(AppState::Menu);
 				}
 			}
 		}
diff --git a/game_core/src/system/camera.rs b/game_core/src/system/camera.rs
index e3caa69..781dc16 100644
--- a/game_core/src/system/camera.rs
+++ b/game_core/src/system/camera.rs
@@ -1,42 +1,65 @@
 use bevy::app::App;
+use bevy::core_pipeline::clear_color::ClearColorConfig;
 use bevy::math::{Vec2, Vec3Swizzles};
-use bevy::prelude::{
-	Camera2dBundle, Commands, Component, CoreStage, Entity, OrthographicProjection, Plugin, Query,
-	Transform, With,
-};
+use bevy::prelude::*;
 use bevy::render::camera::ScalingMode;
-use iyes_loopless::prelude::AppLooplessStateExt;
+use bevy::render::view::RenderLayers;
 
-use crate::system::flow::AppState;
+use crate::system::flow::{AppScheduleExt, AppState};
 use crate::system::load_config::virtual_size;
 
 /// A flag component to indicate which entity should be followed by the camera
-#[derive(Component)]
+#[derive(Component, Default)]
 pub struct ChaseCam;
 /// A flag component to indicate a camera that should be used for rendering world entities and sprites
-#[derive(Component)]
+#[derive(Component, Default)]
 pub struct GameCamera;
 
 /// System that creates a default orthographic camera, with correct tags for querying
 pub fn spawn_orthographic_camera(mut commands: Commands) {
+	spawn_camera(
+		&mut commands,
+		(GameCamera,),
+		0,
+		ClearColorConfig::Default,
+	);
+}
+
+pub fn spawn_camera(
+	commands: &mut Commands,
+	tags: impl Bundle,
+	order: isize,
+	clear_color: ClearColorConfig,
+) -> Entity {
 	let (target_width, target_height) = virtual_size();
-	commands.spawn((
-		Camera2dBundle {
-			projection: OrthographicProjection {
-				left: -(target_width / 2.0),
-				right: (target_width / 2.0),
-				top: (target_height / 2.0),
-				bottom: -(target_height / 2.0),
-				scaling_mode: ScalingMode::Auto {
-					min_width: target_width,
-					min_height: target_height,
+
+	commands
+		.spawn((
+			Camera2dBundle {
+				camera: Camera {
+					order,
+					..Default::default()
+				},
+				projection: OrthographicProjection {
+					area: Rect::new(
+						-(target_width / 2.0),
+						-(target_height / 2.0),
+						(target_width / 2.0),
+						(target_height / 2.0),
+					),
+					scaling_mode: ScalingMode::AutoMin {
+						min_width: target_width,
+						min_height: target_height,
+					},
+					..Default::default()
 				},
+				camera_2d: Camera2d { clear_color },
 				..Default::default()
 			},
-			..Default::default()
-		},
-		GameCamera,
-	));
+			RenderLayers::layer(order.max(0).min(RenderLayers::TOTAL_LAYERS as isize - 1) as u8),
+			tags,
+		))
+		.id()
 }
 
 /// System that takes the average location of all chase camera entities, and updates the location
@@ -75,6 +98,6 @@ pub struct CameraManagementPlugin;
 impl Plugin for CameraManagementPlugin {
 	fn build(&self, app: &mut App) {
 		app.add_enter_system(AppState::Preload, spawn_orthographic_camera)
-			.add_system_to_stage(CoreStage::PreUpdate, sync_chase_camera_location);
+			.add_system(sync_chase_camera_location);
 	}
 }
diff --git a/game_core/src/system/flow.rs b/game_core/src/system/flow.rs
index 0f565c7..b7ac9ad 100644
--- a/game_core/src/system/flow.rs
+++ b/game_core/src/system/flow.rs
@@ -1,13 +1,15 @@
-use bevy::prelude::StageLabel;
+use bevy::app::{App, CoreSet, Plugin};
+use bevy::prelude::*;
 
 /// An enum representing the current set of systems that should be running.
 /// Changing states should be done by inserting an `iyes_loopless` `NextState`
 /// resource with the value of one of these app states
-#[derive(Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Debug, Hash, StageLabel)]
+#[derive(Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Debug, Hash, States, Default)]
 pub enum AppState {
 	/// During the preload state, embedded resources will be registered with Bevy.
 	/// Embedded resources will be attached to the asset system with the path
 	/// `internal:{resource-name}`
+	#[default]
 	Preload,
 	/// During the setup state, external resources will be registered by reading from
 	/// the filesystem or the network. Progress can be displayed using the embedded
@@ -22,3 +24,103 @@ pub enum AppState {
 	/// will be spent here.
 	InGame,
 }
+
+pub fn run_in_game(state: Res<State<AppState>>) -> bool {
+	state.0 == AppState::InGame
+}
+pub fn run_in_menu(state: Res<State<AppState>>) -> bool {
+	state.0 == AppState::Menu
+}
+pub fn run_in_splash(state: Res<State<AppState>>) -> bool {
+	state.0 == AppState::Splash
+}
+pub fn run_in_setup(state: Res<State<AppState>>) -> bool {
+	state.0 == AppState::Setup
+}
+
+#[derive(Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Debug, Hash, SystemSet)]
+#[system_set(base)]
+pub enum FlowSet {
+	// Any custom processing steps, such as "player actions", or "process AI"
+	Cleanup,
+}
+
+#[derive(Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Debug, Hash, SystemSet)]
+#[system_set(base)]
+pub enum FlushFlowCommands {
+	// Create an associated flush step where actions will be applied, for each FlowSet
+	FlushCleanup,
+}
+
+pub struct FlowSetPlugin;
+impl Plugin for FlowSetPlugin {
+	fn build(&self, app: &mut App) {
+		app.configure_sets(
+			(
+				CoreSet::UpdateFlush,
+				FlowSet::Cleanup,
+				FlushFlowCommands::FlushCleanup,
+				CoreSet::PostUpdate,
+			)
+				.chain(),
+		)
+		.add_system(apply_system_buffers.in_base_set(FlushFlowCommands::FlushCleanup));
+	}
+}
+
+pub trait AppScheduleExt {
+	fn add_enter_system<M>(
+		&mut self,
+		state: impl States,
+		system: impl IntoSystemAppConfig<M>,
+	) -> &mut Self;
+	fn add_enter_systems<M>(
+		&mut self,
+		state: impl States,
+		system: impl IntoSystemAppConfigs<M>,
+	) -> &mut Self;
+	fn add_exit_system<M>(
+		&mut self,
+		state: impl States,
+		system: impl IntoSystemAppConfig<M>,
+	) -> &mut Self;
+	fn add_exit_systems<M>(
+		&mut self,
+		state: impl States,
+		system: impl IntoSystemAppConfigs<M>,
+	) -> &mut Self;
+}
+
+impl AppScheduleExt for App {
+	fn add_enter_system<M>(
+		&mut self,
+		state: impl States,
+		system: impl IntoSystemAppConfig<M>,
+	) -> &mut Self {
+		self.add_system(system.in_schedule(OnEnter(state)))
+	}
+
+	fn add_enter_systems<M>(
+		&mut self,
+		state: impl States,
+		systems: impl IntoSystemAppConfigs<M>,
+	) -> &mut Self {
+		self.add_systems(systems.in_schedule(OnEnter(state)))
+	}
+
+	fn add_exit_system<M>(
+		&mut self,
+		state: impl States,
+		system: impl IntoSystemAppConfig<M>,
+	) -> &mut Self {
+		self.add_system(system.in_schedule(OnExit(state)))
+	}
+
+	fn add_exit_systems<M>(
+		&mut self,
+		state: impl States,
+		systems: impl IntoSystemAppConfigs<M>,
+	) -> &mut Self {
+		self.add_systems(systems.in_schedule(OnExit(state)))
+	}
+}
diff --git a/game_core/src/system/keycode.rs b/game_core/src/system/keycode.rs
new file mode 100644
index 0000000..5ec750c
--- /dev/null
+++ b/game_core/src/system/keycode.rs
@@ -0,0 +1,169 @@
+use bevy::prelude::KeyCode;
+
+pub fn keycode_string(code: KeyCode) -> &'static str {
+	match code {
+		KeyCode::Key1 => "Key1",
+		KeyCode::Key2 => "Key2",
+		KeyCode::Key3 => "Key3",
+		KeyCode::Key4 => "Key4",
+		KeyCode::Key5 => "Key5",
+		KeyCode::Key6 => "Key6",
+		KeyCode::Key7 => "Key7",
+		KeyCode::Key8 => "Key8",
+		KeyCode::Key9 => "Key9",
+		KeyCode::Key0 => "Key0",
+		KeyCode::A => "A",
+		KeyCode::B => "B",
+		KeyCode::C => "C",
+		KeyCode::D => "D",
+		KeyCode::E => "E",
+		KeyCode::F => "F",
+		KeyCode::G => "G",
+		KeyCode::H => "H",
+		KeyCode::I => "I",
+		KeyCode::J => "J",
+		KeyCode::K => "K",
+		KeyCode::L => "L",
+		KeyCode::M => "M",
+		KeyCode::N => "N",
+		KeyCode::O => "O",
+		KeyCode::P => "P",
+		KeyCode::Q => "Q",
+		KeyCode::R => "R",
+		KeyCode::S => "S",
+		KeyCode::T => "T",
+		KeyCode::U => "U",
+		KeyCode::V => "V",
+		KeyCode::W => "W",
+		KeyCode::X => "X",
+		KeyCode::Y => "Y",
+		KeyCode::Z => "Z",
+		KeyCode::Escape => "Escape",
+		KeyCode::F1 => "F1",
+		KeyCode::F2 => "F2",
+		KeyCode::F3 => "F3",
+		KeyCode::F4 => "F4",
+		KeyCode::F5 => "F5",
+		KeyCode::F6 => "F6",
+		KeyCode::F7 => "F7",
+		KeyCode::F8 => "F8",
+		KeyCode::F9 => "F9",
+		KeyCode::F10 => "F10",
+		KeyCode::F11 => "F11",
+		KeyCode::F12 => "F12",
+		KeyCode::F13 => "F13",
+		KeyCode::F14 => "F14",
+		KeyCode::F15 => "F15",
+		KeyCode::F16 => "F16",
+		KeyCode::F17 => "F17",
+		KeyCode::F18 => "F18",
+		KeyCode::F19 => "F19",
+		KeyCode::F20 => "F20",
+		KeyCode::F21 => "F21",
+		KeyCode::F22 => "F22",
+		KeyCode::F23 => "F23",
+		KeyCode::F24 => "F24",
+		KeyCode::Snapshot => "Snapshot",
+		KeyCode::Scroll => "Scroll",
+		KeyCode::Pause => "Pause",
+		KeyCode::Insert => "Insert",
+		KeyCode::Home => "Home",
+		KeyCode::Delete => "Delete",
+		KeyCode::End => "End",
+		KeyCode::PageDown => "PageDown",
+		KeyCode::PageUp => "PageUp",
+		KeyCode::Left => "Left",
+		KeyCode::Up => "Up",
+		KeyCode::Right => "Right",
+		KeyCode::Down => "Down",
+		KeyCode::Back => "Back",
+		KeyCode::Return => "Return",
+		KeyCode::Space => "Space",
+		KeyCode::Compose => "Compose",
+		KeyCode::Caret => "Caret",
+		KeyCode::Numlock => "Numlock",
+		KeyCode::Numpad0 => "Numpad0",
+		KeyCode::Numpad1 => "Numpad1",
+		KeyCode::Numpad2 => "Numpad2",
+		KeyCode::Numpad3 => "Numpad3",
+		KeyCode::Numpad4 => "Numpad4",
+		KeyCode::Numpad5 => "Numpad5",
+		KeyCode::Numpad6 => "Numpad6",
+		KeyCode::Numpad7 => "Numpad7",
+		KeyCode::Numpad8 => "Numpad8",
+		KeyCode::Numpad9 => "Numpad9",
+		KeyCode::AbntC1 => "AbntC1",
+		KeyCode::AbntC2 => "AbntC2",
+		KeyCode::NumpadAdd => "NumpadAdd",
+		KeyCode::Apostrophe => "Apostrophe",
+		KeyCode::Apps => "Apps",
+		KeyCode::Asterisk => "Asterisk",
+		KeyCode::Plus => "Plus",
+		KeyCode::At => "At",
+		KeyCode::Ax => "Ax",
+		KeyCode::Backslash => "Backslash",
+		KeyCode::Calculator => "Calculator",
+		KeyCode::Capital => "Capital",
+		KeyCode::Colon => "Colon",
+		KeyCode::Comma => "Comma",
+		KeyCode::Convert => "Convert",
+		KeyCode::NumpadDecimal => "NumpadDecimal",
+		KeyCode::NumpadDivide => "NumpadDivide",
+		KeyCode::Equals => "Equals",
+		KeyCode::Grave => "Grave",
+		KeyCode::Kana => "Kana",
+		KeyCode::Kanji => "Kanji",
+		KeyCode::LAlt => "LAlt",
+		KeyCode::LBracket => "LBracket",
+		KeyCode::LControl => "LControl",
+		KeyCode::LShift => "LShift",
+		KeyCode::LWin => "LWin",
+		KeyCode::Mail => "Mail",
+		KeyCode::MediaSelect => "MediaSelect",
+		KeyCode::MediaStop => "MediaStop",
+		KeyCode::Minus => "Minus",
+		KeyCode::NumpadMultiply => "NumpadMultiply",
+		KeyCode::Mute => "Mute",
+		KeyCode::MyComputer => "MyComputer",
+		KeyCode::NavigateForward => "NavigateForward",
+		KeyCode::NavigateBackward => "NavigateBackward",
+		KeyCode::NextTrack => "NextTrack",
+		KeyCode::NoConvert => "NoConvert",
+		KeyCode::NumpadComma => "NumpadComma",
+		KeyCode::NumpadEnter => "NumpadEnter",
+		KeyCode::NumpadEquals => "NumpadEquals",
+		KeyCode::Oem102 => "Oem102",
+		KeyCode::Period => "Period",
+		KeyCode::PlayPause => "PlayPause",
+		KeyCode::Power => "Power",
+		KeyCode::PrevTrack => "PrevTrack",
+		KeyCode::RAlt => "RAlt",
+		KeyCode::RBracket => "RBracket",
+		KeyCode::RControl => "RControl",
+		KeyCode::RShift => "RShift",
+		KeyCode::RWin => "RWin",
+		KeyCode::Semicolon => "Semicolon",
+		KeyCode::Slash => "Slash",
+		KeyCode::Sleep => "Sleep",
+		KeyCode::Stop => "Stop",
+		KeyCode::NumpadSubtract => "NumpadSubtract",
+		KeyCode::Sysrq => "Sysrq",
+		KeyCode::Tab => "Tab",
+		KeyCode::Underline => "Underline",
+		KeyCode::Unlabeled => "Unlabeled",
+		KeyCode::VolumeDown => "VolumeDown",
+		KeyCode::VolumeUp => "VolumeUp",
+		KeyCode::Wake => "Wake",
+		KeyCode::WebBack => "WebBack",
+		KeyCode::WebFavorites => "WebFavorites",
+		KeyCode::WebForward => "WebForward",
+		KeyCode::WebHome => "WebHome",
+		KeyCode::WebRefresh => "WebRefresh",
+		KeyCode::WebSearch => "WebSearch",
+		KeyCode::WebStop => "WebStop",
+		KeyCode::Yen => "Yen",
+		KeyCode::Copy => "Copy",
+		KeyCode::Paste => "Paste",
+		KeyCode::Cut => "Cut",
+	}
+}
diff --git a/game_core/src/system/mod.rs b/game_core/src/system/mod.rs
index 5913484..2f33da8 100644
--- a/game_core/src/system/mod.rs
+++ b/game_core/src/system/mod.rs
@@ -1,7 +1,10 @@
 pub mod camera;
 pub mod flow;
+mod keycode;
 pub mod load_config;
 pub mod resources;
 pub mod utilities;
+pub mod web;
 pub mod window;
-pub mod web;
\ No newline at end of file
+
+pub use keycode::keycode_string;
diff --git a/game_core/src/system/resources.rs b/game_core/src/system/resources.rs
index d194e09..dd9292e 100644
--- a/game_core/src/system/resources.rs
+++ b/game_core/src/system/resources.rs
@@ -1,31 +1,31 @@
 use bevy::app::PluginGroupBuilder;
 use bevy::log::{Level, LogPlugin};
 use bevy::prelude::*;
-use bevy::window::{PresentMode, WindowMode};
+use bevy::window::{PresentMode, WindowMode, WindowResolution};
+use bevy_embedded_assets::EmbeddedAssetPlugin;
 
 use crate::system::load_config::{get_asset_path_string, initial_size};
 
 pub struct DefaultResourcesPlugin;
 impl Plugin for DefaultResourcesPlugin {
 	fn build(&self, app: &mut App) {
-		app.insert_resource(Msaa { samples: 1 })
+		app.insert_resource(Msaa::Off)
 			.insert_resource(ClearColor(Color::hex("040720").unwrap()));
 	}
 }
 pub fn configure_default_plugins() -> PluginGroupBuilder {
 	let (width, height) = initial_size();
-	DefaultPlugins
+	let mut plugin_set = DefaultPlugins
 		.set(WindowPlugin {
-			window: WindowDescriptor {
-				width,
-				height,
+			primary_window: Some(Window {
+				resolution: WindowResolution::new(width, height),
 				resizable: true,
 				mode: WindowMode::Windowed,
-				title: String::from("Bevy 2D Template"),
+				title: String::from("Game Core"),
 				present_mode: PresentMode::AutoNoVsync,
 				fit_canvas_to_parent: true,
 				..Default::default()
-			},
+			}),
 			..Default::default()
 		})
 		.set(AssetPlugin {
@@ -35,15 +35,23 @@ pub fn configure_default_plugins() -> PluginGroupBuilder {
 		.set(ImagePlugin::default_nearest())
 		.set(LogPlugin {
 			filter: String::from(
-				"info,symphonia_core=warn,symphonia_bundle_mp3=warn,wgpu_core=warn,wgpu_hal=warn",
+				"info,game_core=debug,symphonia_core=warn,symphonia_format_ogg=warn,winit=warn,symphonia_bundle_mp3=warn,wgpu_core=warn,wgpu_hal=warn",
 			),
 			level: Level::DEBUG,
-		})
+		});
+
+	if cfg!(feature = "embed") {
+		plugin_set.add_before::<AssetPlugin, _>(EmbeddedAssetPlugin)
+	} else {
+		plugin_set
+	}
 }
 
 pub struct InitAppPlugins;
 impl PluginGroup for InitAppPlugins {
 	fn build(self) -> PluginGroupBuilder {
-		configure_default_plugins().add(DefaultResourcesPlugin).add(super::web::WebPlugin)
+		configure_default_plugins()
+			.add(DefaultResourcesPlugin)
+			.add(super::web::WebPlugin)
 	}
 }
diff --git a/game_core/src/system/utilities.rs b/game_core/src/system/utilities.rs
index 0244a87..907d28c 100644
--- a/game_core/src/system/utilities.rs
+++ b/game_core/src/system/utilities.rs
@@ -30,3 +30,25 @@ pub fn f32_min_mag(a: f32, b: f32) -> f32 {
 		b.abs()
 	}
 }
+
+#[macro_export]
+macro_rules! deref_as {
+	($name: ident => $target: ty) => {
+		impl std::ops::Deref for $name {
+			type Target = $target;
+			fn deref(&self) -> &Self::Target {
+				&self.0
+			}
+		}
+		impl std::ops::DerefMut for $name {
+			fn deref_mut(&mut self) -> &mut Self::Target {
+				&mut self.0
+			}
+		}
+		impl From<$target> for $name {
+			fn from(other: $target) -> $name {
+				$name(other)
+			}
+		}
+	};
+}
diff --git a/game_core/src/system/web.rs b/game_core/src/system/web.rs
index 44c5d48..3b1903e 100644
--- a/game_core/src/system/web.rs
+++ b/game_core/src/system/web.rs
@@ -1,6 +1,6 @@
 #[cfg(target_arch = "wasm32")]
 mod __plugin {
-	use bevy::app::{App, Plugin, CoreStage};
+	use bevy::prelude::*;
 	pub fn handle_startup_fullscreen() {
 		if micro_bevy_web_utils::bindings::is_touch_device() {
 			micro_bevy_web_utils::bindings::make_selector_fullscreen("canvas".to_string());
@@ -12,12 +12,11 @@ mod __plugin {
 	pub struct WebPlugin;
 	impl Plugin for WebPlugin {
 		fn build(&self, app: &mut App) {
-				app.add_startup_system(handle_startup_fullscreen)
-					.add_system_to_stage(
-						CoreStage::First,
-						micro_bevy_web_utils::bevy::emit_touch_events,
-					);
-			}
+			app.add_startup_system(handle_startup_fullscreen)
+				.add_system(
+					micro_bevy_web_utils::bevy::emit_touch_events.in_base_set(CoreSet::First),
+				);
+		}
 	}
 }
 
@@ -30,4 +29,4 @@ mod __plugin {
 	}
 }
 
-pub use __plugin::WebPlugin;
\ No newline at end of file
+pub use __plugin::WebPlugin;
diff --git a/game_core/src/system/window.rs b/game_core/src/system/window.rs
index aa9cda5..aa2fdb7 100644
--- a/game_core/src/system/window.rs
+++ b/game_core/src/system/window.rs
@@ -1,47 +1,103 @@
 use bevy::ecs::system::SystemParam;
+use bevy::math::Vec4Swizzles;
 use bevy::prelude::*;
+use bevy::window::PrimaryWindow;
 
+// use advent_ui::prelude::Units;
+// use num_traits::AsPrimitive;
 use crate::system::camera::GameCamera;
 
+#[derive(PartialEq, Default, Debug, Copy, Clone, Resource)]
+pub struct WindowUnits {
+	pub inner_width: f32,
+	pub inner_height: f32,
+	pub vw: f32,
+	pub vh: f32,
+}
+
+// TODO: Enable if using advent_ui
+// impl WindowUnits {
+// 	pub fn vw_units<T: AsPrimitive<f32>>(&self, units: T) -> Units {
+// 		Units::Pixels(self.vw * units.as_())
+// 	}
+// 	pub fn vh_units<T: AsPrimitive<f32>>(&self, units: T) -> Units {
+// 		Units::Pixels(self.vh * units.as_())
+// 	}
+// }
+
+pub fn update_window_units(window: WindowManager, mut units: ResMut<WindowUnits>) {
+	let next_units = window.get_units();
+	if next_units != *units {
+		*units = next_units;
+	}
+}
+
+pub struct WindowSyncPlugin;
+impl Plugin for WindowSyncPlugin {
+	fn build(&self, app: &mut App) {
+		app.init_resource::<WindowUnits>()
+			.add_system(update_window_units.in_base_set(CoreSet::First));
+	}
+}
+
 /// A struct that provides several convenience methods for getting mouse and
 /// window related information
 #[derive(SystemParam)]
 pub struct WindowManager<'w, 's> {
 	mouse: Res<'w, Input<MouseButton>>,
-	windows: Res<'w, Windows>,
-	cam_query: ParamSet<'w, 's, (Query<'w, 's, &'static Transform, With<GameCamera>>,)>,
+	windows: Query<'w, 's, &'static Window, With<PrimaryWindow>>,
+	camera: Query<'w, 's, (&'static OrthographicProjection, &'static Transform), With<GameCamera>>,
 }
 
 impl<'w, 's> WindowManager<'w, 's> {
-	/// Conditionally run a function with the primary window. The function will not
-	/// run if the primary window does not exist - typically this is the desired behaviour.
-	///
-	/// ## Arguments
-	/// - `func`: an `FnOnce` callback that is given a [`bevy::prelude::Window`]
-	pub fn with_primary_window<Func: FnOnce(&Window)>(&self, func: Func) {
-		match self.windows.get_primary() {
-			Some(window) => func(window),
-			None => {}
-		}
-	}
 	pub fn get_primary_window(&self) -> Option<&Window> {
-		self.windows.get_primary()
+		self.windows.get_single().ok()
 	}
 	pub fn get_mouse_press(&mut self) -> Option<Vec2> {
 		if self.mouse.just_pressed(MouseButton::Left) {
-			if let Some(window) = self.windows.get_primary() {
+			if let Some(window) = self.get_primary_window() {
 				if let Some(position) = window.cursor_position() {
-					let window_size = Vec2::new(window.width() as f32, window.height() as f32);
-					let adjusted_position = position - window_size / 2.0;
-					if let Ok(camera_transform) = self.cam_query.p0().get_single() {
+					if let Ok((projection, camera_transform)) = self.camera.get_single() {
+						let window_size = Vec2::new(window.width() as f32, window.height() as f32);
+						let projection_size = Vec2::new(
+							projection.area.max.x - projection.area.min.x,
+							projection.area.max.y - projection.area.min.y,
+						);
+
+						let adjusted_position = position - window_size / 2.0;
+						let scale = window_size / projection_size;
+						let adjusted_position = adjusted_position / scale;
 						let world_position = camera_transform.compute_matrix()
 							* adjusted_position.extend(0.0).extend(1.0);
 
-						return Some(Vec2::new(world_position.x, world_position.y));
+						return Some(world_position.xy());
 					}
 				}
 			}
 		}
 		None
 	}
+	pub fn get_units(&self) -> WindowUnits {
+		let window = self.get_primary_window();
+		if let Some(window) = window {
+			let inner_width = window.width();
+			let real_width = window.physical_width();
+
+			let inner_height = window.height();
+
+			WindowUnits {
+				inner_width,
+				inner_height,
+				vh: inner_height / 100.0,
+				vw: inner_width / 100.0,
+			}
+		} else {
+			WindowUnits {
+				inner_height: 0.0,
+				inner_width: 0.0,
+				vw: 0.0,
+				vh: 0.0,
+			}
+		}
+	}
 }
-- 
GitLab