diff --git a/Cargo.lock b/Cargo.lock index f8985f4..479e00b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,12 +2,6 @@ # It is not intended for manual editing. version = 3 -[[package]] -name = "ahash" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8fd72866655d1904d6b0997d0b07ba561047d070fbe29de039031c641b61217" - [[package]] name = "aho-corasick" version = "1.1.3" @@ -17,30 +11,16 @@ dependencies = [ "memchr", ] -[[package]] -name = "arrayvec" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" - -[[package]] -name = "autocfg" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" - [[package]] name = "bindgen" -version = "0.69.4" +version = "0.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" +checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" dependencies = [ "bitflags", "cexpr", "clang-sys", "itertools", - "lazy_static", - "lazycell", "log", "prettyplease", "proc-macro2", @@ -48,21 +28,20 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.79", - "which", + "syn", ] [[package]] name = "bitflags" -version = "2.6.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" [[package]] name = "cc" -version = "1.1.24" +version = "1.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812acba72f0a070b003d3697490d2b55b837230ae7c6c6497f05cc2ddbb8d938" +checksum = "1fcb57c740ae1daf453ae85f16e37396f672b039e00d9d866e07ddb24e328e3a" dependencies = [ "shlex", ] @@ -76,12 +55,6 @@ dependencies = [ "nom", ] -[[package]] -name = "cfg-if" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" - [[package]] name = "cfg-if" version = "1.0.0" @@ -101,168 +74,76 @@ dependencies = [ [[package]] name = "cmake" -version = "0.1.51" +version = "0.1.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb1e43aa7fd152b1f968787f7dbcdeb306d1867ff373c69955211876c053f91a" +checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" dependencies = [ "cc", ] -[[package]] -name = "crossbeam-queue" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "774ba60a54c213d409d5353bda12d49cd68d14e45036a285234c8d6f91f92570" -dependencies = [ - "cfg-if 0.1.10", - "crossbeam-utils", - "maybe-uninit", -] - -[[package]] -name = "crossbeam-utils" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" -dependencies = [ - "autocfg", - "cfg-if 0.1.10", - "lazy_static", -] - [[package]] name = "either" -version = "1.13.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" - -[[package]] -name = "errno" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" -dependencies = [ - "libc", - "windows-sys", -] - -[[package]] -name = "fs_extra" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "glob" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - -[[package]] -name = "hashbrown" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96282e96bfcd3da0d3aa9938bedf1e50df3269b6db08b4876d2da0bb1a0841cf" -dependencies = [ - "ahash", - "autocfg", -] - -[[package]] -name = "hibitset" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3ede5cfa60c958e60330d65163adbc4211e15a2653ad80eb0cce878de120121" - -[[package]] -name = "home" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" -dependencies = [ - "windows-sys", -] +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" [[package]] name = "itertools" -version = "0.12.1" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" dependencies = [ "either", ] [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "libc" -version = "0.2.159" +version = "0.2.171" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" +checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" [[package]] name = "libloading" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" +checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "windows-targets", ] -[[package]] -name = "linux-raw-sys" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" - -[[package]] -name = "lock_api" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" -dependencies = [ - "autocfg", - "scopeguard", -] - [[package]] name = "log" -version = "0.4.22" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] -name = "marble-machinations" +name = "marble_engine" +version = "0.2.1" + +[[package]] +name = "marble_machinations" version = "0.2.1" dependencies = [ + "marble_engine", "raylib", "serde", "serde_json", ] -[[package]] -name = "maybe-uninit" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" - [[package]] name = "memchr" version = "2.7.4" @@ -275,12 +156,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" -[[package]] -name = "mopa" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a785740271256c230f57462d3b83e52f998433a7062fc18f96d5999474a9f915" - [[package]] name = "nom" version = "7.1.3" @@ -292,112 +167,68 @@ dependencies = [ ] [[package]] -name = "once_cell" -version = "1.20.1" +name = "paste" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82881c4be219ab5faaf2ad5e5e5ecdff8c66bd7402ca3160975c93b24961afd1" -dependencies = [ - "portable-atomic", -] - -[[package]] -name = "parking_lot" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "redox_syscall", - "smallvec", - "windows-targets", -] - -[[package]] -name = "portable-atomic" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "prettyplease" -version = "0.2.22" +version = "0.2.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479cf940fbbb3426c32c5d5176f62ad57549a0bb84773423ba8be9d089f5faba" +checksum = "5316f57387668042f561aae71480de936257848f9c43ce528e311d89a07cadeb" dependencies = [ "proc-macro2", - "syn 2.0.79", + "syn", ] [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.37" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] [[package]] name = "raylib" -version = "5.0.2" +version = "5.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2a7a6734329d7b872a418fe4cb08ca282eb66a6f4a3430bd4ee4e6a8cac6632" +checksum = "592b25e626f1b9e3ae92d5343592a2836efa84c7f1710b6b3a16440df20215f3" dependencies = [ - "cfg-if 1.0.0", - "lazy_static", - "libc", - "parking_lot", + "cfg-if", + "paste", "raylib-sys", - "specs", - "specs-derive", + "seq-macro", + "thiserror", ] [[package]] name = "raylib-sys" -version = "5.0.2" +version = "5.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db5c6001cfaeec17210713227d11f3b1ba4b723bb12cff47d1b93c4060e10ad0" +checksum = "85111fe8e90405af58eb8063bd05d8fd77d512315f3d551d0abc92deb0419f20" dependencies = [ "bindgen", "cc", "cmake", - "fs_extra", -] - -[[package]] -name = "redox_syscall" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" -dependencies = [ - "bitflags", ] [[package]] name = "regex" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", @@ -407,9 +238,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -428,56 +259,43 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" -[[package]] -name = "rustix" -version = "0.38.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" -dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys", - "windows-sys", -] - [[package]] name = "ryu" -version = "1.0.18" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] -name = "scopeguard" -version = "1.2.0" +name = "seq-macro" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc" [[package]] name = "serde" -version = "1.0.210" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.210" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn", ] [[package]] name = "serde_json" -version = "1.0.128" +version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ "itoa", "memchr", @@ -491,62 +309,11 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" -[[package]] -name = "shred" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f08237e667ac94ad20f8878b5943d91a93ccb231428446c57c21c57779016d" -dependencies = [ - "arrayvec", - "hashbrown", - "mopa", - "smallvec", - "tynm", -] - -[[package]] -name = "shrev" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5ea33232fdcf1bf691ca33450e5a94dde13e1a8cbb8caabc5e4f9d761e10b1a" - -[[package]] -name = "smallvec" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" - -[[package]] -name = "specs" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fff28a29366aff703d5da8a7e2c8875dc8453ac1118f842cbc0fa70c7db51240" -dependencies = [ - "crossbeam-queue", - "hashbrown", - "hibitset", - "log", - "shred", - "shrev", - "tuple_utils", -] - -[[package]] -name = "specs-derive" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e23e09360f3d2190fec4222cd9e19d3158d5da948c0d1ea362df617dd103511" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "syn" -version = "1.0.109" +version = "2.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" dependencies = [ "proc-macro2", "quote", @@ -554,57 +321,30 @@ dependencies = [ ] [[package]] -name = "syn" -version = "2.0.79" +name = "thiserror" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", + "thiserror-impl", ] [[package]] -name = "tuple_utils" -version = "0.3.0" +name = "thiserror-impl" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44834418e2c5b16f47bedf35c28e148db099187dd5feee6367fb2525863af4f1" - -[[package]] -name = "tynm" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd30d05e69d1478e13fe3e7a853409cfec82cebc2cf9b8d613b3c6b0081781ed" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ - "nom", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "unicode-ident" -version = "1.0.13" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" - -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets", -] +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "windows-targets" diff --git a/Cargo.toml b/Cargo.toml index a4578e8..1576c5b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,9 +1,7 @@ -[package] -name = "marble-machinations" -version = "0.2.1" -edition = "2021" +[workspace] + +members = [ + "marble_machinations", + "marble_engine", +] -[dependencies] -raylib = "5.0.2" -serde = { version = "1.0.210", features = ["derive"] } -serde_json = "1.0.128" diff --git a/marble_engine/Cargo.toml b/marble_engine/Cargo.toml new file mode 100644 index 0000000..e4434db --- /dev/null +++ b/marble_engine/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "marble_engine" +version = "0.2.1" +edition = "2021" + +[dependencies] + diff --git a/src/marble_engine/board.rs b/marble_engine/src/board.rs similarity index 75% rename from src/marble_engine/board.rs rename to marble_engine/src/board.rs index 86f153e..836692e 100644 --- a/src/marble_engine/board.rs +++ b/marble_engine/src/board.rs @@ -1,10 +1,4 @@ -use raylib::prelude::*; - use super::{tile::*, Pos, PosInt}; -use crate::{ - theme::TILE_TEXTURE_SIZE, - util::{draw_scaled_texture, Textures}, -}; #[derive(Debug, Clone, PartialEq)] pub struct Board { @@ -194,40 +188,4 @@ impl Board { } out } - - pub fn draw(&self, d: &mut RaylibDrawHandle, textures: &Textures, offset: Vector2, scale: f32) { - let tile_size = (TILE_TEXTURE_SIZE * scale) as i32; - - let start_x = (-offset.x as i32) / tile_size - 1; - let tile_width = d.get_screen_width() / tile_size + 2; - let start_y = (-offset.y as i32) / tile_size - 1; - let tile_height = d.get_screen_height() / tile_size + 2; - - for x in start_x..(start_x + tile_width) { - for y in start_y..(start_y + tile_height) { - let px = x * tile_size + offset.x as i32; - let py = y * tile_size + offset.y as i32; - if let Some(tile) = self.get((x, y).into()) { - let texname = tile.texture(); - if texname.is_empty() { - continue; - } - let texture = textures.get(texname); - draw_scaled_texture(d, texture, px, py, scale); - #[cfg(debug_assertions)] - // TODO: some in-game option to show power direction - if let Tile::Powerable(_, state) = &tile { - for dir in Direction::ALL { - if state.get_dir(dir) { - let texture = textures.get(dir.debug_arrow_texture_name()); - draw_scaled_texture(d, texture, px, py, scale); - } - } - } - } else { - d.draw_rectangle(px, py, tile_size, tile_size, Color::new(0, 0, 0, 80)); - } - } - } - } } diff --git a/src/marble_engine.rs b/marble_engine/src/lib.rs similarity index 93% rename from src/marble_engine.rs rename to marble_engine/src/lib.rs index 36ebf83..369caa4 100644 --- a/src/marble_engine.rs +++ b/marble_engine/src/lib.rs @@ -1,9 +1,7 @@ -use raylib::prelude::*; - pub mod board; pub mod pos; pub mod tile; -use crate::{theme::TILE_TEXTURE_SIZE, ui::draw_usize_small, util::Textures}; + use board::Board; use pos::*; use tile::*; @@ -57,6 +55,10 @@ impl Machine { self.board = board; } + pub fn marbles(&self) -> &[Pos] { + &self.marbles + } + pub fn board(&self) -> &Board { &self.board } @@ -82,31 +84,6 @@ impl Machine { self.input = bytes; } - pub fn draw_marble_values( - &self, - d: &mut RaylibDrawHandle, - textures: &Textures, - offset: Vector2, - scale: f32, - ) { - let tile_size = (TILE_TEXTURE_SIZE * scale) as i32; - for marble in &self.marbles { - let x = marble.x; - let y = marble.y; - if let Some(tile) = self.board.get(*marble) { - let px = x as i32 * tile_size + offset.x as i32; - let py = y as i32 * tile_size + offset.y as i32; - if let Tile::Marble { value, dir } = tile { - let texture = textures.get(dir.arrow_texture_name()); - let pos = Vector2::new(px as f32, py as f32); - let faded_white = Color::new(255, 255, 255, 100); - d.draw_texture_ex(texture, pos, 0., scale, faded_white); - draw_usize_small(d, textures, value as usize, px, py, scale); - } - } - } - } - pub fn step(&mut self) { self.steps += 1; #[cfg(debug_assertions)] @@ -529,6 +506,10 @@ impl Machine { } #[cfg(debug_assertions)] { + self.debug_subticks.push(DebugSubTick { + board: self.board.clone(), + pos: None, + }); self.subtick_index = self.debug_subticks.len() - 1; } } diff --git a/src/marble_engine/pos.rs b/marble_engine/src/pos.rs similarity index 76% rename from src/marble_engine/pos.rs rename to marble_engine/src/pos.rs index 9eea35c..03f4b99 100644 --- a/src/marble_engine/pos.rs +++ b/marble_engine/src/pos.rs @@ -1,7 +1,5 @@ use std::ops::Add; -use raylib::prelude::*; - pub type PosInt = i16; #[derive(Debug, Default, Clone, Copy, PartialEq)] @@ -11,13 +9,6 @@ pub struct Pos { } impl Pos { - pub const fn to_vec(self) -> Vector2 { - Vector2 { - x: self.x as f32, - y: self.y as f32, - } - } - pub fn min(self, other: Self) -> Self { Self { x: self.x.min(other.x), @@ -51,15 +42,6 @@ impl From<(i32, i32)> for Pos { } } -impl From for Pos { - fn from(vec: Vector2) -> Self { - Self { - x: vec.x as PosInt, - y: vec.y as PosInt, - } - } -} - impl Add for Pos { type Output = Self; fn add(self, rhs: Self) -> Self::Output { diff --git a/src/marble_engine/tile.rs b/marble_engine/src/tile.rs similarity index 99% rename from src/marble_engine/tile.rs rename to marble_engine/src/tile.rs index 798c51c..bc80f59 100644 --- a/src/marble_engine/tile.rs +++ b/marble_engine/src/tile.rs @@ -1,4 +1,4 @@ -use crate::marble_engine::Pos; +use crate::Pos; pub type MarbleValue = u32; diff --git a/marble_machinations/Cargo.toml b/marble_machinations/Cargo.toml new file mode 100644 index 0000000..0cc6e6f --- /dev/null +++ b/marble_machinations/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "marble_machinations" +version = "0.2.1" +edition = "2021" + +[dependencies] +marble_engine = { path = "../marble_engine" } +raylib = "5.0.2" +serde = { version = "1.0.210", features = ["derive"] } +serde_json = "1.0.128" diff --git a/build.rs b/marble_machinations/build.rs similarity index 83% rename from build.rs rename to marble_machinations/build.rs index 75a2430..318cf70 100644 --- a/build.rs +++ b/marble_machinations/build.rs @@ -2,7 +2,7 @@ use std::{fs::File, io::Write}; fn main() { let version = concat!("v", env!("CARGO_PKG_VERSION")); - File::create("version.txt") + File::create("../version.txt") .unwrap() .write_all(version.as_bytes()) .unwrap(); diff --git a/src/blueprint.rs b/marble_machinations/src/blueprint.rs similarity index 95% rename from src/blueprint.rs rename to marble_machinations/src/blueprint.rs index 2419eeb..13ec0a0 100644 --- a/src/blueprint.rs +++ b/marble_machinations/src/blueprint.rs @@ -6,7 +6,8 @@ use std::{ use serde::{Deserialize, Serialize}; -use crate::{marble_engine::board::Board, util::userdata_dir}; +use crate::util::userdata_dir; +use marble_engine::board::Board; #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Blueprint { diff --git a/src/config.rs b/marble_machinations/src/config.rs similarity index 100% rename from src/config.rs rename to marble_machinations/src/config.rs diff --git a/src/editor.rs b/marble_machinations/src/editor.rs similarity index 97% rename from src/editor.rs rename to marble_machinations/src/editor.rs index 644ffb4..bbd921e 100644 --- a/src/editor.rs +++ b/marble_machinations/src/editor.rs @@ -10,12 +10,13 @@ use raylib::prelude::*; use crate::{ blueprint::Blueprint, level::Level, - marble_engine::{board::*, pos::*, tile::*, Machine}, + marble_engine::{draw_board, draw_marble_values, PosRaylib}, solution::*, theme::*, ui::*, util::*, }; +use marble_engine::{board::*, pos::*, tile::*, Machine}; const HEADER_HEIGHT: i32 = 40; const FOOTER_HEIGHT: i32 = 95; @@ -562,26 +563,26 @@ impl Editor { fn draw_board(&self, d: &mut RaylibDrawHandle, textures: &Textures) { if self.sim_state == SimState::Editing { - self.source_board - .draw(d, textures, self.view_offset, self.zoom); + draw_board(&self.source_board, d, textures, self.view_offset, self.zoom); } else { if self.machine.debug_subticks.is_empty() { - self.machine - .board() - .draw(d, textures, self.view_offset, self.zoom); + draw_board( + self.machine.board(), + d, + textures, + self.view_offset, + self.zoom, + ); } else { let subframe = &self.machine.debug_subticks[self.machine.subtick_index]; - subframe - .board - .draw(d, textures, self.view_offset, self.zoom); + draw_board(&subframe.board, d, textures, self.view_offset, self.zoom); if let Some(pos) = subframe.pos { let p = self.pos_to_screen(pos.to_vec()); d.draw_texture_ex(textures.get("selection"), p, 0., self.zoom, Color::ORANGE); } } if self.draw_overlay { - self.machine - .draw_marble_values(d, textures, self.view_offset, self.zoom); + draw_marble_values(&self.machine, d, textures, self.view_offset, self.zoom); } } } @@ -1262,12 +1263,12 @@ impl Editor { offset.x -= offset.x.rem(tile_size); offset.y -= offset.y.rem(tile_size); offset += view_offset; - board.draw(d, textures, offset, self.zoom); + draw_board(&board, d, textures, offset, self.zoom); if self.mouse.left_click() { let tile_pos = (self.mouse.pos() - self.view_offset) / tile_size; let tile_pos = Vector2::new(tile_pos.x.floor(), tile_pos.y.floor()); let board = self.pasting_board.take().unwrap(); - self.set_area(tile_pos.into(), board); + self.set_area(Pos::from_vec(tile_pos), board); } } return; @@ -1336,7 +1337,7 @@ impl Editor { ); } if self.mouse.left_click() { - let pos = tile_pos.into(); + let pos = Pos::from_vec(tile_pos); match self.active_tool { Tool::None | Tool::Erase | Tool::SelectArea(_) => (), Tool::SetTile(tile) => self.set_tile(pos, tile), @@ -1371,18 +1372,20 @@ impl Editor { } } if self.mouse.left_hold() && self.active_tool == Tool::Erase { - self.set_tile(tile_pos.into(), Tile::BLANK); + self.set_tile(Pos::from_vec(tile_pos), Tile::BLANK); } if let Tool::SelectArea(selection) = &mut self.active_tool { if self.mouse.left_hold() { if selection.is_selecting { if let Some((_start, end)) = &mut selection.area { - *end = tile_pos.into(); + *end = Pos::from_vec(tile_pos); } else { - selection.area = Some((tile_pos.into(), tile_pos.into())); + selection.area = + Some((Pos::from_vec(tile_pos), Pos::from_vec(tile_pos))); } } else { - selection.area = Some((tile_pos.into(), tile_pos.into())); + selection.area = + Some((Pos::from_vec(tile_pos), Pos::from_vec(tile_pos))); selection.is_selecting = true; } } else if self.mouse.left_release() { @@ -1399,7 +1402,7 @@ impl Editor { offset.x -= offset.x.rem(tile_size); offset.y -= offset.y.rem(tile_size); offset += view_offset; - bp.convert_board().draw(d, textures, offset, self.zoom); + draw_board(bp.convert_board(), d, textures, offset, self.zoom); } if self.mouse.pos().x < SIDEBAR_WIDTH as f32 { if self.mouse.scroll() == Some(Scroll::Down) diff --git a/src/level.rs b/marble_machinations/src/level.rs similarity index 100% rename from src/level.rs rename to marble_machinations/src/level.rs diff --git a/src/lib.rs b/marble_machinations/src/lib.rs similarity index 89% rename from src/lib.rs rename to marble_machinations/src/lib.rs index 294ea50..06d1167 100644 --- a/src/lib.rs +++ b/marble_machinations/src/lib.rs @@ -1,4 +1,5 @@ pub mod blueprint; +pub mod config; pub mod editor; pub mod level; pub mod marble_engine; diff --git a/src/main.rs b/marble_machinations/src/main.rs similarity index 100% rename from src/main.rs rename to marble_machinations/src/main.rs diff --git a/marble_machinations/src/marble_engine.rs b/marble_machinations/src/marble_engine.rs new file mode 100644 index 0000000..b5e1377 --- /dev/null +++ b/marble_machinations/src/marble_engine.rs @@ -0,0 +1,104 @@ +use marble_engine::{ + board::Board, + pos::{Pos, PosInt}, + tile::{Direction, Tile}, + Machine, +}; +use raylib::{ + color::Color, + drawing::{RaylibDraw, RaylibDrawHandle}, + math::Vector2, +}; + +use crate::{ + theme::TILE_TEXTURE_SIZE, + ui::draw_usize_small, + util::{draw_scaled_texture, Textures}, +}; + +pub trait PosRaylib { + fn to_vec(self) -> Vector2; + fn from_vec(vec: Vector2) -> Self; +} + +impl PosRaylib for Pos { + fn from_vec(vec: Vector2) -> Self { + Self { + x: vec.x as PosInt, + y: vec.y as PosInt, + } + } + fn to_vec(self) -> Vector2 { + Vector2 { + x: self.x as f32, + y: self.y as f32, + } + } +} + +pub fn draw_board( + board: &Board, + d: &mut RaylibDrawHandle, + textures: &Textures, + offset: Vector2, + scale: f32, +) { + let tile_size = (TILE_TEXTURE_SIZE * scale) as i32; + + let start_x = (-offset.x as i32) / tile_size - 1; + let tile_width = d.get_screen_width() / tile_size + 2; + let start_y = (-offset.y as i32) / tile_size - 1; + let tile_height = d.get_screen_height() / tile_size + 2; + + for x in start_x..(start_x + tile_width) { + for y in start_y..(start_y + tile_height) { + let px = x * tile_size + offset.x as i32; + let py = y * tile_size + offset.y as i32; + if let Some(tile) = board.get((x, y).into()) { + let texname = tile.texture(); + if texname.is_empty() { + continue; + } + let texture = textures.get(texname); + draw_scaled_texture(d, texture, px, py, scale); + #[cfg(debug_assertions)] + // TODO: some in-game option to show power direction + if let Tile::Powerable(_, state) = &tile { + for dir in Direction::ALL { + if state.get_dir(dir) { + let texture = textures.get(dir.debug_arrow_texture_name()); + draw_scaled_texture(d, texture, px, py, scale); + } + } + } + } else { + d.draw_rectangle(px, py, tile_size, tile_size, Color::new(0, 0, 0, 80)); + } + } + } +} + +pub fn draw_marble_values( + machine: &Machine, + d: &mut RaylibDrawHandle, + textures: &Textures, + offset: Vector2, + scale: f32, +) { + let tile_size = (TILE_TEXTURE_SIZE * scale) as i32; + for marble in machine.marbles() { + let x = marble.x; + let y = marble.y; + if let Some(tile) = machine.board().get(*marble) { + let px = x as i32 * tile_size + offset.x as i32; + let py = y as i32 * tile_size + offset.y as i32; + if let Tile::Marble { value, dir } = tile { + let texture = textures.get(dir.arrow_texture_name()); + let pos = Vector2::new(px as f32, py as f32); + let faded_white = Color::new(255, 255, 255, 100); + d.draw_texture_ex(texture, pos, 0., scale, faded_white); + draw_usize_small(d, textures, value as usize, px, py, scale); + } + } + } +} diff --git a/src/solution.rs b/marble_machinations/src/solution.rs similarity index 100% rename from src/solution.rs rename to marble_machinations/src/solution.rs diff --git a/src/theme.rs b/marble_machinations/src/theme.rs similarity index 100% rename from src/theme.rs rename to marble_machinations/src/theme.rs diff --git a/src/ui.rs b/marble_machinations/src/ui.rs similarity index 100% rename from src/ui.rs rename to marble_machinations/src/ui.rs diff --git a/src/util.rs b/marble_machinations/src/util.rs similarity index 100% rename from src/util.rs rename to marble_machinations/src/util.rs