From 04e2f63b5b3254f8001fbf32b4626429361429d7 Mon Sep 17 00:00:00 2001 From: Edgar Luque Date: Mon, 14 Mar 2022 14:29:05 +0100 Subject: [PATCH] initial commit --- .gitignore | 4 + Cargo.lock | 1137 +++++++++++++++++++++++++++++++++++++++ Cargo.toml | 16 + README.md | 10 + mapres/basic_freeze.png | Bin 0 -> 23314 bytes src/main.rs | 142 +++++ 6 files changed, 1309 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 README.md create mode 100644 mapres/basic_freeze.png create mode 100644 src/main.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5c52036 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +/target + +server/ +TODO.md \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..3497356 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,1137 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "addr2line" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "adler32" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" + +[[package]] +name = "aho-corasick" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +dependencies = [ + "memchr", +] + +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi", +] + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "backtrace" +version = "0.3.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e121dee8023ce33ab248d9ce1493df03c3b38a659b240096fcbd7048ff9c31f" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide 0.4.4", + "object", + "rustc-demangle", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "block-buffer" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" +dependencies = [ + "block-padding", + "byte-tools", + "byteorder", + "generic-array", +] + +[[package]] +name = "block-padding" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" +dependencies = [ + "byte-tools", +] + +[[package]] +name = "byte-tools" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" + +[[package]] +name = "bytemuck" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e851ca7c24871e7336801608a4797d7376545b6928a10d32d75685687141ead" + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "cc" +version = "1.0.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chrono" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +dependencies = [ + "libc", + "num-integer", + "num-traits", + "time", + "winapi", +] + +[[package]] +name = "clap" +version = "2.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" +dependencies = [ + "ansi_term", + "atty", + "bitflags", + "strsim", + "textwrap", + "unicode-width", + "vec_map", +] + +[[package]] +name = "color-eyre" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ebf286c900a6d5867aeff75cfee3192857bb7f24b547d4f0df2ed6baa812c90" +dependencies = [ + "backtrace", + "color-spantrace", + "eyre", + "indenter", + "once_cell", + "owo-colors", + "tracing-error", +] + +[[package]] +name = "color-spantrace" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ba75b3d9449ecdccb27ecbc479fdc0b87fa2dd43d2f8298f9bf0e59aacc8dce" +dependencies = [ + "once_cell", + "owo-colors", + "tracing-core", + "tracing-error", +] + +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e54ea8bc3fb1ee042f5aace6e3c6e025d3874866da222930f70ce62aceba0bfa" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c00d6d2ea26e8b151d99093005cb442fb9a37aeaca582a03ec70946f49ab5ed9" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "lazy_static", + "memoffset", + "scopeguard", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e5bed1f1c269533fa816a0a5492b3545209a205ca1a54842be180eb63a16a6" +dependencies = [ + "cfg-if", + "lazy_static", +] + +[[package]] +name = "ddnet-map-gen" +version = "0.1.0" +dependencies = [ + "color-eyre", + "eyre", + "irrgarten", + "itertools 0.10.3", + "ndarray", + "rand", + "rand_distr", + "twmap", +] + +[[package]] +name = "deflate" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73770f8e1fe7d64df17ca66ad28994a0a623ea497fa69486e14984e715c5d174" +dependencies = [ + "adler32", + "byteorder", +] + +[[package]] +name = "digest" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" +dependencies = [ + "generic-array", +] + +[[package]] +name = "either" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" + +[[package]] +name = "eyre" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9289ed2c0440a6536e65119725cf91fc2c6b5e513bfd2e36e1134d7cca6ca12f" +dependencies = [ + "indenter", + "once_cell", +] + +[[package]] +name = "fake-simd" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" + +[[package]] +name = "fastrand" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf" +dependencies = [ + "instant", +] + +[[package]] +name = "flexi_logger" +version = "0.15.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aaab3caedb4149800f91e8e4899f29cd9ddf3b569b04c365ca9334f92f7542bf" +dependencies = [ + "atty", + "chrono", + "glob", + "lazy_static", + "log", + "regex", + "thiserror", + "yansi", +] + +[[package]] +name = "generic-array" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" +dependencies = [ + "typenum", +] + +[[package]] +name = "getrandom" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d39cd93900197114fa1fcb7ae84ca742095eed9442088988ae74fa744e930e77" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "gif" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3a7187e78088aead22ceedeee99779455b23fc231fe13ec443f99bb71694e5b" +dependencies = [ + "color_quant", + "weezl", +] + +[[package]] +name = "gimli" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78cc372d058dcf6d5ecd98510e7fbc9e5aec4d21de70f65fea8fecebcd881bd4" + +[[package]] +name = "glob" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "image" +version = "0.23.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24ffcb7e7244a9bf19d35bf2883b9c080c4ced3c07a9895572178cdb8f13f6a1" +dependencies = [ + "bytemuck", + "byteorder", + "color_quant", + "gif", + "jpeg-decoder", + "num-iter", + "num-rational", + "num-traits", + "png", + "scoped_threadpool", + "tiff", +] + +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "irrgarten" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dac9f41006cfe4c8b5ce720a8d1f41e4f12a5095e73591af467823e772fe43aa" +dependencies = [ + "rand", + "thiserror", +] + +[[package]] +name = "itertools" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" + +[[package]] +name = "jpeg-decoder" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "229d53d58899083193af11e15917b5640cd40b29ff475a1fe4ef725deb02d0f2" +dependencies = [ + "rayon", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bf2e165bb3457c8e098ea76f3e3bc9db55f87aa90d52d0e6be741470916aaa4" + +[[package]] +name = "libm" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33a33a362ce288760ec6a508b94caaec573ae7d3bbbd91b87aa0bad4456839db" + +[[package]] +name = "libz-sys" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f35facd4a5673cb5a48822be2be1d4236c1c99cb4113cab7061ac720d5bf859" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "log" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "matrixmultiply" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "add85d4dd35074e6fedc608f8c8f513a3548619a9024b751949ef0e8e45a4d84" +dependencies = [ + "rawpointer", +] + +[[package]] +name = "memchr" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" + +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + +[[package]] +name = "miniz_oxide" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "791daaae1ed6889560f8c4359194f56648355540573244a5448a83ba1ecc7435" +dependencies = [ + "adler32", +] + +[[package]] +name = "miniz_oxide" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +dependencies = [ + "adler", + "autocfg", +] + +[[package]] +name = "ndarray" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dec23e6762830658d2b3d385a75aa212af2f67a4586d4442907144f3bb6a1ca8" +dependencies = [ + "matrixmultiply", + "num-complex", + "num-integer", + "num-traits", + "rawpointer", +] + +[[package]] +name = "num-complex" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26873667bbbb7c5182d4a37c1add32cdf09f841af72da53318fdb81543c15085" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2021c8337a54d21aca0d59a92577a029af9431cb59b909b03252b9c164fad59" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "object" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67ac1d3f9a1d3616fd9a60c8d74296f22406a238b6a72f5cc1e6f314df4ffbf9" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9" + +[[package]] +name = "opaque-debug" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" + +[[package]] +name = "opus_headers" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afbb993947f111397c2bc536944f8dac7f54a4e73383d478efe1990b56404b60" + +[[package]] +name = "owo-colors" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20448fd678ec04e6ea15bbe0476874af65e98a01515d667aa49f1434dc44ebf4" + +[[package]] +name = "pin-project-lite" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e280fbe77cc62c91527259e9442153f4688736748d24660126286329742b4c6c" + +[[package]] +name = "pkg-config" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58893f751c9b0412871a09abd62ecd2a00298c6c83befa223ef98c52aef40cbe" + +[[package]] +name = "png" +version = "0.16.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c3287920cb847dee3de33d301c463fba14dda99db24214ddf93f83d3021f4c6" +dependencies = [ + "bitflags", + "crc32fast", + "deflate", + "miniz_oxide 0.3.7", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" + +[[package]] +name = "proc-macro2" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quote" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "864d3e96a899863136fc6e99f3d7cae289dafe43bf2c5ac19b70df7210c0a145" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_distr" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" +dependencies = [ + "num-traits", + "rand", +] + +[[package]] +name = "rawpointer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" + +[[package]] +name = "rayon" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06aca804d41dbc8ba42dfd964f0d01334eceb64314b9ecf7c5fad5188a06d90" +dependencies = [ + "autocfg", + "crossbeam-deque", + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d78120e2c850279833f1dd3582f730c4ab53ed95aeaaaa862a2a5c71b1656d8e" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-utils", + "lazy_static", + "num_cpus", +] + +[[package]] +name = "redox_syscall" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8380fe0152551244f0747b1bf41737e0f8a74f97a14ccefd1148187271634f3c" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" + +[[package]] +name = "remove_dir_all" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +dependencies = [ + "winapi", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" + +[[package]] +name = "ryu" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" + +[[package]] +name = "sanitize-filename" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23fd0fec94ec480abfd86bb8f4f6c57e0efb36dac5c852add176ea7b04c74801" +dependencies = [ + "lazy_static", + "regex", +] + +[[package]] +name = "scoped_threadpool" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8" + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "serde" +version = "1.0.136" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.136" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e8d9fa5c3b304765ce1fd9c4c8a3de2c8db365a5b91be52f186efc675681d95" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha2" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a256f46ea78a0c0d9ff00077504903ac881a1dafdc20da66545699e7776b3e69" +dependencies = [ + "block-buffer", + "digest", + "fake-simd", + "opaque-debug", +] + +[[package]] +name = "sharded-slab" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "strsim" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" + +[[package]] +name = "structview" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c0d596711317178a78de98b3e30e151fb3d3bbff000f5da37e2b460b99c2182" +dependencies = [ + "byteorder", + "structview_derive", +] + +[[package]] +name = "structview_derive" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e738957e98ce93e9ecad0df60ffe77bd8511a9a1c503f6def8a4cd28ae53b59a" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "syn" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a65b3f4ffa0092e9887669db0eae07941f023991ab58ea44da8fe8e2d511c6b" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "tempfile" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" +dependencies = [ + "cfg-if", + "fastrand", + "libc", + "redox_syscall", + "remove_dir_all", + "winapi", +] + +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "thiserror" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thread_local" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180" +dependencies = [ + "once_cell", +] + +[[package]] +name = "tiff" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a53f4706d65497df0c4349241deddf35f84cee19c87ed86ea8ca590f4464437" +dependencies = [ + "jpeg-decoder", + "miniz_oxide 0.4.4", + "weezl", +] + +[[package]] +name = "time" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" +dependencies = [ + "libc", + "wasi", + "winapi", +] + +[[package]] +name = "tracing" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a1bdf54a7c28a2bbf701e1d2233f6c77f473486b94bee4f9678da5a148dca7f" +dependencies = [ + "cfg-if", + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa31669fa42c09c34d94d8165dd2012e8ff3c66aca50f3bb226b68f216f2706c" +dependencies = [ + "lazy_static", + "valuable", +] + +[[package]] +name = "tracing-error" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d686ec1c0f384b1277f097b2f279a2ecc11afe8c133c1aabf036a27cb4cd206e" +dependencies = [ + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e0ab7bdc962035a87fba73f3acca9b8a8d0034c2e6f60b84aeaaddddc155dce" +dependencies = [ + "sharded-slab", + "thread_local", + "tracing-core", +] + +[[package]] +name = "twmap" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf21dc5f97009d394d536107e15193b7ce8ee035faa5a907eab8f10c1bb42432" +dependencies = [ + "bitflags", + "clap", + "flexi_logger", + "image", + "itertools 0.9.0", + "libc", + "libz-sys", + "log", + "ndarray", + "opus_headers", + "sanitize-filename", + "serde", + "serde_json", + "sha2", + "structview", + "tempfile", + "thiserror", +] + +[[package]] +name = "typenum" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" + +[[package]] +name = "unicode-width" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" + +[[package]] +name = "unicode-xid" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + +[[package]] +name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + +[[package]] +name = "weezl" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b77fdfd5a253be4ab714e4ffa3c49caf146b4de743e97510c0656cf90f1e8e" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "yansi" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fc79f4a1e39857fc00c3f662cbf2651c771f00e9c15fe2abc341806bd46bd71" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..217e502 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "ddnet-map-gen" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +color-eyre = "0.6.1" +eyre = "0.6.7" +irrgarten = "0.1.1" +itertools = "0.10.3" +ndarray = "0.15.4" +rand = "0.8.5" +rand_distr = "0.4.3" +twmap = "0.6.0" diff --git a/README.md b/README.md new file mode 100644 index 0000000..47c8c17 --- /dev/null +++ b/README.md @@ -0,0 +1,10 @@ +# DDNet Map generator + +A map generator made in Rust using [twmap](https://docs.rs/twmap) + +## Planned features + +- Maze map generator. +- Fly map generator. +- Simple ddnet parts generator. +- Maybe more. \ No newline at end of file diff --git a/mapres/basic_freeze.png b/mapres/basic_freeze.png new file mode 100644 index 0000000000000000000000000000000000000000..84d40d524a67719f85d13ff9a8de886d34981423 GIT binary patch literal 23314 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 literal 0 HcmV?d00001 diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..d8a4189 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,142 @@ +use irrgarten::Maze; +use ndarray::Array2; +use rand::Rng; +use rand_distr::{Normal, Distribution}; +use twmap::*; +use color_eyre::Result; + +const TILE_EMPTY: u8 = 0; +const TILE_HOOKABLE: u8 = 1; +const TILE_UNHOOKABLE: u8 = 3; +const TILE_FREEZE: u8 = 9; +const TILE_UNFREEZE: u8 = 1; +const TILE_START: u8 = 33; +const TILE_FINISH: u8 = 34; +const TILE_SPAWN: u8 = 192; + +fn main() -> Result<()> { + color_eyre::install()?; + + gen_flymap()?; + + Ok(()) +} + +fn create_initial_map() -> Result { + let mut map = TwMap::empty(Version::DDNet06); + map.info.author = "Ryozuki's Map Gen".to_string(); + map.info.credits = "Ryozuki's Map Gen".to_string(); + map.images.push(Image::External(ExternalImage { + name: "generic_unhookable".to_string(), + width: 1024, + height: 1024, + })); + map.images.push(Image::Embedded(EmbeddedImage::from_file("mapres/basic_freeze.png")?)); + let physics = Group::physics(); + map.groups.push(physics); + Ok(map) +} + +fn gen_flymap() -> Result<()> { + let mut rng = rand::thread_rng(); + + let mut map = create_initial_map()?; + + const HEIGHT: usize = 1000; + const WIDTH: usize = 100; + + let mut tiles = Array2::from_shape_simple_fn((HEIGHT, WIDTH), || GameTile::new(TILE_EMPTY, TileFlags::empty())); + let mut front_tiles = Array2::from_shape_simple_fn((HEIGHT, WIDTH), || GameTile::new(TILE_EMPTY, TileFlags::empty())); + + tiles.row_mut(HEIGHT - 2).iter_mut().for_each(|tile| tile.id = TILE_UNHOOKABLE); + tiles[(HEIGHT - 3, WIDTH / 2)].id = TILE_SPAWN; + + for x in 0..WIDTH { + front_tiles[(HEIGHT - 6, x)].id = TILE_START; + front_tiles[(10, x)].id = TILE_FINISH; + } + + let mut center: i64 = WIDTH as i64 / 2; + let mut fly_width: i64 = 10; + + for y in (0..=(HEIGHT-3)).rev() { + let direction: i64 = rng.gen_range(-1..=1); + let width_change: i64 = rng.gen_range(-1..=1); + center += direction; + fly_width += width_change; + center = center.clamp(fly_width, WIDTH as i64 - fly_width); + fly_width = fly_width.clamp(2, 12); + + for x in ((center + fly_width) as usize)..WIDTH { + tiles[(y, x)].id = TILE_FREEZE; + } + + for x in 0..=((center - fly_width) as usize) { + tiles[(y, x)].id = TILE_FREEZE; + } + } + + let game_layer = GameLayer { + tiles: CompressedData::Loaded(tiles) + }; + + let front_layer = FrontLayer { + tiles: CompressedData::Loaded(front_tiles), + }; + + let physics = map.physics_group_mut(); + physics.layers.push(Layer::Game(game_layer)); + physics.layers.push(Layer::Front(front_layer)); + + map.save_file("server/maps/generated.map")?; + + Ok(()) +} + +fn gen_maze() -> Result<()> { + let mut rng = rand::thread_rng(); + + let mut map = create_initial_map()?; + + let maze = Maze::new(1001, 1001).unwrap().generate(&mut rng); + + let mut tiles = Array2::from_shape_fn((1001, 1001), |(x, y)| GameTile::new(maze[x][y], TileFlags::empty())); + + // Put spawn and start tile on top left most tile. + let mut added_spawn = false; + 'outerStart: for y in 0..101 { + for x in 0..101 { + let tile = &mut tiles[(x, y)]; + if tile.id == 0 && !added_spawn { + *tile = GameTile::new(TILE_SPAWN, TileFlags::empty()); + added_spawn = true; + } + else if tile.id == 0 && added_spawn { + *tile = GameTile::new(TILE_START, TileFlags::empty()); + break 'outerStart; + } + } + } + + // Put finish tile on bottom right most tile. + 'outerFinish: for y in (0..1001).rev() { + for x in (0..1001).rev() { + let tile = &mut tiles[(x, y)]; + if tile.id == 0 { + *tile = GameTile::new(TILE_FINISH, TileFlags::empty()); + break 'outerFinish; + } + } + } + + let game_layer = GameLayer { + tiles: CompressedData::Loaded(tiles) + }; + + let physics = map.physics_group_mut(); + physics.layers.push(Layer::Game(game_layer)); + + map.save_file("server/maps/generated.map")?; + + Ok(()) +} \ No newline at end of file