Further refactoring
This commit is contained in:
255
Cargo.lock
generated
255
Cargo.lock
generated
@@ -4,9 +4,9 @@ version = 3
|
||||
|
||||
[[package]]
|
||||
name = "ab_glyph"
|
||||
version = "0.2.17"
|
||||
version = "0.2.18"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "04a9283dace1c41c265496614998d5b9c4a97b3eb770e804f007c5144bf03f2b"
|
||||
checksum = "4dcdbc68024b653943864d436fe8a24b028095bc1cf91a8926f8241e4aaffe59"
|
||||
dependencies = [
|
||||
"ab_glyph_rasterizer",
|
||||
"owned_ttf_parser",
|
||||
@@ -99,20 +99,11 @@ dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ansi_term"
|
||||
version = "0.12.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2"
|
||||
dependencies = [
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "anyhow"
|
||||
version = "1.0.65"
|
||||
version = "1.0.66"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "98161a4e3e2184da77bb14f02184cdd111e83bbbcc9979dfee3c44b9a85f5602"
|
||||
checksum = "216261ddc8289130e551ddcd5ce8a064710c0d064a4d2895c67151c92b5443f6"
|
||||
|
||||
[[package]]
|
||||
name = "approx"
|
||||
@@ -202,9 +193,9 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
|
||||
|
||||
[[package]]
|
||||
name = "base64"
|
||||
version = "0.13.0"
|
||||
version = "0.13.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd"
|
||||
checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"
|
||||
|
||||
[[package]]
|
||||
name = "bevy"
|
||||
@@ -1030,24 +1021,24 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "bumpalo"
|
||||
version = "3.11.0"
|
||||
version = "3.11.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c1ad822118d20d2c234f427000d5acc36eabe1e29a348c89b63dd60b13f28e5d"
|
||||
checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba"
|
||||
|
||||
[[package]]
|
||||
name = "bytemuck"
|
||||
version = "1.12.1"
|
||||
version = "1.12.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2f5715e491b5a1598fc2bef5a606847b5dc1d48ea625bd3c02c00de8285591da"
|
||||
checksum = "aaa3a8d9a1ca92e282c96a32d6511b695d7d994d1d102ba85d279f9b2756947f"
|
||||
dependencies = [
|
||||
"bytemuck_derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "bytemuck_derive"
|
||||
version = "1.2.1"
|
||||
version = "1.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1b9e1f5fa78f69496407a27ae9ed989e3c3b072310286f5ef385525e4cbc24a9"
|
||||
checksum = "5fe233b960f12f8007e3db2d136e3cb1c291bfd7396e384ee76025fc1a3932b4"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@@ -1074,9 +1065,9 @@ checksum = "c1db59621ec70f09c5e9b597b220c7a2b43611f4710dc03ceb8748637775692c"
|
||||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.0.73"
|
||||
version = "1.0.75"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11"
|
||||
checksum = "41ca34107f97baef6cfb231b32f36115781856b8f8208e8c580e0bcaea374842"
|
||||
dependencies = [
|
||||
"jobserver",
|
||||
]
|
||||
@@ -1138,9 +1129,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "cocoa"
|
||||
version = "0.24.0"
|
||||
version = "0.24.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6f63902e9223530efb4e26ccd0cf55ec30d592d3b42e21a28defc42a9586e832"
|
||||
checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"block",
|
||||
@@ -1214,9 +1205,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "const_panic"
|
||||
version = "0.2.4"
|
||||
version = "0.2.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9c0358e41e90e443c69b2b2811f6ec9892c228b93620634cf4344fe89967fa9f"
|
||||
checksum = "9ed2b28323eee4fb66bb824401daa3e46bd445b9a9298a3d382b320710ba69dd"
|
||||
|
||||
[[package]]
|
||||
name = "copyless"
|
||||
@@ -1372,12 +1363,11 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-utils"
|
||||
version = "0.8.11"
|
||||
version = "0.8.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "51887d4adc7b564537b15adcfb307936f8075dfcd5f00dde9a9f1d29383682bc"
|
||||
checksum = "edbafec5fa1f196ca66527c1b12c2ec4745ca14b50f1ad8f9f6f720b55d11fac"
|
||||
dependencies = [
|
||||
"cfg-if 1.0.0",
|
||||
"once_cell",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -1582,9 +1572,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "filetime"
|
||||
version = "0.2.17"
|
||||
version = "0.2.18"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e94a7bbaa59354bc20dd75b67f23e2797b4490e9d6928203fb105c79e448c86c"
|
||||
checksum = "4b9663d381d07ae25dc88dbdf27df458faa83a9b25336bcac83d5e452b5fc9d3"
|
||||
dependencies = [
|
||||
"cfg-if 1.0.0",
|
||||
"libc",
|
||||
@@ -1649,15 +1639,15 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "futures-core"
|
||||
version = "0.3.24"
|
||||
version = "0.3.25"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4e5aa3de05362c3fb88de6531e6296e85cde7739cccad4b9dfeeb7f6ebce56bf"
|
||||
checksum = "04909a7a7e4633ae6c4a9ab280aeb86da1236243a77b694a49eacd659a4bd3ac"
|
||||
|
||||
[[package]]
|
||||
name = "futures-io"
|
||||
version = "0.3.24"
|
||||
version = "0.3.25"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bbf4d2a7a308fd4578637c0b17c7e1c7ba127b8f6ba00b29f717e9655d85eb68"
|
||||
checksum = "00f5fb52a06bdcadeb54e8d3671f8888a39697dcb0b81b23b55174030427f4eb"
|
||||
|
||||
[[package]]
|
||||
name = "futures-lite"
|
||||
@@ -1695,9 +1685,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "getrandom"
|
||||
version = "0.2.7"
|
||||
version = "0.2.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6"
|
||||
checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31"
|
||||
dependencies = [
|
||||
"cfg-if 1.0.0",
|
||||
"js-sys",
|
||||
@@ -1967,7 +1957,7 @@ dependencies = [
|
||||
"color_quant",
|
||||
"num-rational 0.4.1",
|
||||
"num-traits",
|
||||
"png 0.17.6",
|
||||
"png 0.17.7",
|
||||
"scoped_threadpool",
|
||||
]
|
||||
|
||||
@@ -2052,9 +2042,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "itoa"
|
||||
version = "1.0.3"
|
||||
version = "1.0.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6c8af84674fe1f223a982c933a0ee1086ac4d4052aa0fb8060c12c6ad838e754"
|
||||
checksum = "4217ad341ebadf8d8e724e264f13e593e0648f5b3e94b3896a5df283be015ecc"
|
||||
|
||||
[[package]]
|
||||
name = "iyes_loopless"
|
||||
@@ -2125,9 +2115,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "kqueue"
|
||||
version = "1.0.6"
|
||||
version = "1.0.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4d6112e8f37b59803ac47a42d14f1f3a59bbf72fc6857ffc5be455e28a691f8e"
|
||||
checksum = "2c8fc60ba15bf51257aa9807a48a61013db043fcf3a78cb0d916e8e396dcad98"
|
||||
dependencies = [
|
||||
"kqueue-sys",
|
||||
"libc",
|
||||
@@ -2168,15 +2158,15 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.133"
|
||||
version = "0.2.137"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c0f80d65747a3e43d1596c7c5492d95d5edddaabd45a7fcdb02b95f644164966"
|
||||
checksum = "fc7fcc620a3bff7cdd7a365be3376c97191aeaccc2a603e600951e452615bf89"
|
||||
|
||||
[[package]]
|
||||
name = "libloading"
|
||||
version = "0.7.3"
|
||||
version = "0.7.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "efbc0f03f9a775e9f6aed295c6a1ba2253c5757a9e03d55c6caa46a681abcddd"
|
||||
checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f"
|
||||
dependencies = [
|
||||
"cfg-if 1.0.0",
|
||||
"winapi",
|
||||
@@ -2302,10 +2292,19 @@ dependencies = [
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "mio"
|
||||
version = "0.8.4"
|
||||
name = "miniz_oxide"
|
||||
version = "0.6.2"
|
||||
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 = [
|
||||
"libc",
|
||||
"log",
|
||||
@@ -2497,6 +2496,16 @@ 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"
|
||||
@@ -2562,9 +2571,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "num_cpus"
|
||||
version = "1.13.1"
|
||||
version = "1.14.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1"
|
||||
checksum = "f6058e64324c71e02bc2b150e4f3bc8286db6c83092132ffa3f6b1eab0f9def5"
|
||||
dependencies = [
|
||||
"hermit-abi",
|
||||
"libc",
|
||||
@@ -2664,9 +2673,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "once_cell"
|
||||
version = "1.15.0"
|
||||
version = "1.16.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e82dad04139b71a90c080c8463fe0dc7902db5192d939bd0950f074d014339e1"
|
||||
checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860"
|
||||
|
||||
[[package]]
|
||||
name = "opener"
|
||||
@@ -2679,10 +2688,16 @@ dependencies = [
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "owned_ttf_parser"
|
||||
version = "0.15.2"
|
||||
name = "overload"
|
||||
version = "0.1.1"
|
||||
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 = [
|
||||
"ttf-parser",
|
||||
]
|
||||
@@ -2711,7 +2726,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
|
||||
dependencies = [
|
||||
"lock_api",
|
||||
"parking_lot_core 0.9.3",
|
||||
"parking_lot_core 0.9.4",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -2730,9 +2745,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "parking_lot_core"
|
||||
version = "0.9.3"
|
||||
version = "0.9.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929"
|
||||
checksum = "4dc9e0dc2adc1c69d09143aff38d3d30c5c3f0df0dad82e6d25547af174ebec0"
|
||||
dependencies = [
|
||||
"cfg-if 1.0.0",
|
||||
"libc",
|
||||
@@ -2771,9 +2786,9 @@ checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116"
|
||||
|
||||
[[package]]
|
||||
name = "pkg-config"
|
||||
version = "0.3.25"
|
||||
version = "0.3.26"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae"
|
||||
checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160"
|
||||
|
||||
[[package]]
|
||||
name = "png"
|
||||
@@ -2789,14 +2804,14 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "png"
|
||||
version = "0.17.6"
|
||||
version = "0.17.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8f0e7f4c94ec26ff209cee506314212639d6c91b80afb82984819fafce9df01c"
|
||||
checksum = "5d708eaf860a19b19ce538740d2b4bdeeb8337fa53f7738455e706623ad5c638"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"crc32fast",
|
||||
"flate2",
|
||||
"miniz_oxide 0.5.4",
|
||||
"miniz_oxide 0.6.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -2810,9 +2825,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "ppv-lite86"
|
||||
version = "0.2.16"
|
||||
version = "0.2.17"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872"
|
||||
checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
|
||||
|
||||
[[package]]
|
||||
name = "pretty-type-name"
|
||||
@@ -2833,18 +2848,18 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.44"
|
||||
version = "1.0.47"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7bd7356a8122b6c4a24a82b278680c73357984ca2fc79a0f9fa6dea7dced7c58"
|
||||
checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725"
|
||||
dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "profiling"
|
||||
version = "1.0.6"
|
||||
version = "1.0.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2f61dcf0b917cd75d4521d7343d1ffff3d1583054133c9b5cbea3375c703c40d"
|
||||
checksum = "74605f360ce573babfe43964cbe520294dcb081afbf8c108fc6e23036b4da2df"
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
@@ -2923,9 +2938,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "regex"
|
||||
version = "1.6.0"
|
||||
version = "1.7.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b"
|
||||
checksum = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"memchr",
|
||||
@@ -2943,9 +2958,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "regex-syntax"
|
||||
version = "0.6.27"
|
||||
version = "0.6.28"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244"
|
||||
checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848"
|
||||
|
||||
[[package]]
|
||||
name = "renderdoc-sys"
|
||||
@@ -3020,18 +3035,18 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
|
||||
|
||||
[[package]]
|
||||
name = "serde"
|
||||
version = "1.0.145"
|
||||
version = "1.0.147"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "728eb6351430bccb993660dfffc5a72f91ccc1295abaa8ce19b27ebe4f75568b"
|
||||
checksum = "d193d69bae983fc11a79df82342761dfbf28a99fc8d203dca4c3c1b590948965"
|
||||
dependencies = [
|
||||
"serde_derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_derive"
|
||||
version = "1.0.145"
|
||||
version = "1.0.147"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "81fa1584d3d1bcacd84c277a0dfe21f5b0f6accf4a23d04d4c6d61f1af522b4c"
|
||||
checksum = "4f1d362ca8fc9c3e3a7484440752472d68a6caa98f1ab81d99b5dfe517cec852"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@@ -3040,9 +3055,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "serde_json"
|
||||
version = "1.0.85"
|
||||
version = "1.0.87"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e55a28e3aaef9d5ce0506d0a14dbba8054ddc7e499ef522dd8b26859ec9d4a44"
|
||||
checksum = "6ce777b7b150d76b9cf60d28b55f5847135a003f7d7350c6be7a773508ce7d45"
|
||||
dependencies = [
|
||||
"itoa",
|
||||
"ryu",
|
||||
@@ -3084,9 +3099,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "smallvec"
|
||||
version = "1.9.0"
|
||||
version = "1.10.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2fd0db749597d91ff862fd1d55ea87f7855a744a8425a64695b6fca237d1dad1"
|
||||
checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0"
|
||||
dependencies = [
|
||||
"serde",
|
||||
]
|
||||
@@ -3127,9 +3142,9 @@ checksum = "8fb1df15f412ee2e9dfc1c504260fa695c1c3f10fe9f4a6ee2d2184d7d6450e2"
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "1.0.101"
|
||||
version = "1.0.103"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e90cde112c4b9690b8cbe810cba9ddd8bc1d7472e2cae317b69e9438c1cba7d2"
|
||||
checksum = "a864042229133ada95abf3b54fdc62ef5ccabe9515b64717bcb9a1919e59445d"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@@ -3224,9 +3239,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "tracing"
|
||||
version = "0.1.36"
|
||||
version = "0.1.37"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2fce9567bd60a67d08a16488756721ba392f24f29006402881e43b19aac64307"
|
||||
checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8"
|
||||
dependencies = [
|
||||
"cfg-if 1.0.0",
|
||||
"pin-project-lite",
|
||||
@@ -3236,9 +3251,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "tracing-attributes"
|
||||
version = "0.1.22"
|
||||
version = "0.1.23"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "11c75893af559bc8e10716548bdef5cb2b983f8e637db9d0e15126b61b484ee2"
|
||||
checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@@ -3247,9 +3262,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "tracing-core"
|
||||
version = "0.1.29"
|
||||
version = "0.1.30"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5aeea4303076558a00714b823f9ad67d58a3bbda1df83d8827d21193156e22f7"
|
||||
checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a"
|
||||
dependencies = [
|
||||
"once_cell",
|
||||
"valuable",
|
||||
@@ -3268,12 +3283,12 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "tracing-subscriber"
|
||||
version = "0.3.15"
|
||||
version = "0.3.16"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "60db860322da191b40952ad9affe65ea23e7dd6a5c442c2c42865810c6ab8e6b"
|
||||
checksum = "a6176eae26dd70d0c919749377897b54a9276bd7061339665dd68777926b5a70"
|
||||
dependencies = [
|
||||
"ansi_term",
|
||||
"matchers",
|
||||
"nu-ansi-term",
|
||||
"once_cell",
|
||||
"regex",
|
||||
"sharded-slab",
|
||||
@@ -3297,9 +3312,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "ttf-parser"
|
||||
version = "0.15.2"
|
||||
version = "0.17.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7b3e06c9b9d80ed6b745c7159c40b311ad2916abb34a49e9be2653b90db0d8dd"
|
||||
checksum = "375812fa44dab6df41c195cd2f7fecb488f6c09fbaafb62807488cefab642bff"
|
||||
|
||||
[[package]]
|
||||
name = "typenum"
|
||||
@@ -3315,9 +3330,9 @@ checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-ident"
|
||||
version = "1.0.4"
|
||||
version = "1.0.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dcc811dc4066ac62f84f11307873c4850cb653bfa9b1719cee2bd2204a4bc5dd"
|
||||
checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-normalization"
|
||||
@@ -3353,9 +3368,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "uuid"
|
||||
version = "1.1.2"
|
||||
version = "1.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dd6469f4314d5f1ffec476e05f17cc9a78bc7a27a6a857842170bdf8d6f98d2f"
|
||||
checksum = "feb41e78f93363bb2df8b0e86a2ca30eed7806ea16ea0c790d757cf93f79be83"
|
||||
dependencies = [
|
||||
"getrandom",
|
||||
"serde",
|
||||
@@ -3640,46 +3655,60 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
||||
|
||||
[[package]]
|
||||
name = "windows-sys"
|
||||
version = "0.36.1"
|
||||
version = "0.42.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2"
|
||||
checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
|
||||
dependencies = [
|
||||
"windows_aarch64_gnullvm",
|
||||
"windows_aarch64_msvc",
|
||||
"windows_i686_gnu",
|
||||
"windows_i686_msvc",
|
||||
"windows_x86_64_gnu",
|
||||
"windows_x86_64_gnullvm",
|
||||
"windows_x86_64_msvc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows_aarch64_msvc"
|
||||
version = "0.36.1"
|
||||
name = "windows_aarch64_gnullvm"
|
||||
version = "0.42.0"
|
||||
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]]
|
||||
name = "windows_i686_gnu"
|
||||
version = "0.36.1"
|
||||
version = "0.42.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6"
|
||||
checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7"
|
||||
|
||||
[[package]]
|
||||
name = "windows_i686_msvc"
|
||||
version = "0.36.1"
|
||||
version = "0.42.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024"
|
||||
checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_gnu"
|
||||
version = "0.36.1"
|
||||
version = "0.42.0"
|
||||
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]]
|
||||
name = "windows_x86_64_msvc"
|
||||
version = "0.36.1"
|
||||
version = "0.42.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680"
|
||||
checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5"
|
||||
|
||||
[[package]]
|
||||
name = "winit"
|
||||
|
||||
@@ -7,13 +7,13 @@ edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
iyes_loopless = "0.8.0"
|
||||
itertools = "0.10.3"
|
||||
itertools = "0.10.5"
|
||||
rand = "0.8.5"
|
||||
bevy_editor_pls = "0.1.1"
|
||||
bevy_tweening = "0.5.0"
|
||||
|
||||
[dependencies.bevy]
|
||||
version = "0.8.0"
|
||||
version = "0.8.1"
|
||||
features = ["dynamic"]
|
||||
|
||||
[profile.dev.package."*"]
|
||||
|
||||
130
src/snake.rs
130
src/snake.rs
@@ -35,15 +35,8 @@ impl Plugin for SnakePlugin {
|
||||
.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
|
||||
apply_direction_system
|
||||
.run_in_state(AppState::InGame)
|
||||
.run_if(tick_triggered),
|
||||
)
|
||||
@@ -53,7 +46,7 @@ impl Plugin for SnakePlugin {
|
||||
.run_if(tick_triggered),
|
||||
)
|
||||
.add_system(
|
||||
about_to_collide
|
||||
collision_system
|
||||
.run_in_state(AppState::InGame)
|
||||
.run_if(tick_triggered),
|
||||
)
|
||||
@@ -69,24 +62,13 @@ impl Plugin for SnakePlugin {
|
||||
|
||||
pub const Z_HEIGHT: f32 = 10.;
|
||||
|
||||
#[derive(Component)]
|
||||
#[derive(Component, Debug)]
|
||||
struct SnakeSegment;
|
||||
|
||||
#[derive(Component)]
|
||||
#[derive(Component, Debug)]
|
||||
pub struct SnakeHead;
|
||||
|
||||
#[derive(Component, Copy, Clone)]
|
||||
enum Direction {
|
||||
Up,
|
||||
Down,
|
||||
Left,
|
||||
Right,
|
||||
}
|
||||
|
||||
#[derive(Component)]
|
||||
struct DirectionBuffer(Option<Direction>);
|
||||
|
||||
#[derive(Component)]
|
||||
#[derive(Component, Debug)]
|
||||
struct Snake {
|
||||
about_to_collide: bool,
|
||||
segments: Vec<Entity>,
|
||||
@@ -101,6 +83,14 @@ impl Snake {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Component, Copy, Clone, Debug)]
|
||||
enum Direction {
|
||||
Up,
|
||||
Down,
|
||||
Left,
|
||||
Right,
|
||||
}
|
||||
|
||||
impl Direction {
|
||||
fn from_keypress(keypress: Res<Input<KeyCode>>) -> Option<Self> {
|
||||
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 {
|
||||
commands
|
||||
.spawn_bundle(SpriteBundle {
|
||||
@@ -139,13 +132,13 @@ fn setup_snake_system(mut commands: Commands) {
|
||||
commands
|
||||
.entity(snake_head)
|
||||
.insert(Name::new("SnakeHead"))
|
||||
.insert(SnakeHead)
|
||||
.insert(DirectionBuffer(None));
|
||||
.insert(SnakeHead);
|
||||
|
||||
commands
|
||||
.spawn()
|
||||
.insert(Snake::with_segments(&[snake_head]))
|
||||
.insert(Name::new("Snake"))
|
||||
.insert(DirectionBuffer::default())
|
||||
.insert_bundle(SpatialBundle::default())
|
||||
.add_child(snake_head);
|
||||
}
|
||||
@@ -153,11 +146,11 @@ fn setup_snake_system(mut commands: Commands) {
|
||||
fn add_direction_system(
|
||||
mut commands: Commands,
|
||||
keypress: Res<Input<KeyCode>>,
|
||||
mut query: Query<Entity, With<SnakeHead>>,
|
||||
mut query: Query<Entity, With<Snake>>,
|
||||
) {
|
||||
if let Some(direction) = Direction::from_keypress(keypress) {
|
||||
let snake_head = query.single_mut();
|
||||
commands.entity(snake_head).insert(direction);
|
||||
let snake = query.single_mut();
|
||||
commands.entity(snake).insert(direction);
|
||||
|
||||
commands.insert_resource(NextState(AppState::InGame));
|
||||
}
|
||||
@@ -184,9 +177,7 @@ fn add_tail_system(
|
||||
}
|
||||
}
|
||||
|
||||
fn update_direction_system(
|
||||
mut query: Query<(&mut Direction, &mut DirectionBuffer), With<SnakeHead>>,
|
||||
) {
|
||||
fn apply_direction_system(mut query: Query<(&mut Direction, &mut DirectionBuffer), With<Snake>>) {
|
||||
for (mut direction, mut direction_buffer) in query.iter_mut() {
|
||||
if let Some(new_direction) = direction_buffer.0 {
|
||||
*direction = new_direction;
|
||||
@@ -197,7 +188,7 @@ fn update_direction_system(
|
||||
|
||||
fn change_direction_system(
|
||||
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) {
|
||||
let (direction, mut direction_buffer) = query.single_mut();
|
||||
@@ -205,7 +196,7 @@ fn change_direction_system(
|
||||
if let (Direction::Up, Direction::Down)
|
||||
| (Direction::Down, Direction::Up)
|
||||
| (Direction::Left, Direction::Right)
|
||||
| (Direction::Right, Direction::Left) = (direction, &new_direction)
|
||||
| (Direction::Right, Direction::Left) = (direction, new_direction)
|
||||
{
|
||||
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(
|
||||
mut segment_query: Query<&mut grid::Coordinate, With<SnakeSegment>>,
|
||||
snake_query: Query<&Snake>,
|
||||
snake_query: Query<(&Snake, &Direction)>,
|
||||
) {
|
||||
for snake in snake_query.iter() {
|
||||
if snake.about_to_collide {
|
||||
for (
|
||||
Snake {
|
||||
about_to_collide,
|
||||
segments,
|
||||
..
|
||||
},
|
||||
direction,
|
||||
) in snake_query.iter()
|
||||
{
|
||||
if *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();
|
||||
|
||||
// ... then the other elements
|
||||
for (&segment, &previous_segment) in segments.iter().rev().tuple_windows() {
|
||||
let previous_coordinate = *segment_query.get(previous_segment).unwrap();
|
||||
let mut coordinate = segment_query.get_mut(segment).unwrap();
|
||||
*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(
|
||||
head_query: Query<(&grid::Coordinate, &Direction, &Parent), With<SnakeHead>>,
|
||||
fn collision_system(
|
||||
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() {
|
||||
let next_head_coordinate = next_grid_coordinate(head_coordinate, head_direction);
|
||||
for (head_coordinate, parent) in head_query.iter() {
|
||||
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();
|
||||
|
||||
@@ -269,10 +263,6 @@ fn about_to_collide(
|
||||
.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;
|
||||
}
|
||||
}
|
||||
@@ -284,13 +274,13 @@ fn game_over_system(query: Query<&Snake>, mut commands: Commands) {
|
||||
}
|
||||
|
||||
fn next_grid_coordinate(
|
||||
current_coordinate: grid::Coordinate,
|
||||
direction: Direction,
|
||||
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),
|
||||
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),
|
||||
}
|
||||
}
|
||||
|
||||
367
src/snake_old.rs
367
src/snake_old.rs
@@ -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),
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user