Further refactoring

This commit is contained in:
2022-11-08 22:36:19 +01:00
parent 757180b13c
commit e70ec51673
4 changed files with 204 additions and 552 deletions

255
Cargo.lock generated
View File

@@ -4,9 +4,9 @@ version = 3
[[package]] [[package]]
name = "ab_glyph" name = "ab_glyph"
version = "0.2.17" version = "0.2.18"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "04a9283dace1c41c265496614998d5b9c4a97b3eb770e804f007c5144bf03f2b" checksum = "4dcdbc68024b653943864d436fe8a24b028095bc1cf91a8926f8241e4aaffe59"
dependencies = [ dependencies = [
"ab_glyph_rasterizer", "ab_glyph_rasterizer",
"owned_ttf_parser", "owned_ttf_parser",
@@ -99,20 +99,11 @@ dependencies = [
"libc", "libc",
] ]
[[package]]
name = "ansi_term"
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2"
dependencies = [
"winapi",
]
[[package]] [[package]]
name = "anyhow" name = "anyhow"
version = "1.0.65" version = "1.0.66"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "98161a4e3e2184da77bb14f02184cdd111e83bbbcc9979dfee3c44b9a85f5602" checksum = "216261ddc8289130e551ddcd5ce8a064710c0d064a4d2895c67151c92b5443f6"
[[package]] [[package]]
name = "approx" name = "approx"
@@ -202,9 +193,9 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
[[package]] [[package]]
name = "base64" name = "base64"
version = "0.13.0" version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"
[[package]] [[package]]
name = "bevy" name = "bevy"
@@ -1030,24 +1021,24 @@ dependencies = [
[[package]] [[package]]
name = "bumpalo" name = "bumpalo"
version = "3.11.0" version = "3.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c1ad822118d20d2c234f427000d5acc36eabe1e29a348c89b63dd60b13f28e5d" checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba"
[[package]] [[package]]
name = "bytemuck" name = "bytemuck"
version = "1.12.1" version = "1.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2f5715e491b5a1598fc2bef5a606847b5dc1d48ea625bd3c02c00de8285591da" checksum = "aaa3a8d9a1ca92e282c96a32d6511b695d7d994d1d102ba85d279f9b2756947f"
dependencies = [ dependencies = [
"bytemuck_derive", "bytemuck_derive",
] ]
[[package]] [[package]]
name = "bytemuck_derive" name = "bytemuck_derive"
version = "1.2.1" version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b9e1f5fa78f69496407a27ae9ed989e3c3b072310286f5ef385525e4cbc24a9" checksum = "5fe233b960f12f8007e3db2d136e3cb1c291bfd7396e384ee76025fc1a3932b4"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@@ -1074,9 +1065,9 @@ checksum = "c1db59621ec70f09c5e9b597b220c7a2b43611f4710dc03ceb8748637775692c"
[[package]] [[package]]
name = "cc" name = "cc"
version = "1.0.73" version = "1.0.75"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" checksum = "41ca34107f97baef6cfb231b32f36115781856b8f8208e8c580e0bcaea374842"
dependencies = [ dependencies = [
"jobserver", "jobserver",
] ]
@@ -1138,9 +1129,9 @@ dependencies = [
[[package]] [[package]]
name = "cocoa" name = "cocoa"
version = "0.24.0" version = "0.24.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6f63902e9223530efb4e26ccd0cf55ec30d592d3b42e21a28defc42a9586e832" checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a"
dependencies = [ dependencies = [
"bitflags", "bitflags",
"block", "block",
@@ -1214,9 +1205,9 @@ dependencies = [
[[package]] [[package]]
name = "const_panic" name = "const_panic"
version = "0.2.4" version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c0358e41e90e443c69b2b2811f6ec9892c228b93620634cf4344fe89967fa9f" checksum = "9ed2b28323eee4fb66bb824401daa3e46bd445b9a9298a3d382b320710ba69dd"
[[package]] [[package]]
name = "copyless" name = "copyless"
@@ -1372,12 +1363,11 @@ dependencies = [
[[package]] [[package]]
name = "crossbeam-utils" name = "crossbeam-utils"
version = "0.8.11" version = "0.8.12"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "51887d4adc7b564537b15adcfb307936f8075dfcd5f00dde9a9f1d29383682bc" checksum = "edbafec5fa1f196ca66527c1b12c2ec4745ca14b50f1ad8f9f6f720b55d11fac"
dependencies = [ dependencies = [
"cfg-if 1.0.0", "cfg-if 1.0.0",
"once_cell",
] ]
[[package]] [[package]]
@@ -1582,9 +1572,9 @@ dependencies = [
[[package]] [[package]]
name = "filetime" name = "filetime"
version = "0.2.17" version = "0.2.18"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e94a7bbaa59354bc20dd75b67f23e2797b4490e9d6928203fb105c79e448c86c" checksum = "4b9663d381d07ae25dc88dbdf27df458faa83a9b25336bcac83d5e452b5fc9d3"
dependencies = [ dependencies = [
"cfg-if 1.0.0", "cfg-if 1.0.0",
"libc", "libc",
@@ -1649,15 +1639,15 @@ dependencies = [
[[package]] [[package]]
name = "futures-core" name = "futures-core"
version = "0.3.24" version = "0.3.25"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4e5aa3de05362c3fb88de6531e6296e85cde7739cccad4b9dfeeb7f6ebce56bf" checksum = "04909a7a7e4633ae6c4a9ab280aeb86da1236243a77b694a49eacd659a4bd3ac"
[[package]] [[package]]
name = "futures-io" name = "futures-io"
version = "0.3.24" version = "0.3.25"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bbf4d2a7a308fd4578637c0b17c7e1c7ba127b8f6ba00b29f717e9655d85eb68" checksum = "00f5fb52a06bdcadeb54e8d3671f8888a39697dcb0b81b23b55174030427f4eb"
[[package]] [[package]]
name = "futures-lite" name = "futures-lite"
@@ -1695,9 +1685,9 @@ dependencies = [
[[package]] [[package]]
name = "getrandom" name = "getrandom"
version = "0.2.7" version = "0.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31"
dependencies = [ dependencies = [
"cfg-if 1.0.0", "cfg-if 1.0.0",
"js-sys", "js-sys",
@@ -1967,7 +1957,7 @@ dependencies = [
"color_quant", "color_quant",
"num-rational 0.4.1", "num-rational 0.4.1",
"num-traits", "num-traits",
"png 0.17.6", "png 0.17.7",
"scoped_threadpool", "scoped_threadpool",
] ]
@@ -2052,9 +2042,9 @@ dependencies = [
[[package]] [[package]]
name = "itoa" name = "itoa"
version = "1.0.3" version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6c8af84674fe1f223a982c933a0ee1086ac4d4052aa0fb8060c12c6ad838e754" checksum = "4217ad341ebadf8d8e724e264f13e593e0648f5b3e94b3896a5df283be015ecc"
[[package]] [[package]]
name = "iyes_loopless" name = "iyes_loopless"
@@ -2125,9 +2115,9 @@ dependencies = [
[[package]] [[package]]
name = "kqueue" name = "kqueue"
version = "1.0.6" version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4d6112e8f37b59803ac47a42d14f1f3a59bbf72fc6857ffc5be455e28a691f8e" checksum = "2c8fc60ba15bf51257aa9807a48a61013db043fcf3a78cb0d916e8e396dcad98"
dependencies = [ dependencies = [
"kqueue-sys", "kqueue-sys",
"libc", "libc",
@@ -2168,15 +2158,15 @@ dependencies = [
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.133" version = "0.2.137"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c0f80d65747a3e43d1596c7c5492d95d5edddaabd45a7fcdb02b95f644164966" checksum = "fc7fcc620a3bff7cdd7a365be3376c97191aeaccc2a603e600951e452615bf89"
[[package]] [[package]]
name = "libloading" name = "libloading"
version = "0.7.3" version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "efbc0f03f9a775e9f6aed295c6a1ba2253c5757a9e03d55c6caa46a681abcddd" checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f"
dependencies = [ dependencies = [
"cfg-if 1.0.0", "cfg-if 1.0.0",
"winapi", "winapi",
@@ -2302,10 +2292,19 @@ dependencies = [
] ]
[[package]] [[package]]
name = "mio" name = "miniz_oxide"
version = "0.8.4" version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "57ee1c23c7c63b0c9250c339ffdc69255f110b298b901b9f6c82547b7b87caaf" checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa"
dependencies = [
"adler",
]
[[package]]
name = "mio"
version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e5d732bc30207a6423068df043e3d02e0735b155ad7ce1a6f76fe2baa5b158de"
dependencies = [ dependencies = [
"libc", "libc",
"log", "log",
@@ -2497,6 +2496,16 @@ dependencies = [
"winapi", "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]] [[package]]
name = "num-derive" name = "num-derive"
version = "0.3.3" version = "0.3.3"
@@ -2562,9 +2571,9 @@ dependencies = [
[[package]] [[package]]
name = "num_cpus" name = "num_cpus"
version = "1.13.1" version = "1.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" checksum = "f6058e64324c71e02bc2b150e4f3bc8286db6c83092132ffa3f6b1eab0f9def5"
dependencies = [ dependencies = [
"hermit-abi", "hermit-abi",
"libc", "libc",
@@ -2664,9 +2673,9 @@ dependencies = [
[[package]] [[package]]
name = "once_cell" name = "once_cell"
version = "1.15.0" version = "1.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e82dad04139b71a90c080c8463fe0dc7902db5192d939bd0950f074d014339e1" checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860"
[[package]] [[package]]
name = "opener" name = "opener"
@@ -2679,10 +2688,16 @@ dependencies = [
] ]
[[package]] [[package]]
name = "owned_ttf_parser" name = "overload"
version = "0.15.2" version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "05e6affeb1632d6ff6a23d2cd40ffed138e82f1532571a26f527c8a284bb2fbb" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
[[package]]
name = "owned_ttf_parser"
version = "0.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4665508572151759e8d60404e20dc096ef93a99801a05ac2ac6e43bf5b4ca187"
dependencies = [ dependencies = [
"ttf-parser", "ttf-parser",
] ]
@@ -2711,7 +2726,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
dependencies = [ dependencies = [
"lock_api", "lock_api",
"parking_lot_core 0.9.3", "parking_lot_core 0.9.4",
] ]
[[package]] [[package]]
@@ -2730,9 +2745,9 @@ dependencies = [
[[package]] [[package]]
name = "parking_lot_core" name = "parking_lot_core"
version = "0.9.3" version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929" checksum = "4dc9e0dc2adc1c69d09143aff38d3d30c5c3f0df0dad82e6d25547af174ebec0"
dependencies = [ dependencies = [
"cfg-if 1.0.0", "cfg-if 1.0.0",
"libc", "libc",
@@ -2771,9 +2786,9 @@ checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116"
[[package]] [[package]]
name = "pkg-config" name = "pkg-config"
version = "0.3.25" version = "0.3.26"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160"
[[package]] [[package]]
name = "png" name = "png"
@@ -2789,14 +2804,14 @@ dependencies = [
[[package]] [[package]]
name = "png" name = "png"
version = "0.17.6" version = "0.17.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f0e7f4c94ec26ff209cee506314212639d6c91b80afb82984819fafce9df01c" checksum = "5d708eaf860a19b19ce538740d2b4bdeeb8337fa53f7738455e706623ad5c638"
dependencies = [ dependencies = [
"bitflags", "bitflags",
"crc32fast", "crc32fast",
"flate2", "flate2",
"miniz_oxide 0.5.4", "miniz_oxide 0.6.2",
] ]
[[package]] [[package]]
@@ -2810,9 +2825,9 @@ dependencies = [
[[package]] [[package]]
name = "ppv-lite86" name = "ppv-lite86"
version = "0.2.16" version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
[[package]] [[package]]
name = "pretty-type-name" name = "pretty-type-name"
@@ -2833,18 +2848,18 @@ dependencies = [
[[package]] [[package]]
name = "proc-macro2" name = "proc-macro2"
version = "1.0.44" version = "1.0.47"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7bd7356a8122b6c4a24a82b278680c73357984ca2fc79a0f9fa6dea7dced7c58" checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725"
dependencies = [ dependencies = [
"unicode-ident", "unicode-ident",
] ]
[[package]] [[package]]
name = "profiling" name = "profiling"
version = "1.0.6" version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2f61dcf0b917cd75d4521d7343d1ffff3d1583054133c9b5cbea3375c703c40d" checksum = "74605f360ce573babfe43964cbe520294dcb081afbf8c108fc6e23036b4da2df"
[[package]] [[package]]
name = "quote" name = "quote"
@@ -2923,9 +2938,9 @@ dependencies = [
[[package]] [[package]]
name = "regex" name = "regex"
version = "1.6.0" version = "1.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b" checksum = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a"
dependencies = [ dependencies = [
"aho-corasick", "aho-corasick",
"memchr", "memchr",
@@ -2943,9 +2958,9 @@ dependencies = [
[[package]] [[package]]
name = "regex-syntax" name = "regex-syntax"
version = "0.6.27" version = "0.6.28"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848"
[[package]] [[package]]
name = "renderdoc-sys" name = "renderdoc-sys"
@@ -3020,18 +3035,18 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
[[package]] [[package]]
name = "serde" name = "serde"
version = "1.0.145" version = "1.0.147"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "728eb6351430bccb993660dfffc5a72f91ccc1295abaa8ce19b27ebe4f75568b" checksum = "d193d69bae983fc11a79df82342761dfbf28a99fc8d203dca4c3c1b590948965"
dependencies = [ dependencies = [
"serde_derive", "serde_derive",
] ]
[[package]] [[package]]
name = "serde_derive" name = "serde_derive"
version = "1.0.145" version = "1.0.147"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "81fa1584d3d1bcacd84c277a0dfe21f5b0f6accf4a23d04d4c6d61f1af522b4c" checksum = "4f1d362ca8fc9c3e3a7484440752472d68a6caa98f1ab81d99b5dfe517cec852"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@@ -3040,9 +3055,9 @@ dependencies = [
[[package]] [[package]]
name = "serde_json" name = "serde_json"
version = "1.0.85" version = "1.0.87"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e55a28e3aaef9d5ce0506d0a14dbba8054ddc7e499ef522dd8b26859ec9d4a44" checksum = "6ce777b7b150d76b9cf60d28b55f5847135a003f7d7350c6be7a773508ce7d45"
dependencies = [ dependencies = [
"itoa", "itoa",
"ryu", "ryu",
@@ -3084,9 +3099,9 @@ dependencies = [
[[package]] [[package]]
name = "smallvec" name = "smallvec"
version = "1.9.0" version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2fd0db749597d91ff862fd1d55ea87f7855a744a8425a64695b6fca237d1dad1" checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0"
dependencies = [ dependencies = [
"serde", "serde",
] ]
@@ -3127,9 +3142,9 @@ checksum = "8fb1df15f412ee2e9dfc1c504260fa695c1c3f10fe9f4a6ee2d2184d7d6450e2"
[[package]] [[package]]
name = "syn" name = "syn"
version = "1.0.101" version = "1.0.103"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e90cde112c4b9690b8cbe810cba9ddd8bc1d7472e2cae317b69e9438c1cba7d2" checksum = "a864042229133ada95abf3b54fdc62ef5ccabe9515b64717bcb9a1919e59445d"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@@ -3224,9 +3239,9 @@ dependencies = [
[[package]] [[package]]
name = "tracing" name = "tracing"
version = "0.1.36" version = "0.1.37"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2fce9567bd60a67d08a16488756721ba392f24f29006402881e43b19aac64307" checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8"
dependencies = [ dependencies = [
"cfg-if 1.0.0", "cfg-if 1.0.0",
"pin-project-lite", "pin-project-lite",
@@ -3236,9 +3251,9 @@ dependencies = [
[[package]] [[package]]
name = "tracing-attributes" name = "tracing-attributes"
version = "0.1.22" version = "0.1.23"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "11c75893af559bc8e10716548bdef5cb2b983f8e637db9d0e15126b61b484ee2" checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@@ -3247,9 +3262,9 @@ dependencies = [
[[package]] [[package]]
name = "tracing-core" name = "tracing-core"
version = "0.1.29" version = "0.1.30"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5aeea4303076558a00714b823f9ad67d58a3bbda1df83d8827d21193156e22f7" checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a"
dependencies = [ dependencies = [
"once_cell", "once_cell",
"valuable", "valuable",
@@ -3268,12 +3283,12 @@ dependencies = [
[[package]] [[package]]
name = "tracing-subscriber" name = "tracing-subscriber"
version = "0.3.15" version = "0.3.16"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "60db860322da191b40952ad9affe65ea23e7dd6a5c442c2c42865810c6ab8e6b" checksum = "a6176eae26dd70d0c919749377897b54a9276bd7061339665dd68777926b5a70"
dependencies = [ dependencies = [
"ansi_term",
"matchers", "matchers",
"nu-ansi-term",
"once_cell", "once_cell",
"regex", "regex",
"sharded-slab", "sharded-slab",
@@ -3297,9 +3312,9 @@ dependencies = [
[[package]] [[package]]
name = "ttf-parser" name = "ttf-parser"
version = "0.15.2" version = "0.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b3e06c9b9d80ed6b745c7159c40b311ad2916abb34a49e9be2653b90db0d8dd" checksum = "375812fa44dab6df41c195cd2f7fecb488f6c09fbaafb62807488cefab642bff"
[[package]] [[package]]
name = "typenum" name = "typenum"
@@ -3315,9 +3330,9 @@ checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992"
[[package]] [[package]]
name = "unicode-ident" name = "unicode-ident"
version = "1.0.4" version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dcc811dc4066ac62f84f11307873c4850cb653bfa9b1719cee2bd2204a4bc5dd" checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3"
[[package]] [[package]]
name = "unicode-normalization" name = "unicode-normalization"
@@ -3353,9 +3368,9 @@ dependencies = [
[[package]] [[package]]
name = "uuid" name = "uuid"
version = "1.1.2" version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dd6469f4314d5f1ffec476e05f17cc9a78bc7a27a6a857842170bdf8d6f98d2f" checksum = "feb41e78f93363bb2df8b0e86a2ca30eed7806ea16ea0c790d757cf93f79be83"
dependencies = [ dependencies = [
"getrandom", "getrandom",
"serde", "serde",
@@ -3640,46 +3655,60 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]] [[package]]
name = "windows-sys" name = "windows-sys"
version = "0.36.1" version = "0.42.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
dependencies = [ dependencies = [
"windows_aarch64_gnullvm",
"windows_aarch64_msvc", "windows_aarch64_msvc",
"windows_i686_gnu", "windows_i686_gnu",
"windows_i686_msvc", "windows_i686_msvc",
"windows_x86_64_gnu", "windows_x86_64_gnu",
"windows_x86_64_gnullvm",
"windows_x86_64_msvc", "windows_x86_64_msvc",
] ]
[[package]] [[package]]
name = "windows_aarch64_msvc" name = "windows_aarch64_gnullvm"
version = "0.36.1" version = "0.42.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e"
[[package]]
name = "windows_aarch64_msvc"
version = "0.42.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4"
[[package]] [[package]]
name = "windows_i686_gnu" name = "windows_i686_gnu"
version = "0.36.1" version = "0.42.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7"
[[package]] [[package]]
name = "windows_i686_msvc" name = "windows_i686_msvc"
version = "0.36.1" version = "0.42.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246"
[[package]] [[package]]
name = "windows_x86_64_gnu" name = "windows_x86_64_gnu"
version = "0.36.1" version = "0.42.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed"
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.42.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028"
[[package]] [[package]]
name = "windows_x86_64_msvc" name = "windows_x86_64_msvc"
version = "0.36.1" version = "0.42.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5"
[[package]] [[package]]
name = "winit" name = "winit"

View File

@@ -7,13 +7,13 @@ edition = "2021"
[dependencies] [dependencies]
iyes_loopless = "0.8.0" iyes_loopless = "0.8.0"
itertools = "0.10.3" itertools = "0.10.5"
rand = "0.8.5" rand = "0.8.5"
bevy_editor_pls = "0.1.1" bevy_editor_pls = "0.1.1"
bevy_tweening = "0.5.0" bevy_tweening = "0.5.0"
[dependencies.bevy] [dependencies.bevy]
version = "0.8.0" version = "0.8.1"
features = ["dynamic"] features = ["dynamic"]
[profile.dev.package."*"] [profile.dev.package."*"]

View File

@@ -35,15 +35,8 @@ impl Plugin for SnakePlugin {
.run_if(tick_triggered) .run_if(tick_triggered)
.label(SystemLabel::SegmentMovement), .label(SystemLabel::SegmentMovement),
) )
.add_system_to_stage(
MovementStage,
head_movement_system
.run_in_state(AppState::InGame)
.run_if(tick_triggered)
.after(SystemLabel::SegmentMovement),
)
.add_system( .add_system(
update_direction_system apply_direction_system
.run_in_state(AppState::InGame) .run_in_state(AppState::InGame)
.run_if(tick_triggered), .run_if(tick_triggered),
) )
@@ -53,7 +46,7 @@ impl Plugin for SnakePlugin {
.run_if(tick_triggered), .run_if(tick_triggered),
) )
.add_system( .add_system(
about_to_collide collision_system
.run_in_state(AppState::InGame) .run_in_state(AppState::InGame)
.run_if(tick_triggered), .run_if(tick_triggered),
) )
@@ -69,24 +62,13 @@ impl Plugin for SnakePlugin {
pub const Z_HEIGHT: f32 = 10.; pub const Z_HEIGHT: f32 = 10.;
#[derive(Component)] #[derive(Component, Debug)]
struct SnakeSegment; struct SnakeSegment;
#[derive(Component)] #[derive(Component, Debug)]
pub struct SnakeHead; pub struct SnakeHead;
#[derive(Component, Copy, Clone)] #[derive(Component, Debug)]
enum Direction {
Up,
Down,
Left,
Right,
}
#[derive(Component)]
struct DirectionBuffer(Option<Direction>);
#[derive(Component)]
struct Snake { struct Snake {
about_to_collide: bool, about_to_collide: bool,
segments: Vec<Entity>, segments: Vec<Entity>,
@@ -101,6 +83,14 @@ impl Snake {
} }
} }
#[derive(Component, Copy, Clone, Debug)]
enum Direction {
Up,
Down,
Left,
Right,
}
impl Direction { impl Direction {
fn from_keypress(keypress: Res<Input<KeyCode>>) -> Option<Self> { fn from_keypress(keypress: Res<Input<KeyCode>>) -> Option<Self> {
if keypress.pressed(KeyCode::Up) { if keypress.pressed(KeyCode::Up) {
@@ -117,6 +107,9 @@ impl Direction {
} }
} }
#[derive(Component, Default, Debug)]
struct DirectionBuffer(Option<Direction>);
fn create_snake_segment(commands: &mut Commands, grid_position: grid::Coordinate) -> Entity { fn create_snake_segment(commands: &mut Commands, grid_position: grid::Coordinate) -> Entity {
commands commands
.spawn_bundle(SpriteBundle { .spawn_bundle(SpriteBundle {
@@ -139,13 +132,13 @@ fn setup_snake_system(mut commands: Commands) {
commands commands
.entity(snake_head) .entity(snake_head)
.insert(Name::new("SnakeHead")) .insert(Name::new("SnakeHead"))
.insert(SnakeHead) .insert(SnakeHead);
.insert(DirectionBuffer(None));
commands commands
.spawn() .spawn()
.insert(Snake::with_segments(&[snake_head])) .insert(Snake::with_segments(&[snake_head]))
.insert(Name::new("Snake")) .insert(Name::new("Snake"))
.insert(DirectionBuffer::default())
.insert_bundle(SpatialBundle::default()) .insert_bundle(SpatialBundle::default())
.add_child(snake_head); .add_child(snake_head);
} }
@@ -153,11 +146,11 @@ fn setup_snake_system(mut commands: Commands) {
fn add_direction_system( fn add_direction_system(
mut commands: Commands, mut commands: Commands,
keypress: Res<Input<KeyCode>>, keypress: Res<Input<KeyCode>>,
mut query: Query<Entity, With<SnakeHead>>, mut query: Query<Entity, With<Snake>>,
) { ) {
if let Some(direction) = Direction::from_keypress(keypress) { if let Some(direction) = Direction::from_keypress(keypress) {
let snake_head = query.single_mut(); let snake = query.single_mut();
commands.entity(snake_head).insert(direction); commands.entity(snake).insert(direction);
commands.insert_resource(NextState(AppState::InGame)); commands.insert_resource(NextState(AppState::InGame));
} }
@@ -184,9 +177,7 @@ fn add_tail_system(
} }
} }
fn update_direction_system( fn apply_direction_system(mut query: Query<(&mut Direction, &mut DirectionBuffer), With<Snake>>) {
mut query: Query<(&mut Direction, &mut DirectionBuffer), With<SnakeHead>>,
) {
for (mut direction, mut direction_buffer) in query.iter_mut() { for (mut direction, mut direction_buffer) in query.iter_mut() {
if let Some(new_direction) = direction_buffer.0 { if let Some(new_direction) = direction_buffer.0 {
*direction = new_direction; *direction = new_direction;
@@ -197,7 +188,7 @@ fn update_direction_system(
fn change_direction_system( fn change_direction_system(
keypress: Res<Input<KeyCode>>, keypress: Res<Input<KeyCode>>,
mut query: Query<(&Direction, &mut DirectionBuffer), With<SnakeHead>>, mut query: Query<(&Direction, &mut DirectionBuffer), With<Snake>>,
) { ) {
if let Some(new_direction) = Direction::from_keypress(keypress) { if let Some(new_direction) = Direction::from_keypress(keypress) {
let (direction, mut direction_buffer) = query.single_mut(); let (direction, mut direction_buffer) = query.single_mut();
@@ -205,7 +196,7 @@ fn change_direction_system(
if let (Direction::Up, Direction::Down) if let (Direction::Up, Direction::Down)
| (Direction::Down, Direction::Up) | (Direction::Down, Direction::Up)
| (Direction::Left, Direction::Right) | (Direction::Left, Direction::Right)
| (Direction::Right, Direction::Left) = (direction, &new_direction) | (Direction::Right, Direction::Left) = (direction, new_direction)
{ {
return; return;
} }
@@ -222,46 +213,49 @@ fn grid_transform_system(
} }
} }
fn head_movement_system(
mut head_query: Query<(&mut grid::Coordinate, &Direction, &Parent), With<SnakeHead>>,
snake_query: Query<&Snake>,
) {
for (mut grid_coordinate, &direction, parent) in head_query.iter_mut() {
let snake = snake_query.get(parent.get()).unwrap();
if snake.about_to_collide {
continue;
}
*grid_coordinate = next_grid_coordinate(*grid_coordinate, direction);
}
}
fn segments_movement_system( fn segments_movement_system(
mut segment_query: Query<&mut grid::Coordinate, With<SnakeSegment>>, mut segment_query: Query<&mut grid::Coordinate, With<SnakeSegment>>,
snake_query: Query<&Snake>, snake_query: Query<(&Snake, &Direction)>,
) { ) {
for snake in snake_query.iter() { for (
if snake.about_to_collide { Snake {
about_to_collide,
segments,
..
},
direction,
) in snake_query.iter()
{
if *about_to_collide {
continue; continue;
} }
for (&segment_entity, &previous_segment_entity) in
snake.segments.iter().rev().tuple_windows() // ... then the other elements
{ for (&segment, &previous_segment) in segments.iter().rev().tuple_windows() {
let previous_coordinate = *segment_query.get(previous_segment_entity).unwrap(); let previous_coordinate = *segment_query.get(previous_segment).unwrap();
let mut coordinate = segment_query.get_mut(segment_entity).unwrap(); let mut coordinate = segment_query.get_mut(segment).unwrap();
*coordinate = previous_coordinate; *coordinate = previous_coordinate;
} }
// First move head ...
let head = *segments.iter().next().expect("Snake has always a head");
let mut head_coordinate = segment_query.get_mut(head).unwrap();
*head_coordinate = next_grid_coordinate(&head_coordinate, direction);
} }
} }
fn about_to_collide( fn collision_system(
head_query: Query<(&grid::Coordinate, &Direction, &Parent), With<SnakeHead>>,
segment_query: Query<&grid::Coordinate, (With<SnakeSegment>, Without<SnakeHead>)>, segment_query: Query<&grid::Coordinate, (With<SnakeSegment>, Without<SnakeHead>)>,
mut snake_query: Query<&mut Snake>, head_query: Query<(&grid::Coordinate, &Parent), With<SnakeHead>>,
mut snake_query: Query<(&Direction, &mut Snake)>,
) { ) {
for (&head_coordinate, &head_direction, parent) in head_query.iter() { for (head_coordinate, parent) in head_query.iter() {
let next_head_coordinate = next_grid_coordinate(head_coordinate, head_direction); let (direction, mut snake) = snake_query
.get_mut(parent.get())
.expect("Head must be child of Snake");
let next_head_coordinate = next_grid_coordinate(head_coordinate, direction);
let hit_border = !next_head_coordinate.in_bounds(); let hit_border = !next_head_coordinate.in_bounds();
@@ -269,10 +263,6 @@ fn about_to_collide(
.iter() .iter()
.all(|&coordinate| coordinate != next_head_coordinate); .all(|&coordinate| coordinate != next_head_coordinate);
let mut snake = snake_query
.get_mut(parent.get())
.expect("Head must be child of Snake.");
snake.about_to_collide = hit_border || hit_snake; snake.about_to_collide = hit_border || hit_snake;
} }
} }
@@ -284,13 +274,13 @@ fn game_over_system(query: Query<&Snake>, mut commands: Commands) {
} }
fn next_grid_coordinate( fn next_grid_coordinate(
current_coordinate: grid::Coordinate, current_coordinate: &grid::Coordinate,
direction: Direction, direction: &Direction,
) -> grid::Coordinate { ) -> grid::Coordinate {
match direction { match direction {
Direction::Up => current_coordinate + grid::Coordinate(0, 1), Direction::Up => *current_coordinate + grid::Coordinate(0, 1),
Direction::Down => current_coordinate + grid::Coordinate(0, -1), Direction::Down => *current_coordinate + grid::Coordinate(0, -1),
Direction::Left => current_coordinate + grid::Coordinate(-1, 0), Direction::Left => *current_coordinate + grid::Coordinate(-1, 0),
Direction::Right => current_coordinate + grid::Coordinate(1, 0), Direction::Right => *current_coordinate + grid::Coordinate(1, 0),
} }
} }

View File

@@ -1,367 +0,0 @@
use crate::{fruit, grid, tick::tick_triggered, tick::TICK_PERIOD, AppState};
use bevy::prelude::*;
use bevy_tweening::{lens::TransformScaleLens, *};
use itertools::Itertools;
use iyes_loopless::prelude::*;
use std::time::Duration;
#[derive(Debug, Clone, PartialEq, Eq, Hash, StageLabel)]
struct MovementStage;
#[derive(Debug, Clone, PartialEq, Eq, Hash, SystemLabel)]
pub enum SystemLabel {
StartUp,
SegmentMovement,
}
pub struct SnakePlugin;
impl Plugin for SnakePlugin {
fn build(&self, app: &mut App) {
let movement_stage = SystemStage::parallel();
app.insert_resource(BulgePropagationTimer::default())
.add_startup_system(setup_snake_system.label(SystemLabel::StartUp))
.add_stage_after(CoreStage::Update, MovementStage, movement_stage)
.add_system_to_stage(
MovementStage,
segments_movement_system
.run_in_state(AppState::InGame)
.run_if(tick_triggered)
.label(SystemLabel::SegmentMovement),
)
.add_system_to_stage(
MovementStage,
head_movement_system
.run_in_state(AppState::InGame)
.run_if(tick_triggered)
.after(SystemLabel::SegmentMovement),
)
.add_system(
update_direction_system
.run_in_state(AppState::InGame)
.run_if(tick_triggered),
)
.add_system(
game_over_system
.run_in_state(AppState::InGame)
.run_if(tick_triggered),
)
.add_system(
about_to_collide
.run_in_state(AppState::InGame)
.run_if(tick_triggered),
)
.add_system(add_direction_system.run_in_state(AppState::Begin))
.add_system(change_direction_system.run_in_state(AppState::InGame))
.add_system(grid_transform_system.run_in_state(AppState::InGame))
.add_system(add_tail_system)
.add_system(add_bulge_system)
.add_system(propagate_bulge_system)
.add_system(animate_bulge_system);
}
}
pub const Z_HEIGHT: f32 = 10.;
#[derive(Component)]
pub struct SnakeSegment;
#[derive(Component)]
pub struct SnakeHead;
#[derive(Component, Copy, Clone)]
enum Direction {
Up,
Down,
Left,
Right,
}
#[derive(Component)]
struct DirectionBuffer(Option<Direction>);
#[derive(Component)]
struct Snake {
about_to_collide: bool,
segments: Vec<Entity>,
}
impl Snake {
fn with_segments(segments: &[Entity]) -> Self {
Self {
about_to_collide: false,
segments: segments.to_owned(),
}
}
}
#[derive(Component)]
#[component(storage = "SparseSet")]
struct BulgeMarker;
struct BulgePropagationTimer(Timer);
impl Default for BulgePropagationTimer {
fn default() -> Self {
Self(Timer::new(Duration::from_millis(TICK_PERIOD / 4), true))
}
}
impl Direction {
fn from_keypress(keypress: Res<Input<KeyCode>>) -> Option<Self> {
if keypress.pressed(KeyCode::Up) {
Some(Self::Up)
} else if keypress.pressed(KeyCode::Down) {
Some(Self::Down)
} else if keypress.pressed(KeyCode::Left) {
Some(Self::Left)
} else if keypress.pressed(KeyCode::Right) {
Some(Self::Right)
} else {
None
}
}
}
fn create_snake_segment(commands: &mut Commands, grid_position: grid::Coordinate) -> Entity {
commands
.spawn_bundle(SpriteBundle {
sprite: Sprite {
color: Color::RED,
custom_size: Some(Vec2::splat(grid::SEGMENT_SIZE) * 0.9),
..Default::default()
},
transform: Transform::from_translation(Vec2::from(grid_position).extend(Z_HEIGHT)),
..Default::default()
})
.insert(SnakeSegment)
.insert(grid_position)
.id()
}
fn setup_snake_system(mut commands: Commands) {
let snake_head = create_snake_segment(&mut commands, grid::Coordinate::splat(grid::SIZE / 2));
commands
.entity(snake_head)
.insert(Name::new("SnakeHead"))
.insert(SnakeHead)
.insert(DirectionBuffer(None));
commands
.spawn()
.insert(Snake::with_segments(&[snake_head]))
.insert(Name::new("Snake"))
.insert_bundle(SpatialBundle::default())
.add_child(snake_head);
}
fn add_direction_system(
mut commands: Commands,
keypress: Res<Input<KeyCode>>,
mut query: Query<Entity, With<SnakeHead>>,
) {
if let Some(direction) = Direction::from_keypress(keypress) {
let snake_head = query.single_mut();
commands.entity(snake_head).insert(direction);
commands.insert_resource(NextState(AppState::InGame));
}
}
fn add_tail_system(
mut commands: Commands,
mut eaten_event_reader: EventReader<fruit::EatenEvent>,
mut snake_query: Query<(Entity, &mut Snake)>,
) {
for _ in eaten_event_reader.iter() {
let segment =
create_snake_segment(&mut commands, grid::Coordinate::splat(grid::Index::MIN / 2));
let (snake_entity, mut snake) = snake_query.single_mut();
snake.segments.push(segment);
commands
.entity(segment)
.insert(Name::new(format!("Segment {}", snake.segments.len())));
commands.entity(snake_entity).add_child(segment);
}
}
fn add_bulge_system(
mut commands: Commands,
mut eaten_event_reader: EventReader<fruit::EatenEvent>,
query: Query<Entity, With<SnakeHead>>,
) {
for _ in eaten_event_reader.iter() {
let snake_head_entity = query.single();
commands.entity(snake_head_entity).insert(BulgeMarker);
}
}
fn propagate_bulge_system(
mut commands: Commands,
bulge_segment_query: Query<(Entity, &Parent), (With<SnakeSegment>, With<BulgeMarker>)>,
snake_query: Query<&Snake>,
time: Res<Time>,
mut timer: ResMut<BulgePropagationTimer>,
) {
timer.0.tick(time.delta());
if !timer.0.finished() {
return;
}
for (entity, parent) in bulge_segment_query.iter() {
commands.entity(entity).remove::<BulgeMarker>();
let mut segment_iter = snake_query.get(parent.get()).unwrap().segments.iter();
segment_iter.find(|&&segment_entity| segment_entity == entity);
if let Some(&segment_entity) = segment_iter.next() {
commands.entity(segment_entity).insert(BulgeMarker);
}
}
}
fn animate_bulge_system(mut commands: Commands, query: Query<Entity, Added<BulgeMarker>>) {
for entity in query.iter() {
let tween_to = Tween::new(
EaseFunction::QuadraticInOut,
TweeningType::Once,
Duration::from_millis(100),
TransformScaleLens {
start: Vec3::splat(1.0),
end: Vec3::splat(1.1),
},
);
let tween_back = Tween::new(
EaseFunction::QuadraticInOut,
TweeningType::Once,
Duration::from_millis(150),
TransformScaleLens {
start: Vec3::splat(1.1),
end: Vec3::splat(1.0),
},
);
let tween = tween_to.then(tween_back);
commands.entity(entity).insert(Animator::new(tween));
}
}
fn update_direction_system(
mut query: Query<(&mut Direction, &mut DirectionBuffer), With<SnakeHead>>,
) {
for (mut direction, mut direction_buffer) in query.iter_mut() {
if let Some(new_direction) = direction_buffer.0 {
*direction = new_direction;
direction_buffer.0 = None;
}
}
}
fn change_direction_system(
keypress: Res<Input<KeyCode>>,
mut query: Query<(&Direction, &mut DirectionBuffer), With<SnakeHead>>,
) {
if let Some(new_direction) = Direction::from_keypress(keypress) {
let (direction, mut direction_buffer) = query.single_mut();
if let (Direction::Up, Direction::Down)
| (Direction::Down, Direction::Up)
| (Direction::Left, Direction::Right)
| (Direction::Right, Direction::Left) = (direction, &new_direction)
{
return;
}
direction_buffer.0 = Some(new_direction);
}
}
fn grid_transform_system(
mut query: Query<(&mut Transform, &grid::Coordinate), With<SnakeSegment>>,
) {
for (mut transform, grid_coordinate) in query.iter_mut() {
*transform = Transform::from_translation(Vec2::from(grid_coordinate).extend(Z_HEIGHT));
}
}
fn head_movement_system(
mut head_query: Query<(&mut grid::Coordinate, &Direction, &Parent), With<SnakeHead>>,
snake_query: Query<&Snake>,
) {
for (mut grid_coordinate, &direction, parent) in head_query.iter_mut() {
let snake = snake_query.get(parent.get()).unwrap();
if snake.about_to_collide {
continue;
}
*grid_coordinate = next_grid_coordinate(*grid_coordinate, direction);
}
}
fn segments_movement_system(
mut segment_query: Query<&mut grid::Coordinate, With<SnakeSegment>>,
snake_query: Query<&Snake>,
) {
for snake in snake_query.iter() {
if snake.about_to_collide {
continue;
}
for (&segment_entity, &previous_segment_entity) in
snake.segments.iter().rev().tuple_windows()
{
let previous_coordinate = *segment_query.get(previous_segment_entity).unwrap();
let mut coordinate = segment_query.get_mut(segment_entity).unwrap();
*coordinate = previous_coordinate;
}
}
}
fn about_to_collide(
head_query: Query<(&grid::Coordinate, &Direction, &Parent), With<SnakeHead>>,
segment_query: Query<&grid::Coordinate, (With<SnakeSegment>, Without<SnakeHead>)>,
mut snake_query: Query<&mut Snake>,
) {
for (&head_coordinate, &head_direction, parent) in head_query.iter() {
let next_head_coordinate = next_grid_coordinate(head_coordinate, head_direction);
let hit_border = !next_head_coordinate.in_bounds();
let hit_snake = !segment_query
.iter()
.all(|&coordinate| coordinate != next_head_coordinate);
let mut snake = snake_query
.get_mut(parent.get())
.expect("Head must be child of Snake.");
snake.about_to_collide = hit_border || hit_snake;
}
}
fn game_over_system(query: Query<&Snake>, mut commands: Commands) {
if query.get_single().unwrap().about_to_collide {
commands.insert_resource(NextState(AppState::End));
}
}
fn next_grid_coordinate(
current_coordinate: grid::Coordinate,
direction: Direction,
) -> grid::Coordinate {
match direction {
Direction::Up => current_coordinate + grid::Coordinate(0, 1),
Direction::Down => current_coordinate + grid::Coordinate(0, -1),
Direction::Left => current_coordinate + grid::Coordinate(-1, 0),
Direction::Right => current_coordinate + grid::Coordinate(1, 0),
}
}