From dcd9c9f2b306be1c865452d17c044c41d7a2c92c Mon Sep 17 00:00:00 2001 From: ghostlyzsh Date: Fri, 24 Nov 2023 16:23:17 -0600 Subject: [PATCH] server can spawn player in theory, removed some old client code --- Cargo.lock | 4454 +++++------------ Cargo.toml | 7 +- Jenkinsfile | 34 - ansible/deploy-beta.yaml | 50 - ansible/deploy-bleeding.yaml | 50 - ansible/deploy-stable.yaml | 51 - ansible/infra | 3 - ansible/inventory.yaml | 23 - ansible/restart-beta.yaml | 15 - ansible/restart-bleeding.yaml | 15 - ansible/restart-stable.yaml | 15 - ansible/restart.yaml | 15 - ansible/start-beta.yaml | 11 - ansible/start-bleeding.yaml | 11 - ansible/start-stable.yaml | 11 - ansible/start.yaml | 11 - ansible/stop-beta.yaml | 11 - ansible/stop-bleeding.yaml | 11 - ansible/stop-stable.yaml | 11 - ansible/stop.yaml | 11 - ansible/update-beta.yaml | 11 - ansible/update-bleeding.yaml | 11 - ansible/update-stable.yaml | 11 - ansible/update.yaml | 11 - api.Dockerfile | 12 - api/Cargo.toml | 2 - beta.Jenkinsfile | 27 - client/src/gateway.ts | 78 +- client/src/index.ts | 172 +- docker/README.md | 1 - docker/config.jinja.toml | 27 - docker/docker-compose.jinja.yml | 34 - docker/mime-types.conf | 4 - docker/nginx.conf | 44 - protocol/Cargo.toml | 14 - protocol/build.rs | 15 - protocol/src/api.rs | 5 - protocol/src/legacy.rs | 102 - protocol/src/lib.rs | 302 -- protocol/src/pbuf/goodbye_reason.proto | 12 - protocol/src/pbuf/input.proto | 9 - protocol/src/pbuf/message_c2s.proto | 82 - protocol/src/pbuf/message_s2c.proto | 69 - protocol/src/pbuf/module.proto | 32 - protocol/src/pbuf/planet.proto | 16 - protocol/src/pbuf/player.proto | 9 - protocol/src/pbuf/starkingdoms-protocol.proto | 15 - protocol/src/pbuf/state.proto | 8 - server.Dockerfile | 7 - server/Cargo.lock | 4012 +++++++++++++++ server/Cargo.toml | 42 +- server/build.rs | 42 - server/src/api.rs | 98 - server/src/component.rs | 34 + server/src/components.rs | 8 - server/src/entity.rs | 233 - server/src/handler.rs | 835 --- server/src/macros.rs | 76 - server/src/main.rs | 244 +- server/src/manager.rs | 147 - server/src/module.rs | 575 --- server/src/orbit/constants.rs | 42 - server/src/orbit/kepler.rs | 7 - server/src/orbit/mod.rs | 6 - server/src/orbit/newtonian.rs | 29 - server/src/orbit/orbit.rs | 75 - server/src/orbit/vis_viva.rs | 8 - server/src/packet.rs | 26 + server/src/planet.rs | 178 - server/src/tcp_handler.rs | 176 - server/src/timer.rs | 768 --- spacetime | 10 - spacetime_old | 284 -- .../__pycache__/ninja_syntax.cpython-310.pyc | Bin 5958 -> 0 bytes spacetime_py/ninja_syntax.py | 199 - spacetime_py/spacetime.py | 166 - spacetime_rs/Cargo.toml | 11 - spacetime_rs/src/cmd.rs | 20 - spacetime_rs/src/commands/api.rs | 59 - spacetime_rs/src/commands/assets.rs | 26 - spacetime_rs/src/commands/clean.rs | 11 - spacetime_rs/src/commands/client.rs | 38 - spacetime_rs/src/commands/docker.rs | 171 - spacetime_rs/src/commands/mod.rs | 6 - spacetime_rs/src/commands/server.rs | 61 - spacetime_rs/src/config.rs | 4 - spacetime_rs/src/configure/asset.rs | 430 -- spacetime_rs/src/configure/client.rs | 11 - spacetime_rs/src/configure/mod.rs | 15 - spacetime_rs/src/configure/rust.rs | 103 - spacetime_rs/src/main.rs | 263 - spacetime_rs/src/ninja.rs | 194 - stable.Jenkinsfile | 27 - web.Dockerfile | 14 - web/assets | 1 - web/index.html | 58 - web/play.html | 139 - web/static/css/index.css | 13 - web/static/css/play.css | 5 - web/static/img/spritesheet-512.png | Bin 540862 -> 0 bytes 100 files changed, 5423 insertions(+), 10539 deletions(-) delete mode 100644 Jenkinsfile delete mode 100644 ansible/deploy-beta.yaml delete mode 100644 ansible/deploy-bleeding.yaml delete mode 100644 ansible/deploy-stable.yaml delete mode 100755 ansible/infra delete mode 100644 ansible/inventory.yaml delete mode 100644 ansible/restart-beta.yaml delete mode 100644 ansible/restart-bleeding.yaml delete mode 100644 ansible/restart-stable.yaml delete mode 100644 ansible/restart.yaml delete mode 100644 ansible/start-beta.yaml delete mode 100644 ansible/start-bleeding.yaml delete mode 100644 ansible/start-stable.yaml delete mode 100644 ansible/start.yaml delete mode 100644 ansible/stop-beta.yaml delete mode 100644 ansible/stop-bleeding.yaml delete mode 100644 ansible/stop-stable.yaml delete mode 100644 ansible/stop.yaml delete mode 100644 ansible/update-beta.yaml delete mode 100644 ansible/update-bleeding.yaml delete mode 100644 ansible/update-stable.yaml delete mode 100644 ansible/update.yaml delete mode 100644 api.Dockerfile delete mode 100644 beta.Jenkinsfile delete mode 100644 docker/README.md delete mode 100644 docker/config.jinja.toml delete mode 100644 docker/docker-compose.jinja.yml delete mode 100644 docker/mime-types.conf delete mode 100644 docker/nginx.conf delete mode 100644 protocol/Cargo.toml delete mode 100644 protocol/build.rs delete mode 100644 protocol/src/api.rs delete mode 100644 protocol/src/legacy.rs delete mode 100644 protocol/src/lib.rs delete mode 100644 protocol/src/pbuf/goodbye_reason.proto delete mode 100644 protocol/src/pbuf/input.proto delete mode 100644 protocol/src/pbuf/message_c2s.proto delete mode 100644 protocol/src/pbuf/message_s2c.proto delete mode 100644 protocol/src/pbuf/module.proto delete mode 100644 protocol/src/pbuf/planet.proto delete mode 100644 protocol/src/pbuf/player.proto delete mode 100644 protocol/src/pbuf/starkingdoms-protocol.proto delete mode 100644 protocol/src/pbuf/state.proto delete mode 100644 server.Dockerfile delete mode 100644 server/build.rs delete mode 100644 server/src/api.rs create mode 100644 server/src/component.rs delete mode 100644 server/src/components.rs delete mode 100644 server/src/entity.rs delete mode 100644 server/src/handler.rs delete mode 100644 server/src/macros.rs delete mode 100644 server/src/manager.rs delete mode 100644 server/src/module.rs delete mode 100644 server/src/orbit/constants.rs delete mode 100644 server/src/orbit/kepler.rs delete mode 100644 server/src/orbit/mod.rs delete mode 100644 server/src/orbit/newtonian.rs delete mode 100644 server/src/orbit/orbit.rs delete mode 100644 server/src/orbit/vis_viva.rs create mode 100644 server/src/packet.rs delete mode 100644 server/src/planet.rs delete mode 100644 server/src/tcp_handler.rs delete mode 100644 server/src/timer.rs delete mode 100755 spacetime delete mode 100755 spacetime_old delete mode 100644 spacetime_py/__pycache__/ninja_syntax.cpython-310.pyc delete mode 100644 spacetime_py/ninja_syntax.py delete mode 100644 spacetime_py/spacetime.py delete mode 100644 spacetime_rs/Cargo.toml delete mode 100644 spacetime_rs/src/cmd.rs delete mode 100644 spacetime_rs/src/commands/api.rs delete mode 100644 spacetime_rs/src/commands/assets.rs delete mode 100644 spacetime_rs/src/commands/clean.rs delete mode 100644 spacetime_rs/src/commands/client.rs delete mode 100644 spacetime_rs/src/commands/docker.rs delete mode 100644 spacetime_rs/src/commands/mod.rs delete mode 100644 spacetime_rs/src/commands/server.rs delete mode 100644 spacetime_rs/src/config.rs delete mode 100644 spacetime_rs/src/configure/asset.rs delete mode 100644 spacetime_rs/src/configure/client.rs delete mode 100644 spacetime_rs/src/configure/mod.rs delete mode 100644 spacetime_rs/src/configure/rust.rs delete mode 100644 spacetime_rs/src/main.rs delete mode 100644 spacetime_rs/src/ninja.rs delete mode 100644 stable.Jenkinsfile delete mode 100644 web.Dockerfile delete mode 120000 web/assets delete mode 100644 web/index.html delete mode 100644 web/play.html delete mode 100644 web/static/css/index.css delete mode 100644 web/static/css/play.css delete mode 100644 web/static/img/spritesheet-512.png diff --git a/Cargo.lock b/Cargo.lock index de495065a60ee64f7f29e053af4d62da688f9c77..c9a90973b793d3c2b4fd3bb2a6f473ec9b06b5c3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3,31 +3,41 @@ version = 3 [[package]] -name = "Inflector" -version = "0.11.4" +name = "ab_glyph" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" +checksum = "80179d7dd5d7e8c285d67c4a1e652972a92de7475beddfb92028c76463b13225" +dependencies = [ + "ab_glyph_rasterizer", + "owned_ttf_parser", +] + +[[package]] +name = "ab_glyph_rasterizer" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" [[package]] name = "accesskit" -version = "0.10.1" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "704d532b1cd3d912bb37499c55a81ac748cc1afa737eedd100ba441acdd47d38" +checksum = "ca8410747ed85a17c4a1e9ed3f5a74d3e7bdcc876cf9a18ff40ae21d645997b2" [[package]] name = "accesskit_consumer" -version = "0.14.1" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48ba8b23cfca3944012ee2e5c71c02077a400e034c720eed6bd927cb6b4d1fd9" +checksum = "8c17cca53c09fbd7288667b22a201274b9becaa27f0b91bf52a526db95de45e6" dependencies = [ "accesskit", ] [[package]] name = "accesskit_macos" -version = "0.6.2" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58d062544d6cc36f4213323b7cb3a0d74ddff4b0d2311ab5e7596f4278bb2cc9" +checksum = "cd3b6ae1eabbfbced10e840fd3fce8a93ae84f174b3e4ba892ab7bcb42e477a7" dependencies = [ "accesskit", "accesskit_consumer", @@ -37,23 +47,23 @@ dependencies = [ [[package]] name = "accesskit_windows" -version = "0.13.2" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaf5b3c3828397ee832ba4a72fb1a4ace10f781e31885f774cbd531014059115" +checksum = "afcae27ec0974fc7c3b0b318783be89fd1b2e66dd702179fe600166a38ff4a0b" dependencies = [ "accesskit", "accesskit_consumer", - "arrayvec", "once_cell", "paste", - "windows 0.44.0", + "static_assertions", + "windows 0.48.0", ] [[package]] name = "accesskit_winit" -version = "0.12.4" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbcb615217efc79c4bed3094c4ca76c4bc554751d1da16f3ed4ba0459b1e8f31" +checksum = "88e39fcec2e10971e188730b7a76bab60647dacc973d4591855ebebcadfaa738" dependencies = [ "accesskit", "accesskit_macos", @@ -61,241 +71,11 @@ dependencies = [ "winit", ] -[[package]] -name = "actix-codec" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "617a8268e3537fe1d8c9ead925fca49ef6400927ee7bc26750e90ecee14ce4b8" -dependencies = [ - "bitflags 1.3.2", - "bytes", - "futures-core", - "futures-sink", - "memchr", - "pin-project-lite", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "actix-cors" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b340e9cfa5b08690aae90fb61beb44e9b06f44fe3d0f93781aaa58cfba86245e" -dependencies = [ - "actix-utils", - "actix-web", - "derive_more", - "futures-util", - "log", - "once_cell", - "smallvec", -] - -[[package]] -name = "actix-files" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d832782fac6ca7369a70c9ee9a20554623c5e51c76e190ad151780ebea1cf689" -dependencies = [ - "actix-http", - "actix-service", - "actix-utils", - "actix-web", - "askama_escape", - "bitflags 1.3.2", - "bytes", - "derive_more", - "futures-core", - "http-range", - "log", - "mime", - "mime_guess", - "percent-encoding", - "pin-project-lite", -] - -[[package]] -name = "actix-http" -version = "3.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2079246596c18b4a33e274ae10c0e50613f4d32a4198e09c7b93771013fed74" -dependencies = [ - "actix-codec", - "actix-rt", - "actix-service", - "actix-utils", - "ahash 0.8.3", - "base64 0.21.2", - "bitflags 1.3.2", - "brotli", - "bytes", - "bytestring", - "derive_more", - "encoding_rs", - "flate2", - "futures-core", - "h2", - "http", - "httparse", - "httpdate", - "itoa", - "language-tags", - "local-channel", - "mime", - "percent-encoding", - "pin-project-lite", - "rand", - "sha1", - "smallvec", - "tokio", - "tokio-util", - "tracing", - "zstd", -] - -[[package]] -name = "actix-macros" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "465a6172cf69b960917811022d8f29bc0b7fa1398bc4f78b3c466673db1213b6" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "actix-request-identifier" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f620de7c806297b88cf39da5ef4293a59f7dc219a9838433e83238e53a9c7057" -dependencies = [ - "actix-web", - "futures", - "uuid", -] - -[[package]] -name = "actix-router" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d66ff4d247d2b160861fa2866457e85706833527840e4133f8f49aa423a38799" -dependencies = [ - "bytestring", - "http", - "regex", - "serde", - "tracing", -] - -[[package]] -name = "actix-rt" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15265b6b8e2347670eb363c47fc8c75208b4a4994b27192f345fcbe707804f3e" -dependencies = [ - "futures-core", - "tokio", -] - -[[package]] -name = "actix-server" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e8613a75dd50cc45f473cee3c34d59ed677c0f7b44480ce3b8247d7dc519327" -dependencies = [ - "actix-rt", - "actix-service", - "actix-utils", - "futures-core", - "futures-util", - "mio", - "num_cpus", - "socket2", - "tokio", - "tracing", -] - -[[package]] -name = "actix-service" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b894941f818cfdc7ccc4b9e60fa7e53b5042a2e8567270f9147d5591893373a" -dependencies = [ - "futures-core", - "paste", - "pin-project-lite", -] - -[[package]] -name = "actix-utils" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88a1dcdff1466e3c2488e1cb5c36a71822750ad43839937f85d2f4d9f8b705d8" -dependencies = [ - "local-waker", - "pin-project-lite", -] - -[[package]] -name = "actix-web" -version = "4.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd3cb42f9566ab176e1ef0b8b3a896529062b4efc6be0123046095914c4c1c96" -dependencies = [ - "actix-codec", - "actix-http", - "actix-macros", - "actix-router", - "actix-rt", - "actix-server", - "actix-service", - "actix-utils", - "actix-web-codegen", - "ahash 0.7.6", - "bytes", - "bytestring", - "cfg-if", - "cookie", - "derive_more", - "encoding_rs", - "futures-core", - "futures-util", - "http", - "itoa", - "language-tags", - "log", - "mime", - "once_cell", - "pin-project-lite", - "regex", - "serde", - "serde_json", - "serde_urlencoded", - "smallvec", - "socket2", - "time", - "url", -] - -[[package]] -name = "actix-web-codegen" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2262160a7ae29e3415554a3f1fc04c764b1540c116aa524683208078b7a75bc9" -dependencies = [ - "actix-router", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "addr2line" -version = "0.20.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" dependencies = [ "gimli", ] @@ -306,17 +86,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" -[[package]] -name = "ahash" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" -dependencies = [ - "getrandom", - "once_cell", - "version_check", -] - [[package]] name = "ahash" version = "0.8.3" @@ -331,54 +100,46 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "0.7.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" -dependencies = [ - "memchr", -] - -[[package]] -name = "aho-corasick" -version = "1.0.2" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +checksum = "6748e8def348ed4d14996fa801f4122cd763fff530258cdc03f64b25f89d3a5a" dependencies = [ "memchr", ] [[package]] -name = "aliasable" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" - -[[package]] -name = "alloc-no-stdlib" -version = "2.0.4" +name = "allocator-api2" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" +checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" [[package]] -name = "alloc-stdlib" -version = "0.2.2" +name = "alsa" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +checksum = "e2562ad8dcf0f789f65c6fdaad8a8a9708ed6b488e649da28c01656ad66b8b47" dependencies = [ - "alloc-no-stdlib", + "alsa-sys", + "bitflags 1.3.2", + "libc", + "nix 0.24.3", ] [[package]] -name = "allocator-api2" -version = "0.2.15" +name = "alsa-sys" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56fc6cf8dc8c4158eed8649f9b8b0ea1518eb62b544fe9490d66fa0b349eafe9" +checksum = "db8fee663d06c4e303404ef5f40488a53e062f89ba8bfed81f42325aafad1527" +dependencies = [ + "libc", + "pkg-config", +] [[package]] name = "android-activity" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40bc1575e653f158cbdc6ebcd917b9564e66321c5325c232c3591269c257be69" +checksum = "64529721f27c2314ced0890ce45e469574a73e5e6fdd6e9da1860eb29285f5e0" dependencies = [ "android-properties", "bitflags 1.3.2", @@ -398,17 +159,11 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - [[package]] name = "android_log-sys" -version = "0.2.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85965b6739a430150bdd138e2374a98af0c3ee0d030b3bb7fc3bddff58d0102e" +checksum = "5ecc8056bf6ab9892dcd53216c83d1597487d7dacac16c8df6b877d127df9937" [[package]] name = "android_system_properties" @@ -419,12 +174,6 @@ dependencies = [ "libc", ] -[[package]] -name = "anyhow" -version = "1.0.71" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" - [[package]] name = "approx" version = "0.5.1" @@ -434,6 +183,12 @@ dependencies = [ "num-traits", ] +[[package]] +name = "arrayref" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" + [[package]] name = "arrayvec" version = "0.7.4" @@ -446,30 +201,24 @@ version = "0.37.3+1.3.251" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39e9c3835d686b0a6084ab4234fcd1b07dbf6e4767dce60874b12356a25ecd4a" dependencies = [ - "libloading", + "libloading 0.7.4", ] [[package]] -name = "askama_escape" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "619743e34b5ba4e9703bba34deac3427c72507c7159f5fd030aea8cac0cfe341" - -[[package]] -name = "async-attributes" -version = "1.1.2" +name = "async-broadcast" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3203e79f4dd9bdda415ed03cf14dae5a2bf775c683a00f94e9cd1faf0f596e5" +checksum = "7c48ccdbf6ca6b121e0f586cbc0e73ae440e56c67c30fa0873b4e110d9c26d2b" dependencies = [ - "quote", - "syn 1.0.109", + "event-listener", + "futures-core", ] [[package]] name = "async-channel" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf46fee83e5ccffc220104713af3292ff9bc7c64c7de289f66dae8e38d826833" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" dependencies = [ "concurrent-queue", "event-listener", @@ -491,155 +240,49 @@ dependencies = [ ] [[package]] -name = "async-global-executor" -version = "2.3.1" +name = "async-fs" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1b6f5d7df27bd294849f8eec66ecfc63d11814df7a4f5d74168a2394467b776" +checksum = "279cf904654eeebfa37ac9bb1598880884924aab82e290aa65c9e77a0e142e06" dependencies = [ - "async-channel", - "async-executor", - "async-io", "async-lock", + "autocfg", "blocking", "futures-lite", - "once_cell", - "tokio", ] [[package]] -name = "async-io" -version = "1.13.0" +name = "async-lock" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" +checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" dependencies = [ - "async-lock", - "autocfg", - "cfg-if", - "concurrent-queue", - "futures-lite", - "log", - "parking", - "polling", - "rustix 0.37.23", - "slab", - "socket2", - "waker-fn", + "event-listener", ] [[package]] -name = "async-lock" -version = "2.7.0" +name = "async-task" +version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa24f727524730b077666307f2734b4a1a1c57acb79193127dcc8914d5242dd7" -dependencies = [ - "event-listener", -] +checksum = "ecc7ab41815b3c653ccd2978ec3255c81349336702dfdf62ee6f7069b12a3aae" [[package]] -name = "async-std" -version = "1.12.0" +name = "atomic-waker" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d" -dependencies = [ - "async-attributes", - "async-channel", - "async-global-executor", - "async-io", - "async-lock", - "crossbeam-utils", - "futures-channel", - "futures-core", - "futures-io", - "futures-lite", - "gloo-timers", - "kv-log-macro", - "log", - "memchr", - "once_cell", - "pin-project-lite", - "pin-utils", - "slab", - "wasm-bindgen-futures", -] +checksum = "1181e1e0d1fce796a03db1ae795d67167da795f9cf4a39c37589e85ef57f26d3" [[package]] -name = "async-stream" -version = "0.3.5" +name = "autocfg" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" -dependencies = [ - "async-stream-impl", - "futures-core", - "pin-project-lite", -] +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] -name = "async-stream-impl" -version = "0.3.5" +name = "backtrace" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.23", -] - -[[package]] -name = "async-task" -version = "4.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc7ab41815b3c653ccd2978ec3255c81349336702dfdf62ee6f7069b12a3aae" - -[[package]] -name = "async-trait" -version = "0.1.71" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a564d521dd56509c4c47480d00b80ee55f7e385ae48db5744c67ad50c92d2ebf" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.23", -] - -[[package]] -name = "async-tungstenite" -version = "0.22.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce01ac37fdc85f10a43c43bc582cbd566720357011578a935761075f898baf58" -dependencies = [ - "futures-io", - "futures-util", - "log", - "pin-project-lite", - "tungstenite", -] - -[[package]] -name = "atoi" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7c57d12312ff59c811c0643f4d80830505833c9ffaebd193d819392b265be8e" -dependencies = [ - "num-traits", -] - -[[package]] -name = "atomic-waker" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1181e1e0d1fce796a03db1ae795d67167da795f9cf4a39c37589e85ef57f26d3" - -[[package]] -name = "autocfg" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" - -[[package]] -name = "backtrace" -version = "0.3.68" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" dependencies = [ "addr2line", "cc", @@ -650,19 +293,6 @@ dependencies = [ "rustc-demangle", ] -[[package]] -name = "bae" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b8de67cc41132507eeece2584804efcb15f85ba516e34c944b7667f480397a" -dependencies = [ - "heck 0.3.3", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "base64" version = "0.13.1" @@ -677,18 +307,18 @@ checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" [[package]] name = "bevy" -version = "0.10.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b93f906133305915d63f04108e6873c1b93a6605fe374b8f3391f6bda093e396" +checksum = "329e344f835f5a9a4c46a6d1d57371f726aa2c482d1bd669b2b9c4eb1ee91fd7" dependencies = [ "bevy_internal", ] [[package]] name = "bevy_a11y" -version = "0.10.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037c4063f7dac1a5d596eb47f40782a04ca5838dc4274dbbadc90eb81efe5169" +checksum = "271b812e5734f5056a400f7d64592dd82d6c0e6179389c2f066f433ab8bc7692" dependencies = [ "accesskit", "bevy_app", @@ -696,15 +326,35 @@ dependencies = [ "bevy_ecs", ] +[[package]] +name = "bevy_animation" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab94187a1253433e14f175293d8a86ec1c2822fda2a17807908f11ec21f45f00" +dependencies = [ + "bevy_app", + "bevy_asset", + "bevy_core", + "bevy_ecs", + "bevy_hierarchy", + "bevy_math", + "bevy_reflect", + "bevy_render", + "bevy_time", + "bevy_transform", + "bevy_utils", +] + [[package]] name = "bevy_app" -version = "0.10.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01db46963eb9486f7884121527ec69751d0e448f9e1d5329e80ea3424118a31a" +checksum = "172d532ea812e5954fa814dae003c207f2a0b20c6e50431787c94a7159677ece" dependencies = [ "bevy_derive", "bevy_ecs", "bevy_reflect", + "bevy_tasks", "bevy_utils", "downcast-rs", "wasm-bindgen", @@ -713,24 +363,29 @@ dependencies = [ [[package]] name = "bevy_asset" -version = "0.10.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98609b4b0694a23bde0628aed626644967991f167aad9db2afb68dacb0017540" +checksum = "ccb2b67984088b23e223cfe9ec1befd89a110665a679acb06839bc4334ed37d6" dependencies = [ - "anyhow", + "async-broadcast", + "async-fs", + "async-lock", "bevy_app", - "bevy_diagnostic", + "bevy_asset_macros", "bevy_ecs", "bevy_log", "bevy_reflect", "bevy_tasks", "bevy_utils", "bevy_winit", + "blake3", "crossbeam-channel", "downcast-rs", - "fastrand", + "futures-io", + "futures-lite", "js-sys", - "parking_lot 0.12.1", + "parking_lot", + "ron", "serde", "thiserror", "wasm-bindgen", @@ -738,11 +393,41 @@ dependencies = [ "web-sys", ] +[[package]] +name = "bevy_asset_macros" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b3245193e90fc8abcf1059a467cb224501dcda083d114c67c10ac66b7171e3a" +dependencies = [ + "bevy_macro_utils", + "proc-macro2", + "quote", + "syn 2.0.29", +] + +[[package]] +name = "bevy_audio" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "478de80ff25cb7decbcb22797774d1597e8c32914e81431c67d64faadc08f84a" +dependencies = [ + "bevy_app", + "bevy_asset", + "bevy_derive", + "bevy_ecs", + "bevy_math", + "bevy_reflect", + "bevy_transform", + "bevy_utils", + "oboe", + "rodio", +] + [[package]] name = "bevy_core" -version = "0.10.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ee53d7b4691b57207d72e996992c995a53f3e8d21ca7151ca3956d9ce7d232e" +checksum = "025e6800b73048092a55c3611e9327ad4c4c17b60517ec1c0086bb40b4b19ea8" dependencies = [ "bevy_app", "bevy_ecs", @@ -755,40 +440,42 @@ dependencies = [ [[package]] name = "bevy_core_pipeline" -version = "0.10.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "093ae5ced77251602ad6e43521e2acc1a5570bf85b80f232f1a7fdd43b50f8d8" +checksum = "2e4b08a2d53ba62d9ec1fca3f7f4e0f556e9f59e1c8e63a4b7c2a18c0701152c" dependencies = [ "bevy_app", "bevy_asset", + "bevy_core", "bevy_derive", "bevy_ecs", + "bevy_log", "bevy_math", "bevy_reflect", "bevy_render", "bevy_transform", "bevy_utils", - "bitflags 1.3.2", + "bitflags 2.4.0", "radsort", "serde", ] [[package]] name = "bevy_derive" -version = "0.10.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff0add5ab4a6b2b7e86e18f9043bb48b6386faa3b56abaa0ed97a3d669a1992" +checksum = "24bf40259be12a1a24d9fd536f5ff18d31eeb5665b77e2732899783be6edc5d6" dependencies = [ "bevy_macro_utils", "quote", - "syn 1.0.109", + "syn 2.0.29", ] [[package]] name = "bevy_diagnostic" -version = "0.10.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64c778422643b0adee9e82abbd07e1e906eb9947c274a9b18e0f7fbf137d4c34" +checksum = "41b5a99a9fb6cd7d1eb1714fad193944a0317f0887a15cccb8309c8d37951132" dependencies = [ "bevy_app", "bevy_core", @@ -801,9 +488,9 @@ dependencies = [ [[package]] name = "bevy_ecs" -version = "0.10.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bed2f74687ccf13046c0f8e3b00dc61d7e656877b4a1380cf04635bb74d8e586" +checksum = "ae11a1f467c372b50e9d4b55e78370f5420c9db7416200cc441cc84f08174dd3" dependencies = [ "async-channel", "bevy_ecs_macros", @@ -816,36 +503,103 @@ dependencies = [ "fixedbitset", "rustc-hash", "serde", + "thiserror", "thread_local", ] [[package]] name = "bevy_ecs_macros" -version = "0.10.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97fd126a0db7b30fb1833614b3a657b44ac88485741c33b2780e25de0f96d78" +checksum = "f642c2b67c4d0daf8edf15074f6351457eb487a34b3de1290c760d8f3ac9ec16" dependencies = [ "bevy_macro_utils", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.29", ] [[package]] name = "bevy_encase_derive" -version = "0.10.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c086ebdc1f5522787d63772943277cc74a279445fb65db4d58c2c5330654648e" +checksum = "65b9fb5a62c4e3ab70caaa839470d35fa932001b1b34b08bc7f7f1909bd2b3a7" dependencies = [ "bevy_macro_utils", "encase_derive_impl", ] +[[package]] +name = "bevy_gilrs" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad31cc2c84315e0759d793d6c5bcb7d8789bbc16359c98d1b766e708c1bbae49" +dependencies = [ + "bevy_app", + "bevy_ecs", + "bevy_input", + "bevy_log", + "bevy_time", + "bevy_utils", + "gilrs", + "thiserror", +] + +[[package]] +name = "bevy_gizmos" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87d1cc978b91f416b23eb16f00e69f95c3a04582021827d8082e92d4725cc510" +dependencies = [ + "bevy_app", + "bevy_asset", + "bevy_core", + "bevy_core_pipeline", + "bevy_ecs", + "bevy_math", + "bevy_pbr", + "bevy_reflect", + "bevy_render", + "bevy_sprite", + "bevy_transform", + "bevy_utils", +] + +[[package]] +name = "bevy_gltf" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f933745c0c86e2c07948def581259b466f99708328657054e956275430ccfd7" +dependencies = [ + "base64 0.13.1", + "bevy_animation", + "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", + "serde", + "serde_json", + "thiserror", +] + [[package]] name = "bevy_hierarchy" -version = "0.10.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d04099865a13d1fd8bf3c044a80148cb3d23bfe8c3d5f082dda2ce091d85532" +checksum = "64fa240011fce8ee23f9b46e5a26a628a31d7860d6d2e4e0e361bb3ea6d5a703" dependencies = [ "bevy_app", "bevy_core", @@ -858,9 +612,9 @@ dependencies = [ [[package]] name = "bevy_input" -version = "0.10.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15d40aa636bb656967ac16ca36066ab7a7bb9179e1b0390c5705e54208e8fd7" +checksum = "9e86e241b3a10b79f65a69205552546723b855d3d4c1bd8261637c076144d32f" dependencies = [ "bevy_app", "bevy_ecs", @@ -872,17 +626,23 @@ dependencies = [ [[package]] name = "bevy_internal" -version = "0.10.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "862b11931c5874cb00778ffb715fc526ee49e52a493d3bcf50e8010f301858b3" +checksum = "55124e486814c4d3632d5cfad9c4f4e46d052c028593ec46fef5bfbfb0f840b1" dependencies = [ "bevy_a11y", + "bevy_animation", "bevy_app", + "bevy_asset", + "bevy_audio", "bevy_core", "bevy_core_pipeline", "bevy_derive", "bevy_diagnostic", "bevy_ecs", + "bevy_gilrs", + "bevy_gizmos", + "bevy_gltf", "bevy_hierarchy", "bevy_input", "bevy_log", @@ -891,18 +651,23 @@ dependencies = [ "bevy_ptr", "bevy_reflect", "bevy_render", + "bevy_scene", + "bevy_sprite", "bevy_tasks", + "bevy_text", "bevy_time", "bevy_transform", + "bevy_ui", "bevy_utils", "bevy_window", + "bevy_winit", ] [[package]] name = "bevy_log" -version = "0.10.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25980c90ceaad34d09a53291e72ca56fcc754a974cd4654fffcf5b68b283b7a7" +checksum = "011417debf7868b45932bb97fc0d5bfdeaf9304e324aa94840e2f1e6deeed69d" dependencies = [ "android_log-sys", "bevy_app", @@ -916,20 +681,22 @@ dependencies = [ [[package]] name = "bevy_macro_utils" -version = "0.10.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b2fee53b2497cdc3bffff2ddf52afa751242424a5fd0d51d227d4dab081d0d9" +checksum = "cf6fba87c6d069fcbcd8a48625ca8ab4392ad40d2b260863ce7d641a0f42986d" dependencies = [ + "proc-macro2", "quote", - "syn 1.0.109", - "toml_edit", + "rustc-hash", + "syn 2.0.29", + "toml_edit 0.20.7", ] [[package]] name = "bevy_math" -version = "0.10.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da6a1109d06fe947990db032e719e162414cf9bf7a478dcc52742f1c7136c42a" +checksum = "752764558a1f429c20704c3b836a019fa308961c43fdfef4f08e339d456c96be" dependencies = [ "glam", "serde", @@ -937,18 +704,18 @@ dependencies = [ [[package]] name = "bevy_mikktspace" -version = "0.10.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39106bc2ee21fce9496d2e15e0ba7925dff63e3eae10f7c1fc0094b56ad9f2bb" +checksum = "b596c41a56f2268ec7cde560edc588bc7b5886e4b49c8b27c4dcc9f7c743424c" dependencies = [ "glam", ] [[package]] name = "bevy_pbr" -version = "0.10.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f507cef55812aa70c2ec2b30fb996eb285fa7497d974cf03f76ec49c77fbe27" +checksum = "eeb6a35a78d355cc21c10f277dcd171eca65e30a90e76eb89f4dacf606621fe1" dependencies = [ "bevy_app", "bevy_asset", @@ -961,22 +728,26 @@ dependencies = [ "bevy_transform", "bevy_utils", "bevy_window", - "bitflags 1.3.2", + "bitflags 2.4.0", "bytemuck", + "fixedbitset", + "naga_oil", "radsort", + "smallvec", + "thread_local", ] [[package]] name = "bevy_ptr" -version = "0.10.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b88451d4c5a353bff67dbaa937b6886efd26ae114769c17f2b35099c7a4de" +checksum = "308a02679f6ce21ef71de20fae6d6a2016c07baa21d8e8d0558e6b7851e8adf2" [[package]] name = "bevy_reflect" -version = "0.10.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc3979471890e336f3ba87961ef3ecd45c331cf2cb2f582c885e541af228b48" +checksum = "cdd56914a8ad57621d7a1a099f7e6b1f7482c9c76cedc9c3d4c175a203939c5d" dependencies = [ "bevy_math", "bevy_ptr", @@ -985,34 +756,31 @@ dependencies = [ "downcast-rs", "erased-serde", "glam", - "once_cell", - "parking_lot 0.12.1", "serde", "smallvec", + "smol_str", "thiserror", ] [[package]] name = "bevy_reflect_derive" -version = "0.10.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bc7ea7c9bc2c531eb29ba5619976613d6680453ff5dd4a7fcd08848e8bec5ad" +checksum = "25f627907c40ac552f798423447fc331fc1ddacd94c5f7a2a70942eb06bc8447" dependencies = [ "bevy_macro_utils", - "bit-set", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.29", "uuid", ] [[package]] name = "bevy_render" -version = "0.10.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee1e126226f0a4d439bf82fe07c1104f894a6a365888e3eba7356f9647e77a83" +checksum = "90d777f4c51bd58e9e40777c6cb8dde0778df7e2c5298b3f9e3455bd12a9856c" dependencies = [ - "anyhow", "async-channel", "bevy_app", "bevy_asset", @@ -1031,90 +799,203 @@ dependencies = [ "bevy_transform", "bevy_utils", "bevy_window", - "bitflags 1.3.2", + "bitflags 2.4.0", + "bytemuck", "codespan-reporting", "downcast-rs", "encase", "futures-lite", "hexasphere", "image", + "js-sys", + "ktx2", "naga", - "once_cell", - "parking_lot 0.12.1", - "regex", + "naga_oil", + "ruzstd", "serde", "smallvec", "thiserror", "thread_local", + "wasm-bindgen", + "web-sys", "wgpu", - "wgpu-hal", ] [[package]] name = "bevy_render_macros" -version = "0.10.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "652f8c4d9577c6e6a8b3dfd8a4ce331e8b6ecdbb99636a4b2701dec50104d6bc" +checksum = "35b00c3d0abff94a729460fc9aa95c2ceac71b49b3041166bb5ba3098e9657e7" dependencies = [ "bevy_macro_utils", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.29", +] + +[[package]] +name = "bevy_scene" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6294396a6375f0b14341d8003408c10aa040e3f833ac8bd49677170ec55d73" +dependencies = [ + "bevy_app", + "bevy_asset", + "bevy_derive", + "bevy_ecs", + "bevy_hierarchy", + "bevy_reflect", + "bevy_render", + "bevy_transform", + "bevy_utils", + "ron", + "serde", + "thiserror", + "uuid", +] + +[[package]] +name = "bevy_sprite" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4f7d1f88a6e5497fdafd95c20984a1d1b5517bc39d51600b4988cd60c51837a" +dependencies = [ + "bevy_app", + "bevy_asset", + "bevy_core_pipeline", + "bevy_derive", + "bevy_ecs", + "bevy_log", + "bevy_math", + "bevy_reflect", + "bevy_render", + "bevy_transform", + "bevy_utils", + "bitflags 2.4.0", + "bytemuck", + "fixedbitset", + "guillotiere", + "radsort", + "rectangle-pack", + "thiserror", ] [[package]] name = "bevy_tasks" -version = "0.10.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3de86364316e151aeb0897eaaa917c3ad5ee5ef1471a939023cf7f2d5ab76955" +checksum = "3a45be906618192515bc613e46546150089adbb4a82178dc462045acd1e89e92" dependencies = [ "async-channel", "async-executor", "async-task", "concurrent-queue", "futures-lite", - "once_cell", "wasm-bindgen-futures", ] [[package]] -name = "bevy_time" -version = "0.10.1" +name = "bevy_text" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3edbd605df1bced312eb9888d6be3d5a5fcac3d4140038bbe3233d218399eef" +checksum = "c136af700af4f87c94f68d6e019528c371bf09ebf4a8ff7468bb3c73806b34f5" dependencies = [ + "ab_glyph", "bevy_app", + "bevy_asset", "bevy_ecs", + "bevy_math", "bevy_reflect", + "bevy_render", + "bevy_sprite", + "bevy_transform", "bevy_utils", - "crossbeam-channel", + "bevy_window", + "glyph_brush_layout", + "serde", "thiserror", ] [[package]] -name = "bevy_transform" -version = "0.10.1" +name = "bevy_time" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24383dfb97d8a14b17721ecfdf58556eff5ea9a4b2a3d91accf2b472783880b0" +checksum = "b29709cadf22d318a0b7c79f763e9c5ac414292bd0e850066fa935959021b276" dependencies = [ "bevy_app", "bevy_ecs", - "bevy_hierarchy", - "bevy_math", "bevy_reflect", + "bevy_utils", + "crossbeam-channel", + "thiserror", +] + +[[package]] +name = "bevy_transform" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70262c51e915b6224129206d23823364e650cf5eb5f4b6ce3ee379f608c180d2" +dependencies = [ + "bevy_app", + "bevy_ecs", + "bevy_hierarchy", + "bevy_math", + "bevy_reflect", + "thiserror", +] + +[[package]] +name = "bevy_twite" +version = "0.1.0" +source = "git+https://gitlab.com/ghostlyzsh/twite.git#6d54f37b7c392d2df993ee1cae2064b7ac410da7" +dependencies = [ + "bevy", + "crossbeam-channel", + "twite", +] + +[[package]] +name = "bevy_ui" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd5ecbf2dceaab118769dd870e34d780bfde556af561fd10d8d613b0f237297e" +dependencies = [ + "bevy_a11y", + "bevy_app", + "bevy_asset", + "bevy_core_pipeline", + "bevy_derive", + "bevy_ecs", + "bevy_hierarchy", + "bevy_input", + "bevy_log", + "bevy_math", + "bevy_reflect", + "bevy_render", + "bevy_sprite", + "bevy_text", + "bevy_transform", + "bevy_utils", + "bevy_window", + "bytemuck", + "serde", + "smallvec", + "taffy", + "thiserror", ] [[package]] name = "bevy_utils" -version = "0.10.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a88ebbca55d360d72e9fe78df0d22e25cd419933c9559e79dae2757f7c4d066" +checksum = "c8e75d4a34ef0b15dffd1ee9079ef1f0f5139527e192b9d5708b3e158777c753" dependencies = [ - "ahash 0.7.6", + "ahash", "bevy_utils_proc_macros", "getrandom", - "hashbrown 0.12.3", + "hashbrown 0.14.0", "instant", + "nonmax", "petgraph", "thiserror", "tracing", @@ -1123,21 +1004,22 @@ dependencies = [ [[package]] name = "bevy_utils_proc_macros" -version = "0.10.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630b92e32fa5cd7917c7d4fdbf63a90af958b01e096239f71bc4f8f3cf40c0d2" +checksum = "f7dfd3735a61a1b681ed1e176afe4eae731bbb03e51ad871e9eb39e76a2d170e" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.29", ] [[package]] name = "bevy_window" -version = "0.10.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad31234754268fbe12050290b0496e2296252a16995a38f94bfb9680a4f09fda" +checksum = "e60d1830b3fbd7db5bfea7ac9fcd0f5e1d1af88c91ab469e697ab176d8b3140b" dependencies = [ + "bevy_a11y", "bevy_app", "bevy_ecs", "bevy_input", @@ -1149,9 +1031,9 @@ dependencies = [ [[package]] name = "bevy_winit" -version = "0.10.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf17bd6330f7e633b7c56754c776511a8f52cde4bf54c0278f34d7527548f253" +checksum = "7f8294e78c6a1f9c34d36501a377c5d20bf0fa23a0958187bb270187741448ba" dependencies = [ "accesskit_winit", "approx", @@ -1162,10 +1044,10 @@ dependencies = [ "bevy_hierarchy", "bevy_input", "bevy_math", + "bevy_tasks", "bevy_utils", "bevy_window", "crossbeam-channel", - "once_cell", "raw-window-handle", "wasm-bindgen", "web-sys", @@ -1173,14 +1055,23 @@ dependencies = [ ] [[package]] -name = "bigdecimal" -version = "0.3.1" +name = "bindgen" +version = "0.69.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6773ddc0eafc0e509fb60e48dff7f450f8e674a0686ae8605e8d9901bd5eefa" +checksum = "9ffcebc3849946a7170a05992aac39da343a90676ab392c51a4280981d6379c2" dependencies = [ - "num-bigint", - "num-integer", - "num-traits", + "bitflags 2.4.0", + "cexpr", + "clang-sys", + "lazy_static", + "lazycell", + "peeking_take_while", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn 2.0.29", ] [[package]] @@ -1206,20 +1097,24 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.3.3" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" +checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" +dependencies = [ + "serde", +] [[package]] -name = "bitvec" -version = "1.0.1" +name = "blake3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +checksum = "0231f06152bf547e9c2b5194f247cd97aacf6dcd8b15d8e5ec0663f64580da87" dependencies = [ - "funty", - "radium", - "tap", - "wyz", + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", ] [[package]] @@ -1271,128 +1166,30 @@ dependencies = [ "log", ] -[[package]] -name = "borsh" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4114279215a005bc675e386011e594e1d9b800918cea18fcadadcce864a2046b" -dependencies = [ - "borsh-derive", - "hashbrown 0.13.2", -] - -[[package]] -name = "borsh-derive" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0754613691538d51f329cce9af41d7b7ca150bc973056f1156611489475f54f7" -dependencies = [ - "borsh-derive-internal", - "borsh-schema-derive-internal", - "proc-macro-crate 0.1.5", - "proc-macro2", - "syn 1.0.109", -] - -[[package]] -name = "borsh-derive-internal" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afb438156919598d2c7bad7e1c0adf3d26ed3840dbc010db1a882a65583ca2fb" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "borsh-schema-derive-internal" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634205cc43f74a1b9046ef87c4540ebda95696ec0f315024860cad7c5b0f5ccd" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "brotli" -version = "3.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1a0b1dbcc8ae29329621f8d4f0d835787c1c38bb1401979b49d13b0b305ff68" -dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", - "brotli-decompressor", -] - -[[package]] -name = "brotli-decompressor" -version = "2.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b6561fd3f895a11e8f72af2cb7d22e08366bebc2b6b57f7744c4bda27034744" -dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", -] - -[[package]] -name = "bstr" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05" -dependencies = [ - "memchr", - "serde", -] - [[package]] name = "bumpalo" version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" -[[package]] -name = "bytecheck" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6372023ac861f6e6dc89c8344a8f398fb42aaba2b5dbc649ca0c0e9dbcb627" -dependencies = [ - "bytecheck_derive", - "ptr_meta", - "simdutf8", -] - -[[package]] -name = "bytecheck_derive" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7ec4c6f261935ad534c0c22dbef2201b45918860eb1c574b972bd213a76af61" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "bytemuck" -version = "1.13.1" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" +checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.4.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdde5c9cd29ebd706ce1b35600920a33550e402fc998a2e53ad3b42c3c47a192" +checksum = "965ab7eb5f8f97d2a083c799f3a1b994fc397b2fe2da5d1da1626ce15a39f2b1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.23", + "syn 2.0.29", ] [[package]] @@ -1408,53 +1205,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" [[package]] -name = "bytestring" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "238e4886760d98c4f899360c834fa93e62cf7f721ac3c2da375cbdf4b8679aae" -dependencies = [ - "bytes", -] - -[[package]] -name = "camino" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c530edf18f37068ac2d977409ed5cd50d53d73bc653c7647b48eb78976ac9ae2" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo-platform" -version = "0.1.2" +name = "cc" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbdb825da8a5df079a43676dbe042702f1707b1109f713a01420fbb4cc71fa27" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" dependencies = [ - "serde", + "jobserver", + "libc", ] [[package]] -name = "cargo_metadata" -version = "0.15.4" +name = "cesu8" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eee4243f1f26fc7a42710e7439c149e2b10b05472f88090acce52632f231a73a" -dependencies = [ - "camino", - "cargo-platform", - "semver", - "serde", - "serde_json", - "thiserror", -] +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" [[package]] -name = "cc" -version = "1.0.79" +name = "cexpr" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" dependencies = [ - "jobserver", + "nom", ] [[package]] @@ -1470,74 +1242,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" [[package]] -name = "chrono" -version = "0.4.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5" -dependencies = [ - "android-tzdata", - "iana-time-zone", - "num-traits", - "serde", - "winapi", -] - -[[package]] -name = "chrono-tz" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c39203181991a7dd4343b8005bd804e7a9a37afb8ac070e43771e8c820bbde" -dependencies = [ - "chrono", - "chrono-tz-build", - "phf", -] - -[[package]] -name = "chrono-tz-build" -version = "0.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f509c3a87b33437b05e2458750a0700e5bdd6956176773e6c7d6dd15a283a0c" -dependencies = [ - "parse-zoneinfo", - "phf", - "phf_codegen", -] - -[[package]] -name = "clap" -version = "3.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" -dependencies = [ - "bitflags 1.3.2", - "clap_derive", - "clap_lex", - "indexmap 1.9.3", - "once_cell", - "textwrap", -] - -[[package]] -name = "clap_derive" -version = "3.2.25" +name = "clang-sys" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae6371b8bdc8b7d3959e9cf7b22d4435ef3e79e138688421ec654acf8c81b008" +checksum = "c688fc74432808e3eb684cae8830a86be1d66a2bd58e1f248ed0960a590baf6f" dependencies = [ - "heck 0.4.1", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "clap_lex" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" -dependencies = [ - "os_str_bytes", + "glob", + "libc", + "libloading 0.7.4", ] [[package]] @@ -1556,23 +1268,22 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" -[[package]] -name = "colored" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2674ec482fbc38012cf31e6c42ba0177b431a0cb6f15fe40efa5aab1bda516f6" -dependencies = [ - "is-terminal", - "lazy_static", - "windows-sys 0.48.0", -] - [[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4" +dependencies = [ + "bytes", + "memchr", +] + [[package]] name = "concurrent-queue" version = "2.2.0" @@ -1599,20 +1310,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6051f239ecec86fde3410901ab7860d458d160371533842974fc61f96d15879b" [[package]] -name = "convert_case" -version = "0.4.0" +name = "const_soft_float" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ca1caa64ef4ed453e68bb3db612e51cf1b2f5b871337f0fcab1c8f87cc3dff" + +[[package]] +name = "constant_time_eq" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" +checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" [[package]] -name = "cookie" -version = "0.16.2" +name = "constgebra" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb" +checksum = "edd23e864550e6dafc1e41ac78ce4f1ccddc8672b40c403524a04ff3f0518420" dependencies = [ - "percent-encoding", - "time", - "version_check", + "const_soft_float", ] [[package]] @@ -1640,7 +1355,7 @@ dependencies = [ "bitflags 1.3.2", "core-foundation", "core-graphics-types", - "foreign-types", + "foreign-types 0.3.2", "libc", ] @@ -1655,6 +1370,51 @@ dependencies = [ "libc", ] +[[package]] +name = "coreaudio-rs" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "321077172d79c662f64f5071a03120748d5bb652f5231570141be24cfcd2bace" +dependencies = [ + "bitflags 1.3.2", + "core-foundation-sys", + "coreaudio-sys", +] + +[[package]] +name = "coreaudio-sys" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3120ebb80a9de008e638ad833d4127d50ea3d3a960ea23ea69bc66d9358a028" +dependencies = [ + "bindgen", +] + +[[package]] +name = "cpal" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d959d90e938c5493000514b446987c07aed46c668faaa7d34d6c7a67b1a578c" +dependencies = [ + "alsa", + "core-foundation-sys", + "coreaudio-rs", + "dasp_sample", + "jni 0.19.0", + "js-sys", + "libc", + "mach2", + "ndk", + "ndk-context", + "oboe", + "once_cell", + "parking_lot", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows 0.46.0", +] + [[package]] name = "cpufeatures" version = "0.2.9" @@ -1674,22 +1434,8 @@ dependencies = [ ] [[package]] -name = "crossbeam" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2801af0d36612ae591caa9568261fddce32ce6e08a7275ea334a06a4ad021a2c" -dependencies = [ - "cfg-if", - "crossbeam-channel", - "crossbeam-deque", - "crossbeam-epoch", - "crossbeam-queue", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.8" +name = "crossbeam-channel" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" dependencies = [ @@ -1697,40 +1443,6 @@ dependencies = [ "crossbeam-utils", ] -[[package]] -name = "crossbeam-deque" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" -dependencies = [ - "cfg-if", - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" -dependencies = [ - "autocfg", - "cfg-if", - "crossbeam-utils", - "memoffset", - "scopeguard", -] - -[[package]] -name = "crossbeam-queue" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" -dependencies = [ - "cfg-if", - "crossbeam-utils", -] - [[package]] name = "crossbeam-utils" version = "0.8.16" @@ -1752,39 +1464,26 @@ dependencies = [ [[package]] name = "d3d12" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8f0de2f5a8e7bd4a9eec0e3c781992a4ce1724f68aec7d7a3715344de8b39da" +checksum = "e16e44ab292b1dddfdaf7be62cfd8877df52f2f3fde5858d95bab606be259f20" dependencies = [ - "bitflags 1.3.2", - "libloading", + "bitflags 2.4.0", + "libloading 0.8.1", "winapi", ] [[package]] -name = "data-encoding" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308" - -[[package]] -name = "derive_more" -version = "0.99.17" +name = "dasp_sample" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" -dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "rustc_version", - "syn 1.0.109", -] +checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f" [[package]] -name = "deunicode" -version = "0.4.3" +name = "data-encoding" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "850878694b7933ca4c9569d30a34b55031b9b139ee1fc7b94a527c4ef960d690" +checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308" [[package]] name = "digest" @@ -1794,27 +1493,6 @@ checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", - "subtle", -] - -[[package]] -name = "dirs" -version = "4.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-sys" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" -dependencies = [ - "libc", - "redox_users", - "winapi", ] [[package]] @@ -1823,29 +1501,17 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" -[[package]] -name = "dotenvy" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" - [[package]] name = "downcast-rs" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" -[[package]] -name = "either" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" - [[package]] name = "encase" -version = "0.5.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6591f13a63571c4821802eb5b10fd1155b1290bce87086440003841c8c3909b" +checksum = "8fce2eeef77fd4a293a54b62aa00ac9daebfbcda4bf8998c5a815635b004aa1c" dependencies = [ "const_panic", "encase_derive", @@ -1855,67 +1521,46 @@ dependencies = [ [[package]] name = "encase_derive" -version = "0.5.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f1da6deed1f8b6f5909616ffa695f63a5de54d6a0f084fa715c70c8ed3abac9" +checksum = "0e520cde08cbf4f7cc097f61573ec06ce467019803de8ae82fb2823fa1554a0e" dependencies = [ "encase_derive_impl", ] [[package]] name = "encase_derive_impl" -version = "0.5.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae489d58959f3c4cdd1250866a05acfb341469affe4fced71aff3ba228be1693" +checksum = "3fe2568f851fd6144a45fa91cfed8fe5ca8fc0b56ba6797bfc1ed2771b90e37c" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", -] - -[[package]] -name = "encoding_rs" -version = "0.8.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" -dependencies = [ - "cfg-if", + "syn 2.0.29", ] [[package]] name = "equivalent" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88bffebc5d80432c9b140ee17875ff173a8ab62faad5b257da912bd2f6c1c0a1" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "erased-serde" -version = "0.3.27" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f94c0e13118e7d7533271f754a168ae8400e6a1cc043f2bfd53cc7290f1a1de3" +checksum = "6c138974f9d5e7fe373eb04df7cae98833802ae4b11c24ac7039a21d5af4b26c" dependencies = [ "serde", ] [[package]] -name = "errno" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" -dependencies = [ - "errno-dragonfly", - "libc", - "windows-sys 0.48.0", -] - -[[package]] -name = "errno-dragonfly" -version = "0.1.2" +name = "euclid" +version = "0.22.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +checksum = "87f253bc5c813ca05792837a0ff4b3a580336b224512d48f7eda1d7dd9210787" dependencies = [ - "cc", - "libc", + "num-traits", ] [[package]] @@ -1933,6 +1578,15 @@ dependencies = [ "instant", ] +[[package]] +name = "fdeflate" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64d6dafc854908ff5da46ff3f8f473c6984119a2876a383a860246dd7841a868" +dependencies = [ + "simd-adler32", +] + [[package]] name = "fixedbitset" version = "0.4.2" @@ -1941,9 +1595,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.0.26" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" +checksum = "c6c98ee8095e9d1dcbf2fcc6d95acccb90d1c81db1e44725c6a984b1dbdfb010" dependencies = [ "crc32fast", "miniz_oxide", @@ -1961,53 +1615,49 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" dependencies = [ - "foreign-types-shared", + "foreign-types-shared 0.1.1", ] [[package]] -name = "foreign-types-shared" -version = "0.1.1" +name = "foreign-types" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared 0.3.1", +] [[package]] -name = "form_urlencoded" -version = "1.2.0" +name = "foreign-types-macros" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ - "percent-encoding", + "proc-macro2", + "quote", + "syn 2.0.29", ] [[package]] -name = "funty" -version = "2.0.0" +name = "foreign-types-shared" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] -name = "futures" -version = "0.3.28" +name = "foreign-types-shared" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" [[package]] -name = "futures-channel" -version = "0.3.28" +name = "form_urlencoded" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" dependencies = [ - "futures-core", - "futures-sink", + "percent-encoding", ] [[package]] @@ -2016,28 +1666,6 @@ version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" -[[package]] -name = "futures-executor" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-intrusive" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a604f7a68fbf8103337523b1fadc8ade7361ee3f112f7c680ad179651616aed5" -dependencies = [ - "futures-core", - "lock_api", - "parking_lot 0.11.2", -] - [[package]] name = "futures-io" version = "0.3.28" @@ -2059,56 +1687,6 @@ dependencies = [ "waker-fn", ] -[[package]] -name = "futures-macro" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.23", -] - -[[package]] -name = "futures-sink" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" - -[[package]] -name = "futures-task" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" - -[[package]] -name = "futures-util" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - [[package]] name = "generic-array" version = "0.14.7" @@ -2133,62 +1711,66 @@ dependencies = [ ] [[package]] -name = "gimli" -version = "0.27.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" - -[[package]] -name = "glam" -version = "0.23.0" +name = "gilrs" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e4afd9ad95555081e109fe1d21f2a30c691b5f0919c67dfa690a2e1eb6bd51c" +checksum = "9e9eec02069fcbd7abe00a28adf216547774889129a777cb5e53fdfb75d59f09" dependencies = [ - "bytemuck", - "serde", + "fnv", + "gilrs-core", + "log", + "uuid", + "vec_map", ] [[package]] -name = "globset" -version = "0.4.10" +name = "gilrs-core" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "029d74589adefde59de1a0c4f4732695c32805624aec7b68d91503d4dba79afc" +checksum = "178769da179a47b187837d1ab2b5b9b684a21180166a77a4ca37e7e58ee3833d" dependencies = [ - "aho-corasick 0.7.20", - "bstr", - "fnv", + "core-foundation", + "inotify", + "io-kit-sys", + "js-sys", + "libc", + "libudev-sys", "log", - "regex", + "nix 0.27.1", + "uuid", + "vec_map", + "wasm-bindgen", + "web-sys", + "windows 0.48.0", ] [[package]] -name = "globwalk" -version = "0.8.1" +name = "gimli" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93e3af942408868f6934a7b85134a3230832b9977cf66125df2f9edcfce4ddcc" -dependencies = [ - "bitflags 1.3.2", - "ignore", - "walkdir", -] +checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" [[package]] -name = "gloo-timers" -version = "0.2.6" +name = "glam" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" +checksum = "b5418c17512bdf42730f9032c74e1ae39afc408745ebb2acf72fbc4691c17945" dependencies = [ - "futures-channel", - "futures-core", - "js-sys", - "wasm-bindgen", + "bytemuck", + "serde", ] +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + [[package]] name = "glow" -version = "0.12.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "807edf58b70c0b5b2181dd39fe1839dbdb3ba02645630dc5f753e23da307f762" +checksum = "ca0fe580e4b60a8ab24a868bc08e2f03cbcb20d3d676601fa909386713333728" dependencies = [ "js-sys", "slotmap", @@ -2197,298 +1779,166 @@ dependencies = [ ] [[package]] -name = "gpu-alloc" -version = "0.5.4" +name = "gltf" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22beaafc29b38204457ea030f6fb7a84c9e4dd1b86e311ba0542533453d87f62" +checksum = "ad2dcfb6dd7a66f9eb3d181a29dcfb22d146b0bcdc2e1ed1713cbf03939a88ea" dependencies = [ - "bitflags 1.3.2", - "gpu-alloc-types", + "byteorder", + "gltf-json", + "lazy_static", ] [[package]] -name = "gpu-alloc-types" -version = "0.2.0" +name = "gltf-derive" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54804d0d6bc9d7f26db4eaec1ad10def69b599315f487d32c334a80d1efe67a5" +checksum = "f2cbcea5dd47e7ad4e9ee6f040384fcd7204bbf671aa4f9e7ca7dfc9bfa1de20" dependencies = [ - "bitflags 1.3.2", + "inflections", + "proc-macro2", + "quote", + "syn 2.0.29", ] [[package]] -name = "gpu-allocator" -version = "0.22.0" +name = "gltf-json" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce95f9e2e11c2c6fadfce42b5af60005db06576f231f5c92550fdded43c423e8" +checksum = "7d5b810806b78dde4b71a95cc0e6fdcab34c4c617da3574df166f9987be97d03" dependencies = [ - "backtrace", - "log", - "thiserror", - "winapi", - "windows 0.44.0", + "gltf-derive", + "serde", + "serde_derive", + "serde_json", ] [[package]] -name = "gpu-descriptor" +name = "glyph_brush_layout" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b0c02e1ba0bdb14e965058ca34e09c020f8e507a760df1121728e0aef68d57a" +checksum = "cc32c2334f00ca5ac3695c5009ae35da21da8c62d255b5b96d56e2597a637a38" dependencies = [ - "bitflags 1.3.2", - "gpu-descriptor-types", - "hashbrown 0.12.3", + "ab_glyph", + "approx", + "xi-unicode", ] [[package]] -name = "gpu-descriptor-types" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "363e3677e55ad168fef68cf9de3a4a310b53124c5e784c53a1d70e92d23f2126" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "h2" -version = "0.3.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap 1.9.3", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" -dependencies = [ - "ahash 0.7.6", - "serde", -] - -[[package]] -name = "hashbrown" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" -dependencies = [ - "ahash 0.8.3", -] - -[[package]] -name = "hashbrown" -version = "0.14.0" +name = "gpu-alloc" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" +checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" dependencies = [ - "ahash 0.8.3", - "allocator-api2", + "bitflags 2.4.0", + "gpu-alloc-types", ] [[package]] -name = "hashlink" -version = "0.8.3" +name = "gpu-alloc-types" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "312f66718a2d7789ffef4f4b7b213138ed9f1eb3aa1d0d82fc99f88fb3ffd26f" +checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" dependencies = [ - "hashbrown 0.14.0", + "bitflags 2.4.0", ] [[package]] -name = "hassle-rs" -version = "0.9.0" +name = "gpu-allocator" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90601c6189668c7345fc53842cb3f3a3d872203d523be1b3cb44a36a3e62fb85" +checksum = "ce95f9e2e11c2c6fadfce42b5af60005db06576f231f5c92550fdded43c423e8" dependencies = [ - "bitflags 1.3.2", - "com-rs", - "libc", - "libloading", + "backtrace", + "log", "thiserror", - "widestring", "winapi", + "windows 0.44.0", ] [[package]] -name = "heck" -version = "0.3.3" +name = "gpu-descriptor" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +checksum = "cc11df1ace8e7e564511f53af41f3e42ddc95b56fd07b3f4445d2a6048bc682c" dependencies = [ - "unicode-segmentation", + "bitflags 2.4.0", + "gpu-descriptor-types", + "hashbrown 0.14.0", ] [[package]] -name = "heck" -version = "0.4.1" +name = "gpu-descriptor-types" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +checksum = "6bf0b36e6f090b7e1d8a4b49c0cb81c1f8376f72198c65dd3ad9ff3556b8b78c" dependencies = [ - "unicode-segmentation", + "bitflags 2.4.0", ] [[package]] -name = "hermit-abi" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" - -[[package]] -name = "hex" -version = "0.4.3" +name = "grid" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +checksum = "eec1c01eb1de97451ee0d60de7d81cf1e72aabefb021616027f3d1c3ec1c723c" [[package]] -name = "hexasphere" -version = "8.1.0" +name = "guillotiere" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd41d443f978bfa380a6dad58b62a08c43bcb960631f13e9d015b911eaf73588" +checksum = "b62d5865c036cb1393e23c50693df631d3f5d7bcca4c04fe4cc0fd592e74a782" dependencies = [ - "glam", - "once_cell", + "euclid", + "svg_fmt", ] [[package]] -name = "hexf-parse" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" - -[[package]] -name = "hkdf" +name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437" -dependencies = [ - "hmac", -] - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest", -] - -[[package]] -name = "http" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" -dependencies = [ - "bytes", - "http", - "pin-project-lite", -] - -[[package]] -name = "http-range" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" - -[[package]] -name = "httparse" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" - -[[package]] -name = "httpdate" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" - -[[package]] -name = "humansize" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02296996cb8796d7c6e3bc2d9211b7802812d36999a51bb754123ead7d37d026" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] -name = "hyper" -version = "0.14.27" +name = "hashbrown" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" +checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", + "ahash", + "allocator-api2", + "serde", ] [[package]] -name = "hyper-tls" -version = "0.5.0" +name = "hassle-rs" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +checksum = "1397650ee315e8891a0df210707f0fc61771b0cc518c3023896064c5407cb3b0" dependencies = [ - "bytes", - "hyper", - "native-tls", - "tokio", - "tokio-native-tls", + "bitflags 1.3.2", + "com-rs", + "libc", + "libloading 0.7.4", + "thiserror", + "widestring", + "winapi", ] [[package]] -name = "iana-time-zone" -version = "0.1.57" +name = "hexasphere" +version = "9.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" +checksum = "7cb3df16a7bcb1b5bc092abd55e14f77ca70aea14445026e264586fc62889a10" dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows 0.48.0", + "constgebra", + "glam", ] [[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" +name = "hexf-parse" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] +checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" [[package]] name = "idna" @@ -2500,34 +1950,18 @@ dependencies = [ "unicode-normalization", ] -[[package]] -name = "ignore" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbe7873dab538a9a44ad79ede1faf5f30d49f9a5c883ddbab48bce81b64b7492" -dependencies = [ - "globset", - "lazy_static", - "log", - "memchr", - "regex", - "same-file", - "thread_local", - "walkdir", - "winapi-util", -] - [[package]] name = "image" -version = "0.24.6" +version = "0.24.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "527909aa81e20ac3a44803521443a765550f09b5130c2c2fa1ea59c2f8f50a3a" +checksum = "6f3dfdbdd72063086ff443e297b61695500514b1e41095b6fb9a5ab48a70a711" dependencies = [ "bytemuck", "byteorder", "color_quant", "num-rational", "num-traits", + "png", ] [[package]] @@ -2550,6 +1984,32 @@ dependencies = [ "hashbrown 0.14.0", ] +[[package]] +name = "inflections" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a257582fdcde896fd96463bf2d40eefea0580021c0712a0e2b028b60b47a837a" + +[[package]] +name = "inotify" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdd168d97690d0b8c412d6b6c10360277f4d7ee495c5d0d5d5fe0854923255cc" +dependencies = [ + "bitflags 1.3.2", + "inotify-sys", + "libc", +] + +[[package]] +name = "inotify-sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" +dependencies = [ + "libc", +] + [[package]] name = "instant" version = "0.1.12" @@ -2563,48 +2023,49 @@ dependencies = [ ] [[package]] -name = "io-lifetimes" -version = "1.0.11" +name = "io-kit-sys" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +checksum = "4769cb30e5dcf1710fc6730d3e94f78c47723a014a567de385e113c737394640" dependencies = [ - "hermit-abi", - "libc", - "windows-sys 0.48.0", + "core-foundation-sys", + "mach2", ] [[package]] -name = "ipnet" -version = "2.8.0" +name = "itoa" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] -name = "is-terminal" -version = "0.4.9" +name = "jni" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" +checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec" dependencies = [ - "hermit-abi", - "rustix 0.38.3", - "windows-sys 0.48.0", + "cesu8", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", ] [[package]] -name = "itertools" -version = "0.10.5" +name = "jni" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +checksum = "039022cdf4d7b1cf548d31f60ae783138e5fd42013f6271049d7df7afadef96c" dependencies = [ - "either", + "cesu8", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", ] -[[package]] -name = "itoa" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b02a5381cc465bd3041d84623d0fa3b66738b52b8e2fc3bab8ad63ab032f4a" - [[package]] name = "jni-sys" version = "0.3.0" @@ -2622,29 +2083,13 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.64" +version = "0.3.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +checksum = "54c0c35952f67de54bb584e9fd912b3023117cbafc0a77d8f3dee1fb5f572fe8" dependencies = [ "wasm-bindgen", ] -[[package]] -name = "jwt" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6204285f77fe7d9784db3fdc449ecce1a0114927a51d5a41c4c7a292011c015f" -dependencies = [ - "base64 0.13.1", - "crypto-common", - "digest", - "hmac", - "openssl", - "serde", - "serde_json", - "sha2", -] - [[package]] name = "khronos-egl" version = "4.1.0" @@ -2652,31 +2097,42 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c2352bd1d0bceb871cb9d40f24360c8133c11d7486b68b5381c1dd1a32015e3" dependencies = [ "libc", - "libloading", + "libloading 0.7.4", "pkg-config", ] [[package]] -name = "kv-log-macro" -version = "1.0.7" +name = "ktx2" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" +checksum = "87d65e08a9ec02e409d27a0139eaa6b9756b4d81fe7cde71f6941a83730ce838" dependencies = [ - "log", + "bitflags 1.3.2", ] -[[package]] -name = "language-tags" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" - [[package]] name = "lazy_static" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + +[[package]] +name = "lewton" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "777b48df9aaab155475a83a7df3070395ea1ac6902f5cd062b8f2b028075c030" +dependencies = [ + "byteorder", + "ogg", + "tinyvec", +] + [[package]] name = "libc" version = "0.2.147" @@ -2694,40 +2150,35 @@ dependencies = [ ] [[package]] -name = "libm" -version = "0.2.7" +name = "libloading" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4" +checksum = "c571b676ddfc9a8c12f1f3d3085a7b163966a8fd8098a90640953ce5f6170161" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] [[package]] -name = "linux-raw-sys" -version = "0.3.8" +name = "libredox" +version = "0.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" +checksum = "3af92c55d7d839293953fcd0fda5ecfe93297cfde6ffbdec13b41d99c0ba6607" +dependencies = [ + "bitflags 2.4.0", + "libc", + "redox_syscall 0.4.1", +] [[package]] -name = "linux-raw-sys" -version = "0.4.3" +name = "libudev-sys" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09fc20d2ca12cb9f044c93e3bd6d32d523e6e2ec3db4f7b2939cd99026ecd3f0" - -[[package]] -name = "local-channel" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f303ec0e94c6c54447f84f3b0ef7af769858a9c4ef56ef2a986d3dcd4c3fc9c" -dependencies = [ - "futures-core", - "futures-sink", - "futures-util", - "local-waker", -] - -[[package]] -name = "local-waker" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e34f76eb3611940e0e7d53a9aaa4e6a3151f69541a282fd0dad5571420c53ff1" +checksum = "3c8469b4a23b962c1396b9b451dda50ef5b283e8dd309d69033475fa9b334324" +dependencies = [ + "libc", + "pkg-config", +] [[package]] name = "lock_api" @@ -2741,11 +2192,17 @@ dependencies = [ [[package]] name = "log" -version = "0.4.19" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" + +[[package]] +name = "mach2" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" +checksum = "6d0d1830bcd151a6fc4aea1369af235b36c1528fe976b8ff678683c9995eade8" dependencies = [ - "value-bag", + "libc", ] [[package]] @@ -2766,68 +2223,25 @@ dependencies = [ "regex-automata 0.1.10", ] -[[package]] -name = "matrixmultiply" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "090126dc04f95dc0d1c1c91f61bdd474b3930ca064c1edc8a849da2c6cbe1e77" -dependencies = [ - "autocfg", - "rawpointer", -] - -[[package]] -name = "md-5" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6365506850d44bff6e2fbcb5176cf63650e48bd45ef2fe2665ae1570e0f4b9ca" -dependencies = [ - "digest", -] - [[package]] name = "memchr" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" -[[package]] -name = "memoffset" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" -dependencies = [ - "autocfg", -] - [[package]] name = "metal" -version = "0.24.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de11355d1f6781482d027a3b4d4de7825dcedb197bf573e0596d00008402d060" +checksum = "623b5e6cefd76e58f774bd3cc0c6f5c7615c58c03a97815245a25c3c9bdee318" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.4.0", "block", "core-graphics-types", - "foreign-types", + "foreign-types 0.5.0", "log", "objc", -] - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "mime_guess" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" -dependencies = [ - "mime", - "unicase", + "paste", ] [[package]] @@ -2843,6 +2257,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" dependencies = [ "adler", + "simd-adler32", ] [[package]] @@ -2859,18 +2274,17 @@ dependencies = [ [[package]] name = "naga" -version = "0.11.1" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c3d4269bcb7d50121097702fde1afb75f4ea8083aeb7a55688dcf289a853271" +checksum = "c1ceaaa4eedaece7e4ec08c55c640ba03dbb73fb812a6570a59bcf1930d0f70e" dependencies = [ "bit-set", - "bitflags 1.3.2", + "bitflags 2.4.0", "codespan-reporting", "hexf-parse", "indexmap 1.9.3", "log", "num-traits", - "petgraph", "pp-rs", "rustc-hash", "spirv", @@ -2880,48 +2294,23 @@ dependencies = [ ] [[package]] -name = "nalgebra" -version = "0.32.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d68d47bba83f9e2006d117a9a33af1524e655516b8919caac694427a6fb1e511" -dependencies = [ - "approx", - "matrixmultiply", - "nalgebra-macros", - "num-complex", - "num-rational", - "num-traits", - "simba", - "typenum", -] - -[[package]] -name = "nalgebra-macros" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d232c68884c0c99810a5a4d333ef7e47689cfd0edc85efc9e54e1e6bf5212766" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "native-tls" -version = "0.2.11" +name = "naga_oil" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +checksum = "4ac54c77b3529887f9668d3dd81e955e58f252b31a333f836e3548c06460b958" dependencies = [ - "lazy_static", - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", + "bit-set", + "codespan-reporting", + "data-encoding", + "indexmap 1.9.3", + "naga", + "once_cell", + "regex", + "regex-syntax 0.7.4", + "rustc-hash", + "thiserror", + "tracing", + "unicode-ident", ] [[package]] @@ -2953,6 +2342,28 @@ dependencies = [ "jni-sys", ] +[[package]] +name = "nix" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", +] + +[[package]] +name = "nix" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" +dependencies = [ + "bitflags 2.4.0", + "cfg-if", + "libc", +] + [[package]] name = "nom" version = "7.1.3" @@ -2963,6 +2374,12 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "nonmax" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e4a593ea4fffed8684ad13d75c82cf0b6dc2b88947e0ed85b9e70f555a7e422" + [[package]] name = "ntapi" version = "0.4.1" @@ -2982,26 +2399,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "num-bigint" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-complex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e0d21255c828d6f128a1e41534206671e8c3ea0c62f32291e808dc82cff17d" -dependencies = [ - "num-traits", -] - [[package]] name = "num-derive" version = "0.3.3" @@ -3036,22 +2433,11 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" dependencies = [ "autocfg", - "libm", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", ] [[package]] @@ -3078,7 +2464,7 @@ version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" dependencies = [ - "proc-macro-crate 1.3.1", + "proc-macro-crate", "proc-macro2", "quote", "syn 1.0.109", @@ -3090,19 +2476,10 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" dependencies = [ - "proc-macro-crate 1.3.1", + "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.23", -] - -[[package]] -name = "num_threads" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" -dependencies = [ - "libc", + "syn 2.0.29", ] [[package]] @@ -3152,130 +2529,81 @@ dependencies = [ [[package]] name = "object" -version = "0.31.1" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +checksum = "77ac5bbd07aea88c60a577a1ce218075ffd59208b2d7ca97adf9bfc5aeb21ebe" dependencies = [ "memchr", ] [[package]] -name = "once_cell" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" - -[[package]] -name = "openssl" -version = "0.10.55" +name = "oboe" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d" +checksum = "8868cc237ee02e2d9618539a23a8d228b9bb3fc2e7a5b11eed3831de77c395d0" dependencies = [ - "bitflags 1.3.2", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", + "jni 0.20.0", + "ndk", + "ndk-context", + "num-derive", + "num-traits", + "oboe-sys", ] [[package]] -name = "openssl-macros" -version = "0.1.1" +name = "oboe-sys" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +checksum = "7f44155e7fb718d3cfddcf70690b2b51ac4412f347cd9e4fbe511abe9cd7b5f2" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.23", + "cc", ] [[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - -[[package]] -name = "openssl-sys" -version = "0.9.90" +name = "ogg" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374533b0e45f3a7ced10fcaeccca020e66656bc03dac384f852e4e5a7a8104a6" +checksum = "6951b4e8bf21c8193da321bcce9c9dd2e13c858fe078bf9054a288b419ae5d6e" dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", + "byteorder", ] [[package]] -name = "optional" -version = "0.5.0" +name = "once_cell" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978aa494585d3ca4ad74929863093e87cac9790d81fe7aba2b3dc2890643a0fc" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "orbclient" -version = "0.3.45" +version = "0.3.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "221d488cd70617f1bd599ed8ceb659df2147d9393717954d82a0f5e8032a6ab1" +checksum = "52f0d54bde9774d3a51dcf281a5def240c71996bc6ca05d2c847ec8b2b216166" dependencies = [ - "redox_syscall 0.3.5", + "libredox", ] [[package]] -name = "os_str_bytes" -version = "6.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d5d9eb14b174ee9aa2ef96dc2b94637a2d4b6e7cb873c7e171f0c20c6cf3eac" - -[[package]] -name = "ouroboros" -version = "0.15.6" +name = "overload" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1358bd1558bd2a083fed428ffeda486fbfb323e698cdda7794259d592ca72db" -dependencies = [ - "aliasable", - "ouroboros_macro", -] +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] -name = "ouroboros_macro" -version = "0.15.6" +name = "owned_ttf_parser" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f7d21ccd03305a674437ee1248f3ab5d4b1db095cf1caf49f1713ddf61956b7" +checksum = "d4586edfe4c648c71797a74c84bacb32b52b212eff5dfe2bb9f2c599844023e7" dependencies = [ - "Inflector", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 1.0.109", + "ttf-parser", ] -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - [[package]] name = "parking" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14f2252c834a40ed9bb5422029649578e63aa341ac401f74e719dd1afda8394e" -[[package]] -name = "parking_lot" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" -dependencies = [ - "instant", - "lock_api", - "parking_lot_core 0.8.6", -] - [[package]] name = "parking_lot" version = "0.12.1" @@ -3283,21 +2611,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ "lock_api", - "parking_lot_core 0.9.8", -] - -[[package]] -name = "parking_lot_core" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" -dependencies = [ - "cfg-if", - "instant", - "libc", - "redox_syscall 0.2.16", - "smallvec", - "winapi", + "parking_lot_core", ] [[package]] @@ -3306,51 +2620,24 @@ version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" dependencies = [ - "backtrace", "cfg-if", "libc", - "petgraph", "redox_syscall 0.3.5", "smallvec", - "thread-id", - "windows-targets 0.48.1", -] - -[[package]] -name = "parry2d-f64" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f612055f319eb83e67841fdf00248eee26045a1759b5d94fa9c6ecce7c1e78d" -dependencies = [ - "approx", - "arrayvec", - "bitflags 1.3.2", - "downcast-rs", - "either", - "nalgebra", - "num-derive", - "num-traits", - "rustc-hash", - "simba", - "slab", - "smallvec", - "spade", + "windows-targets 0.48.5", ] [[package]] -name = "parse-zoneinfo" -version = "0.3.0" +name = "paste" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c705f256449c60da65e11ff6626e0c16a0a0b96aaa348de61376b249bc340f41" -dependencies = [ - "regex", -] +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" [[package]] -name = "paste" -version = "1.0.13" +name = "peeking_take_while" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4b27ab7be369122c218afc2079489cdcb4b517c0a3fc386ff11e1fedfcc2b35" +checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" [[package]] name = "percent-encoding" @@ -3359,139 +2646,47 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] -name = "pest" -version = "2.7.0" +name = "petgraph" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f73935e4d55e2abf7f130186537b19e7a4abc886a0252380b59248af473a3fc9" +checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" dependencies = [ - "thiserror", - "ucd-trie", + "fixedbitset", + "indexmap 2.0.0", ] [[package]] -name = "pest_derive" -version = "2.7.0" +name = "pin-project-lite" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aef623c9bbfa0eedf5a0efba11a5ee83209c326653ca31ff019bec3a95bfff2b" -dependencies = [ - "pest", - "pest_generator", -] +checksum = "12cc1b0bf1727a77a54b6654e7b5f1af8604923edc8b81885f8ec92f9e3f0a05" [[package]] -name = "pest_generator" -version = "2.7.0" +name = "pkg-config" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3e8cba4ec22bada7fc55ffe51e2deb6a0e0db2d0b7ab0b103acc80d2510c190" -dependencies = [ - "pest", - "pest_meta", - "proc-macro2", - "quote", - "syn 2.0.23", -] +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" [[package]] -name = "pest_meta" -version = "2.7.0" +name = "png" +version = "0.17.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a01f71cb40bd8bb94232df14b946909e14660e33fc05db3e50ae2a82d7ea0ca0" +checksum = "dd75bf2d8dd3702b9707cdbc56a5b9ef42cec752eb8b3bafc01234558442aa64" dependencies = [ - "once_cell", - "pest", - "sha2", + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", ] [[package]] -name = "petgraph" -version = "0.6.3" +name = "pp-rs" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dd7d28ee937e54fe3080c91faa1c3a46c06de6252988a7f4592ba2310ef22a4" +checksum = "bb458bb7f6e250e6eb79d5026badc10a3ebb8f9a15d1fff0f13d17c71f4d6dee" dependencies = [ - "fixedbitset", - "indexmap 1.9.3", -] - -[[package]] -name = "phf" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" -dependencies = [ - "phf_shared", -] - -[[package]] -name = "phf_codegen" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8d39688d359e6b34654d328e262234662d16cc0f60ec8dcbe5e718709342a5a" -dependencies = [ - "phf_generator", - "phf_shared", -] - -[[package]] -name = "phf_generator" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" -dependencies = [ - "phf_shared", - "rand", -] - -[[package]] -name = "phf_shared" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" -dependencies = [ - "siphasher", - "uncased", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkg-config" -version = "0.3.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" - -[[package]] -name = "polling" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" -dependencies = [ - "autocfg", - "bitflags 1.3.2", - "cfg-if", - "concurrent-queue", - "libc", - "log", - "pin-project-lite", - "windows-sys 0.48.0", -] - -[[package]] -name = "pp-rs" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb458bb7f6e250e6eb79d5026badc10a3ebb8f9a15d1fff0f13d17c71f4d6dee" -dependencies = [ - "unicode-xid", + "unicode-xid", ] [[package]] @@ -3500,15 +2695,6 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" -[[package]] -name = "proc-macro-crate" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" -dependencies = [ - "toml 0.5.11", -] - [[package]] name = "proc-macro-crate" version = "1.3.1" @@ -3516,171 +2702,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" dependencies = [ "once_cell", - "toml_edit", -] - -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", + "toml_edit 0.19.14", ] [[package]] name = "proc-macro2" -version = "1.0.63" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b368fba921b0dce7e60f5e04ec15e565b3303972b42bcfde1d0713b881959eb" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] [[package]] name = "profiling" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "332cd62e95873ea4f41f3dfd6bbbfc5b52aec892d7e8d534197c4720a0bbbab2" - -[[package]] -name = "protobuf" -version = "2.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "106dd99e98437432fed6519dedecfade6a06a73bb7b2a1e019fdd2bee5778d94" - -[[package]] -name = "protobuf" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b55bad9126f378a853655831eb7363b7b01b81d19f8cb1218861086ca4a1a61e" -dependencies = [ - "once_cell", - "protobuf-support", - "thiserror", -] - -[[package]] -name = "protobuf-codegen" -version = "2.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "033460afb75cf755fcfc16dfaed20b86468082a2ea24e05ac35ab4a099a017d6" -dependencies = [ - "protobuf 2.28.0", -] - -[[package]] -name = "protobuf-codegen" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd418ac3c91caa4032d37cb80ff0d44e2ebe637b2fb243b6234bf89cdac4901" -dependencies = [ - "anyhow", - "once_cell", - "protobuf 3.2.0", - "protobuf-parse", - "regex", - "tempfile", - "thiserror", -] - -[[package]] -name = "protobuf-parse" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d39b14605eaa1f6a340aec7f320b34064feb26c93aec35d6a9a2272a8ddfa49" -dependencies = [ - "anyhow", - "indexmap 1.9.3", - "log", - "protobuf 3.2.0", - "protobuf-support", - "tempfile", - "thiserror", - "which", -] - -[[package]] -name = "protobuf-support" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5d4d7b8601c814cfb36bcebb79f0e61e45e1e93640cf778837833bbed05c372" -dependencies = [ - "thiserror", -] - -[[package]] -name = "protoc" -version = "2.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0218039c514f9e14a5060742ecd50427f8ac4f85a6dc58f2ddb806e318c55ee" -dependencies = [ - "log", - "which", -] - -[[package]] -name = "protoc-rust" -version = "2.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22f8a182bb17c485f20bdc4274a8c39000a61024cfe461c799b50fec77267838" -dependencies = [ - "protobuf 2.28.0", - "protobuf-codegen 2.28.0", - "protoc", - "tempfile", -] - -[[package]] -name = "ptr_meta" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" -dependencies = [ - "ptr_meta_derive", -] - -[[package]] -name = "ptr_meta_derive" -version = "0.1.4" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] +checksum = "f89dff0959d98c9758c88826cc002e2c3d0b9dfac4139711d1f30de442f1139b" [[package]] name = "quote" -version = "1.0.29" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "573015e8ab27661678357f27dc26460738fd2b6c86e46f386fde94cb5d913105" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" dependencies = [ "proc-macro2", ] -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - [[package]] name = "radsort" version = "0.1.0" @@ -3723,27 +2771,6 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8a99fddc9f0ba0a85884b8d14e3592853e787d581ca1816c91349b10e4eeab" -[[package]] -name = "rapier2d-f64" -version = "0.17.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "392a5f19aead4a587efae46873e42abd8f95044cae99d029e2cc11f1c12a6bb4" -dependencies = [ - "approx", - "arrayvec", - "bit-vec", - "bitflags 1.3.2", - "crossbeam", - "downcast-rs", - "nalgebra", - "num-derive", - "num-traits", - "parry2d-f64", - "rustc-hash", - "simba", - "vec_map", -] - [[package]] name = "raw-window-handle" version = "0.5.2" @@ -3751,19 +2778,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" [[package]] -name = "rawpointer" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" - -[[package]] -name = "redox_syscall" -version = "0.2.16" +name = "rectangle-pack" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags 1.3.2", -] +checksum = "a0d463f2884048e7153449a55166f91028d5b0ea53c79377099ce4e8cf0cf9bb" [[package]] name = "redox_syscall" @@ -3775,26 +2793,24 @@ dependencies = [ ] [[package]] -name = "redox_users" -version = "0.4.3" +name = "redox_syscall" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ - "getrandom", - "redox_syscall 0.2.16", - "thiserror", + "bitflags 1.3.2", ] [[package]] name = "regex" -version = "1.9.0" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89089e897c013b3deb627116ae56a6955a72b8bed395c9526af31c9fe528b484" +checksum = "81bc1d4caf89fac26a70747fe603c130093b53c773888797a6329091246d651a" dependencies = [ - "aho-corasick 1.0.2", + "aho-corasick", "memchr", - "regex-automata 0.3.0", - "regex-syntax 0.7.3", + "regex-automata 0.3.6", + "regex-syntax 0.7.4", ] [[package]] @@ -3808,13 +2824,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.3.0" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa250384981ea14565685dea16a9ccc4d1c541a13f82b9c168572264d1df8c56" +checksum = "fed1ceff11a1dddaee50c9dc8e4938bd106e9d89ae372f192311e7da498e3b69" dependencies = [ - "aho-corasick 1.0.2", + "aho-corasick", "memchr", - "regex-syntax 0.7.3", + "regex-syntax 0.7.4", ] [[package]] @@ -3825,127 +2841,58 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab07dc67230e4a4718e70fd5c20055a4334b121f1f9db8fe63ef39ce9b8c846" - -[[package]] -name = "rend" -version = "0.4.0" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581008d2099240d37fb08d77ad713bcaec2c4d89d50b5b21a8bb1996bbab68ab" -dependencies = [ - "bytecheck", -] +checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" [[package]] name = "renderdoc-sys" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1382d1f0a252c4bf97dc20d979a2fdd05b024acd7c2ed0f7595d7817666a157" - -[[package]] -name = "reqwest" -version = "0.11.18" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55" -dependencies = [ - "base64 0.21.2", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "hyper", - "hyper-tls", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "serde", - "serde_json", - "serde_urlencoded", - "tokio", - "tokio-native-tls", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "winreg", -] +checksum = "216080ab382b992234dda86873c18d4c48358f5cfcb70fd693d7f6f2131b628b" [[package]] -name = "ring" -version = "0.16.20" +name = "rmp" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +checksum = "7f9860a6cc38ed1da53456442089b4dfa35e7cedaa326df63017af88385e6b20" dependencies = [ - "cc", - "libc", - "once_cell", - "spin", - "untrusted", - "web-sys", - "winapi", + "byteorder", + "num-traits", + "paste", ] [[package]] -name = "rkyv" -version = "0.7.42" +name = "rmp-serde" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0200c8230b013893c0b2d6213d6ec64ed2b9be2e0e016682b7224ff82cff5c58" +checksum = "bffea85eea980d8a74453e5d02a8d93028f3c34725de143085a844ebe953258a" dependencies = [ - "bitvec", - "bytecheck", - "hashbrown 0.12.3", - "ptr_meta", - "rend", - "rkyv_derive", - "seahash", - "tinyvec", - "uuid", + "byteorder", + "rmp", + "serde", ] [[package]] -name = "rkyv_derive" -version = "0.7.42" +name = "rodio" +version = "0.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2e06b915b5c230a17d7a736d1e2e63ee753c256a8614ef3f5147b13a4f5541d" +checksum = "3b1bb7b48ee48471f55da122c0044fcc7600cfcc85db88240b89cb832935e611" dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", + "cpal", + "lewton", ] [[package]] -name = "robust" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5864e7ef1a6b7bcf1d6ca3f655e65e724ed3b52546a0d0a663c991522f552ea" - -[[package]] -name = "rust_decimal" -version = "1.30.0" +name = "ron" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0446843641c69436765a35a5a77088e28c2e6a12da93e84aa3ab1cd4aa5a042" +checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94" dependencies = [ - "arrayvec", - "borsh", - "bytecheck", - "byteorder", - "bytes", - "num-traits", - "rand", - "rkyv", + "base64 0.21.2", + "bitflags 2.4.0", "serde", - "serde_json", + "serde_derive", ] [[package]] @@ -3961,352 +2908,62 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] -name = "rustc_version" +name = "ruzstd" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +checksum = "ac3ffab8f9715a0d455df4bbb9d21e91135aab3cd3ca187af0cd0c3c3f868fdc" dependencies = [ - "semver", + "byteorder", + "thiserror-core", + "twox-hash", ] [[package]] -name = "rustix" -version = "0.37.23" +name = "ryu" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06" -dependencies = [ - "bitflags 1.3.2", - "errno", - "io-lifetimes", - "libc", - "linux-raw-sys 0.3.8", - "windows-sys 0.48.0", -] +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" [[package]] -name = "rustix" -version = "0.38.3" +name = "same-file" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac5ffa1efe7548069688cd7028f32591853cd7b5b756d41bcffd2353e4fc75b4" -dependencies = [ - "bitflags 2.3.3", - "errno", - "libc", - "linux-raw-sys 0.4.3", - "windows-sys 0.48.0", -] - -[[package]] -name = "rustls" -version = "0.20.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f" -dependencies = [ - "log", - "ring", - "sct", - "webpki", -] - -[[package]] -name = "rustls-pemfile" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" -dependencies = [ - "base64 0.21.2", -] - -[[package]] -name = "rustversion" -version = "1.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc31bd9b61a32c31f9650d18add92aa83a49ba979c143eefd27fe7177b05bd5f" - -[[package]] -name = "ryu" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe232bdf6be8c8de797b22184ee71118d63780ea42ac85b61d1baa6d3b782ae9" - -[[package]] -name = "safe_arch" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62a7484307bd40f8f7ccbacccac730108f2cae119a3b11c74485b48aa9ea650f" -dependencies = [ - "bytemuck", -] - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" dependencies = [ "winapi-util", ] -[[package]] -name = "schannel" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" -dependencies = [ - "windows-sys 0.48.0", -] - [[package]] name = "scopeguard" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" - -[[package]] -name = "sct" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "sea-orm" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fade86e8d41fd1a4721f84cb834f4ca2783f973cc30e6212b7fafc134f169214" -dependencies = [ - "async-stream", - "async-trait", - "bigdecimal", - "chrono", - "futures", - "log", - "ouroboros", - "rust_decimal", - "sea-orm-macros", - "sea-query", - "sea-query-binder", - "sea-strum", - "serde", - "serde_json", - "sqlx", - "thiserror", - "time", - "tracing", - "url", - "uuid", -] - -[[package]] -name = "sea-orm-cli" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efbf34a2caf70c2e3be9bb1e674e9540f6dfd7c8f40f6f05daf3b9740e476005" -dependencies = [ - "chrono", - "clap", - "dotenvy", - "regex", - "sea-schema", - "tracing", - "tracing-subscriber", - "url", -] - -[[package]] -name = "sea-orm-macros" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28936f26d62234ff0be16f80115dbdeb3237fe9c25cf18fbcd1e3b3592360f20" -dependencies = [ - "bae", - "heck 0.3.3", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "sea-orm-migration" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "278d3adfd0832b6ffc17d3cfbc574d3695a5c1b38814e0bc8ac238d33f3d87cf" -dependencies = [ - "async-trait", - "clap", - "dotenvy", - "futures", - "sea-orm", - "sea-orm-cli", - "sea-schema", - "tracing", - "tracing-subscriber", -] - -[[package]] -name = "sea-query" -version = "0.28.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbab99b8cd878ab7786157b7eb8df96333a6807cc6e45e8888c85b51534b401a" -dependencies = [ - "bigdecimal", - "chrono", - "rust_decimal", - "sea-query-derive", - "serde_json", - "time", - "uuid", -] - -[[package]] -name = "sea-query-binder" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cea85029985b40dfbf18318d85fe985c04db7c1b4e5e8e0a0a0cdff5f1e30f9" -dependencies = [ - "bigdecimal", - "chrono", - "rust_decimal", - "sea-query", - "serde_json", - "sqlx", - "time", - "uuid", -] - -[[package]] -name = "sea-query-derive" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63f62030c60f3a691f5fe251713b4e220b306e50a71e1d6f9cce1f24bb781978" -dependencies = [ - "heck 0.4.1", - "proc-macro2", - "quote", - "syn 1.0.109", - "thiserror", -] - -[[package]] -name = "sea-schema" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeb2940bb5a10bc6cd05b450ce6cd3993e27fddd7eface2becb97fc5af3a040e" -dependencies = [ - "futures", - "sea-query", - "sea-schema-derive", -] - -[[package]] -name = "sea-schema-derive" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56821b7076f5096b8f726e2791ad255a99c82498e08ec477a65a96c461ff1927" -dependencies = [ - "heck 0.3.3", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "sea-strum" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "391d06a6007842cfe79ac6f7f53911b76dfd69fc9a6769f1cf6569d12ce20e1b" -dependencies = [ - "sea-strum_macros", -] - -[[package]] -name = "sea-strum_macros" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69b4397b825df6ccf1e98bcdabef3bbcfc47ff5853983467850eeab878384f21" -dependencies = [ - "heck 0.3.3", - "proc-macro2", - "quote", - "rustversion", - "syn 1.0.109", -] - -[[package]] -name = "seahash" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" - -[[package]] -name = "security-framework" -version = "2.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fc758eb7bffce5b308734e9b0c1468893cae9ff70ebf13e7090be8dcbcc83a8" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f51d0c0d83bec45f16480d0ce0058397a69e48fcdc52d1dc8855fb68acbd31a7" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "sedregex" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19411e23596093f03bbd11dc45603b6329bb4bfec77b9fd13e2b9fc9b02efe3e" -dependencies = [ - "regex", -] - -[[package]] -name = "semver" -version = "1.0.17" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" -dependencies = [ - "serde", -] +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "serde" -version = "1.0.167" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7daf513456463b42aa1d94cff7e0c24d682b429f020b9afa4f5ba5c40a22b237" +checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.167" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b69b106b68bc8054f0e974e70d19984040f8a5cf9215ca82626ea4853f82c4b9" +checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.23", + "syn 2.0.29", ] [[package]] name = "serde_json" -version = "1.0.100" +version = "1.0.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f1e14e89be7aa4c4b78bdbdc9eb5bf8517829a600ae8eaa39a6e1d960b5185c" +checksum = "693151e1ac27563d6dbcec9dee9fbd5da8539b20fa14ad3752b2e6d363ace360" dependencies = [ "itoa", "ryu", @@ -4314,23 +2971,13 @@ dependencies = [ ] [[package]] -name = "serde_spanned" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +name = "server" +version = "0.0.1" dependencies = [ - "form_urlencoded", - "itoa", - "ryu", + "bevy", + "bevy_twite", + "rmp", + "rmp-serde", "serde", ] @@ -4345,17 +2992,6 @@ dependencies = [ "digest", ] -[[package]] -name = "sha2" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - [[package]] name = "sharded-slab" version = "0.1.4" @@ -4366,56 +3002,22 @@ dependencies = [ ] [[package]] -name = "signal-hook-registry" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" -dependencies = [ - "libc", -] - -[[package]] -name = "simba" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "061507c94fc6ab4ba1c9a0305018408e312e17c041eb63bef8aa726fa33aceae" -dependencies = [ - "approx", - "num-complex", - "num-traits", - "paste", - "wide", -] - -[[package]] -name = "simdutf8" -version = "0.1.4" +name = "shlex" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" +checksum = "a7cee0529a6d40f580e7a5e6c495c8fbfe21b7b52795ed4bb5e62cdf92bc6380" [[package]] -name = "simple_logger" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2230cd5c29b815c9b699fb610b49a5ed65588f3509d9f0108be3a885da629333" -dependencies = [ - "colored", - "log", - "time", - "windows-sys 0.42.0", -] - -[[package]] -name = "siphasher" -version = "0.3.10" +name = "simd-adler32" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" [[package]] name = "slab" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ "autocfg", ] @@ -4429,15 +3031,6 @@ dependencies = [ "version_check", ] -[[package]] -name = "slug" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3bc762e6a4b6c6fcaade73e77f9ebc6991b676f88bb2358bddb56560f073373" -dependencies = [ - "deunicode", -] - [[package]] name = "smallvec" version = "1.11.0" @@ -4448,42 +3041,14 @@ dependencies = [ ] [[package]] -name = "socket2" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "spacetime" -version = "0.1.0" -dependencies = [ - "sedregex", - "tabwriter", - "which", -] - -[[package]] -name = "spade" -version = "2.2.0" +name = "smol_str" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88e65803986868d2372c582007c39ba89936a36ea5f236bf7a7728dc258f04f9" +checksum = "74212e6bbe9a4352329b2f68ba3130c15a3f26fe88ff22dbdc6cdd58fa85e99c" dependencies = [ - "num-traits", - "optional", - "robust", - "smallvec", + "serde", ] -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - [[package]] name = "spirv" version = "0.2.0+1.5.4" @@ -4494,190 +3059,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "sqlformat" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c12bc9199d1db8234678b7051747c07f517cdcf019262d1847b94ec8b1aee3e" -dependencies = [ - "itertools", - "nom", - "unicode_categories", -] - -[[package]] -name = "sqlx" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8de3b03a925878ed54a954f621e64bf55a3c1bd29652d0d1a17830405350188" -dependencies = [ - "sqlx-core", - "sqlx-macros", -] - -[[package]] -name = "sqlx-core" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa8241483a83a3f33aa5fff7e7d9def398ff9990b2752b6c6112b83c6d246029" -dependencies = [ - "ahash 0.7.6", - "atoi", - "base64 0.13.1", - "bigdecimal", - "bitflags 1.3.2", - "byteorder", - "bytes", - "chrono", - "crossbeam-queue", - "dirs", - "dotenvy", - "either", - "event-listener", - "futures-channel", - "futures-core", - "futures-intrusive", - "futures-util", - "hashlink", - "hex", - "hkdf", - "hmac", - "indexmap 1.9.3", - "itoa", - "libc", - "log", - "md-5", - "memchr", - "num-bigint", - "once_cell", - "paste", - "percent-encoding", - "rand", - "rust_decimal", - "rustls", - "rustls-pemfile", - "serde", - "serde_json", - "sha1", - "sha2", - "smallvec", - "sqlformat", - "sqlx-rt", - "stringprep", - "thiserror", - "time", - "tokio-stream", - "url", - "uuid", - "webpki-roots", - "whoami", -] - -[[package]] -name = "sqlx-macros" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9966e64ae989e7e575b19d7265cb79d7fc3cbbdf179835cb0d716f294c2049c9" -dependencies = [ - "dotenvy", - "either", - "heck 0.4.1", - "once_cell", - "proc-macro2", - "quote", - "serde_json", - "sqlx-core", - "sqlx-rt", - "syn 1.0.109", - "url", -] - -[[package]] -name = "sqlx-rt" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "804d3f245f894e61b1e6263c84b23ca675d96753b5abfd5cc8597d86806e8024" -dependencies = [ - "once_cell", - "tokio", - "tokio-rustls", -] - -[[package]] -name = "starkingdoms-api" -version = "0.1.0" -dependencies = [ - "actix-cors", - "actix-files", - "actix-request-identifier", - "actix-web", - "hmac", - "jwt", - "log", - "once_cell", - "openssl", - "reqwest", - "sea-orm", - "serde", - "sha2", - "simple_logger", - "starkingdoms-protocol", - "starkingdoms_api_entities", - "starkingdoms_api_migration", - "tera", - "toml 0.7.6", - "ulid", -] - -[[package]] -name = "starkingdoms-protocol" -version = "0.1.0" -dependencies = [ - "protobuf 3.2.0", - "protobuf-codegen 3.2.0", - "protoc-rust", - "serde", -] - -[[package]] -name = "starkingdoms-server" -version = "0.0.1" -dependencies = [ - "async-std", - "async-tungstenite", - "bevy", - "cargo_metadata", - "futures", - "lazy_static", - "log", - "nalgebra", - "parking_lot 0.12.1", - "protobuf 3.2.0", - "rand", - "rapier2d-f64", - "reqwest", - "serde", - "serde_json", - "simple_logger", - "starkingdoms-protocol", - "tungstenite", -] - -[[package]] -name = "starkingdoms_api_entities" -version = "0.1.0" -dependencies = [ - "sea-orm", -] - -[[package]] -name = "starkingdoms_api_migration" -version = "0.1.0" -dependencies = [ - "async-std", - "sea-orm-migration", -] - [[package]] name = "static_assertions" version = "1.1.0" @@ -4685,20 +3066,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] -name = "stringprep" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ee348cb74b87454fff4b551cbf727025810a004f88aeacae7f85b87f4e9a1c1" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "subtle" -version = "2.5.0" +name = "svg_fmt" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +checksum = "8fb1df15f412ee2e9dfc1c504260fa695c1c3f10fe9f4a6ee2d2184d7d6450e2" [[package]] name = "syn" @@ -4713,9 +3084,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.23" +version = "2.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59fb7d6d8281a51045d62b8eb3a7d1ce347b76f312af50cd3dc0af39c87c1737" +checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a" dependencies = [ "proc-macro2", "quote", @@ -4724,9 +3095,9 @@ dependencies = [ [[package]] name = "sysinfo" -version = "0.28.4" +version = "0.29.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c2f3ca6693feb29a89724516f016488e9aafc7f37264f898593ee4b942f31b" +checksum = "0a18d114d420ada3a891e6bc8e96a2023402203296a47cdd65083377dad18ba5" dependencies = [ "cfg-if", "core-foundation-sys", @@ -4737,269 +3108,118 @@ dependencies = [ ] [[package]] -name = "tabwriter" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36205cfc997faadcc4b0b87aaef3fbedafe20d38d4959a7ca6ff803564051111" -dependencies = [ - "unicode-width", -] - -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[package]] -name = "tempfile" -version = "3.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31c0432476357e58790aaa47a8efb0c5138f137343f3b5f23bd36a27e3b0a6d6" -dependencies = [ - "autocfg", - "cfg-if", - "fastrand", - "redox_syscall 0.3.5", - "rustix 0.37.23", - "windows-sys 0.48.0", -] - -[[package]] -name = "tera" -version = "1.17.1" +name = "taffy" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3df578c295f9ec044ff1c829daf31bb7581d5b3c2a7a3d87419afe1f2531438c" +checksum = "3c2287b6d7f721ada4cddf61ade5e760b2c6207df041cac9bfaa192897362fd3" dependencies = [ - "chrono", - "chrono-tz", - "globwalk", - "humansize", - "lazy_static", - "percent-encoding", - "pest", - "pest_derive", - "rand", - "regex", - "serde", - "serde_json", - "slug", - "unic-segment", + "arrayvec", + "grid", + "num-traits", + "slotmap", ] [[package]] name = "termcolor" -version = "1.2.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" +checksum = "ff1bc3d3f05aff0403e8ac0d92ced918ec05b666a43f83297ccef5bea8a3d449" dependencies = [ "winapi-util", ] [[package]] -name = "textwrap" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" - -[[package]] -name = "thiserror" -version = "1.0.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a35fc5b8971143ca348fa6df4f024d4d55264f3468c71ad1c2f365b0a4d58c42" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "463fe12d7993d3b327787537ce8dd4dfa058de32fc2b195ef3cde03dc4771e8f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.23", -] - -[[package]] -name = "thread-id" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ee93aa2b8331c0fec9091548843f2c90019571814057da3b783f9de09349d73" -dependencies = [ - "libc", - "redox_syscall 0.2.16", - "winapi", -] - -[[package]] -name = "thread_local" -version = "1.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" -dependencies = [ - "cfg-if", - "once_cell", -] - -[[package]] -name = "time" -version = "0.3.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea9e1b3cf1243ae005d9e74085d4d542f3125458f3a81af210d901dcd7411efd" -dependencies = [ - "itoa", - "libc", - "num_threads", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" - -[[package]] -name = "time-macros" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "372950940a5f07bf38dbe211d7283c9e6d7327df53794992d293e534c733d09b" -dependencies = [ - "time-core", -] - -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "tokio" -version = "1.29.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" -dependencies = [ - "autocfg", - "backtrace", - "bytes", - "libc", - "mio", - "num_cpus", - "parking_lot 0.12.1", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "windows-sys 0.48.0", -] - -[[package]] -name = "tokio-native-tls" -version = "0.3.1" +name = "thiserror" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +checksum = "97a802ec30afc17eee47b2855fc72e0c4cd62be9b4efe6591edde0ec5bd68d8f" dependencies = [ - "native-tls", - "tokio", + "thiserror-impl", ] [[package]] -name = "tokio-rustls" -version = "0.23.4" +name = "thiserror-core" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" +checksum = "0d97345f6437bb2004cd58819d8a9ef8e36cdd7661c2abc4bbde0a7c40d9f497" dependencies = [ - "rustls", - "tokio", - "webpki", + "thiserror-core-impl", ] [[package]] -name = "tokio-stream" -version = "0.1.14" +name = "thiserror-core-impl" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" +checksum = "10ac1c5050e43014d16b2f94d0d2ce79e65ffdd8b38d8048f9c8f6a8a6da62ac" dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] -name = "tokio-util" -version = "0.7.8" +name = "thiserror-impl" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" +checksum = "6bb623b56e39ab7dcd4b1b98bb6c8f8d907ed255b18de254088016b27a8ee19b" dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", - "tracing", + "proc-macro2", + "quote", + "syn 2.0.29", ] [[package]] -name = "toml" -version = "0.5.11" +name = "thread_local" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" dependencies = [ - "serde", + "cfg-if", + "once_cell", ] [[package]] -name = "toml" -version = "0.7.6" +name = "tinyvec" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17e963a819c331dcacd7ab957d80bc2b9a9c1e71c804826d2f283dd65306542" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit", + "tinyvec_macros", ] +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + [[package]] name = "toml_datetime" -version = "0.6.3" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" -dependencies = [ - "serde", -] +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" [[package]] name = "toml_edit" -version = "0.19.12" +version = "0.19.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c500344a19072298cd05a7224b3c0c629348b78692bf48466c5238656e315a78" +checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a" dependencies = [ "indexmap 2.0.0", - "serde", - "serde_spanned", "toml_datetime", "winnow", ] [[package]] -name = "tower-service" -version = "0.3.2" +name = "toml_edit" +version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" +dependencies = [ + "indexmap 2.0.0", + "toml_datetime", + "winnow", +] [[package]] name = "tracing" @@ -5008,7 +3228,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ "cfg-if", - "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -5022,7 +3241,7 @@ checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.23", + "syn 2.0.29", ] [[package]] @@ -5037,12 +3256,12 @@ dependencies = [ [[package]] name = "tracing-log" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" +checksum = "f751112709b4e791d8ce53e32c4ed2d353565a795ce84da2285393f41557bdf2" dependencies = [ - "lazy_static", "log", + "once_cell", "tracing-core", ] @@ -5076,118 +3295,37 @@ dependencies = [ ] [[package]] -name = "try-lock" -version = "0.2.4" +name = "ttf-parser" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" +checksum = "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6d21d96b4" [[package]] -name = "tungstenite" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15fba1a6d6bb030745759a9a2a588bfe8490fc8b4751a277db3a0be1c9ebbf67" +name = "twite" +version = "0.1.0" +source = "git+https://gitlab.com/ghostlyzsh/twite.git#6d54f37b7c392d2df993ee1cae2064b7ac410da7" dependencies = [ - "byteorder", - "bytes", - "data-encoding", - "http", - "httparse", - "log", + "base64 0.21.2", "rand", "sha1", - "thiserror", "url", - "utf-8", -] - -[[package]] -name = "typenum" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" - -[[package]] -name = "ucd-trie" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81" - -[[package]] -name = "ulid" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13a3aaa69b04e5b66cc27309710a569ea23593612387d67daaf102e73aa974fd" -dependencies = [ - "rand", -] - -[[package]] -name = "uncased" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b9bc53168a4be7402ab86c3aad243a84dd7381d09be0eddc81280c1da95ca68" -dependencies = [ - "version_check", -] - -[[package]] -name = "unic-char-property" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" -dependencies = [ - "unic-char-range", -] - -[[package]] -name = "unic-char-range" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" - -[[package]] -name = "unic-common" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" - -[[package]] -name = "unic-segment" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4ed5d26be57f84f176157270c112ef57b86debac9cd21daaabbe56db0f88f23" -dependencies = [ - "unic-ucd-segment", -] - -[[package]] -name = "unic-ucd-segment" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2079c122a62205b421f499da10f3ee0f7697f012f55b675e002483c73ea34700" -dependencies = [ - "unic-char-property", - "unic-char-range", - "unic-ucd-version", ] [[package]] -name = "unic-ucd-version" -version = "0.9.0" +name = "twox-hash" +version = "1.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" +checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" dependencies = [ - "unic-common", + "cfg-if", + "static_assertions", ] [[package]] -name = "unicase" -version = "2.6.0" +name = "typenum" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" -dependencies = [ - "version_check", -] +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" [[package]] name = "unicode-bidi" @@ -5197,9 +3335,9 @@ checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] name = "unicode-ident" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22049a19f4a68748a168c0fc439f9516686aa045927ff767eca0a85101fb6e73" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "unicode-normalization" @@ -5210,17 +3348,11 @@ dependencies = [ "tinyvec", ] -[[package]] -name = "unicode-segmentation" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" - [[package]] name = "unicode-width" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" +checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" [[package]] name = "unicode-xid" @@ -5228,18 +3360,6 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" -[[package]] -name = "unicode_categories" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" - -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - [[package]] name = "url" version = "2.4.0" @@ -5251,17 +3371,11 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - [[package]] name = "uuid" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d023da39d1fde5a8a3fe1f3e01ca9632ada0a63e9797de55a879d6e2236277be" +checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d" dependencies = [ "getrandom", "serde", @@ -5273,18 +3387,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" -[[package]] -name = "value-bag" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d92ccd67fb88503048c01b59152a04effd0782d035a83a6d256ce6085f08f4a3" - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - [[package]] name = "vec_map" version = "0.8.2" @@ -5313,15 +3415,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -5330,9 +3423,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +checksum = "7daec296f25a1bae309c0cd5c29c4b260e510e6d813c286b19eaadf409d40fce" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -5340,16 +3433,16 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +checksum = "e397f4664c0e4e428e8313a469aaa58310d302159845980fd23b0f22a847f217" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.23", + "syn 2.0.29", "wasm-bindgen-shared", ] @@ -5367,9 +3460,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +checksum = "5961017b3b08ad5f3fe39f1e79877f8ee7c23c5e5fd5eb80de95abc41f1f16b2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -5377,22 +3470,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907" dependencies = [ "proc-macro2", "quote", - "syn 2.0.23", + "syn 2.0.29", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" +checksum = "0d046c5d029ba91a1ed14da14dca44b68bf2f124cfbaf741c54151fdb3e0750b" [[package]] name = "wayland-scanner" @@ -5407,45 +3500,26 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.64" +version = "0.3.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +checksum = "5db499c5f66323272151db0e666cd34f78617522fb0c1604d31a27c50c206a85" dependencies = [ "js-sys", "wasm-bindgen", ] -[[package]] -name = "webpki" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "webpki-roots" -version = "0.22.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" -dependencies = [ - "webpki", -] - [[package]] name = "wgpu" -version = "0.15.1" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d745a1b6d91d85c33defbb29f0eee0450e1d2614d987e14bf6baf26009d132d7" +checksum = "752e44d3998ef35f71830dd1ad3da513e628e2e4d4aedb0ab580f850827a0b41" dependencies = [ "arrayvec", "cfg-if", "js-sys", "log", "naga", - "parking_lot 0.12.1", + "parking_lot", "profiling", "raw-window-handle", "smallvec", @@ -5460,20 +3534,20 @@ dependencies = [ [[package]] name = "wgpu-core" -version = "0.15.1" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7131408d940e335792645a98f03639573b0480e9e2e7cddbbab74f7c6d9f3fff" +checksum = "0f8a44dd301a30ceeed3c27d8c0090433d3da04d7b2a4042738095a424d12ae7" dependencies = [ "arrayvec", "bit-vec", - "bitflags 1.3.2", + "bitflags 2.4.0", "codespan-reporting", - "fxhash", "log", "naga", - "parking_lot 0.12.1", + "parking_lot", "profiling", "raw-window-handle", + "rustc-hash", "smallvec", "thiserror", "web-sys", @@ -5483,20 +3557,18 @@ dependencies = [ [[package]] name = "wgpu-hal" -version = "0.15.4" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdcf61a283adc744bb5453dd88ea91f3f86d5ca6b027661c6c73c7734ae0288b" +checksum = "9a80bf0e3c77399bb52850cb0830af9bad073d5cfcb9dd8253bef8125c42db17" dependencies = [ "android_system_properties", "arrayvec", "ash", "bit-set", - "bitflags 1.3.2", + "bitflags 2.4.0", "block", "core-graphics-types", "d3d12", - "foreign-types", - "fxhash", "glow", "gpu-alloc", "gpu-allocator", @@ -5505,16 +3577,17 @@ dependencies = [ "js-sys", "khronos-egl", "libc", - "libloading", + "libloading 0.8.1", "log", "metal", "naga", "objc", - "parking_lot 0.12.1", + "parking_lot", "profiling", "range-alloc", "raw-window-handle", "renderdoc-sys", + "rustc-hash", "smallvec", "thiserror", "wasm-bindgen", @@ -5525,51 +3598,20 @@ dependencies = [ [[package]] name = "wgpu-types" -version = "0.15.2" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32444e121b0bd00cb02c0de32fde457a9491bd44e03e7a5db6df9b1da2f6f110" +checksum = "ee64d7398d0c2f9ca48922c902ef69c42d000c759f3db41e355f4a570b052b67" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.4.0", "js-sys", "web-sys", ] -[[package]] -name = "which" -version = "4.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269" -dependencies = [ - "either", - "libc", - "once_cell", -] - -[[package]] -name = "whoami" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22fc3756b8a9133049b26c7f61ab35416c130e8c09b660f5b3958b446f52cc50" -dependencies = [ - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wide" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40018623e2dba2602a9790faba8d33f2ebdebf4b86561b83928db735f8784728" -dependencies = [ - "bytemuck", - "safe_arch", -] - [[package]] name = "widestring" -version = "0.5.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17882f045410753661207383517a6f62ec3dbeb6a4ed2acce01f0728238d1983" +checksum = "653f141f39ec16bba3c5abe400a0c60da7468261cc2cbf36805022876bc721a8" [[package]] name = "winapi" @@ -5608,8 +3650,15 @@ version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e745dab35a0c4c77aa3ce42d595e13d2003d6902d6b08c9ef5fc326d08da12b" dependencies = [ - "windows-implement", - "windows-interface", + "windows-targets 0.42.2", +] + +[[package]] +name = "windows" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdacb41e6a96a052c6cb63a144f24900236121c6f63f4f8219fef5977ecb0c25" +dependencies = [ "windows-targets 0.42.2", ] @@ -5619,14 +3668,16 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" dependencies = [ - "windows-targets 0.48.1", + "windows-implement", + "windows-interface", + "windows-targets 0.48.5", ] [[package]] name = "windows-implement" -version = "0.44.0" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce87ca8e3417b02dc2a8a22769306658670ec92d78f1bd420d6310a67c245c6" +checksum = "5e2ee588991b9e7e6c8338edf3333fbe4da35dc72092643958ebb43f0ab2c49c" dependencies = [ "proc-macro2", "quote", @@ -5635,30 +3686,15 @@ dependencies = [ [[package]] name = "windows-interface" -version = "0.44.0" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "853f69a591ecd4f810d29f17e902d40e349fb05b0b11fff63b08b826bfe39c7f" +checksum = "e6fb8df20c9bcaa8ad6ab513f7b40104840c8867d5751126e4df3b08388d0cc7" dependencies = [ "proc-macro2", "quote", "syn 1.0.109", ] -[[package]] -name = "windows-sys" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "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 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - [[package]] name = "windows-sys" version = "0.45.0" @@ -5674,7 +3710,7 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets 0.48.1", + "windows-targets 0.48.5", ] [[package]] @@ -5694,17 +3730,17 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.48.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm 0.48.0", - "windows_aarch64_msvc 0.48.0", - "windows_i686_gnu 0.48.0", - "windows_i686_msvc 0.48.0", - "windows_x86_64_gnu 0.48.0", - "windows_x86_64_gnullvm 0.48.0", - "windows_x86_64_msvc 0.48.0", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", ] [[package]] @@ -5715,9 +3751,9 @@ checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_msvc" @@ -5727,9 +3763,9 @@ checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" [[package]] name = "windows_aarch64_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_i686_gnu" @@ -5739,9 +3775,9 @@ checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" [[package]] name = "windows_i686_gnu" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_msvc" @@ -5751,9 +3787,9 @@ checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" [[package]] name = "windows_i686_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_x86_64_gnu" @@ -5763,9 +3799,9 @@ checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" [[package]] name = "windows_x86_64_gnu" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnullvm" @@ -5775,9 +3811,9 @@ checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_msvc" @@ -5787,15 +3823,15 @@ checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" [[package]] name = "windows_x86_64_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "winit" -version = "0.28.6" +version = "0.28.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "866db3f712fffba75d31bf0cdecf357c8aeafd158c5b7ab51dba2a2b2d47f196" +checksum = "9596d90b45384f5281384ab204224876e8e8bf7d58366d9b795ad99aa9894b94" dependencies = [ "android-activity", "bitflags 1.3.2", @@ -5806,77 +3842,49 @@ dependencies = [ "instant", "libc", "log", + "mio", "ndk", "objc2", "once_cell", "orbclient", + "percent-encoding", "raw-window-handle", "redox_syscall 0.3.5", "wasm-bindgen", "wayland-scanner", "web-sys", "windows-sys 0.45.0", + "x11-dl", ] [[package]] name = "winnow" -version = "0.4.8" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9482fe6ceabdf32f3966bfdd350ba69256a97c30253dc616fe0005af24f164e" +checksum = "d09770118a7eb1ccaf4a594a221334119a44a814fcb0d31c5b85e83e97227a97" dependencies = [ "memchr", ] [[package]] -name = "winreg" -version = "0.10.1" +name = "x11-dl" +version = "2.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" dependencies = [ - "winapi", + "libc", + "once_cell", + "pkg-config", ] [[package]] -name = "wyz" -version = "0.5.1" +name = "xi-unicode" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] +checksum = "a67300977d3dc3f8034dae89778f502b6ba20b269527b3223ba59c0cf393bb8a" [[package]] name = "xml-rs" -version = "0.8.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a56c84a8ccd4258aed21c92f70c0f6dea75356b6892ae27c24139da456f9336" - -[[package]] -name = "zstd" -version = "0.12.3+zstd.1.5.2" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76eea132fb024e0e13fd9c2f5d5d595d8a967aa72382ac2f9d39fcc95afd0806" -dependencies = [ - "zstd-safe", -] - -[[package]] -name = "zstd-safe" -version = "6.0.5+zstd.1.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56d9e60b4b1758206c238a10165fbcae3ca37b01744e394c463463f6529d23b" -dependencies = [ - "libc", - "zstd-sys", -] - -[[package]] -name = "zstd-sys" -version = "2.0.8+zstd.1.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5556e6ee25d32df2586c098bbfa278803692a20d0ab9565e049480d52707ec8c" -dependencies = [ - "cc", - "libc", - "pkg-config", -] +checksum = "0fcb9cbac069e033553e8bb871be2fbdffcab578eb25bd0f7c508cedc6dcd75a" diff --git a/Cargo.toml b/Cargo.toml index 6a7f9c8023a88a2345de22b77f24592b3234c1f0..c7a31ee54f4dd6a6da7eb36c615734e1484fab0e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,12 +1,7 @@ [workspace] members = [ "server", - "protocol", - "api", - "api/starkingdoms_api_entities", - "api/starkingdoms_api_migration", - "spacetime_rs" ] [profile.dev.package.rapier2d-f64] -opt-level = 3 \ No newline at end of file +opt-level = 3 diff --git a/Jenkinsfile b/Jenkinsfile deleted file mode 100644 index 8821d5e51a5badd3498a0f24ffd5808b8a81e67a..0000000000000000000000000000000000000000 --- a/Jenkinsfile +++ /dev/null @@ -1,34 +0,0 @@ -pipeline { - agent any - - environment { - DOCKER_LOGIN_CREDS = credentials('gitlab-docker-key') - PATH = "/var/lib/jenkins/.cargo/bin:$PATH" - INFRA_KEY = credentials('infra_key') - } - - stages { - stage('Build') { - steps { - sh 'cargo build --locked' - } - } - stage('Clippy') { - steps { - sh 'cargo clippy --locked' - } - } - stage('Docker') { - steps { - sh 'docker login registry.gitlab.com -u ${DOCKER_LOGIN_CREDS_USR} -p ${DOCKER_LOGIN_CREDS_PSW}' - sh 'STK_CHANNEL=bleeding STK_BUILD_NUM=${BUILD_NUMBER} ./spacetime build_docker' - } - } - stage('Deploy') { - steps { - sh 'sshpass -p ${INFRA_KEY} ./ansible/infra update-bleeding' - sh 'sshpass -p ${INFRA_KEY} ./ansible/infra restart-bleeding' - } - } - } -} \ No newline at end of file diff --git a/ansible/deploy-beta.yaml b/ansible/deploy-beta.yaml deleted file mode 100644 index f6ddfb5467baf4b7061c3da255fac829aba03513..0000000000000000000000000000000000000000 --- a/ansible/deploy-beta.yaml +++ /dev/null @@ -1,50 +0,0 @@ -- name: Deploy beta servers - hosts: starkingdoms_prod_servers_beta - vars: - # Randomly generated per-deployment secrets - api_key: "{{ lookup('community.general.random_string', base64=True, length=24) }}" - jwt_signing_secret: "{{ lookup('community.general.random_string', base64=True, length=24) }}" - - # Database info - db_name: starkingdoms-bleeding - - # What version of the docker container should be deployed? - version: beta - - ws_port: 3204 - api_port: 3205 - web_port: 3206 - - api_config_dir: /home/stk-deploy/config - db_data_dir: /home/stk-deploy/data - compose_dir: /home/stk-deploy - - api_url: https://api.beta.starkingdoms.io - game_url: https://beta.starkingdoms.io - tasks: - - name: Ensure host connectivity - ansible.builtin.ping: - - name: Create configuration directory - ansible.builtin.file: - path: "{{ api_config_dir }}" - state: directory - mode: 0755 - - name: Create data directory - ansible.builtin.file: - path: "{{ db_data_dir }}" - state: directory - mode: 0755 - - name: Create API config file - ansible.builtin.template: - src: ../docker/config.jinja.toml - dest: "{{ api_config_dir }}/config.toml" - force: no - - name: Create docker-compose config file - ansible.builtin.template: - src: ../docker/docker-compose.jinja.yml - dest: "{{ compose_dir }}/docker-compose.yml" - force: no - - name: Start the server - ansible.builtin.shell: - cmd: docker-compose up -d - chdir: "{{ compose_dir }}" diff --git a/ansible/deploy-bleeding.yaml b/ansible/deploy-bleeding.yaml deleted file mode 100644 index 25c8d03aab52e2a709b99433eb756509e75b34d6..0000000000000000000000000000000000000000 --- a/ansible/deploy-bleeding.yaml +++ /dev/null @@ -1,50 +0,0 @@ -- name: Deploy bleeding servers - hosts: starkingdoms_prod_servers_bleeding - vars: - # Randomly generated per-deployment secrets - api_key: "{{ lookup('community.general.random_string', base64=True, length=24) }}" - jwt_signing_secret: "{{ lookup('community.general.random_string', base64=True, length=24) }}" - - # Database info - db_name: starkingdoms-bleeding - - # What version of the docker container should be deployed? - version: bleeding - - ws_port: 3204 - api_port: 3205 - web_port: 3206 - - api_config_dir: /home/stk-deploy/config - db_data_dir: /home/stk-deploy/data - compose_dir: /home/stk-deploy - - api_url: https://api.bleeding.starkingdoms.io - game_url: https://bleeding.starkingdoms.io - tasks: - - name: Ensure host connectivity - ansible.builtin.ping: - - name: Create configuration directory - ansible.builtin.file: - path: "{{ api_config_dir }}" - state: directory - mode: 0755 - - name: Create data directory - ansible.builtin.file: - path: "{{ db_data_dir }}" - state: directory - mode: 0755 - - name: Create API config file - ansible.builtin.template: - src: ../docker/config.jinja.toml - dest: "{{ api_config_dir }}/config.toml" - force: no - - name: Create docker-compose config file - ansible.builtin.template: - src: ../docker/docker-compose.jinja.yml - dest: "{{ compose_dir }}/docker-compose.yml" - force: no - - name: Start the server - ansible.builtin.shell: - cmd: docker-compose up -d - chdir: "{{ compose_dir }}" \ No newline at end of file diff --git a/ansible/deploy-stable.yaml b/ansible/deploy-stable.yaml deleted file mode 100644 index 263846a3102d7d51bef38bc239a68c2908dbd70c..0000000000000000000000000000000000000000 --- a/ansible/deploy-stable.yaml +++ /dev/null @@ -1,51 +0,0 @@ - -- name: Deploy stable servers - hosts: starkingdoms_prod_servers_stable - vars: - # Randomly generated per-deployment secrets - api_key: "{{ lookup('community.general.random_string', base64=True, length=24) }}" - jwt_signing_secret: "{{ lookup('community.general.random_string', base64=True, length=24) }}" - - # Database info - db_name: starkingdoms-bleeding - - # What version of the docker container should be deployed? - version: stable - - ws_port: 3204 - api_port: 3205 - web_port: 3206 - - api_config_dir: /home/stk-deploy/config - db_data_dir: /home/stk-deploy/data - compose_dir: /home/stk-deploy - - api_url: https://api.starkingdoms.io - game_url: https://starkingdoms.io - tasks: - - name: Ensure host connectivity - ansible.builtin.ping: - - name: Create configuration directory - ansible.builtin.file: - path: "{{ api_config_dir }}" - state: directory - mode: 0755 - - name: Create data directory - ansible.builtin.file: - path: "{{ db_data_dir }}" - state: directory - mode: 0755 - - name: Create API config file - ansible.builtin.template: - src: ../docker/config.jinja.toml - dest: "{{ api_config_dir }}/config.toml" - force: no - - name: Create docker-compose config file - ansible.builtin.template: - src: ../docker/docker-compose.jinja.yml - dest: "{{ compose_dir }}/docker-compose.yml" - force: no - - name: Start the server - ansible.builtin.shell: - cmd: docker-compose up -d - chdir: "{{ compose_dir }}" \ No newline at end of file diff --git a/ansible/infra b/ansible/infra deleted file mode 100755 index daf6c49819e88ee98e95657f35bfb29739014666..0000000000000000000000000000000000000000 --- a/ansible/infra +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -echo "[*] Connecting to infrastructure manager server. If you are prompted for a password, enter your infrastructure key. You may be prompted several times." -ssh -p 1234 team@10.16.1.3 /home/team/run_ansible.sh "$1" diff --git a/ansible/inventory.yaml b/ansible/inventory.yaml deleted file mode 100644 index 318aa36fa0b2fd5dfd7ea2ad95126a575310e723..0000000000000000000000000000000000000000 --- a/ansible/inventory.yaml +++ /dev/null @@ -1,23 +0,0 @@ -starkingdoms_prod_servers_stable: - hosts: - ghosteast1: - ansible_host: 10.17.4.2 - ansible_user: stk-deploy - -starkingdoms_prod_servers_beta: - hosts: - east3: - ansible_host: 10.16.2.5 - ansible_user: stk-deploy - -starkingdoms_prod_servers_bleeding: - hosts: - central1: - ansible_host: 10.16.1.1 - ansible_user: stk-deploy - -starkingdoms_prod_servers: - children: - starkingdoms_prod_servers_stable: - starkingdoms_prod_servers_beta: - starkingdoms_prod_servers_bleeding: \ No newline at end of file diff --git a/ansible/restart-beta.yaml b/ansible/restart-beta.yaml deleted file mode 100644 index f567cc73cc053998bf7375bf1c84bdb8e88ed9aa..0000000000000000000000000000000000000000 --- a/ansible/restart-beta.yaml +++ /dev/null @@ -1,15 +0,0 @@ -- name: Restart beta servers - hosts: starkingdoms_prod_servers_beta - vars: - compose_dir: /home/stk-deploy - tasks: - - name: Ensure host connectivity - ansible.builtin.ping: - - name: Stop the server - ansible.builtin.shell: - cmd: docker-compose down - chdir: "{{ compose_dir }}" - - name: Start the server - ansible.builtin.shell: - cmd: docker-compose up -d - chdir: "{{ compose_dir }}" \ No newline at end of file diff --git a/ansible/restart-bleeding.yaml b/ansible/restart-bleeding.yaml deleted file mode 100644 index 147300cbd85750a4af602b8e9f1ffc88a19e981a..0000000000000000000000000000000000000000 --- a/ansible/restart-bleeding.yaml +++ /dev/null @@ -1,15 +0,0 @@ -- name: Restart bleeding servers - hosts: starkingdoms_prod_servers_bleeding - vars: - compose_dir: /home/stk-deploy - tasks: - - name: Ensure host connectivity - ansible.builtin.ping: - - name: Stop the server - ansible.builtin.shell: - cmd: docker-compose down - chdir: "{{ compose_dir }}" - - name: Start the server - ansible.builtin.shell: - cmd: docker-compose up -d - chdir: "{{ compose_dir }}" \ No newline at end of file diff --git a/ansible/restart-stable.yaml b/ansible/restart-stable.yaml deleted file mode 100644 index 2ea7b6d5a074a98aa55cdd7520fcd6b72344b369..0000000000000000000000000000000000000000 --- a/ansible/restart-stable.yaml +++ /dev/null @@ -1,15 +0,0 @@ -- name: Restart stable servers - hosts: starkingdoms_prod_servers_stable - vars: - compose_dir: /home/stk-deploy - tasks: - - name: Ensure host connectivity - ansible.builtin.ping: - - name: Stop the server - ansible.builtin.shell: - cmd: docker-compose down - chdir: "{{ compose_dir }}" - - name: Start the server - ansible.builtin.shell: - cmd: docker-compose up -d - chdir: "{{ compose_dir }}" \ No newline at end of file diff --git a/ansible/restart.yaml b/ansible/restart.yaml deleted file mode 100644 index 9f531a2eaf3c8a528d2349b2cd3f0f6ceaeed4e2..0000000000000000000000000000000000000000 --- a/ansible/restart.yaml +++ /dev/null @@ -1,15 +0,0 @@ -- name: Restart all servers - hosts: starkingdoms_prod_servers - vars: - compose_dir: /home/stk-deploy - tasks: - - name: Ensure host connectivity - ansible.builtin.ping: - - name: Stop the server - ansible.builtin.shell: - cmd: docker-compose down - chdir: "{{ compose_dir }}" - - name: Start the server - ansible.builtin.shell: - cmd: docker-compose up -d - chdir: "{{ compose_dir }}" \ No newline at end of file diff --git a/ansible/start-beta.yaml b/ansible/start-beta.yaml deleted file mode 100644 index fd8e5e41f5db3ccbb51637c0dabfd8d7853d1af9..0000000000000000000000000000000000000000 --- a/ansible/start-beta.yaml +++ /dev/null @@ -1,11 +0,0 @@ -- name: Start beta servers - hosts: starkingdoms_prod_servers_beta - vars: - compose_dir: /home/stk-deploy - tasks: - - name: Ensure host connectivity - ansible.builtin.ping: - - name: Start the server - ansible.builtin.shell: - cmd: docker-compose up -d - chdir: "{{ compose_dir }}" \ No newline at end of file diff --git a/ansible/start-bleeding.yaml b/ansible/start-bleeding.yaml deleted file mode 100644 index e132a00ada3ce6fcb40852318e965d9ba2cd76f6..0000000000000000000000000000000000000000 --- a/ansible/start-bleeding.yaml +++ /dev/null @@ -1,11 +0,0 @@ -- name: Start bleeding servers - hosts: starkingdoms_prod_servers_bleeding - vars: - compose_dir: /home/stk-deploy - tasks: - - name: Ensure host connectivity - ansible.builtin.ping: - - name: Start the server - ansible.builtin.shell: - cmd: docker-compose up -d - chdir: "{{ compose_dir }}" \ No newline at end of file diff --git a/ansible/start-stable.yaml b/ansible/start-stable.yaml deleted file mode 100644 index 64b1dde549facd5a99b4ddf6dfd6f326f4554bb7..0000000000000000000000000000000000000000 --- a/ansible/start-stable.yaml +++ /dev/null @@ -1,11 +0,0 @@ -- name: Start stable servers - hosts: starkingdoms_prod_servers_stable - vars: - compose_dir: /home/stk-deploy - tasks: - - name: Ensure host connectivity - ansible.builtin.ping: - - name: Start the server - ansible.builtin.shell: - cmd: docker-compose up -d - chdir: "{{ compose_dir }}" diff --git a/ansible/start.yaml b/ansible/start.yaml deleted file mode 100644 index 26ad6661bfca6b3b100c17c26faaf41648d77a29..0000000000000000000000000000000000000000 --- a/ansible/start.yaml +++ /dev/null @@ -1,11 +0,0 @@ -- name: Start all servers - hosts: starkingdoms_prod_servers - vars: - compose_dir: /home/stk-deploy - tasks: - - name: Ensure host connectivity - ansible.builtin.ping: - - name: Start the server - ansible.builtin.shell: - cmd: docker-compose up -d - chdir: "{{ compose_dir }}" \ No newline at end of file diff --git a/ansible/stop-beta.yaml b/ansible/stop-beta.yaml deleted file mode 100644 index 29afe8225ffbf03d05cd3c1aa71614ed8caa4ae3..0000000000000000000000000000000000000000 --- a/ansible/stop-beta.yaml +++ /dev/null @@ -1,11 +0,0 @@ -- name: Stop beta servers - hosts: starkingdoms_prod_servers_beta - vars: - compose_dir: /home/stk-deploy - tasks: - - name: Ensure host connectivity - ansible.builtin.ping: - - name: Stop the server - ansible.builtin.shell: - cmd: docker-compose down - chdir: "{{ compose_dir }}" \ No newline at end of file diff --git a/ansible/stop-bleeding.yaml b/ansible/stop-bleeding.yaml deleted file mode 100644 index 213de0bd2948c327d2b47be2c579c5b1d21ee4b2..0000000000000000000000000000000000000000 --- a/ansible/stop-bleeding.yaml +++ /dev/null @@ -1,11 +0,0 @@ -- name: Stop bleeding servers - hosts: starkingdoms_prod_servers_bleeding - vars: - compose_dir: /home/stk-deploy - tasks: - - name: Ensure host connectivity - ansible.builtin.ping: - - name: Stop the server - ansible.builtin.shell: - cmd: docker-compose down - chdir: "{{ compose_dir }}" diff --git a/ansible/stop-stable.yaml b/ansible/stop-stable.yaml deleted file mode 100644 index 6cdda3f7d23686e453b8a955b3fa5eecbcb9f1e2..0000000000000000000000000000000000000000 --- a/ansible/stop-stable.yaml +++ /dev/null @@ -1,11 +0,0 @@ -- name: Stop stable servers - hosts: starkingdoms_prod_servers_stable - vars: - compose_dir: /home/stk-deploy - tasks: - - name: Ensure host connectivity - ansible.builtin.ping: - - name: Stop the server - ansible.builtin.shell: - cmd: docker-compose down - chdir: "{{ compose_dir }}" \ No newline at end of file diff --git a/ansible/stop.yaml b/ansible/stop.yaml deleted file mode 100644 index 57aa3f5e9b97d5ada94a3f13d8553efc5b91e4f5..0000000000000000000000000000000000000000 --- a/ansible/stop.yaml +++ /dev/null @@ -1,11 +0,0 @@ -- name: Stop all servers - hosts: starkingdoms_prod_servers - vars: - compose_dir: /home/stk-deploy - tasks: - - name: Ensure host connectivity - ansible.builtin.ping: - - name: Stop the server - ansible.builtin.shell: - cmd: docker-compose down - chdir: "{{ compose_dir }}" \ No newline at end of file diff --git a/ansible/update-beta.yaml b/ansible/update-beta.yaml deleted file mode 100644 index 628bd522a361d20cd7d3483eeea3c982fbe14f4c..0000000000000000000000000000000000000000 --- a/ansible/update-beta.yaml +++ /dev/null @@ -1,11 +0,0 @@ -- name: Update beta servers - hosts: starkingdoms_prod_servers_beta - vars: - compose_dir: /home/stk-deploy - tasks: - - name: Ensure host connectivity - ansible.builtin.ping: - - name: Update the server - ansible.builtin.shell: - cmd: docker-compose pull - chdir: "{{ compose_dir }}" \ No newline at end of file diff --git a/ansible/update-bleeding.yaml b/ansible/update-bleeding.yaml deleted file mode 100644 index f67456f9e93067f55f23e5f46dfc38149e2a3b56..0000000000000000000000000000000000000000 --- a/ansible/update-bleeding.yaml +++ /dev/null @@ -1,11 +0,0 @@ -- name: Update bleeding servers - hosts: starkingdoms_prod_servers_bleeding - vars: - compose_dir: /home/stk-deploy - tasks: - - name: Ensure host connectivity - ansible.builtin.ping: - - name: Update the server - ansible.builtin.shell: - cmd: docker-compose pull - chdir: "{{ compose_dir }}" \ No newline at end of file diff --git a/ansible/update-stable.yaml b/ansible/update-stable.yaml deleted file mode 100644 index 6eaa66f93f4b97341ff68aa29f1d68030d985db1..0000000000000000000000000000000000000000 --- a/ansible/update-stable.yaml +++ /dev/null @@ -1,11 +0,0 @@ -- name: Update stable servers - hosts: starkingdoms_prod_servers_stable - vars: - compose_dir: /home/stk-deploy - tasks: - - name: Ensure host connectivity - ansible.builtin.ping: - - name: Update the server - ansible.builtin.shell: - cmd: docker-compose pull - chdir: "{{ compose_dir }}" \ No newline at end of file diff --git a/ansible/update.yaml b/ansible/update.yaml deleted file mode 100644 index d0297b061ff253fde1723d93e3245c037f3c037d..0000000000000000000000000000000000000000 --- a/ansible/update.yaml +++ /dev/null @@ -1,11 +0,0 @@ -- name: Update all servers - hosts: starkingdoms_prod_servers - vars: - compose_dir: /home/stk-deploy - tasks: - - name: Ensure host connectivity - ansible.builtin.ping: - - name: Update the server - ansible.builtin.shell: - cmd: docker-compose pull - chdir: "{{ compose_dir }}" \ No newline at end of file diff --git a/api.Dockerfile b/api.Dockerfile deleted file mode 100644 index d7b58a5c88345abbf0eb1075cf8957f3768d8515..0000000000000000000000000000000000000000 --- a/api.Dockerfile +++ /dev/null @@ -1,12 +0,0 @@ -FROM ghcr.io/void-linux/void-linux:latest-full-x86_64 - -RUN xbps-install -S && xbps-install -f base-files && xbps-install -Syyu gcc - -RUN mkdir /var/www - -COPY target/release/starkingdoms-api /bin/starkingdoms-api -COPY api/static/ /var/www/static -COPY api/templates /var/www/templates - -WORKDIR "/var/www" -CMD ["/bin/starkingdoms-api"] \ No newline at end of file diff --git a/api/Cargo.toml b/api/Cargo.toml index 5e8886bb6a3a8330dc381e4dc5016c9996baf9b8..008f830e6935920db529b1b7503563dea539e0b9 100644 --- a/api/Cargo.toml +++ b/api/Cargo.toml @@ -32,5 +32,3 @@ openssl = "0.10" # Auth reqwest = "0.11" # Auth hmac = "0.12.1" # Auth sha2 = "0.10.6" # Auth - -starkingdoms-protocol = { version = "0.1.0", path = "../protocol" } \ No newline at end of file diff --git a/beta.Jenkinsfile b/beta.Jenkinsfile deleted file mode 100644 index 6d61d44a053c9d37b88055bd6612fa3c937fbaeb..0000000000000000000000000000000000000000 --- a/beta.Jenkinsfile +++ /dev/null @@ -1,27 +0,0 @@ -pipeline { - agent any - - environment { - DOCKER_LOGIN_CREDS = credentials('gitlab-docker-key') - PATH = "/var/lib/jenkins/.cargo/bin:$PATH" - } - - stages { - stage('Build') { - steps { - sh 'cargo build --locked' - } - } - stage('Clippy') { - steps { - sh 'cargo clippy --locked' - } - } - stage('Docker') { - steps { - sh 'docker login registry.gitlab.com -u ${DOCKER_LOGIN_CREDS_USR} -p ${DOCKER_LOGIN_CREDS_PSW}' - sh 'STK_CHANNEL=beta STK_BUILD_NUM=${BUILD_NUMBER} ./spacetime build_docker_beta' - } - } - } -} \ No newline at end of file diff --git a/client/src/gateway.ts b/client/src/gateway.ts index 37f69a570c925d12c1040c1654964f52747dd14a..e920e5150b8c45b9db4d27f014be1160990ae310 100644 --- a/client/src/gateway.ts +++ b/client/src/gateway.ts @@ -1,41 +1,11 @@ import {Logger} from "./logger"; -import { - MessageC2SGoodbye, MessageC2SGoodbye_packetInfo, - MessageC2SHello, - MessageC2SHello_packetInfo, MessageC2SPing, - MessageC2SPing_packetInfo -} from "./protocol/message_c2s"; -import {State} from "./protocol/state"; import {decode, encode} from "./serde"; -import { - MessageS2CChat, - MessageS2CChat_packetInfo, - MessageS2CGoodbye, - MessageS2CGoodbye_packetInfo, - MessageS2CHello, - MessageS2CHello_packetInfo, - MessageS2CModuleAdd, - MessageS2CModuleAdd_packetInfo, - MessageS2CModuleRemove, - MessageS2CModuleRemove_packetInfo, - MessageS2CModulesUpdate, - MessageS2CModulesUpdate_packetInfo, - MessageS2CModuleTreeUpdate, - MessageS2CModuleTreeUpdate_packetInfo, - MessageS2CPlanetData, MessageS2CPlanetData_packetInfo, - MessageS2CPlayersUpdate, - MessageS2CPlayersUpdate_packetInfo, - MessageS2CPong_packetInfo -} from "./protocol/message_s2c"; -import {GoodbyeReason} from "./protocol/goodbye_reason"; import {global} from "./index"; -import {Attachment, ModuleType} from "./protocol/module"; -import type {AttachedModule as ProtocolAttachedModule} from "./protocol/module"; const logger = new Logger("Gateway"); export interface GatewayClient { - state: State; + //state: State; socket: WebSocket; username: string | null; version: number | null; @@ -45,13 +15,13 @@ export interface GatewayClient { ping_timeout_left: Timeout; // its fine } -export interface AttachedModule { +/*export interface AttachedModule { module_type: ModuleType, rotation: number, x: number, y: number, children: Attachment[], -} +}*/ export async function gateway_connect(gateway_url: string, username: string): Promise { logger.info("FAST CONNECT - Connecting to gateway socket at " + gateway_url); @@ -61,7 +31,7 @@ export async function gateway_connect(gateway_url: string, username: string): Pr logger.debug("[fastconnect] connected to gateway, performing handshake with server"); let client: GatewayClient = { - state: State.Handshake, + //state: State.Handshake, socket: ws, username: null, version: null, @@ -69,46 +39,6 @@ export async function gateway_connect(gateway_url: string, username: string): Pr ping_timeout_left: null }; - let ping_timeout_fn = () => { - logger.error("Server didn't send back pong in time."); - let cya = MessageC2SGoodbye.encode({reason: GoodbyeReason.PingPongTimeout}).finish(); - client.socket.send(encode(MessageC2SGoodbye_packetInfo.type, cya)); - client.state = State.Handshake; - client.username = null; - client.version = null; - client.socket.close(); - } - client.ping_timeout_left = setTimeout(ping_timeout_fn, 10 * 1000); - - let ping_fn = () => { - let ping = MessageC2SPing.encode({}).finish(); - client.socket.send(encode(MessageC2SPing_packetInfo.type, ping)); - setTimeout(ping_fn, 5 * 1000); - } - client.ping_timeout = setTimeout(ping_fn, 5 * 1000); - - let handshake_start_msg; - if (global.can_beam_out) { - handshake_start_msg = MessageC2SHello.encode({ - version: 6, - requestedUsername: username, - nextState: State.Play, - user: window.localStorage.getItem("user")!, - token: window.localStorage.getItem("token")! - }).finish(); - } else { - handshake_start_msg = MessageC2SHello.encode({ - version: 6, - requestedUsername: username, - nextState: State.Play, - // @ts-ignore - user: "",//null, - // @ts-ignore - token: ""//null - }).finish(); - } - client.socket.send(encode(MessageC2SHello_packetInfo.type, handshake_start_msg)); - client.socket.addEventListener('message', async (msg) => { let pkt_info = decode(new Uint8Array(await msg.data.arrayBuffer())); let pkt_id = pkt_info[0]; diff --git a/client/src/index.ts b/client/src/index.ts index 3be0827b3cf1783f111126f0d592352fe735a438..d2ad7e09aa18c8c7626750f425f5bccc941061a3 100644 --- a/client/src/index.ts +++ b/client/src/index.ts @@ -3,7 +3,7 @@ import {AttachedModule, gateway_connect, GatewayClient} from "./gateway"; import {Player} from "./protocol/player"; import {Planet, PlanetType} from "./protocol/planet"; import {Module, ModuleType} from "./protocol/module"; -import { +/*import { MessageC2SAuthenticateAndBeamOut, MessageC2SAuthenticateAndBeamOut_packetInfo, MessageC2SInput, @@ -18,7 +18,7 @@ import { MessageC2SMouseInput_packetInfo } from "./protocol/message_c2s"; import {encode} from "./serde"; -import {InputType} from "./protocol/input"; +import {InputType} from "./protocol/input";*/ import {createParticle, tickAndDrawParticles} from "./particle"; logSetup(); @@ -34,16 +34,16 @@ export interface GlobalData { spritesheet_img: HTMLImageElement | null, spritesheet: object | null, context: CanvasRenderingContext2D, - keys: Keys, + /*keys: Keys, velocity: number, x_vel: number, y_vel: number - can_beam_out: boolean, + can_beam_out: boolean,*/ direction_radians: number, - mouse_x: number, + /*mouse_x: number, mouse_y: number, tree: Map, - clicked: number | null, + clicked: number | null,*/ } export interface Keys { @@ -63,7 +63,7 @@ export const global: GlobalData = { spritesheet_img: null, spritesheet: null, context: (document.getElementById("canvas")).getContext("2d"), - keys: { + /*keys: { up: false, down: false, left: false, @@ -72,30 +72,17 @@ export const global: GlobalData = { velocity: 0, x_vel: 0, y_vel: 0, - can_beam_out: false, + can_beam_out: false,*/ direction_radians: 0, - mouse_x: 0, + /*mouse_x: 0, mouse_y: 0, tree: new Map(), - clicked: null, + clicked: null,*/ } async function client_main(server: string, username: string, texture_quality: string) { logger.info("StarKingdoms client - starting"); - if (window.localStorage.getItem("token") !== null && window.localStorage.getItem("user") !== null) { - global.can_beam_out = true; - document.getElementById("beamout")!.style.setProperty("display", "block"); - document.getElementById("beamout")!.addEventListener("click", () => { - let msg = MessageC2SAuthenticateAndBeamOut.encode({ - userId: window.localStorage.getItem("user")!, - token: window.localStorage.getItem("token")! - }).finish(); - - global.client?.socket.send(encode(MessageC2SAuthenticateAndBeamOut_packetInfo.type, msg)); - }) - } - logger.info("Loading textures"); let spritesheet_url = `/assets/dist/spritesheet-${texture_quality}.png`; let spritesheet_data_url = `/assets/dist/spritesheet-${texture_quality}.json`; @@ -138,128 +125,7 @@ async function client_main(server: string, username: string, texture_quality: st let thruster_counter = 0; - document.onmousedown = (e) => { - // convert screenspace to worldspace - if (global.me !== null) { - let worldX = e.clientX - window.innerWidth / 2 + global.me?.x; - let worldY = e.clientY - window.innerHeight / 2 + global.me?.y; - - let button: InputType; - if (e.button == 0) { - button = InputType.Left; - } else if (e.button == 1) { - button = InputType.Middle; - } else if (e.button == 2) { - button = InputType.Right; - } - - for (let i = 0; i < global.modules.length; i++) { - if (global.modules[i].moduleType == ModuleType.LandingThrusterSuspension) { - console.log("hi"); - continue; - } - let relativeX = global.modules[i].x - worldX; - let relativeY = global.modules[i].y - worldY; - let rot = -global.modules[i].rotation; - relativeX = relativeX*Math.cos(rot) - relativeY*Math.sin(rot); - relativeY = relativeX*Math.sin(rot) + relativeY*Math.cos(rot); - let bound = [-25, 25, -25, 25]; - if (global.modules[i].moduleType == ModuleType.Cargo) { - bound = [-18.75, 18.75, -25, 21.875]; - } - if (bound[0] < relativeX && relativeX < bound[1]) { - if (bound[2] < relativeY && relativeY < bound[3]) { - let msg = MessageC2SModuleGrabBegin.encode({ - moduleId: global.modules[i].id, - worldposX: worldX, - worldposY: worldY, - }).finish(); - global.clicked = global.modules[i].id; - global.client?.socket.send(encode(MessageC2SModuleGrabBegin_packetInfo.type, msg)); - } - } - } - global.tree.forEach((value: AttachedModule, key: number) => { - if (value.module_type == ModuleType.LandingThrusterSuspension) { - console.log("hi"); - return; - } - let relativeX = value.x - worldX; - let relativeY = value.y - worldY; - let rot = -value.rotation; - let adjustedX = relativeX*Math.cos(rot) - relativeY*Math.sin(rot); - let adjustedY = relativeX*Math.sin(rot) + relativeY*Math.cos(rot); - let bound = [-25, 25, -25, 25]; - if (value.module_type == ModuleType.Cargo) { - bound = [-18.75, 18.75, -25, 21.875]; - } - if (bound[0] < adjustedX && adjustedX < bound[1]) { - if (bound[2] < adjustedY && adjustedY < bound[3]) { - let msg = MessageC2SModuleDetach.encode({ - moduleId: key, - }).finish(); - global.client?.socket.send(encode(MessageC2SModuleDetach_packetInfo.type, msg)); - } - } - }); - - let msg = MessageC2SMouseInput.encode({ - worldposX: worldX, - worldposY: worldY, - released: false, - button: button! - }).finish(); - - global.client?.socket.send(encode(MessageC2SMouseInput_packetInfo.type, msg)) - } - } - - document.onmouseup = (e) => { - // convert screenspace to worldspace - if (global.me !== null) { - let worldX = e.clientX - window.innerWidth / 2 + global.me?.x; - let worldY = e.clientY - window.innerHeight / 2 + global.me?.y; - - let button: InputType; - if (e.button == 0) { - button = InputType.Left; - } else if (e.button == 1) { - button = InputType.Middle; - } else if (e.button == 2) { - button = InputType.Right; - } - - let msg = MessageC2SMouseInput.encode({ - worldposX: worldX, - worldposY: worldY, - released: true, - button: button! - }).finish(); - - for (let i = 0; i < global.modules.length; i++) { - if(global.clicked === global.modules[i].id) { - let msg = MessageC2SModuleGrabEnd.encode({ - moduleId: global.modules[i].id, - worldposX: worldX, - worldposY: worldY, - }).finish(); - global.client?.socket.send(encode(MessageC2SModuleGrabEnd_packetInfo.type, msg)) - } - } - global.clicked = null; - - global.client?.socket.send(encode(MessageC2SMouseInput_packetInfo.type, msg)) - } - } - - document.onmousemove = (e) => { - let canvasLeft = canvas.offsetLeft + canvas.clientLeft; - let canvasTop = canvas.offsetTop + canvas.clientTop; - global.mouse_x = e.pageX - canvasLeft; - global.mouse_y = e.pageY - canvasTop; - } - - document.onkeydown = (e) => { + /*document.onkeydown = (e) => { if (e.code == "ArrowLeft" || e.code == "KeyA") { // arrow-left global.keys.left = true; } else if (e.code == "ArrowRight" || e.code == "KeyD") { // arrow-right @@ -297,7 +163,7 @@ async function client_main(server: string, username: string, texture_quality: st rightPressed: global.keys.right }).finish(); global.client?.socket.send(encode(MessageC2SInput_packetInfo.type, msg)); - } + }*/ let t = performance.now(); let delta = 0.0; @@ -340,7 +206,7 @@ async function client_main(server: string, username: string, texture_quality: st if (global.me !== null) { document.getElementById("pos")!.innerText = `Position: ${Math.trunc(global.me.x)}, ${Math.trunc(global.me.y)}`; } - document.getElementById("vel")!.innerText = `Velocity: ${Math.trunc(global.velocity)}`; + //document.getElementById("vel")!.innerText = `Velocity: ${Math.trunc(global.velocity)}`; document.getElementById("vel-dir")!.innerText = `Track Angle: ${global.direction_radians}` for (let i = 0; i < global.planets.length; i++) { @@ -414,7 +280,7 @@ async function client_main(server: string, username: string, texture_quality: st global.context.restore(); - if (global.clicked == module.id) { + /*if (global.clicked == module.id) { global.context.save(); global.context.translate(global.mouse_x - window.innerWidth/2, global.mouse_y - window.innerHeight/2); @@ -431,11 +297,11 @@ async function client_main(server: string, username: string, texture_quality: st -25, 50, 50); global.context.globalAlpha = 1.0; global.context.restore(); - } + }*/ } } - global.tree.forEach((value: AttachedModule, _key: number) => { + /*global.tree.forEach((value: AttachedModule, _key: number) => { if (global.me !== null) { // @ts-ignore let tex = global.spritesheet!["frames"][module_type_to_tex_id(value.module_type, true)]; @@ -454,7 +320,7 @@ async function client_main(server: string, username: string, texture_quality: st global.context.restore(); } - }); + });*/ function isStarkingdomsBirthday() { let inputDate = new Date("3/20/2022"); @@ -547,7 +413,7 @@ async function client_main(server: string, username: string, texture_quality: st }); } - if (global.me !== null) { + /*if (global.me !== null) { thruster_counter += 1; //thruster_counter = 1; // uncomment this line to disable particle limits if (thruster_counter > 3) { @@ -583,7 +449,7 @@ async function client_main(server: string, username: string, texture_quality: st } tickAndDrawParticles(delta); - } + }*/ requestAnimationFrame(render); } diff --git a/docker/README.md b/docker/README.md deleted file mode 100644 index e26fe22d90960f1efe38ec0cb06f58e64813fc97..0000000000000000000000000000000000000000 --- a/docker/README.md +++ /dev/null @@ -1 +0,0 @@ -These files contain essential configuration files used by Ansible to manage and deploy StarKingdoms servers. **DO NOT TOUCH THESE FILES.** \ No newline at end of file diff --git a/docker/config.jinja.toml b/docker/config.jinja.toml deleted file mode 100644 index 7f088bcfff310ebe8faabf72444fd557fe5cdf2f..0000000000000000000000000000000000000000 --- a/docker/config.jinja.toml +++ /dev/null @@ -1,27 +0,0 @@ -internal_tokens = [ - "{{ api_key }}" -] - -base = "{{ api_url }}" -game = "{{ game_url }}" - -jwt_signing_secret = "{{ jwt_signing_secret }}" - -servers = ["{{ game_url }}"] - -[realms.discord] -authorize_url = "https://api.e3t.cc/auth/discord/authorize.php" -public_key = "-----BEGIN PUBLIC KEY-----\nMIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgHBcZsCM6ebFDCp3dFc+3EOzLw8B\n+fR+9Tx6S/lXOTghk49s7yaxza/zVRPxWaMqyjegfRCEepgV++jbWzBib7bhy91M\n+zlRbeZ9rf++N30Nf4R/XAnUAmhAHt8TzDC08DNQNYAFz37+r4EZlY7APHyND4qU\nd8w3qB95v/wMVB6nAgMBAAE=\n-----END PUBLIC KEY-----" -issuer = "https://api.e3t.cc" - -[database] -url = "postgres://postgres@postgres/{{ db_name }}" - -[server] -listen = "0.0.0.0:8080" - -[endpoints] -allowed_return_endpoints = [ - "127.0.0.1:5173", - "starkingdoms.io" -] \ No newline at end of file diff --git a/docker/docker-compose.jinja.yml b/docker/docker-compose.jinja.yml deleted file mode 100644 index 2b6afaebb5f3f6f77b1e9e994284a95321c7fab9..0000000000000000000000000000000000000000 --- a/docker/docker-compose.jinja.yml +++ /dev/null @@ -1,34 +0,0 @@ -version: '3' - -services: - server: - image: registry.gitlab.com/starkingdoms.tk/starkingdoms.tk:server-{{ version }} - depends_on: - - api - - postgres - ports: - - {{ ws_port }}:3000 - environment: - - "STK_API_KEY={{ api_key }}" - - "STK_API_URL=http://api:8080" - api: - image: registry.gitlab.com/starkingdoms.tk/starkingdoms.tk:api-{{ version }} - depends_on: - - postgres - ports: - - {{ api_port }}:8080 - volumes: - - {{ api_config_dir }}:/etc/starkingdoms - web: - image: registry.gitlab.com/starkingdoms.tk/starkingdoms.tk:web-{{ version }} - ports: - - {{ web_port }}:80 - postgres: - # docker run --name basic-postgres --rm -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=4y7sV96vA9wv46VR -e PGDATA=/var/lib/postgresql/data/pgdata -v /tmp:/var/lib/postgresql/data -p 5432:5432 -it postgres:14.1-alpine - image: postgres:14.1-alpine - environment: - - POSTGRES_DB={{ db_name }} - - PGDATA=/var/lib/postgresql/data/pgdata - - POSTGRES_HOST_AUTH_METHOD=trust - volumes: - - {{ db_data_dir }}:/var/lib/postgresql/data \ No newline at end of file diff --git a/docker/mime-types.conf b/docker/mime-types.conf deleted file mode 100644 index f562d0e83fe5b48ea1ae2338a1ddc17951d4c6ef..0000000000000000000000000000000000000000 --- a/docker/mime-types.conf +++ /dev/null @@ -1,4 +0,0 @@ -include mime.types; -types { - application/javascript js mjs cjs; -} \ No newline at end of file diff --git a/docker/nginx.conf b/docker/nginx.conf deleted file mode 100644 index d0344db83dda0c77786d22b6a8ced71412f85c92..0000000000000000000000000000000000000000 --- a/docker/nginx.conf +++ /dev/null @@ -1,44 +0,0 @@ -# This is the nginx config that we (starkingdoms) use in production. -# To use this for yourself, replace `YOURDOMAIN` with your domain (ie: starkingdoms.io, bleeding.starkingdoms.io, etc) -# and replace YOURSERVERIP with the IP that the server is hosted on (for local, use 127.0.0.1) -# Ports are the same as the ones deployed by the scripts in /ansible/. -# You can use this as a guide to write your own config. Be aware that the game will not function very well if there is -# high CPU usage on the proxy server, as nginx will struggle to proxy the websocket connection. -# Put this on an at-least-semi-decent server. -# Game pings, game stream and static assets are on the primary domain (ex: bleeding.starkingdoms.io) -server { - server_name YOURDOMAIN; - - # Static assets should be routed to the nginx container which can handle the traffic - location / { - proxy_set_header Host $host; # Very important (security, logins will break without this), do not remove - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_pass http://YOURSERVERIP:3206; # Web port is 3206 with the provided ansible files - } - - # Websockets should be upgraded and forwarded to the game server - location /ws { - proxy_set_header Host $host; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_http_version 1.1; - proxy_set_header Connection "Upgrade"; - proxy_set_header Upgrade $http_upgrade; - proxy_pass http://YOURSERVERIP:3204; # Game server is 3204 with the provided ansible files - } - # Pings to the game server should be routed there too - location /ping { - proxy_set_header Host $host; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_pass http://YOURSERVERIP:3204; - } -} -# API is on a secondary domain (api.bleeding.starkingdoms.io) -server { - server_name api.YOURDOMAIN.COM; - - location / { - proxy_set_header Host $host; # Very important (security), do not remove - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # Very important (security), do not remove - proxy_pass http://YOURSERVERIP:3205; # API server is 3205 with the provided ansible files - } -} \ No newline at end of file diff --git a/protocol/Cargo.toml b/protocol/Cargo.toml deleted file mode 100644 index 42c899429df56204f9af951985a85870fb056ae3..0000000000000000000000000000000000000000 --- a/protocol/Cargo.toml +++ /dev/null @@ -1,14 +0,0 @@ -[package] -name = "starkingdoms-protocol" -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -protobuf = "3" -serde = { version = "1", features = ["derive"] } - -[build-dependencies] -protobuf-codegen = "3" -protoc-rust = "^2.0" \ No newline at end of file diff --git a/protocol/build.rs b/protocol/build.rs deleted file mode 100644 index 70fa20db693354ff8e399dba39f9fd0bee80666b..0000000000000000000000000000000000000000 --- a/protocol/build.rs +++ /dev/null @@ -1,15 +0,0 @@ -fn main() { - protobuf_codegen::Codegen::new() - .cargo_out_dir("protos") - .include("src/pbuf") - .input("src/pbuf/starkingdoms-protocol.proto") - .input("src/pbuf/message_c2s.proto") - .input("src/pbuf/message_s2c.proto") - .input("src/pbuf/planet.proto") - .input("src/pbuf/player.proto") - .input("src/pbuf/state.proto") - .input("src/pbuf/goodbye_reason.proto") - .input("src/pbuf/module.proto") - .input("src/pbuf/input.proto") - .run_from_script(); -} diff --git a/protocol/src/api.rs b/protocol/src/api.rs deleted file mode 100644 index 599a31817281ee52352c355d6b6ac1039895b92e..0000000000000000000000000000000000000000 --- a/protocol/src/api.rs +++ /dev/null @@ -1,5 +0,0 @@ -use serde::{Deserialize, Serialize}; - -// ALL FIELDS **MUST** BE WRAPPED IN Option<> -#[derive(Serialize, Deserialize, Default, Clone, Debug)] -pub struct APISavedPlayerData {} diff --git a/protocol/src/legacy.rs b/protocol/src/legacy.rs deleted file mode 100644 index 117c5ff1ce6a2b309e680c9e2203f97bff5ea103..0000000000000000000000000000000000000000 --- a/protocol/src/legacy.rs +++ /dev/null @@ -1,102 +0,0 @@ -use serde::{Deserialize, Serialize}; - -pub const PROTOCOL_VERSION: u32 = 1; - -#[derive(Serialize, Deserialize, Debug, Clone, Copy)] -pub enum State { - Handshake, - Play, -} - -#[derive(Serialize, Deserialize, Debug, Clone)] -pub enum MessageC2S { - Hello { - version: u32, - requested_username: String, - next_state: State, - }, - - Goodbye { - reason: GoodbyeReason, - }, - - Chat { - message: String, - }, - - Ping {}, -} - -#[derive(Serialize, Deserialize, Debug, Clone)] -pub enum MessageS2C { - Hello { - version: u32, - given_username: String, - next_state: State, - }, - - Goodbye { - reason: GoodbyeReason, - }, - - Chat { - from: String, - message: String, - }, - - Pong {}, - - PlayersUpdate { - players: Vec, - }, - - PlanetData { - planets: Vec, - }, -} - -#[derive(Serialize, Deserialize, Debug, Clone)] -pub struct ProtocolPlayer { - pub rotation: f64, - pub x: f64, - pub y: f64, - pub username: String, -} - -#[derive(Serialize, Deserialize, Debug, Clone)] -pub enum GoodbyeReason { - UnsupportedProtocol { supported: u32, got: u32 }, - UnexpectedPacket, - UnexpectedNextState, - UsernameTaken, - PingPongTimeout, - Done, -} - -#[derive(Serialize, Deserialize, Debug, Clone)] -pub struct ProtocolPlanet { - pub planet_type: PlanetType, - pub x: f64, - pub y: f64, - pub radius: f64, -} - -#[derive(Serialize, Deserialize, Debug, Clone)] -pub enum PlanetType { - Earth, -} - -impl PlanetType { - pub fn as_texture_id(&self) -> String { - match self { - PlanetType::Earth => "earth".to_string(), - } - } -} - -pub fn pc2s(pkt: &MessageC2S) -> Vec { - rmp_serde::to_vec(pkt).unwrap() -} -pub fn ps2c(pkt: &MessageS2C) -> Vec { - rmp_serde::to_vec(pkt).unwrap() -} diff --git a/protocol/src/lib.rs b/protocol/src/lib.rs deleted file mode 100644 index dd759d214c004396f4308f0099eb5d7140cf333e..0000000000000000000000000000000000000000 --- a/protocol/src/lib.rs +++ /dev/null @@ -1,302 +0,0 @@ -use crate::message_c2s::{ - MessageC2SAuthenticateAndBeamOut, MessageC2SChat, MessageC2SGoodbye, MessageC2SHello, - MessageC2SInput, MessageC2SModuleDetach, MessageC2SModuleGrabBegin, MessageC2SModuleGrabEnd, - MessageC2SMouseInput, MessageC2SPing, -}; -use crate::message_s2c::{ - MessageS2CChat, MessageS2CGoodbye, MessageS2CHello, MessageS2CModuleAdd, - MessageS2CModuleRemove, MessageS2CModuleTreeUpdate, MessageS2CModulesUpdate, - MessageS2CPlanetData, MessageS2CPlayersUpdate, MessageS2CPong, -}; -use crate::planet::PlanetType; -use crate::starkingdoms_protocol::PacketWrapper; -use protobuf::{Enum, Message}; -use std::error::Error; -include!(concat!(env!("OUT_DIR"), "/protos/mod.rs")); - -pub const PROTOCOL_VERSION: u32 = 6; - -pub mod api; - -#[derive(Debug)] -pub enum MessageC2S { - Hello(MessageC2SHello), - Goodbye(MessageC2SGoodbye), - Chat(MessageC2SChat), - Ping(MessageC2SPing), - Input(MessageC2SInput), - AuthenticateAndBeamOut(MessageC2SAuthenticateAndBeamOut), - MouseInput(MessageC2SMouseInput), - ModuleGrabBegin(MessageC2SModuleGrabBegin), - ModuleGrabEnd(MessageC2SModuleGrabEnd), - ModuleDetach(MessageC2SModuleDetach), -} - -#[derive(Debug)] -pub enum MessageS2C { - Hello(MessageS2CHello), - Goodbye(MessageS2CGoodbye), - Chat(MessageS2CChat), - Pong(MessageS2CPong), - PlayersUpdate(MessageS2CPlayersUpdate), - PlanetData(MessageS2CPlanetData), - ModulesUpdate(MessageS2CModulesUpdate), - ModuleTreeUpdate(MessageS2CModuleTreeUpdate), - ModuleAdd(MessageS2CModuleAdd), - ModuleRemove(MessageS2CModuleRemove), -} - -impl TryFrom<&[u8]> for MessageC2S { - type Error = Box; - - fn try_from(value: &[u8]) -> Result { - let pkt = PacketWrapper::parse_from_bytes(value)?; - - let deser_pkt = match pkt.packet_id { - _id if _id == message_c2s::message_c2shello::Packet_info::type_.value() as i64 => { - MessageC2S::Hello(MessageC2SHello::parse_from_bytes(&pkt.packet_data)?) - } - _id if _id == message_c2s::message_c2sgoodbye::Packet_info::type_.value() as i64 => { - MessageC2S::Goodbye(MessageC2SGoodbye::parse_from_bytes(&pkt.packet_data)?) - } - _id if _id == message_c2s::message_c2schat::Packet_info::type_.value() as i64 => { - MessageC2S::Chat(MessageC2SChat::parse_from_bytes(&pkt.packet_data)?) - } - _id if _id == message_c2s::message_c2sping::Packet_info::type_.value() as i64 => { - MessageC2S::Ping(MessageC2SPing::parse_from_bytes(&pkt.packet_data)?) - } - _id if _id == message_c2s::message_c2sinput::Packet_info::type_.value() as i64 => { - MessageC2S::Input(MessageC2SInput::parse_from_bytes(&pkt.packet_data)?) - } - _id if _id - == message_c2s::message_c2sauthenticate_and_beam_out::Packet_info::type_.value() - as i64 => - { - MessageC2S::AuthenticateAndBeamOut( - MessageC2SAuthenticateAndBeamOut::parse_from_bytes(&pkt.packet_data)?, - ) - } - _id if _id - == message_c2s::message_c2smouse_input::Packet_info::type_.value() as i64 => - { - MessageC2S::MouseInput(MessageC2SMouseInput::parse_from_bytes(&pkt.packet_data)?) - } - _id if _id - == message_c2s::message_c2smodule_grab_begin::Packet_info::type_.value() as i64 => - { - MessageC2S::ModuleGrabBegin(MessageC2SModuleGrabBegin::parse_from_bytes( - &pkt.packet_data, - )?) - } - _id if _id - == message_c2s::message_c2smodule_grab_end::Packet_info::type_.value() as i64 => - { - MessageC2S::ModuleGrabEnd(MessageC2SModuleGrabEnd::parse_from_bytes( - &pkt.packet_data, - )?) - } - _id if _id - == message_c2s::message_c2smodule_detach::Packet_info::type_.value() as i64 => - { - MessageC2S::ModuleDetach(MessageC2SModuleDetach::parse_from_bytes( - &pkt.packet_data, - )?) - } - _id => { - return Err(format!("Unrecognized C2S packet {}", _id).into()); - } - }; - - Ok(deser_pkt) - } -} - -impl TryInto> for MessageC2S { - type Error = Box; - - fn try_into(self) -> Result, Self::Error> { - let (pkt_id, pkt_bytes) = match self { - MessageC2S::Hello(p) => ( - message_c2s::message_c2shello::Packet_info::type_.value(), - p.write_to_bytes()?, - ), - MessageC2S::Goodbye(p) => ( - message_c2s::message_c2sgoodbye::Packet_info::type_.value(), - p.write_to_bytes()?, - ), - MessageC2S::Chat(p) => ( - message_c2s::message_c2schat::Packet_info::type_.value(), - p.write_to_bytes()?, - ), - MessageC2S::Ping(p) => ( - message_c2s::message_c2sping::Packet_info::type_.value(), - p.write_to_bytes()?, - ), - MessageC2S::Input(p) => ( - message_c2s::message_c2sping::Packet_info::type_.value(), - p.write_to_bytes()?, - ), - MessageC2S::AuthenticateAndBeamOut(p) => ( - message_c2s::message_c2sauthenticate_and_beam_out::Packet_info::type_.value(), - p.write_to_bytes()?, - ), - MessageC2S::MouseInput(p) => ( - message_c2s::message_c2smouse_input::Packet_info::type_.value(), - p.write_to_bytes()?, - ), - MessageC2S::ModuleGrabBegin(p) => ( - message_c2s::message_c2smodule_grab_begin::Packet_info::type_.value(), - p.write_to_bytes()?, - ), - MessageC2S::ModuleGrabEnd(p) => ( - message_c2s::message_c2smodule_grab_end::Packet_info::type_.value(), - p.write_to_bytes()?, - ), - MessageC2S::ModuleDetach(p) => ( - message_c2s::message_c2smodule_detach::Packet_info::type_.value(), - p.write_to_bytes()?, - ), - }; - - let pkt = PacketWrapper { - packet_id: pkt_id as i64, - packet_data: pkt_bytes, - special_fields: Default::default(), - }; - - Ok(pkt.write_to_bytes()?) - } -} - -impl TryFrom<&[u8]> for MessageS2C { - type Error = Box; - - fn try_from(value: &[u8]) -> Result { - let pkt = PacketWrapper::parse_from_bytes(value)?; - - let deser_pkt = match pkt.packet_id { - _id if _id == message_s2c::message_s2chello::Packet_info::type_.value() as i64 => { - MessageS2C::Hello(MessageS2CHello::parse_from_bytes(&pkt.packet_data)?) - } - _id if _id == message_s2c::message_s2cgoodbye::Packet_info::type_.value() as i64 => { - MessageS2C::Goodbye(MessageS2CGoodbye::parse_from_bytes(&pkt.packet_data)?) - } - _id if _id == message_s2c::message_s2cchat::Packet_info::type_.value() as i64 => { - MessageS2C::Chat(MessageS2CChat::parse_from_bytes(&pkt.packet_data)?) - } - _id if _id == message_s2c::message_s2cpong::Packet_info::type_.value() as i64 => { - MessageS2C::Pong(MessageS2CPong::parse_from_bytes(&pkt.packet_data)?) - } - _id if _id - == message_s2c::message_s2cplayers_update::Packet_info::type_.value() as i64 => - { - MessageS2C::PlayersUpdate(MessageS2CPlayersUpdate::parse_from_bytes( - &pkt.packet_data, - )?) - } - _id if _id - == message_s2c::message_s2cplanet_data::Packet_info::type_.value() as i64 => - { - MessageS2C::PlanetData(MessageS2CPlanetData::parse_from_bytes(&pkt.packet_data)?) - } - _id if _id - == message_s2c::message_s2cmodules_update::Packet_info::type_.value() as i64 => - { - MessageS2C::ModulesUpdate(MessageS2CModulesUpdate::parse_from_bytes( - &pkt.packet_data, - )?) - } - _id if _id - == message_s2c::message_s2cmodule_tree_update::Packet_info::type_.value() - as i64 => - { - MessageS2C::ModuleTreeUpdate(MessageS2CModuleTreeUpdate::parse_from_bytes( - &pkt.packet_data, - )?) - } - _id if _id == message_s2c::message_s2cmodule_add::Packet_info::type_.value() as i64 => { - MessageS2C::ModuleAdd(MessageS2CModuleAdd::parse_from_bytes(&pkt.packet_data)?) - } - _id if _id - == message_s2c::message_s2cmodule_remove::Packet_info::type_.value() as i64 => - { - MessageS2C::ModuleRemove(MessageS2CModuleRemove::parse_from_bytes( - &pkt.packet_data, - )?) - } - _ => { - return Err("Not a S2C packet".into()); - } - }; - - Ok(deser_pkt) - } -} - -impl TryInto> for MessageS2C { - type Error = Box; - - fn try_into(self) -> Result, Self::Error> { - let (pkt_id, pkt_bytes) = match self { - MessageS2C::Hello(p) => ( - message_s2c::message_s2chello::Packet_info::type_.value(), - p.write_to_bytes()?, - ), - MessageS2C::Goodbye(p) => ( - message_s2c::message_s2cgoodbye::Packet_info::type_.value(), - p.write_to_bytes()?, - ), - MessageS2C::Chat(p) => ( - message_s2c::message_s2cchat::Packet_info::type_.value(), - p.write_to_bytes()?, - ), - MessageS2C::Pong(p) => ( - message_s2c::message_s2cpong::Packet_info::type_.value(), - p.write_to_bytes()?, - ), - MessageS2C::PlayersUpdate(p) => ( - message_s2c::message_s2cplayers_update::Packet_info::type_.value(), - p.write_to_bytes()?, - ), - MessageS2C::PlanetData(p) => ( - message_s2c::message_s2cplanet_data::Packet_info::type_.value(), - p.write_to_bytes()?, - ), - MessageS2C::ModulesUpdate(p) => ( - message_s2c::message_s2cmodules_update::Packet_info::type_.value(), - p.write_to_bytes()?, - ), - MessageS2C::ModuleTreeUpdate(p) => ( - message_s2c::message_s2cmodule_tree_update::Packet_info::type_.value(), - p.write_to_bytes()?, - ), - MessageS2C::ModuleAdd(p) => ( - message_s2c::message_s2cmodule_add::Packet_info::type_.value(), - p.write_to_bytes()?, - ), - MessageS2C::ModuleRemove(p) => ( - message_s2c::message_s2cmodule_remove::Packet_info::type_.value(), - p.write_to_bytes()?, - ), - }; - - let pkt = PacketWrapper { - packet_id: pkt_id as i64, - packet_data: pkt_bytes, - special_fields: Default::default(), - }; - - Ok(pkt.write_to_bytes()?) - } -} - -impl PlanetType { - pub fn as_texture_id(&self) -> String { - match self { - PlanetType::Earth => "earth".to_string(), - PlanetType::Moon => "moon".to_string(), - PlanetType::Mars => "mars".to_string(), - PlanetType::UNKNOWN => "missing".to_string(), - } - } -} diff --git a/protocol/src/pbuf/goodbye_reason.proto b/protocol/src/pbuf/goodbye_reason.proto deleted file mode 100644 index 1679dfda8c78b9f92924eb09822235a004b1b934..0000000000000000000000000000000000000000 --- a/protocol/src/pbuf/goodbye_reason.proto +++ /dev/null @@ -1,12 +0,0 @@ -syntax = "proto3"; -package protocol.goodbye_reason; - -enum GoodbyeReason { - UNKNOWN = 0; - UnsupportedProtocol = 1; - UnexpectedPacket = 2; - UnexpectedNextState = 3; - UsernameTaken = 4; - PingPongTimeout = 5; - Done = 6; -} \ No newline at end of file diff --git a/protocol/src/pbuf/input.proto b/protocol/src/pbuf/input.proto deleted file mode 100644 index 85f62bfd5955fd7e53d17b26b461e68ab7f00dbb..0000000000000000000000000000000000000000 --- a/protocol/src/pbuf/input.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; -package protocol.input; - -enum InputType { - UNKNOWN = 0; - Left = 1; - Middle = 2; - Right = 3; -} \ No newline at end of file diff --git a/protocol/src/pbuf/message_c2s.proto b/protocol/src/pbuf/message_c2s.proto deleted file mode 100644 index 8033d084f4058b9f1e1bd4bb6cebfcdc565439cc..0000000000000000000000000000000000000000 --- a/protocol/src/pbuf/message_c2s.proto +++ /dev/null @@ -1,82 +0,0 @@ -syntax = "proto3"; -package protocol.message_c2s; - -import "state.proto"; -import "goodbye_reason.proto"; -import "input.proto"; - -message MessageC2SHello { - enum packet_info { unknown = 0; type = 0x01; } - - uint32 version = 1; // Version of the protocol. Currently always 1 - string requested_username = 2; // The username that the client is requesting. - protocol.state.State next_state = 3; // The state the connection will go into after the handshake. - - string token = 4; - string user = 5; -} - -message MessageC2SGoodbye { - enum packet_info { unknown = 0; type = 0x02; } - - protocol.goodbye_reason.GoodbyeReason reason = 1; // The reason the client is disconnecting the server -} - -message MessageC2SChat { - enum packet_info { unknown = 0; type = 0x03; } - - string message = 1; // The chat message to sent -} - -message MessageC2SPing { - enum packet_info { unknown = 0; type = 0x04; } -} - -message MessageC2SInput { - enum packet_info { unknown = 0; type = 0x0b; } - - bool up_pressed = 1; - bool down_pressed = 2; - bool left_pressed = 3; - bool right_pressed = 4; - - -} - -message MessageC2SAuthenticateAndBeamOut { - enum packet_info { unknown = 0; type = 0x0c; } - - string user_id = 1; // The user ID that the client is authenticating as - string token = 2; // The token from the authentication server that the user is authenticating as -} - -message MessageC2SMouseInput { - enum packet_info { unknown = 0; type = 0x0d; } - - double worldpos_x = 1; - double worldpos_y = 2; - protocol.input.InputType button = 3; - bool released = 4; -} - -message MessageC2SModuleGrabBegin { - enum packet_info { unknown = 0; type = 0x0e; } - - uint32 module_id = 1; - double worldpos_x = 2; - double worldpos_y = 3; -} - -message MessageC2SModuleGrabEnd { - enum packet_info { unknown = 0; type = 0x0f; } - - uint32 module_id = 1; - double worldpos_x = 2; - double worldpos_y = 3; -} - -message MessageC2SModuleDetach { - enum packet_info { unknown = 0; type = 0x10; } - - uint32 module_id = 1; -} diff --git a/protocol/src/pbuf/message_s2c.proto b/protocol/src/pbuf/message_s2c.proto deleted file mode 100644 index 72c58336c12acdc5cdaa32cefdf333e01bedd037..0000000000000000000000000000000000000000 --- a/protocol/src/pbuf/message_s2c.proto +++ /dev/null @@ -1,69 +0,0 @@ -syntax = "proto3"; -package protocol.message_s2c; - -import "state.proto"; -import "goodbye_reason.proto"; -import "player.proto"; -import "planet.proto"; -import "module.proto"; - -message MessageS2CHello { - enum packet_info { unknown = 0; type = 0x05; } - - uint32 version = 1; // The version of the protocol in use. Currently always 1. - string given_username = 2; // The username actually assigned to the player - protocol.state.State next_state = 3; // The state to switch the game into -} - -message MessageS2CGoodbye { - enum packet_info { unknown = 0; type = 0x06; } - - protocol.goodbye_reason.GoodbyeReason reason = 1; // The reason for the disconnect -} - -message MessageS2CChat { - enum packet_info { unknown = 0; type = 0x07; } - - string from = 1; // The username of the player who sent the message - string message = 2; // The contents of the chat message -} - -message MessageS2CPong { - enum packet_info { unknown = 0; type = 0x08; } -} - -message MessageS2CPlayersUpdate { - enum packet_info { unknown = 0; type = 0x09; } - - repeated protocol.player.Player players = 1; // List of all players in the server -} - -message MessageS2CPlanetData { - enum packet_info { unknown = 0; type = 0x0a; } - - repeated protocol.planet.Planet planets = 1; // List of all planets on the server -} - -message MessageS2CModulesUpdate { - enum packet_info { unknown = 0; type = 0x0b; } - - repeated protocol.module.Module modules = 1; -} - -message MessageS2CModuleTreeUpdate { - enum packet_info { unknown = 0; type = 0x0c; } - - repeated protocol.module.AttachedModule tree = 1; -} - -message MessageS2CModuleAdd { - enum packet_info { unknown = 0; type = 0x0d; } - - protocol.module.AttachedModule module = 1; -} - -message MessageS2CModuleRemove { - enum packet_info { unknown = 0; type = 0x0e; } - - protocol.module.Module module = 1; -} diff --git a/protocol/src/pbuf/module.proto b/protocol/src/pbuf/module.proto deleted file mode 100644 index 3112bd92dc6765934b5f55221504506bf07ff104..0000000000000000000000000000000000000000 --- a/protocol/src/pbuf/module.proto +++ /dev/null @@ -1,32 +0,0 @@ -syntax = "proto3"; -package protocol.module; - -message Module { - ModuleType module_type = 1; - double rotation = 2; - double x = 3; - double y = 4; - uint32 id = 5; - uint32 flags = 6; - repeated Attachment children = 7; -} -message AttachedModule { - ModuleType module_type = 1; - double rotation = 2; - double x = 3; - double y = 4; - uint32 id = 5; - repeated Attachment children = 6; -} -message Attachment { - uint32 id = 1; - uint32 slot = 2; -} - -enum ModuleType { - UNKNOWN = 0; - Cargo = 1; - LandingThruster = 2; - LandingThrusterSuspension = 3; - Hub = 4; -} diff --git a/protocol/src/pbuf/planet.proto b/protocol/src/pbuf/planet.proto deleted file mode 100644 index 02225187be2a013b2cb9d1f2b6dc4a1e1fcee326..0000000000000000000000000000000000000000 --- a/protocol/src/pbuf/planet.proto +++ /dev/null @@ -1,16 +0,0 @@ -syntax = "proto3"; -package protocol.planet; - -message Planet { - PlanetType planet_type = 1; // Type of the planet - double x = 2; // Translation on the X axis, in game units - double y = 3; // Translation on the Y axis, in game units - double radius = 4; // The radius of the planet extending out from (x, y) -} - -enum PlanetType { - UNKNOWN = 0; - Earth = 1; - Moon = 2; - Mars = 3; -} \ No newline at end of file diff --git a/protocol/src/pbuf/player.proto b/protocol/src/pbuf/player.proto deleted file mode 100644 index 1d2652ba9c0156697b060431e654763c93a18fd5..0000000000000000000000000000000000000000 --- a/protocol/src/pbuf/player.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; -package protocol.player; - -message Player { - double rotation = 1; // The rotation, clockwise, in degrees, of the player - double x = 2; // The translation on the X axis, in game units, of the player - double y = 3; // The translation on the Y axis, in game units, of the player - string username = 4; // The username of the player -} \ No newline at end of file diff --git a/protocol/src/pbuf/starkingdoms-protocol.proto b/protocol/src/pbuf/starkingdoms-protocol.proto deleted file mode 100644 index b9c270d86776d8e80cf9dbe2f98ad9841c5b2288..0000000000000000000000000000000000000000 --- a/protocol/src/pbuf/starkingdoms-protocol.proto +++ /dev/null @@ -1,15 +0,0 @@ -syntax = "proto3"; -package protocol; - -import public "message_c2s.proto"; -import public "state.proto"; -import public "goodbye_reason.proto"; -import public "message_s2c.proto"; -import public "player.proto"; -import public "planet.proto"; -import public "input.proto"; - -message PacketWrapper { - int64 packet_id = 1; // What is the Packet ID of this packet? - bytes packet_data = 2; // Protobuf-encoded bytearray containing the actual packet -} \ No newline at end of file diff --git a/protocol/src/pbuf/state.proto b/protocol/src/pbuf/state.proto deleted file mode 100644 index 9aa7e6565426c6dee7d6ddffb333717463bf1dba..0000000000000000000000000000000000000000 --- a/protocol/src/pbuf/state.proto +++ /dev/null @@ -1,8 +0,0 @@ -syntax = "proto3"; -package protocol.state; - -enum State { - UNKNOWN = 0; - Handshake = 1; - Play = 2; -} \ No newline at end of file diff --git a/server.Dockerfile b/server.Dockerfile deleted file mode 100644 index a0d146f5c547166bd99d26b3ac3f168c64dc1fec..0000000000000000000000000000000000000000 --- a/server.Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM ghcr.io/void-linux/void-linux:latest-full-x86_64 - -RUN xbps-install -S && xbps-install -f base-files && xbps-install -Syyff gcc - -COPY target/release/starkingdoms-server /bin/starkingdoms-server - -CMD ["/bin/starkingdoms-server"] \ No newline at end of file diff --git a/server/Cargo.lock b/server/Cargo.lock index 49d10f35e7064595e82b07fa873606d04953e63f..c47c13bb1b2594ed1f2a19074fc15d2f0cef7861 100644 --- a/server/Cargo.lock +++ b/server/Cargo.lock @@ -2,6 +2,4018 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "ab_glyph" +version = "0.2.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80179d7dd5d7e8c285d67c4a1e652972a92de7475beddfb92028c76463b13225" +dependencies = [ + "ab_glyph_rasterizer", + "owned_ttf_parser", +] + +[[package]] +name = "ab_glyph_rasterizer" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" + +[[package]] +name = "accesskit" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca8410747ed85a17c4a1e9ed3f5a74d3e7bdcc876cf9a18ff40ae21d645997b2" + +[[package]] +name = "accesskit_consumer" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c17cca53c09fbd7288667b22a201274b9becaa27f0b91bf52a526db95de45e6" +dependencies = [ + "accesskit", +] + +[[package]] +name = "accesskit_macos" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd3b6ae1eabbfbced10e840fd3fce8a93ae84f174b3e4ba892ab7bcb42e477a7" +dependencies = [ + "accesskit", + "accesskit_consumer", + "objc2", + "once_cell", +] + +[[package]] +name = "accesskit_windows" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afcae27ec0974fc7c3b0b318783be89fd1b2e66dd702179fe600166a38ff4a0b" +dependencies = [ + "accesskit", + "accesskit_consumer", + "once_cell", + "paste", + "static_assertions", + "windows 0.48.0", +] + +[[package]] +name = "accesskit_winit" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88e39fcec2e10971e188730b7a76bab60647dacc973d4591855ebebcadfaa738" +dependencies = [ + "accesskit", + "accesskit_macos", + "accesskit_windows", + "winit", +] + +[[package]] +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "ahash" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" +dependencies = [ + "cfg-if", + "getrandom", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" + +[[package]] +name = "alsa" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2562ad8dcf0f789f65c6fdaad8a8a9708ed6b488e649da28c01656ad66b8b47" +dependencies = [ + "alsa-sys", + "bitflags 1.3.2", + "libc", + "nix 0.24.3", +] + +[[package]] +name = "alsa-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db8fee663d06c4e303404ef5f40488a53e062f89ba8bfed81f42325aafad1527" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "android-activity" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64529721f27c2314ced0890ce45e469574a73e5e6fdd6e9da1860eb29285f5e0" +dependencies = [ + "android-properties", + "bitflags 1.3.2", + "cc", + "jni-sys", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "num_enum 0.6.1", +] + +[[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.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ecc8056bf6ab9892dcd53216c83d1597487d7dacac16c8df6b877d127df9937" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "approx" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" +dependencies = [ + "num-traits", +] + +[[package]] +name = "arrayref" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" + +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + +[[package]] +name = "ash" +version = "0.37.3+1.3.251" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39e9c3835d686b0a6084ab4234fcd1b07dbf6e4767dce60874b12356a25ecd4a" +dependencies = [ + "libloading 0.7.4", +] + +[[package]] +name = "async-broadcast" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c48ccdbf6ca6b121e0f586cbc0e73ae440e56c67c30fa0873b4e110d9c26d2b" +dependencies = [ + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-channel" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d37875bd9915b7d67c2f117ea2c30a0989874d0b2cb694fe25403c85763c0c9e" +dependencies = [ + "concurrent-queue", + "event-listener 3.1.0", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b0c4a4f319e45986f347ee47fef8bf5e81c9abc3f6f58dc2391439f30df65f0" +dependencies = [ + "async-lock 2.8.0", + "async-task", + "concurrent-queue", + "fastrand 2.0.1", + "futures-lite 1.13.0", + "slab", +] + +[[package]] +name = "async-fs" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "279cf904654eeebfa37ac9bb1598880884924aab82e290aa65c9e77a0e142e06" +dependencies = [ + "async-lock 2.8.0", + "autocfg", + "blocking", + "futures-lite 1.13.0", +] + +[[package]] +name = "async-lock" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" +dependencies = [ + "event-listener 2.5.3", +] + +[[package]] +name = "async-lock" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "deb2ab2aa8a746e221ab826c73f48bc6ba41be6763f0855cb249eb6d154cf1d7" +dependencies = [ + "event-listener 3.1.0", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-task" +version = "4.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4eb2cdb97421e01129ccb49169d8279ed21e829929144f4a22a6e54ac549ca1" + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "backtrace" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.21.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" + +[[package]] +name = "bevy" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "329e344f835f5a9a4c46a6d1d57371f726aa2c482d1bd669b2b9c4eb1ee91fd7" +dependencies = [ + "bevy_internal", +] + +[[package]] +name = "bevy_a11y" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271b812e5734f5056a400f7d64592dd82d6c0e6179389c2f066f433ab8bc7692" +dependencies = [ + "accesskit", + "bevy_app", + "bevy_derive", + "bevy_ecs", +] + +[[package]] +name = "bevy_animation" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab94187a1253433e14f175293d8a86ec1c2822fda2a17807908f11ec21f45f00" +dependencies = [ + "bevy_app", + "bevy_asset", + "bevy_core", + "bevy_ecs", + "bevy_hierarchy", + "bevy_math", + "bevy_reflect", + "bevy_render", + "bevy_time", + "bevy_transform", + "bevy_utils", +] + +[[package]] +name = "bevy_app" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "172d532ea812e5954fa814dae003c207f2a0b20c6e50431787c94a7159677ece" +dependencies = [ + "bevy_derive", + "bevy_ecs", + "bevy_reflect", + "bevy_tasks", + "bevy_utils", + "downcast-rs", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "bevy_asset" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccb2b67984088b23e223cfe9ec1befd89a110665a679acb06839bc4334ed37d6" +dependencies = [ + "async-broadcast", + "async-fs", + "async-lock 2.8.0", + "bevy_app", + "bevy_asset_macros", + "bevy_ecs", + "bevy_log", + "bevy_reflect", + "bevy_tasks", + "bevy_utils", + "bevy_winit", + "blake3", + "crossbeam-channel", + "downcast-rs", + "futures-io", + "futures-lite 1.13.0", + "js-sys", + "parking_lot", + "ron", + "serde", + "thiserror", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "bevy_asset_macros" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b3245193e90fc8abcf1059a467cb224501dcda083d114c67c10ac66b7171e3a" +dependencies = [ + "bevy_macro_utils", + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "bevy_audio" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "478de80ff25cb7decbcb22797774d1597e8c32914e81431c67d64faadc08f84a" +dependencies = [ + "bevy_app", + "bevy_asset", + "bevy_derive", + "bevy_ecs", + "bevy_math", + "bevy_reflect", + "bevy_transform", + "bevy_utils", + "oboe", + "rodio", +] + +[[package]] +name = "bevy_core" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "025e6800b73048092a55c3611e9327ad4c4c17b60517ec1c0086bb40b4b19ea8" +dependencies = [ + "bevy_app", + "bevy_ecs", + "bevy_math", + "bevy_reflect", + "bevy_tasks", + "bevy_utils", + "bytemuck", +] + +[[package]] +name = "bevy_core_pipeline" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e4b08a2d53ba62d9ec1fca3f7f4e0f556e9f59e1c8e63a4b7c2a18c0701152c" +dependencies = [ + "bevy_app", + "bevy_asset", + "bevy_core", + "bevy_derive", + "bevy_ecs", + "bevy_log", + "bevy_math", + "bevy_reflect", + "bevy_render", + "bevy_transform", + "bevy_utils", + "bitflags 2.4.1", + "radsort", + "serde", +] + +[[package]] +name = "bevy_derive" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24bf40259be12a1a24d9fd536f5ff18d31eeb5665b77e2732899783be6edc5d6" +dependencies = [ + "bevy_macro_utils", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "bevy_diagnostic" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41b5a99a9fb6cd7d1eb1714fad193944a0317f0887a15cccb8309c8d37951132" +dependencies = [ + "bevy_app", + "bevy_core", + "bevy_ecs", + "bevy_log", + "bevy_time", + "bevy_utils", + "sysinfo", +] + +[[package]] +name = "bevy_ecs" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae11a1f467c372b50e9d4b55e78370f5420c9db7416200cc441cc84f08174dd3" +dependencies = [ + "async-channel 1.9.0", + "bevy_ecs_macros", + "bevy_ptr", + "bevy_reflect", + "bevy_tasks", + "bevy_utils", + "downcast-rs", + "event-listener 2.5.3", + "fixedbitset", + "rustc-hash", + "serde", + "thiserror", + "thread_local", +] + +[[package]] +name = "bevy_ecs_macros" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f642c2b67c4d0daf8edf15074f6351457eb487a34b3de1290c760d8f3ac9ec16" +dependencies = [ + "bevy_macro_utils", + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "bevy_encase_derive" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65b9fb5a62c4e3ab70caaa839470d35fa932001b1b34b08bc7f7f1909bd2b3a7" +dependencies = [ + "bevy_macro_utils", + "encase_derive_impl", +] + +[[package]] +name = "bevy_gilrs" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad31cc2c84315e0759d793d6c5bcb7d8789bbc16359c98d1b766e708c1bbae49" +dependencies = [ + "bevy_app", + "bevy_ecs", + "bevy_input", + "bevy_log", + "bevy_time", + "bevy_utils", + "gilrs", + "thiserror", +] + +[[package]] +name = "bevy_gizmos" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87d1cc978b91f416b23eb16f00e69f95c3a04582021827d8082e92d4725cc510" +dependencies = [ + "bevy_app", + "bevy_asset", + "bevy_core", + "bevy_core_pipeline", + "bevy_ecs", + "bevy_math", + "bevy_pbr", + "bevy_reflect", + "bevy_render", + "bevy_sprite", + "bevy_transform", + "bevy_utils", +] + +[[package]] +name = "bevy_gltf" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f933745c0c86e2c07948def581259b466f99708328657054e956275430ccfd7" +dependencies = [ + "base64 0.13.1", + "bevy_animation", + "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", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "bevy_hierarchy" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64fa240011fce8ee23f9b46e5a26a628a31d7860d6d2e4e0e361bb3ea6d5a703" +dependencies = [ + "bevy_app", + "bevy_core", + "bevy_ecs", + "bevy_log", + "bevy_reflect", + "bevy_utils", + "smallvec", +] + +[[package]] +name = "bevy_input" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e86e241b3a10b79f65a69205552546723b855d3d4c1bd8261637c076144d32f" +dependencies = [ + "bevy_app", + "bevy_ecs", + "bevy_math", + "bevy_reflect", + "bevy_utils", + "thiserror", +] + +[[package]] +name = "bevy_internal" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55124e486814c4d3632d5cfad9c4f4e46d052c028593ec46fef5bfbfb0f840b1" +dependencies = [ + "bevy_a11y", + "bevy_animation", + "bevy_app", + "bevy_asset", + "bevy_audio", + "bevy_core", + "bevy_core_pipeline", + "bevy_derive", + "bevy_diagnostic", + "bevy_ecs", + "bevy_gilrs", + "bevy_gizmos", + "bevy_gltf", + "bevy_hierarchy", + "bevy_input", + "bevy_log", + "bevy_math", + "bevy_pbr", + "bevy_ptr", + "bevy_reflect", + "bevy_render", + "bevy_scene", + "bevy_sprite", + "bevy_tasks", + "bevy_text", + "bevy_time", + "bevy_transform", + "bevy_ui", + "bevy_utils", + "bevy_window", + "bevy_winit", +] + +[[package]] +name = "bevy_log" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "011417debf7868b45932bb97fc0d5bfdeaf9304e324aa94840e2f1e6deeed69d" +dependencies = [ + "android_log-sys", + "bevy_app", + "bevy_ecs", + "bevy_utils", + "console_error_panic_hook", + "tracing-log 0.1.4", + "tracing-subscriber", + "tracing-wasm", +] + +[[package]] +name = "bevy_macro_utils" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf6fba87c6d069fcbcd8a48625ca8ab4392ad40d2b260863ce7d641a0f42986d" +dependencies = [ + "proc-macro2", + "quote", + "rustc-hash", + "syn 2.0.39", + "toml_edit 0.20.7", +] + +[[package]] +name = "bevy_math" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "752764558a1f429c20704c3b836a019fa308961c43fdfef4f08e339d456c96be" +dependencies = [ + "glam", + "serde", +] + +[[package]] +name = "bevy_mikktspace" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b596c41a56f2268ec7cde560edc588bc7b5886e4b49c8b27c4dcc9f7c743424c" +dependencies = [ + "glam", +] + +[[package]] +name = "bevy_pbr" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eeb6a35a78d355cc21c10f277dcd171eca65e30a90e76eb89f4dacf606621fe1" +dependencies = [ + "bevy_app", + "bevy_asset", + "bevy_core_pipeline", + "bevy_derive", + "bevy_ecs", + "bevy_math", + "bevy_reflect", + "bevy_render", + "bevy_transform", + "bevy_utils", + "bevy_window", + "bitflags 2.4.1", + "bytemuck", + "fixedbitset", + "naga_oil", + "radsort", + "smallvec", + "thread_local", +] + +[[package]] +name = "bevy_ptr" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "308a02679f6ce21ef71de20fae6d6a2016c07baa21d8e8d0558e6b7851e8adf2" + +[[package]] +name = "bevy_reflect" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdd56914a8ad57621d7a1a099f7e6b1f7482c9c76cedc9c3d4c175a203939c5d" +dependencies = [ + "bevy_math", + "bevy_ptr", + "bevy_reflect_derive", + "bevy_utils", + "downcast-rs", + "erased-serde", + "glam", + "serde", + "smallvec", + "smol_str", + "thiserror", +] + +[[package]] +name = "bevy_reflect_derive" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25f627907c40ac552f798423447fc331fc1ddacd94c5f7a2a70942eb06bc8447" +dependencies = [ + "bevy_macro_utils", + "proc-macro2", + "quote", + "syn 2.0.39", + "uuid", +] + +[[package]] +name = "bevy_render" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90d777f4c51bd58e9e40777c6cb8dde0778df7e2c5298b3f9e3455bd12a9856c" +dependencies = [ + "async-channel 1.9.0", + "bevy_app", + "bevy_asset", + "bevy_core", + "bevy_derive", + "bevy_ecs", + "bevy_encase_derive", + "bevy_hierarchy", + "bevy_log", + "bevy_math", + "bevy_mikktspace", + "bevy_reflect", + "bevy_render_macros", + "bevy_tasks", + "bevy_time", + "bevy_transform", + "bevy_utils", + "bevy_window", + "bitflags 2.4.1", + "bytemuck", + "codespan-reporting", + "downcast-rs", + "encase", + "futures-lite 1.13.0", + "hexasphere", + "image", + "js-sys", + "ktx2", + "naga", + "naga_oil", + "ruzstd", + "serde", + "smallvec", + "thiserror", + "thread_local", + "wasm-bindgen", + "web-sys", + "wgpu", +] + +[[package]] +name = "bevy_render_macros" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35b00c3d0abff94a729460fc9aa95c2ceac71b49b3041166bb5ba3098e9657e7" +dependencies = [ + "bevy_macro_utils", + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "bevy_scene" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6294396a6375f0b14341d8003408c10aa040e3f833ac8bd49677170ec55d73" +dependencies = [ + "bevy_app", + "bevy_asset", + "bevy_derive", + "bevy_ecs", + "bevy_hierarchy", + "bevy_reflect", + "bevy_render", + "bevy_transform", + "bevy_utils", + "ron", + "serde", + "thiserror", + "uuid", +] + +[[package]] +name = "bevy_sprite" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4f7d1f88a6e5497fdafd95c20984a1d1b5517bc39d51600b4988cd60c51837a" +dependencies = [ + "bevy_app", + "bevy_asset", + "bevy_core_pipeline", + "bevy_derive", + "bevy_ecs", + "bevy_log", + "bevy_math", + "bevy_reflect", + "bevy_render", + "bevy_transform", + "bevy_utils", + "bitflags 2.4.1", + "bytemuck", + "fixedbitset", + "guillotiere", + "radsort", + "rectangle-pack", + "thiserror", +] + +[[package]] +name = "bevy_tasks" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a45be906618192515bc613e46546150089adbb4a82178dc462045acd1e89e92" +dependencies = [ + "async-channel 1.9.0", + "async-executor", + "async-task", + "concurrent-queue", + "futures-lite 1.13.0", + "wasm-bindgen-futures", +] + +[[package]] +name = "bevy_text" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c136af700af4f87c94f68d6e019528c371bf09ebf4a8ff7468bb3c73806b34f5" +dependencies = [ + "ab_glyph", + "bevy_app", + "bevy_asset", + "bevy_ecs", + "bevy_math", + "bevy_reflect", + "bevy_render", + "bevy_sprite", + "bevy_transform", + "bevy_utils", + "bevy_window", + "glyph_brush_layout", + "serde", + "thiserror", +] + +[[package]] +name = "bevy_time" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b29709cadf22d318a0b7c79f763e9c5ac414292bd0e850066fa935959021b276" +dependencies = [ + "bevy_app", + "bevy_ecs", + "bevy_reflect", + "bevy_utils", + "crossbeam-channel", + "thiserror", +] + +[[package]] +name = "bevy_transform" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70262c51e915b6224129206d23823364e650cf5eb5f4b6ce3ee379f608c180d2" +dependencies = [ + "bevy_app", + "bevy_ecs", + "bevy_hierarchy", + "bevy_math", + "bevy_reflect", + "thiserror", +] + +[[package]] +name = "bevy_twite" +version = "0.1.0" +source = "git+https://gitlab.com/ghostlyzsh/twite.git#6d54f37b7c392d2df993ee1cae2064b7ac410da7" +dependencies = [ + "bevy", + "crossbeam-channel", + "twite", +] + +[[package]] +name = "bevy_ui" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd5ecbf2dceaab118769dd870e34d780bfde556af561fd10d8d613b0f237297e" +dependencies = [ + "bevy_a11y", + "bevy_app", + "bevy_asset", + "bevy_core_pipeline", + "bevy_derive", + "bevy_ecs", + "bevy_hierarchy", + "bevy_input", + "bevy_log", + "bevy_math", + "bevy_reflect", + "bevy_render", + "bevy_sprite", + "bevy_text", + "bevy_transform", + "bevy_utils", + "bevy_window", + "bytemuck", + "serde", + "smallvec", + "taffy", + "thiserror", +] + +[[package]] +name = "bevy_utils" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8e75d4a34ef0b15dffd1ee9079ef1f0f5139527e192b9d5708b3e158777c753" +dependencies = [ + "ahash", + "bevy_utils_proc_macros", + "getrandom", + "hashbrown 0.14.2", + "instant", + "nonmax", + "petgraph", + "thiserror", + "tracing", + "uuid", +] + +[[package]] +name = "bevy_utils_proc_macros" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7dfd3735a61a1b681ed1e176afe4eae731bbb03e51ad871e9eb39e76a2d170e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "bevy_window" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e60d1830b3fbd7db5bfea7ac9fcd0f5e1d1af88c91ab469e697ab176d8b3140b" +dependencies = [ + "bevy_a11y", + "bevy_app", + "bevy_ecs", + "bevy_input", + "bevy_math", + "bevy_reflect", + "bevy_utils", + "raw-window-handle", +] + +[[package]] +name = "bevy_winit" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f8294e78c6a1f9c34d36501a377c5d20bf0fa23a0958187bb270187741448ba" +dependencies = [ + "accesskit_winit", + "approx", + "bevy_a11y", + "bevy_app", + "bevy_derive", + "bevy_ecs", + "bevy_hierarchy", + "bevy_input", + "bevy_math", + "bevy_tasks", + "bevy_utils", + "bevy_window", + "crossbeam-channel", + "raw-window-handle", + "wasm-bindgen", + "web-sys", + "winit", +] + +[[package]] +name = "bindgen" +version = "0.69.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ffcebc3849946a7170a05992aac39da343a90676ab392c51a4280981d6379c2" +dependencies = [ + "bitflags 2.4.1", + "cexpr", + "clang-sys", + "lazy_static", + "lazycell", + "peeking_take_while", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn 2.0.39", +] + +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +dependencies = [ + "serde", +] + +[[package]] +name = "blake3" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0231f06152bf547e9c2b5194f247cd97aacf6dcd8b15d8e5ec0663f64580da87" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", +] + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[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 = "blocking" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118" +dependencies = [ + "async-channel 2.1.0", + "async-lock 3.1.0", + "async-task", + "fastrand 2.0.1", + "futures-io", + "futures-lite 2.0.1", + "piper", + "tracing", +] + +[[package]] +name = "bumpalo" +version = "3.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" + +[[package]] +name = "bytemuck" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "965ab7eb5f8f97d2a083c799f3a1b994fc397b2fe2da5d1da1626ce15a39f2b1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" + +[[package]] +name = "cc" +version = "1.0.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "jobserver", + "libc", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" + +[[package]] +name = "clang-sys" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c688fc74432808e3eb684cae8830a86be1d66a2bd58e1f248ed0960a590baf6f" +dependencies = [ + "glob", + "libc", + "libloading 0.7.4", +] + +[[package]] +name = "codespan-reporting" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +dependencies = [ + "termcolor", + "unicode-width", +] + +[[package]] +name = "color_quant" +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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "concurrent-queue" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f057a694a54f12365049b0958a1685bb52d567f5593b355fbf685838e873d400" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + +[[package]] +name = "const_panic" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6051f239ecec86fde3410901ab7860d458d160371533842974fc61f96d15879b" + +[[package]] +name = "const_soft_float" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ca1caa64ef4ed453e68bb3db612e51cf1b2f5b871337f0fcab1c8f87cc3dff" + +[[package]] +name = "constant_time_eq" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" + +[[package]] +name = "constgebra" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd23e864550e6dafc1e41ac78ce4f1ccddc8672b40c403524a04ff3f0518420" +dependencies = [ + "const_soft_float", +] + +[[package]] +name = "core-foundation" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" + +[[package]] +name = "core-graphics" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-graphics-types", + "foreign-types 0.3.2", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bb142d41022986c1d8ff29103a1411c8a3dfad3552f87a4f8dc50d61d4f4e33" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "libc", +] + +[[package]] +name = "coreaudio-rs" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "321077172d79c662f64f5071a03120748d5bb652f5231570141be24cfcd2bace" +dependencies = [ + "bitflags 1.3.2", + "core-foundation-sys", + "coreaudio-sys", +] + +[[package]] +name = "coreaudio-sys" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3120ebb80a9de008e638ad833d4127d50ea3d3a960ea23ea69bc66d9358a028" +dependencies = [ + "bindgen", +] + +[[package]] +name = "cpal" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d959d90e938c5493000514b446987c07aed46c668faaa7d34d6c7a67b1a578c" +dependencies = [ + "alsa", + "core-foundation-sys", + "coreaudio-rs", + "dasp_sample", + "jni 0.19.0", + "js-sys", + "libc", + "mach2", + "ndk", + "ndk-context", + "oboe", + "once_cell", + "parking_lot", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows 0.46.0", +] + +[[package]] +name = "cpufeatures" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "d3d12" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e16e44ab292b1dddfdaf7be62cfd8877df52f2f3fde5858d95bab606be259f20" +dependencies = [ + "bitflags 2.4.1", + "libloading 0.8.1", + "winapi", +] + +[[package]] +name = "dasp_sample" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f" + +[[package]] +name = "data-encoding" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308" + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "downcast-rs" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" + +[[package]] +name = "encase" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fce2eeef77fd4a293a54b62aa00ac9daebfbcda4bf8998c5a815635b004aa1c" +dependencies = [ + "const_panic", + "encase_derive", + "glam", + "thiserror", +] + +[[package]] +name = "encase_derive" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e520cde08cbf4f7cc097f61573ec06ce467019803de8ae82fb2823fa1554a0e" +dependencies = [ + "encase_derive_impl", +] + +[[package]] +name = "encase_derive_impl" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fe2568f851fd6144a45fa91cfed8fe5ca8fc0b56ba6797bfc1ed2771b90e37c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "erased-serde" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c138974f9d5e7fe373eb04df7cae98833802ae4b11c24ac7039a21d5af4b26c" +dependencies = [ + "serde", +] + +[[package]] +name = "euclid" +version = "0.22.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f253bc5c813ca05792837a0ff4b3a580336b224512d48f7eda1d7dd9210787" +dependencies = [ + "num-traits", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "event-listener" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d93877bcde0eb80ca09131a08d23f0a5c18a620b01db137dba666d18cd9b30c2" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d96b852f1345da36d551b9473fa1e2b1eb5c5195585c6c018118bc92a8d91160" +dependencies = [ + "event-listener 3.1.0", + "pin-project-lite", +] + +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + +[[package]] +name = "fastrand" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" + +[[package]] +name = "fdeflate" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64d6dafc854908ff5da46ff3f8f473c6984119a2876a383a860246dd7841a868" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "flate2" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared 0.1.1", +] + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared 0.3.1", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-core" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" + +[[package]] +name = "futures-io" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" + +[[package]] +name = "futures-lite" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" +dependencies = [ + "fastrand 1.9.0", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite", + "waker-fn", +] + +[[package]] +name = "futures-lite" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3831c2651acb5177cbd83943f3d9c8912c5ad03c76afcc0e9511ba568ec5ebb" +dependencies = [ + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "gilrs" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e9eec02069fcbd7abe00a28adf216547774889129a777cb5e53fdfb75d59f09" +dependencies = [ + "fnv", + "gilrs-core", + "log", + "uuid", + "vec_map", +] + +[[package]] +name = "gilrs-core" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "178769da179a47b187837d1ab2b5b9b684a21180166a77a4ca37e7e58ee3833d" +dependencies = [ + "core-foundation", + "inotify", + "io-kit-sys", + "js-sys", + "libc", + "libudev-sys", + "log", + "nix 0.27.1", + "uuid", + "vec_map", + "wasm-bindgen", + "web-sys", + "windows 0.51.1", +] + +[[package]] +name = "gimli" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" + +[[package]] +name = "glam" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5418c17512bdf42730f9032c74e1ae39afc408745ebb2acf72fbc4691c17945" +dependencies = [ + "bytemuck", + "serde", +] + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] +name = "glow" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca0fe580e4b60a8ab24a868bc08e2f03cbcb20d3d676601fa909386713333728" +dependencies = [ + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gltf" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad2dcfb6dd7a66f9eb3d181a29dcfb22d146b0bcdc2e1ed1713cbf03939a88ea" +dependencies = [ + "byteorder", + "gltf-json", + "lazy_static", +] + +[[package]] +name = "gltf-derive" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2cbcea5dd47e7ad4e9ee6f040384fcd7204bbf671aa4f9e7ca7dfc9bfa1de20" +dependencies = [ + "inflections", + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "gltf-json" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5b810806b78dde4b71a95cc0e6fdcab34c4c617da3574df166f9987be97d03" +dependencies = [ + "gltf-derive", + "serde", + "serde_derive", + "serde_json", +] + +[[package]] +name = "glyph_brush_layout" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc32c2334f00ca5ac3695c5009ae35da21da8c62d255b5b96d56e2597a637a38" +dependencies = [ + "ab_glyph", + "approx", + "xi-unicode", +] + +[[package]] +name = "gpu-alloc" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" +dependencies = [ + "bitflags 2.4.1", + "gpu-alloc-types", +] + +[[package]] +name = "gpu-alloc-types" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" +dependencies = [ + "bitflags 2.4.1", +] + +[[package]] +name = "gpu-allocator" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce95f9e2e11c2c6fadfce42b5af60005db06576f231f5c92550fdded43c423e8" +dependencies = [ + "backtrace", + "log", + "thiserror", + "winapi", + "windows 0.44.0", +] + +[[package]] +name = "gpu-descriptor" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc11df1ace8e7e564511f53af41f3e42ddc95b56fd07b3f4445d2a6048bc682c" +dependencies = [ + "bitflags 2.4.1", + "gpu-descriptor-types", + "hashbrown 0.14.2", +] + +[[package]] +name = "gpu-descriptor-types" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bf0b36e6f090b7e1d8a4b49c0cb81c1f8376f72198c65dd3ad9ff3556b8b78c" +dependencies = [ + "bitflags 2.4.1", +] + +[[package]] +name = "grid" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eec1c01eb1de97451ee0d60de7d81cf1e72aabefb021616027f3d1c3ec1c723c" + +[[package]] +name = "guillotiere" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62d5865c036cb1393e23c50693df631d3f5d7bcca4c04fe4cc0fd592e74a782" +dependencies = [ + "euclid", + "svg_fmt", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" +dependencies = [ + "ahash", + "allocator-api2", + "serde", +] + +[[package]] +name = "hassle-rs" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1397650ee315e8891a0df210707f0fc61771b0cc518c3023896064c5407cb3b0" +dependencies = [ + "bitflags 1.3.2", + "com-rs", + "libc", + "libloading 0.7.4", + "thiserror", + "widestring", + "winapi", +] + +[[package]] +name = "hexasphere" +version = "9.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cb3df16a7bcb1b5bc092abd55e14f77ca70aea14445026e264586fc62889a10" +dependencies = [ + "constgebra", + "glam", +] + +[[package]] +name = "hexf-parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" + +[[package]] +name = "idna" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "image" +version = "0.24.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f3dfdbdd72063086ff443e297b61695500514b1e41095b6fb9a5ab48a70a711" +dependencies = [ + "bytemuck", + "byteorder", + "color_quant", + "num-rational", + "num-traits", + "png", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", +] + +[[package]] +name = "indexmap" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +dependencies = [ + "equivalent", + "hashbrown 0.14.2", +] + +[[package]] +name = "inflections" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a257582fdcde896fd96463bf2d40eefea0580021c0712a0e2b028b60b47a837a" + +[[package]] +name = "inotify" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdd168d97690d0b8c412d6b6c10360277f4d7ee495c5d0d5d5fe0854923255cc" +dependencies = [ + "bitflags 1.3.2", + "inotify-sys", + "libc", +] + +[[package]] +name = "inotify-sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" +dependencies = [ + "libc", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "io-kit-sys" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4769cb30e5dcf1710fc6730d3e94f78c47723a014a567de385e113c737394640" +dependencies = [ + "core-foundation-sys", + "mach2", +] + +[[package]] +name = "itoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" + +[[package]] +name = "jni" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec" +dependencies = [ + "cesu8", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", +] + +[[package]] +name = "jni" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "039022cdf4d7b1cf548d31f60ae783138e5fd42013f6271049d7df7afadef96c" +dependencies = [ + "cesu8", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jobserver" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54c0c35952f67de54bb584e9fd912b3023117cbafc0a77d8f3dee1fb5f572fe8" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "khronos-egl" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c2352bd1d0bceb871cb9d40f24360c8133c11d7486b68b5381c1dd1a32015e3" +dependencies = [ + "libc", + "libloading 0.7.4", + "pkg-config", +] + +[[package]] +name = "ktx2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87d65e08a9ec02e409d27a0139eaa6b9756b4d81fe7cde71f6941a83730ce838" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + +[[package]] +name = "lewton" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "777b48df9aaab155475a83a7df3070395ea1ac6902f5cd062b8f2b028075c030" +dependencies = [ + "byteorder", + "ogg", + "tinyvec", +] + +[[package]] +name = "libc" +version = "0.2.150" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "libloading" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c571b676ddfc9a8c12f1f3d3085a7b163966a8fd8098a90640953ce5f6170161" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "libredox" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3af92c55d7d839293953fcd0fda5ecfe93297cfde6ffbdec13b41d99c0ba6607" +dependencies = [ + "bitflags 2.4.1", + "libc", + "redox_syscall 0.4.1", +] + +[[package]] +name = "libudev-sys" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c8469b4a23b962c1396b9b451dda50ef5b283e8dd309d69033475fa9b334324" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "lock_api" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" + +[[package]] +name = "mach2" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d0d1830bcd151a6fc4aea1369af235b36c1528fe976b8ff678683c9995eade8" +dependencies = [ + "libc", +] + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + +[[package]] +name = "memchr" +version = "2.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" + +[[package]] +name = "metal" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "623b5e6cefd76e58f774bd3cc0c6f5c7615c58c03a97815245a25c3c9bdee318" +dependencies = [ + "bitflags 2.4.1", + "block", + "core-graphics-types", + "foreign-types 0.5.0", + "log", + "objc", + "paste", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" +dependencies = [ + "libc", + "log", + "wasi", + "windows-sys 0.48.0", +] + +[[package]] +name = "naga" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1ceaaa4eedaece7e4ec08c55c640ba03dbb73fb812a6570a59bcf1930d0f70e" +dependencies = [ + "bit-set", + "bitflags 2.4.1", + "codespan-reporting", + "hexf-parse", + "indexmap 1.9.3", + "log", + "num-traits", + "pp-rs", + "rustc-hash", + "spirv", + "termcolor", + "thiserror", + "unicode-xid", +] + +[[package]] +name = "naga_oil" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ac54c77b3529887f9668d3dd81e955e58f252b31a333f836e3548c06460b958" +dependencies = [ + "bit-set", + "codespan-reporting", + "data-encoding", + "indexmap 1.9.3", + "naga", + "once_cell", + "regex", + "regex-syntax 0.7.5", + "rustc-hash", + "thiserror", + "tracing", + "unicode-ident", +] + +[[package]] +name = "ndk" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "451422b7e4718271c8b5b3aadf5adedba43dc76312454b387e98fae0fc951aa0" +dependencies = [ + "bitflags 1.3.2", + "jni-sys", + "ndk-sys", + "num_enum 0.5.11", + "raw-window-handle", + "thiserror", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.4.1+23.1.7779620" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cf2aae958bd232cac5069850591667ad422d263686d75b52a065f9badeee5a3" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "nix" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", +] + +[[package]] +name = "nix" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" +dependencies = [ + "bitflags 2.4.1", + "cfg-if", + "libc", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nonmax" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e4a593ea4fffed8684ad13d75c82cf0b6dc2b88947e0ed85b9e70f555a7e422" + +[[package]] +name = "ntapi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" +dependencies = [ + "winapi", +] + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "num-derive" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive 0.5.11", +] + +[[package]] +name = "num_enum" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" +dependencies = [ + "num_enum_derive 0.6.1", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "num_enum_derive" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" +dependencies = [ + "cc", +] + +[[package]] +name = "object" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +dependencies = [ + "memchr", +] + +[[package]] +name = "oboe" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8868cc237ee02e2d9618539a23a8d228b9bb3fc2e7a5b11eed3831de77c395d0" +dependencies = [ + "jni 0.20.0", + "ndk", + "ndk-context", + "num-derive", + "num-traits", + "oboe-sys", +] + +[[package]] +name = "oboe-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f44155e7fb718d3cfddcf70690b2b51ac4412f347cd9e4fbe511abe9cd7b5f2" +dependencies = [ + "cc", +] + +[[package]] +name = "ogg" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6951b4e8bf21c8193da321bcce9c9dd2e13c858fe078bf9054a288b419ae5d6e" +dependencies = [ + "byteorder", +] + +[[package]] +name = "once_cell" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" + +[[package]] +name = "orbclient" +version = "0.3.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52f0d54bde9774d3a51dcf281a5def240c71996bc6ca05d2c847ec8b2b216166" +dependencies = [ + "libredox", +] + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "owned_ttf_parser" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4586edfe4c648c71797a74c84bacb32b52b212eff5dfe2bb9f2c599844023e7" +dependencies = [ + "ttf-parser", +] + +[[package]] +name = "parking" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.4.1", + "smallvec", + "windows-targets 0.48.5", +] + +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + +[[package]] +name = "peeking_take_while" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" + +[[package]] +name = "percent-encoding" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" + +[[package]] +name = "petgraph" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" +dependencies = [ + "fixedbitset", + "indexmap 2.1.0", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" + +[[package]] +name = "piper" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" +dependencies = [ + "atomic-waker", + "fastrand 2.0.1", + "futures-io", +] + +[[package]] +name = "pkg-config" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" + +[[package]] +name = "png" +version = "0.17.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd75bf2d8dd3702b9707cdbc56a5b9ef42cec752eb8b3bafc01234558442aa64" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "pp-rs" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb458bb7f6e250e6eb79d5026badc10a3ebb8f9a15d1fff0f13d17c71f4d6dee" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro2" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "profiling" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f89dff0959d98c9758c88826cc002e2c3d0b9dfac4139711d1f30de442f1139b" + +[[package]] +name = "quote" +version = "1.0.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "radsort" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17fd96390ed3feda12e1dfe2645ed587e0bea749e319333f104a33ff62f77a0b" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "range-alloc" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8a99fddc9f0ba0a85884b8d14e3592853e787d581ca1816c91349b10e4eeab" + +[[package]] +name = "raw-window-handle" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" + +[[package]] +name = "rectangle-pack" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0d463f2884048e7153449a55166f91028d5b0ea53c79377099ce4e8cf0cf9bb" + +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "regex" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata 0.4.3", + "regex-syntax 0.8.2", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-automata" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.2", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" + +[[package]] +name = "regex-syntax" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" + +[[package]] +name = "renderdoc-sys" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "216080ab382b992234dda86873c18d4c48358f5cfcb70fd693d7f6f2131b628b" + +[[package]] +name = "rmp" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f9860a6cc38ed1da53456442089b4dfa35e7cedaa326df63017af88385e6b20" +dependencies = [ + "byteorder", + "num-traits", + "paste", +] + +[[package]] +name = "rmp-serde" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bffea85eea980d8a74453e5d02a8d93028f3c34725de143085a844ebe953258a" +dependencies = [ + "byteorder", + "rmp", + "serde", +] + +[[package]] +name = "rodio" +version = "0.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b1bb7b48ee48471f55da122c0044fcc7600cfcc85db88240b89cb832935e611" +dependencies = [ + "cpal", + "lewton", +] + +[[package]] +name = "ron" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94" +dependencies = [ + "base64 0.21.5", + "bitflags 2.4.1", + "serde", + "serde_derive", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "ruzstd" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3ffab8f9715a0d455df4bbb9d21e91135aab3cd3ca187af0cd0c3c3f868fdc" +dependencies = [ + "byteorder", + "thiserror-core", + "twox-hash", +] + +[[package]] +name = "ryu" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "serde" +version = "1.0.192" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.192" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "serde_json" +version = "1.0.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +dependencies = [ + "itoa", + "ryu", + "serde", +] + [[package]] name = "server" +version = "0.0.1" +dependencies = [ + "bevy", + "bevy_twite", + "rmp", + "rmp-serde", + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7cee0529a6d40f580e7a5e6c495c8fbfe21b7b52795ed4bb5e62cdf92bc6380" + +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "slotmap" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1e08e261d0e8f5c43123b7adf3e4ca1690d655377ac93a03b2c9d3e98de1342" +dependencies = [ + "version_check", +] + +[[package]] +name = "smallvec" +version = "1.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" +dependencies = [ + "serde", +] + +[[package]] +name = "smol_str" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74212e6bbe9a4352329b2f68ba3130c15a3f26fe88ff22dbdc6cdd58fa85e99c" +dependencies = [ + "serde", +] + +[[package]] +name = "spirv" +version = "0.2.0+1.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "246bfa38fe3db3f1dfc8ca5a2cdeb7348c78be2112740cc0ec8ef18b6d94f830" +dependencies = [ + "bitflags 1.3.2", + "num-traits", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "svg_fmt" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fb1df15f412ee2e9dfc1c504260fa695c1c3f10fe9f4a6ee2d2184d7d6450e2" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sysinfo" +version = "0.29.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a18d114d420ada3a891e6bc8e96a2023402203296a47cdd65083377dad18ba5" +dependencies = [ + "cfg-if", + "core-foundation-sys", + "libc", + "ntapi", + "once_cell", + "winapi", +] + +[[package]] +name = "taffy" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c2287b6d7f721ada4cddf61ade5e760b2c6207df041cac9bfaa192897362fd3" +dependencies = [ + "arrayvec", + "grid", + "num-traits", + "slotmap", +] + +[[package]] +name = "termcolor" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff1bc3d3f05aff0403e8ac0d92ced918ec05b666a43f83297ccef5bea8a3d449" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "thiserror" +version = "1.0.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-core" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d97345f6437bb2004cd58819d8a9ef8e36cdd7661c2abc4bbde0a7c40d9f497" +dependencies = [ + "thiserror-core-impl", +] + +[[package]] +name = "thiserror-core-impl" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10ac1c5050e43014d16b2f94d0d2ce79e65ffdd8b38d8048f9c8f6a8a6da62ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "thread_local" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "toml_datetime" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.1.0", + "toml_datetime", + "winnow", +] + +[[package]] +name = "toml_edit" +version = "0.20.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" +dependencies = [ + "indexmap 2.1.0", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f751112709b4e791d8ce53e32c4ed2d353565a795ce84da2285393f41557bdf2" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log 0.2.0", +] + +[[package]] +name = "tracing-wasm" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4575c663a174420fa2d78f4108ff68f65bf2fbb7dd89f33749b6e826b3626e07" +dependencies = [ + "tracing", + "tracing-subscriber", + "wasm-bindgen", +] + +[[package]] +name = "ttf-parser" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6d21d96b4" + +[[package]] +name = "twite" +version = "0.1.0" +source = "git+https://gitlab.com/ghostlyzsh/twite.git#6d54f37b7c392d2df993ee1cae2064b7ac410da7" +dependencies = [ + "base64 0.21.5", + "rand", + "sha1", + "url", +] + +[[package]] +name = "twox-hash" +version = "1.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" +dependencies = [ + "cfg-if", + "static_assertions", +] + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unicode-bidi" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-width" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" + +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + +[[package]] +name = "url" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "uuid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88ad59a7560b41a70d191093a945f0b87bc1deeda46fb237479708a1d6b6cdfc" +dependencies = [ + "getrandom", + "serde", +] + +[[package]] +name = "valuable" version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "waker-fn" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690" + +[[package]] +name = "walkdir" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7daec296f25a1bae309c0cd5c29c4b260e510e6d813c286b19eaadf409d40fce" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e397f4664c0e4e428e8313a469aaa58310d302159845980fd23b0f22a847f217" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.39", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afec9963e3d0994cac82455b2b3502b81a7f40f9a0d32181f7528d9f4b43e02" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5961017b3b08ad5f3fe39f1e79877f8ee7c23c5e5fd5eb80de95abc41f1f16b2" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d046c5d029ba91a1ed14da14dca44b68bf2f124cfbaf741c54151fdb3e0750b" + +[[package]] +name = "wayland-scanner" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f4303d8fa22ab852f789e75a967f0a2cdc430a607751c0499bada3e451cbd53" +dependencies = [ + "proc-macro2", + "quote", + "xml-rs", +] + +[[package]] +name = "web-sys" +version = "0.3.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5db499c5f66323272151db0e666cd34f78617522fb0c1604d31a27c50c206a85" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wgpu" +version = "0.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "752e44d3998ef35f71830dd1ad3da513e628e2e4d4aedb0ab580f850827a0b41" +dependencies = [ + "arrayvec", + "cfg-if", + "js-sys", + "log", + "naga", + "parking_lot", + "profiling", + "raw-window-handle", + "smallvec", + "static_assertions", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "wgpu-core", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-core" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f8a44dd301a30ceeed3c27d8c0090433d3da04d7b2a4042738095a424d12ae7" +dependencies = [ + "arrayvec", + "bit-vec", + "bitflags 2.4.1", + "codespan-reporting", + "log", + "naga", + "parking_lot", + "profiling", + "raw-window-handle", + "rustc-hash", + "smallvec", + "thiserror", + "web-sys", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-hal" +version = "0.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a80bf0e3c77399bb52850cb0830af9bad073d5cfcb9dd8253bef8125c42db17" +dependencies = [ + "android_system_properties", + "arrayvec", + "ash", + "bit-set", + "bitflags 2.4.1", + "block", + "core-graphics-types", + "d3d12", + "glow", + "gpu-alloc", + "gpu-allocator", + "gpu-descriptor", + "hassle-rs", + "js-sys", + "khronos-egl", + "libc", + "libloading 0.8.1", + "log", + "metal", + "naga", + "objc", + "parking_lot", + "profiling", + "range-alloc", + "raw-window-handle", + "renderdoc-sys", + "rustc-hash", + "smallvec", + "thiserror", + "wasm-bindgen", + "web-sys", + "wgpu-types", + "winapi", +] + +[[package]] +name = "wgpu-types" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee64d7398d0c2f9ca48922c902ef69c42d000c759f3db41e355f4a570b052b67" +dependencies = [ + "bitflags 2.4.1", + "js-sys", + "web-sys", +] + +[[package]] +name = "widestring" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "653f141f39ec16bba3c5abe400a0c60da7468261cc2cbf36805022876bc721a8" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.44.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e745dab35a0c4c77aa3ce42d595e13d2003d6902d6b08c9ef5fc326d08da12b" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdacb41e6a96a052c6cb63a144f24900236121c6f63f4f8219fef5977ecb0c25" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows" +version = "0.51.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca229916c5ee38c2f2bc1e9d8f04df975b4bd93f9955dc69fabb5d91270045c9" +dependencies = [ + "windows-core", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-core" +version = "0.51.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-implement" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e2ee588991b9e7e6c8338edf3333fbe4da35dc72092643958ebb43f0ab2c49c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "windows-interface" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6fb8df20c9bcaa8ad6ab513f7b40104840c8867d5751126e4df3b08388d0cc7" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "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 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "winit" +version = "0.28.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9596d90b45384f5281384ab204224876e8e8bf7d58366d9b795ad99aa9894b94" +dependencies = [ + "android-activity", + "bitflags 1.3.2", + "cfg_aliases", + "core-foundation", + "core-graphics", + "dispatch", + "instant", + "libc", + "log", + "mio", + "ndk", + "objc2", + "once_cell", + "orbclient", + "percent-encoding", + "raw-window-handle", + "redox_syscall 0.3.5", + "wasm-bindgen", + "wayland-scanner", + "web-sys", + "windows-sys 0.45.0", + "x11-dl", +] + +[[package]] +name = "winnow" +version = "0.5.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "829846f3e3db426d4cee4510841b71a8e58aa2a76b1132579487ae430ccd9c7b" +dependencies = [ + "memchr", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "xi-unicode" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a67300977d3dc3f8034dae89778f502b6ba20b269527b3223ba59c0cf393bb8a" + +[[package]] +name = "xml-rs" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fcb9cbac069e033553e8bb871be2fbdffcab578eb25bd0f7c508cedc6dcd75a" + +[[package]] +name = "zerocopy" +version = "0.7.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e97e415490559a91254a2979b4829267a57d2fcd741a98eee8b722fb57289aa0" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd7e48ccf166952882ca8bd778a43502c64f33bf94c12ebe2a7f08e5a0f6689f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] diff --git a/server/Cargo.toml b/server/Cargo.toml index f281dbf7ec22cc05660b6ca6a2ee796d3795252a..9f9d74ceb5f406103261a5ce0f25fcefb895a92a 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -1,41 +1,11 @@ [package] -name = "starkingdoms-server" +name = "server" version = "0.0.1" edition = "2021" -[package.metadata] -version-name = "Super Duper Ultra Alpha" -slp-description = "A StarKingdoms.TK server" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [dependencies] -async-std = { version = "1.12.0", features = ["attributes"] } - -serde = { version = "1", features = ["derive"] } -serde_json = "1" -futures = { version = "0.3", default-features = false } - -tungstenite = { version = "0.19.0", default-features = false } -async-tungstenite = "0.22.1" - -log = "0.4" -simple_logger = "4.1" -starkingdoms-protocol = { version = "0.1.0", path = "../protocol" } -lazy_static = "1.4.0" -rapier2d-f64 = { version = "0.17.2", features = [ "simd-stable" ] } -nalgebra = "0.32.2" -rand = "0.8.5" -reqwest = "0.11.16" - -protobuf = "3.2.0" - -parking_lot = { version = "0.12.1", features = ["deadlock_detection"] } - -[dependencies.bevy] -version = "0.10.1" -default-features = false - -[build-dependencies] -cargo_metadata = "0.15" - +bevy = "0.12" +rmp = "^0.8" +rmp-serde = "1.1.2" +serde = "1.0.192" +bevy_twite = { git = "https://gitlab.com/ghostlyzsh/twite.git" } diff --git a/server/build.rs b/server/build.rs deleted file mode 100644 index 0335e8952d8a061efcade4f4691cb01fd0497548..0000000000000000000000000000000000000000 --- a/server/build.rs +++ /dev/null @@ -1,42 +0,0 @@ -use cargo_metadata::MetadataCommand; -use std::process::Command; - -fn main() { - let path = std::env::var("CARGO_MANIFEST_DIR").unwrap(); - - let meta = MetadataCommand::new() - .manifest_path("./Cargo.toml") - .current_dir(&path) - .exec() - .unwrap(); - - let root = meta.root_package().unwrap(); - - let version = root.version.to_string(); - let version_name = root.metadata["version-name"].to_string().replace('"', ""); - let description = root.metadata["slp-description"] - .to_string() - .replace('"', ""); - - let output = Command::new("git") - .args(["rev-parse", "--short", "HEAD"]) - .output() - .unwrap(); - let git_hash = String::from_utf8(output.stdout).unwrap(); - - println!("cargo:rustc-env=STK_VERSION={}", version); - println!("cargo:rustc-env=STK_VERSION_NAME={}", version_name); - println!("cargo:rustc-env=STK_SLP_DESCRIPTION={}", description); - println!( - "cargo:rustc-env=STK_CHANNEL={}", - std::env::var("STK_CHANNEL").unwrap_or("dev".to_string()) - ); - println!( - "cargo:rustc-env=STK_BUILD={}-{}-{}", - std::env::var("STK_CHANNEL").unwrap_or("dev".to_string()), - std::env::var("STK_BUILD_NUM").unwrap_or("local".to_string()), - git_hash - ); - println!("cargo:rerun-if-changed=Cargo.toml"); - println!("cargo:rerun-if-env-changed=STK_BUILD_NUM"); -} diff --git a/server/src/api.rs b/server/src/api.rs deleted file mode 100644 index 2b3fa24d1f7b3fd608372bf665130a674e44681a..0000000000000000000000000000000000000000 --- a/server/src/api.rs +++ /dev/null @@ -1,98 +0,0 @@ -use log::error; -use reqwest::StatusCode; -use serde::{Deserialize, Serialize}; -use starkingdoms_protocol::api::APISavedPlayerData; -use std::error::Error; - -#[derive(Serialize, Deserialize)] -pub struct BeaminRequest { - pub api_token: String, - pub user_auth_realm_id: String, - pub user_auth_token: String, -} - -#[derive(Serialize, Deserialize)] -pub struct BeaminResponse { - pub save_id: String, - pub save: APISavedPlayerData, -} - -pub async fn load_player_data_from_api( - token: &str, - user_id: &str, - internal_token: &str, -) -> Result> { - let client = reqwest::Client::new(); - - let req_body = BeaminRequest { - api_token: internal_token.to_owned(), - user_auth_realm_id: user_id.to_owned(), - user_auth_token: token.to_owned(), - }; - - let res = client - .post(format!("{}/beamin", std::env::var("STK_API_URL")?)) - .header("Content-Type", "application/json") - .body(serde_json::to_string(&req_body)?) - .send() - .await?; - - if res.status() == StatusCode::NO_CONTENT { - return Ok(APISavedPlayerData::default()); - } - - if res.status() != StatusCode::OK { - error!( - "error with API call (status: {}, body: {})", - res.status(), - res.text().await? - ); - return Err("Error with API call".into()); - } - - let resp: BeaminResponse = serde_json::from_str(&res.text().await?)?; - - Ok(resp.save) -} - -#[derive(Serialize, Deserialize)] -pub struct BeamoutRequest { - pub api_token: String, - pub user_auth_realm_id: String, - pub user_auth_token: String, - pub data: APISavedPlayerData, -} - -pub async fn save_player_data_to_api( - data: &APISavedPlayerData, - token: &str, - user_id: &str, - internal_token: &str, -) -> Result<(), Box> { - let client = reqwest::Client::new(); - - let req_body = BeamoutRequest { - api_token: internal_token.to_owned(), - user_auth_realm_id: user_id.to_owned(), - user_auth_token: token.to_owned(), - data: data.clone(), - }; - - let res = client - .post(format!("{}/beamout", std::env::var("STK_API_URL")?)) - .header("Content-Type", "application/json") - .body(serde_json::to_string(&req_body)?) - .send() - .await?; - - if res.status() != StatusCode::OK { - error!( - "error with API call (status: {}, body: {})", - res.status(), - res.text().await? - ); - return Err("Error with API call".into()); - } - - Ok(()) -} diff --git a/server/src/component.rs b/server/src/component.rs new file mode 100644 index 0000000000000000000000000000000000000000..e65a3280ca76ba0c5ed8e23de149ada63c963cdf --- /dev/null +++ b/server/src/component.rs @@ -0,0 +1,34 @@ +use std::net::SocketAddr; + +use bevy::prelude::*; + +#[derive(Component, Clone, Copy)] +pub enum PlanetType { + Earth, +} + +#[derive(Component, Clone, Copy)] +pub enum PartType { + Hearty, +} + +#[derive(Component)] +pub struct Player(pub SocketAddr); + +#[derive(Bundle)] +pub struct PlanetBundle { + pub planet_type: PlanetType, + pub transform: TransformBundle, +} + +#[derive(Bundle)] +pub struct PartBundle { + pub transform: TransformBundle, + pub part_type: PartType, +} + +#[derive(Bundle)] +pub struct PlayerBundle { + pub part: PartBundle, + pub addr: Player, +} diff --git a/server/src/components.rs b/server/src/components.rs deleted file mode 100644 index 56eeebe5425ba129dcd466923b12a69c5950bd12..0000000000000000000000000000000000000000 --- a/server/src/components.rs +++ /dev/null @@ -1,8 +0,0 @@ -pub struct PlayerJoinEvent { - pub stream: SplitStream, - pub addr: SocketAddr, -} - -pub struct PlayerSpawnEvent { - -} diff --git a/server/src/entity.rs b/server/src/entity.rs deleted file mode 100644 index aca9213d557724ec1009cafd5afda80dad1a53b0..0000000000000000000000000000000000000000 --- a/server/src/entity.rs +++ /dev/null @@ -1,233 +0,0 @@ -use std::{collections::HashMap, net::SocketAddr, sync::atomic::AtomicU32}; -use nalgebra::Vector2; -use protobuf::SpecialFields; -use rapier2d_f64::prelude::RigidBodyHandle; -use starkingdoms_protocol::planet::PlanetType; - -use crate::{ - manager::{ClientHandlerMessage, Player}, - module::{AttachedModule, Module}, - planet::Planet, - SCALE, -}; - -pub type EntityId = u32; -pub type Entities = HashMap; -static mut ENTITY_ID_COUNT: AtomicU32 = AtomicU32::new(0); -pub fn get_entity_id() -> EntityId { - let last_entity_id = unsafe { &ENTITY_ID_COUNT }; - let id = last_entity_id.fetch_add(1, std::sync::atomic::Ordering::AcqRel); - assert!(id <= 4_294_967_290, "No remaining entity ids"); - id -} - -#[derive(Default)] -pub struct EntityHandler { - pub entities: Entities, -} - -impl EntityHandler { - pub fn new() -> Self { - Self { - entities: Entities::new(), - } - } - pub fn get_entity_from_handle(&self, handle: RigidBodyHandle) -> Option { - for (_, entity) in &self.entities { - match entity.clone() { - Entity::Player(p) => { - if p.handle == handle { - return Some(entity.clone()); - } - } - Entity::Module(p) => { - if p.handle == handle { - return Some(entity.clone()); - } - } - Entity::AttachedModule(p) => { - if p.handle == handle { - return Some(entity.clone()); - } - } - Entity::Planet(p) => { - if p.body_handle == handle { - return Some(entity.clone()); - } - } - } - } - None - } - pub fn get_planets(&self) -> Vec { - let mut ids = Vec::new(); - for entity in self.entities.values() { - if let Entity::Planet(planet) = entity { - ids.push(planet.clone()); - } - } - ids - } - pub fn get_planet(&self, planet_type: PlanetType) -> Option { - self.get_planets().iter().find(|u| u.planet_type == planet_type).cloned() - } - pub fn get_planet_id(&self, planet_type: PlanetType) -> Option { - for (id, entity) in &self.entities { - if let Entity::Planet(planet) = entity { - if planet.planet_type == planet_type { - return Some(*id); - } - } - } - None - } - - pub fn get_players(&self) -> Vec<(SocketAddr, Player)> { - let mut players = Vec::new(); - for entity in self.entities.values() { - if let Entity::Player(player) = entity { - players.push((player.addr, player.clone())); - } - } - players - } - pub fn get_player_from_id(&self, id: EntityId) -> Option { - if let Some(Entity::Player(player)) = self.entities.get(&id) { - Some(player.clone()) - } else { - None - } - } - pub fn get_player_from_handle(&self, handle: RigidBodyHandle) -> Option { - let players = self.get_players(); - let player = players.iter().find(|p| p.1.handle == handle); - player.map(|p| p.1.clone()) - } - pub fn get_player_id(&self, addr: SocketAddr) -> Option { - for (id, entity) in &self.entities { - if let Entity::Player(player) = entity { - if player.addr == addr { - return Some(*id); - } - } - } - None - } - pub fn get_player(&self, addr: SocketAddr) -> Option { - let players = self.get_players(); - let player = players.iter().find(|p| p.0 == addr); - player.map(|p| p.1.clone()) - } - pub fn get_modules(&self) -> Vec { - let mut modules = Vec::new(); - for entity in self.entities.values() { - if let Entity::Module(module) = entity { - modules.push(module.clone()); - } - } - modules - } - pub fn get_modules_id(&self) -> Vec<(EntityId, Module)> { - let mut modules = Vec::new(); - for (id, entity) in self.entities.clone() { - if let Entity::Module(module) = entity { - modules.push((id, module.clone())); - } - } - modules - } - pub fn get_module_count(&self) -> u32 { - let mut module_count = 0; - for entity in self.entities.values() { - if let Entity::Module(_module) = entity { - module_count += 1; - } - } - module_count - } - pub fn get_module_from_id(&self, id: EntityId) -> Option { - if let Some(Entity::Module(module)) = self.entities.get(&id) { - return Some(module.clone()); - } - None - } - pub fn get_from_module(&self, p_module: &Module) -> Option { - for (id, entity) in &self.entities { - if let Entity::Module(module) = entity { - if module.handle == p_module.handle { - return Some(*id); - } - } - } - None - } - pub fn get_all_attached(&self) -> Vec { - let mut modules = Vec::new(); - for entity in self.entities.values() { - if let Entity::AttachedModule(module) = entity { - modules.push(module.clone()); - } - } - modules - } - pub fn get_all_attached_id(&self) -> Vec<(EntityId, AttachedModule)> { - let mut modules = Vec::new(); - for (id, entity) in self.entities.clone() { - if let Entity::AttachedModule(module) = entity { - modules.push((id, module.clone())); - } - } - modules - } - pub fn get_attached_from_id(&self, id: EntityId) -> Option { - if let Some(Entity::AttachedModule(module)) = self.entities.get(&id) { - return Some(module.clone()); - } - None - } - pub fn get_id_from_attached(&self, p_module: &AttachedModule) -> Option { - for (id, entity) in &self.entities { - if let Entity::AttachedModule(module) = entity { - if module.handle == p_module.handle { - return Some(*id); - } - } - } - None - } - - pub fn gravity(&self, position: (f64, f64), mass: f64) -> (f64, f64) { - let mut direction = Vector2::zeros(); - let planets = self.get_planets(); - for planet in planets { - let planet_grav = planet.gravity(position, mass); - direction.x += planet_grav.0; - direction.y += planet_grav.1; - } - (direction.x, direction.y) - } - - pub fn to_protocol(&self) -> ClientHandlerMessage { - let mut planets = vec![]; - - for planet in self.get_planets() { - planets.push(starkingdoms_protocol::planet::Planet { - planet_type: planet.planet_type.into(), - x: planet.position.0 * SCALE, - y: planet.position.1 * SCALE, - radius: planet.radius * SCALE, // DO NOT * SCALE. THIS VALUE IS NOT SCALED! YES IT IS - special_fields: SpecialFields::default(), - }); - } - - ClientHandlerMessage::PlanetData { planets } - } -} - -#[derive(Clone, Debug)] -pub enum Entity { - Player(Player), - Planet(Planet), - Module(Module), - AttachedModule(AttachedModule), -} diff --git a/server/src/handler.rs b/server/src/handler.rs deleted file mode 100644 index 3ce59b65672c3e16528d9cd9e303aa6b739d8729..0000000000000000000000000000000000000000 --- a/server/src/handler.rs +++ /dev/null @@ -1,835 +0,0 @@ -use crate::api::{load_player_data_from_api, save_player_data_to_api}; -use crate::components::{PlayerSpawnEvent, PlayerJoinEvent}; -use crate::entity::{get_entity_id, Entity, EntityHandler}; -use crate::manager::{ClientHandlerMessage, ClientManager, PhysicsData, Player, PlayerInput}; -use crate::module::{AttachedModule, Module}; -use crate::{recv, send, SCALE, ServerPingResponse, ServerPingResponseVersion}; -use async_std::net::{TcpStream, TcpListener}; -use async_std::{channel::Receiver, sync::RwLock}; -use async_tungstenite::WebSocketStream; -use bevy::prelude::EventWriter; -use futures::stream::{SplitSink, SplitStream}; -use futures::{FutureExt, SinkExt, StreamExt}; -use log::{error, info, warn}; -use nalgebra::{point, vector, Vector2}; -use rand::Rng; -use rapier2d_f64::prelude::{ - Collider, ColliderBuilder, Isometry, MassProperties, RigidBodyBuilder, RigidBodyType, -}; -use starkingdoms_protocol::goodbye_reason::GoodbyeReason; -use starkingdoms_protocol::message_s2c::{ - MessageS2CChat, MessageS2CGoodbye, MessageS2CHello, MessageS2CModuleAdd, - MessageS2CModuleRemove, MessageS2CModuleTreeUpdate, MessageS2CModulesUpdate, - MessageS2CPlanetData, MessageS2CPlayersUpdate, MessageS2CPong, -}; - -use protobuf::SpecialFields; -use starkingdoms_protocol::module::ModuleType; -use starkingdoms_protocol::state::State; -use starkingdoms_protocol::{MessageC2S, MessageS2C, PROTOCOL_VERSION}; -use std::error::Error; -use std::f64::consts::PI; -use std::net::SocketAddr; -use std::sync::Arc; -use std::time::{Duration, SystemTime}; -use tungstenite::Message; -use bevy::ecs::event::EventReader; - -pub fn handle_request( - mut ev_playerspawn: EventWriter -) { - async_std::task::spawn(async { - let addr = SocketAddr::from(([0, 0, 0, 0], 3000)); - info!("Listening on {} for HTTP/WebSocket connections", addr); - let try_socket = TcpListener::bind(&addr).await; - let listener = match try_socket { - Ok(l) => l, - Err(e) => { - error!("error binding to socket: {}", e); - std::process::exit(1); - } - }; - while let Ok((stream, addr)) = listener.accept().await { - ev_playerspawn.send(PlayerSpawnEvent { - stream, - addr - }); - } - Ok(()) - }); -} -pub fn handle_spawn_event( - mut events: EventReader -) { - for join in events.iter() { - let mut peek_buf = [0u8; 9]; - - loop { - let read = join.stream.peek(&mut peek_buf).await?; - if read == 9 { - break; - } - } - - /* - if peek_buf == *b"GET /ping" { - info!("[{}] incoming http connection", addr); - let ping_resp = serde_json::to_string(&ServerPingResponse { - version: ServerPingResponseVersion { - name: env!("STK_VERSION_NAME").to_string(), // Set by build.rs - number: env!("STK_VERSION").to_string(), // Set by build.rs - protocol: PROTOCOL_VERSION, - channel: env!("STK_CHANNEL").to_string(), - build: env!("STK_BUILD").to_string(), - }, - players: u32::try_from(CMGR.usernames.read().await.len())?, - description: env!("STK_SLP_DESCRIPTION").to_string(), - })?; - - let resp_str = format!( - "HTTP/1.0 200 OK\nAccess-Control-Allow-Origin: *\nContent-Length: {}\n\n{}", - ping_resp.len(), - ping_resp - ); - let http_resp = resp_str.as_bytes(); - - conn.write_all(http_resp).await?; - info!( - "[{}] sent ping response (200 OK {} bytes)", - remote_addr, - ping_resp.len() - ); - return Ok(()); - }*/ - info!("[{}] incoming websocket connection", join.addr); - - // if its not GET /ping, assume its websocket and attempt to handshake with them - let ws_stream; - async_std::task::block_on(async { - ws_stream = async_tungstenite::accept_async(join.stream).await?; - }); - - let (ws_write, ws_read) = ws_stream.split(); - - let (tx, rx) = async_std::channel::unbounded(); - - let client = ClientHandler { tx }; - - // Acquire the write lock in a small scope, so it's dropped as quickly as possible - { - mgr.handlers.write().await.insert(addr, client); - } - - info!("[{}] passing to client handler", addr); - - //forward the stream to the sink to achieve echo - match handle_client( - mgr.clone(), - entities.clone(), - physics_data.clone(), - addr, - rx, - ws_write, - ws_read, - ) - .await - { - Ok(_) => (), - Err(e) if e.is::() => { - #[allow(clippy::expect_used)] - let e = { - e.downcast::() - .expect("unable to convert between types safely") - }; - - if matches!(*e, async_tungstenite::tungstenite::Error::ConnectionClosed) { - info!("[{}] connection closed normally", remote_addr); - } else { - error!("[{}] error in client thread: {}", remote_addr, e); - } - } - Err(e) => { - error!("[{}] error in client thread: {}", remote_addr, e); - } - } - - // clean up values left over - { - mgr.handlers.write().await.remove(&remote_addr); - mgr.usernames.write().await.remove(&remote_addr); - // remove player physics body - let mut entity_write = entities.write().await; - let mut data = physics_data.write().await; - let mut rigid_body_set = data.rigid_body_set.clone(); - let mut island_manager = data.island_manager.clone(); - let mut collider_set = data.collider_set.clone(); - let mut impulse_joint_set = data.impulse_joint_set.clone(); - let mut multibody_joint_set = data.multibody_joint_set.clone(); - let Some(player_id) = entity_write.get_player_id(remote_addr) else { - warn!("[{}] player missing from entities.players", remote_addr); - return Err("Player missing from entities.players".into()); - }; - - if let Some(Entity::Player(player)) = entity_write.entities.get(&player_id) { - rigid_body_set.remove( - player.handle, - &mut island_manager, - &mut collider_set, - &mut impulse_joint_set, - &mut multibody_joint_set, - true, - ); - for module in player.search_modules(&entity_write) { - rigid_body_set.remove( - module.handle, - &mut island_manager, - &mut collider_set, - &mut impulse_joint_set, - &mut multibody_joint_set, - true, - ); - let module_id = entity_write - .get_id_from_attached(&module) - .ok_or("Tried to remove nonexistent module")?; - entity_write.entities.remove(&module_id); - } - } else { - warn!("tried to remove player that doesnt exist: #{}", player_id); - } - data.rigid_body_set = rigid_body_set; - data.collider_set = collider_set; - data.island_manager = island_manager; - data.impulse_joint_set = impulse_joint_set; - data.multibody_joint_set = multibody_joint_set; - entity_write.entities.remove(&player_id); - } - } -} - -pub async fn handle_client( - mgr: ClientManager, - entities: Arc>, - data: Arc>, - remote_addr: SocketAddr, - rx: Receiver, - mut client_tx: SplitSink, Message>, - mut client_rx: SplitStream>, -) -> Result<(), Box> { - let mut state = State::Handshake; - let mut username = String::new(); - let mut ping_timeout = SystemTime::now() + Duration::from_secs(10); - - loop { - if let Ok(msg) = rx.recv().await { - match msg { - ClientHandlerMessage::Tick => {} // this intentionally does nothing, - ClientHandlerMessage::ChatMessage { from, message } => { - if matches!(state, State::Play) { - let msg = MessageS2C::Chat(MessageS2CChat { - from, - message, - special_fields: SpecialFields::default(), - }) - .try_into()?; - send!(client_tx, msg).await?; - } - } - ClientHandlerMessage::PlayersUpdate { players } => { - if matches!(state, State::Play) { - let msg = MessageS2C::PlayersUpdate(MessageS2CPlayersUpdate { - players, - special_fields: SpecialFields::default(), - }) - .try_into()?; - send!(client_tx, msg).await?; - } - } - ClientHandlerMessage::PlanetData { planets } => { - if matches!(state, State::Play) { - let msg = MessageS2C::PlanetData(MessageS2CPlanetData { - planets, - special_fields: SpecialFields::default(), - }) - .try_into()?; - send!(client_tx, msg).await?; - } - } - ClientHandlerMessage::ModulesUpdate { modules } => { - if matches!(state, State::Play) { - let msg = MessageS2C::ModulesUpdate(MessageS2CModulesUpdate { - modules, - special_fields: SpecialFields::default(), - }) - .try_into()?; - send!(client_tx, msg).await?; - } - } - ClientHandlerMessage::ModuleTreeUpdate { modules } => { - if matches!(state, State::Play) { - let msg = MessageS2C::ModuleTreeUpdate(MessageS2CModuleTreeUpdate { - tree: modules, - special_fields: SpecialFields::default(), - }) - .try_into()?; - send!(client_tx, msg).await?; - } - } - } - } else { - info!("channel closed, shutting down"); - break; - } - - if ping_timeout < SystemTime::now() { - error!("[{}] ping timeout", remote_addr); - let msg = MessageS2C::Goodbye(MessageS2CGoodbye { - reason: GoodbyeReason::PingPongTimeout.into(), - special_fields: SpecialFields::default(), - }) - .try_into()?; - send!(client_tx, msg).await?; - break; - } - - if let Some(pkt) = recv!(client_rx)? { - match state { - State::UNKNOWN => unreachable!(), - State::Handshake => { - match pkt { - MessageC2S::Hello(pkt) => { - info!("client sent hello"); - // there is no way to not use unwrap here :/ - #[allow(clippy::unwrap_used)] - if !matches!(pkt.next_state.unwrap(), State::Play) { - error!( - "client sent unexpected state {:?} (expected: Play)", - pkt.next_state - ); - let msg = MessageS2C::Goodbye(MessageS2CGoodbye { - reason: GoodbyeReason::UnexpectedNextState.into(), - special_fields: SpecialFields::default(), - }) - .try_into()?; - send!(client_tx, msg).await?; - break; - } - - // check version - if pkt.version != PROTOCOL_VERSION { - error!( - "client sent incompatible version {} (expected: {})", - pkt.version, PROTOCOL_VERSION - ); - let msg = MessageS2C::Goodbye(MessageS2CGoodbye { - reason: GoodbyeReason::UnsupportedProtocol.into(), - special_fields: SpecialFields::default(), - }) - .try_into()?; - send!(client_tx, msg).await?; - break; - } - - // determine if we can give them that username - { - if mgr - .usernames - .read() - .await - .values() - .any(|u| *u == pkt.requested_username) - { - error!( - "client requested username {} but it is in use", - pkt.requested_username - ); - let msg: Vec = MessageS2C::Goodbye(MessageS2CGoodbye { - reason: GoodbyeReason::UsernameTaken.into(), - special_fields: SpecialFields::default(), - }) - .try_into()?; - send!(client_tx, msg).await?; - break; - } - } - - // username is fine - { - mgr.usernames - .write() - .await - .insert(remote_addr, pkt.requested_username.clone()); - } - - let msg = MessageS2C::Hello(MessageS2CHello { - version: pkt.version, - given_username: pkt.requested_username.clone(), - special_fields: SpecialFields::default(), - next_state: pkt.next_state, - }) - .try_into()?; - - send!(client_tx, msg).await?; - - state = pkt.next_state.unwrap(); - username = pkt.requested_username; - - // make player rigidbody - { - let mut data_handle = data.write().await; - - let mut rigid_body_set = data_handle.rigid_body_set.clone(); - let mut collider_set = data_handle.collider_set.clone(); - - let angle: f64 = { - let mut rng = rand::thread_rng(); - rng.gen::() * PI * 2. - }; - let player_body = RigidBodyBuilder::new(RigidBodyType::Dynamic) - .translation(vector![ - angle.cos() * 2050. / SCALE, - angle.sin() * 2050.0 / SCALE - ]) - .rotation(angle + PI / 2.) - .build(); - let player_collider: Collider = - ColliderBuilder::cuboid(25.0 / SCALE, 25.0 / SCALE) - .mass_properties(MassProperties::new( - point![0.0, 0.0], - 0.0001, - 0.005, - )) - .build(); - let player_handle = rigid_body_set.insert(player_body); - - collider_set.insert_with_parent( - player_collider, - player_handle, - &mut rigid_body_set, - ); - - let mut player = Player { - handle: player_handle, - input: PlayerInput::default(), - addr: remote_addr, - auth_token: None, - auth_user: None, - children: [None, None, None, None], - }; - - let mut e_write_handle = entities.write().await; - - if !pkt.user.is_empty() && !pkt.token.is_empty() { - player.auth_token = Some(pkt.token.clone()); - player.auth_user = Some(pkt.user.clone()); - info!( - "[{}] * Beamin: beaming in {} as {} with token {}", - remote_addr, username, pkt.user, pkt.token - ); - - let player_data = match load_player_data_from_api( - &pkt.token, - &pkt.user, - &std::env::var("STK_API_KEY")?, - ) - .await - { - Ok(d) => d, - Err(e) => { - warn!( - "[{}] * Beamin: ABORTED. API returned error: {}", - remote_addr, e - ); - e_write_handle - .entities - .insert(get_entity_id(), Entity::Player(player)); - continue; - } - }; - - info!( - "[{}] Beamin: loaded player data! {:?}", - remote_addr, player_data - ); - - player.load_api_data(&player_data); - } - - let player_id = get_entity_id(); - e_write_handle - .entities - .insert(player_id, Entity::Player(player)); - - data_handle.rigid_body_set = rigid_body_set; - data_handle.collider_set = collider_set; - } - } - MessageC2S::Goodbye(pkt) => { - info!("client sent goodbye: {:?}", pkt.reason); - break; - } - _ => { - error!( - "client sent unexpected packet {:?} for state {:?}", - pkt, state - ); - let msg = MessageS2C::Goodbye(MessageS2CGoodbye { - reason: GoodbyeReason::UnexpectedPacket.into(), - special_fields: SpecialFields::default(), - }) - .try_into()?; - send!(client_tx, msg).await?; - break; - } - } - } - State::Play => match pkt { - MessageC2S::Hello { .. } => { - error!( - "client sent unexpected packet {:?} for state {:?}", - pkt, state - ); - let msg = MessageS2C::Goodbye(MessageS2CGoodbye { - reason: GoodbyeReason::UnexpectedPacket.into(), - special_fields: SpecialFields::default(), - }) - .try_into()?; - send!(client_tx, msg).await?; - break; - } - MessageC2S::Goodbye(pkt) => { - info!("client sent goodbye: {:?}", pkt.reason); - break; - } - MessageC2S::Chat(pkt) => { - info!("[{}] CHAT: [{}] {}", remote_addr, username, pkt.message); - - let read_handle = mgr.handlers.read().await; - - #[allow(clippy::significant_drop_in_scrutinee)] // i know - for (_addr, client_thread) in read_handle.iter() { - match client_thread - .tx - .send(ClientHandlerMessage::ChatMessage { - from: username.clone(), - message: pkt.message.clone(), - }) - .await - { - Ok(_) => (), - Err(e) => { - error!("unable to update a client thread: {}", e); - } - } - } - } - MessageC2S::Ping(_) => { - let msg = MessageS2C::Pong(MessageS2CPong { - special_fields: SpecialFields::default(), - }) - .try_into()?; - send!(client_tx, msg).await?; - ping_timeout = SystemTime::now() + Duration::from_secs(10); - } - #[allow(clippy::significant_drop_tightening)] - // TODO: Remove when this lint is developed more - MessageC2S::Input(p) => { - let mut handle = entities.write().await; - let id = handle - .get_player_id(remote_addr) - .ok_or("could not get player id")?; - - if let Entity::Player(ref mut me) = handle - .entities - .get_mut(&id) - .ok_or("player disconnected but continued to send packets")? - { - me.input.up = p.up_pressed; - me.input.down = p.down_pressed; - me.input.left = p.left_pressed; - me.input.right = p.right_pressed; - } - } - MessageC2S::AuthenticateAndBeamOut(p) => { - info!( - "[{}] * Beaming out {} as {} with realm token {}", - remote_addr, username, p.user_id, p.token - ); - - let player = entities - .read() - .await - .get_player(remote_addr) - .ok_or("Player sending messages after disconnect")?; - - if Some(p.token) != player.auth_token || Some(p.user_id) != player.auth_user - { - warn!("[{}] invalid beamout packet, ignoring", remote_addr); - continue; - } - - match save_player_data_to_api( - &player.as_api_data(), - &player - .auth_token - .ok_or("Tried to beamout without an auth token")?, - &player - .auth_user - .ok_or("Tried to beamout without setting a user")?, - &std::env::var("STK_API_KEY")?, - ) - .await - { - Ok(_) => { - info!("[{}] * Beamed out successfully", remote_addr); - let msg = MessageS2C::Goodbye(MessageS2CGoodbye { - reason: GoodbyeReason::Done.into(), - special_fields: SpecialFields::default(), - }) - .try_into()?; - send!(client_tx, msg).await?; - break; - } - Err(e) => { - error!("[{}] error beaming out: {}", remote_addr, e); - } - } - } - MessageC2S::MouseInput(_p) => { - //debug!("[{}] player input: {:?}", remote_addr, p); - } - #[allow(clippy::significant_drop_tightening)] - // TODO: Remove when this lint is developed more - MessageC2S::ModuleDetach(p) => { - let mut entities = entities.write().await; - let mut data_handle = data.write().await; - let module: Option; - //debug!("[{}] detach: {:?}", remote_addr, p); - //debug!("[{}] {:?}", remote_addr, entities.entities); - - if let Some(Entity::AttachedModule(p_module)) = - entities.entities.get_mut(&p.module_id) - { - module = Some(p_module.clone()); - } else { - warn!("[{}] attempted to detach nonexistent module", remote_addr); - continue; - } - - let player_id = entities - .get_player_id(remote_addr) - .ok_or("player does not exist")?; - let module_id = AttachedModule::detach( - &mut data_handle, - &mut entities, - player_id, - &module.ok_or("cannot detach module that doesn't exist")?, - ) - .ok_or("detach failed")?; - let module = entities - .get_module_from_id(module_id) - .ok_or("player does not exist")?; - let body = data_handle - .rigid_body_set - .get(module.handle) - .ok_or("module rigidbody does not exist")?; - - let children = module.children.iter().map(|c| { - starkingdoms_protocol::module::Attachment { - id: c.child, - slot: 0, - special_fields: SpecialFields::default(), - } - }).collect(); - let prot_module = starkingdoms_protocol::module::Module { - module_type: module.module_type.into(), - rotation: body.rotation().angle(), - x: body.translation().x * SCALE, - y: body.translation().y * SCALE, - id: module_id, - flags: module.flags, - children, - special_fields: SpecialFields::default(), - }; - let msg = MessageS2C::ModuleRemove(MessageS2CModuleRemove { - module: Some(prot_module).into(), - special_fields: SpecialFields::default(), - }) - .try_into()?; - send!(client_tx, msg).await?; - } - MessageC2S::ModuleGrabBegin(p) => { - if let Entity::Module(_module) = entities - .write() - .await - .entities - .get_mut(&p.module_id) - .ok_or("module does not exist")? - { - //debug!("[{}] grab begin: {:?}, flags: {}", remote_addr, p, module.flags); - } - } - #[allow(clippy::significant_drop_tightening)] - // TODO: Remove when this lint is developed more - MessageC2S::ModuleGrabEnd(p) => { - let mut entities = entities.write().await; - let mut module: Option = None; - let mut did_attach = false; - let mut attached_id = None; - if let Entity::Module(p_module) = entities - .entities - .get_mut(&p.module_id) - .ok_or("module does not exist")? - { - module = Some(p_module.clone()); - //debug!("[{}] grab end: {:?}", remote_addr, p); - } - let mut data_handle = data.write().await; - let player_id = entities - .get_player_id(remote_addr) - .ok_or("player entity does not exist")?; - let player = entities - .get_player(remote_addr) - .ok_or("player does not exist")?; - let body = data_handle - .rigid_body_set - .get(player.handle) - .ok_or("player rigidbody does not exist")?; - let (x, y) = ( - body.translation().x - p.worldpos_x / SCALE, - body.translation().y - p.worldpos_y / SCALE, - ); - let angle = -body.rotation().angle(); - let (x, y) = ( - x.mul_add(angle.cos(), -y * angle.sin()), - x.mul_add(angle.sin(), y * angle.cos()), - ); - let mut attachment_slot: Option = None; - if 1.5 < y && y < 3. && -2. < x && x < 2. { - attachment_slot = Some(2); - } else if -3. < y && y < -1.5 && -2. < x && x < 2. { - attachment_slot = Some(0); - } else if -3. < x && x < -1.5 && -2. < y && y < 2. { - attachment_slot = Some(3); - } else if 1.5 < x && x < 3. && -2. < y && y < 2. { - attachment_slot = Some(1); - } - if let Some(slot) = attachment_slot { - attached_id = Some(AttachedModule::attach( - &mut data_handle, - &mut entities, - player_id, - player_id, - &module.clone().ok_or("module is None")?, - slot, - )); - did_attach = true; - } - let modules = player.search_modules(&entities); - for attached in modules { - let body = data_handle - .rigid_body_set - .get(attached.handle) - .ok_or("attached module rigidbody does not exist")?; - let (x, y) = ( - body.translation().x - p.worldpos_x / SCALE, - body.translation().y - p.worldpos_y / SCALE, - ); - let angle = -body.rotation().angle(); - let (x, y) = ( - x.mul_add(angle.cos(), -y * angle.sin()), - x.mul_add(angle.sin(), y * angle.cos()), - ); - let parent_id = entities - .get_id_from_attached(&attached) - .ok_or("attached module does not exist")?; - - // ghostly: this is cursed as hell - // please find a better way in the future lmao - let mut attachment_slot: Option = None; - if 1.5 < y && y < 3. && -2. < x && x < 2. { - attachment_slot = Some(2); - } else if -3. < x && x < -1.5 && -2. < y && y < 2. { - attachment_slot = Some(3); - } else if 1.5 < x && x < 3. && -2. < y && y < 2. { - attachment_slot = Some(1); - } - if let Some(slot) = attachment_slot { - if let Some(module) = module.clone() { - match attached.module_type { - ModuleType::Cargo => { - continue; - } - ModuleType::LandingThruster => { - continue; - } - ModuleType::LandingThrusterSuspension => { - continue; - } - _ => {} - }; - attached_id = Some(AttachedModule::attach( - &mut data_handle, - &mut entities, - parent_id, - player_id, - &module, - slot, - )); - did_attach = true; - } else { - return Err("module is None")?; - } - } - } - if !did_attach { - let body = data_handle - .rigid_body_set - .get_mut(module.as_ref().ok_or("module does not exist")?.handle) - .ok_or("module rigidbody does not exist")?; - body.set_position( - Isometry::new( - Vector2::new(p.worldpos_x / SCALE, p.worldpos_y / SCALE), - body.rotation().angle(), - ), - true, - ); - if let Some(module) = module { - if module.module_type == ModuleType::LandingThruster { - let suspension = entities.get_module_from_id(module.children.get(0).ok_or("suspension child not found")?.child) - .ok_or("suspension not found")?; - let body = data_handle - .rigid_body_set - .get_mut(suspension.handle) - .ok_or("suspension rigidbody does not exist")?; - body.set_position( - Isometry::new( - Vector2::new(p.worldpos_x / SCALE, p.worldpos_y / SCALE), - body.rotation().angle(), - ), - true, - ); - } - } - } else if let Some(Ok(id)) = attached_id { - let prot_module = entities - .get_attached_from_id(id) - .ok_or("attached module does not exist")? - .to_protocol(&entities, &data_handle.rigid_body_set); - let msg = MessageS2C::ModuleAdd(MessageS2CModuleAdd { - module: Some(prot_module.ok_or("attached module does not exist")?) - .into(), - special_fields: SpecialFields::default(), - }) - .try_into()?; - send!(client_tx, msg).await?; - } else { - warn!("attached ID does not exist"); - } - } - }, - } - } - } - - Ok(()) -} diff --git a/server/src/macros.rs b/server/src/macros.rs deleted file mode 100644 index d7d402a89a78cace116c77e2c11bab7e17ddde8c..0000000000000000000000000000000000000000 --- a/server/src/macros.rs +++ /dev/null @@ -1,76 +0,0 @@ -use tungstenite::Message; - -#[macro_export] -macro_rules! send { - ($writer:expr,$pkt:expr) => { - $writer.send($crate::macros::_generic_pkt_into($pkt)) - }; -} - -pub fn _generic_pkt_into(p: Vec) -> Message { - Message::from(p) -} - -#[macro_export] -macro_rules! recv { - ($reader:expr) => {{ - if let Some(future_result) = $reader.next().now_or_never() { - if let Some(msg) = future_result { - match msg { - Ok(msg) => { - if msg.is_binary() { - match MessageC2S::try_from(msg.into_data().as_slice()) { - Ok(d) => Ok(Some(d)), - Err(e) => { - log::error!("error deserializing message: {}", e); - Ok(None) - } - } - } else { - Ok(None) - } - } - Err(e) => { - log::error!("error receiving message: {}", e); - Ok(None) - } - } - } else { - log::error!("pipe closed"); - Err("Pipe closed") - } - } else { - Ok(None) - } - }}; -} - -#[macro_export] -macro_rules! recv_now { - ($reader:expr) => {{ - if let Some(msg) = $reader.next().await { - match msg { - Ok(msg) => { - if msg.is_binary() { - match MessageC2S::try_from(&msg.into_data()) { - Ok(d) => Ok(Some(d)), - Err(e) => { - log::error!("error deserializing message: {}", e); - Ok(None) - } - } - } else { - Ok(None) - } - } - Err(e) => { - log::error!("error receiving message: {}", e); - Ok(None) - } - } - } else { - log::error!("pipe closed"); - Err("Pipe closed") - } - }}; -} diff --git a/server/src/main.rs b/server/src/main.rs index 9c94657748d5ae908d378b6583555c4d564be94f..61923e97f1eee362edfac27d1ca7efe0d28858d5 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -1,168 +1,104 @@ -// StarKingdoms.IO, an open source browser game -// Copyright (C) 2023 ghostly_zsh (and contributors, depending on the license you choose) -// -// +extern crate rmp; +extern crate rmp_serde as rmps; +extern crate serde; -#![warn(clippy::pedantic)] -#![warn(clippy::nursery)] -#![deny(clippy::unwrap_used)] -#![deny(clippy::expect_used)] -#![allow(clippy::must_use_candidate)] -#![allow(clippy::too_many_lines)] -#![allow(clippy::module_name_repetitions)] -#![allow(clippy::missing_errors_doc)] -#![allow(clippy::missing_safety_doc)] -#![allow(clippy::missing_panics_doc)] +mod component; +mod packet; -use crate::manager::{ClientManager}; -use crate::timer::timer_main; -use crate::entity::Entity; -use async_std::net::{TcpListener}; -use async_std::sync::Arc; -use async_std::sync::RwLock; -use bevy::prelude::*; -use components::PlayerSpawnEvent; -use entity::EntityHandler; -use lazy_static::lazy_static; -use log::{error, info, warn, Level}; -use manager::PhysicsData; -use nalgebra::vector; -use parking_lot::deadlock::check_deadlock; -use rapier2d_f64::prelude::{ - BroadPhase, CCDSolver, ColliderSet, ImpulseJointSet, IntegrationParameters, IslandManager, - MultibodyJointSet, NarrowPhase, RigidBodySet, -}; -use serde::{Deserialize, Serialize}; use std::collections::HashMap; -use std::net::SocketAddr; -use std::thread; -use std::time::Duration; -use crate::tcp_handler::handle_request; - -pub mod handler; -pub mod manager; -pub mod timer; -#[macro_use] -pub mod macros; -pub mod api; -pub mod entity; -pub mod module; -pub mod orbit; -pub mod planet; -pub mod tcp_handler; -pub mod components; - -const SCALE: f64 = 10.0; - -pub const PANIC_ON_DEADLOCK: bool = true; - -//noinspection ALL -#[async_std::main] -async fn main() { - #[allow(clippy::expect_used)] - { - simple_logger::init_with_level(Level::Debug).expect("Unable to start logging service"); - } - - info!( - "StarKingdoms server (v: {}, build {}) - initializing", - env!("STK_VERSION"), - env!("STK_BUILD") - ); - - info!("{}", std::mem::size_of::()); - - if std::env::var("STK_API_KEY").is_err() { - error!( - "Unable to read the API key from STK_API_KEY. Ensure it is set, and has a valid value." - ); - std::process::exit(1); - } - if std::env::var("STK_API_URL").is_err() { - error!("Unable to read the API server URL from STK_API_URL. Ensure it is set, and has a valid value."); - std::process::exit(1); - } - - info!("Starting deadlock detector..."); - - thread::spawn(move || loop { - thread::sleep(Duration::from_secs(10)); - let deadlocks = check_deadlock(); - if deadlocks.is_empty() { - continue; - } - - error!("---- DEADLOCK DETECTED ----"); - error!("{} deadlocks were detected.", deadlocks.len()); - for (i, threads) in deadlocks.iter().enumerate() { - error!("-= Deadlock #{}", i); - for t in threads { - error!("-= Thread ID = {:#?}", t.thread_id()); - error!("-= Backtrace:\n{:#?}", t.backtrace()); - } - } - if PANIC_ON_DEADLOCK { - error!("StarKingdoms is configured to panic when deadlocks are detected."); - error!("Bye!"); - panic!("Deadlock detected on one or more threads"); - } else { - error!("StarKingdoms is not configured to panic when deadlocks are detected."); - } - }); +use bevy::{prelude::*, ecs::event::ManualEventReader}; +use bevy_twite::{TwiteServerPlugin, TwiteServerConfig, ServerEvent, twite::frame::MessageType}; +use component::*; +use packet::*; +use rmps::Serializer; +use serde::Serialize; +fn main() { App::new() - .add_plugins(MinimalPlugins) - .add_event::() - .add_systems(Startup, handle_request) + .insert_resource(TwiteServerConfig { + port: 3000, + }) + .add_plugins(TwiteServerPlugin) + .add_systems(Startup, spawn_planets) + .add_systems(Update, on_connection) + .add_systems(Update, on_position_change) .run(); +} - let mgr_timer = CMGR.clone(); - let physics_data = DATA.clone(); - let entities_timer = ENTITIES.clone(); - let _timer_thread = async_std::task::spawn(async move { - match timer_main(mgr_timer, physics_data, entities_timer).await { - Ok(_) => (), - Err(e) => { - error!("timer thread exited with error: {}", e); - std::process::exit(1); - } - } +fn spawn_planets(mut commands: Commands) { + let earth_pos = Transform::from_xyz(0.0, 0.0, 0.0); + commands.spawn(PlanetBundle { + planet_type: PlanetType::Earth, + transform: TransformBundle::from(earth_pos), }); - - /*let try_socket = TcpListener::bind(&addr).await; - - let listener = match try_socket { - Ok(l) => l, - Err(e) => { - error!("error binding to socket: {}", e); - std::process::exit(1); - } - }; - - while let Ok((stream, peer_addr)) = listener.accept().await { - async_std::task::spawn(handle_request( - stream, - peer_addr, - CMGR.clone(), - ENTITIES.clone(), - DATA.clone(), - )); - }*/ } -#[derive(Serialize, Deserialize)] -pub struct ServerPingResponse { - pub version: ServerPingResponseVersion, - pub players: u32, - pub description: String, +fn on_connection(mut commands: Commands, + planet_query: Query<(Entity, &PlanetType, &Transform)>, + mut reader: Local>, + mut events: ResMut>) { + let mut packets = Vec::new(); + for ev in reader.read(&events) { + if let ServerEvent::Connection(addr) = ev { + let _id = commands.spawn(PlayerBundle { + part: PartBundle { + part_type: PartType::Hearty, + transform: TransformBundle::from(Transform::from_xyz(0.0, 0.0, 0.0)), + }, + addr: Player(*addr), + }).id().index(); + + let mut planets = HashMap::new(); + for (entity, planet_type, transform) in planet_query.iter() { + planets.insert(entity.index(), PacketPlanet { + planet_type: *planet_type as u8, + position: (transform.translation.x, transform.translation.y), + }); + } + + let mut buf = Vec::new(); + PlanetPositionPacket { + planets, + }.serialize(&mut Serializer::new(&mut buf)).unwrap(); + packets.push(ServerEvent::Send(*addr, MessageType::Text, buf)); + } + } + for packet in packets { + events.send(packet); + } } -#[derive(Serialize, Deserialize)] -pub struct ServerPingResponseVersion { - pub name: String, - pub number: String, - pub protocol: u32, - pub channel: String, - pub build: String, +fn on_position_change(mut commands: Commands, + part_query: Query<(Entity, &Transform), (With, Changed)>, + planet_query: Query<(Entity, &PlanetType, &Transform), Changed>, + mut packet_send: EventWriter) { + let mut parts = HashMap::new(); + for (entity, transform) in part_query.iter() { + let id = commands.entity(entity).id().index(); + let translation = transform.translation; + parts.insert(id, (0, translation.x, translation.y)); // Type hearty = 0 + } + let mut buf = Vec::new(); + let packet = PartPositionPacket { + parts, + }; + packet.serialize(&mut Serializer::new(&mut buf)).unwrap(); + packet_send.send(ServerEvent::Broadcast(MessageType::Text, buf)); + + let mut planets = HashMap::new(); + for (entity, planet_type, transform) in planet_query.iter() { + let id = commands.entity(entity).id().index(); + let translation = transform.translation; + planets.insert(id, PacketPlanet { + planet_type: *planet_type as u8, + position: (translation.x, translation.y), + }); + } + let mut buf = Vec::new(); + let packet = PlanetPositionPacket { + planets, + }; + packet.serialize(&mut Serializer::new(&mut buf)).unwrap(); + packet_send.send(ServerEvent::Broadcast(MessageType::Text, buf)); } diff --git a/server/src/manager.rs b/server/src/manager.rs deleted file mode 100644 index b60af515afbe753e28ba0aaa84ab958284b781f3..0000000000000000000000000000000000000000 --- a/server/src/manager.rs +++ /dev/null @@ -1,147 +0,0 @@ -use async_std::channel::Sender; -use async_std::sync::RwLock; - -use rapier2d_f64::na::Vector2; -use rapier2d_f64::prelude::{ - BroadPhase, CCDSolver, ColliderSet, ImpulseJointSet, IntegrationParameters, IslandManager, - MultibodyJointSet, NarrowPhase, PhysicsPipeline, RigidBodyHandle, RigidBodySet, -}; -use starkingdoms_protocol::api::APISavedPlayerData; - -use std::collections::HashMap; - -use std::net::SocketAddr; -use std::sync::Arc; - -use crate::entity::{Entity, EntityHandler, EntityId}; - -use crate::module::{AttachedModule, Attachment}; - -#[derive(Clone)] -pub struct ClientManager { - pub handlers: Arc>>, - pub usernames: Arc>>, -} - -#[derive(Clone, Debug)] -pub struct Player { - pub handle: RigidBodyHandle, - pub input: PlayerInput, - pub addr: SocketAddr, - pub auth_token: Option, - pub auth_user: Option, - pub children: [Option; 4], -} - -impl Player { - #[allow(clippy::missing_const_for_fn)] // This will eventually do something, but for now it doesn't - pub fn as_api_data(&self) -> APISavedPlayerData { - APISavedPlayerData {} - } - - pub fn load_api_data(&mut self, _data: &APISavedPlayerData) {} - pub fn search_modules(&self, entities: &EntityHandler) -> Vec { - let mut modules = Vec::new(); - for attachment in self.children.iter().flatten() { - if let Some(Entity::AttachedModule(child_module)) = - entities.entities.get(&attachment.child) - { - modules.append(&mut child_module.search_modules(entities)); - } - } - modules - } - pub fn find_parent( - &self, - module: &AttachedModule, - entities: &EntityHandler, - ) -> Option<(u8, EntityId)> { - for (slot, attachment) in self.children.iter().enumerate() { - if let Some(attachment) = attachment { - if let Entity::AttachedModule(child_module) = - entities.entities.get(&attachment.child)? - { - if *child_module == *module { - return Some(( - u8::try_from(slot).ok()?, - entities.get_player_id(self.addr)?, - )); - } - let parent = child_module.find_parent(module, entities); - if parent.is_some() { - return parent; - } - } - } - } - None - } -} - -#[derive(Default, Clone, Debug)] -#[allow(clippy::struct_excessive_bools)] -pub struct PlayerInput { - pub up: bool, - pub left: bool, - pub right: bool, - pub down: bool, -} - -#[derive(Clone)] -pub struct ClientHandler { - pub tx: Sender, -} - -#[derive(Clone, Default)] -pub struct PhysicsData { - pub gravity: Vector2, - pub integration_parameters: IntegrationParameters, - pub island_manager: IslandManager, - pub broad_phase: BroadPhase, - pub narrow_phase: NarrowPhase, - pub rigid_body_set: RigidBodySet, - pub collider_set: ColliderSet, - pub impulse_joint_set: ImpulseJointSet, - pub multibody_joint_set: MultibodyJointSet, - pub ccd_solver: CCDSolver, -} -impl PhysicsData { - pub fn tick(&mut self, pipeline: &mut PhysicsPipeline) { - pipeline.step( - &self.gravity, - &self.integration_parameters, - &mut self.island_manager, - &mut self.broad_phase, - &mut self.narrow_phase, - &mut self.rigid_body_set, - &mut self.collider_set, - &mut self.impulse_joint_set, - &mut self.multibody_joint_set, - &mut self.ccd_solver, - None, - &(), - &(), - ); - } -} - -#[derive(Debug, Clone)] -pub enum ClientHandlerMessage { - Tick, - ChatMessage { - from: String, - message: String, - }, - PlayersUpdate { - players: Vec, - }, - PlanetData { - planets: Vec, - }, - ModulesUpdate { - modules: Vec, - }, - ModuleTreeUpdate { - modules: Vec, - }, -} diff --git a/server/src/module.rs b/server/src/module.rs deleted file mode 100644 index bf9710b9d43dceae044cc85e4de202906444e887..0000000000000000000000000000000000000000 --- a/server/src/module.rs +++ /dev/null @@ -1,575 +0,0 @@ -use std::error::Error; -use std::f64::consts::PI; - -use log::debug; -use nalgebra::{point, vector, Isometry2, Unit, Vector2, Vector}; -use protobuf::SpecialFields; -use rapier2d_f64::prelude::{ - ColliderBuilder, FixedJointBuilder, ImpulseJointHandle, MassProperties, Real, RigidBodyBuilder, - RigidBodyHandle, RigidBodySet, SharedShape, PrismaticJointBuilder, -}; -use starkingdoms_protocol::module::ModuleType; - -use crate::{ - entity::{get_entity_id, Entity, EntityHandler, EntityId}, - manager::PhysicsData, - SCALE, -}; - -#[derive(Debug, Clone)] -pub struct Module { - pub handle: RigidBodyHandle, - pub module_type: ModuleType, - pub lifetime: f64, - pub flags: u32, - pub children: Vec, -} -impl Module { - pub fn search_modules(&self, entities: &EntityHandler) -> Vec { - let mut modules = vec![self.clone()]; - for attachment in self.children.iter() { - if let Some(Entity::Module(child_module)) = - entities.entities.get(&attachment.child) - { - modules.append(&mut child_module.search_modules(entities)); - } - } - modules - } -} - -#[derive(Clone)] -pub struct ModuleTemplate { - pub mass_properties: MassProperties, - pub module_type: ModuleType, -} - -#[derive(Debug, Clone, PartialEq, Eq)] -pub struct AttachedModule { - pub handle: RigidBodyHandle, - pub module_type: ModuleType, - pub player_id: EntityId, - pub children: [Option; 4], -} -impl AttachedModule { - pub fn attach( - data: &mut PhysicsData, - entities: &mut EntityHandler, - parent: EntityId, - player_id: EntityId, - module: &Module, - attachment_slot: usize, - ) -> Result> { - let mut entity_map = entities.entities.clone(); - - let parent_entity = entity_map - .get_mut(&parent) - .ok_or("parent id does not exist")?; - let parent_handle = match parent_entity { - Entity::Player(player) => { - if player.children[attachment_slot].is_some() { - return Err("already attached".into()); - } - player.handle - } - Entity::AttachedModule(module) => { - if module.children[attachment_slot].is_some() { - return Err("already attached".into()); - } - module.handle - } - _ => { - panic!("unexpected parent"); - } - }; - - let parent_body = data - .rigid_body_set - .get(parent_handle) - .ok_or("parent body does not exist")?; - let parent_pos = vector![parent_body.translation().x, parent_body.translation().y]; - let parent_angle = parent_body.rotation().angle(); - let parent_linvel = *parent_body.linvel(); - let parent_angvel = parent_body.angvel(); - - let (anchor, rotation) = match attachment_slot { - 0 => (point![0. / SCALE, 53. / SCALE], PI), - 1 => (point![-53. / SCALE, 0. / SCALE], -PI / 2.), - 2 => (point![0. / SCALE, -53. / SCALE], 0.), - 3 => (point![53. / SCALE, 0. / SCALE], PI / 2.), - _ => (point![0. / SCALE, 53. / SCALE], 0.), - }; - - if let Some(id) = entities.get_from_module(module) { - let relative_pos = vector![ - anchor.x.mul_add( - (parent_body.rotation().angle()).cos(), - anchor.y * -(parent_body.rotation().angle()).sin() - ), - anchor.x.mul_add( - (parent_body.rotation().angle()).sin(), - anchor.y * (parent_body.rotation().angle()).cos() - ) - ]; - let module_pos = parent_pos + relative_pos; - let module_body = data - .rigid_body_set - .get_mut(module.handle) - .ok_or("module body does not exist")?; - module_body.set_translation(module_pos, true); - module_body.set_rotation(Unit::from_angle(parent_angle + rotation), true); - module_body.set_linvel(parent_linvel, true); - module_body.set_angvel(parent_angvel, true); - - let attach_joint = FixedJointBuilder::new() - .local_anchor1(anchor) - .local_anchor2(point![0.0, 0.0 / SCALE]) - .local_frame2(Isometry2::rotation(rotation)) - .build(); - let attach_joint_handle = - data.impulse_joint_set - .insert(parent_handle, module.handle, attach_joint, true); - - let attached_id = get_entity_id(); - match parent_entity { - Entity::Player(ref mut player) => { - if module.module_type == ModuleType::LandingThrusterSuspension { - player.children[attachment_slot] = Some(Attachment { - child: attached_id, - connection: attach_joint_handle, - can_detach: true, - }); - } else { - player.children[attachment_slot] = Some(Attachment { - child: attached_id, - connection: attach_joint_handle, - can_detach: false, - }); - } - } - Entity::AttachedModule(ref mut module) => { - if module.module_type == ModuleType::LandingThrusterSuspension { - module.children[attachment_slot] = Some(Attachment { - child: attached_id, - connection: attach_joint_handle, - can_detach: true, - }); - } else { - module.children[attachment_slot] = Some(Attachment { - child: attached_id, - connection: attach_joint_handle, - can_detach: false, - }); - } - } - _ => { - panic!("unexpected parent"); - } - }; - let mut children: [Option; 4] = [None, None, None, None]; - for child in module.children.clone() { - let child_body = entities.get_module_from_id(child.child) - .ok_or("suspension doesn't exist")?; - let child_body_body = data.rigid_body_set - .get_mut(child_body.handle) - .ok_or("module body does not exist")?; - if child_body.module_type == ModuleType::LandingThrusterSuspension { - child_body_body.set_translation(module_pos, true); - child_body_body.set_rotation(Unit::from_angle(parent_angle + rotation), true); - let id = get_entity_id(); - entity_map.remove(&child.child); - let child = Attachment { - child: id, - connection: child.connection, - can_detach: child.can_detach, - }; - children[2] = Some(child.clone()); - let attached_child = AttachedModule { - handle: child_body.handle, - module_type: child_body.module_type, - player_id, - children: [None, None, None, None], - }; - entity_map.insert(id, Entity::AttachedModule(attached_child)); - } - } - let attached_module = Self { - handle: module.handle, - module_type: module.module_type, - player_id, - children, - }; - entity_map.remove(&id); - entity_map.insert(attached_id, Entity::AttachedModule(attached_module)); - entities.entities = entity_map; - return Ok(attached_id); - } - Err("entity does not exist".into()) - } - pub fn detach( - data: &mut PhysicsData, - entities: &mut EntityHandler, - player_id: EntityId, - module: &Self, - ) -> Option { - let mut entity_map = entities.entities.clone(); - - let new_module; - if module.module_type == ModuleType::LandingThrusterSuspension { - new_module = entities.get_attached_from_id(module.find_parent(module, entities)?.0 as u32)?; - } else { - new_module = module.clone(); - } - let module = new_module; - - // player not in parent search - // also no parents included in parent search - let player = entities.get_player_from_id(player_id)?; - let (slot, parent_id) = player.find_parent(&module, entities)?; - let parent_entity = entity_map.get_mut(&parent_id)?; - - match parent_entity { - Entity::Player(ref mut player) => { - if let Some(child) = player.children[slot as usize].clone() { - data.impulse_joint_set.remove(child.connection, true); - } - player.children[slot as usize] = None; - } - Entity::AttachedModule(ref mut module) => { - if let Some(child) = &module.children[slot as usize] { - data.impulse_joint_set.remove(child.connection, true); - } - module.children[slot as usize] = None; - } - _ => { - panic!("unexpected parent"); - } - }; - // remove joint - let tree = module.search_modules(entities); - let id = get_entity_id(); - if module.module_type == ModuleType::LandingThruster { - let suspension = (module.children.get(2)?.clone())?; - let suspension_body = entities.get_attached_from_id(suspension.child)?; - let suspension_module = Module { - handle: suspension_body.handle, - module_type: suspension_body.module_type, - lifetime: 0., - flags: 0, - children: Vec::new(), - }; - let suspension_id = get_entity_id(); - let new_module = Module { - handle: module.handle, - module_type: module.module_type, - lifetime: 0., - flags: 0, - children: vec![Attachment { - child: suspension_id, - connection: suspension.connection, - can_detach: false, - }], - }; - entity_map.remove(&entities.get_id_from_attached(&module)?); - entity_map.insert(id, Entity::Module(new_module)); - entity_map.remove(&suspension.child); - entity_map.insert(suspension_id, Entity::Module(suspension_module)); - } else { - let new_module = Module { - handle: module.handle, - module_type: module.module_type, - lifetime: 0., - flags: 0, - children: Vec::new(), - }; - entity_map.remove(&entities.get_id_from_attached(&module)?); - entity_map.insert(id, Entity::Module(new_module)); - } - for element in tree { - for child in element.clone().children.into_iter().flatten() { - let child_body = entities.get_attached_from_id(child.child)?; - if child_body.module_type == ModuleType::LandingThrusterSuspension { - continue; - } - data.impulse_joint_set.remove(child.connection, true); - if child_body.module_type == ModuleType::LandingThruster { - let suspension = (child_body.children.get(2)?.clone())?; - let suspension_body = entities.get_attached_from_id(suspension.child)?; - let suspension_module = Module { - handle: suspension_body.handle, - module_type: suspension_body.module_type, - lifetime: 0., - flags: 0, - children: Vec::new(), - }; - let attached_id = get_entity_id(); - let suspension_id = get_entity_id(); - let new_module = Module { - handle: child_body.handle, - module_type: child_body.module_type, - lifetime: 0., - flags: 0, - children: vec![Attachment { - child: suspension_id, - connection: suspension.connection, - can_detach: false, - }], - }; - entity_map.remove(&entities.get_id_from_attached(&child_body)?); - entity_map.insert(attached_id, Entity::Module(new_module)); - entity_map.remove(&suspension.child); - entity_map.insert(suspension_id, Entity::Module(suspension_module)); - } else { - let new_module = Module { - handle: child_body.handle, - module_type: child_body.module_type, - lifetime: 0., - flags: 0, - children: Vec::new(), - }; - entity_map.remove(&entities.get_id_from_attached(&child_body)?); - let attached_id = get_entity_id(); - entity_map.insert(attached_id, Entity::Module(new_module)); - } - } - } - entities.entities = entity_map; - Some(id) - } - pub fn attach_new( - data: &mut PhysicsData, - entities: &mut EntityHandler, - parent: EntityId, - player_id: EntityId, - module: &ModuleTemplate, - attachment_slot: usize, - ) -> Option { - let mut entity_map = entities.entities.clone(); - - let parent_entity = entity_map.get_mut(&parent)?; - let parent_handle = match parent_entity { - Entity::Player(player) => player.handle, - Entity::AttachedModule(module) => module.handle, - _ => { - panic!("unexpected parent"); - } - }; - - let parent_body = data.rigid_body_set.get(parent_handle)?; - let parent_pos = vector![parent_body.translation().x, parent_body.translation().y]; - - let (anchor, rotation) = if module.module_type == ModuleType::LandingThrusterSuspension { match attachment_slot { - 0 => (point![0. / SCALE, 0. / SCALE], PI), - 1 => (point![0. / SCALE, 0. / SCALE], -PI / 2.), - 2 => (point![0. / SCALE, 0. / SCALE], 0.), - 3 => (point![0. / SCALE, 0. / SCALE], PI / 2.), - _ => (point![0. / SCALE, 0. / SCALE], 0.), - } } - else { match attachment_slot { - 0 => (point![0. / SCALE, 53. / SCALE], PI), - 1 => (point![-53. / SCALE, 0. / SCALE], -PI / 2.), - 2 => (point![0. / SCALE, -53. / SCALE], 0.), - 3 => (point![53. / SCALE, 0. / SCALE], PI / 2.), - _ => (point![0. / SCALE, 53. / SCALE], 0.), - } }; - - let relative_pos = vector![ - anchor.x.mul_add( - (parent_body.rotation().angle()).cos(), - anchor.y * -(parent_body.rotation().angle()).sin() - ), - anchor.x.mul_add( - (parent_body.rotation().angle()).sin(), - anchor.y * (parent_body.rotation().angle()).cos() - ) - ]; - let module_pos = parent_pos + relative_pos; - - // create attachment module - let module_shape = if module.module_type == ModuleType::LandingThrusterSuspension { - SharedShape::cuboid(25./SCALE, 1./SCALE) - } else { - SharedShape::cuboid(25./SCALE, 25./SCALE) - }; - let relative_pos = if module.module_type == ModuleType::LandingThrusterSuspension { - vector![0., -24./SCALE] - } else { - vector![0., 0.] - }; - let module_collider = ColliderBuilder::new(module_shape) - .mass_properties(module.mass_properties) - .translation(relative_pos) - .build(); - let module_body = RigidBodyBuilder::dynamic() - .translation(module_pos) - .rotation(parent_body.rotation().angle() + rotation) - .build(); - let attached_handle = data.rigid_body_set.insert(module_body); - data.collider_set.insert_with_parent( - module_collider, - attached_handle, - &mut data.rigid_body_set, - ); - - let attach_joint_handle; - if module.module_type == ModuleType::LandingThrusterSuspension { - let y = Vector::y_axis(); - let attach_joint = PrismaticJointBuilder::new(y) - .local_anchor1(anchor) - .local_anchor2(point![0.0, 0.0 / SCALE]) - .limits([0.0, 14.625/SCALE]) - .motor_position(0., 32., 4.) - .build(); - attach_joint_handle = - data.impulse_joint_set - .insert(parent_handle, attached_handle, attach_joint, true); - } else { - let attach_joint = FixedJointBuilder::new() - .local_anchor1(anchor) - .local_anchor2(point![0.0, 0.0 / SCALE]) - .local_frame2(Isometry2::rotation(rotation)) - .build(); - attach_joint_handle = - data.impulse_joint_set - .insert(parent_handle, attached_handle, attach_joint, true); - } - let attached_module = Self { - handle: attached_handle, - module_type: module.module_type, - player_id, - children: [None, None, None, None], - }; - let attached_id = get_entity_id(); - match parent_entity { - Entity::Player(ref mut player) => { - if module.module_type == ModuleType::LandingThrusterSuspension { - player.children[attachment_slot] = Some(Attachment { - child: attached_id, - connection: attach_joint_handle, - can_detach: true, - }); - } else { - player.children[attachment_slot] = Some(Attachment { - child: attached_id, - connection: attach_joint_handle, - can_detach: false, - }); - } - } - Entity::AttachedModule(ref mut module) => { - if module.module_type == ModuleType::LandingThrusterSuspension { - module.children[attachment_slot] = Some(Attachment { - child: attached_id, - connection: attach_joint_handle, - can_detach: true, - }); - } else { - module.children[attachment_slot] = Some(Attachment { - child: attached_id, - connection: attach_joint_handle, - can_detach: false, - }); - } - } - _ => { - panic!("unexpected parent"); - } - }; - entity_map.insert(attached_id, Entity::AttachedModule(attached_module)); - entities.entities = entity_map; - Some(attached_id) - } - // TODO: remove this function - pub const fn to_module(&self) -> Module { - Module { - handle: self.handle, - module_type: self.module_type, - lifetime: 10., - flags: 0, - children: Vec::new(), - } - } - - // TODO: this one too - pub fn to_module_id(&self, entities: &EntityHandler) -> Option<(EntityId, Module)> { - Some(( - entities.get_id_from_attached(self)?, - Module { - handle: self.handle, - module_type: self.module_type, - lifetime: 10., - flags: 1, - children: Vec::new(), - }, - )) - } - - pub fn to_protocol( - &self, - entities: &EntityHandler, - data: &RigidBodySet, - ) -> Option { - let body = data.get(self.handle)?; - let children = self.children.to_vec(); - let mut prot_children = Vec::new(); - for i in 1..children.len() { - if let Some(Some(child)) = children.get(i) { - prot_children.push(starkingdoms_protocol::module::Attachment { - id: child.child, - slot: u32::try_from(i).ok()?, - special_fields: SpecialFields::default(), - }); - } - } - Some(starkingdoms_protocol::module::AttachedModule { - module_type: self.module_type.into(), - rotation: body.rotation().angle(), - x: body.translation().x * SCALE, - y: body.translation().y * SCALE, - id: entities.get_id_from_attached(self)?, - children: prot_children, - special_fields: SpecialFields::default(), - }) - } - - pub fn search_modules(&self, entities: &EntityHandler) -> Vec { - let mut modules = vec![self.clone()]; - for attachment in self.children.iter().flatten() { - if let Some(Entity::AttachedModule(child_module)) = - entities.entities.get(&attachment.child) - { - modules.append(&mut child_module.search_modules(entities)); - } - } - modules - } - - pub fn find_parent(&self, module: &Self, entities: &EntityHandler) -> Option<(u8, EntityId)> { - for (slot, attachment) in self.children.iter().enumerate() { - if let Some(attachment) = attachment { - if let Entity::AttachedModule(child_module) = - entities.entities.get(&attachment.child)? - { - if *child_module == *module { - return Some(( - u8::try_from(slot).ok()?, - entities.get_id_from_attached(self)?, - )); - } - let parent = child_module.find_parent(module, entities); - if parent.is_some() { - return parent; - } - } - } - } - None - } -} - -#[derive(Debug, Clone, PartialEq, Eq)] -pub struct Attachment { - pub child: EntityId, - pub connection: ImpulseJointHandle, - pub can_detach: bool, -} diff --git a/server/src/orbit/constants.rs b/server/src/orbit/constants.rs deleted file mode 100644 index 991a2b30ea6632e238038c71fc7b5743b212b2c0..0000000000000000000000000000000000000000 --- a/server/src/orbit/constants.rs +++ /dev/null @@ -1,42 +0,0 @@ -pub const GAME_SCALE_DISTANCE: f64 = 0.000_156_786_5; // 1000 / EARTH_RADIUS_RL -pub const GAME_SCALE_MASS: f64 = 0.000_000_000_000_000_000_000_669_792_364_367_046_3; // 4000 / EARTH_MASS_RL -pub const GAME_SCALE_TIME: f64 = 0.000_514_403_292_181_07; // 1200 / MOON_ORBIT_TIME_RL -pub const GAME_ORBITS_ENABLED: bool = true; - -pub const EARTH_RADIUS_BIAS: f64 = 1.0; -pub const EARTH_MASS_BIAS: f64 = 1.0; - -pub const EARTH_RADIUS_RL: f64 = 6_378_100.0; -pub const EARTH_RADIUS: f64 = EARTH_RADIUS_RL * GAME_SCALE_DISTANCE * EARTH_RADIUS_BIAS; -pub const EARTH_MASS_RL: f64 = 5_972_000_000_000_000_000_000_000.0; -pub const EARTH_MASS: f64 = EARTH_MASS_RL * GAME_SCALE_MASS * EARTH_MASS_BIAS; - -pub const MOON_RADIUS_BIAS: f64 = 1.0; -pub const MOON_MASS_BIAS: f64 = 2.0; -pub const MOON_PERIAPSIS_BIAS: f64 = 0.1; -pub const MOON_APOAPSIS_BIAS: f64 = 0.1; -pub const MOON_ORBIT_TIME_BIAS: f64 = 1.0; - -pub const MOON_RADIUS_RL: f64 = 1_737_400.0; -pub const MOON_RADIUS: f64 = MOON_RADIUS_RL * GAME_SCALE_DISTANCE * MOON_RADIUS_BIAS; -pub const MOON_MASS_RL: f64 = 73_476_730_900_000_000_000_000.0; -pub const MOON_MASS: f64 = MOON_MASS_RL * GAME_SCALE_MASS * MOON_MASS_BIAS; -pub const MOON_PERIAPSIS: f64 = 363_228_900.0 * GAME_SCALE_DISTANCE * MOON_PERIAPSIS_BIAS; -pub const MOON_APOAPSIS: f64 = 405_400_000.0 * GAME_SCALE_DISTANCE * MOON_APOAPSIS_BIAS; -pub const MOON_ORBIT_TIME_RL: f64 = 2_332_800.0; -pub const MOON_ORBIT_TIME: f64 = MOON_ORBIT_TIME_RL * GAME_SCALE_TIME * MOON_ORBIT_TIME_BIAS; - -pub const MARS_RADIUS_BIAS: f64 = 1.0; -pub const MARS_MASS_BIAS: f64 = 10.0; -pub const MARS_PERIHELION_BIAS: f64 = 0.5; -pub const MARS_APHELION_BIAS: f64 = 0.5; -pub const MARS_ORBIT_TIME_BIAS: f64 = 0.2; - -pub const MARS_RADIUS_RL: f64 = 3_390_000.0; -pub const MARS_RADIUS: f64 = MARS_RADIUS_RL * GAME_SCALE_DISTANCE * MARS_RADIUS_BIAS; -pub const MARS_MASS_RL: f64 = 63_900_000_000_000_000_000_000.0; -pub const MARS_MASS: f64 = MARS_MASS_RL * GAME_SCALE_MASS * MARS_MASS_BIAS; -pub const MARS_PERIHELION: f64 = 206_700_000.0 * GAME_SCALE_DISTANCE * MARS_PERIHELION_BIAS; -pub const MARS_APHELION: f64 = 249_200_000.0 * GAME_SCALE_DISTANCE * MARS_APHELION_BIAS; -pub const MARS_ORBIT_TIME_RL: f64 = 59_360_000.0; -pub const MARS_ORBIT_TIME: f64 = MARS_ORBIT_TIME_RL * GAME_SCALE_TIME * MARS_ORBIT_TIME_BIAS; diff --git a/server/src/orbit/kepler.rs b/server/src/orbit/kepler.rs deleted file mode 100644 index 64a23ff07a7d07a4b0d31651eb9a0ce9f90854fa..0000000000000000000000000000000000000000 --- a/server/src/orbit/kepler.rs +++ /dev/null @@ -1,7 +0,0 @@ -/// Kepler's equation: M = E - e * sin(E) -/// M is the Mean Anomaly (angle to where body would be if its orbit was actually circular) -/// E is the Eccentric Anomaly (angle to where the body is on the ellipse) -/// e is the eccentricity of the orbit (0 = perfect circle, and up to 1 is increasingly elliptical) -pub fn kepler_equation(eccentric_anomaly: f64, mean_anomaly: f64, eccentricity: f64) -> f64 { - eccentricity.mul_add(eccentric_anomaly.sin(), mean_anomaly - eccentric_anomaly) -} diff --git a/server/src/orbit/mod.rs b/server/src/orbit/mod.rs deleted file mode 100644 index 0028b8509d824b6d511f47362a815b94b1658687..0000000000000000000000000000000000000000 --- a/server/src/orbit/mod.rs +++ /dev/null @@ -1,6 +0,0 @@ -pub mod constants; -pub mod kepler; -pub mod newtonian; -#[allow(clippy::module_inception)] -pub mod orbit; -pub mod vis_viva; diff --git a/server/src/orbit/newtonian.rs b/server/src/orbit/newtonian.rs deleted file mode 100644 index 0943323f7a940552262655e2c3c6ec37991e5267..0000000000000000000000000000000000000000 --- a/server/src/orbit/newtonian.rs +++ /dev/null @@ -1,29 +0,0 @@ -use crate::orbit::kepler::kepler_equation; - -pub const NEWTONIAN_STEP_SIZE: f64 = 0.0001; -pub const NEWTONIAN_ACCEPTABLE_ERROR: f64 = 0.000_000_01; - -pub fn solve_kepler_with_newtonian( - mean_anomaly: f64, - eccentricity: f64, - max_iterations: u64, -) -> f64 { - let mut guess = mean_anomaly; - - for _ in 0..max_iterations { - let y = kepler_equation(guess, mean_anomaly, eccentricity); - - // exit early if output of function is very close to zero - if y.abs() < NEWTONIAN_ACCEPTABLE_ERROR { - break; - } - - // otherwise, update guess - let slope = (kepler_equation(guess + NEWTONIAN_STEP_SIZE, mean_anomaly, eccentricity) - y) - / NEWTONIAN_STEP_SIZE; - let step = y / slope; - guess -= step; - } - - guess -} diff --git a/server/src/orbit/orbit.rs b/server/src/orbit/orbit.rs deleted file mode 100644 index 7623fc60e2a7537d7ab9d876c95dea4fb650362d..0000000000000000000000000000000000000000 --- a/server/src/orbit/orbit.rs +++ /dev/null @@ -1,75 +0,0 @@ -// Mostly stolen from SebLague's plane game -// thanks - -use crate::orbit::newtonian::solve_kepler_with_newtonian; -use nalgebra::{vector, Vector2}; - -#[allow(clippy::too_many_arguments)] -pub fn calculate_vector_of_orbit( - periapsis: f64, - apoapsis: f64, - t: f64, - current_x: f64, - current_y: f64, - orbiting_x: f64, - orbiting_y: f64, - mass: f64, - step: f64, -) -> Vector2 { - // this doesnt actually do anything - //let semi_major_length = (apoapsis + periapsis) / 2.0; - //let linear_eccentricity = semi_major_length - periapsis; // distance between center and focus - - let target = calculate_world_position_of_orbit( - calculate_point_on_orbit(periapsis, apoapsis, t), - vector![orbiting_x, orbiting_y], - ); - let target_x = target[0]; - let target_y = target[1]; - - let delta_x = target_x - current_x; - let delta_y = target_y - current_y; - - let velocity_x = delta_x / step; - let velocity_y = delta_y / step; - - let accel_x = velocity_x / step; - let accel_y = velocity_y / step; - - let fx = accel_x * mass; - let fy = accel_y * mass; - - vector![fx, fy] -} - -pub fn calculate_point_on_orbit(periapsis: f64, apoapsis: f64, t: f64) -> Vector2 { - let semi_major_length = (apoapsis + periapsis) / 2.0; - let linear_eccentricity = semi_major_length - periapsis; // distance between center and focus - let eccentricity = linear_eccentricity / semi_major_length; // 0: circle. 1: parabola. in between: ellipse - let semi_minor_length = semi_major_length - .mul_add( - semi_major_length, - -linear_eccentricity * linear_eccentricity, - ) - .sqrt(); - - let mean_anomaly = t * std::f64::consts::PI * 2.0; - let eccentric_anomaly = solve_kepler_with_newtonian(mean_anomaly, eccentricity, 100); - - let ellipse_center_x = -linear_eccentricity; - let point_x = eccentric_anomaly - .cos() - .mul_add(semi_major_length, ellipse_center_x); - let point_y = eccentric_anomaly.sin() * semi_minor_length; - - vector![point_x, point_y] -} - -pub fn calculate_world_position_of_orbit( - point: Vector2, - orbiting_on: Vector2, -) -> Vector2 { - // i have no idea if this is actually right or not - // we'll find out - vector![point[0] + orbiting_on[0], point[1] + orbiting_on[1]] -} diff --git a/server/src/orbit/vis_viva.rs b/server/src/orbit/vis_viva.rs deleted file mode 100644 index df052ff68cdc36e4c3736a1ac44abdffba272ff2..0000000000000000000000000000000000000000 --- a/server/src/orbit/vis_viva.rs +++ /dev/null @@ -1,8 +0,0 @@ -pub fn vis_viva( - distance_between_centers: f64, - semi_major: f64, - g: f64, - mass_of_bigger: f64, -) -> f64 { - (g * mass_of_bigger * (2.0 / distance_between_centers - 1.0 / semi_major)).sqrt() -} diff --git a/server/src/packet.rs b/server/src/packet.rs new file mode 100644 index 0000000000000000000000000000000000000000..5ef068f13e10161e6570d823bd362970fdacd152 --- /dev/null +++ b/server/src/packet.rs @@ -0,0 +1,26 @@ +use std::collections::HashMap; + +use serde::Serialize; + +#[derive(Debug, Serialize)] +pub struct SpawnPlayer { + pub id: u32, + pub username: String, + pub position: (f32, f32), +} + +#[derive(Debug, Serialize)] +pub struct PacketPlanet { + pub planet_type: u8, + pub position: (f32, f32), +} + +#[derive(Debug, Serialize)] +pub struct PlanetPositionPacket { + pub planets: HashMap // id, (Type, x, y) +} + +#[derive(Debug, Serialize)] +pub struct PartPositionPacket { + pub parts: HashMap // id, (Type, x, y) +} diff --git a/server/src/planet.rs b/server/src/planet.rs deleted file mode 100644 index 4e0cf7d6c0625aa8774c5257f30e9ae74ce13ddc..0000000000000000000000000000000000000000 --- a/server/src/planet.rs +++ /dev/null @@ -1,178 +0,0 @@ -use nalgebra::{vector, Vector2}; -use protobuf::SpecialFields; -use rapier2d_f64::prelude::{ - ColliderBuilder, ColliderSet, RigidBodyBuilder, RigidBodyHandle, RigidBodySet, ActiveEvents, -}; -use starkingdoms_protocol::planet::PlanetType; -use std::collections::HashMap; - -use crate::entity::{get_entity_id, Entities, Entity, EntityId}; -use crate::orbit::constants::{EARTH_MASS, EARTH_RADIUS, MARS_APHELION, MARS_MASS, MARS_PERIHELION, MARS_RADIUS, MOON_APOAPSIS, MOON_MASS, MOON_PERIAPSIS, MOON_RADIUS}; -use crate::orbit::orbit::{calculate_point_on_orbit, calculate_world_position_of_orbit}; -use crate::{manager::ClientHandlerMessage, SCALE}; - -pub const GRAVITY: f64 = 0.02; - -#[derive(Clone, Debug)] -pub struct Planet { - pub planet_type: PlanetType, - pub body_handle: RigidBodyHandle, - pub position: (f64, f64), - pub radius: f64, - pub mass: f64, -} - -impl Planet { - pub fn gravity(&self, position: (f64, f64), mass: f64) -> (f64, f64) { - let distance = (position.0 - self.position.0).hypot(position.1 - self.position.1); - let force = GRAVITY * ((self.mass * mass) / (distance * distance)); - let mut direction = - Vector2::new(self.position.0 - position.0, self.position.1 - position.1); - direction.set_magnitude(force); - (direction.x, direction.y) - } -} - -#[derive(Default, Clone)] -pub struct Planets { - pub planets: HashMap, -} - -impl Planets { - pub fn get_planet(&self, planet_id: &str) -> Option<&Planet> { - self.planets.get(planet_id) - } - - pub fn get_planet_mut(&mut self, planet_id: &str) -> Option<&mut Planet> { - self.planets.get_mut(planet_id) - } - - pub fn make_planet( - _planet_id: &str, - planet_type: PlanetType, - mass: f64, - radius: f64, - position: (f64, f64), - rigid_body_set: &mut RigidBodySet, - collider_set: &mut ColliderSet, - ) -> (EntityId, Entity) { - let collider = ColliderBuilder::ball(radius / SCALE).build(); - let sensor = ColliderBuilder::ball((radius + 1.) / SCALE) - .sensor(true) - .active_events(ActiveEvents::COLLISION_EVENTS) - .build(); - let body = RigidBodyBuilder::kinematic_position_based() - .translation(vector![position.0 / SCALE, position.1 / SCALE]) - .dominance_group(127) - .additional_mass(0.0); - let body_handle = rigid_body_set.insert(body); - collider_set.insert_with_parent(collider, body_handle, rigid_body_set); - collider_set.insert_with_parent(sensor, body_handle, rigid_body_set); - - let entity_id = get_entity_id(); - ( - entity_id, - Entity::Planet(Planet { - planet_type, - body_handle, - position: (position.0 / SCALE, position.1 / SCALE), - radius: radius / SCALE, - mass, - }), - ) - } - - pub fn create_planets( - rigid_body_set: &mut RigidBodySet, - collider_set: &mut ColliderSet, - entities: &mut Entities, - ) -> Vec { - let mut planet_ids: Vec = Vec::new(); - let (earth_id, entity) = Self::make_planet( - "earth", - PlanetType::Earth, - EARTH_MASS, - EARTH_RADIUS, - (100.0, 100.0), - rigid_body_set, - collider_set, - ); - entities.insert(earth_id, entity); - planet_ids.push(earth_id); - - let moon_start_point; - #[allow(clippy::expect_used)] - if let Entity::Planet(earth) = entities.get(&earth_id).expect("earth does not exist") { - moon_start_point = calculate_world_position_of_orbit( - calculate_point_on_orbit(MOON_PERIAPSIS, MOON_APOAPSIS, 0.0), - vector![earth.position.0, earth.position.1], - ); - } else { - moon_start_point = vector![0., 0.]; - } - - let (moon_id, moon) = Self::make_planet( - "moon", - PlanetType::Moon, - MOON_MASS, - MOON_RADIUS, - (moon_start_point[0], moon_start_point[1]), - rigid_body_set, - collider_set, - ); - entities.insert(moon_id, moon); - planet_ids.push(moon_id); - - let mars_start_point; - #[allow(clippy::expect_used)] - if let Entity::Planet(moon) = entities.get(&moon_id).expect("moon does not exist") { - mars_start_point = calculate_world_position_of_orbit( - calculate_point_on_orbit(MARS_PERIHELION, MARS_APHELION, 0.0), - vector![moon.position.0, moon.position.1], - ); - } else { - mars_start_point = vector![0., 0.]; - } - - let (mars_id, mars) = Self::make_planet( - "mars", - PlanetType::Mars, - MARS_MASS, - MARS_RADIUS, - (mars_start_point[0], mars_start_point[1]), - rigid_body_set, - collider_set, - ); - entities.insert(mars_id, mars); - planet_ids.push(mars_id); - - planet_ids - } - - pub fn to_protocol(&self) -> ClientHandlerMessage { - let mut planets = vec![]; - - for (_, planet) in self.planets.clone() { - // TODO: Adjust codegen to use f64 - planets.push(starkingdoms_protocol::planet::Planet { - planet_type: planet.planet_type.into(), - x: planet.position.0 * SCALE, - y: planet.position.1 * SCALE, - radius: planet.radius * SCALE, // DO NOT * SCALE - THIS VALUE IS NOT SCALED! YES IT IS - special_fields: SpecialFields::default(), - }); - } - - ClientHandlerMessage::PlanetData { planets } - } - - pub fn gravity(&self, position: (f64, f64), mass: f64) -> (f64, f64) { - let mut direction = Vector2::zeros(); - for (_, planet) in self.planets.clone() { - let planet_grav = planet.gravity(position, mass); - direction.x += planet_grav.0; - direction.y += planet_grav.1; - } - (direction.x, direction.y) - } -} diff --git a/server/src/tcp_handler.rs b/server/src/tcp_handler.rs deleted file mode 100644 index d02eb8cd7e875a14f079e1ea6cf73c2948a2bd93..0000000000000000000000000000000000000000 --- a/server/src/tcp_handler.rs +++ /dev/null @@ -1,176 +0,0 @@ -use std::error::Error; -use std::net::SocketAddr; -use std::sync::Arc; -use async_std::io::WriteExt; -use async_std::net::TcpStream; -use async_std::sync::RwLock; -use log::{error, info, warn}; -use starkingdoms_protocol::PROTOCOL_VERSION; -use crate::entity::{Entity, EntityHandler}; -use crate::manager::{ClientHandler, ClientManager, PhysicsData}; -use crate::{CMGR, ServerPingResponse, ServerPingResponseVersion}; -use crate::handler::handle_client; -use futures::StreamExt; - -pub async fn handle_request( - conn: TcpStream, - remote_addr: SocketAddr, - mgr: ClientManager, - entities: Arc>, - physics_data: Arc>, -) { - match _handle_request(conn, remote_addr, mgr, entities, physics_data).await { - Ok(_) => (), - Err(e) => { - error!("[{}] error in handler thread: {}", remote_addr, e); - } - } -} - -async fn _handle_request( - mut conn: TcpStream, - remote_addr: SocketAddr, - mgr: ClientManager, - entities: Arc>, - physics_data: Arc>, -) -> Result<(), Box> { - let mut peek_buf = [0u8; 9]; - - loop { - let read = conn.peek(&mut peek_buf).await?; - if read == 9 { - break; - } - } - - if peek_buf == *b"GET /ping" { - info!("[{}] incoming http connection", remote_addr); - let ping_resp = serde_json::to_string(&ServerPingResponse { - version: ServerPingResponseVersion { - name: env!("STK_VERSION_NAME").to_string(), // Set by build.rs - number: env!("STK_VERSION").to_string(), // Set by build.rs - protocol: PROTOCOL_VERSION, - channel: env!("STK_CHANNEL").to_string(), - build: env!("STK_BUILD").to_string(), - }, - players: u32::try_from(CMGR.usernames.read().await.len())?, - description: env!("STK_SLP_DESCRIPTION").to_string(), - })?; - - let resp_str = format!( - "HTTP/1.0 200 OK\nAccess-Control-Allow-Origin: *\nContent-Length: {}\n\n{}", - ping_resp.len(), - ping_resp - ); - let http_resp = resp_str.as_bytes(); - - conn.write_all(http_resp).await?; - info!( - "[{}] sent ping response (200 OK {} bytes)", - remote_addr, - ping_resp.len() - ); - return Ok(()); - } - info!("[{}] incoming websocket connection", remote_addr); - - // if its not GET /ping, assume its websocket and attempt to handshake with them - let ws_stream = async_tungstenite::accept_async(conn).await?; - - let (ws_write, ws_read) = ws_stream.split(); - - let (tx, rx) = async_std::channel::unbounded(); - - let client = ClientHandler { tx }; - - // Acquire the write lock in a small scope, so it's dropped as quickly as possible - { - mgr.handlers.write().await.insert(remote_addr, client); - } - - info!("[{}] passing to client handler", remote_addr); - - //forward the stream to the sink to achieve echo - match handle_client( - mgr.clone(), - entities.clone(), - physics_data.clone(), - remote_addr, - rx, - ws_write, - ws_read, - ) - .await - { - Ok(_) => (), - Err(e) if e.is::() => { - #[allow(clippy::expect_used)] - let e = { - e.downcast::() - .expect("unable to convert between types safely") - }; - - if matches!(*e, async_tungstenite::tungstenite::Error::ConnectionClosed) { - info!("[{}] connection closed normally", remote_addr); - } else { - error!("[{}] error in client thread: {}", remote_addr, e); - } - } - Err(e) => { - error!("[{}] error in client thread: {}", remote_addr, e); - } - } - - // clean up values left over - { - mgr.handlers.write().await.remove(&remote_addr); - mgr.usernames.write().await.remove(&remote_addr); - // remove player physics body - let mut entity_write = entities.write().await; - let mut data = physics_data.write().await; - let mut rigid_body_set = data.rigid_body_set.clone(); - let mut island_manager = data.island_manager.clone(); - let mut collider_set = data.collider_set.clone(); - let mut impulse_joint_set = data.impulse_joint_set.clone(); - let mut multibody_joint_set = data.multibody_joint_set.clone(); - let Some(player_id) = entity_write.get_player_id(remote_addr) else { - warn!("[{}] player missing from entities.players", remote_addr); - return Err("Player missing from entities.players".into()); - }; - - if let Some(Entity::Player(player)) = entity_write.entities.get(&player_id) { - rigid_body_set.remove( - player.handle, - &mut island_manager, - &mut collider_set, - &mut impulse_joint_set, - &mut multibody_joint_set, - true, - ); - for module in player.search_modules(&entity_write) { - rigid_body_set.remove( - module.handle, - &mut island_manager, - &mut collider_set, - &mut impulse_joint_set, - &mut multibody_joint_set, - true, - ); - let module_id = entity_write - .get_id_from_attached(&module) - .ok_or("Tried to remove nonexistent module")?; - entity_write.entities.remove(&module_id); - } - } else { - warn!("tried to remove player that doesnt exist: #{}", player_id); - } - data.rigid_body_set = rigid_body_set; - data.collider_set = collider_set; - data.island_manager = island_manager; - data.impulse_joint_set = impulse_joint_set; - data.multibody_joint_set = multibody_joint_set; - entity_write.entities.remove(&player_id); - } - - Ok(()) -} \ No newline at end of file diff --git a/server/src/timer.rs b/server/src/timer.rs deleted file mode 100644 index af5403e2994054c62efad75d76bf80a986573b06..0000000000000000000000000000000000000000 --- a/server/src/timer.rs +++ /dev/null @@ -1,768 +0,0 @@ -use crate::entity::EntityHandler; -use crate::module::{Module, AttachedModule, ModuleTemplate}; -use crate::orbit::constants::{GAME_ORBITS_ENABLED, MARS_APHELION, MARS_ORBIT_TIME, MARS_PERIHELION, MOON_APOAPSIS, MOON_ORBIT_TIME, MOON_PERIAPSIS}; -use crate::orbit::orbit::{calculate_point_on_orbit, calculate_world_position_of_orbit}; -use crate::{ - entity::{get_entity_id, Entity}, - manager::{ClientHandlerMessage, ClientManager, PhysicsData}, - planet::Planets, - SCALE, -}; -use async_std::sync::RwLock; -use async_std::task::sleep; -use log::{warn, debug}; -use nalgebra::{point, vector}; -use protobuf::SpecialFields; -use rand::Rng; -use rapier2d_f64::prelude::{ColliderBuilder, MassProperties, PhysicsPipeline, RigidBodyBuilder, SharedShape}; -use starkingdoms_protocol::{module::ModuleType, planet::PlanetType, player::Player}; -use std::error::Error; -use std::{f64::consts::PI, sync::Arc, time::Duration}; - -pub const LATERAL_FORCE: f64 = 0.0002; -pub const MODULE_SPAWN: f64 = 3.0; -pub const MODULE_MAX: u32 = 10; - -//noinspection ALL -pub async fn timer_main( - mgr: ClientManager, - physics_data_orig: Arc>, - entities: Arc>, -) -> Result<(), Box> { - let mut pipeline = PhysicsPipeline::new(); - - let mut time = 0.0; - let mut module_timer = 0.0; - - { - let mut data_handle = physics_data_orig.write().await; - - let mut rigid_body_set = data_handle.rigid_body_set.clone(); - let mut collider_set = data_handle.collider_set.clone(); - - let _ = Planets::create_planets( - &mut rigid_body_set, - &mut collider_set, - &mut entities.write().await.entities, - ); - - data_handle.rigid_body_set = rigid_body_set; - data_handle.collider_set = collider_set; - } - - #[allow(clippy::significant_drop_tightening)] - // underdeveloped lint, TODO remove when its better - loop { - sleep(Duration::from_millis(5)).await; - time += 5.0 / 1000.0; // 5ms, time is in seconds - module_timer += 5.0 / 1000.0; - - let mut physics_data = physics_data_orig.write().await; - - // update orbits (but dont, actually, yet) - // DO NOT SIMPLIFY EXPRESSION - // IT MAY ALWAYS BE TRUE - // THATS FINE - if GAME_ORBITS_ENABLED { - let mut planets = entities.write().await; - let mut map = planets.entities.clone(); - - // update earth (nothing changes, yet) - let earth_id = planets.get_planet_id(PlanetType::Earth).ok_or("earth does not exist")?; - if let Entity::Planet(earth) = map - .get(&earth_id) - .ok_or("earth does not exist")? { - let new_earth_position = vector![earth.position.0, earth.position.1]; - - // update moon - let moon_id = planets.get_planet_id(PlanetType::Moon).ok_or("moon does not exist")?; - if let Entity::Planet(moon) = map - .get_mut(&moon_id) - .ok_or("moon does not exist")? { - let new_moon_position = calculate_world_position_of_orbit( - calculate_point_on_orbit(MOON_PERIAPSIS, MOON_APOAPSIS, time / MOON_ORBIT_TIME), - new_earth_position, - ); - let new_moon_position = new_moon_position / SCALE; - let moon_body = physics_data - .rigid_body_set - .get_mut(moon.body_handle) - .ok_or("moon does not exist")?; - moon_body.set_next_kinematic_translation(new_moon_position); - moon.position = ( - moon_body.translation()[0], - moon_body.translation()[1], - ); - - // update mars - let mars_id = planets.get_planet_id(PlanetType::Mars).ok_or("mars does not exist")?; - if let Entity::Planet(mars) = map - .get_mut(&mars_id) - .ok_or("mars does not exist")? { - let new_mars_position = calculate_world_position_of_orbit( - calculate_point_on_orbit(MARS_PERIHELION, MARS_APHELION, time / MARS_ORBIT_TIME), - new_moon_position, - ); - let new_mars_position = new_mars_position/SCALE; - let mars_body = physics_data - .rigid_body_set - .get_mut(mars.body_handle) - .ok_or("mars does not exist")?; - mars_body.set_next_kinematic_translation(new_mars_position); - mars.position = ( - mars_body.translation()[0], - mars_body.translation()[1], - ); - } - } - } - planets.entities = map; - } - - physics_data.tick(&mut pipeline); - - let mut protocol_players = vec![]; - - { - if module_timer > MODULE_SPAWN && entities.read().await.get_module_count() < MODULE_MAX - { - module_timer = 0.; - - let mut rigid_body_set = physics_data.rigid_body_set.clone(); - let mut collider_set = physics_data.collider_set.clone(); - - let module_collider = ColliderBuilder::cuboid(18.75 / SCALE, 23.4375 / SCALE) - .translation(vector![0.0, 1.5625 / SCALE]) - .mass_properties(MassProperties::new(point![0.0, 0.0], 0.000075, 0.005)) - .build(); - let angle: f64 = { - let mut rng = rand::thread_rng(); - rng.gen::() * PI * 2. - }; - let module_body = RigidBodyBuilder::dynamic() - .translation(vector![ - angle.cos() * 2050. / SCALE, - angle.sin() * 2050.0 / SCALE - ]) - .build(); - let module_handler = rigid_body_set.insert(module_body); - collider_set.insert_with_parent( - module_collider, - module_handler, - &mut rigid_body_set, - ); - - physics_data.rigid_body_set = rigid_body_set; - physics_data.collider_set = collider_set; - - let module = Module { - handle: module_handler, - module_type: ModuleType::Cargo, - lifetime: 0.0, - flags: 0, - children: Vec::new(), - }; - entities - .write() - .await - .entities - .insert(get_entity_id(), Entity::Module(module)); - } - let mut entities = entities.write().await; - for module in &mut entities.get_all_attached() { - let module_handle = module.handle; - let module_body = physics_data - .rigid_body_set - .get_mut(module_handle) - .ok_or("module does not exist")?; - module_body.reset_forces(true); - module_body.reset_torques(true); - let grav_force = entities.gravity( - (module_body.translation().x, module_body.translation().y), - module_body.mass(), - ); - module_body.apply_impulse(vector![grav_force.0, grav_force.1], true); - - - for child in module.children.clone() { - if let Some(child) = child { - if child.can_detach { - let joint = physics_data.impulse_joint_set - .get(child.connection).ok_or("module joint does not exist 190")?; - if joint.impulses.magnitude() > 0.00012 { - let module: Option; - if let Some(Entity::AttachedModule(p_module)) = - entities.entities.get_mut(&child.child) - { - module = Some(p_module.clone()); - } else { - warn!("attempted to detach nonexistent module"); - continue; - } - let player_id = module.as_ref().ok_or("cannot detach module that doesn't exist")?.player_id; - AttachedModule::detach( - &mut physics_data, - &mut entities, - player_id, - &module.ok_or("cannot detach module that doesn't exist")?, - ); - } - } - } - } - if module.module_type == ModuleType::LandingThruster { - let player = entities.get_player_from_id(module.player_id).ok_or("attached module not affiliated with player")?; - let player_angle; - let player_translation; - { - let player_body = physics_data.rigid_body_set.get(player.handle).ok_or("player body does not exist")?; - player_angle = player_body.rotation().angle(); - player_translation = *player_body.translation(); - } - let module_body = physics_data.rigid_body_set.get_mut(module_handle).ok_or("module body does not exist")?; - let relative_angle = (module_body.rotation().angle() - player_angle).abs(); - let relative_pos = module_body.translation() - player_translation; - let relative_pos = vector![ - relative_pos.x.mul_add((-player_angle).cos(), -relative_pos.y * (-player_angle).sin()), - relative_pos.x.mul_add((-player_angle).sin(), relative_pos.y * (-player_angle).cos()) - ]; - let rotation = module_body.rotation().angle(); - if player.input.up { - if 3.*PI/4. < relative_angle && relative_angle < 5.*PI/4. { - module_body.add_force_at_point(vector![ - -LATERAL_FORCE * 3. / SCALE * rotation.sin(), - LATERAL_FORCE * 3. / SCALE * rotation.cos() - ], point![module_body.translation().x, module_body.translation().y], true); - } - } - if player.input.down { - if (0. < relative_angle && relative_angle < PI/4.)||(7.*PI/4. < relative_angle && relative_angle < 2.*PI) { - module_body.add_force_at_point(vector![ - -LATERAL_FORCE * 3. / SCALE * rotation.sin(), - LATERAL_FORCE * 3. / SCALE * rotation.cos() - ], point![module_body.translation().x, module_body.translation().y], true); - } - } - if player.input.left { - if 3.*PI/4. < relative_angle && relative_angle < 5.*PI/4. { - if relative_pos.x > 2.4 { - module_body.add_force_at_point(vector![ - -LATERAL_FORCE * 3. / SCALE * rotation.sin(), - LATERAL_FORCE * 3. / SCALE * rotation.cos() - ], point![module_body.translation().x, module_body.translation().y], true); - } - } - if (0. < relative_angle && relative_angle < PI/4.)||(7.*PI/4. < relative_angle && relative_angle < 2.*PI) { - if relative_pos.x < -2.4 { - module_body.add_force_at_point(vector![ - -LATERAL_FORCE * 3. / SCALE * rotation.sin(), - LATERAL_FORCE * 3. / SCALE * rotation.cos() - ], point![module_body.translation().x, module_body.translation().y], true); - } - } - if PI/4. < relative_angle && relative_angle < 3.*PI/4. { - if relative_pos.y < -2.4 { - module_body.add_force_at_point(vector![ - -LATERAL_FORCE * 3. / SCALE * rotation.sin(), - LATERAL_FORCE * 3. / SCALE * rotation.cos() - ], point![module_body.translation().x, module_body.translation().y], true); - } - } - if 5.*PI/4. < relative_angle && relative_angle < 7.*PI/4. { - if relative_pos.y > 2.4 { - module_body.add_force_at_point(vector![ - -LATERAL_FORCE * 3. / SCALE * rotation.sin(), - LATERAL_FORCE * 3. / SCALE * rotation.cos() - ], point![module_body.translation().x, module_body.translation().y], true); - } - if -2.4 < relative_pos.y && relative_pos.y < 2.4 { - module_body.add_force_at_point(vector![ - -LATERAL_FORCE * 3. / SCALE * rotation.sin(), - LATERAL_FORCE * 3. / SCALE * rotation.cos() - ], point![module_body.translation().x, module_body.translation().y], true); - } - } - } - if player.input.right { - if 3.*PI/4. < relative_angle && relative_angle < 5.*PI/4. { - if relative_pos.x < -2.4 { - module_body.add_force_at_point(vector![ - -LATERAL_FORCE * 3. / SCALE * rotation.sin(), - LATERAL_FORCE * 3. / SCALE * rotation.cos() - ], point![module_body.translation().x, module_body.translation().y], true); - } - } - if (0. < relative_angle && relative_angle < PI/4.)||(7.*PI/4. < relative_angle && relative_angle < 2.*PI) { - if relative_pos.x > 2.4 { - module_body.add_force_at_point(vector![ - -LATERAL_FORCE * 3. / SCALE * rotation.sin(), - LATERAL_FORCE * 3. / SCALE * rotation.cos() - ], point![module_body.translation().x, module_body.translation().y], true); - } - } - if PI/4. < relative_angle && relative_angle < 3.*PI/4. { - if relative_pos.y > 2.4 { - module_body.add_force_at_point(vector![ - -LATERAL_FORCE * 3. / SCALE * rotation.sin(), - LATERAL_FORCE * 3. / SCALE * rotation.cos() - ], point![module_body.translation().x, module_body.translation().y], true); - } - if -2.4 < relative_pos.y && relative_pos.y < 2.4 { - module_body.add_force_at_point(vector![ - LATERAL_FORCE * 3. / SCALE * rotation.sin(), - -LATERAL_FORCE * 3. / SCALE * rotation.cos() - ], point![module_body.translation().x, module_body.translation().y], true); - } - } - if 5.*PI/4. < relative_angle && relative_angle < 7.*PI/4. { - if relative_pos.y < -2.4 { - module_body.add_force_at_point(vector![ - -LATERAL_FORCE * 3. / SCALE * rotation.sin(), - LATERAL_FORCE * 3. / SCALE * rotation.cos() - ], point![module_body.translation().x, module_body.translation().y], true); - } - } - } - } - } - } - - { - let mut entities = entities.write().await; - for (player_id, player) in &entities.get_players() { - let player_handle = player.handle; - let player_body = physics_data - .rigid_body_set - .get_mut(player_handle) - .ok_or("player body does not exist")?; - player_body.reset_forces(true); - player_body.reset_torques(true); - let grav_force = entities.gravity( - (player_body.translation().x, player_body.translation().y), - player_body.mass(), - ); - player_body.apply_impulse(vector![grav_force.0, grav_force.1], true); - - let mut left_top_thruster: f64 = 0.0; - let mut right_top_thruster: f64 = 0.0; - let mut left_bottom_thruster: f64 = 0.0; - let mut right_bottom_thruster: f64 = 0.0; - - if player.input.right { - left_top_thruster -= 1.0; - right_bottom_thruster += 1.0; - } - if player.input.left { - right_top_thruster -= 1.0; - left_bottom_thruster += 1.0; - } - - if player.input.up { - left_bottom_thruster -= 1.0; - right_bottom_thruster -= 1.0; - } - if player.input.down { - left_top_thruster += 1.0; - right_top_thruster += 1.0; - } - left_top_thruster = LATERAL_FORCE * left_top_thruster.clamp(-1.0, 1.0); - right_top_thruster = LATERAL_FORCE * right_top_thruster.clamp(-1.0, 1.0); - left_bottom_thruster = LATERAL_FORCE * left_bottom_thruster.clamp(-1.0, 1.0); - right_bottom_thruster = LATERAL_FORCE * right_bottom_thruster.clamp(-1.0, 1.0); - - let rotation = player_body.rotation().clone().angle(); - let scale = SCALE; - let left_top_thruster = vector![ - -left_top_thruster / scale * rotation.sin(), - left_top_thruster / scale * rotation.cos() - ]; - let right_top_thruster = vector![ - -right_top_thruster / scale * rotation.sin(), - right_top_thruster / scale * rotation.cos() - ]; - let left_bottom_thruster = vector![ - -left_bottom_thruster / scale * rotation.sin(), - left_bottom_thruster / scale * rotation.cos() - ]; - let right_bottom_thruster = vector![ - -right_bottom_thruster / scale * rotation.sin(), - right_bottom_thruster / scale * rotation.cos() - ]; - let top_left_point = point![ - (-25. / scale).mul_add(rotation.cos(), 25. / scale * rotation.sin()), - (-25. / scale).mul_add(rotation.sin(), -25. / scale * rotation.cos()) - ] + player_body.translation(); - let top_right_point = point![ - (25. / scale).mul_add(rotation.cos(), 25. / scale * rotation.sin()), - (25. / scale).mul_add(rotation.sin(), -25. / scale * rotation.cos()) - ] + player_body.translation(); - let bottom_left_point = point![ - (-25. / scale).mul_add(rotation.cos(), -25. / scale * rotation.sin()), - (-25. / scale).mul_add(rotation.sin(), 25. / scale * rotation.cos()) - ] + player_body.translation(); - let bottom_right_point = point![ - (25. / scale).mul_add(rotation.cos(), -25. / scale * rotation.sin()), - (25. / scale).mul_add(rotation.sin(), 25. / scale * rotation.cos()) - ] + player_body.translation(); - - player_body.add_force_at_point(left_top_thruster, top_left_point, true); - player_body.add_force_at_point(right_top_thruster, top_right_point, true); - player_body.add_force_at_point(left_bottom_thruster, bottom_left_point, true); - player_body.add_force_at_point(right_bottom_thruster, bottom_right_point, true); - - let translation = player_body.translation(); - - let username; - { - let usernames = mgr.usernames.read().await; - username = usernames - .get(player_id) - .ok_or("username does not exist")? - .clone(); - } - - protocol_players.push(Player { - rotation, - x: (translation.x * SCALE), - y: (translation.y * SCALE), - username, - special_fields: SpecialFields::default(), - }); - - for child in player.children.clone() { - if let Some(child) = child { - let joint = match physics_data.impulse_joint_set - .get(child.connection) { - Some(c) => c, - None => { warn!("module joint doesn't exist"); continue; } - }; - // displays impulse on joint * 10000 so its visible, use to tune breaking - // force - //debug!("impulse: {}", joint.impulses.magnitude() * 10000.); - if joint.impulses.magnitude() > 0.00012 { - let module: Option; - if let Some(Entity::AttachedModule(p_module)) = - entities.entities.get_mut(&child.child) - { - module = Some(p_module.clone()); - } else { - warn!("attempted to detach nonexistent module"); - continue; - } - let player_id = module.as_ref().ok_or("cannot detach module that doesn't exist")?.player_id; - AttachedModule::detach( - &mut physics_data, - &mut entities, - player_id, - &module.ok_or("cannot detach module that doesn't exist")?, - ); - } - } - } - } - } - { - let mut entities = entities.write().await; - for planet in &entities.get_planets() { - let body = physics_data.rigid_body_set.get(planet.body_handle).ok_or("planet body not found")?; - let collider = body.colliders()[1]; - let narrow = physics_data.narrow_phase.clone(); - for (collider1, collider2, intersecting) in narrow.intersections_with(collider) { - if intersecting { - if collider1 == collider { - let collider_handle = match physics_data.collider_set.get_mut(collider2).ok_or("body doesn't exist collider2") { - Ok(c) => c, - Err(s) => { warn!("{}", s); continue; } - }; - let body_handle = collider_handle.parent().ok_or("collider not attached to body")?; - let entity = entities.get_entity_from_handle(body_handle).ok_or("entity body doesn't exist")?; - match entity { - Entity::Player(player) => { - let tree = player.search_modules(&entities); - for module in tree { - if module.module_type == ModuleType::Cargo { - let module_id = entities.get_id_from_attached(&module) - .ok_or("module doesn't exist")?; - let module_handle =physics_data.rigid_body_set.get(module.handle) - .ok_or("attached module body does not exist")?.colliders()[0]; - let module_collider = physics_data.collider_set.get_mut(module_handle) - .ok_or("attached module collider does not exist")?; - if let Entity::AttachedModule(attached) = entities.entities.get_mut(&module_id) - .ok_or("module doesn't exist")? { - match planet.planet_type { - PlanetType::Mars => { - attached.module_type = ModuleType::Hub; - module_collider.set_shape(SharedShape::cuboid(25./SCALE, 25./SCALE)); - module_collider.set_translation_wrt_parent(vector![0., 0.]); - } - PlanetType::Moon => { - attached.module_type = ModuleType::LandingThruster; - module_collider.set_shape(SharedShape::cuboid(25./SCALE, 18.75/SCALE)); - module_collider.set_translation_wrt_parent(vector![0., 6.25/SCALE]); - AttachedModule::attach_new(&mut physics_data, &mut entities, - module_id, module.player_id, - &ModuleTemplate { - mass_properties: MassProperties::new(point![0.0, 0.0], 0.000075, 0.005), - module_type: ModuleType::LandingThrusterSuspension, - }, 2); - } - _ => {} - }; - } - } - } - } - Entity::AttachedModule(module) => { - let tree = entities.get_player_from_id(module.player_id).ok_or("player not found on attached")? - .search_modules(&entities); - for module in tree { - if module.module_type == ModuleType::Cargo { - let module_id = entities.get_id_from_attached(&module) - .ok_or("attached module doesn't exist")?; - let module_handle =physics_data.rigid_body_set.get(module.handle) - .ok_or("attached module body does not exist")?.colliders()[0]; - let module_collider = physics_data.collider_set.get_mut(module_handle) - .ok_or("attached module collider does not exist")?; - if let Entity::AttachedModule(attached) = entities.entities.get_mut(&module_id) - .ok_or("module doesn't exist")? { - match planet.planet_type { - PlanetType::Mars => { - attached.module_type = ModuleType::Hub; - module_collider.set_shape(SharedShape::cuboid(25./SCALE, 25./SCALE)); - module_collider.set_translation_wrt_parent(vector![0., 0.]); - } - PlanetType::Moon => { - attached.module_type = ModuleType::LandingThruster; - module_collider.set_shape(SharedShape::cuboid(25./SCALE, 18.75/SCALE)); - module_collider.set_translation_wrt_parent(vector![0., 6.25/SCALE]); - AttachedModule::attach_new(&mut physics_data, &mut entities, - module_id, module.player_id, - &ModuleTemplate { - mass_properties: MassProperties::new(point![0.0, 0.0], 0.000075, 0.005), - module_type: ModuleType::LandingThrusterSuspension, - }, 2); - } - _ => {} - }; - } - } - } - } - _ => {} - } - } - } - } - } - for module in &mut entities.get_modules() { - let module_handle = module.handle; - let module_body = physics_data - .rigid_body_set - .get_mut(module_handle) - .ok_or("module does not exist")?; - module_body.reset_forces(true); - module_body.reset_torques(true); - let grav_force = entities.gravity( - (module_body.translation().x, module_body.translation().y), - module_body.mass(), - ); - module_body.apply_impulse(vector![grav_force.0, grav_force.1], true); - let id = entities - .get_from_module(module) - .ok_or("module entity does not exist")?; - if let Entity::Module(p_module) = entities - .entities - .get_mut(&id) - .ok_or("module does not exist")? - { - p_module.lifetime += 5. / 1000.; - } - if module.lifetime > 80. { - let mut rigid_body_set = physics_data.rigid_body_set.clone(); - let mut island_manager = physics_data.island_manager.clone(); - let mut collider_set = physics_data.collider_set.clone(); - let mut impulse_joint_set = physics_data.impulse_joint_set.clone(); - let mut multibody_joint_set = physics_data.multibody_joint_set.clone(); - rigid_body_set.remove( - module.handle, - &mut island_manager, - &mut collider_set, - &mut impulse_joint_set, - &mut multibody_joint_set, - true, - ); - physics_data.rigid_body_set = rigid_body_set; - physics_data.collider_set = collider_set; - physics_data.island_manager = island_manager; - physics_data.impulse_joint_set = impulse_joint_set; - physics_data.multibody_joint_set = multibody_joint_set; - entities.entities.remove(&id); - } - } - } - - let mut to_remove = vec![]; - - let mut mgr_w = mgr.handlers.write().await; - let mgr_r = mgr_w.clone(); - - for (addr, client_thread) in &mgr_r { - match client_thread.tx.send(ClientHandlerMessage::Tick).await { - Ok(_) => { - match client_thread - .tx - .send(ClientHandlerMessage::PlayersUpdate { - players: protocol_players.clone(), - }) - .await - { - Ok(_) => (), - Err(e) => { - warn!("unable to send position packet: {}", e); - } - }; - let modules = entities.read().await.get_modules_id(); - let entities = entities.read().await; - let this_player = entities.get_player_id(*addr); - let mut attached_modules: Vec = - Vec::new(); - let unattached_modules = entities.get_all_attached(); - let mut unattached_modules: Vec = - unattached_modules - .iter() - .filter(|m| match this_player { - Some(id) => { - if m.player_id == id { - #[allow(clippy::expect_used)] - { - attached_modules.push( - m.to_protocol( - &entities, - &physics_data.rigid_body_set, - ) - .expect("module does not exist"), - ); - } - false - } else { - true - } - } - None => true, - }) - .map(|m| { - let id; - let module; - #[allow(clippy::expect_used)] - { - (id, module) = - m.to_module_id(&entities).expect("unable to get module id"); - } - //info!("{:?}", module); - let body; - #[allow(clippy::expect_used)] - { - body = physics_data - .rigid_body_set - .get(module.handle) - .expect("module body does not exist"); - } - let children = module.children.iter().map(|c| { - starkingdoms_protocol::module::Attachment { - id: c.child, - slot: 0, - special_fields: SpecialFields::default(), - } - }).collect(); - - starkingdoms_protocol::module::Module { - module_type: module.module_type.into(), - rotation: body.rotation().angle(), - x: body.translation().x * SCALE, - y: body.translation().y * SCALE, - id, - flags: module.flags, - children, - special_fields: SpecialFields::default(), - } - }) - .collect(); - let mut protocol_modules: Vec = modules - .iter() - .map(|(id, module)| { - let body; - - #[allow(clippy::expect_used)] - { - body = physics_data - .rigid_body_set - .get(module.handle) - .expect("module body does not exist"); - } - - let children = module.children.iter().map(|c| { - starkingdoms_protocol::module::Attachment { - id: c.child, - slot: 0, - special_fields: SpecialFields::default(), - } - }).collect(); - starkingdoms_protocol::module::Module { - module_type: module.module_type.into(), - rotation: body.rotation().angle(), - x: body.translation().x * SCALE, - y: body.translation().y * SCALE, - id: *id, - flags: module.flags, - children, - special_fields: SpecialFields::default(), - } - }) - .collect(); - protocol_modules.append(&mut unattached_modules); - match client_thread - .tx - .send(ClientHandlerMessage::ModulesUpdate { - modules: protocol_modules.clone(), - }) - .await - { - Ok(_) => (), - Err(e) => { - warn!("unable to send module position packet: {}", e); - } - }; - - match client_thread - .tx - .send(ClientHandlerMessage::ModuleTreeUpdate { - modules: attached_modules, - }) - .await - { - Ok(_) => (), - Err(e) => { - warn!("unable to send module tree update packet: {}", e); - } - } - - let planet_data = entities.to_protocol(); - match client_thread.tx.send(planet_data).await { - Ok(_) => (), - Err(e) => { - warn!("unable to send earth packet: {}", e); - } - }; - } - Err(e) => { - warn!("unable to update a client thread: {}", e); - to_remove.push(addr); - } - } - } - - for pending_removal in to_remove { - mgr_w.remove(pending_removal); - } - } -} diff --git a/spacetime b/spacetime deleted file mode 100755 index 9bbf401599ff63ccc2c32b1902c178164704af9a..0000000000000000000000000000000000000000 --- a/spacetime +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -set -e - -SCRIPT_PATH=$(readlink -f "${BASH_SOURCE:-$0}") -SCRIPT_DIR=$(dirname "$SCRIPT_PATH") - -echo "[*] Running configure command 'spacetime $* $SCRIPT_DIR'" - -cd "$SCRIPT_DIR" && cargo run --release --bin spacetime -- "$@" "$SCRIPT_DIR" \ No newline at end of file diff --git a/spacetime_old b/spacetime_old deleted file mode 100755 index 9c6cd3cf946bbfb6bf98bbc46fabeb2f8fdc251d..0000000000000000000000000000000000000000 --- a/spacetime_old +++ /dev/null @@ -1,284 +0,0 @@ -#!/bin/bash - -set -e - -SCRIPT_PATH=$(readlink -f "${BASH_SOURCE:-$0}") -SCRIPT_DIR=$(dirname "$SCRIPT_PATH") -SERVER_MODS=${STK_SERVER_MODULES:=""} - -exec_spacetime() { - # args: target, environment, build root, modules - echo "[*] Running configure command: 'python3 $SCRIPT_DIR/spacetime_py/spacetime.py $1 $2 $SCRIPT_DIR $SPACETIME_VERBOSE'" - python3 "$SCRIPT_DIR/spacetime_py/spacetime.py" "$1" "$2" "$SCRIPT_DIR" "$SPACETIME_VERBOSE" "$4" -} - -exec_ninja() { - # args: target - echo "[*] Running build command: 'ninja -C $SCRIPT_DIR $1'" - ninja -C "$SCRIPT_DIR" "$1" -} - -sub_help() { - echo "Spacetime - StarKingdoms build utility" - echo "Spacetime is a small utility program to generate Ninja build manifests for compiling StarKingdoms." - echo "Available targets:" - echo " help - Show this help screen" # done - echo " run_http - Compile the client and run a development http server for testing it" # done - echo " run_server (default) - Compile and run the game server" # done - echo " build_server - Compile the game server" # done - echo " run_server_prod - Compile and run the game server with optimizations enabled" # done - echo " build_server_prod - Compile the game server with optimizations enabled" # done - echo " run_api - Compile and run the API server" # done - echo " build_api - Compile the API server" # done - echo " run_api_prod - Compile and run the API server with optimizations enabled" # done - echo " build_api_prod - Compile the API server with optimizations enabled" # done - echo " install_tooling - Install the compilation utilities required for compiling StarKingdoms" # done - echo " build_assets - Compile spritesheets in all three texture sizes for textures-fast" # done - echo " build_assets_full - Compile spritesheets in full size for textures-fast" # done - echo " build_assets_375 - Commpile 37.5% spritesheets for textures-fast" # done - echo " build_assets_125 - Compile 12.5% spritesheets for textures-fast" # done - echo " clean - Remove all generated files" # done - echo " build_docker_api - Build the API dockerfile" # done - echo " build_docker_server - Build the server dockerfile" # done - echo " build_docker_web - Build the web dockerfile" # done - echo " build_docker - Build the API, web and server containers" # done - echo " build_docker_api_stable - Build the API container and push it as api-stable" # done - echo " build_docker_server_stable - Build the server container and push it as server-stable" # done - echo " build_docker_web_stable - Build the web dockerfile and push it as web-stable" # done - echo " build_docker_stable - Build the stable api, web and server containers" # done - echo " infra [action] - Run an infrastructure command. Requires an infrastructure key" # done - echo " client_protobuf - Rebuild the client protocol bindings" # done -} - -check_install_cargo() { - echo "[*] Checking for $1" - if ! command -v "$1" &> /dev/null - then - echo "[+] $1 was not found, installing via Cargo..." - cargo install "$2" $3 - fi -} - -check() { - echo "[*] Checking for $1" - if ! command -v "$1" &> /dev/null - then - echo "[x] $1 was not found but is required for the build process to continue. Install it with your system package manager, or, if supported, 'st install_tooling'" - exit 1 - fi -} - -check_all() { - check inkscape - check protoc - check atlasify -} - -sub_clean() { - rm -rf web/dist - rm -rf assets/dist - rm -rf assets/final - rm -rf target - rm -rf client/pkg -} - -sub_install_tooling() { - check inkscape - check protoc - check atlasify - echo "[*] All required tools are installed" -} - -sub_run_http() { - check_all - exec_spacetime client prod "$SCRIPT_DIR" "$CLIENT_MODS" - exec_ninja asset - cd client && yarn && yarn run dev -} - -sub_client_protobuf() { - cd client && yarn && yarn protobuf -} - -sub_build_server() { - check_all - exec_spacetime server dev "$SCRIPT_DIR" "$SERVER_MODS" - exec_ninja server -} -sub_run_server() { - check_all - exec_spacetime server dev "$SCRIPT_DIR" "$SERVER_MODS" - exec_ninja server - exec "$SCRIPT_DIR/target/debug/starkingdoms-server" -} - -sub_build_server_prod() { - check_all - exec_spacetime server prod "$SCRIPT_DIR" "$SERVER_MODS" - exec_ninja server -} -sub_run_server_prod() { - check_all - exec_spacetime server prod "$SCRIPT_DIR" "$SERVER_MODS" - exec_ninja server - exec "$SCRIPT_DIR/target/release/starkingdoms-server" -} - -sub_build_api() { - check_all - exec_spacetime api dev "$SCRIPT_DIR" "$SERVER_MODS" - exec_ninja api -} -sub_run_api() { - check_all - exec_spacetime api dev "$SCRIPT_DIR" "$SERVER_MODS" - exec_ninja api - cd api && exec "$SCRIPT_DIR/target/debug/starkingdoms-api" -} - -sub_build_api_prod() { - check_all - exec_spacetime api prod "$SCRIPT_DIR" "$SERVER_MODS" - exec_ninja api -} -sub_run_api_prod() { - check_all - exec_spacetime api prod "$SCRIPT_DIR" "$SERVER_MODS" - exec_ninja api - cd api && exec "$SCRIPT_DIR/target/release/starkingdoms-api" -} - -sub_build_assets() { - check_all - exec_spacetime asset dev "$SCRIPT_DIR" - exec_ninja asset -} - -sub_build_assets_full() { - check_all - exec_spacetime asset dev "$SCRIPT_DIR" - exec_ninja asset-full -} - -sub_build_assets_375() { - check_all - exec_spacetime asset dev "$SCRIPT_DIR" - exec_ninja asset-375 -} - -sub_build_assets_125() { - check_all - exec_spacetime asset dev "$SCRIPT_DIR" - exec_ninja asset-125 -} - - -build_docker() { - docker buildx build -f "$SCRIPT_DIR/$1".Dockerfile -t registry.gitlab.com/starkingdoms.tk/starkingdoms.tk:"$1"-$(git rev-parse --short HEAD) "$SCRIPT_DIR" - docker buildx build -f "$SCRIPT_DIR/$1".Dockerfile -t registry.gitlab.com/starkingdoms.tk/starkingdoms.tk:"$1"-"$2" "$SCRIPT_DIR" - docker push registry.gitlab.com/starkingdoms.tk/starkingdoms.tk:"$1"-$(git rev-parse --short HEAD) - docker push registry.gitlab.com/starkingdoms.tk/starkingdoms.tk:"$1"-"$2" -} - -swap_out_server_for() { - echo "[*] Swapping out API server" - sed -i'orig' "s/let api_server = \"http:\\/\\/localhost:8080\";/let api_server = \"https:\\/\\/api.${1}.${2}\";/" "$SCRIPT_DIR/client/index.html" - echo "[*] Swapping out game server" - sed -i "s/let servers = \[\"localhost:3000\"\];/let servers = [\"${1}.${2}\"];/" "$SCRIPT_DIR/client/index.html" -} - -sub_swap_server() { - swap_out_server_for "$1" "$2" -} -sub_reset_server() { - mv client/index.htmlorig client/index.html -} - -sub_build_docker_api() { - sub_build_api_prod - build_docker "api" "bleeding" -} - -sub_build_docker_server() { - sub_build_server_prod - build_docker "server" "bleeding" -} - -sub_build_docker_web() { - swap_out_server_for "bleeding" "starkingdoms.io" - build_docker "web" "bleeding" - mv "$SCRIPT_DIR/client/index.htmlorig" "$SCRIPT_DIR/client/index.html" -} - -sub_build_docker_web_stable() { - swap_out_server_for "starkingdoms" "io" - build_docker "web" "stable" - mv "$SCRIPT_DIR/client/index.htmlorig" "$SCRIPT_DIR/client/index.html" -} - -sub_build_docker_api_stable() { - sub_build_api_prod - build_docker "api" "stable" -} - -sub_build_docker_server_stable() { - sub_build_server_prod - build_docker "server" "stable" -} - - -sub_build_docker_api_beta() { - sub_build_api_prod - build_docker "api" "beta" -} - -sub_build_docker_server_beta() { - sub_build_server_prod - build_docker "server" "beta" -} - -sub_build_docker_web_beta() { - swap_out_server_for "beta" "starkingdoms.io" - build_docker "web" "beta" - mv "$SCRIPT_DIR/client/index.htmlorig" "$SCRIPT_DIR/client/index.html" -} - -sub_build_docker() { - sub_build_docker_api - sub_build_docker_server - sub_build_docker_web -} - -sub_build_docker_beta() { - sub_build_docker_api_beta - sub_build_docker_server_beta - sub_build_docker_web_beta -} - -sub_build_docker_stable() { - sub_build_docker_api_stable - sub_build_docker_server_stable - sub_build_docker_web_stable -} - -sub_infra() { - echo "[*] Connecting to infrastructure manager server. If you are prompted for a password, enter your infrastructure key. You may be prompted several times." - ssh team@10.16.1.3 /home/team/run_ansible.sh "$1" -} - -subcommand=$1 -case $subcommand in - "" | "-h" | "--help" | "help") - sub_help - ;; - *) - echo "[*] Running build command $subcommand" - shift - sub_${subcommand} $@ - if [ $? = 127 ]; then - echo "Error: '$subcommand' is not a known subcommand." >&2 - echo " Run 'st --help' for a list of known subcommands." >&2 - exit 1 - fi - ;; -esac \ No newline at end of file diff --git a/spacetime_py/__pycache__/ninja_syntax.cpython-310.pyc b/spacetime_py/__pycache__/ninja_syntax.cpython-310.pyc deleted file mode 100644 index ce3e975a134c9fbcc8606a0ad87be12c2ce2570e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5958 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 hGec0gS4y*Um5h`+1zn#OP3dDm^a{{x^N7Wn`G diff --git a/spacetime_py/ninja_syntax.py b/spacetime_py/ninja_syntax.py deleted file mode 100644 index ca73b5ba9955456dfb3500bda6b8620d2db22e3a..0000000000000000000000000000000000000000 --- a/spacetime_py/ninja_syntax.py +++ /dev/null @@ -1,199 +0,0 @@ -#!/usr/bin/python - -# Copyright 2011 Google Inc. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Python module for generating .ninja files. - -Note that this is emphatically not a required piece of Ninja; it's -just a helpful utility for build-file-generation systems that already -use Python. -""" - -import re -import textwrap - -def escape_path(word): - return word.replace('$ ', '$$ ').replace(' ', '$ ').replace(':', '$:') - -class Writer(object): - def __init__(self, output, width=78): - self.output = output - self.width = width - - def newline(self): - self.output.write('\n') - - def comment(self, text): - for line in textwrap.wrap(text, self.width - 2, break_long_words=False, - break_on_hyphens=False): - self.output.write('# ' + line + '\n') - - def variable(self, key, value, indent=0): - if value is None: - return - if isinstance(value, list): - value = ' '.join(filter(None, value)) # Filter out empty strings. - self._line('%s = %s' % (key, value), indent) - - def pool(self, name, depth): - self._line('pool %s' % name) - self.variable('depth', depth, indent=1) - - def rule(self, name, command, description=None, depfile=None, - generator=False, pool=None, restat=False, rspfile=None, - rspfile_content=None, deps=None): - self._line('rule %s' % name) - self.variable('command', command, indent=1) - if description: - self.variable('description', description, indent=1) - if depfile: - self.variable('depfile', depfile, indent=1) - if generator: - self.variable('generator', '1', indent=1) - if pool: - self.variable('pool', pool, indent=1) - if restat: - self.variable('restat', '1', indent=1) - if rspfile: - self.variable('rspfile', rspfile, indent=1) - if rspfile_content: - self.variable('rspfile_content', rspfile_content, indent=1) - if deps: - self.variable('deps', deps, indent=1) - - def build(self, outputs, rule, inputs=None, implicit=None, order_only=None, - variables=None, implicit_outputs=None, pool=None, dyndep=None): - outputs = as_list(outputs) - out_outputs = [escape_path(x) for x in outputs] - all_inputs = [escape_path(x) for x in as_list(inputs)] - - if implicit: - implicit = [escape_path(x) for x in as_list(implicit)] - all_inputs.append('|') - all_inputs.extend(implicit) - if order_only: - order_only = [escape_path(x) for x in as_list(order_only)] - all_inputs.append('||') - all_inputs.extend(order_only) - if implicit_outputs: - implicit_outputs = [escape_path(x) - for x in as_list(implicit_outputs)] - out_outputs.append('|') - out_outputs.extend(implicit_outputs) - - self._line('build %s: %s' % (' '.join(out_outputs), - ' '.join([rule] + all_inputs))) - if pool is not None: - self._line(' pool = %s' % pool) - if dyndep is not None: - self._line(' dyndep = %s' % dyndep) - - if variables: - if isinstance(variables, dict): - iterator = iter(variables.items()) - else: - iterator = iter(variables) - - for key, val in iterator: - self.variable(key, val, indent=1) - - return outputs - - def include(self, path): - self._line('include %s' % path) - - def subninja(self, path): - self._line('subninja %s' % path) - - def default(self, paths): - self._line('default %s' % ' '.join(as_list(paths))) - - def _count_dollars_before_index(self, s, i): - """Returns the number of '$' characters right in front of s[i].""" - dollar_count = 0 - dollar_index = i - 1 - while dollar_index > 0 and s[dollar_index] == '$': - dollar_count += 1 - dollar_index -= 1 - return dollar_count - - def _line(self, text, indent=0): - """Write 'text' word-wrapped at self.width characters.""" - leading_space = ' ' * indent - while len(leading_space) + len(text) > self.width: - # The text is too wide; wrap if possible. - - # Find the rightmost space that would obey our width constraint and - # that's not an escaped space. - available_space = self.width - len(leading_space) - len(' $') - space = available_space - while True: - space = text.rfind(' ', 0, space) - if (space < 0 or - self._count_dollars_before_index(text, space) % 2 == 0): - break - - if space < 0: - # No such space; just use the first unescaped space we can find. - space = available_space - 1 - while True: - space = text.find(' ', space + 1) - if (space < 0 or - self._count_dollars_before_index(text, space) % 2 == 0): - break - if space < 0: - # Give up on breaking. - break - - self.output.write(leading_space + text[0:space] + ' $\n') - text = text[space+1:] - - # Subsequent lines are continuations, so indent them. - leading_space = ' ' * (indent+2) - - self.output.write(leading_space + text + '\n') - - def close(self): - self.output.close() - - -def as_list(input): - if input is None: - return [] - if isinstance(input, list): - return input - return [input] - - -def escape(string): - """Escape a string such that it can be embedded into a Ninja file without - further interpretation.""" - assert '\n' not in string, 'Ninja syntax does not allow newlines' - # We only have one special metacharacter: '$'. - return string.replace('$', '$$') - - -def expand(string, vars, local_vars={}): - """Expand a string containing $vars as Ninja would. - - Note: doesn't handle the full Ninja variable syntax, but it's enough - to make configure.py's use of it work. - """ - def exp(m): - var = m.group(1) - if var == '$': - return '$' - return local_vars.get(var, vars.get(var, '')) - return re.sub(r'\$(\$|\w*)', exp, string) diff --git a/spacetime_py/spacetime.py b/spacetime_py/spacetime.py deleted file mode 100644 index b15ca38213a36933e4c3d116044c7934c87454b2..0000000000000000000000000000000000000000 --- a/spacetime_py/spacetime.py +++ /dev/null @@ -1,166 +0,0 @@ -import sys -from ninja_syntax import Writer -import os - - -def scan_assets(build_root): - print(f'[spacetime] Scanning {build_root}/assets/src for assets') - assets = [] - for entry in os.scandir(f'{build_root}/assets/src'): - if entry.is_file() and entry.name.endswith('.ink.svg'): - assets.append(f'{entry.name}') - print(f'[spacetime] Found {len(assets)} assets') - return assets - - -default_asset_size = 512 -asset_override = { - 'earth.ink.svg': 2048, - 'moon.ink.svg': 2048 -} - -def gen_inkscape_rules_for_asset_size(size, writer): - writer.rule(f'inkscape_{size}px_full', f'inkscape -w {size * 1} -h {size * 1} $in -o $out') - writer.rule(f'inkscape_{size}px_375', f'inkscape -w {int(size * 0.375)} -h {int(size * 0.375)} $in -o $out') - writer.rule(f'inkscape_{size}px_125', f'inkscape -w {int(size * 0.125)} -h {int(size * 0.125)} $in -o $out') - - -def gen_inkscape_rules_for_asset_sizes(writer): - built_sizes_for = [] - gen_inkscape_rules_for_asset_size(default_asset_size, writer) - built_sizes_for.append(default_asset_size) - for override in asset_override: - if not asset_override[override] in built_sizes_for: - gen_inkscape_rules_for_asset_size(asset_override[override], writer) - built_sizes_for.append(asset_override[override]) - - -def asset_size(asset): - if asset.split('/')[-1] in asset_override: - return asset_override[asset.split('/')[-1]] - else: - return default_asset_size - - -def gen_inkscape_rules_for_asset(root, asset, writer, files_375, files_full, files_125): - in_file = f'{root}/assets/src/{asset}' - out_file_name = asset.split('.')[0].split('/')[-1] - - out_full = f'{root}/assets/final/full/{out_file_name}.png' - files_full.append(out_full) - rule_full = f'inkscape_{asset_size(asset)}px_full' - - out_375 = f'{root}/assets/final/375/{out_file_name}.png' - files_375.append(out_375) - rule_375 = f'inkscape_{asset_size(asset)}px_375' - - out_125 = f'{root}/assets/final/125/{out_file_name}.png' - files_125.append(out_125) - rule_125 = f'inkscape_{asset_size(asset)}px_125' - - writer.build([out_full], rule_full, [in_file]) - writer.build([out_375], rule_375, [in_file]) - writer.build([out_125], rule_125, [in_file]) - -def gen_rules_for_server(root, env, writer, modules): - if env == 'dev': - out_dir = 'debug' - writer.rule('cargo-server', f'cargo build --bin starkingdoms-server --features "{modules}"', - depfile=f'{root}/target/debug/starkingdoms-server.d', pool='console') - elif env == 'prod': - out_dir = 'release' - writer.rule('cargo-server', f'cargo build --bin starkingdoms-server --release --features "{modules}"', - depfile=f'{root}/target/release/starkingdoms-server.d', pool='console') - - writer.build([f'{root}/target/{out_dir}/starkingdoms-server'], 'cargo-server', ['server/Cargo.toml']) - writer.build(['server'], 'phony', [f'{root}/target/{out_dir}/starkingdoms-server']) - -def gen_rules_for_api(root, env, writer, modules): - if env == 'dev': - out_dir = 'debug' - writer.rule('cargo-api', f'cargo build --bin starkingdoms-api --features "{modules}"', - depfile=f'{root}/target/debug/starkingdoms-api.d', pool='console') - elif env == 'prod': - out_dir = 'release' - writer.rule('cargo-api', f'cargo build --bin starkingdoms-api --release --features "{modules}"', - depfile=f'{root}/target/release/starkingdoms-api.d', pool='console') - - writer.build([f'{root}/target/{out_dir}/starkingdoms-api'], 'cargo-api', ['server/Cargo.toml']) - writer.build(['api'], 'phony', [f'{root}/target/{out_dir}/starkingdoms-api']) - -def gen_inkscape(root, assets, writer, files_375, files_full, files_125): - gen_inkscape_rules_for_asset_sizes(writer) - - for asset in assets: - gen_inkscape_rules_for_asset(root, asset, writer, files_375, files_full, files_125) - - -def gen_packers(root, writer, files_375, files_full, files_125): - # sheep pack assets/final/full/*.png -f amethyst_named -o assets/dist/spritesheet-full - writer.rule(f'pack', 'cd assets/dist && atlasify -m 4096,4096 -o $out $in && touch $out') - - writer.build(f'{root}/assets/dist/spritesheet-full', 'pack', inputs=files_full, - implicit_outputs=[f'{root}/assets/dist/spritesheet-full.png', - f'{root}/assets/dist/spritesheet-full.json']) - writer.build(f'asset-full', 'phony', inputs=[f'{root}/assets/dist/spritesheet-full']) - - writer.build(f'{root}/assets/dist/spritesheet-375', 'pack', inputs=files_375, - implicit_outputs=[f'{root}/assets/dist/spritesheet-375.png', - f'{root}/assets/dist/spritesheet-375.json']) - writer.build(f'asset-375', 'phony', inputs=[f'{root}/assets/dist/spritesheet-375']) - - writer.build(f'{root}/assets/dist/spritesheet-125', 'pack', inputs=files_125, - implicit_outputs=[f'{root}/assets/dist/spritesheet-125.png', - f'{root}/assets/dist/spritesheet-125.json']) - writer.build(f'asset-125', 'phony', inputs=[f'{root}/assets/dist/spritesheet-125']) - - writer.build(f'asset', 'phony', - inputs=[f'{root}/assets/dist/spritesheet-full', f'{root}/assets/dist/spritesheet-375', - f'{root}/assets/dist/spritesheet-125']) - - -def generate_assets_build_command(root, assets, writer): - files_full = [] - files_375 = [] - files_125 = [] - gen_inkscape(root, assets, writer, files_375, files_full, files_125) - gen_packers(root, writer, files_375, files_full, files_125) - - -def main(): - target = sys.argv[1] - env = sys.argv[2] - root = sys.argv[3] - if len(sys.argv) > 5: - modules = sys.argv[5] - else: - modules = "" - - verbose = False - if len(sys.argv) > 4: - if sys.argv[4] == '-v': - verbose = True - - print(f'[spacetime] Configuring ninja for PRIMARY_TARGET={target} with ENV={env}, BUILDROOT={root}, MODULES={modules}') - - with open(f'{root}/build.ninja', 'w') as f: - writer = Writer(f) - - writer.comment('Generated by spacetime.py') - writer.comment('Do not manually edit this file') - - if target == 'client' or target == 'asset': - assets = scan_assets(root) - if verbose: - print(f'[spacetime -v] discovered assets: {assets}') - generate_assets_build_command(root, assets, writer) - elif target == 'server': - gen_rules_for_server(root, env, writer, modules) - elif target == 'api': - gen_rules_for_api(root, env, writer, modules) - - print(f'[spacetime] Configured build') - - -if __name__ == "__main__": - main() diff --git a/spacetime_rs/Cargo.toml b/spacetime_rs/Cargo.toml deleted file mode 100644 index 3e45c78cf70cd16e1c3367f8a213415848a1ffa9..0000000000000000000000000000000000000000 --- a/spacetime_rs/Cargo.toml +++ /dev/null @@ -1,11 +0,0 @@ -[package] -name = "spacetime" -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -tabwriter = "1.2.1" -which = "4.4.0" -sedregex = "0.2.5" \ No newline at end of file diff --git a/spacetime_rs/src/cmd.rs b/spacetime_rs/src/cmd.rs deleted file mode 100644 index b9619aeb599be1942df6d7fa460558f70a12d11a..0000000000000000000000000000000000000000 --- a/spacetime_rs/src/cmd.rs +++ /dev/null @@ -1,20 +0,0 @@ -use which::which; - -pub fn enforce_commands() { - println!("[spacetime] checking for required tooling"); - _enforce_command("cargo"); - _enforce_command("ninja"); - _enforce_command("yarn"); - _enforce_command("inkscape"); - _enforce_command("atlasify"); - println!("[spacetime] all required tools present"); -} - -fn _enforce_command(cmd: &str) { - if which(cmd).is_err() { - eprintln!( - "[!] Unable to find required binary {}. Please install it to continue.", - cmd - ); - } -} diff --git a/spacetime_rs/src/commands/api.rs b/spacetime_rs/src/commands/api.rs deleted file mode 100644 index 7a703b8afa346dfd1aa0088c8fb3a719c47934be..0000000000000000000000000000000000000000 --- a/spacetime_rs/src/commands/api.rs +++ /dev/null @@ -1,59 +0,0 @@ -use crate::configure::create_writer; -use crate::configure::rust::configure_rust_target; -use crate::ninja::{exec, exec_ninja}; -use std::error::Error; -use std::path::PathBuf; - -pub fn build_api(_: Vec, root: PathBuf) -> Result<(), Box> { - let mut config_file_writer = create_writer(&root)?; - - configure_rust_target("api", "dev", &mut config_file_writer, &root)?; - - exec_ninja(&root, vec!["api".to_string()])?; - - Ok(()) -} - -pub fn build_api_prod(_: Vec, root: PathBuf) -> Result<(), Box> { - let mut config_file_writer = create_writer(&root)?; - - configure_rust_target("api", "prod", &mut config_file_writer, &root)?; - - exec_ninja(&root, vec!["api".to_string()])?; - - Ok(()) -} - -pub fn run_api(args: Vec, root: PathBuf) -> Result<(), Box> { - let mut config_file_writer = create_writer(&root)?; - - configure_rust_target("api", "dev", &mut config_file_writer, &root)?; - - exec_ninja(&root, vec!["api".to_string()])?; - - exec( - root.join("target/debug/starkingdoms-api").to_str().unwrap(), - &root.join("api"), - args, - )?; - - Ok(()) -} - -pub fn run_api_prod(args: Vec, root: PathBuf) -> Result<(), Box> { - let mut config_file_writer = create_writer(&root)?; - - configure_rust_target("api", "prod", &mut config_file_writer, &root)?; - - exec_ninja(&root, vec!["api".to_string()])?; - - exec( - root.join("target/release/starkingdoms-api") - .to_str() - .unwrap(), - &root.join("api"), - args, - )?; - - Ok(()) -} diff --git a/spacetime_rs/src/commands/assets.rs b/spacetime_rs/src/commands/assets.rs deleted file mode 100644 index 87f902f76219bd9ed5f20b616a6169c31e148fc5..0000000000000000000000000000000000000000 --- a/spacetime_rs/src/commands/assets.rs +++ /dev/null @@ -1,26 +0,0 @@ -use crate::configure::asset::configure_assets; -use crate::configure::create_writer; -use crate::ninja::exec_ninja; -use std::error::Error; -use std::path::PathBuf; -use std::time::SystemTime; - -pub fn build_assets(_: Vec, root: PathBuf) -> Result<(), Box> { - let mut config_file_writer = create_writer(&root)?; - - let start = SystemTime::now(); - - configure_assets(&mut config_file_writer, &root)?; - - let end = SystemTime::now(); - let duration = end.duration_since(start).unwrap(); - - println!( - "[spacetime] configure completed in {} seconds", - duration.as_secs_f32() - ); - - exec_ninja(&root, vec!["asset".to_string()])?; - - Ok(()) -} diff --git a/spacetime_rs/src/commands/clean.rs b/spacetime_rs/src/commands/clean.rs deleted file mode 100644 index 25d0321b93c2b06b8ecb2cf1030f6d4fed46e9ab..0000000000000000000000000000000000000000 --- a/spacetime_rs/src/commands/clean.rs +++ /dev/null @@ -1,11 +0,0 @@ -use crate::ninja::exec; -use std::error::Error; -use std::fs; -use std::path::PathBuf; - -pub fn clean(_: Vec, root: PathBuf) -> Result<(), Box> { - exec("cargo", &root, vec!["clean".to_string()])?; - fs::remove_dir_all(root.join("assets").join("dist"))?; - fs::remove_dir_all(root.join("assets").join("final"))?; - Ok(()) -} diff --git a/spacetime_rs/src/commands/client.rs b/spacetime_rs/src/commands/client.rs deleted file mode 100644 index 8bb3166053dc3331ff1c42c3c239ce30453478a6..0000000000000000000000000000000000000000 --- a/spacetime_rs/src/commands/client.rs +++ /dev/null @@ -1,38 +0,0 @@ -use crate::configure::client::configure_client; -use crate::configure::create_writer; -use crate::ninja::{exec, exec_ninja}; -use std::error::Error; -use std::path::PathBuf; - -pub fn run_http(_: Vec, root: PathBuf) -> Result<(), Box> { - let mut config_file_writer = create_writer(&root)?; - - configure_client(&mut config_file_writer, &root)?; - - exec_ninja(&root, vec!["asset".to_string()])?; - - exec("yarn", &root.join("client"), vec![])?; - exec( - "yarn", - &root.join("client"), - vec!["run".to_string(), "dev".to_string()], - )?; - - Ok(()) -} - -pub fn client_protobuf(_: Vec, root: PathBuf) -> Result<(), Box> { - exec("yarn", &root.join("client"), vec![])?; - exec("yarn", &root.join("client"), vec!["protobuf".to_string()]) -} - -pub fn build_client_prod(_: Vec, root: PathBuf) -> Result<(), Box> { - let mut config_file_writer = create_writer(&root)?; - - configure_client(&mut config_file_writer, &root)?; - - exec_ninja(&root, vec!["asset".to_string()])?; - - exec("yarn", &root.join("client"), vec![])?; - exec("yarn", &root.join("client"), vec!["build".to_string()]) -} diff --git a/spacetime_rs/src/commands/docker.rs b/spacetime_rs/src/commands/docker.rs deleted file mode 100644 index d7184bd760ac63defe5483ba6426b958a6cb85e8..0000000000000000000000000000000000000000 --- a/spacetime_rs/src/commands/docker.rs +++ /dev/null @@ -1,171 +0,0 @@ -use crate::commands::api::build_api_prod; -use crate::commands::client::build_client_prod; -use crate::commands::server::build_server_prod; -use crate::ninja::exec; -use sedregex::find_and_replace; -use std::error::Error; -use std::fs; -use std::path::PathBuf; -use std::process::Command; - -fn _build(img: &str, channel: &str, root: &PathBuf) -> Result<(), Box> { - let mut patched = "".to_string(); - // compile the various thingies - if img == "server" { - build_server_prod(vec![], root.clone())?; - } else if img == "api" { - build_api_prod(vec![], root.clone())?; - } else if img == "web" { - let (a, b) = match channel { - "stable" => ("starkingdoms", "tk"), - _ => (channel, "starkingdoms.io"), - }; - - let index_html_path = root.clone().join("client/").join("index.html"); - - let index_html_src = fs::read_to_string(&index_html_path)?; - let index_html_patched = find_and_replace(&index_html_src, &[ - format!("s/let api_server = \"http:\\/\\/localhost:8080\";/let api_server = \"https:\\/\\/api.{}.{}\";/", a, b) - ])?; - - fs::write(&index_html_path, index_html_patched.as_bytes())?; - - fs::write( - root.clone().join("client/").join("index.html.orig"), - index_html_src.clone(), - )?; - - patched = index_html_src.clone(); - - build_client_prod(vec![], root.clone())? - } - - let git_commit_id = String::from_utf8( - Command::new("git") - .args(["rev-parse", "--short", "HEAD"]) - .current_dir(root) - .output() - .unwrap() - .stdout, - ) - .unwrap() - .replace('\n', ""); - exec( - "docker", - root, - vec![ - "buildx", - "build", - "-f", - root.join(format!("{}.Dockerfile", img)).to_str().unwrap(), - "-t", - &format!( - "registry.gitlab.com/starkingdoms.tk/starkingdoms.tk:{}-{}", - img, git_commit_id - ), - root.to_str().unwrap(), - ] - .iter() - .map(|u| u.to_string()) - .collect(), - )?; - exec( - "docker", - root, - vec![ - "buildx", - "build", - "-f", - root.join(format!("{}.Dockerfile", img)).to_str().unwrap(), - "-t", - &format!( - "registry.gitlab.com/starkingdoms.tk/starkingdoms.tk:{}-{}", - img, channel - ), - root.to_str().unwrap(), - ] - .iter() - .map(|u| u.to_string()) - .collect(), - )?; - - exec( - "docker", - root, - vec![ - "push", - &format!( - "registry.gitlab.com/starkingdoms.tk/starkingdoms.tk:{}-{}", - img, git_commit_id - ), - ] - .iter() - .map(|u| u.to_string()) - .collect(), - )?; - exec( - "docker", - root, - vec![ - "push", - &format!( - "registry.gitlab.com/starkingdoms.tk/starkingdoms.tk:{}-{}", - img, channel - ), - ] - .iter() - .map(|u| u.to_string()) - .collect(), - )?; - - if img == "web" { - fs::write(root.clone().join("client/").join("index.html"), patched)?; - } - - Ok(()) -} - -pub fn build_docker_api(_: Vec, root: PathBuf) -> Result<(), Box> { - _build("api", "bleeding", &root) -} -pub fn build_docker_server(_: Vec, root: PathBuf) -> Result<(), Box> { - _build("server", "bleeding", &root) -} -pub fn build_docker_web(_: Vec, root: PathBuf) -> Result<(), Box> { - _build("web", "bleeding", &root) -} -pub fn build_docker(_a: Vec, root: PathBuf) -> Result<(), Box> { - build_docker_api(_a.clone(), root.clone())?; - build_docker_server(_a.clone(), root.clone())?; - build_docker_web(_a, root) -} - -pub fn build_docker_api_beta(_: Vec, root: PathBuf) -> Result<(), Box> { - _build("api", "beta", &root) -} -pub fn build_docker_server_beta(_: Vec, root: PathBuf) -> Result<(), Box> { - _build("server", "beta", &root) -} -pub fn build_docker_web_beta(_: Vec, root: PathBuf) -> Result<(), Box> { - _build("web", "beta", &root) -} -pub fn build_docker_beta(_a: Vec, root: PathBuf) -> Result<(), Box> { - build_docker_api_beta(_a.clone(), root.clone())?; - build_docker_server_beta(_a.clone(), root.clone())?; - build_docker_web_beta(_a, root) -} - -pub fn build_docker_api_stable(_: Vec, root: PathBuf) -> Result<(), Box> { - _build("api", "stable", &root) -} -pub fn build_docker_server_stable(_: Vec, root: PathBuf) -> Result<(), Box> { - _build("server", "stable", &root) -} -pub fn build_docker_web_stable(_: Vec, root: PathBuf) -> Result<(), Box> { - _build("web", "stable", &root) -} -pub fn build_docker_stable(_a: Vec, root: PathBuf) -> Result<(), Box> { - build_docker_api_stable(_a.clone(), root.clone())?; - build_docker_server_stable(_a.clone(), root.clone())?; - build_docker_web_stable(_a, root) -} diff --git a/spacetime_rs/src/commands/mod.rs b/spacetime_rs/src/commands/mod.rs deleted file mode 100644 index 4240f4f95be06ebafbb1439d958d92145e8d2198..0000000000000000000000000000000000000000 --- a/spacetime_rs/src/commands/mod.rs +++ /dev/null @@ -1,6 +0,0 @@ -pub mod api; -pub mod assets; -pub mod clean; -pub mod client; -pub mod docker; -pub mod server; diff --git a/spacetime_rs/src/commands/server.rs b/spacetime_rs/src/commands/server.rs deleted file mode 100644 index b87f9145b2cf22021c89be890733202559c98523..0000000000000000000000000000000000000000 --- a/spacetime_rs/src/commands/server.rs +++ /dev/null @@ -1,61 +0,0 @@ -use crate::configure::create_writer; -use crate::configure::rust::configure_rust_target; -use crate::ninja::{exec, exec_ninja}; -use std::error::Error; -use std::path::PathBuf; - -pub fn build_server(_: Vec, root: PathBuf) -> Result<(), Box> { - let mut config_file_writer = create_writer(&root)?; - - configure_rust_target("server", "dev", &mut config_file_writer, &root)?; - - exec_ninja(&root, vec!["server".to_string()])?; - - Ok(()) -} - -pub fn build_server_prod(_: Vec, root: PathBuf) -> Result<(), Box> { - let mut config_file_writer = create_writer(&root)?; - - configure_rust_target("server", "prod", &mut config_file_writer, &root)?; - - exec_ninja(&root, vec!["server".to_string()])?; - - Ok(()) -} - -pub fn run_server(args: Vec, root: PathBuf) -> Result<(), Box> { - let mut config_file_writer = create_writer(&root)?; - - configure_rust_target("server", "dev", &mut config_file_writer, &root)?; - - exec_ninja(&root, vec!["server".to_string()])?; - - exec( - root.join("target/debug/starkingdoms-server") - .to_str() - .unwrap(), - &root, - args, - )?; - - Ok(()) -} - -pub fn run_server_prod(args: Vec, root: PathBuf) -> Result<(), Box> { - let mut config_file_writer = create_writer(&root)?; - - configure_rust_target("server", "prod", &mut config_file_writer, &root)?; - - exec_ninja(&root, vec!["server".to_string()])?; - - exec( - root.join("target/release/starkingdoms-server") - .to_str() - .unwrap(), - &root, - args, - )?; - - Ok(()) -} diff --git a/spacetime_rs/src/config.rs b/spacetime_rs/src/config.rs deleted file mode 100644 index dbed619b3640d01f1663648984c0831f95672938..0000000000000000000000000000000000000000 --- a/spacetime_rs/src/config.rs +++ /dev/null @@ -1,4 +0,0 @@ -pub const ASSET_DIR: &str = "assets/"; -pub const ASSETS_DIST_SUBDIR: &str = "dist/"; -pub const ASSETS_SRC_SUBDIR: &str = "src/"; -pub const ASSETS_FINAL_SUBDIR: &str = "final/"; diff --git a/spacetime_rs/src/configure/asset.rs b/spacetime_rs/src/configure/asset.rs deleted file mode 100644 index 57bcafb4b50e662e92cc1be1acce3162c3f98886..0000000000000000000000000000000000000000 --- a/spacetime_rs/src/configure/asset.rs +++ /dev/null @@ -1,430 +0,0 @@ -use crate::config::{ASSETS_DIST_SUBDIR, ASSETS_FINAL_SUBDIR, ASSETS_SRC_SUBDIR, ASSET_DIR}; -use crate::ninja::NinjaWriter; -use std::collections::HashMap; -use std::error::Error; -use std::fs; -use std::fs::File; -use std::path::{Path, PathBuf}; - -pub fn configure_assets(writer: &mut NinjaWriter, root: &Path) -> Result<(), Box> { - // scan for assets - let asset_src_dir = root.join(ASSET_DIR).join(ASSETS_SRC_SUBDIR); - - let mut found_assets = vec![]; - - let files_in_src_dir = fs::read_dir(asset_src_dir)?; - for maybe_asset in files_in_src_dir { - let maybe_asset = maybe_asset?; - if maybe_asset.file_name().to_str().unwrap().ends_with(".svg") { - found_assets.push(maybe_asset.path()); - println!("[spacetime][DEBUG] asset: {:?}", maybe_asset.path()); - } - } - - println!( - "[spacetime] asset scan: found {} assets", - found_assets.len() - ); - - let default_asset_size = 512; - let asset_overrides = HashMap::from([ - ("earth.svg", 2048), - ("moon.svg", 2048), - ("mars.svg", 2048), - ("starfield.svg", 2048), - ]); - - // generate an inkscape rule for all required asset sizes - let mut written_rules_for = vec![]; - - gen_inkscape_rule(default_asset_size, writer, &mut written_rules_for)?; - - for size in asset_overrides.values() { - gen_inkscape_rule(*size, writer, &mut written_rules_for)?; - } - - println!( - "[spacetime] generated {} image conversion rules", - written_rules_for.len() * 3 - ); - - let mut files_375 = vec![]; - let mut files_125 = vec![]; - let mut files_full = vec![]; - - for asset in &found_assets { - gen_convert_rule( - asset, - root, - writer, - &mut files_375, - &mut files_full, - &mut files_125, - asset_size( - asset.to_str().unwrap(), - &asset_overrides, - default_asset_size, - ), - )?; - } - - println!( - "[spacetime] generated {} image conversion steps", - files_full.len() + files_125.len() + files_375.len() - ); - - gen_packer_rule(root, writer, &files_375, &files_full, &files_125)?; - - println!("[spacetime] generated asset build commands"); - - Ok(()) -} - -fn gen_packer_rule( - root: &Path, - writer: &mut NinjaWriter, - files_375: &[PathBuf], - files_full: &[PathBuf], - files_125: &[PathBuf], -) -> Result<(), Box> { - writer.rule( - "pack", - &format!( - "cd {} && atlasify -m 8096,8096 -o $out $in && touch $out", - root.join(ASSET_DIR) - .join(ASSETS_DIST_SUBDIR) - .to_string_lossy() - ), - None, - None, - None, - Some("console"), - None, - None, - None, - None, - )?; - - writer.build( - vec![root - .join(ASSET_DIR) - .join(ASSETS_DIST_SUBDIR) - .join("spritesheet-full") - .to_str() - .unwrap() - .to_string()], - "pack".to_string(), - files_full - .iter() - .map(|u| u.to_str().unwrap().to_string()) - .collect(), - vec![], - vec![], - HashMap::new(), - vec![ - root.join(ASSET_DIR) - .join(ASSETS_DIST_SUBDIR) - .join("spritesheet-full.json") - .to_str() - .unwrap() - .to_string(), - root.join(ASSET_DIR) - .join(ASSETS_DIST_SUBDIR) - .join("spritesheet-full.png") - .to_str() - .unwrap() - .to_string(), - ], - None, - None, - )?; - writer.build( - vec!["asset-full".to_string()], - "phony".to_string(), - vec![root - .join(ASSET_DIR) - .join(ASSETS_DIST_SUBDIR) - .join("spritesheet-full") - .to_str() - .unwrap() - .to_string()], - vec![], - vec![], - HashMap::new(), - vec![], - None, - None, - )?; - - writer.build( - vec![root - .join(ASSET_DIR) - .join(ASSETS_DIST_SUBDIR) - .join("spritesheet-125") - .to_str() - .unwrap() - .to_string()], - "pack".to_string(), - files_125 - .iter() - .map(|u| u.to_str().unwrap().to_string()) - .collect(), - vec![], - vec![], - HashMap::new(), - vec![ - root.join(ASSET_DIR) - .join(ASSETS_DIST_SUBDIR) - .join("spritesheet-125.json") - .to_str() - .unwrap() - .to_string(), - root.join(ASSET_DIR) - .join(ASSETS_DIST_SUBDIR) - .join("spritesheet-125.png") - .to_str() - .unwrap() - .to_string(), - ], - None, - None, - )?; - writer.build( - vec!["asset-125".to_string()], - "phony".to_string(), - vec![root - .join(ASSET_DIR) - .join(ASSETS_DIST_SUBDIR) - .join("spritesheet-125") - .to_str() - .unwrap() - .to_string()], - vec![], - vec![], - HashMap::new(), - vec![], - None, - None, - )?; - - writer.build( - vec![root - .join(ASSET_DIR) - .join(ASSETS_DIST_SUBDIR) - .join("spritesheet-375") - .to_str() - .unwrap() - .to_string()], - "pack".to_string(), - files_375 - .iter() - .map(|u| u.to_str().unwrap().to_string()) - .collect(), - vec![], - vec![], - HashMap::new(), - vec![ - root.join(ASSET_DIR) - .join(ASSETS_DIST_SUBDIR) - .join("spritesheet-375.json") - .to_str() - .unwrap() - .to_string(), - root.join(ASSET_DIR) - .join(ASSETS_DIST_SUBDIR) - .join("spritesheet-375.png") - .to_str() - .unwrap() - .to_string(), - ], - None, - None, - )?; - writer.build( - vec!["asset-375".to_string()], - "phony".to_string(), - vec![root - .join(ASSET_DIR) - .join(ASSETS_DIST_SUBDIR) - .join("spritesheet-375") - .to_str() - .unwrap() - .to_string()], - vec![], - vec![], - HashMap::new(), - vec![], - None, - None, - )?; - - writer.build( - vec!["asset".to_string()], - "phony".to_string(), - vec![ - root.join(ASSET_DIR) - .join(ASSETS_DIST_SUBDIR) - .join("spritesheet-375") - .to_str() - .unwrap() - .to_string(), - root.join(ASSET_DIR) - .join(ASSETS_DIST_SUBDIR) - .join("spritesheet-full") - .to_str() - .unwrap() - .to_string(), - root.join(ASSET_DIR) - .join(ASSETS_DIST_SUBDIR) - .join("spritesheet-125") - .to_str() - .unwrap() - .to_string(), - ], - vec![], - vec![], - HashMap::new(), - vec![], - None, - None, - )?; - - Ok(()) -} - -fn gen_convert_rule( - asset: &Path, - root: &Path, - writer: &mut NinjaWriter, - files_375: &mut Vec, - files_full: &mut Vec, - files_125: &mut Vec, - size: i32, -) -> Result<(), Box> { - let out_full = root - .join(ASSET_DIR) - .join(ASSETS_FINAL_SUBDIR) - .join("full/") - .join(asset.file_stem().unwrap().to_str().unwrap().to_string() + ".png"); - files_full.push(out_full.clone()); - let rule_full = format!("inkscape_{}_px_full", size); - writer.build( - vec![out_full.to_str().unwrap().to_string()], - rule_full, - vec![asset.to_str().unwrap().to_string()], - vec![], - vec![], - HashMap::new(), - vec![], - None, - None, - )?; - - let out_375 = root - .join(ASSET_DIR) - .join(ASSETS_FINAL_SUBDIR) - .join("375/") - .join(asset.file_stem().unwrap().to_str().unwrap().to_string() + ".png"); - files_375.push(out_375.clone()); - let rule_375 = format!("inkscape_{}_px_375", size); - writer.build( - vec![out_375.to_str().unwrap().to_string()], - rule_375, - vec![asset.to_str().unwrap().to_string()], - vec![], - vec![], - HashMap::new(), - vec![], - None, - None, - )?; - - let out_125 = root - .join(ASSET_DIR) - .join(ASSETS_FINAL_SUBDIR) - .join("125/") - .join(asset.file_stem().unwrap().to_str().unwrap().to_string() + ".png"); - files_125.push(out_125.clone()); - let rule_125 = format!("inkscape_{}_px_125", size); - writer.build( - vec![out_125.to_str().unwrap().to_string()], - rule_125, - vec![asset.to_str().unwrap().to_string()], - vec![], - vec![], - HashMap::new(), - vec![], - None, - None, - )?; - - Ok(()) -} - -fn asset_size(asset: &str, overrides: &HashMap<&str, i32>, default: i32) -> i32 { - for (ov, size) in overrides { - if asset.ends_with(ov) { - return *size; - } - } - default -} - -fn gen_inkscape_rule( - size: i32, - writer: &mut NinjaWriter, - written: &mut Vec, -) -> Result<(), Box> { - if written.contains(&size) { - return Ok(()); - } - - writer.rule( - &format!("inkscape_{}_px_full", size), - &format!("inkscape -w {} -h {} $in -o $out", size, size), - None, - None, - None, - None, - None, - None, - None, - None, - )?; - writer.rule( - &format!("inkscape_{}_px_375", size), - &format!( - "inkscape -w {} -h {} $in -o $out", - (size as f64 * 0.375) as i32, - (size as f64 * 0.375) as i32 - ), - None, - None, - None, - None, - None, - None, - None, - None, - )?; - writer.rule( - &format!("inkscape_{}_px_125", size), - &format!( - "inkscape -w {} -h {} $in -o $out", - (size as f64 * 0.125) as i32, - (size as f64 * 0.125) as i32 - ), - None, - None, - None, - None, - None, - None, - None, - None, - )?; - - written.push(size); - - Ok(()) -} diff --git a/spacetime_rs/src/configure/client.rs b/spacetime_rs/src/configure/client.rs deleted file mode 100644 index 0d2a58d89d6e5e1633d6422cc9d926eea57b7f41..0000000000000000000000000000000000000000 --- a/spacetime_rs/src/configure/client.rs +++ /dev/null @@ -1,11 +0,0 @@ -use crate::configure::asset::configure_assets; -use crate::ninja::NinjaWriter; -use std::error::Error; -use std::fs::File; -use std::path::Path; - -pub fn configure_client(writer: &mut NinjaWriter, root: &Path) -> Result<(), Box> { - configure_assets(writer, root)?; - - Ok(()) -} diff --git a/spacetime_rs/src/configure/mod.rs b/spacetime_rs/src/configure/mod.rs deleted file mode 100644 index 4ff80240ca215ac5dafc2211b889f91629902668..0000000000000000000000000000000000000000 --- a/spacetime_rs/src/configure/mod.rs +++ /dev/null @@ -1,15 +0,0 @@ -use crate::ninja::NinjaWriter; -use std::fs::File; -use std::io; -use std::path::Path; - -pub mod asset; -pub mod client; -pub mod rust; - -pub fn create_writer(root: &Path) -> Result, io::Error> { - let mut w = NinjaWriter::new(File::create(root.join("build.ninja"))?); - w.comment("Generated by spacetime")?; - w.comment("Do not edit manually")?; - Ok(w) -} diff --git a/spacetime_rs/src/configure/rust.rs b/spacetime_rs/src/configure/rust.rs deleted file mode 100644 index b96df3d2e6a56c82bdab54c597f02783ce90f4c0..0000000000000000000000000000000000000000 --- a/spacetime_rs/src/configure/rust.rs +++ /dev/null @@ -1,103 +0,0 @@ -/* -def gen_rules_for_api(root, env, writer, modules): - if env == 'dev': - out_dir = 'debug' - writer.rule('cargo-api', f'cargo build --bin starkingdoms-api --features "{modules}"', - depfile=f'{root}/target/debug/starkingdoms-api.d', pool='console') - elif env == 'prod': - out_dir = 'release' - writer.rule('cargo-api', f'cargo build --bin starkingdoms-api --release --features "{modules}"', - depfile=f'{root}/target/release/starkingdoms-api.d', pool='console') - - writer.build([f'{root}/target/{out_dir}/starkingdoms-api'], 'cargo-api', ['server/Cargo.toml']) - writer.build(['api'], 'phony', [f'{root}/target/{out_dir}/starkingdoms-api']) - */ - -use crate::ninja::NinjaWriter; -use std::collections::HashMap; -use std::error::Error; -use std::fs::File; -use std::path::Path; - -pub fn configure_rust_target( - rust_target: &str, - rust_env: &str, - writer: &mut NinjaWriter, - root: &Path, -) -> Result<(), Box> { - let out_dir; - if rust_env == "dev" { - out_dir = "debug"; - writer.rule( - &format!("cargo-{}", rust_target), - &format!("cargo build --bin starkingdoms-{}", rust_target), - None, - Some( - root.join("target/debug/") - .join(format!("starkingdoms-{}.d", rust_target)) - .to_str() - .unwrap(), - ), - None, - Some("console"), - None, - None, - None, - None, - )?; - } else { - out_dir = "release"; - writer.rule( - &format!("cargo-{}", rust_target), - &format!("cargo build --bin starkingdoms-{} --release", rust_target), - None, - Some( - root.join("target/release/") - .join(format!("starkingdoms-{}.d", rust_target)) - .to_str() - .unwrap(), - ), - None, - Some("console"), - None, - None, - None, - None, - )?; - } - - writer.build( - vec![root - .join(format!("target/{}/", out_dir)) - .join(format!("starkingdoms-{}", rust_target)) - .to_str() - .unwrap() - .to_string()], - format!("cargo-{}", rust_target), - vec![root.join("server/Cargo.toml").to_str().unwrap().to_string()], - vec![], - vec![], - HashMap::new(), - vec![], - None, - None, - )?; - writer.build( - vec![rust_target.to_string()], - "phony".to_string(), - vec![root - .join(format!("target/{}/", out_dir)) - .join(format!("starkingdoms-{}", rust_target)) - .to_str() - .unwrap() - .to_string()], - vec![], - vec![], - HashMap::new(), - vec![], - None, - None, - )?; - - Ok(()) -} diff --git a/spacetime_rs/src/main.rs b/spacetime_rs/src/main.rs deleted file mode 100644 index dc92b53ba0ebcfec04fe0f5387f93e9f537cd692..0000000000000000000000000000000000000000 --- a/spacetime_rs/src/main.rs +++ /dev/null @@ -1,263 +0,0 @@ -use crate::cmd::enforce_commands; -use crate::commands::api::{build_api, build_api_prod, run_api, run_api_prod}; -use crate::commands::assets::build_assets; -use crate::commands::clean::clean; -use crate::commands::client::{build_client_prod, client_protobuf, run_http}; -use crate::commands::docker::{ - build_docker, build_docker_api, build_docker_api_beta, build_docker_api_stable, - build_docker_beta, build_docker_server, build_docker_server_beta, build_docker_server_stable, - build_docker_stable, build_docker_web, build_docker_web_beta, build_docker_web_stable, -}; -use crate::commands::server::{build_server, build_server_prod, run_server, run_server_prod}; -use std::collections::HashMap; -use std::error::Error; -use std::io::Write; -use std::path::PathBuf; -use std::time::SystemTime; -use tabwriter::TabWriter; - -pub mod cmd; -pub mod commands; -pub mod config; -pub mod configure; -pub mod ninja; - -fn main() { - let mut bcm = BuildCommandManager::new(); - - bcm.register( - "run_http", - Box::new(run_http), - "Compile the client and then run a development HTTP server", - false, - ); - bcm.register( - "build_assets", - Box::new(build_assets), - "Compile the asset source files into spritesheets", - false, - ); - bcm.register( - "client_protobuf", - Box::new(client_protobuf), - "Update the client protocol bindings", - false, - ); - bcm.register( - "clean", - Box::new(clean), - "Remove all compilation artifacts", - false, - ); - - bcm.register( - "build_api", - Box::new(build_api), - "Compile the API server", - false, - ); - bcm.register("run_api", Box::new(run_api), "Run the API server", false); - bcm.register( - "build_api_prod", - Box::new(build_api_prod), - "Compile the API server with optimizations", - false, - ); - bcm.register( - "run_api_prod", - Box::new(run_api_prod), - "Run the API server with optimizations", - false, - ); - - bcm.register( - "build_server", - Box::new(build_server), - "Compile the game server", - false, - ); - bcm.register( - "run_server", - Box::new(run_server), - "Run the game server", - false, - ); - bcm.register( - "build_server_prod", - Box::new(build_server_prod), - "Compile the game server with optimizations", - false, - ); - bcm.register( - "run_server_prod", - Box::new(run_server_prod), - "Run the game server with optimizations", - false, - ); - - bcm.register( - "build_docker_beta", - Box::new(build_docker_beta), - "Build all three docker images for the beta channel", - false, - ); - bcm.register( - "build_docker_api_beta", - Box::new(build_docker_api_beta), - "Build the API docker image for the beta channel", - false, - ); - bcm.register( - "build_docker_server_beta", - Box::new(build_docker_server_beta), - "Build the main docker image for the beta channel", - false, - ); - bcm.register( - "build_docker_web_beta", - Box::new(build_docker_web_beta), - "Build the webserver docker image for the beta channel", - false, - ); - - bcm.register( - "build_docker_stable", - Box::new(build_docker_stable), - "Build all three docker images for the stable channel", - false, - ); - bcm.register( - "build_docker_api_stable", - Box::new(build_docker_api_stable), - "Build the API docker image for the stable channel", - false, - ); - bcm.register( - "build_docker_server_stable", - Box::new(build_docker_server_stable), - "Build the main docker image for the stable channel", - false, - ); - bcm.register( - "build_docker_web_stable", - Box::new(build_docker_web_stable), - "Build the webserver docker image for the stable channel", - false, - ); - - bcm.register( - "build_docker", - Box::new(build_docker), - "Build all three docker images for the bleeding channel", - false, - ); - bcm.register( - "build_docker_api", - Box::new(build_docker_api), - "Build the API docker image for the bleeding channel", - false, - ); - bcm.register( - "build_docker_server", - Box::new(build_docker_server), - "Build the main docker image for the bleeding channel", - false, - ); - bcm.register( - "build_docker_web", - Box::new(build_docker_web), - "Build the webserver docker image for the bleeding channel", - false, - ); - - bcm.register( - "build_client_prod", - Box::new(build_client_prod), - "Build the production-ready client bundle", - false, - ); - - let start = SystemTime::now(); - - let args: Vec = std::env::args().collect(); - match bcm.exec(args) { - Ok(_) => (), - Err(e) => { - let end = SystemTime::now(); - let duration = end.duration_since(start).unwrap(); - - println!("[spacetime] Done in {} seconds", duration.as_secs_f32()); - - eprintln!("[!] Error executing build command: {}", e); - std::process::exit(-1); - } - } - - let end = SystemTime::now(); - let duration = end.duration_since(start).unwrap(); - - println!("[spacetime] Done in {} seconds", duration.as_secs_f32()); -} - -type BuildCommandCallback = Box, PathBuf) -> Result<(), Box>>; -#[derive(Default)] -pub struct BuildCommandManager { - commands: HashMap, -} -impl BuildCommandManager { - pub fn new() -> Self { - Self { - commands: HashMap::new(), - } - } - - pub fn register( - &mut self, - name: &str, - command: BuildCommandCallback, - description: &str, - hidden: bool, - ) { - self.commands - .insert(name.to_string(), (command, description.to_string(), hidden)); - } - - pub fn help(&self) { - println!("Spacetime - StarKingdoms build utility"); - println!("Spacetime is a small Rust utility to assist in compiling StarKingdoms."); - println!("Available targets:"); - - let mut tw = TabWriter::new(vec![]); - - for (target, (_, description, hidden)) in &self.commands { - if *hidden { - continue; - }; - - writeln!(tw, "\t{}\t{}", target, description).unwrap(); - } - - std::io::stdout() - .write_all(&tw.into_inner().unwrap()) - .unwrap(); - } - - pub fn exec(&self, args: Vec) -> Result<(), Box> { - if args.len() < 3 || args[1] == "help" || args[1] == "h" { - self.help(); - return Ok(()); - } - - enforce_commands(); - - let main_path = PathBuf::from(args[2].to_string()); - - if let Some((callback, _, _)) = self.commands.get(&args[1]) { - callback(args[2..].to_owned(), main_path) - } else { - eprintln!("Unrecognized build command {}", args[1]); - self.help(); - Ok(()) - } - } -} diff --git a/spacetime_rs/src/ninja.rs b/spacetime_rs/src/ninja.rs deleted file mode 100644 index ad97e7d4e688ce37b139ee4b25813047f30ef706..0000000000000000000000000000000000000000 --- a/spacetime_rs/src/ninja.rs +++ /dev/null @@ -1,194 +0,0 @@ -use std::collections::HashMap; -use std::error::Error; -use std::io; -use std::io::Write; -use std::path::PathBuf; -use std::process::{Command, Stdio}; - -fn escape_path(word: &str) -> String { - word.replace("$ ", "$$ ") - .replace(' ', "$ ") - .replace(':', "$:") -} - -pub struct NinjaWriter { - output: T, -} -impl NinjaWriter { - pub fn new(output: T) -> Self { - Self { output } - } - - pub fn newline(&mut self) -> Result<(), io::Error> { - writeln!(self.output) - } - - pub fn comment(&mut self, text: &str) -> Result<(), io::Error> { - writeln!(self.output, "# {}", text) - } - - pub fn variable(&mut self, key: &str, value: &str, indent: usize) -> Result<(), io::Error> { - if value.is_empty() { - return Ok(()); - } - writeln!(self.output, "{}{} = {}", self._indent(indent), key, value) - } - - pub fn pool(&mut self, name: &str, depth: usize) -> Result<(), io::Error> { - writeln!(self.output, "pool {}", name)?; - self.variable("depth", &depth.to_string(), 1) - } - - #[allow(clippy::too_many_arguments)] - pub fn rule( - &mut self, - name: &str, - command: &str, - description: Option<&str>, - depfile: Option<&str>, - generator: Option, - pool: Option<&str>, - restat: Option, - rspfile: Option<&str>, - rspfile_content: Option<&str>, - deps: Option<&str>, - ) -> Result<(), io::Error> { - writeln!(self.output, "rule {}", name)?; - self.variable("command", command, 1)?; - if let Some(desc) = description { - self.variable("description", desc, 1)?; - } - if let Some(depfile) = depfile { - self.variable("depfile", depfile, 1)?; - } - if let Some(gen) = generator { - if gen { - self.variable("generator", "1", 1)?; - } - } - if let Some(pool) = pool { - self.variable("pool", pool, 1)?; - } - if let Some(restat) = restat { - if restat { - self.variable("restat", "1", 1)?; - } - } - if let Some(rspfile) = rspfile { - self.variable("rspfile", rspfile, 1)?; - } - if let Some(rspfile_content) = rspfile_content { - self.variable("rspfile_content", rspfile_content, 1)?; - } - if let Some(deps) = deps { - self.variable("deps", deps, 1)?; - } - - Ok(()) - } - - #[allow(clippy::too_many_arguments)] - pub fn build( - &mut self, - outputs: Vec, - rule: String, - inputs: Vec, - mut implicit: Vec, - mut order_only: Vec, - variables: HashMap, - mut implicit_outputs: Vec, - pool: Option, - dyndep: Option, - ) -> Result<(), io::Error> { - let mut out_outputs: Vec = outputs.iter().map(|u| escape_path(u)).collect(); - let mut all_inputs: Vec = inputs.iter().map(|u| escape_path(u)).collect(); - - if !implicit.is_empty() { - all_inputs.push("|".to_string()); - all_inputs.append(&mut implicit.iter_mut().map(|u| escape_path(u)).collect()); - } - if !order_only.is_empty() { - all_inputs.push("||".to_string()); - all_inputs.append(&mut order_only.iter_mut().map(|u| escape_path(u)).collect()); - } - if !implicit_outputs.is_empty() { - out_outputs.push("|".to_string()); - out_outputs.append( - &mut implicit_outputs - .iter_mut() - .map(|u| escape_path(u)) - .collect(), - ); - } - - all_inputs.insert(0, rule); - - writeln!( - self.output, - "build {}: {}", - out_outputs.join(" "), - all_inputs.join(" ") - )?; - - if let Some(pool) = pool { - self.variable("pool", &pool, 1)?; - } - if let Some(dyndep) = dyndep { - self.variable("dyndep", &dyndep, 1)?; - } - - for (key, value) in variables { - self.variable(&key, &value, 1)?; - } - - Ok(()) - } - - pub fn include(&mut self, path: &str) -> Result<(), io::Error> { - writeln!(self.output, "include {}", path) - } - - pub fn subninja(&mut self, path: &str) -> Result<(), io::Error> { - writeln!(self.output, "subninja {}", path) - } - - pub fn default(&mut self, paths: Vec) -> Result<(), io::Error> { - writeln!(self.output, "default {}", paths.join(" ")) - } - - fn _indent(&self, num: usize) -> String { - " ".repeat(num) - } -} - -pub fn exec_ninja(root: &PathBuf, args: Vec) -> Result<(), Box> { - println!("[exec] cmd: ninja {:?}", args); - let stat = Command::new("ninja") - .args(args) - .current_dir(root) - .stdout(Stdio::inherit()) - .stderr(Stdio::inherit()) - .spawn()? - .wait()?; - if stat.success() { - Ok(()) - } else { - Err(format!("ninja exited with error: {}", stat.code().unwrap()).into()) - } -} - -pub fn exec(cmd: &str, dir: &PathBuf, args: Vec) -> Result<(), Box> { - println!("[exec] cmd: {} {:?}", cmd, args); - let stat = Command::new(cmd) - .args(args) - .current_dir(dir) - .stdout(Stdio::inherit()) - .stderr(Stdio::inherit()) - .spawn()? - .wait()?; - if stat.success() { - Ok(()) - } else { - Err(format!("{} exited with error: {}", cmd, stat.code().unwrap()).into()) - } -} diff --git a/stable.Jenkinsfile b/stable.Jenkinsfile deleted file mode 100644 index e2d2a17dfe90171bc8c2d0f35791fcc7247793e3..0000000000000000000000000000000000000000 --- a/stable.Jenkinsfile +++ /dev/null @@ -1,27 +0,0 @@ -pipeline { - agent any - - environment { - DOCKER_LOGIN_CREDS = credentials('gitlab-docker-key') - PATH = "/var/lib/jenkins/.cargo/bin:$PATH" - } - - stages { - stage('Build') { - steps { - sh 'cargo build --locked' - } - } - stage('Clippy') { - steps { - sh 'cargo clippy --locked' - } - } - stage('Docker') { - steps { - sh 'docker login registry.gitlab.com -u ${DOCKER_LOGIN_CREDS_USR} -p ${DOCKER_LOGIN_CREDS_PSW}' - sh 'STK_CHANNEL=stable STK_BUILD_NUM=${BUILD_NUMBER} ./spacetime build_docker_stable' - } - } - } -} \ No newline at end of file diff --git a/web.Dockerfile b/web.Dockerfile deleted file mode 100644 index 221b2f18c688178eeca80bff6d332686d25747f3..0000000000000000000000000000000000000000 --- a/web.Dockerfile +++ /dev/null @@ -1,14 +0,0 @@ -FROM node - -RUN npm i -g parcel - -COPY client /client - -RUN cd /client && yarn -RUN cd /client && yarn build - -FROM nginx - -COPY --from=0 /client/dist /usr/share/nginx/html -COPY assets/ /usr/share/nginx/html/assets -COPY docker/mime-types.conf /etc/nginx/conf.d/mime-types.conf \ No newline at end of file diff --git a/web/assets b/web/assets deleted file mode 120000 index ec2e4be2f839d0372d9c88d9a8b826596a361e64..0000000000000000000000000000000000000000 --- a/web/assets +++ /dev/null @@ -1 +0,0 @@ -../assets \ No newline at end of file diff --git a/web/index.html b/web/index.html deleted file mode 100644 index 02bb7c89e16c3033265ea48634a5a4a6bed448fa..0000000000000000000000000000000000000000 --- a/web/index.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - wasm testing - - - - -

StarKingdoms

-
- Join Game -
- - -
- - -
- -
- -
- -
-
- - - - \ No newline at end of file diff --git a/web/play.html b/web/play.html deleted file mode 100644 index 88745505ab806f5a9021a23ef1f42be4f1de14b4..0000000000000000000000000000000000000000 --- a/web/play.html +++ /dev/null @@ -1,139 +0,0 @@ - - - - StarKingdoms.TK - - - - - -
-
- -
- - -

Loading WASM module...

- - -
- - - - - - diff --git a/web/static/css/index.css b/web/static/css/index.css deleted file mode 100644 index 5631279878ec32ee364a53f7a7349a74507fe38e..0000000000000000000000000000000000000000 --- a/web/static/css/index.css +++ /dev/null @@ -1,13 +0,0 @@ -.joingamebox { - width: min-content; - padding: 10px; -} - -.m-5px { - margin: 5px; -} - -.w-full { - width: 100%; -} - diff --git a/web/static/css/play.css b/web/static/css/play.css deleted file mode 100644 index aa4ffbfda6e9ff66e09446fd792a7714d6ecaf4f..0000000000000000000000000000000000000000 --- a/web/static/css/play.css +++ /dev/null @@ -1,5 +0,0 @@ -#canvas { - position: absolute; - top: 0; - left: 0; -} \ No newline at end of file diff --git a/web/static/img/spritesheet-512.png b/web/static/img/spritesheet-512.png deleted file mode 100644 index 44f34baf4667f8ca7a9e373b71f8e61fc5f57b34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 540862 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�)R=*z*?%TBins(2ztcFVMjS@6 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 oYtP@Nt$=?<_-ph0 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 QtEJ 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 TX=HGJ>FbBB?X2=Fy>9#ub(Rw{