diff --git a/Cargo.lock b/Cargo.lock
index 18bfdf49def565bf453437bbf79ecb88643b9b34..80a85729cb313bcf8390acb3ebcdc4142551cf60 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1,6 +1,6 @@
 # This file is automatically @generated by Cargo.
 # It is not intended for manual editing.
-version = 3
+version = 4
 
 [[package]]
 name = "accesskit"
@@ -104,7 +104,7 @@ dependencies = [
  "ndk-context",
  "ndk-sys 0.6.0+11769913",
  "num_enum",
- "thiserror",
+ "thiserror 1.0.69",
 ]
 
 [[package]]
@@ -247,18 +247,18 @@ checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
 
 [[package]]
 name = "bevy"
-version = "0.14.0"
+version = "0.14.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e938630e9f472b1899c78ef84aa907081b23bad8333140e2295c620485b6ee7"
+checksum = "043c9ad4b6fc4ca52d779873a8ca792a4e37842d07fce95363c9e17e36a1d8a0"
 dependencies = [
  "bevy_internal",
 ]
 
 [[package]]
 name = "bevy_a11y"
-version = "0.14.0"
+version = "0.14.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3e613f0e7d5a92637e59744f7185e374c9a59654ecc6d7575adcec9581db1363"
+checksum = "ae1a976cb539d6a5a3ff579cdb78187a6bcfbffa7e8224ea28f23d8b983d9389"
 dependencies = [
  "accesskit",
  "bevy_app",
@@ -268,9 +268,9 @@ dependencies = [
 
 [[package]]
 name = "bevy_app"
-version = "0.14.0"
+version = "0.14.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6f548e9dab7d10c5f99e3b504c758c4bf87aa67df9bcb9cc8b317a0271770e72"
+checksum = "a5361d0f8a8677a5d0102cfe7321a7ecd2a8b9a4f887ce0dde1059311cf9cd42"
 dependencies = [
  "bevy_derive",
  "bevy_ecs",
@@ -279,16 +279,16 @@ dependencies = [
  "bevy_utils",
  "console_error_panic_hook",
  "downcast-rs",
- "thiserror",
+ "thiserror 1.0.69",
  "wasm-bindgen",
  "web-sys",
 ]
 
 [[package]]
 name = "bevy_asset"
-version = "0.14.0"
+version = "0.14.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f9d198e4c3419215de2ad981d4e734bbfab46469b7575e3b7150c912b9ec5175"
+checksum = "60ec5ea257e1ebd3d411f669e29acf60beb715bebc7e1f374c17f49cd3aad46c"
 dependencies = [
  "async-broadcast",
  "async-fs",
@@ -309,7 +309,7 @@ dependencies = [
  "parking_lot",
  "ron",
  "serde",
- "thiserror",
+ "thiserror 1.0.69",
  "uuid",
  "wasm-bindgen",
  "wasm-bindgen-futures",
@@ -318,36 +318,36 @@ dependencies = [
 
 [[package]]
 name = "bevy_asset_macros"
-version = "0.14.0"
+version = "0.14.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "11b2cbeba287a4b44e116c33dbaf37dce80a9d84477b2bb35ff459999d6c9e1b"
+checksum = "c9eb05ce838d282f09d83380b4d6432aec7519d421dee8c75cc20e6148237e6e"
 dependencies = [
  "bevy_macro_utils",
- "proc-macro2 1.0.86",
+ "proc-macro2 1.0.92",
  "quote 1.0.36",
- "syn 2.0.70",
+ "syn 2.0.90",
 ]
 
 [[package]]
 name = "bevy_color"
-version = "0.14.1"
+version = "0.14.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a933306f5c7dc9568209180f482b28b5f40d2f8d5b361bc1b270c0a588752c0"
+checksum = "04842e9d38a93f0c75ab46f7f404ea24ef57ad83dbd159e5b4b35318b02257bb"
 dependencies = [
  "bevy_math",
  "bevy_reflect",
  "bytemuck",
  "encase",
  "serde",
- "thiserror",
+ "thiserror 1.0.69",
  "wgpu-types",
 ]
 
 [[package]]
 name = "bevy_core"
-version = "0.14.0"
+version = "0.14.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ddeed5ebf2fa75a4d4f32e2da9c60f11037e36252695059a151c6685cd3d72b"
+checksum = "de706862871a1fe99ea619bff2f99d73e43ad82f19ef866a9e19a14c957c8537"
 dependencies = [
  "bevy_app",
  "bevy_ecs",
@@ -360,9 +360,9 @@ dependencies = [
 
 [[package]]
 name = "bevy_core_pipeline"
-version = "0.14.0"
+version = "0.14.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1b978220b5edc98f2c5cbbd14c118c74b3ec7216e5416d3c187c1097279b009b"
+checksum = "2f6e1e122ada4cd811442e083fb5ad3e325c59a87271d5ef57193f1c2cad7f8c"
 dependencies = [
  "bevy_app",
  "bevy_asset",
@@ -380,25 +380,25 @@ dependencies = [
  "radsort",
  "serde",
  "smallvec",
- "thiserror",
+ "thiserror 1.0.69",
 ]
 
 [[package]]
 name = "bevy_derive"
-version = "0.14.0"
+version = "0.14.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c8a8173bad3ed53fa158806b1beda147263337d6ef71a093780dd141b74386b1"
+checksum = "3fbfc33a4c6b80760bb8bf850a2cc65a1e031da62fd3ca8b552189104dc98514"
 dependencies = [
  "bevy_macro_utils",
  "quote 1.0.36",
- "syn 2.0.70",
+ "syn 2.0.90",
 ]
 
 [[package]]
 name = "bevy_diagnostic"
-version = "0.14.0"
+version = "0.14.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b7f82011fd70048be282526a99756d54bf00e874edafa9664ba0dc247678f03"
+checksum = "bebb154e0cc78e3bbfbfdb42fb502b14c1cd47e72f16e6d4228dfe6233ba6cbd"
 dependencies = [
  "bevy_app",
  "bevy_core",
@@ -411,9 +411,9 @@ dependencies = [
 
 [[package]]
 name = "bevy_ecs"
-version = "0.14.0"
+version = "0.14.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2c77fdc3a7230eff2fcebe4bd17c155bd238c660a0089d0f98c39ba0d461b923"
+checksum = "9ee4222406637f3c8e3991a99788cfcde76097bf997c311f1b6297364057483f"
 dependencies = [
  "bevy_ecs_macros",
  "bevy_ptr",
@@ -426,26 +426,26 @@ dependencies = [
  "nonmax",
  "petgraph",
  "serde",
- "thiserror",
+ "thiserror 1.0.69",
 ]
 
 [[package]]
 name = "bevy_ecs_macros"
-version = "0.14.0"
+version = "0.14.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9272b511958525306cd141726d3ca59740f79fc0707c439b55a007bcc3497308"
+checksum = "36b573430b67aff7bde8292257494f39343401379bfbda64035ba4918bba7b20"
 dependencies = [
  "bevy_macro_utils",
- "proc-macro2 1.0.86",
+ "proc-macro2 1.0.92",
  "quote 1.0.36",
- "syn 2.0.70",
+ "syn 2.0.90",
 ]
 
 [[package]]
 name = "bevy_encase_derive"
-version = "0.14.0"
+version = "0.14.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f0452d8254c8bfae4bff6caca2a8be3b0c1b2e1a72b93e9b9f6a21c8dff807e0"
+checksum = "d06c9693847a2a6ea61d6b86288dd4d8b6a79f05d4bf6e27b96d4f5c8d552fe4"
 dependencies = [
  "bevy_macro_utils",
  "encase_derive_impl",
@@ -453,9 +453,9 @@ dependencies = [
 
 [[package]]
 name = "bevy_gizmos"
-version = "0.14.0"
+version = "0.14.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bdbb0556f0c6e45f4a17aef9c708c06ebf15ae1bed4533d7eddb493409f9f025"
+checksum = "dfe32af0666d8d8a7fd6eb6b5e41eceefdc6f2e5441c74b812e8f0902a9d7f52"
 dependencies = [
  "bevy_app",
  "bevy_asset",
@@ -475,21 +475,21 @@ dependencies = [
 
 [[package]]
 name = "bevy_gizmos_macros"
-version = "0.14.0"
+version = "0.14.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ef351a4b6498c197d1317c62f46ba84b69fbde3dbeb57beb2e744bbe5b7c3e0"
+checksum = "906b052f8cf3f3983f0f6df625fb10cbd9b27d44e362a327dc1ed51300d362bc"
 dependencies = [
  "bevy_macro_utils",
- "proc-macro2 1.0.86",
+ "proc-macro2 1.0.92",
  "quote 1.0.36",
- "syn 2.0.70",
+ "syn 2.0.90",
 ]
 
 [[package]]
 name = "bevy_hierarchy"
-version = "0.14.0"
+version = "0.14.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "802eca6f341d19ade790ccfaba7044be4d823b708087eb5ac4c1f74e4ea0916a"
+checksum = "a88b912b37e1bc4dbb2aa40723199f74c8b06c4fbb6da0bb4585131df28ef66e"
 dependencies = [
  "bevy_app",
  "bevy_core",
@@ -501,9 +501,9 @@ dependencies = [
 
 [[package]]
 name = "bevy_input"
-version = "0.14.0"
+version = "0.14.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2d050f1433f48ca23f1ea078734ebff119a3f76eb7d221725ab0f1fd9f81230b"
+checksum = "8dd3a54e67cc3ba17971de7b1a7e64eda84493c1e7bb6bfa11c6cf8ac124377b"
 dependencies = [
  "bevy_app",
  "bevy_ecs",
@@ -512,14 +512,14 @@ dependencies = [
  "bevy_utils",
  "serde",
  "smol_str",
- "thiserror",
+ "thiserror 1.0.69",
 ]
 
 [[package]]
 name = "bevy_internal"
-version = "0.14.0"
+version = "0.14.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ddd2b23e44d3a1f8ae547cbee5b6661f8135cc456c5de206e8648789944e7a1"
+checksum = "45d435cac77c568f3aef65f786a5fee0e53c81950c5258182dd2c1d6cd6c4fec"
 dependencies = [
  "bevy_a11y",
  "bevy_app",
@@ -551,9 +551,9 @@ dependencies = [
 
 [[package]]
 name = "bevy_log"
-version = "0.14.0"
+version = "0.14.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bab641fd0de254915ab746165a07677465b2d89b72f5b49367d73b9197548a35"
+checksum = "67240c7596c8f0653e50fce35a60196516817449235193246599facba9002e02"
 dependencies = [
  "android_log-sys",
  "bevy_app",
@@ -566,50 +566,50 @@ dependencies = [
 
 [[package]]
 name = "bevy_macro_utils"
-version = "0.14.0"
+version = "0.14.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3ad860d35d74b35d4d6ae7f656d163b6f475aa2e64fc293ee86ac901977ddb7"
+checksum = "bfc65e570012e64a21f3546df68591aaede8349e6174fb500071677f54f06630"
 dependencies = [
- "proc-macro2 1.0.86",
+ "proc-macro2 1.0.92",
  "quote 1.0.36",
- "syn 2.0.70",
+ "syn 2.0.90",
  "toml_edit 0.22.15",
 ]
 
 [[package]]
 name = "bevy_math"
-version = "0.14.0"
+version = "0.14.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "51bd6ce2174d3237d30e0ab5b2508480cc7593ca4d96ffb3a3095f9fc6bbc34c"
+checksum = "5421792749dda753ab3718e77d27bfce38443daf1850b836b97530b6245a4581"
 dependencies = [
  "bevy_reflect",
  "glam",
  "rand",
  "serde",
  "smallvec",
- "thiserror",
+ "thiserror 1.0.69",
 ]
 
 [[package]]
 name = "bevy_mikktspace"
-version = "0.14.0"
+version = "0.14.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b7ce4266293629a2d10459cc112dffe3b3e9229a4f2b8a4d20061b8dd53316d0"
+checksum = "66cf695a264b043f2c4edb92dd5c742e6892180d2b30dac870012d153f8557ea"
 dependencies = [
  "glam",
 ]
 
 [[package]]
 name = "bevy_ptr"
-version = "0.14.0"
+version = "0.14.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c115c97a5c8a263bd0aa7001b999772c744ac5ba797d07c86f25734ce381ea69"
+checksum = "61baa1bdc1f4a7ac2c18217570a7cc04e1cd54d38456e91782f0371c79afe0a8"
 
 [[package]]
 name = "bevy_reflect"
-version = "0.14.0"
+version = "0.14.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "406ea0fce267169c2320c7302d97d09f605105686346762562c5f65960b5ca2f"
+checksum = "2508785a4a5809f25a237eec4fee2c91a4dbcf81324b2bbc2d6c52629e603781"
 dependencies = [
  "bevy_ptr",
  "bevy_reflect_derive",
@@ -620,28 +620,28 @@ dependencies = [
  "serde",
  "smallvec",
  "smol_str",
- "thiserror",
+ "thiserror 1.0.69",
  "uuid",
 ]
 
 [[package]]
 name = "bevy_reflect_derive"
-version = "0.14.0"
+version = "0.14.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0427fdb4425fc72cc96d45e550df83ace6347f0503840de116c76a40843ba751"
+checksum = "967d5da1882ec3bb3675353915d3da909cafac033cbf31e58727824a1ad2a288"
 dependencies = [
  "bevy_macro_utils",
- "proc-macro2 1.0.86",
+ "proc-macro2 1.0.92",
  "quote 1.0.36",
- "syn 2.0.70",
+ "syn 2.0.90",
  "uuid",
 ]
 
 [[package]]
 name = "bevy_render"
-version = "0.14.0"
+version = "0.14.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c48acf1ff4267c231def4cbf573248d42ac60c9952108822d505019460bf36d"
+checksum = "836cf8a513db013cbe7d55a331060088efd407e49fd5b05c8404700cd82e7619"
 dependencies = [
  "async-channel",
  "bevy_app",
@@ -677,7 +677,7 @@ dependencies = [
  "send_wrapper",
  "serde",
  "smallvec",
- "thiserror",
+ "thiserror 1.0.69",
  "wasm-bindgen",
  "web-sys",
  "wgpu",
@@ -685,21 +685,21 @@ dependencies = [
 
 [[package]]
 name = "bevy_render_macros"
-version = "0.14.0"
+version = "0.14.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "72ddf4a96d71519c8eca3d74dabcb89a9c0d50ab5d9230638cb004145f46e9ed"
+checksum = "cbc24e0e95061a38a7744218b9c7e52e4c08b53f1499f33480e2b749f3864432"
 dependencies = [
  "bevy_macro_utils",
- "proc-macro2 1.0.86",
+ "proc-macro2 1.0.92",
  "quote 1.0.36",
- "syn 2.0.70",
+ "syn 2.0.90",
 ]
 
 [[package]]
 name = "bevy_scene"
-version = "0.14.0"
+version = "0.14.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b7a9f0388612a116f02ab6187aeab66e52c9e91abbc21f919b8b50230c4d83e7"
+checksum = "8ec57a72d75273bdbb6154390688fd07ba79ae9f6f99476d1937f799c736c2da"
 dependencies = [
  "bevy_app",
  "bevy_asset",
@@ -711,15 +711,15 @@ dependencies = [
  "bevy_transform",
  "bevy_utils",
  "serde",
- "thiserror",
+ "thiserror 1.0.69",
  "uuid",
 ]
 
 [[package]]
 name = "bevy_sprite"
-version = "0.14.0"
+version = "0.14.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d837e33ed27b9f2e5212eca4bdd5655a9ee64c52914112e6189c043cb25dd1ec"
+checksum = "e045b4d8cc8e7422a4c29b1eadbe224f5cc42f170b88d43e7535892fcede3840"
 dependencies = [
  "bevy_app",
  "bevy_asset",
@@ -738,14 +738,14 @@ dependencies = [
  "guillotiere",
  "radsort",
  "rectangle-pack",
- "thiserror",
+ "thiserror 1.0.69",
 ]
 
 [[package]]
 name = "bevy_tasks"
-version = "0.14.0"
+version = "0.14.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a8bfb8d484bdb1e9bec3789c75202adc5e608c4244347152e50fb31668a54f9"
+checksum = "77865f310b1fc48fb05b7c4adbe76607ec01d0c14f8ab4caba4d714c86439946"
 dependencies = [
  "async-executor",
  "futures-lite",
@@ -754,9 +754,9 @@ dependencies = [
 
 [[package]]
 name = "bevy_time"
-version = "0.14.0"
+version = "0.14.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a6c3d3d14ee8b0dbe4819fd516cc75509b61946134d78e0ee89ad3d1835ffe6c"
+checksum = "f4e4d53ec32a1b16492396951d04de0d2d90e924bf9adcb8d1adacab5ab6c17c"
 dependencies = [
  "bevy_app",
  "bevy_ecs",
@@ -764,14 +764,14 @@ dependencies = [
  "bevy_utils",
  "crossbeam-channel",
  "serde",
- "thiserror",
+ "thiserror 1.0.69",
 ]
 
 [[package]]
 name = "bevy_transform"
-version = "0.14.0"
+version = "0.14.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "97e8aa6b16be573277c6ceda30aebf1d78af7c6ede19b448dcb052fb8601d815"
+checksum = "d5493dce84427d00a9266e8e4386d738a72ee8640423b62dfcecb6dfccbfe0d2"
 dependencies = [
  "bevy_app",
  "bevy_ecs",
@@ -779,14 +779,14 @@ dependencies = [
  "bevy_math",
  "bevy_reflect",
  "serde",
- "thiserror",
+ "thiserror 1.0.69",
 ]
 
 [[package]]
 name = "bevy_ui"
-version = "0.14.0"
+version = "0.14.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38d9f864c646f3742ff77f67bcd89a13a7ab024b68ca2f1bfbab8245bcb1c06c"
+checksum = "56d2cba6603b39a3765f043212ae530e25550af168a7eec6b23b9b93c19bc5f7"
 dependencies = [
  "bevy_a11y",
  "bevy_app",
@@ -809,14 +809,14 @@ dependencies = [
  "serde",
  "smallvec",
  "taffy",
- "thiserror",
+ "thiserror 1.0.69",
 ]
 
 [[package]]
 name = "bevy_utils"
-version = "0.14.0"
+version = "0.14.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7fab364910e8f5839578aba9cfda00a8388e9ebe352ceb8491a742ce6af9ec6e"
+checksum = "ffb0ec333b5965771153bd746f92ffd8aeeb9d008a8620ffd9ed474859381a5e"
 dependencies = [
  "ahash",
  "bevy_utils_proc_macros",
@@ -829,20 +829,20 @@ dependencies = [
 
 [[package]]
 name = "bevy_utils_proc_macros"
-version = "0.14.0"
+version = "0.14.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ad9db261ab33a046e1f54b35f885a44f21fcc80aa2bc9050319466b88fe58fe3"
+checksum = "38f1ab8f2f6f58439d260081d89a42b02690e5fdd64f814edc9417d33fcf2857"
 dependencies = [
- "proc-macro2 1.0.86",
+ "proc-macro2 1.0.92",
  "quote 1.0.36",
- "syn 2.0.70",
+ "syn 2.0.90",
 ]
 
 [[package]]
 name = "bevy_window"
-version = "0.14.0"
+version = "0.14.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c9ea5777f933bf7ecaeb3af1a30845720ec730e007972ca7d4aba2d3512abe24"
+checksum = "c89e88a20db64ea8204540afb4699295947c454738fd50293f7b32ab8be857a6"
 dependencies = [
  "bevy_a11y",
  "bevy_app",
@@ -857,9 +857,9 @@ dependencies = [
 
 [[package]]
 name = "bevy_winit"
-version = "0.14.0"
+version = "0.14.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f8c2213bbf14debe819ec8ad4913f233c596002d087bc6f1f20d533e2ebaf8c6"
+checksum = "d0bef8ec3e4b45db943ad4d1c0bf59b09e382ce0651a706e2f33a70fa955303c"
 dependencies = [
  "accesskit_winit",
  "approx",
@@ -963,9 +963,9 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
 
 [[package]]
 name = "bytemuck"
-version = "1.16.1"
+version = "1.20.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b236fc92302c97ed75b38da1f4917b5cdda4984745740f153a5d3059e48d725e"
+checksum = "8b37c88a63ffd85d15b406896cc343916d7cf57838a847b3a6f2ca5d39a5695a"
 dependencies = [
  "bytemuck_derive",
 ]
@@ -976,16 +976,16 @@ version = "1.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "1ee891b04274a59bd38b412188e24b849617b2e45a0fd8d057deb63e7403761b"
 dependencies = [
- "proc-macro2 1.0.86",
+ "proc-macro2 1.0.92",
  "quote 1.0.36",
- "syn 2.0.70",
+ "syn 2.0.90",
 ]
 
 [[package]]
-name = "byteorder"
-version = "1.5.0"
+name = "byteorder-lite"
+version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
+checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495"
 
 [[package]]
 name = "bytes"
@@ -1004,7 +1004,7 @@ dependencies = [
  "polling",
  "rustix",
  "slab",
- "thiserror",
+ "thiserror 1.0.69",
 ]
 
 [[package]]
@@ -1068,7 +1068,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "d375883580a668c7481ea6631fc1a8863e33cc335bf56bfad8d7e6d4b04b13a5"
 dependencies = [
  "com_macros_support",
- "proc-macro2 1.0.86",
+ "proc-macro2 1.0.92",
  "syn 1.0.109",
 ]
 
@@ -1078,7 +1078,7 @@ version = "0.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ad899a1087a9296d5644792d7cb72b8e34c1bec8e7d4fbc002230169a6e8710c"
 dependencies = [
- "proc-macro2 1.0.86",
+ "proc-macro2 1.0.92",
  "quote 1.0.36",
  "syn 1.0.109",
 ]
@@ -1300,9 +1300,9 @@ dependencies = [
 
 [[package]]
 name = "document-features"
-version = "0.2.8"
+version = "0.2.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ef5282ad69563b5fc40319526ba27e0e7363d552a896f0297d54f767717f9b95"
+checksum = "cb6969eaabd2421f8a2775cfd2471a2b634372b4a25d41e3bd647b79912850a0"
 dependencies = [
  "litrs",
 ]
@@ -1328,7 +1328,7 @@ dependencies = [
  "const_panic",
  "encase_derive",
  "glam",
- "thiserror",
+ "thiserror 1.0.69",
 ]
 
 [[package]]
@@ -1346,9 +1346,9 @@ version = "0.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "fd31dbbd9743684d339f907a87fe212cb7b51d75b9e8e74181fe363199ee9b47"
 dependencies = [
- "proc-macro2 1.0.86",
+ "proc-macro2 1.0.92",
  "quote 1.0.36",
- "syn 2.0.70",
+ "syn 2.0.90",
 ]
 
 [[package]]
@@ -1462,9 +1462,9 @@ version = "0.2.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742"
 dependencies = [
- "proc-macro2 1.0.86",
+ "proc-macro2 1.0.92",
  "quote 1.0.36",
- "syn 2.0.70",
+ "syn 2.0.90",
 ]
 
 [[package]]
@@ -1581,7 +1581,7 @@ checksum = "6f56f6318968d03c18e1bcf4857ff88c61157e9da8e47c5f29055d60e1228884"
 dependencies = [
  "log",
  "presser",
- "thiserror",
+ "thiserror 1.0.69",
  "winapi",
  "windows 0.52.0",
 ]
@@ -1643,7 +1643,7 @@ dependencies = [
  "com",
  "libc",
  "libloading 0.8.4",
- "thiserror",
+ "thiserror 1.0.69",
  "widestring",
  "winapi",
 ]
@@ -1678,20 +1678,20 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
 
 [[package]]
 name = "image"
-version = "0.25.1"
+version = "0.25.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fd54d660e773627692c524beaad361aca785a4f9f5730ce91f42aabe5bce3d11"
+checksum = "cd6f44aed642f18953a158afeb30206f4d50da59fbc66ecb53c66488de73563b"
 dependencies = [
  "bytemuck",
- "byteorder",
+ "byteorder-lite",
  "num-traits",
 ]
 
 [[package]]
 name = "immutable-chunkmap"
-version = "2.0.5"
+version = "2.0.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4419f022e55cc63d5bbd6b44b71e1d226b9c9480a47824c706e9d54e5c40c5eb"
+checksum = "12f97096f508d54f8f8ab8957862eee2ccd628847b6217af1a335e1c44dee578"
 dependencies = [
  "arrayvec",
 ]
@@ -1732,7 +1732,7 @@ dependencies = [
  "combine",
  "jni-sys",
  "log",
- "thiserror",
+ "thiserror 1.0.69",
  "walkdir",
  "windows-sys 0.45.0",
 ]
@@ -1754,10 +1754,11 @@ dependencies = [
 
 [[package]]
 name = "js-sys"
-version = "0.3.69"
+version = "0.3.74"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d"
+checksum = "a865e038f7f6ed956f788f0d7d60c541fff74c7bd74272c5d4cf15c63743e705"
 dependencies = [
+ "once_cell",
  "wasm-bindgen",
 ]
 
@@ -1890,16 +1891,16 @@ dependencies = [
 
 [[package]]
 name = "micro_autotile"
-version = "0.1.0"
+version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "78eda07db196df5c028f17242e7f5e9fd26efadf83d1e10d4927b56754155996"
+checksum = "1f42e6e5c0d0782633603655ed705160f1c7a298424175b69da56772ada0af20"
 dependencies = [
  "fastrand 1.9.0",
 ]
 
 [[package]]
 name = "micro_ldtk"
-version = "0.11.0"
+version = "0.12.0"
 dependencies = [
  "anyhow",
  "bevy",
@@ -1909,7 +1910,7 @@ dependencies = [
  "quadtree_rs",
  "serde",
  "serde_json",
- "thiserror",
+ "thiserror 2.0.3",
 ]
 
 [[package]]
@@ -1930,8 +1931,8 @@ dependencies = [
  "rustc-hash",
  "spirv",
  "termcolor",
- "thiserror",
- "unicode-xid 0.2.4",
+ "thiserror 1.0.69",
+ "unicode-xid 0.2.6",
 ]
 
 [[package]]
@@ -1949,7 +1950,7 @@ dependencies = [
  "regex",
  "regex-syntax 0.8.4",
  "rustc-hash",
- "thiserror",
+ "thiserror 1.0.69",
  "tracing",
  "unicode-ident",
 ]
@@ -1966,7 +1967,7 @@ dependencies = [
  "ndk-sys 0.6.0+11769913",
  "num_enum",
  "raw-window-handle",
- "thiserror",
+ "thiserror 1.0.69",
 ]
 
 [[package]]
@@ -2101,9 +2102,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b"
 dependencies = [
  "proc-macro-crate",
- "proc-macro2 1.0.86",
+ "proc-macro2 1.0.92",
  "quote 1.0.36",
- "syn 2.0.70",
+ "syn 2.0.90",
 ]
 
 [[package]]
@@ -2320,9 +2321,9 @@ dependencies = [
 
 [[package]]
 name = "once_cell"
-version = "1.19.0"
+version = "1.20.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
+checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775"
 
 [[package]]
 name = "orbclient"
@@ -2399,9 +2400,9 @@ version = "1.1.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965"
 dependencies = [
- "proc-macro2 1.0.86",
+ "proc-macro2 1.0.92",
  "quote 1.0.36",
- "syn 2.0.70",
+ "syn 2.0.90",
 ]
 
 [[package]]
@@ -2448,7 +2449,7 @@ version = "0.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "bb458bb7f6e250e6eb79d5026badc10a3ebb8f9a15d1fff0f13d17c71f4d6dee"
 dependencies = [
- "unicode-xid 0.2.4",
+ "unicode-xid 0.2.6",
 ]
 
 [[package]]
@@ -2477,9 +2478,9 @@ dependencies = [
 
 [[package]]
 name = "proc-macro2"
-version = "1.0.86"
+version = "1.0.92"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77"
+checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0"
 dependencies = [
  "unicode-ident",
 ]
@@ -2515,7 +2516,7 @@ version = "1.0.36"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7"
 dependencies = [
- "proc-macro2 1.0.86",
+ "proc-macro2 1.0.92",
 ]
 
 [[package]]
@@ -2698,9 +2699,9 @@ version = "1.0.204"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222"
 dependencies = [
- "proc-macro2 1.0.86",
+ "proc-macro2 1.0.92",
  "quote 1.0.36",
- "syn 2.0.70",
+ "syn 2.0.90",
 ]
 
 [[package]]
@@ -2803,18 +2804,18 @@ version = "1.0.109"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
 dependencies = [
- "proc-macro2 1.0.86",
+ "proc-macro2 1.0.92",
  "quote 1.0.36",
  "unicode-ident",
 ]
 
 [[package]]
 name = "syn"
-version = "2.0.70"
+version = "2.0.90"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2f0209b68b3613b093e0ec905354eccaedcfe83b8cb37cbdeae64026c3064c16"
+checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31"
 dependencies = [
- "proc-macro2 1.0.86",
+ "proc-macro2 1.0.92",
  "quote 1.0.36",
  "unicode-ident",
 ]
@@ -2843,22 +2844,42 @@ dependencies = [
 
 [[package]]
 name = "thiserror"
-version = "1.0.61"
+version = "1.0.69"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
+dependencies = [
+ "thiserror-impl 1.0.69",
+]
+
+[[package]]
+name = "thiserror"
+version = "2.0.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709"
+checksum = "c006c85c7651b3cf2ada4584faa36773bd07bac24acfb39f3c431b36d7e667aa"
 dependencies = [
- "thiserror-impl",
+ "thiserror-impl 2.0.3",
 ]
 
 [[package]]
 name = "thiserror-impl"
-version = "1.0.61"
+version = "1.0.69"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533"
+checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
 dependencies = [
- "proc-macro2 1.0.86",
+ "proc-macro2 1.0.92",
  "quote 1.0.36",
- "syn 2.0.70",
+ "syn 2.0.90",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "2.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f077553d607adc1caf65430528a576c757a71ed73944b66ebb58ef2bbd243568"
+dependencies = [
+ "proc-macro2 1.0.92",
+ "quote 1.0.36",
+ "syn 2.0.90",
 ]
 
 [[package]]
@@ -2916,9 +2937,9 @@ version = "0.1.27"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
 dependencies = [
- "proc-macro2 1.0.86",
+ "proc-macro2 1.0.92",
  "quote 1.0.36",
- "syn 2.0.70",
+ "syn 2.0.90",
 ]
 
 [[package]]
@@ -3003,9 +3024,9 @@ checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
 
 [[package]]
 name = "unicode-xid"
-version = "0.2.4"
+version = "0.2.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c"
+checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
 
 [[package]]
 name = "uuid"
@@ -3047,46 +3068,48 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
 
 [[package]]
 name = "wasm-bindgen"
-version = "0.2.92"
+version = "0.2.97"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8"
+checksum = "d15e63b4482863c109d70a7b8706c1e364eb6ea449b201a76c5b89cedcec2d5c"
 dependencies = [
  "cfg-if",
+ "once_cell",
  "wasm-bindgen-macro",
 ]
 
 [[package]]
 name = "wasm-bindgen-backend"
-version = "0.2.92"
+version = "0.2.97"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da"
+checksum = "8d36ef12e3aaca16ddd3f67922bc63e48e953f126de60bd33ccc0101ef9998cd"
 dependencies = [
  "bumpalo",
  "log",
  "once_cell",
- "proc-macro2 1.0.86",
+ "proc-macro2 1.0.92",
  "quote 1.0.36",
- "syn 2.0.70",
+ "syn 2.0.90",
  "wasm-bindgen-shared",
 ]
 
 [[package]]
 name = "wasm-bindgen-futures"
-version = "0.4.42"
+version = "0.4.47"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0"
+checksum = "9dfaf8f50e5f293737ee323940c7d8b08a66a95a419223d9f41610ca08b0833d"
 dependencies = [
  "cfg-if",
  "js-sys",
+ "once_cell",
  "wasm-bindgen",
  "web-sys",
 ]
 
 [[package]]
 name = "wasm-bindgen-macro"
-version = "0.2.92"
+version = "0.2.97"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726"
+checksum = "705440e08b42d3e4b36de7d66c944be628d579796b8090bfa3471478a2260051"
 dependencies = [
  "quote 1.0.36",
  "wasm-bindgen-macro-support",
@@ -3094,28 +3117,28 @@ dependencies = [
 
 [[package]]
 name = "wasm-bindgen-macro-support"
-version = "0.2.92"
+version = "0.2.97"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7"
+checksum = "98c9ae5a76e46f4deecd0f0255cc223cfa18dc9b261213b8aa0c7b36f61b3f1d"
 dependencies = [
- "proc-macro2 1.0.86",
+ "proc-macro2 1.0.92",
  "quote 1.0.36",
- "syn 2.0.70",
+ "syn 2.0.90",
  "wasm-bindgen-backend",
  "wasm-bindgen-shared",
 ]
 
 [[package]]
 name = "wasm-bindgen-shared"
-version = "0.2.92"
+version = "0.2.97"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96"
+checksum = "6ee99da9c5ba11bd675621338ef6fa52296b76b83305e9b6e5c77d4c286d6d49"
 
 [[package]]
 name = "web-sys"
-version = "0.3.69"
+version = "0.3.74"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef"
+checksum = "a98bc3c33f0fe7e59ad7cd041b89034fa82a7c2d4365ca538dda6cdaf513863c"
 dependencies = [
  "js-sys",
  "wasm-bindgen",
@@ -3178,7 +3201,7 @@ dependencies = [
  "raw-window-handle",
  "rustc-hash",
  "smallvec",
- "thiserror",
+ "thiserror 1.0.69",
  "web-sys",
  "wgpu-hal",
  "wgpu-types",
@@ -3222,7 +3245,7 @@ dependencies = [
  "renderdoc-sys",
  "rustc-hash",
  "smallvec",
- "thiserror",
+ "thiserror 1.0.69",
  "wasm-bindgen",
  "web-sys",
  "wgpu-types",
@@ -3324,9 +3347,9 @@ version = "0.53.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "942ac266be9249c84ca862f0a164a39533dc2f6f33dc98ec89c8da99b82ea0bd"
 dependencies = [
- "proc-macro2 1.0.86",
+ "proc-macro2 1.0.92",
  "quote 1.0.36",
- "syn 2.0.70",
+ "syn 2.0.90",
 ]
 
 [[package]]
@@ -3335,9 +3358,9 @@ version = "0.53.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "da33557140a288fae4e1d5f8873aaf9eb6613a9cf82c3e070223ff177f598b60"
 dependencies = [
- "proc-macro2 1.0.86",
+ "proc-macro2 1.0.92",
  "quote 1.0.36",
- "syn 2.0.70",
+ "syn 2.0.90",
 ]
 
 [[package]]
@@ -3586,7 +3609,7 @@ version = "0.7.35"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
 dependencies = [
- "proc-macro2 1.0.86",
+ "proc-macro2 1.0.92",
  "quote 1.0.36",
- "syn 2.0.70",
+ "syn 2.0.90",
 ]
diff --git a/Cargo.toml b/Cargo.toml
index 95d760b66d9751eabee05c25f35bfb1fed115d2d..19c2021676812a85fe03ece414f36dccdccf0188 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "micro_ldtk"
-version = "0.11.0"
+version = "0.12.0"
 edition = "2021"
 
 authors = [
@@ -27,21 +27,22 @@ ldtk_1_1_2 = ["_supports_ldtk"]
 ldtk_1_1_1 = ["_supports_ldtk"]
 ldtk_1_1_0 = ["_supports_ldtk"]
 ldtk_1_0_0 = ["_supports_ldtk"]
-autotile = ["micro_autotile"]
+autotile = ["dep:micro_autotile"]
+bevy = ["dep:bevy"]
 _supports_intgridgroup = []
 _supports_ldtk = []
 _optional_tile_list = []
 no_panic = []
 
 [dependencies]
-bevy = { version = "0.14", default-features = false, features = ["bevy_render", "bevy_sprite", "bevy_asset", "serialize"] }
+bevy = { optional = true, version = "0.14", default-features = false, features = ["bevy_render", "bevy_sprite", "bevy_asset", "serialize"] }
 
 anyhow = "1.0"
-thiserror = "1.0"
+thiserror = "2.0"
 log = "0.4"
-serde = "1.0"
+serde = { version = "1.0", features = ["derive"] }
 serde_json = "1.0"
 num-traits = "0.2"
 quadtree_rs = "0.1"
-micro_autotile = { version = "0.1", optional = true }
+micro_autotile = { version = "0.2", optional = true }
 
diff --git a/src/ldtk/mod.rs b/src/ldtk/mod.rs
index cdf6a521e114ee1d227041d7c8f94c3ebce9aebb..e41dc4ae4d189a71935758e521c38671e204ff40 100644
--- a/src/ldtk/mod.rs
+++ b/src/ldtk/mod.rs
@@ -19,10 +19,6 @@ mod data_1_4_0;
 #[cfg(any(feature = "ldtk_1_5_3"))]
 mod data_1_5_3;
 
-use bevy::asset::io::Reader;
-use bevy::asset::{AssetLoader, AsyncReadExt, LoadContext, UntypedAssetId, VisitAssetDependencies};
-use bevy::prelude::{Asset, Handle};
-use bevy::reflect::TypePath;
 
 use crate::ldtk;
 #[cfg(feature = "ldtk_1_0_0")]
@@ -89,37 +85,134 @@ impl<'a> LdtkFromBytes<'a> for Project {}
 impl_from_bytes!(Level);
 impl_from_bytes!(Project);
 
-impl TypePath for Project {
-	fn type_path() -> &'static str {
-		"micro_ldtk::ldtk::Project"
+#[cfg(feature = "bevy")]
+mod _bevy_impl {
+	use super::*;
+	use bevy::asset::io::Reader;
+	use bevy::asset::{AssetLoader, AsyncReadExt, LoadContext, UntypedAssetId, VisitAssetDependencies};
+	use bevy::prelude::{Asset, Handle};
+	use bevy::reflect::TypePath;
+
+
+	impl TypePath for Project {
+		fn type_path() -> &'static str {
+			"micro_ldtk::ldtk::Project"
+		}
+
+		fn short_type_path() -> &'static str {
+			"Project"
+		}
 	}
 
-	fn short_type_path() -> &'static str {
-		"Project"
+	impl VisitAssetDependencies for Project {
+		fn visit_dependencies(&self, _visit: &mut impl FnMut(UntypedAssetId)) {}
 	}
-}
 
-impl VisitAssetDependencies for Project {
-	fn visit_dependencies(&self, _visit: &mut impl FnMut(UntypedAssetId)) {}
-}
+	impl Asset for Project {}
 
-impl Asset for Project {}
+	impl TypePath for Level {
+		fn type_path() -> &'static str {
+			"micro_ld0tk::ldtk::Level"
+		}
 
-impl TypePath for Level {
-	fn type_path() -> &'static str {
-		"micro_ld0tk::ldtk::Level"
+		fn short_type_path() -> &'static str {
+			"Level"
+		}
 	}
 
-	fn short_type_path() -> &'static str {
-		"Level"
+	impl VisitAssetDependencies for Level {
+		fn visit_dependencies(&self, _visit: &mut impl FnMut(UntypedAssetId)) {}
 	}
-}
 
-impl VisitAssetDependencies for Level {
-	fn visit_dependencies(&self, _visit: &mut impl FnMut(UntypedAssetId)) {}
+	impl Asset for Level {}
+
+
+	#[derive(Asset, TypePath)]
+	pub struct LevelSet(pub Vec<Handle<Level>>);
+
+	#[derive(Default)]
+	pub struct LdtkLoader;
+	impl AssetLoader for LdtkLoader {
+		type Asset = Project;
+		type Settings = ();
+		type Error = LdtkLoadError;
+
+		async fn load<'a>(
+			&'a self,
+			reader: &'a mut Reader<'_>,
+			_settings: &'a Self::Settings,
+			load_context: &'a mut LoadContext<'_>,
+		) -> Result<Self::Asset, Self::Error> {
+			let mut bytes = Vec::new();
+			reader.read_to_end(&mut bytes).await?;
+			let project = Project::from_bytes(bytes.as_slice())?;
+
+			let levels = project
+				.levels
+				.iter()
+				.flat_map(|level| {
+					log::debug!(
+					"Checking if level is external: {} [{}]",
+					level.identifier,
+					level.external_rel_path.is_some()
+				);
+
+					level
+						.external_rel_path
+						.as_ref()
+						.map(|path| (level.identifier.clone(), path))
+				})
+				.collect::<Vec<(String, &String)>>();
+
+			let parent_path = load_context.path().parent().map(|pp| pp.to_path_buf());
+			let mut level_set = Vec::with_capacity(levels.len());
+
+			for (_, path) in levels {
+				level_set.push(match &parent_path {
+					Some(parent) => load_context.load::<Level>(parent.join(path)),
+					None => load_context.load::<Level>(path),
+				});
+			}
+
+			load_context.add_labeled_asset(
+				format!("{}ExternalLevels", project.iid),
+				LevelSet(level_set),
+			);
+
+			Ok(project)
+		}
+
+		fn extensions(&self) -> &[&str] {
+			&["ldtk"]
+		}
+	}
+
+	#[derive(Default)]
+	pub struct LdtkLevelLoader;
+	impl AssetLoader for LdtkLevelLoader {
+		type Asset = Level;
+		type Settings = ();
+		type Error = LdtkLoadError;
+
+		async fn load<'a>(
+			&'a self,
+			reader: &'a mut Reader<'_>,
+			_settings: &'a Self::Settings,
+			_load_context: &'a mut LoadContext<'_>,
+		) -> Result<Self::Asset, Self::Error> {
+			let mut bytes = Vec::new();
+			reader.read_to_end(&mut bytes).await?;
+			let level = Level::from_bytes(bytes.as_slice())?;
+			Ok(level)
+		}
+		fn extensions(&self) -> &[&str] {
+			&["ldtkl"]
+		}
+	}
 }
 
-impl Asset for Level {}
+#[cfg(feature = "bevy")]
+pub use _bevy_impl::{LdtkLoader, LdtkLevelLoader, LevelSet};
 
 impl Project {
 	pub fn get_all_levels(&self) -> Vec<&Level> {
@@ -173,88 +266,6 @@ pub enum LdtkLoadError {
 
 pub type LdtkProject = Project;
 
-#[derive(Asset, TypePath)]
-pub(crate) struct LevelSet(pub Vec<Handle<Level>>);
-
-#[derive(Default)]
-pub struct LdtkLoader;
-impl AssetLoader for LdtkLoader {
-	type Asset = Project;
-	type Settings = ();
-	type Error = LdtkLoadError;
-
-	async fn load<'a>(
-		&'a self,
-		reader: &'a mut Reader<'_>,
-		_settings: &'a Self::Settings,
-		load_context: &'a mut LoadContext<'_>,
-	) -> Result<Self::Asset, Self::Error> {
-		let mut bytes = Vec::new();
-		reader.read_to_end(&mut bytes).await?;
-		let project = Project::from_bytes(bytes.as_slice())?;
-
-		let levels = project
-			.levels
-			.iter()
-			.flat_map(|level| {
-				log::debug!(
-					"Checking if level is external: {} [{}]",
-					level.identifier,
-					level.external_rel_path.is_some()
-				);
-
-				level
-					.external_rel_path
-					.as_ref()
-					.map(|path| (level.identifier.clone(), path))
-			})
-			.collect::<Vec<(String, &String)>>();
-
-		let parent_path = load_context.path().parent().map(|pp| pp.to_path_buf());
-		let mut level_set = Vec::with_capacity(levels.len());
-
-		for (_, path) in levels {
-			level_set.push(match &parent_path {
-				Some(parent) => load_context.load::<Level>(parent.join(path)),
-				None => load_context.load::<Level>(path),
-			});
-		}
-
-		load_context.add_labeled_asset(
-			format!("{}ExternalLevels", project.iid),
-			LevelSet(level_set),
-		);
-
-		Ok(project)
-	}
-
-	fn extensions(&self) -> &[&str] {
-		&["ldtk"]
-	}
-}
-
-#[derive(Default)]
-pub struct LdtkLevelLoader;
-impl AssetLoader for LdtkLevelLoader {
-	type Asset = Level;
-	type Settings = ();
-	type Error = LdtkLoadError;
-
-	async fn load<'a>(
-		&'a self,
-		reader: &'a mut Reader<'_>,
-		_settings: &'a Self::Settings,
-		_load_context: &'a mut LoadContext<'_>,
-	) -> Result<Self::Asset, Self::Error> {
-		let mut bytes = Vec::new();
-		reader.read_to_end(&mut bytes).await?;
-		let level = Level::from_bytes(bytes.as_slice())?;
-		Ok(level)
-	}
-	fn extensions(&self) -> &[&str] {
-		&["ldtkl"]
-	}
-}
 
 #[cfg(feature = "autotile")]
 mod autotile_support {
@@ -268,7 +279,7 @@ mod autotile_support {
 			rule.tile_rects_ids
 				.iter()
 				.flatten()
-				.map(|val| *val as usize)
+				.map(|val| *val as i32)
 				.collect(),
 		)
 	}
@@ -287,36 +298,21 @@ mod autotile_support {
 					1 => Some(AutoTileRule {
 						chance: rule.chance as f32,
 						output: create_output(rule),
-						matcher: TileMatcher::single_match(TileStatus::from_ldtk_value(
+						matcher: TileMatcher::single(TileStatus::from(
 							rule.pattern[0],
 						)),
 					}),
-					3 => {
-						if rule.pattern.len() == 9 {
-							let matcher = TileMatcher([
-								TileStatus::from_ldtk_value(rule.pattern[0]),
-								TileStatus::from_ldtk_value(rule.pattern[1]),
-								TileStatus::from_ldtk_value(rule.pattern[2]),
-								TileStatus::from_ldtk_value(rule.pattern[3]),
-								TileStatus::from_ldtk_value(rule.pattern[4]),
-								TileStatus::from_ldtk_value(rule.pattern[5]),
-								TileStatus::from_ldtk_value(rule.pattern[6]),
-								TileStatus::from_ldtk_value(rule.pattern[7]),
-								TileStatus::from_ldtk_value(rule.pattern[8]),
-							]);
-
-							let rule = AutoTileRule {
-								chance: rule.chance as f32,
+					_ => {
+						TileMatcher::try_from(rule.pattern.as_slice())
+							.ok().map(|matcher| {
+							AutoTileRule {
 								matcher,
-								output: create_output(rule),
-							};
+								chance: rule.chance as f32,
+                                output: create_output(rule),
+							}
+						})
 
-							Some(rule)
-						} else {
-							None
-						}
 					}
-					_ => None,
 				})
 				.collect();
 
diff --git a/src/lib.rs b/src/lib.rs
index 58a29947bff81a7674af640d4c3172fa75219654..65855fad18a537d4f0a3c16fe570bcdee801d950 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,7 +1,10 @@
-#[cfg(feature = "_supports_ldtk")]
+#[cfg(all(feature = "_supports_ldtk", feature = "bevy"))]
 mod assets;
+#[cfg(feature = "bevy")]
 mod camera;
+#[cfg(feature = "bevy")]
 mod map_query;
+#[cfg(feature = "bevy")]
 mod pregen;
 mod system;
 
@@ -23,6 +26,7 @@ pub fn set_ldtk_tile_scale_f32(scale: f32) {
 	}
 }
 
+#[cfg(feature = "bevy")]
 mod __plugin {
 	use bevy::ecs::query::QueryFilter;
 	use std::marker::PhantomData;
@@ -85,13 +89,19 @@ mod __plugin {
 }
 
 use std::sync::atomic::{AtomicU32, Ordering};
-
+#[cfg(feature = "bevy")]
 pub use __plugin::{MicroLDTKCameraPlugin, MicroLDTKPlugin};
+#[cfg(feature = "bevy")]
 pub use assets::{LevelIndex, TileMetadata, TilesetIndex};
+#[cfg(feature = "bevy")]
 pub use camera::CameraBounder;
-pub use ldtk::{LdtkLoader, LdtkProject};
+pub use ldtk::{LdtkProject, Level, AutoLayerRuleGroup};
+#[cfg(feature = "bevy")]
+pub use ldtk::LdtkLoader;
+#[cfg(feature = "bevy")]
 pub use map_query::{CameraBounds, InstanceRef, MapQuery};
 #[cfg(feature = "autotile")]
 pub use micro_autotile as autotile;
+#[cfg(feature = "bevy")]
 pub use pregen::{write_layer_to_texture, write_map_to_texture, Rasterise};
 pub use system::*;
diff --git a/src/system/mod.rs b/src/system/mod.rs
index 95310029952fb4e03cc2b600494e112625f95e57..45d44c8a67301d9dfb88152919bf9c2d6947e1b6 100644
--- a/src/system/mod.rs
+++ b/src/system/mod.rs
@@ -1,7 +1,11 @@
+#[cfg(feature = "bevy")]
 mod locator;
+#[cfg(feature = "bevy")]
 mod types;
 mod utils;
 
+#[cfg(feature = "bevy")]
 pub use locator::*;
+#[cfg(feature = "bevy")]
 pub use types::*;
 pub use utils::*;
diff --git a/src/system/types.rs b/src/system/types.rs
index 161fb41d0e8a1856221a03fcac3d6491113c74a3..8debdbd5651ea660d8e1c1c52339556b67694efc 100644
--- a/src/system/types.rs
+++ b/src/system/types.rs
@@ -3,7 +3,9 @@ use std::fmt::{Debug, Formatter};
 use std::ops::{Deref, DerefMut, Index};
 use std::path::Path;
 
+#[cfg(feature = "bevy")]
 use bevy::math::{IVec2, Rect, UVec2, Vec2};
+#[cfg(feature = "bevy")]
 use bevy::prelude::Event;
 use num_traits::AsPrimitive;
 use quadtree_rs::area::AreaBuilder;
@@ -14,9 +16,12 @@ use serde_json::{Map, Number, Value};
 
 use crate::ldtk::{EntityInstance, FieldInstance, LayerInstance, Level, TileInstance};
 use crate::system::Indexer;
-use crate::{get_ldtk_tile_scale, px_to_grid, MapQuery};
+use crate::{get_ldtk_tile_scale, px_to_grid};
+#[cfg(feature = "bevy")]
+use crate::MapQuery;
 
-#[derive(Default, Clone, Debug, Ord, PartialOrd, PartialEq, Eq, Event)]
+#[derive(Default, Clone, Debug, Ord, PartialOrd, PartialEq, Eq)]
+#[cfg_attr(feature = "bevy", derive(Event))]
 pub struct LevelDataUpdated(pub String);
 
 pub struct TileRef<'a> {
@@ -88,11 +93,13 @@ where
 		Self(value.0.as_(), value.1.as_())
 	}
 }
+#[cfg(feature = "bevy")]
 impl From<UVec2> for SpatialIndex {
 	fn from(value: UVec2) -> Self {
 		Self(value.x as i64, value.y as i64)
 	}
 }
+#[cfg(feature = "bevy")]
 impl From<IVec2> for SpatialIndex {
 	fn from(value: IVec2) -> Self {
 		Self(value.x as i64, value.y as i64)
diff --git a/src/system/utils.rs b/src/system/utils.rs
index 2af7f3babc72de8f859552b8603395448238d948..be47c5e2a84b6e62363713e43015222cbbc6700b 100644
--- a/src/system/utils.rs
+++ b/src/system/utils.rs
@@ -1,3 +1,4 @@
+#[cfg(feature = "bevy")]
 use bevy::prelude::{Component, IVec2, Resource};
 use num_traits::AsPrimitive;
 
@@ -18,10 +19,11 @@ pub fn entity_centre(level_height: i64, entity: &EntityInstance) -> (f32, f32) {
 	(x as f32, y as f32)
 }
 
-#[derive(Component)]
+#[cfg_attr(feature="bevy", derive(Component))]
 pub struct WorldLinked;
 
-#[derive(Default, Resource, Clone, Debug)]
+#[derive(Default, Clone, Debug)]
+#[cfg_attr(feature="bevy", derive(Resource))]
 pub struct ActiveLevel {
 	pub map: String,
 	pub dirty: bool,
@@ -87,6 +89,7 @@ impl Indexer {
 		x >= 0 && x < self.width && y >= 0 && y < self.height
 	}
 
+	#[cfg(feature = "bevy")]
 	/// Perform a transformation to flip a grid point (top down coordinates) into a render
 	/// point (bottom up coordinates)
 	pub fn flip_y(&self, point: IVec2) -> IVec2 {