diff --git a/Cargo.lock b/Cargo.lock index f4a7b76..d22400e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,6 +8,21 @@ version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" +[[package]] +name = "addr2line" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + [[package]] name = "ahash" version = "0.7.6" @@ -20,10 +35,21 @@ dependencies = [ ] [[package]] -name = "aho-corasick" -version = "0.7.20" +name = "ahash" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", +] + +[[package]] +name = "aho-corasick" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" dependencies = [ "memchr", ] @@ -34,6 +60,12 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + [[package]] name = "android_system_properties" version = "0.1.5" @@ -56,31 +88,31 @@ version = "0.1.0" dependencies = [ "nom", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "arrayvec" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" [[package]] name = "async-recursion" -version = "1.0.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cda8f4bcc10624c4e85bc66b3f452cca98cfa5ca002dc83a16aad2367641bea" +checksum = "0e97ce7de6cf12de5d7226c73f5ba9811622f4db3a5b91b55c53e987e5f91cba" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.26", ] [[package]] name = "async-stream" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad445822218ce64be7a341abfb0b1ea43b5c23aa83902542a4542e78309d8e5e" +checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" dependencies = [ "async-stream-impl", "futures-core", @@ -89,35 +121,24 @@ dependencies = [ [[package]] name = "async-stream-impl" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4655ae1a7b0cdf149156f780c5bf3f1352bc53cbd9e0a361a7ef7b22947e965" +checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.26", ] [[package]] name = "async-trait" -version = "0.1.60" +version = "0.1.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d1d8ab452a3936018a687b20e6f7cf5363d713b732b8884001317b0e48aa3" +checksum = "a564d521dd56509c4c47480d00b80ee55f7e385ae48db5744c67ad50c92d2ebf" dependencies = [ "proc-macro2", "quote", - "syn", -] - -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi", - "libc", - "winapi", + "syn 2.0.26", ] [[package]] @@ -126,6 +147,21 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "backtrace" +version = "0.3.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + [[package]] name = "base64" version = "0.13.1" @@ -138,6 +174,12 @@ version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ea22880d78093b0cbe17c89f64a7d457941e65759157ec6cb31a31d652b05e5" +[[package]] +name = "base64" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" + [[package]] name = "bcrypt" version = "0.13.0" @@ -156,6 +198,24 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + [[package]] name = "blastmud_game" version = "0.1.0" @@ -229,9 +289,9 @@ dependencies = [ [[package]] name = "block-buffer" -version = "0.10.3" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ "generic-array", ] @@ -248,84 +308,75 @@ dependencies = [ [[package]] name = "borsh" -version = "0.9.3" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15bf3650200d8bffa99015595e10f1fbd17de07abbc25bb067da79e769939bfa" +checksum = "4114279215a005bc675e386011e594e1d9b800918cea18fcadadcce864a2046b" dependencies = [ "borsh-derive", - "hashbrown 0.11.2", + "hashbrown 0.13.2", ] [[package]] name = "borsh-derive" -version = "0.9.3" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6441c552f230375d18e3cc377677914d2ca2b0d36e52129fe15450a2dce46775" +checksum = "0754613691538d51f329cce9af41d7b7ca150bc973056f1156611489475f54f7" dependencies = [ "borsh-derive-internal", "borsh-schema-derive-internal", "proc-macro-crate", "proc-macro2", - "syn", + "syn 1.0.109", ] [[package]] name = "borsh-derive-internal" -version = "0.9.3" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5449c28a7b352f2d1e592a8a28bf139bc71afb0764a14f3c02500935d8c44065" +checksum = "afb438156919598d2c7bad7e1c0adf3d26ed3840dbc010db1a882a65583ca2fb" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "borsh-schema-derive-internal" -version = "0.9.3" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdbd5696d8bfa21d53d9fe39a714a18538bad11492a42d066dbbc395fb1951c0" +checksum = "634205cc43f74a1b9046ef87c4540ebda95696ec0f315024860cad7c5b0f5ccd" dependencies = [ "proc-macro2", "quote", - "syn", -] - -[[package]] -name = "buf_redux" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b953a6887648bb07a535631f2bc00fbdb2a2216f135552cb3f534ed136b9c07f" -dependencies = [ - "memchr", - "safemem", + "syn 1.0.109", ] [[package]] name = "bumpalo" -version = "3.11.1" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba" +checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" [[package]] name = "bytecheck" -version = "0.6.9" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d11cac2c12b5adc6570dad2ee1b87eff4955dac476fe12d81e5fdd352e52406f" +checksum = "8b6372023ac861f6e6dc89c8344a8f398fb42aaba2b5dbc649ca0c0e9dbcb627" dependencies = [ "bytecheck_derive", "ptr_meta", + "simdutf8", ] [[package]] name = "bytecheck_derive" -version = "0.6.9" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13e576ebe98e605500b3c8041bb888e966653577172df6dd97398714eb30b9bf" +checksum = "a7ec4c6f261935ad534c0c22dbef2201b45918860eb1c574b972bd213a76af61" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -336,15 +387,15 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "bytes" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfb24e866b15a1af2a1b663f10c6b6b8f397a84aadb828f12e5b289ec23a3a3c" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" [[package]] name = "cc" -version = "1.0.78" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a20104e2335ce8a659d6dd92a51a767a0c062599c73b343fd152cb401e828c3d" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" [[package]] name = "cfg-if" @@ -354,13 +405,13 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.23" +version = "0.4.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b0a3d9ed01224b22057780a37bb8c5dbfe1be8ba48678e7bf57ec4b385411f" +checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5" dependencies = [ + "android-tzdata", "iana-time-zone", "js-sys", - "num-integer", "num-traits", "serde", "time 0.1.45", @@ -370,46 +421,36 @@ dependencies = [ [[package]] name = "cipher" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1873270f8f7942c191139cb8a40fd228da6c3fd2fc376d7e92d47aa14aeb59e" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" dependencies = [ "crypto-common", "inout", ] -[[package]] -name = "codespan-reporting" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" -dependencies = [ - "termcolor", - "unicode-width", -] - [[package]] name = "colored" -version = "2.0.0" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3616f750b84d8f0de8a58bda93e08e2a81ad3f523089b05f1dffecab48c6cbd" +checksum = "2674ec482fbc38012cf31e6c42ba0177b431a0cb6f15fe40efa5aab1bda516f6" dependencies = [ - "atty", + "is-terminal", "lazy_static", - "winapi", + "windows-sys 0.48.0", ] [[package]] name = "core-foundation-sys" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" +checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" [[package]] name = "cpufeatures" -version = "0.2.5" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" +checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" dependencies = [ "libc", ] @@ -424,50 +465,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "cxx" -version = "1.0.85" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5add3fc1717409d029b20c5b6903fc0c0b02fa6741d820054f4a2efa5e5816fd" -dependencies = [ - "cc", - "cxxbridge-flags", - "cxxbridge-macro", - "link-cplusplus", -] - -[[package]] -name = "cxx-build" -version = "1.0.85" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c87959ba14bc6fbc61df77c3fcfe180fc32b93538c4f1031dd802ccb5f2ff0" -dependencies = [ - "cc", - "codespan-reporting", - "once_cell", - "proc-macro2", - "quote", - "scratch", - "syn", -] - -[[package]] -name = "cxxbridge-flags" -version = "1.0.85" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69a3e162fde4e594ed2b07d0f83c6c67b745e7f28ce58c6df5e6b6bef99dfb59" - -[[package]] -name = "cxxbridge-macro" -version = "1.0.85" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e7e2adeb6a0d4a282e581096b06e1791532b7d576dcde5ccd9382acf55db8e6" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "deadpool" version = "0.9.5" @@ -484,9 +481,9 @@ dependencies = [ [[package]] name = "deadpool-postgres" -version = "0.10.3" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e866e414e9e12fc988f0bfb89a0b86228e7ed196ca509fbc4dcbc738c56e753c" +checksum = "836a24a9d49deefe610b8b60c767a7412e9a931d79a89415cd2d2d71630ca8d7" dependencies = [ "deadpool", "log", @@ -512,9 +509,9 @@ checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" [[package]] name = "digest" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", @@ -529,34 +526,69 @@ checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" [[package]] name = "educe" -version = "0.4.20" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0188e3c3ba8df5753894d54461f0e39bc91741dc5b22e1c46999ec2c71f4e4" +checksum = "079044df30bb07de7d846d41a184c4b00e66ebdac93ee459253474f3a47e50ae" dependencies = [ "enum-ordinalize", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "either" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" +checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" + +[[package]] +name = "encoding_rs" +version = "0.8.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" +dependencies = [ + "cfg-if", +] [[package]] name = "enum-ordinalize" -version = "3.1.12" +version = "3.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bb1df8b45ecb7ffa78dca1c17a438fb193eb083db0b1b494d2a61bcb5096a" +checksum = "e4f76552f53cefc9a7f64987c3701b99d982f7690606fd67de1d09712fbf52f1" dependencies = [ "num-bigint", "num-traits", "proc-macro2", "quote", - "rustc_version", - "syn", + "syn 2.0.26", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", ] [[package]] @@ -565,15 +597,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" -[[package]] -name = "fastrand" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" -dependencies = [ - "instant", -] - [[package]] name = "float-cmp" version = "0.9.0" @@ -591,9 +614,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "form_urlencoded" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" dependencies = [ "percent-encoding", ] @@ -605,10 +628,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] -name = "futures" -version = "0.3.25" +name = "funty" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38390104763dc37a5145a53c29c63c1290b5d316d6086ec32c293f6736051bb0" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" dependencies = [ "futures-channel", "futures-core", @@ -621,9 +650,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.25" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ba265a92256105f45b719605a571ffe2d1f0fea3807304b522c1d778f79eed" +checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" dependencies = [ "futures-core", "futures-sink", @@ -631,15 +660,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.25" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04909a7a7e4633ae6c4a9ab280aeb86da1236243a77b694a49eacd659a4bd3ac" +checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" [[package]] name = "futures-executor" -version = "0.3.25" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7acc85df6714c176ab5edf386123fafe217be88c0840ec11f199441134a074e2" +checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" dependencies = [ "futures-core", "futures-task", @@ -648,38 +677,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.25" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00f5fb52a06bdcadeb54e8d3671f8888a39697dcb0b81b23b55174030427f4eb" +checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" [[package]] name = "futures-macro" -version = "0.3.25" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdfb8ce053d86b91919aad980c220b1fb8401a9394410e1c289ed7e66b61835d" +checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.26", ] [[package]] name = "futures-sink" -version = "0.3.25" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39c15cf1a4aa79df40f1bb462fb39676d0ad9e366c2a33b590d7c66f4f81fcf9" +checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" [[package]] name = "futures-task" -version = "0.3.25" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ffb393ac5d9a6eaa9d3fdf37ae2776656b706e200c8e16b1bdb227f5198e6ea" +checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" [[package]] name = "futures-util" -version = "0.3.25" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "197676987abd2f9cadff84926f410af1c183608d36641465df73ae8211dc65d6" +checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" dependencies = [ "futures-channel", "futures-core", @@ -695,9 +724,9 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.6" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", @@ -705,9 +734,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.8" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" dependencies = [ "cfg-if", "libc", @@ -715,10 +744,16 @@ dependencies = [ ] [[package]] -name = "h2" -version = "0.3.15" +name = "gimli" +version = "0.27.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9f29bc9dda355256b2916cf526ab02ce0aeaaaf2bad60d65ef3f12f11dd0f4" +checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" + +[[package]] +name = "h2" +version = "0.3.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" dependencies = [ "bytes", "fnv", @@ -726,7 +761,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap", + "indexmap 1.9.3", "slab", "tokio", "tokio-util", @@ -739,24 +774,30 @@ version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" -[[package]] -name = "hashbrown" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" -dependencies = [ - "ahash", -] - [[package]] name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ - "ahash", + "ahash 0.7.6", ] +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.3", +] + +[[package]] +name = "hashbrown" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" + [[package]] name = "headers" version = "0.3.8" @@ -764,7 +805,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3e372db8e5c0d213e0cd0b9be18be2aca3d44cf2fe30a9d46a65581cd454584" dependencies = [ "base64 0.13.1", - "bitflags", + "bitflags 1.3.2", "bytes", "headers-core", "http", @@ -784,12 +825,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.1.19" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] +checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" [[package]] name = "hmac" @@ -802,9 +840,9 @@ dependencies = [ [[package]] name = "http" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" +checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" dependencies = [ "bytes", "fnv", @@ -842,9 +880,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.23" +version = "0.14.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "034711faac9d2166cb1baf1a2fb0b60b1f277f8492fd72176c17f3515e1abd3c" +checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" dependencies = [ "bytes", "futures-channel", @@ -857,7 +895,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2", + "socket2 0.4.9", "tokio", "tower-service", "tracing", @@ -866,44 +904,32 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.53" +version = "0.1.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64c122667b287044802d6ce17ee2ddf13207ed924c712de9a66a5814d5b64765" +checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "winapi", + "windows", ] [[package]] name = "iana-time-zone-haiku" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0703ae284fc167426161c2e3f1da3ea71d94b21bedbcc9494e92b28e334e3dca" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" dependencies = [ - "cxx", - "cxx-build", + "cc", ] [[package]] name = "idna" -version = "0.2.3" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" -dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "idna" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -911,14 +937,24 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.9.2" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", "hashbrown 0.12.3", ] +[[package]] +name = "indexmap" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +dependencies = [ + "equivalent", + "hashbrown 0.14.0", +] + [[package]] name = "inout" version = "0.1.3" @@ -929,12 +965,14 @@ dependencies = [ ] [[package]] -name = "instant" -version = "0.1.12" +name = "is-terminal" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" dependencies = [ - "cfg-if", + "hermit-abi", + "rustix", + "windows-sys 0.48.0", ] [[package]] @@ -948,15 +986,15 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.4" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4217ad341ebadf8d8e724e264f13e593e0648f5b3e94b3896a5df283be015ecc" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "js-sys" -version = "0.3.60" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" +checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" dependencies = [ "wasm-bindgen", ] @@ -969,30 +1007,27 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.138" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db6d7e329c562c5dfab7a46a2afabc8b987ab9a4834c9d1ca04dc54c1546cef8" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "libm" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "348108ab3fba42ec82ff6e9564fc4ca0247bdccdc68dd8af9764bbc79c3c8ffb" +checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4" [[package]] -name = "link-cplusplus" -version = "1.0.8" +name = "linux-raw-sys" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecd207c9c713c34f95a097a5b029ac2ce6010530c7b49d7fea24d977dede04f5" -dependencies = [ - "cc", -] +checksum = "09fc20d2ca12cb9f044c93e3bd6d32d523e6e2ec3db4f7b2939cd99026ecd3f0" [[package]] name = "lock_api" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" dependencies = [ "autocfg", "scopeguard", @@ -1000,18 +1035,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.17" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "matches" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" [[package]] name = "md-5" @@ -1039,9 +1065,9 @@ dependencies = [ [[package]] name = "mime" -version = "0.3.16" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "mime_guess" @@ -1060,22 +1086,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] -name = "mio" -version = "0.8.5" +name = "miniz_oxide" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5d732bc30207a6423068df043e3d02e0735b155ad7ce1a6f76fe2baa5b158de" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" dependencies = [ "libc", - "log", "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] name = "mockall" -version = "0.11.3" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50e4a1c770583dac7ab5e2f6c139153b783a53a1bbee9729613f193e59828326" +checksum = "4c84490118f2ee2d74570d114f3d0493cbf02790df303d2707606c3e14e07c96" dependencies = [ "cfg-if", "downcast", @@ -1088,14 +1122,14 @@ dependencies = [ [[package]] name = "mockall_derive" -version = "0.11.3" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "832663583d5fa284ca8810bf7015e46c9fff9622d3cf34bd1eea5003fec06dd0" +checksum = "22ce75669015c4f47b289fd4d4f56e894e4c96003ffdf3ac51313126f94c6cbb" dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1107,25 +1141,25 @@ dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] -name = "multipart" -version = "0.18.0" +name = "multer" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00dec633863867f29cb39df64a397cdf4a6354708ddd7759f70c7fb51c5f9182" +checksum = "01acbdc23469fd8fe07ab135923371d5f5a422fbf9c522158677c8eb15bc51c2" dependencies = [ - "buf_redux", + "bytes", + "encoding_rs", + "futures-util", + "http", "httparse", "log", + "memchr", "mime", - "mime_guess", - "quick-error", - "rand", - "safemem", - "tempfile", - "twoway", + "spin 0.9.8", + "version_check", ] [[package]] @@ -1134,7 +1168,7 @@ version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a" dependencies = [ - "bitflags", + "bitflags 1.3.2", "cfg-if", "libc", "memoffset", @@ -1144,9 +1178,9 @@ dependencies = [ [[package]] name = "nom" -version = "7.1.1" +version = "7.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" dependencies = [ "memchr", "minimal-lexical", @@ -1191,9 +1225,9 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.14.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6058e64324c71e02bc2b150e4f3bc8286db6c83092132ffa3f6b1eab0f9def5" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ "hermit-abi", "libc", @@ -1209,16 +1243,25 @@ dependencies = [ ] [[package]] -name = "once_cell" -version = "1.17.0" +name = "object" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f61fba1741ea2b3d6a1e3178721804bb716a68a6aeba1149b5d52e3d464ea66" +checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "ouroboros" -version = "0.15.5" +version = "0.15.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbb50b356159620db6ac971c6d5c9ab788c9cc38a6f49619fca2a27acb062ca" +checksum = "e1358bd1558bd2a083fed428ffeda486fbfb323e698cdda7794259d592ca72db" dependencies = [ "aliasable", "ouroboros_macro", @@ -1226,15 +1269,15 @@ dependencies = [ [[package]] name = "ouroboros_macro" -version = "0.15.5" +version = "0.15.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a0d9d1a6191c4f391f87219d1ea42b23f09ee84d64763cd05ee6ea88d9f384d" +checksum = "5f7d21ccd03305a674437ee1248f3ab5d4b1db095cf1caf49f1713ddf61956b7" dependencies = [ "Inflector", "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1249,28 +1292,28 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.5" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ff9f3fef3968a3ec5945535ed654cb38ff72d7495a25619e2247fb15a2ed9ba" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-sys", + "windows-targets", ] [[package]] name = "percent-encoding" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "phf" -version = "0.11.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "928c6535de93548188ef63bb7c4036bd415cd8f36ad25af44b9789b2ee72a48c" +checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" dependencies = [ "phf_macros", "phf_shared", @@ -1278,9 +1321,9 @@ dependencies = [ [[package]] name = "phf_generator" -version = "0.11.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1181c94580fa345f50f19d738aaa39c0ed30a600d95cb2d3e23f94266f14fbf" +checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" dependencies = [ "phf_shared", "rand", @@ -1288,51 +1331,51 @@ dependencies = [ [[package]] name = "phf_macros" -version = "0.11.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92aacdc5f16768709a569e913f7451034034178b05bdc8acda226659a3dccc66" +checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" dependencies = [ "phf_generator", "phf_shared", "proc-macro2", "quote", - "syn", + "syn 2.0.26", ] [[package]] name = "phf_shared" -version = "0.11.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1fb5f6f826b772a8d4c0394209441e7d37cbbb967ae9c7e0e8134365c9ee676" +checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" dependencies = [ "siphasher", ] [[package]] name = "pin-project" -version = "1.0.12" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" +checksum = "030ad2bc4db10a8944cb0d837f158bdfec4d4a4873ab701a95046770d11f8842" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.0.12" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" +checksum = "ec2e072ecce94ec471b13398d5402c188e76ac03cf74dd1a975161b23a3f6d9c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.26", ] [[package]] name = "pin-project-lite" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" [[package]] name = "pin-utils" @@ -1342,11 +1385,11 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "postgres-protocol" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "878c6cbf956e03af9aa8204b407b9cbf47c072164800aa918c516cd4b056c50c" +checksum = "78b7fa9f396f51dffd61546fd8573ee20592287996568e6175ceb0f8699ad75d" dependencies = [ - "base64 0.13.1", + "base64 0.21.2", "byteorder", "bytes", "fallible-iterator", @@ -1360,9 +1403,9 @@ dependencies = [ [[package]] name = "postgres-types" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73d946ec7d256b04dfadc4e6a3292324e6f417124750fc5c0950f981b703a0f1" +checksum = "f028f05971fe20f512bcc679e2c10227e57809a3af86a7606304435bc8896cd6" dependencies = [ "bytes", "fallible-iterator", @@ -1394,15 +1437,15 @@ dependencies = [ [[package]] name = "predicates-core" -version = "1.0.5" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72f883590242d3c6fc5bf50299011695fa6590c2c70eac95ee1bdb9a733ad1a2" +checksum = "b794032607612e7abeb4db69adb4e33590fa6cf1149e95fd7cb00e634b92f174" [[package]] name = "predicates-tree" -version = "1.0.7" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54ff541861505aabf6ea722d2131ee980b8276e10a1297b94e896dd8b621850d" +checksum = "368ba315fb8c5052ab692e68a0eefec6ec57b23a36959c14496f0b0df2c0cecf" dependencies = [ "predicates-core", "termtree", @@ -1426,7 +1469,7 @@ dependencies = [ "proc-macro-error-attr", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "version_check", ] @@ -1443,9 +1486,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.47" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] @@ -1467,24 +1510,24 @@ checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - [[package]] name = "quote" -version = "1.0.23" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" +checksum = "5fe8a65d69dd0808184ebb5f836ab526bb259db23c657efa38711b1072ee47f0" dependencies = [ "proc-macro2", ] +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + [[package]] name = "rand" version = "0.8.5" @@ -1527,18 +1570,30 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.16" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] name = "regex" -version = "1.7.0" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a" +checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" dependencies = [ "aho-corasick", "memchr", @@ -1547,24 +1602,15 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.28" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" - -[[package]] -name = "remove_dir_all" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" -dependencies = [ - "winapi", -] +checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" [[package]] name = "rend" -version = "0.3.6" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79af64b4b6362ffba04eef3a4e10829718a4896dac19daa741851c86781edf95" +checksum = "581008d2099240d37fb08d77ad713bcaec2c4d89d50b5b21a8bb1996bbab68ab" dependencies = [ "bytecheck", ] @@ -1584,7 +1630,7 @@ dependencies = [ "cc", "libc", "once_cell", - "spin", + "spin 0.5.2", "untrusted", "web-sys", "winapi", @@ -1592,34 +1638,37 @@ dependencies = [ [[package]] name = "rkyv" -version = "0.7.39" +version = "0.7.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cec2b3485b07d96ddfd3134767b8a447b45ea4eb91448d0a35180ec0ffd5ed15" +checksum = "0200c8230b013893c0b2d6213d6ec64ed2b9be2e0e016682b7224ff82cff5c58" dependencies = [ + "bitvec", "bytecheck", "hashbrown 0.12.3", "ptr_meta", "rend", "rkyv_derive", "seahash", + "tinyvec", + "uuid", ] [[package]] name = "rkyv_derive" -version = "0.7.39" +version = "0.7.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eaedadc88b53e36dd32d940ed21ae4d850d5916f2581526921f553a72ac34c4" +checksum = "b2e06b915b5c230a17d7a736d1e2e63ee753c256a8614ef3f5147b13a4f5541d" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "rust_decimal" -version = "1.28.0" +version = "1.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe32e8c89834541077a5c5bbe5691aa69324361e27e6aeb3552a737db4a70c8" +checksum = "d0446843641c69436765a35a5a77088e28c2e6a12da93e84aa3ab1cd4aa5a042" dependencies = [ "arrayvec", "borsh", @@ -1634,34 +1683,38 @@ dependencies = [ ] [[package]] -name = "rustc_version" -version = "0.4.0" +name = "rustc-demangle" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[package]] +name = "rustix" +version = "0.38.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a962918ea88d644592894bc6dc55acc6c0956488adcebbfb6e273506b7fd6e5" dependencies = [ - "semver", + "bitflags 2.3.3", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.48.0", ] [[package]] name = "rustls-pemfile" -version = "0.2.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eebeaeb360c87bfb72e84abdb3447159c0eaececf1bef2aecd65a8be949d1c9" +checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" dependencies = [ - "base64 0.13.1", + "base64 0.21.2", ] [[package]] name = "ryu" -version = "1.0.11" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" - -[[package]] -name = "safemem" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" [[package]] name = "scoped-tls" @@ -1675,29 +1728,17 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" -[[package]] -name = "scratch" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddccb15bcce173023b3fedd9436f882a0739b8dfb45e4f6b6002bee5929f61b2" - [[package]] name = "seahash" version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" -[[package]] -name = "semver" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e25dfac463d778e353db5be2449d1cce89bd6fd23c9f1ea21310ce6e5a1b29c4" - [[package]] name = "serde" -version = "1.0.150" +version = "1.0.171" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e326c9ec8042f1b5da33252c8a37e9ffbd2c9bef0155215b6e6c80c790e05f91" +checksum = "30e27d1e4fd7659406c492fd6cfaf2066ba8773de45ca75e855590f856dc34a9" dependencies = [ "serde_derive", ] @@ -1714,20 +1755,20 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.150" +version = "1.0.171" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42a3df25b0713732468deadad63ab9da1f1fd75a48a15024b50363f128db627e" +checksum = "389894603bd18c46fa56231694f8d827779c0951a667087194cf9de94ed24682" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.26", ] [[package]] name = "serde_json" -version = "1.0.91" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877c235533714907a8c2464236f5c4b2a17262ef1bd71f38f35ea592c8da6883" +checksum = "d03b412469450d4404fe8499a268edd7f8b79fecb074b0d812ad64ca21f4031b" dependencies = [ "itoa", "ryu", @@ -1748,28 +1789,17 @@ dependencies = [ [[package]] name = "serde_yaml" -version = "0.9.14" +version = "0.9.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d232d893b10de3eb7258ff01974d6ee20663d8e833263c99409d4b13a0209da" +checksum = "da6075b41c7e3b079e5f246eb6094a44850d3a4c25a67c581c80796c80134012" dependencies = [ - "indexmap", + "indexmap 2.0.0", "itoa", "ryu", "serde", "unsafe-libyaml", ] -[[package]] -name = "sha-1" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - [[package]] name = "sha1" version = "0.10.5" @@ -1783,9 +1813,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" dependencies = [ "cfg-if", "cpufeatures", @@ -1794,24 +1824,29 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" dependencies = [ "libc", ] [[package]] -name = "simple_logger" -version = "4.0.0" +name = "simdutf8" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e190a521c2044948158666916d9e872cbb9984f755e9bb3b5b75a836205affcd" +checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" + +[[package]] +name = "simple_logger" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2230cd5c29b815c9b699fb610b49a5ed65588f3509d9f0108be3a885da629333" dependencies = [ - "atty", "colored", "log", - "time 0.3.17", - "windows-sys", + "time 0.3.23", + "windows-sys 0.42.0", ] [[package]] @@ -1822,35 +1857,51 @@ checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" [[package]] name = "slab" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" +checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" dependencies = [ "autocfg", ] [[package]] name = "smallvec" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" +checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" [[package]] name = "socket2" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" +checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" dependencies = [ "libc", "winapi", ] +[[package]] +name = "socket2" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877" +dependencies = [ + "libc", + "windows-sys 0.48.0", +] + [[package]] name = "spin" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + [[package]] name = "static_assertions" version = "1.1.0" @@ -1859,9 +1910,9 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "stringprep" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ee348cb74b87454fff4b551cbf727025810a004f88aeacae7f85b87f4e9a1c1" +checksum = "db3737bde7edce97102e0e2b15365bf7a20bfdb5f60f4f9e8d7004258a51a8da" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -1869,15 +1920,15 @@ dependencies = [ [[package]] name = "subtle" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "syn" -version = "1.0.107" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", @@ -1885,52 +1936,46 @@ dependencies = [ ] [[package]] -name = "tempfile" -version = "3.3.0" +name = "syn" +version = "2.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" +checksum = "45c3457aacde3c65315de5031ec191ce46604304d2446e803d71ade03308d970" dependencies = [ - "cfg-if", - "fastrand", - "libc", - "redox_syscall", - "remove_dir_all", - "winapi", + "proc-macro2", + "quote", + "unicode-ident", ] [[package]] -name = "termcolor" -version = "1.1.3" +name = "tap" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" -dependencies = [ - "winapi-util", -] +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "termtree" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95059e91184749cb66be6dc994f67f182b6d897cb3df74a5bf66b5e709295fd8" +checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" [[package]] name = "thiserror" -version = "1.0.38" +version = "1.0.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" +checksum = "a35fc5b8971143ca348fa6df4f024d4d55264f3468c71ad1c2f365b0a4d58c42" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.38" +version = "1.0.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" +checksum = "463fe12d7993d3b327787537ce8dd4dfa058de32fc2b195ef3cde03dc4771e8f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.26", ] [[package]] @@ -1946,9 +1991,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.17" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a561bf4617eebd33bca6434b988f39ed798e527f51a1e797d0ee4f61c0a38376" +checksum = "59e399c068f43a5d116fedaf73b203fa4f9c519f17e2b34f63221d3792f81446" dependencies = [ "itoa", "libc", @@ -1960,15 +2005,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" +checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" [[package]] name = "time-macros" -version = "0.2.6" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d967f99f534ca7e495c575c62638eebc2898a8c84c119b89e250477bc4ba16b2" +checksum = "96ba15a897f3c86766b757e5ac7221554c6750054d74d5b28844fce5fb36a6c4" dependencies = [ "time-core", ] @@ -1984,45 +2029,45 @@ dependencies = [ [[package]] name = "tinyvec_macros" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.23.0" +version = "1.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eab6d665857cc6ca78d6e80303a02cea7a7851e85dfbd77cbdc09bd129f1ef46" +checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" dependencies = [ "autocfg", + "backtrace", "bytes", "libc", - "memchr", "mio", "num_cpus", "pin-project-lite", "signal-hook-registry", - "socket2", + "socket2 0.4.9", "tokio-macros", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] name = "tokio-macros" -version = "1.8.2" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8" +checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.26", ] [[package]] name = "tokio-postgres" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29a12c1b3e0704ae7dfc25562629798b29c72e6b1d0a681b6f29ab4ae5e7f7bf" +checksum = "6e89f6234aa8fd43779746012fcf53603cdb91fdd8399aa0de868c2d56b6dde1" dependencies = [ "async-trait", "byteorder", @@ -2037,7 +2082,7 @@ dependencies = [ "pin-project-lite", "postgres-protocol", "postgres-types", - "socket2", + "socket2 0.5.3", "tokio", "tokio-util", ] @@ -2059,9 +2104,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.11" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d660770404473ccd7bc9f8b28494a811bc18542b915c0855c51e8f419d5223ce" +checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" dependencies = [ "futures-core", "pin-project-lite", @@ -2083,9 +2128,9 @@ dependencies = [ [[package]] name = "tokio-tungstenite" -version = "0.17.2" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f714dd15bead90401d77e04243611caec13726c2408afd5b31901dfcdcb3b181" +checksum = "54319c93411147bced34cb5609a80e0a8e44c5999c93903a81cd866630ec0bfd" dependencies = [ "futures-util", "log", @@ -2095,9 +2140,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.4" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb2e075f03b3d66d8d8785356224ba688d2906a371015e225beeb65ca92c740" +checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" dependencies = [ "bytes", "futures-core", @@ -2136,24 +2181,24 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" dependencies = [ "once_cell", ] [[package]] name = "try-lock" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" +checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" [[package]] name = "tungstenite" -version = "0.17.3" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e27992fd6a8c29ee7eef28fc78349aa244134e10ad447ce3b9f0ac0ed0fa4ce0" +checksum = "30ee6ab729cd4cf0fd55218530c4522ed30b7b6081752839b68fcec8d0960788" dependencies = [ "base64 0.13.1", "byteorder", @@ -2162,21 +2207,12 @@ dependencies = [ "httparse", "log", "rand", - "sha-1", + "sha1", "thiserror", "url", "utf-8", ] -[[package]] -name = "twoway" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59b11b2b5241ba34be09c3cc85a36e56e48f9888862e19cedf23336d35316ed1" -dependencies = [ - "memchr", -] - [[package]] name = "typenum" version = "1.16.0" @@ -2194,15 +2230,15 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.8" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] name = "unicode-ident" -version = "1.0.5" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "unicode-normalization" @@ -2213,17 +2249,11 @@ dependencies = [ "tinyvec", ] -[[package]] -name = "unicode-width" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" - [[package]] name = "unsafe-libyaml" -version = "0.2.4" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1e5fa573d8ac5f1a856f8d7be41d390ee973daf97c806b2c1a465e4e1406e68" +checksum = "f28467d3e1d3c6586d8f25fa243f544f5800fec42d97032474e17222c2b75cfa" [[package]] name = "untrusted" @@ -2233,12 +2263,12 @@ checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" [[package]] name = "url" -version = "2.3.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" dependencies = [ "form_urlencoded", - "idna 0.3.0", + "idna", "percent-encoding", ] @@ -2250,9 +2280,9 @@ checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" [[package]] name = "uuid" -version = "1.2.2" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "422ee0de9031b5b948b97a8fc04e3aa35230001a722ddd27943e0be31564ce4c" +checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d" dependencies = [ "getrandom", "serde", @@ -2260,11 +2290,11 @@ dependencies = [ [[package]] name = "validator" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32ad5bf234c7d3ad1042e5252b7eddb2c4669ee23f32c7dd0e9b7705f07ef591" +checksum = "b92f40481c04ff1f4f61f304d61793c7b56ff76ac1469f1beb199b1445b253bd" dependencies = [ - "idna 0.2.3", + "idna", "lazy_static", "regex", "serde", @@ -2281,19 +2311,18 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "want" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" dependencies = [ - "log", "try-lock", ] [[package]] name = "warp" -version = "0.3.3" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed7b8be92646fc3d18b06147664ebc5f48d222686cb11a8755e561a735aacc6d" +checksum = "ba431ef570df1287f7f8b07e376491ad54f84d26ac473489427231e1718e1f69" dependencies = [ "bytes", "futures-channel", @@ -2304,7 +2333,7 @@ dependencies = [ "log", "mime", "mime_guess", - "multipart", + "multer", "percent-encoding", "pin-project", "rustls-pemfile", @@ -2334,9 +2363,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.83" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" +checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -2344,24 +2373,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.83" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" +checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn", + "syn 2.0.26", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.83" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" +checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2369,28 +2398,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.83" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" +checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.26", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.83" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" +checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" [[package]] name = "web-sys" -version = "0.3.60" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f" +checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" dependencies = [ "js-sys", "wasm-bindgen", @@ -2412,80 +2441,155 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" -[[package]] -name = "winapi-util" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" -dependencies = [ - "winapi", -] - [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +dependencies = [ + "windows-targets", +] + [[package]] name = "windows-sys" version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" 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", + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" +dependencies = [ + "windows_aarch64_gnullvm 0.48.0", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", + "windows_x86_64_gnullvm 0.48.0", + "windows_x86_64_msvc 0.48.0", ] [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.0" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" [[package]] name = "windows_aarch64_msvc" -version = "0.42.0" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" [[package]] name = "windows_i686_gnu" -version = "0.42.0" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" [[package]] name = "windows_i686_msvc" -version = "0.42.0" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" [[package]] name = "windows_x86_64_gnu" -version = "0.42.0" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.0" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" [[package]] name = "windows_x86_64_msvc" -version = "0.42.0" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] [[package]] name = "zeroize" -version = "1.5.7" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" +checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" diff --git a/ansi/src/lib.rs b/ansi/src/lib.rs index 106579b..e272e79 100644 --- a/ansi/src/lib.rs +++ b/ansi/src/lib.rs @@ -183,7 +183,6 @@ impl<'l> Iterator for AnsiIterator<'l> { } _ => continue, } - drop(st); return Some(AnsiEvent::<'l>( AnsiParseToken::ControlSeq(&self.input[i0..(imax + 1)]), self.state.clone(), diff --git a/blastmud_game/src/db.rs b/blastmud_game/src/db.rs index 047c2bb..7f6e871 100644 --- a/blastmud_game/src/db.rs +++ b/blastmud_game/src/db.rs @@ -3,7 +3,7 @@ use crate::message_handler::ListenerSession; use crate::models::{ consent::{Consent, ConsentType}, corp::{Corp, CorpCommType, CorpId, CorpMembership}, - item::{Item, LocationActionType}, + item::{Item, ItemFlag, LocationActionType}, session::Session, task::{Task, TaskParse}, user::User, @@ -297,6 +297,7 @@ pub struct ItemSearchParams<'l> { pub include_all_players: bool, pub item_type_only: Option<&'l str>, pub item_action_type_only: Option<&'l LocationActionType>, + pub flagged_only: Option, pub limit: u8, pub dead_first: bool, } @@ -314,6 +315,7 @@ impl ItemSearchParams<'_> { limit: 100, item_type_only: None, item_action_type_only: None, + flagged_only: None, } } } @@ -717,6 +719,33 @@ impl DBTrans { .collect()) } + pub async fn find_items_by_location_possession_type_excluding<'a>( + self: &'a Self, + location: &'a str, + possession_type: &'a PossessionType, + exclude_codes: &'a Vec<&'a str>, + ) -> DResult>> { + Ok(self + .pg_trans()? + .query( + "SELECT details FROM items WHERE details->>'location' = $1 AND \ + details->'possession_type' = $2 AND NOT \ + ($3::JSONB @> (details->'item_code')) \ + ORDER BY details->>'display' \ + LIMIT 100", + &[ + &location, + &serde_json::to_value(possession_type)?, + &serde_json::to_value(exclude_codes)?, + ], + ) + .await? + .into_iter() + .filter_map(|i| serde_json::from_value(i.get("details")).ok()) + .map(Arc::new) + .collect()) + } + pub async fn find_item_by_location_dynroom_code<'a>( self: &'a Self, location: &'a str, @@ -878,6 +907,16 @@ impl DBTrans { } } + let flagged_only_value: Option = match search.flagged_only.as_ref() { + None => None, + Some(v) => Some(serde_json::to_value(v)?), + }; + if let Some(flag) = flagged_only_value.as_ref() { + extra_where.push_str(&format!(" AND details->'flags' @> (${}::JSONB)", param_no)); + param_no += 1; + params.push(flag); + } + if search.include_contents { ctes.push(format!("contents AS (\ SELECT details, details->'aliases' AS aliases FROM items WHERE details->>'location' = ${}\ @@ -890,6 +929,7 @@ impl DBTrans { ctes.push(format!("loc_contents AS (\ SELECT details, details->'aliases' AS aliases FROM items WHERE details->>'location' = ${}\ )", param_no)); + #[allow(dropping_copy_types)] drop(param_no); // or increment if this is a problem. params.push(&player_loc); include_tables.push("SELECT details, aliases FROM loc_contents"); diff --git a/blastmud_game/src/message_handler/user_commands.rs b/blastmud_game/src/message_handler/user_commands.rs index aee175b..030d07d 100644 --- a/blastmud_game/src/message_handler/user_commands.rs +++ b/blastmud_game/src/message_handler/user_commands.rs @@ -41,6 +41,7 @@ mod list; pub mod load; mod login; mod look; +pub mod make; mod map; pub mod movement; pub mod open; @@ -188,6 +189,7 @@ static REGISTERED_COMMANDS: UserVerbRegistry = phf_map! { "gm" => map::VERB, "gmap" => map::VERB, + "make" => make::VERB, "open" => open::VERB, "p" => page::VERB, diff --git a/blastmud_game/src/message_handler/user_commands/agree.rs b/blastmud_game/src/message_handler/user_commands/agree.rs index bf729bd..d0c8c87 100644 --- a/blastmud_game/src/message_handler/user_commands/agree.rs +++ b/blastmud_game/src/message_handler/user_commands/agree.rs @@ -114,14 +114,12 @@ impl UserVerb for Verb { let user = user_mut(ctx)?; match user.terms.last_presented_term.as_ref() { None => { - drop(user); user_error("There was nothing pending your agreement.".to_owned())?; } Some(last_term) => { user.terms .accepted_terms .insert(last_term.to_owned(), Utc::now()); - drop(user); if check_and_notify_accepts(ctx).await? { ctx.trans .queue_for_session( diff --git a/blastmud_game/src/message_handler/user_commands/allow.rs b/blastmud_game/src/message_handler/user_commands/allow.rs index 631f74b..3bd9112 100644 --- a/blastmud_game/src/message_handler/user_commands/allow.rs +++ b/blastmud_game/src/message_handler/user_commands/allow.rs @@ -263,7 +263,7 @@ fn compute_new_consent_state( if Some(&new_consent) == their_target_consent.as_ref() { match new_consent.fight_consent.as_mut() { None => (), - Some(mut m) => { + Some(m) => { m.pending_change = None; m.status = ConsentStatus::Active; } @@ -285,7 +285,7 @@ fn compute_new_consent_state( None => { match new_consent.fight_consent.as_mut() { None => (), - Some(mut m) => { + Some(m) => { m.status = ConsentStatus::PendingAdd; } } diff --git a/blastmud_game/src/message_handler/user_commands/buy.rs b/blastmud_game/src/message_handler/user_commands/buy.rs index 063a8c0..b7f76e8 100644 --- a/blastmud_game/src/message_handler/user_commands/buy.rs +++ b/blastmud_game/src/message_handler/user_commands/buy.rs @@ -67,7 +67,7 @@ impl UserVerb for Verb { .any(|al| al.starts_with(&match_item)) { if offset_remaining <= 1 { - if let Some(mut user) = ctx.user_dat.as_mut() { + if let Some(user) = ctx.user_dat.as_mut() { if user.credits < stock.list_price { user_error( "You don't have enough credits to buy that!".to_owned(), @@ -96,7 +96,14 @@ impl UserVerb for Verb { here already" .to_owned(), )?, - _ => &player_item.location, + _ => { + ctx.trans.queue_for_session( + &ctx.session, + Some( + "It's too much for you to carry so you leave it on the ground.\n") + ).await?; + &player_item.location + } } } _ => &player_item_str, diff --git a/blastmud_game/src/message_handler/user_commands/follow.rs b/blastmud_game/src/message_handler/user_commands/follow.rs index 890a4d7..d47f381 100644 --- a/blastmud_game/src/message_handler/user_commands/follow.rs +++ b/blastmud_game/src/message_handler/user_commands/follow.rs @@ -108,7 +108,7 @@ pub async fn update_follow_for_failed_movement( } pub fn suspend_follow_for_independent_move(player: &mut Item) { - if let Some(mut following) = player.following.as_mut() { + if let Some(following) = player.following.as_mut() { following.state = FollowState::IfSameRoom; } } diff --git a/blastmud_game/src/message_handler/user_commands/get.rs b/blastmud_game/src/message_handler/user_commands/get.rs index c37ba33..2215de7 100644 --- a/blastmud_game/src/message_handler/user_commands/get.rs +++ b/blastmud_game/src/message_handler/user_commands/get.rs @@ -8,7 +8,7 @@ use crate::{ queue_command, QueueCommand, QueueCommandHandler, QueuedCommandContext, }, services::{ - capacity::{check_item_capacity, CapacityLevel}, + capacity::{check_item_capacity, recalculate_container_weight, CapacityLevel}, comms::broadcast_to_room, }, static_content::possession_type::possession_data, @@ -123,7 +123,7 @@ impl QueueCommandHandler for QueueHandler { "You try to get it, but your ghostly hands slip through it uselessly".to_owned(), )?; } - let item = match ctx.command { + let (item, container_opt) = match ctx.command { QueueCommand::Get { possession_id } => { let item = match ctx .trans @@ -158,7 +158,7 @@ impl QueueCommandHandler for QueueHandler { Some(&msg_nonexp), ) .await?; - item + (item, None) } QueueCommand::GetFromContainer { from_possession_id, @@ -210,7 +210,7 @@ impl QueueCommandHandler for QueueHandler { Some(&msg_nonexp), ) .await?; - item + (item, Some(container)) } _ => user_error("Unexpected command".to_owned())?, }; @@ -235,7 +235,7 @@ impl QueueCommandHandler for QueueHandler { user_error(format!( "{} You can't get {} because it is too heavy!", if explicit { "Fuck!" } else { "Rats!" }, - &ctx.item.display_for_sentence(explicit, 1, false) + &item.display_for_sentence(explicit, 1, false) ))? } _ => (), @@ -245,6 +245,10 @@ impl QueueCommandHandler for QueueHandler { item_mut.location = ctx.item.refstr(); item_mut.action_type = LocationActionType::Normal; ctx.trans.save_item_model(&item_mut).await?; + + if let Some(container) = container_opt { + recalculate_container_weight(&ctx.trans, &container).await?; + } Ok(()) } } diff --git a/blastmud_game/src/message_handler/user_commands/hire.rs b/blastmud_game/src/message_handler/user_commands/hire.rs index da2f1de..5bba30c 100644 --- a/blastmud_game/src/message_handler/user_commands/hire.rs +++ b/blastmud_game/src/message_handler/user_commands/hire.rs @@ -200,7 +200,7 @@ impl UserVerb for Verb { )?; } - let mut user_mut = get_user_or_fail_mut(ctx)?; + let user_mut = get_user_or_fail_mut(ctx)?; user_mut.credits -= hire_dat.price; ctx.trans diff --git a/blastmud_game/src/message_handler/user_commands/inventory.rs b/blastmud_game/src/message_handler/user_commands/inventory.rs index 773a2d1..9d6e52b 100644 --- a/blastmud_game/src/message_handler/user_commands/inventory.rs +++ b/blastmud_game/src/message_handler/user_commands/inventory.rs @@ -2,7 +2,6 @@ use super::{get_player_item_or_fail, UResult, UserVerb, UserVerbRef, VerbContext use crate::{ language::weight, models::item::{Item, LocationActionType}, - static_content::possession_type::{possession_data, PossessionType}, }; use async_trait::async_trait; use itertools::Itertools; @@ -46,28 +45,18 @@ impl UserVerb for Verb { if item.item_type != "possession" { continue; } - if let Some(posdat) = possession_data().get( - &item - .possession_type - .as_ref() - .unwrap_or(&PossessionType::AntennaWhip), - ) { - total += items.len() as u64 * posdat.weight; - response.push_str(&format!( - "{} [{}]{}\n", - item.display_for_sentence( - !ctx.session_dat.less_explicit_mode, - items.len(), - true - ), - weight(items.len() as u64 * posdat.weight), - match item.action_type { - LocationActionType::Worn => " (worn)", - LocationActionType::Wielded => " (wielded)", - _ => "", - } - )); - } + let it_total = items.iter().map(|it| it.weight).sum(); + total += it_total; + response.push_str(&format!( + "{} [{}]{}\n", + item.display_for_sentence(!ctx.session_dat.less_explicit_mode, items.len(), true), + weight(it_total), + match item.action_type { + LocationActionType::Worn => " (worn)", + LocationActionType::Wielded => " (wielded)", + _ => "", + } + )); } response.push_str(&format!( "Total weight: {} ({} max)\n", diff --git a/blastmud_game/src/message_handler/user_commands/look.rs b/blastmud_game/src/message_handler/user_commands/look.rs index ffb44be..15298a0 100644 --- a/blastmud_game/src/message_handler/user_commands/look.rs +++ b/blastmud_game/src/message_handler/user_commands/look.rs @@ -10,10 +10,10 @@ use crate::{ db::ItemSearchParams, language, models::item::{DoorState, Item, ItemFlag, ItemSpecialData, LocationActionType, Subattack}, - services::combat::max_health, + services::{combat::max_health, skills::calc_level_gap}, static_content::{ dynzone, - possession_type::possession_data, + possession_type::{possession_data, recipe_craft_by_recipe}, room::{self, Direction}, species::{species_info_map, SpeciesType}, }, @@ -25,7 +25,11 @@ use mockall_double::double; use std::collections::BTreeSet; use std::sync::Arc; -pub async fn describe_normal_item(ctx: &VerbContext<'_>, item: &Item) -> UResult<()> { +pub async fn describe_normal_item( + player_item: &Item, + ctx: &VerbContext<'_>, + item: &Item, +) -> UResult<()> { let mut contents_desc = String::new(); let mut items = ctx @@ -238,6 +242,72 @@ pub async fn describe_normal_item(ctx: &VerbContext<'_>, item: &Item) -> UResult }; contents_desc.push_str(&format!("It has {} {} left.\n", item.charges, unit)); } + + if let Some(recipe_craft_data) = item + .possession_type + .as_ref() + .and_then(|pt| recipe_craft_by_recipe().get(pt)) + { + contents_desc.push_str("You will need:\n"); + for (input_pt, count) in &recipe_craft_data.craft_data.inputs.iter().counts() { + if let Some(pd) = possession_data().get(&input_pt) { + let thing = if ctx.session_dat.less_explicit_mode { + pd.display_less_explicit.unwrap_or(pd.display) + } else { + pd.display + }; + contents_desc.push_str(&format!( + " {} {}\n", + count, + &(if count != &1 { + language::pluralise(thing) + } else { + thing.to_owned() + }) + )); + } + } + match recipe_craft_data.bench.as_ref() { + None => contents_desc.push_str("You can make this without any special bench.\n"), + Some(bench) => { + if let Some(pd) = possession_data().get(bench) { + contents_desc.push_str(&format!( + "You'll need to make this on a {}.\n", + if ctx.session_dat.less_explicit_mode { + pd.display_less_explicit.unwrap_or(pd.display) + } else { + pd.display + } + )) + } + } + } + let diff = calc_level_gap( + &player_item, + &recipe_craft_data.craft_data.skill, + recipe_craft_data.craft_data.difficulty, + ); + let challenge_level = if diff > 5.0 { + "You are rather unlikely to succeed in making this." + } else if diff >= 4.0 { + "You're not that likely to succeed in making this, and you're likely to be too confused to learn anything making it." + } else if diff >= 3.0 { + "You've got about a 1/4 chance to succeed at making this, and you might learn something making it." + } else if diff >= 2.0 { + "You've got about a 1/3 chance to succeed at making this, and you might learn something making it." + } else if diff >= 0.0 { + "You've got a less than 50/50 chance to succeed at making this, and you'll probably learn a lot." + } else if diff >= -2.0 { + "You've got a better than 50/50 chance to succeed at making this, and you'll probably learn a lot." + } else if diff >= -3.0 { + "Three out of four times, you'll succeed at making this, and you might still learn something." + } else if diff >= -4.0 { + "Most of the time, you'll succeed at making this, but you'll only rarely learn something new." + } else { + "You're highly likely to succeed at making this, but unlikely to learn anything new." + }; + contents_desc.push_str(&format!("{}\n", challenge_level)); + } } ctx.trans @@ -568,7 +638,11 @@ impl UserVerb for Verb { ) -> UResult<()> { let player_item = get_player_item_or_fail(ctx).await?; - let rem_trim = remaining.trim().to_lowercase(); + let mut rem_trim = remaining.trim().to_lowercase(); + let rem_orig = rem_trim.clone(); + if rem_trim.starts_with("in ") { + rem_trim = rem_trim[3..].trim_start().to_owned(); + } let use_location = if player_item.death_data.is_some() { "room/repro_xv_respawn" } else { @@ -582,37 +656,58 @@ impl UserVerb for Verb { .find_item_by_type_code(heretype, herecode) .await? .ok_or_else(|| UserError("Sorry, that no longer exists".to_owned()))? - } else if let Some(dir) = Direction::parse(&rem_trim) { - match is_door_in_direction(&ctx.trans, &dir, use_location).await? { - DoorSituation::NoDoor - | DoorSituation::DoorOutOfRoom { + } else if let Some(dir) = + Direction::parse(&rem_trim).or_else(|| Direction::parse(&rem_orig)) + { + // This is complex because "in" is overloaded, and if this fails, we want + // to also consider if they are looking in a container. + match is_door_in_direction(&ctx.trans, &dir, use_location).await { + Ok(DoorSituation::NoDoor) + | Ok(DoorSituation::DoorOutOfRoom { state: DoorState { open: true, .. }, .. - } - | DoorSituation::DoorIntoRoom { + }) + | Ok(DoorSituation::DoorIntoRoom { state: DoorState { open: true, .. }, .. - } => {} - DoorSituation::DoorIntoRoom { + }) + | Err(UserError(_)) => {} + Ok(DoorSituation::DoorIntoRoom { state, room_with_door, .. - } => { + }) => { if let Some(rev_dir) = dir.reverse() { return describe_door(ctx, &room_with_door, &state, &rev_dir).await; } } - DoorSituation::DoorOutOfRoom { + Ok(DoorSituation::DoorOutOfRoom { state, room_with_door, .. - } => { + }) => { return describe_door(ctx, &room_with_door, &state, &dir).await; } + Err(e) => Err(e)?, + } + match direction_to_item(&ctx.trans, use_location, &dir).await { + Ok(Some(item)) => item, + Ok(None) | Err(UserError(_)) => search_item_for_user( + &ctx, + &ItemSearchParams { + include_contents: true, + include_loc_contents: true, + limit: 1, + ..ItemSearchParams::base(&player_item, &rem_trim) + }, + ) + .await + .map_err(|e| match e { + UserError(_) => UserError("There's nothing in that direction".to_owned()), + e => e, + })?, + Err(e) => Err(e)?, } - direction_to_item(&ctx.trans, use_location, &dir) - .await? - .ok_or_else(|| UserError("There's nothing in that direction".to_owned()))? } else if rem_trim == "me" || rem_trim == "self" { player_item.clone() } else { @@ -652,7 +747,7 @@ impl UserVerb for Verb { ) .await?; } else { - describe_normal_item(ctx, &item).await?; + describe_normal_item(&player_item, ctx, &item).await?; } Ok(()) } diff --git a/blastmud_game/src/message_handler/user_commands/make.rs b/blastmud_game/src/message_handler/user_commands/make.rs new file mode 100644 index 0000000..409c94b --- /dev/null +++ b/blastmud_game/src/message_handler/user_commands/make.rs @@ -0,0 +1,452 @@ +use super::{ + get_player_item_or_fail, search_item_for_user, user_error, ItemSearchParams, UResult, + UserError, UserVerb, UserVerbRef, VerbContext, +}; +use crate::{ + models::item::{Item, ItemFlag}, + regular_tasks::queued_command::{ + queue_command_and_save, QueueCommand, QueueCommandHandler, QueuedCommandContext, + }, + services::{ + comms::broadcast_to_room, + destroy_container, + skills::{crit_fail_penalty_for_skill, skill_check_and_grind}, + }, + static_content::possession_type::{ + possession_data, recipe_craft_by_recipe, CraftData, PossessionType, + }, +}; +use async_trait::async_trait; +use std::time; +use std::{collections::BTreeSet, sync::Arc}; + +// This is written this way for future expansion to dynamic recipes. +async fn get_craft_data_for_instructions<'l>(instructions: &'l Item) -> UResult> { + // For now, only static recipes, so we just fetch them... + Ok(instructions + .possession_type + .as_ref() + .and_then(|pt| recipe_craft_by_recipe().get(pt)) + .map(|rcd| rcd.craft_data.clone())) +} + +pub struct QueueHandler; +#[async_trait] +impl QueueCommandHandler for QueueHandler { + async fn start_command(&self, ctx: &mut QueuedCommandContext<'_>) -> UResult { + if ctx.item.death_data.is_some() { + user_error("The dead aren't very good at making stuff.".to_owned())?; + } + let (bench_id_opt, instructions_id) = match ctx.command { + QueueCommand::Make { + ref bench_possession_id, + ref instructions_possession_id, + .. + } => ( + bench_possession_id.as_ref().map(|s| s.as_str()), + instructions_possession_id, + ), + _ => user_error("Unexpected command".to_owned())?, + }; + + let (expected_location, bench_opt) = match bench_id_opt { + None => (ctx.item.location.clone(), None), + Some(bench_id) => { + let bench = ctx + .trans + .find_item_by_type_code("possession", bench_id) + .await? + .ok_or_else(|| { + UserError( + "Hmm, you can't find the equipment you were planning to use!" + .to_owned(), + ) + })?; + if bench.location != ctx.item.location { + user_error( + "Hmm, you can't find the equipment you were planning to use!".to_owned(), + )?; + } + (bench.refstr(), Some(bench)) + } + }; + + let instructions = ctx + .trans + .find_item_by_type_code("possession", instructions_id) + .await? + .ok_or_else(|| { + UserError( + "Hmm, you can't find the instructions you were planning to follow!".to_owned(), + ) + })?; + if instructions.location != expected_location { + user_error( + "Hmm, you can't find the instructions you were planning to follow!".to_owned(), + )?; + } + + let mut msg_exp = format!( + "{} starts fiddling around trying to make something", + &ctx.item.display_for_sentence(true, 1, true) + ); + let mut msg_nonexp = format!( + "{} starts fiddling around trying to make something", + &ctx.item.display_for_sentence(false, 1, true) + ); + + match bench_opt { + None => {} + Some(bench) => { + msg_exp.push_str(&format!( + " on {}", + bench.display_for_sentence(true, 1, false) + )); + msg_nonexp.push_str(&format!( + " on {}", + bench.display_for_sentence(false, 1, false) + )); + } + } + msg_exp.push_str(".\n"); + msg_nonexp.push_str(".\n"); + + broadcast_to_room( + &ctx.trans, + &ctx.item.location, + None, + &msg_exp, + Some(&msg_nonexp), + ) + .await?; + + Ok(time::Duration::from_secs(1)) + } + + async fn finish_command(&self, ctx: &mut QueuedCommandContext<'_>) -> UResult<()> { + let (bench_id_opt, instructions_id, already_used) = match ctx.command { + QueueCommand::Make { + ref bench_possession_id, + ref instructions_possession_id, + ref already_used, + } => ( + bench_possession_id.as_ref().map(|s| s.as_str()), + instructions_possession_id, + already_used, + ), + _ => user_error("Unexpected command".to_owned())?, + }; + + let (expected_location, bench_opt) = match bench_id_opt { + None => (ctx.item.location.clone(), None), + Some(bench_id) => { + let bench = ctx + .trans + .find_item_by_type_code("possession", bench_id) + .await? + .ok_or_else(|| { + UserError( + "Hmm, you can't find the equipment you were planning to use!" + .to_owned(), + ) + })?; + if bench.location != ctx.item.location { + user_error( + "Hmm, you can't find the equipment you were planning to use!".to_owned(), + )?; + } + (bench.refstr(), Some(bench)) + } + }; + + let instructions = ctx + .trans + .find_item_by_type_code("possession", instructions_id) + .await? + .ok_or_else(|| { + UserError( + "Hmm, you can't find the instructions you were planning to follow!".to_owned(), + ) + })?; + if instructions.location != expected_location { + user_error( + "Hmm, you can't find the instructions you were planning to follow!".to_owned(), + )?; + } + + if let Some(bench) = bench_opt.as_ref() { + if let Some(bench_data) = bench + .possession_type + .as_ref() + .and_then(|pt| possession_data().get(pt)) + .and_then(|pd| pd.bench_data) + { + bench_data + .check_make(&ctx.trans, bench, &instructions) + .await?; + } + } + + let (on_what_exp, on_what_nonexp) = match bench_opt { + None => ("".to_owned(), "".to_owned()), + Some(bench) => ( + format!(" on {}", bench.display_for_sentence(true, 1, false)), + format!(" on {}", bench.display_for_sentence(false, 1, false)), + ), + }; + + let craft_data = get_craft_data_for_instructions(&instructions) + .await? + .ok_or_else(|| UserError("Looks like you can't make that anymore.".to_owned()))?; + let mut ingredients_left: Vec = craft_data.inputs.clone(); + + let mut to_destroy_if_success: Vec> = Vec::new(); + for item_id in already_used.iter() { + let item = ctx + .trans + .find_item_by_type_code("possession", &item_id) + .await? + .ok_or_else(|| UserError("Item used in crafting not found.".to_owned()))?; + to_destroy_if_success.push(item.clone()); + let possession_type = item + .possession_type + .as_ref() + .ok_or_else(|| UserError("Item used in crafting not a possession.".to_owned()))?; + if let Some(match_pos) = ingredients_left.iter().position(|pt| pt == possession_type) { + ingredients_left.remove(match_pos); + } + } + + let session = if ctx.item.item_type == "player" { + ctx.trans + .find_session_for_player(&ctx.item.item_code) + .await? + } else { + None + }; + let explicit = session + .as_ref() + .map(|s| !s.1.less_explicit_mode) + .unwrap_or(false); + + match ingredients_left.iter().next() { + None => { + for item in to_destroy_if_success { + destroy_container(&ctx.trans, &item).await?; + } + let mut new_item: Item = craft_data.output.clone().into(); + new_item.item_code = ctx.trans.alloc_item_code().await?.to_string(); + new_item.location = expected_location.clone(); + ctx.trans.create_item(&new_item).await?; + broadcast_to_room( + &ctx.trans, + &ctx.item.location, + None, + &format!( + "{} makes a {}{}.\n", + &ctx.item.display_for_sentence(true, 1, true), + &new_item.display_for_sentence(true, 1, false), + &on_what_exp + ), + Some(&format!( + "{} makes a {}{}.\n", + &ctx.item.display_for_sentence(false, 1, true), + &new_item.display_for_sentence(false, 1, false), + &on_what_nonexp + )), + ) + .await?; + } + Some(possession_type) => { + let addable = ctx + .trans + .find_items_by_location_possession_type_excluding( + expected_location.as_str(), + possession_type, + &already_used.iter().map(|v| v.as_str()).collect(), + ) + .await?; + + let pd = possession_data().get(&possession_type).ok_or_else(|| { + UserError( + "Looks like something needed to make that is something I know nothing about!".to_owned(), + ) + })?; + + match addable.iter().next() { + None => user_error(format!( + "You realise you'd need {}.", + if explicit { + pd.display + } else { + pd.display_less_explicit.unwrap_or(pd.display) + } + ))?, + Some(item) => { + let skill_result = skill_check_and_grind( + &ctx.trans, + ctx.item, + &craft_data.skill, + craft_data.difficulty, + ) + .await?; + if skill_result <= -0.5 { + crit_fail_penalty_for_skill(&ctx.trans, ctx.item, &craft_data.skill) + .await?; + ctx.trans + .delete_item(&item.item_type, &item.item_code) + .await?; + if let Some((sess, _)) = session { + ctx.trans + .queue_for_session( + &sess, + Some(&format!( + "You try adding {}, but it goes badly and you waste it.\n", + &item.display_for_sentence(explicit, 1, false) + )), + ) + .await?; + } + } else if skill_result <= 0.0 { + if let Some((sess, _)) = session { + ctx.trans + .queue_for_session( + &sess, + Some(&format!( + "You try and fail at adding {}.\n", + &item.display_for_sentence(explicit, 1, false) + )), + ) + .await?; + } + } else { + if let Some((sess, _)) = session { + ctx.trans + .queue_for_session( + &sess, + Some(&format!( + "You try adding {}.\n", + &item.display_for_sentence(explicit, 1, false), + )), + ) + .await?; + } + let mut new_already_used = (*already_used).clone(); + new_already_used.insert(item.item_code.clone()); + + ctx.item.queue.push_front(QueueCommand::Make { + bench_possession_id: bench_id_opt.map(|id| id.to_owned()), + instructions_possession_id: instructions_id.to_string(), + already_used: new_already_used, + }); + } + } + } + } + } + Ok(()) + } +} + +pub struct Verb; +#[async_trait] +impl UserVerb for Verb { + async fn handle( + self: &Self, + ctx: &mut VerbContext, + _verb: &str, + remaining: &str, + ) -> UResult<()> { + let rtrim = remaining.trim(); + let player_item = get_player_item_or_fail(ctx).await?; + + if player_item.death_data.is_some() { + user_error("The dead aren't very good at making stuff.".to_owned())?; + } + + let (bench, output) = match rtrim.split_once(" on ") { + None => (None, rtrim), + Some((output_str, bench_str)) => { + let bench = search_item_for_user( + ctx, + &ItemSearchParams { + item_type_only: Some("possession"), + include_loc_contents: true, + ..ItemSearchParams::base(&player_item, bench_str.trim()) + }, + ) + .await?; + (Some(bench), output_str.trim()) + } + }; + + let instructions = search_item_for_user( + ctx, + &ItemSearchParams { + item_type_only: Some("possession"), + include_contents: true, + flagged_only: Some(ItemFlag::Instructions), + ..ItemSearchParams::base(bench.as_ref().unwrap_or(&player_item), output.trim()) + }, + ) + .await?; + + let recipe_craft = instructions + .possession_type + .as_ref() + .and_then(|pt| recipe_craft_by_recipe().get(&pt)) + .ok_or_else(|| { + UserError( + "Sorry, those instructions no longer seem to form part of the game!".to_owned(), + ) + })?; + + match (recipe_craft.bench.as_ref(), bench.as_ref()) { + (Some(bench_type), None) => user_error(format!( + "The {} can only be made on the {}.", + &instructions.display_for_session(&ctx.session_dat), + possession_data() + .get(bench_type) + .map(|pd| if ctx.session_dat.less_explicit_mode { + pd.display_less_explicit.unwrap_or(pd.display) + } else { + pd.display + }) + .unwrap_or("bench") + ))?, + (Some(bench_type), Some(bench)) + if bench.possession_type.as_ref() != Some(bench_type) => + { + user_error(format!( + "The {} can only be made on the {}.", + &instructions.display_for_session(&ctx.session_dat), + possession_data() + .get(bench_type) + .map(|pd| { + if ctx.session_dat.less_explicit_mode { + pd.display_less_explicit.unwrap_or(pd.display) + } else { + pd.display + } + }) + .unwrap_or("bench") + ))? + } + _ => {} + } + + queue_command_and_save( + ctx, + &player_item, + &QueueCommand::Make { + bench_possession_id: bench.as_ref().map(|b| b.item_code.clone()), + instructions_possession_id: instructions.item_code.clone(), + already_used: BTreeSet::::new(), + }, + ) + .await?; + Ok(()) + } +} +static VERB_INT: Verb = Verb; +pub static VERB: UserVerbRef = &VERB_INT as UserVerbRef; diff --git a/blastmud_game/src/message_handler/user_commands/movement.rs b/blastmud_game/src/message_handler/user_commands/movement.rs index a1f24f8..68c9d59 100644 --- a/blastmud_game/src/message_handler/user_commands/movement.rs +++ b/blastmud_game/src/message_handler/user_commands/movement.rs @@ -306,7 +306,7 @@ pub async fn handle_fall(trans: &DBTrans, faller: &mut Item, fall_dist: u64) -> // Returns false if the move failed. async fn attempt_move_immediate( direction: &Direction, - mut ctx: &mut QueuedCommandContext<'_>, + ctx: &mut QueuedCommandContext<'_>, source: &MovementSource, ) -> UResult { let use_location = if ctx.item.death_data.is_some() { diff --git a/blastmud_game/src/message_handler/user_commands/open.rs b/blastmud_game/src/message_handler/user_commands/open.rs index 4215977..b07ce1c 100644 --- a/blastmud_game/src/message_handler/user_commands/open.rs +++ b/blastmud_game/src/message_handler/user_commands/open.rs @@ -59,7 +59,7 @@ impl TaskHandler for SwingShutHandler { }; let mut room_item_mut = (*room_item).clone(); - let mut door_state = match room_item_mut + let door_state = match room_item_mut .door_states .as_mut() .and_then(|ds| ds.get_mut(&direction)) diff --git a/blastmud_game/src/message_handler/user_commands/put.rs b/blastmud_game/src/message_handler/user_commands/put.rs index 70f4428..e5c98a0 100644 --- a/blastmud_game/src/message_handler/user_commands/put.rs +++ b/blastmud_game/src/message_handler/user_commands/put.rs @@ -3,7 +3,7 @@ use super::{ user_error, ItemSearchParams, UResult, UserError, UserVerb, UserVerbRef, VerbContext, }; use crate::{ - models::item::LocationActionType, + models::item::{ItemFlag, LocationActionType}, regular_tasks::queued_command::{ queue_command, QueueCommand, QueueCommandHandler, QueuedCommandContext, }, @@ -215,7 +215,7 @@ impl UserVerb for Verb { remaining = remaining2; } - let (search_what, for_what) = match remaining.split_once(" in ") { + let (into_what, for_what) = match remaining.split_once(" in ") { None => { user_error(ansi!("Try put item in container").to_owned())? } @@ -256,15 +256,58 @@ impl UserVerb for Verb { .iter() .filter(|t| t.action_type.is_visible_in_look()) { + if target.item_type == into_what.item_type && target.item_code == into_what.item_code { + user_error( + "You briefly ponder whether something can contain itself, but it blows your mind and you give up.".to_owned() + )?; + } if target.item_type != "possession" { user_error("You can't put that in something!".to_owned())?; } + did_anything = true; + + if into_what.flags.contains(&ItemFlag::Bench) && target.flags.contains(&ItemFlag::Book) + { + let pages = ctx.trans.find_items_by_location(&target.refstr()).await?; + if !pages.is_empty() { + ctx.trans + .queue_for_session(&ctx.session, + Some( + &format!("For ease of later use, you decide to rip the pages out of {} before placing them in {}.\n", + &target.display_for_session(&ctx.session_dat), + &into_what.display_for_session(&ctx.session_dat)), + ) + ).await?; + for page in pages { + queue_command( + ctx, + &mut player_item_mut, + &QueueCommand::GetFromContainer { + from_possession_id: target.item_code.clone(), + get_possession_id: page.item_code.clone(), + }, + ) + .await?; + queue_command( + ctx, + &mut player_item_mut, + &QueueCommand::Put { + container_possession_id: into_what.item_code.clone(), + target_possession_id: page.item_code.clone(), + }, + ) + .await?; + } + continue; + } + } + queue_command( ctx, &mut player_item_mut, &QueueCommand::Put { - container_possession_id: search_what.item_code.clone(), + container_possession_id: into_what.item_code.clone(), target_possession_id: target.item_code.clone(), }, ) diff --git a/blastmud_game/src/models/item.rs b/blastmud_game/src/models/item.rs index 1918ebd..a32767b 100644 --- a/blastmud_game/src/models/item.rs +++ b/blastmud_game/src/models/item.rs @@ -261,6 +261,9 @@ pub enum ItemFlag { Hireable, NPCsDontAttack, CanLoad, + Bench, + Book, + Instructions, } #[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, Ord, PartialOrd)] diff --git a/blastmud_game/src/regular_tasks/queued_command.rs b/blastmud_game/src/regular_tasks/queued_command.rs index e6b2872..abb5c2d 100644 --- a/blastmud_game/src/regular_tasks/queued_command.rs +++ b/blastmud_game/src/regular_tasks/queued_command.rs @@ -2,7 +2,7 @@ use super::{TaskHandler, TaskRunContext}; #[double] use crate::db::DBTrans; use crate::message_handler::user_commands::{ - close, cut, drop, get, improvise, movement, open, put, remove, use_cmd, user_error, wear, + close, cut, drop, get, improvise, make, movement, open, put, remove, use_cmd, user_error, wear, wield, CommandHandlingError, UResult, VerbContext, }; use crate::message_handler::ListenerSession; @@ -67,6 +67,11 @@ pub enum QueueCommand { from_possession_id: String, get_possession_id: String, }, + Make { + bench_possession_id: Option, + instructions_possession_id: String, + already_used: BTreeSet, + }, Movement { direction: Direction, source: MovementSource, @@ -109,6 +114,7 @@ impl QueueCommand { Drop { .. } => "Drop", Get { .. } => "Get", GetFromContainer { .. } => "GetFromContainer", + Make { .. } => "Make", Movement { .. } => "Movement", OpenDoor { .. } => "OpenDoor", Put { .. } => "Put", @@ -181,6 +187,10 @@ fn queue_command_registry( "GetFromContainer", &get::QueueHandler as &(dyn QueueCommandHandler + Sync + Send), ), + ( + "Make", + &make::QueueHandler as &(dyn QueueCommandHandler + Sync + Send), + ), ( "Movement", &movement::QueueHandler as &(dyn QueueCommandHandler + Sync + Send), diff --git a/blastmud_game/src/services.rs b/blastmud_game/src/services.rs index f31cad5..61a38f2 100644 --- a/blastmud_game/src/services.rs +++ b/blastmud_game/src/services.rs @@ -1,10 +1,17 @@ #[double] use crate::db::DBTrans; use crate::{ - message_handler::user_commands::drop::consider_expire_job_for_item, - models::consent::{Consent, ConsentStatus, ConsentType}, + message_handler::user_commands::{drop::consider_expire_job_for_item, user_error, UResult}, models::item::Item, - static_content::npc::npc_by_code, + models::{ + consent::{Consent, ConsentStatus, ConsentType}, + item::ItemSpecialData, + }, + static_content::{ + dynzone::{dynzone_by_type, DynzoneType}, + npc::npc_by_code, + room::room_map_by_code, + }, DResult, }; use mockall_double::double; @@ -117,3 +124,28 @@ pub async fn destroy_container(trans: &DBTrans, container: &Item) -> DResult<()> .await?; Ok(()) } + +pub fn require_power(item: &Item) -> UResult<()> { + let result = match item.item_type.as_str() { + "room" => room_map_by_code() + .get(item.item_code.as_str()) + .map(|r| r.has_power) + .unwrap_or(false), + "dynroom" => match &item.special_data { + Some(ItemSpecialData::DynroomData { + dynzone_code, + dynroom_code, + }) => DynzoneType::from_str(dynzone_code.as_str()) + .and_then(|dzt| dynzone_by_type().get(&dzt)) + .and_then(|dz| dz.dyn_rooms.get(dynroom_code.as_str())) + .map(|dr| dr.has_power) + .unwrap_or(false), + _ => false, + }, + _ => false, + }; + if !result { + user_error("That would require power, and it looks like wireless power distribution is not available here.".to_owned())?; + } + Ok(()) +} diff --git a/blastmud_game/src/services/combat.rs b/blastmud_game/src/services/combat.rs index 0ab6efd..45ed4a7 100644 --- a/blastmud_game/src/services/combat.rs +++ b/blastmud_game/src/services/combat.rs @@ -54,7 +54,7 @@ pub async fn soak_damage( let mut total_damage = 0.0; for (damage_type, mut damage_amount) in &damage_by_type { - for mut clothing in &mut clothes { + for clothing in &mut clothes { if let Some(soak) = clothing .possession_type .as_ref() diff --git a/blastmud_game/src/services/comms.rs b/blastmud_game/src/services/comms.rs index 67a0286..a9e53a3 100644 --- a/blastmud_game/src/services/comms.rs +++ b/blastmud_game/src/services/comms.rs @@ -1,24 +1,32 @@ -use crate::{ - DResult, - models::item::Item, -}; +#[double] +use crate::db::DBTrans; +use crate::{models::item::Item, DResult}; use mockall_double::double; -#[double] use crate::db::DBTrans; -pub async fn broadcast_to_room(trans: &DBTrans, location: &str, from_item: Option<&Item>, - message_explicit_ok: &str, message_nonexplicit: Option<&str>) -> DResult<()> { +pub async fn broadcast_to_room( + trans: &DBTrans, + location: &str, + from_item: Option<&Item>, + message_explicit_ok: &str, + message_nonexplicit: Option<&str>, +) -> DResult<()> { for item in trans.find_items_by_location(location).await? { if item.item_type != "player" || item.death_data.is_some() { continue; } - if let Some((session, session_dat)) = trans.find_session_for_player(&item.item_code).await? { - if session_dat.less_explicit_mode && Some(&item.item_code) != from_item.map(|i| &i.item_code) { + if let Some((session, session_dat)) = trans.find_session_for_player(&item.item_code).await? + { + if session_dat.less_explicit_mode + && Some(&item.item_code) != from_item.map(|i| &i.item_code) + { if let Some(msg) = message_nonexplicit { trans.queue_for_session(&session, Some(msg)).await?; } return Ok(()); } - trans.queue_for_session(&session, Some(message_explicit_ok)).await?; + trans + .queue_for_session(&session, Some(message_explicit_ok)) + .await?; } } Ok(()) diff --git a/blastmud_game/src/services/effect.rs b/blastmud_game/src/services/effect.rs index 6a0d6e0..863883f 100644 --- a/blastmud_game/src/services/effect.rs +++ b/blastmud_game/src/services/effect.rs @@ -1,41 +1,29 @@ +use super::{combat::change_health, comms::broadcast_to_room}; +#[double] +use crate::db::DBTrans; use crate::{ models::{ item::Item, - task::{ - Task, - TaskMeta, - TaskDetails, - } + task::{Task, TaskDetails, TaskMeta}, }, - + regular_tasks::{TaskHandler, TaskRunContext}, + static_content::possession_type::UseEffect, DResult, - static_content::{ - possession_type::UseEffect, - }, - regular_tasks::{ - TaskHandler, - TaskRunContext, - } -}; -use super::{ - comms::broadcast_to_room, - combat::change_health, }; use async_trait::async_trait; -use std::time; -use serde::{Serialize, Deserialize}; -use std::collections::{BTreeMap, VecDeque}; use chrono::Utc; use log::info; use mockall_double::double; -#[double] use crate::db::DBTrans; +use serde::{Deserialize, Serialize}; +use std::collections::{BTreeMap, VecDeque}; +use std::time; #[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, Ord, PartialOrd)] pub struct DelayedHealthEffect { magnitude: i64, delay: u64, message: String, - message_nonexp: String + message_nonexp: String, } pub struct DelayedHealthTaskHandler; @@ -43,70 +31,109 @@ pub struct DelayedHealthTaskHandler; impl TaskHandler for DelayedHealthTaskHandler { async fn do_task(&self, ctx: &mut TaskRunContext) -> DResult> { let ref mut item_effect_series = match &mut ctx.task.details { - TaskDetails::DelayedHealth { item, ref mut effect_series } => (item, effect_series), - _ => Err("Expected DelayedHealth type")? + TaskDetails::DelayedHealth { + item, + ref mut effect_series, + } => (item, effect_series), + _ => Err("Expected DelayedHealth type")?, }; let (item_type, item_code) = match item_effect_series.0.split_once("/") { None => { - info!("Invalid item {} to DelayedHealthTaskHandler", item_effect_series.0); + info!( + "Invalid item {} to DelayedHealthTaskHandler", + item_effect_series.0 + ); return Ok(None); } - Some((item_type, item_code)) => (item_type, item_code) + Some((item_type, item_code)) => (item_type, item_code), }; - let item = match ctx.trans.find_item_by_type_code(item_type, item_code).await? { + let item = match ctx + .trans + .find_item_by_type_code(item_type, item_code) + .await? + { None => { return Ok(None); } - Some(it) => it + Some(it) => it, }; if item.death_data.is_some() { return Ok(None); } match item_effect_series.1.pop_front() { None => Ok(None), - Some(DelayedHealthEffect { magnitude, message, message_nonexp, .. }) => { + Some(DelayedHealthEffect { + magnitude, + message, + message_nonexp, + .. + }) => { let mut item_mut = (*item).clone(); - change_health(ctx.trans, magnitude, &mut item_mut, &message, &message_nonexp).await?; + change_health( + ctx.trans, + magnitude, + &mut item_mut, + &message, + &message_nonexp, + ) + .await?; ctx.trans.save_item_model(&item_mut).await?; - Ok(item_effect_series.1.front().map(|it| time::Duration::from_secs(it.delay))) + Ok(item_effect_series + .1 + .front() + .map(|it| time::Duration::from_secs(it.delay))) } } } } -pub static DELAYED_HEALTH_HANDLER: &'static (dyn TaskHandler + Sync + Send) = &DelayedHealthTaskHandler; +pub static DELAYED_HEALTH_HANDLER: &'static (dyn TaskHandler + Sync + Send) = + &DelayedHealthTaskHandler; pub async fn run_effects( - trans: &DBTrans, effects: &Vec, + trans: &DBTrans, + effects: &Vec, player: &mut Item, item: &Item, // None if target is player target: &mut Option, level: f64, - task_ref: &str + task_ref: &str, ) -> DResult<()> { let mut target_health_series = BTreeMap::>::new(); for effect in effects { match effect { UseEffect::BroadcastMessage { messagef } => { - let (msg_exp, msg_nonexp) = messagef(player, item, target.as_ref().unwrap_or(player)); - broadcast_to_room(trans, &player.location, None, &msg_exp, - Some(&msg_nonexp)).await?; - }, - UseEffect::ChangeTargetHealth { delay_secs, base_effect, skill_multiplier, max_effect, - message } => { + let (msg_exp, msg_nonexp) = + messagef(player, item, target.as_ref().unwrap_or(player)); + broadcast_to_room(trans, &player.location, None, &msg_exp, Some(&msg_nonexp)) + .await?; + } + UseEffect::ChangeTargetHealth { + delay_secs, + base_effect, + skill_multiplier, + max_effect, + message, + } => { let health_impact = (*base_effect + ((skill_multiplier * level) as i64).min(*max_effect)) as i64; let (msg, msg_nonexp) = message(target.as_ref().unwrap_or(player)); if *delay_secs == 0 { - change_health(trans, health_impact, target.as_mut().unwrap_or(player), &msg, - &msg_nonexp).await?; + change_health( + trans, + health_impact, + target.as_mut().unwrap_or(player), + &msg, + &msg_nonexp, + ) + .await?; } else { let target_it = target.as_ref().unwrap_or(player); let fx = DelayedHealthEffect { magnitude: health_impact, delay: *delay_secs, message: msg, - message_nonexp: msg_nonexp + message_nonexp: msg_nonexp, }; target_health_series .entry(format!("{}/{}", target_it.item_type, target_it.item_code)) @@ -118,17 +145,19 @@ pub async fn run_effects( } for (eff_item, l) in target_health_series.into_iter() { - trans.upsert_task(&Task { - meta: TaskMeta { - task_code: format!("{}/{}", eff_item, task_ref), - next_scheduled: Utc::now() + chrono::Duration::seconds(l[0].delay as i64), - ..Default::default() - }, - details: TaskDetails::DelayedHealth { - effect_series: l, - item: eff_item, - } - }).await?; + trans + .upsert_task(&Task { + meta: TaskMeta { + task_code: format!("{}/{}", eff_item, task_ref), + next_scheduled: Utc::now() + chrono::Duration::seconds(l[0].delay as i64), + ..Default::default() + }, + details: TaskDetails::DelayedHealth { + effect_series: l, + item: eff_item, + }, + }) + .await?; } Ok(()) diff --git a/blastmud_game/src/services/skills.rs b/blastmud_game/src/services/skills.rs index 5e1239a..795df52 100644 --- a/blastmud_game/src/services/skills.rs +++ b/blastmud_game/src/services/skills.rs @@ -388,7 +388,7 @@ pub async fn skill_check_and_grind( // If the skill gap is 1, probability of learning is 0.4 (20% less), and so on (exponential decrease). const LAMBDA: f64 = -0.2231435513142097; // log 0.8 if who.item_type == "player" - && rand::thread_rng().gen::() < 0.5 * (LAMBDA * (gap as f64)).exp() + && rand::thread_rng().gen::() < 0.5 * (LAMBDA * (gap.abs() as f64)).exp() { if let Some((sess, _sess_dat)) = trans.find_session_for_player(&who.item_code).await? { if let Some(mut user) = trans.find_by_username(&who.item_code).await? { diff --git a/blastmud_game/src/static_content/dynzone.rs b/blastmud_game/src/static_content/dynzone.rs index b2adbed..32784df 100644 --- a/blastmud_game/src/static_content/dynzone.rs +++ b/blastmud_game/src/static_content/dynzone.rs @@ -3,32 +3,33 @@ // dynamically. They can dynamically connect to the grid. // Apartments, planes, and boats are all expected to be specific instances of dynzones. use super::room::{Direction, GridCoords}; +#[double] +use crate::db::DBTrans; use crate::{ message_handler::user_commands::{user_error, UResult}, - models::item::{Item, ItemFlag, ItemSpecialData, DynamicEntrance, DoorState} + models::item::{DoorState, DynamicEntrance, Item, ItemFlag, ItemSpecialData}, }; +use mockall_double::double; use once_cell::sync::OnceCell; use std::collections::BTreeMap; -use mockall_double::double; -#[double] use crate::db::DBTrans; mod cokmurl_apartment; #[derive(Eq, Clone, PartialEq, Ord, PartialOrd, Debug)] pub enum DynzoneType { - CokMurlApartment + CokMurlApartment, } impl DynzoneType { pub fn from_str(i: &str) -> Option { match i { "CokMurlApartment" => Some(DynzoneType::CokMurlApartment), - _ => None + _ => None, } } pub fn to_str(&self) -> &'static str { match self { - DynzoneType::CokMurlApartment => "CokMurlApartment" + DynzoneType::CokMurlApartment => "CokMurlApartment", } } } @@ -43,43 +44,51 @@ pub struct Dynzone { impl Dynzone { // Returns None if there is already an instance in the same exit direction. - pub async fn create_instance(&self, trans: &DBTrans, connect_where: &str, dup_message: &str, - new_owner: &Item, new_exit_direction: &Direction) -> UResult { + pub async fn create_instance( + &self, + trans: &DBTrans, + connect_where: &str, + dup_message: &str, + new_owner: &Item, + new_exit_direction: &Direction, + ) -> UResult { // Check exit not taken... - if trans.find_exact_dyn_exit(connect_where, new_exit_direction).await?.is_some() { + if trans + .find_exact_dyn_exit(connect_where, new_exit_direction) + .await? + .is_some() + { user_error(dup_message.to_string())?; } let owner = format!("{}/{}", &new_owner.item_type, &new_owner.item_code); - + let code = format!("{}", &trans.alloc_item_code().await?); - trans.create_item( - &Item { + trans + .create_item(&Item { item_type: "dynzone".to_owned(), item_code: code.clone(), display: self.zonename.to_owned(), - special_data: Some( - ItemSpecialData::DynzoneData { - zone_exit: Some(connect_where.to_owned()), - vacate_after: None - } - ), + special_data: Some(ItemSpecialData::DynzoneData { + zone_exit: Some(connect_where.to_owned()), + vacate_after: None, + }), owner: Some(owner.clone()), location: format!("dynzone/{}", &code), ..Default::default() - } - ).await?; + }) + .await?; let mut should_connect = true; for (_, room) in &self.dyn_rooms { let roomcode = format!("{}/{}", &code, room.subcode); - let will_connect = should_connect && - room.exits.iter().any(|r| match r.target { + let will_connect = should_connect + && room.exits.iter().any(|r| match r.target { ExitTarget::ExitZone => true, - _ => false + _ => false, }); should_connect &= !will_connect; - trans.create_item( - &Item { + trans + .create_item(&Item { item_type: "dynroom".to_owned(), item_code: roomcode, display: room.name.to_owned(), @@ -88,31 +97,41 @@ impl Dynzone { location: format!("dynzone/{}", &code), special_data: Some(ItemSpecialData::DynroomData { dynzone_code: self.zonetype.to_str().to_owned(), - dynroom_code: room.subcode.to_owned() + dynroom_code: room.subcode.to_owned(), }), dynamic_entrance: if will_connect { Some(DynamicEntrance { direction: new_exit_direction.clone(), - source_item: connect_where.to_owned() + source_item: connect_where.to_owned(), }) - } else { None }, + } else { + None + }, flags: room.item_flags.clone(), owner: Some(owner.clone()), - door_states: Some(room.exits.iter() - .filter_map(|ex| - if let ExitType::Doored { description } = ex.exit_type { - Some((ex.direction.clone(), DoorState { - open: false, - description: description.to_owned() - })) - } else { - None - }).collect()), + door_states: Some( + room.exits + .iter() + .filter_map(|ex| { + if let ExitType::Doored { description } = ex.exit_type { + Some(( + ex.direction.clone(), + DoorState { + open: false, + description: description.to_owned(), + }, + )) + } else { + None + } + }) + .collect(), + ), ..Default::default() - } - ).await?; + }) + .await?; } - + Ok(format!("dynzone/{}", &code)) } } @@ -161,6 +180,7 @@ pub struct Dynroom { pub should_caption: bool, pub item_flags: Vec, pub grid_coords: GridCoords, + pub has_power: bool, } impl Default for Dynroom { @@ -171,55 +191,61 @@ impl Default for Dynroom { short: "XX", description: "A generic room", description_less_explicit: None, - exits: vec!(), + exits: vec![], should_caption: false, - item_flags: vec!(), + item_flags: vec![], grid_coords: GridCoords { x: 0, y: 0, z: 0 }, + has_power: true, } } } pub fn dynzone_list() -> &'static Vec { static CELL: OnceCell> = OnceCell::new(); - CELL.get_or_init( - || vec!( - cokmurl_apartment::zone() - ) - ) + CELL.get_or_init(|| vec![cokmurl_apartment::zone()]) } pub fn dynzone_by_type() -> &'static BTreeMap<&'static DynzoneType, Dynzone> { static CELL: OnceCell> = OnceCell::new(); - CELL.get_or_init( - || dynzone_list().iter().map(|z| (&z.zonetype, (*z).clone())).collect() - ) + CELL.get_or_init(|| { + dynzone_list() + .iter() + .map(|z| (&z.zonetype, (*z).clone())) + .collect() + }) } #[cfg(test)] mod test { + use super::super::room::Direction; + use super::{dynzone_list, DynzoneType, ExitTarget}; use itertools::Itertools; - use super::super::room::{Direction}; - use super::{dynzone_list, ExitTarget, DynzoneType}; #[test] fn dynzone_types_unique() { let mut sorted_list = dynzone_list().clone(); sorted_list.sort(); - assert_eq!(Vec::<(&DynzoneType, usize)>::new(), - sorted_list.iter() - .group_by(|v| &v.zonetype) - .into_iter() - .map(|v| (v.0, v.1.count())) - .filter(|v| v.1 > 1) - .collect::>() - ); + assert_eq!( + Vec::<(&DynzoneType, usize)>::new(), + sorted_list + .iter() + .group_by(|v| &v.zonetype) + .into_iter() + .map(|v| (v.0, v.1.count())) + .filter(|v| v.1 > 1) + .collect::>() + ); } #[test] fn dynroom_codes_match_struct() { for dynzone in dynzone_list() { assert_eq!( - dynzone.dyn_rooms.iter().filter(|v| *v.0 != v.1.subcode) - .map(|v| *v.0).collect::>(), + dynzone + .dyn_rooms + .iter() + .filter(|v| *v.0 != v.1.subcode) + .map(|v| *v.0) + .collect::>(), Vec::<&str>::new() ); } @@ -228,25 +254,39 @@ mod test { #[test] fn dynzone_has_dynroom() { for dynzone in dynzone_list() { - assert_ne!(0, dynzone.dyn_rooms.len(), "# rooms in zone {}", - dynzone.zonetype.to_str()) + assert_ne!( + 0, + dynzone.dyn_rooms.len(), + "# rooms in zone {}", + dynzone.zonetype.to_str() + ) } } - + #[test] fn dynroom_exits_subcodes_exists() { for dynzone in dynzone_list() { for dynroom in dynzone.dyn_rooms.iter() { - let exits = dynroom.1.exits.iter().filter( - |ex| - if let ExitTarget::Intrazone { subcode } = ex.target { - !dynzone.dyn_rooms.iter().any(|r| r.1.subcode == subcode) - } else { - false - }).map(|ex| &ex.direction).collect::>(); - assert_eq!(Vec::<&Direction>::new(), exits, - "exits to invalid subcode in room {} in zone {}", dynroom.0, - dynzone.zonetype.to_str()); + let exits = dynroom + .1 + .exits + .iter() + .filter(|ex| { + if let ExitTarget::Intrazone { subcode } = ex.target { + !dynzone.dyn_rooms.iter().any(|r| r.1.subcode == subcode) + } else { + false + } + }) + .map(|ex| &ex.direction) + .collect::>(); + assert_eq!( + Vec::<&Direction>::new(), + exits, + "exits to invalid subcode in room {} in zone {}", + dynroom.0, + dynzone.zonetype.to_str() + ); } } } diff --git a/blastmud_game/src/static_content/dynzone/cokmurl_apartment.rs b/blastmud_game/src/static_content/dynzone/cokmurl_apartment.rs index c2e334d..1adf6a8 100644 --- a/blastmud_game/src/static_content/dynzone/cokmurl_apartment.rs +++ b/blastmud_game/src/static_content/dynzone/cokmurl_apartment.rs @@ -1,14 +1,6 @@ -use super::{ - Dynzone, - DynzoneType, - Dynroom, - Exit, - ExitTarget, - ExitType, - super::room::GridCoords -}; -use crate::static_content::room::Direction; +use super::{super::room::GridCoords, Dynroom, Dynzone, DynzoneType, Exit, ExitTarget, ExitType}; use crate::models::item::ItemFlag; +use crate::static_content::room::Direction; pub fn zone() -> Dynzone { Dynzone { @@ -54,6 +46,7 @@ pub fn zone() -> Dynzone { ), grid_coords: GridCoords { x: 1, y: 0, z: 0 }, should_caption: true, + has_power: true, item_flags: vec!(ItemFlag::DroppedItemsDontExpire, ItemFlag::PrivatePlace), ..Default::default() diff --git a/blastmud_game/src/static_content/journals.rs b/blastmud_game/src/static_content/journals.rs index 9420d28..2ccceed 100644 --- a/blastmud_game/src/static_content/journals.rs +++ b/blastmud_game/src/static_content/journals.rs @@ -1,19 +1,16 @@ -use crate::{ - DResult, - models::{ - user::User, - item::Item, - journal::JournalType, - } -}; -use std::collections::{BTreeMap}; -use once_cell::sync::OnceCell; -use mockall_double::double; -#[double] use crate::db::DBTrans; -use log::warn; -use async_trait::async_trait; use super::species::SpeciesType; +#[double] +use crate::db::DBTrans; +use crate::{ + models::{item::Item, journal::JournalType, user::User}, + DResult, +}; +use async_trait::async_trait; use itertools::Itertools; +use log::warn; +use mockall_double::double; +use once_cell::sync::OnceCell; +use std::collections::BTreeMap; mod first_dog; @@ -31,7 +28,7 @@ pub trait JournalChecker { trans: &DBTrans, user: &mut User, player: &mut Item, - victim: &Item + victim: &Item, ) -> DResult; } @@ -39,7 +36,6 @@ pub struct JournalData { name: &'static str, details: &'static str, xp: u64, - } pub fn journal_types() -> &'static BTreeMap { @@ -55,34 +51,32 @@ pub fn journal_types() -> &'static BTreeMap { details: "dying for the first time. Fortunately, you can come back by recloning in to a fresh body, just with fewer credits, a bit less experience, and a bruised ego! All your stuff is still on your body, so better go find it, or give up on it.", xp: 150 }) - ).into_iter().collect()) + ).into_iter().collect()); } pub fn journal_checkers() -> &'static Vec<&'static (dyn JournalChecker + Sync + Send)> { static CHECKERS: OnceCell> = OnceCell::new(); - CHECKERS.get_or_init(|| vec!( - &first_dog::CHECKER - )) + CHECKERS.get_or_init(|| vec![&first_dog::CHECKER]) } -pub fn checkers_by_species() -> - &'static BTreeMap> -{ - static MAP: OnceCell>> = +pub fn checkers_by_species( +) -> &'static BTreeMap> { + static MAP: OnceCell>> = OnceCell::new(); MAP.get_or_init(|| { - let species_groups = journal_checkers().iter().flat_map( - |jc| - jc.kill_subscriptions().into_iter() - .filter_map(|sub| - match sub { - KillSubscriptionType::SpecificNPCSpecies { species } => - Some((species.clone(), jc.clone())), - _ => None - }) - ).group_by(|v| v.0.clone()); + let species_groups = journal_checkers() + .iter() + .flat_map(|jc| { + jc.kill_subscriptions() + .into_iter() + .filter_map(|sub| match sub { + KillSubscriptionType::SpecificNPCSpecies { species } => { + Some((species.clone(), *jc)) + } + _ => None, + }) + }) + .group_by(|v| v.0.clone()); species_groups .into_iter() .map(|(species, g)| (species, g.into_iter().map(|v| v.1).collect())) @@ -90,24 +84,22 @@ pub fn checkers_by_species() -> }) } -pub fn checkers_by_npc() -> - &'static BTreeMap<&'static str, - Vec<&'static (dyn JournalChecker + Sync + Send)>> -{ - static MAP: OnceCell>> = +pub fn checkers_by_npc( +) -> &'static BTreeMap<&'static str, Vec<&'static (dyn JournalChecker + Sync + Send)>> { + static MAP: OnceCell>> = OnceCell::new(); MAP.get_or_init(|| { - let npc_groups = journal_checkers().iter().flat_map( - |jc| - jc.kill_subscriptions().into_iter() - .filter_map(|sub| - match sub { - KillSubscriptionType::SpecificNPC { code } => - Some((code.clone(), jc.clone())), - _ => None - }) - ).group_by(|v| v.0.clone()); + let npc_groups = journal_checkers() + .iter() + .flat_map(|jc| { + jc.kill_subscriptions() + .into_iter() + .filter_map(|sub| match sub { + KillSubscriptionType::SpecificNPC { code } => Some((code.clone(), *jc)), + _ => None, + }) + }) + .group_by(|v| v.0.clone()); npc_groups .into_iter() .map(|(species, g)| (species, g.into_iter().map(|v| v.1).collect())) @@ -115,61 +107,81 @@ pub fn checkers_by_npc() -> }) } -pub async fn award_journal_if_needed(trans: &DBTrans, - user: &mut User, - player: &mut Item, - journal: JournalType) -> DResult { - if user.experience.journals.completed_journals.contains(&journal) { +pub async fn award_journal_if_needed( + trans: &DBTrans, + user: &mut User, + player: &mut Item, + journal: JournalType, +) -> DResult { + if user + .experience + .journals + .completed_journals + .contains(&journal) + { return Ok(false); } let journal_data = match journal_types().get(&journal) { None => { - warn!("Tried to award journal type {:#?} that doesn't exist.", &journal); + warn!( + "Tried to award journal type {:#?} that doesn't exist.", + &journal + ); return Ok(false); - }, - Some(v) => v + } + Some(v) => v, }; user.experience.journals.completed_journals.insert(journal); // Note: Not counted as 'change for this reroll' since it is permanent. player.total_xp += journal_data.xp; if let Some((sess, _)) = trans.find_session_for_player(&player.item_code).await? { - trans.queue_for_session( - &sess, - Some(&format!("Journal earned: {} - You earned {} XP for {}\n", - journal_data.name, journal_data.xp, journal_data.details) - )).await?; + trans + .queue_for_session( + &sess, + Some(&format!( + "Journal earned: {} - You earned {} XP for {}\n", + journal_data.name, journal_data.xp, journal_data.details + )), + ) + .await?; } Ok(true) } -pub async fn check_journal_for_kill(trans: &DBTrans, - player: &mut Item, - victim: &Item) -> DResult { +pub async fn check_journal_for_kill( + trans: &DBTrans, + player: &mut Item, + victim: &Item, +) -> DResult { if player.item_type != "player" { return Ok(false); } let mut user = match trans.find_by_username(&player.item_code).await? { None => return Ok(false), - Some(u) => u + Some(u) => u, }; let mut did_work = false; if let Some(checkers) = checkers_by_species().get(&victim.species) { for checker in checkers { - did_work = did_work || - checker.handle_kill(trans, &mut user, player, victim).await?; + did_work = did_work + || checker + .handle_kill(trans, &mut user, player, victim) + .await?; } } if let Some(checkers) = checkers_by_npc().get(victim.item_code.as_str()) { for checker in checkers { - did_work = did_work || - checker.handle_kill(trans, &mut user, player, victim).await?; + did_work = did_work + || checker + .handle_kill(trans, &mut user, player, victim) + .await?; } } - + if did_work { trans.save_user_model(&user).await?; } diff --git a/blastmud_game/src/static_content/journals/first_dog.rs b/blastmud_game/src/static_content/journals/first_dog.rs index 2ca0849..2415092 100644 --- a/blastmud_game/src/static_content/journals/first_dog.rs +++ b/blastmud_game/src/static_content/journals/first_dog.rs @@ -1,26 +1,21 @@ -use super::{JournalChecker, KillSubscriptionType, award_journal_if_needed}; +use super::{award_journal_if_needed, JournalChecker, KillSubscriptionType}; +#[double] +use crate::db::DBTrans; use crate::{ - DResult, + models::{item::Item, journal::JournalType, user::User}, static_content::species::SpeciesType, - models::{ - user::User, - item::Item, - journal::JournalType, - } + DResult, }; use async_trait::async_trait; use mockall_double::double; -#[double] use crate::db::DBTrans; pub struct FirstDogChecker; #[async_trait] impl JournalChecker for FirstDogChecker { fn kill_subscriptions(&self) -> Vec { - vec!( - KillSubscriptionType::SpecificNPCSpecies { - species: SpeciesType::Dog - } - ) + vec![KillSubscriptionType::SpecificNPCSpecies { + species: SpeciesType::Dog, + }] } async fn handle_kill( @@ -28,7 +23,7 @@ impl JournalChecker for FirstDogChecker { trans: &DBTrans, user: &mut User, player: &mut Item, - _victim: &Item + _victim: &Item, ) -> DResult { award_journal_if_needed(trans, user, player, JournalType::SlayedMeanDog).await } diff --git a/blastmud_game/src/static_content/possession_type.rs b/blastmud_game/src/static_content/possession_type.rs index efc41e8..041e839 100644 --- a/blastmud_game/src/static_content/possession_type.rs +++ b/blastmud_game/src/static_content/possession_type.rs @@ -1,16 +1,21 @@ +#[double] +use crate::db::DBTrans; use crate::{ message_handler::user_commands::{UResult, VerbContext}, models::consent::ConsentType, - models::item::{Item, Pronouns, SkillType}, + models::item::{Item, ItemFlag, Pronouns, SkillType}, regular_tasks::queued_command::QueuedCommandContext, static_content::{room::Direction, species::BodyPart}, }; use async_trait::async_trait; +use mockall_double::double; use once_cell::sync::OnceCell; use rand::seq::SliceRandom; use serde::{Deserialize, Serialize}; use std::collections::{BTreeMap, BTreeSet}; +mod bags; +mod benches; mod blade; mod books; mod corp_licence; @@ -256,6 +261,11 @@ impl ContainerCheck for PermissiveContainerCheck { } } +#[async_trait] +pub trait BenchData { + async fn check_make(&self, trans: &DBTrans, bench: &Item, recipe: &Item) -> UResult<()>; +} + pub struct ContainerData { pub max_weight: u64, pub base_weight: u64, @@ -293,8 +303,10 @@ pub struct PossessionData { pub sign_handler: Option<&'static (dyn ArglessHandler + Sync + Send)>, pub write_handler: Option<&'static (dyn WriteHandler + Sync + Send)>, pub can_butcher: bool, + pub bench_data: Option<&'static (dyn BenchData + Sync + Send)>, pub wear_data: Option, pub container_data: Option, + pub default_flags: Vec, } impl Default for PossessionData { @@ -316,8 +328,10 @@ impl Default for PossessionData { sign_handler: None, write_handler: None, can_butcher: false, + bench_data: None, wear_data: None, container_data: None, + default_flags: vec![], } } } @@ -346,7 +360,7 @@ impl WeaponAttackData { } } -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] pub enum PossessionType { // Special values that substitute for possessions. Fangs, // Default weapon for certain animals @@ -367,12 +381,18 @@ pub enum PossessionType { // Corporate NewCorpLicence, CertificateOfIncorporation, + // Storage + DuffelBag, // Security Scanlock, - // Crafting + // Food + GrilledSteak, + // Crafting inputs Steak, AnimalSkin, SeveredHead, + // Craft benches + KitchenStove, // Recipes CulinaryEssentials, GrilledSteakRecipe, @@ -395,6 +415,7 @@ impl Into for PossessionType { .collect(), health: possession_dat.max_health, weight: possession_dat.weight, + flags: possession_dat.default_flags.clone(), pronouns: Pronouns { is_proper: false, ..Pronouns::default_inanimate() @@ -446,6 +467,8 @@ pub fn possession_data() -> &'static BTreeMap &'static Vec { }) } +#[derive(PartialEq, Debug, Clone)] pub struct CraftData { pub skill: SkillType, pub difficulty: f64, @@ -516,6 +540,12 @@ pub struct CraftData { pub output: PossessionType, } +pub struct RecipeCraftData { + pub craft_data: CraftData, + pub recipe: PossessionType, + pub bench: Option, +} + pub fn improv_table() -> &'static Vec { static IMPROV_CELL: OnceCell> = OnceCell::new(); IMPROV_CELL.get_or_init(|| { @@ -563,6 +593,32 @@ pub fn improv_by_output() -> &'static BTreeMap &'static Vec { + static RECIPE_CELL: OnceCell> = OnceCell::new(); + RECIPE_CELL.get_or_init(|| { + vec![RecipeCraftData { + craft_data: CraftData { + skill: SkillType::Craft, + difficulty: 5.0, + inputs: vec![PossessionType::Steak], + output: PossessionType::GrilledSteak, + }, + recipe: PossessionType::GrilledSteakRecipe, + bench: Some(PossessionType::KitchenStove), + }] + }) +} + +pub fn recipe_craft_by_recipe() -> &'static BTreeMap { + static MAP_CELL: OnceCell> = OnceCell::new(); + MAP_CELL.get_or_init(|| { + recipe_craft_table() + .iter() + .map(|rcd| (rcd.recipe.clone(), rcd)) + .collect() + }) +} + #[cfg(test)] mod tests { use itertools::Itertools; @@ -624,6 +680,55 @@ mod tests { ); } + #[test] + fn every_improv_item_has_possession_data_for_inputs() { + assert_eq!( + improv_table() + .iter() + .flat_map(|cd| cd.inputs.iter()) + .filter_map(|inp| if possession_data().get(inp).is_none() { + Some(inp) + } else { + None + }) + .collect::>(), + Vec::<&'static PossessionType>::new() + ); + } + + #[test] + fn every_recipe_has_possession_data_for_output() { + assert_eq!( + recipe_craft_table() + .iter() + .filter_map( + |rcd| if possession_data().get(&rcd.craft_data.output).is_none() { + Some(&rcd.craft_data.output) + } else { + None + } + ) + .collect::>(), + Vec::<&'static PossessionType>::new() + ); + } + + #[test] + fn every_recipe_has_possession_data_for_inputs() { + assert_eq!( + recipe_craft_table() + .iter() + .flat_map(|rcd| rcd.craft_data.inputs.iter()) + .filter_map(|inp| if possession_data().get(inp).is_none() { + Some(inp) + } else { + None + }) + .collect::>(), + Vec::<&'static PossessionType>::new() + ); + } + #[test] fn container_weight_should_match_calculated_weight() { for (_pt, pd) in possession_data().iter() { diff --git a/blastmud_game/src/static_content/possession_type/bags.rs b/blastmud_game/src/static_content/possession_type/bags.rs new file mode 100644 index 0000000..675ae2f --- /dev/null +++ b/blastmud_game/src/static_content/possession_type/bags.rs @@ -0,0 +1,27 @@ +use super::{PossessionData, PossessionType}; +use crate::static_content::possession_type::ContainerData; +use once_cell::sync::OnceCell; + +pub fn data() -> &'static Vec<(PossessionType, PossessionData)> { + static D: OnceCell> = OnceCell::new(); + &D.get_or_init(|| { + vec![( + PossessionType::DuffelBag, + PossessionData { + display: "duffel bag", + aliases: vec!["bag"], + details: "A sturdy bag made from some kind of black synthetic-fibre fabric.\n\n\ + A single broad strap from one side to another looks like it is intended \ + to be carried across the shoulder. It looks like it can carry about 20 kgs \ + of stuff as easily as you could carry 14.4 kgs loose", + weight: 400, + container_data: Some(ContainerData { + base_weight: 400, + compression_ratio: 0.7, + ..Default::default() + }), + ..Default::default() + }, + )] + }) +} diff --git a/blastmud_game/src/static_content/possession_type/benches.rs b/blastmud_game/src/static_content/possession_type/benches.rs new file mode 100644 index 0000000..ed3f405 --- /dev/null +++ b/blastmud_game/src/static_content/possession_type/benches.rs @@ -0,0 +1,53 @@ +use super::{BenchData, PossessionData, PossessionType}; +#[double] +use crate::db::DBTrans; +use crate::{ + message_handler::user_commands::{UResult, UserError}, + models::item::{Item, ItemFlag}, + services::require_power, + static_content::possession_type::ContainerData, +}; +use ansi::ansi; +use async_trait::async_trait; +use mockall_double::double; +use once_cell::sync::OnceCell; + +struct NeedPowerBench; +static NEED_POWER_BENCH: NeedPowerBench = NeedPowerBench; + +#[async_trait] +impl BenchData for NeedPowerBench { + async fn check_make(&self, trans: &DBTrans, bench: &Item, _recipe: &Item) -> UResult<()> { + let (room_type, room_code) = bench + .location + .split_once("/") + .ok_or_else(|| UserError("You're in an invalid location!".to_owned()))?; + let room = trans + .find_item_by_type_code(room_type, room_code) + .await? + .ok_or_else(|| UserError("Your current room doesn't exist.".to_owned()))?; + Ok(require_power(&room)?) + } +} + +pub fn data() -> &'static Vec<(PossessionType, PossessionData)> { + static D: OnceCell> = OnceCell::new(); + &D.get_or_init(|| { + vec![( + PossessionType::KitchenStove, + PossessionData { + display: "kitchen stove", + aliases: vec!["stove"], + details: ansi!("A four-element electric stove, with an oven underneath, capable of cooking nutritious meals - or burning a careless amateur cook! [To use, try putting a recipe and the ingredients in it with the put command, and turning it on with the make command]"), + weight: 40000, + container_data: Some(ContainerData { + base_weight: 40000, + ..Default::default() + }), + bench_data: Some(&NEED_POWER_BENCH), + default_flags: vec![ItemFlag::Bench], + ..Default::default() + }, + )] + }) +} diff --git a/blastmud_game/src/static_content/possession_type/books.rs b/blastmud_game/src/static_content/possession_type/books.rs index 11112c3..ac45188 100644 --- a/blastmud_game/src/static_content/possession_type/books.rs +++ b/blastmud_game/src/static_content/possession_type/books.rs @@ -1,7 +1,7 @@ use super::{PossessionData, PossessionType}; use crate::{ message_handler::user_commands::{UResult, UserError}, - models::item::Item, + models::item::{Item, ItemFlag}, static_content::possession_type::{ContainerCheck, ContainerData}, }; use once_cell::sync::OnceCell; @@ -48,6 +48,7 @@ pub fn data() -> &'static Vec<(PossessionType, PossessionData)> { checker: &RECIPES_ONLY_CHECKER, ..Default::default() }), + default_flags: vec![ItemFlag::Book], ..Default::default() }), (PossessionType::GrilledSteakRecipe, @@ -56,6 +57,7 @@ pub fn data() -> &'static Vec<(PossessionType, PossessionData)> { aliases: vec!["grilled steak"], details: "Instructions for how to make a basic but mouthwatering steak", weight: 10, + default_flags: vec![ItemFlag::Instructions], ..Default::default() }), )) diff --git a/blastmud_game/src/static_content/possession_type/meat.rs b/blastmud_game/src/static_content/possession_type/meat.rs index 547c7a0..62bb2cc 100644 --- a/blastmud_game/src/static_content/possession_type/meat.rs +++ b/blastmud_game/src/static_content/possession_type/meat.rs @@ -32,5 +32,14 @@ pub fn data() -> &'static Vec<(PossessionType, PossessionData)> { ..Default::default() } ), + ( + PossessionType::GrilledSteak, + PossessionData { + display: "grilled steak", + details: "A mouth-wateringly grilled steak, its outer brown surface a perfect demonstration of the Maillard reaction, with a thin bit of fat adjoining the lean protein", + weight: 250, + ..Default::default() + } + ), )) } diff --git a/blastmud_game/src/static_content/room.rs b/blastmud_game/src/static_content/room.rs index 61305da..6fd99f2 100644 --- a/blastmud_game/src/static_content/room.rs +++ b/blastmud_game/src/static_content/room.rs @@ -321,6 +321,7 @@ pub struct Room { // What can be rented here... pub rentable_dynzone: Vec, pub material_type: MaterialType, + pub has_power: bool, } impl Default for Room { @@ -341,6 +342,7 @@ impl Default for Room { stock_list: vec![], rentable_dynzone: vec![], material_type: MaterialType::Normal, + has_power: false, } } } diff --git a/blastmud_game/src/static_content/room/melbs.rs b/blastmud_game/src/static_content/room/melbs.rs index 1c6777c..f8eea5c 100644 --- a/blastmud_game/src/static_content/room/melbs.rs +++ b/blastmud_game/src/static_content/room/melbs.rs @@ -6,3683 +6,3739 @@ use ansi::ansi; pub fn room_list() -> Vec { vec!( - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_kingst_latrobest", - name: "King Street & Latrobe St", - short: ansi!("##"), - description: "A wide road (5 lanes each way) intersects a narrower 3 lane road. Both have been rather poorly maintained. Potholes dot the ashphalt road", - description_less_explicit: None, - grid_coords: GridCoords { x: 1, y: -5, z: 0 }, - exits: vec!( - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_kingst_10", - name: "King Street - 10 block", - short: ansi!("||"), - description: "A wide road (5 lanes each way) that has been rather poorly maintained. Potholes dot the ashphalt road, while cracks line the footpaths on either side", - description_less_explicit: None, - grid_coords: GridCoords { x: 1, y: -4, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_kingst_20", - name: "King Street - 20 block", - short: ansi!("||"), - description: "A wide road (5 lanes each way) that has been rather poorly maintained. Potholes dot the ashphalt road, while cracks line the footpaths on either side", - description_less_explicit: None, - grid_coords: GridCoords { x: 1, y: -3, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_kingst_30", - name: "King Street - 30 block", - short: ansi!("||"), - description: "A wide road (5 lanes each way) that has been rather poorly maintained. Potholes dot the ashphalt road, while cracks line the footpaths on either side", - description_less_explicit: None, - grid_coords: GridCoords { x: 1, y: -2, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_kingst_lonsdalest", - name: "King Street & Lonsdale St", - short: ansi!("##"), - description: "A wide road (5 lanes each way) intersects a narrower 2 lane each way road. Both have been rather poorly maintained. Potholes dot the ashphalt road", - description_less_explicit: None, - grid_coords: GridCoords { x: 1, y: -1, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_kingst_40", - name: ansi!("King Street - 40 block"), - short: ansi!("||"), - description: ansi!( - "A wide road (5 lanes each way) that has been rather poorly maintained. Potholes dot the ashphalt road, while cracks line the footpaths on either side"), - description_less_explicit: None, - grid_coords: GridCoords { x: 1, y: 0, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_homelessshelter", - name: ansi!("Homeless Shelter"), - short: ansi!("HS"), - description: ansi!( - "A spartan room with row after row of plain beds. A thick mist from a fog machine means you can't see or hear much going on here, and no one can attack anyone. It looks like a safe place to log off if you have no better choice"), - description_less_explicit: None, - grid_coords: GridCoords { x: 2, y: 0, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - ), - should_caption: true, - item_flags: vec!(ItemFlag::NoSay, ItemFlag::NoSeeContents), - repel_npc: true, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!( - SecondaryZoneRecord { - zone: "repro_xv", - short: ansi!("EX"), - grid_coords: GridCoords { x: 1, y: 0, z: 0 }, - caption: Some("Melbs"), - } - ), - code: "melbs_kingst_50", - name: ansi!("King Street - 50 block"), - short: ansi!("||"), - description: ansi!( - "A wide road (5 lanes each way) that has been rather poorly maintained. Potholes dot the ashphalt road, while cracks line the footpaths on either side"), - description_less_explicit: None, - grid_coords: GridCoords { x: 1, y: 1, z: 0 }, - exits: vec!( - Exit { - direction: Direction::EAST, - target: ExitTarget::Custom("room/repro_xv_lobby"), - ..Default::default() - }, - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_kingst_60", - name: "King Street - 60 block", - short: ansi!("||"), - description: "A wide road (5 lanes each way) that has been rather poorly maintained. Potholes dot the ashphalt road, while cracks line the footpaths on either side", - description_less_explicit: None, - grid_coords: GridCoords { x: 1, y: 2, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_kingst_bourkest", - name: "King Street & Bourke St", - short: ansi!("##"), - description: "A wide road (5 lanes each way) intersects a slightly narrower 4-lane road with wide but heavily cracked concrete footpaths. Potholes dot the ashphalt road", - description_less_explicit: None, - grid_coords: GridCoords { x: 1, y: 3, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_kingst_70", - name: "King Street - 70 block", - short: ansi!("||"), - description: "A wide road (5 lanes each way) that has been rather poorly maintained. Potholes dot the ashphalt road, while cracks line the footpaths on either side", - description_less_explicit: None, - grid_coords: GridCoords { x: 1, y: 4, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!( - SecondaryZoneRecord { - zone: "cok_murl", - short: ansi!("||"), - grid_coords: GridCoords { x: -1, y: 0, z: 0 }, - caption: Some("King Street") - } - ), - code: "melbs_kingst_80", - name: "King Street - 80 block", - short: ansi!("||"), - description: "A wide road (5 lanes each way) that has been rather poorly maintained. Potholes dot the ashphalt road, while cracks line the footpaths on either side", - description_less_explicit: None, - grid_coords: GridCoords { x: 1, y: 5, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - target: ExitTarget::Custom("room/cok_lobby"), - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_kingst_90", - name: "King Street - 90 block", - short: ansi!("||"), - description: "A wide road (5 lanes each way) that has been rather poorly maintained. Potholes dot the ashphalt road, while cracks line the footpaths on either side", - description_less_explicit: None, - grid_coords: GridCoords { x: 1, y: 6, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_kingst_collinsst", - name: "King Street & Collins St", - short: ansi!("##"), - description: "A wide road (5 lanes each way) intersects another wide 4-lane road. Potholes dot the ashphalt road, while cracks line the footpaths on either side", - description_less_explicit: None, - grid_coords: GridCoords { x: 1, y: 7, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_kingst_100", - name: "King Street - 100 block", - short: ansi!("||"), - description: "A wide road (5 lanes each way) that has been rather poorly maintained. Potholes dot the ashphalt road, while cracks line the footpaths on either side", - description_less_explicit: None, - grid_coords: GridCoords { x: 1, y: 8, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_roboporter_rentals", - name: "Roboporter Rentals", - short: ansi!("RP"), - description: ansi!("A spacious room with metal walls and a faint smell of oil. The room is filled with rows of charging stations and maintenance bays for massive robots designed to carry heavy things. At the centre of the room stands a counter where you can rent Roboporters. A large sign overhead reads 'Roboporter Rentals - Your Heavy Lifting Solution!'. [You can use the hire roboporter command, to hire a Roboporter (if any are available) for $100 / 10 minute block]"), - description_less_explicit: None, - grid_coords: GridCoords { x: 2, y: 8, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - ), - stock_list: vec!(), - should_caption: true, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_kingst_110", - name: "King Street - 110 block", - short: ansi!("||"), - description: "A wide road (5 lanes each way) that has been rather poorly maintained. Potholes dot the ashphalt road, while cracks line the footpaths on either side", - description_less_explicit: None, - grid_coords: GridCoords { x: 1, y: 9, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_kingst_120", - name: "King Street - 120 block", - short: ansi!("||"), - description: "A wide road (5 lanes each way) that has been rather poorly maintained. Potholes dot the ashphalt road, while cracks line the footpaths on either side", - description_less_explicit: None, - grid_coords: GridCoords { x: 1, y: 10, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_kingst_flinderst", - name: "King Street & Flinders St", - short: ansi!("##"), - description: "A wide road (5 lanes each way) intersects a wide road with rusted tram tracks in the middle. Potholes dot the ashphalt road", - description_less_explicit: None, - grid_coords: GridCoords { x: 1, y: 11, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_kingst_latrobest", + name: "King Street & Latrobe St", + short: ansi!("##"), + description: "A wide road (5 lanes each way) intersects a narrower 3 lane road. Both have been rather poorly maintained. Potholes dot the ashphalt road", + description_less_explicit: None, + grid_coords: GridCoords { x: 1, y: -5, z: 0 }, + exits: vec!( + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_kingst_10", + name: "King Street - 10 block", + short: ansi!("||"), + description: "A wide road (5 lanes each way) that has been rather poorly maintained. Potholes dot the ashphalt road, while cracks line the footpaths on either side", + description_less_explicit: None, + grid_coords: GridCoords { x: 1, y: -4, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_kingst_20", + name: "King Street - 20 block", + short: ansi!("||"), + description: "A wide road (5 lanes each way) that has been rather poorly maintained. Potholes dot the ashphalt road, while cracks line the footpaths on either side", + description_less_explicit: None, + grid_coords: GridCoords { x: 1, y: -3, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_kingst_30", + name: "King Street - 30 block", + short: ansi!("||"), + description: "A wide road (5 lanes each way) that has been rather poorly maintained. Potholes dot the ashphalt road, while cracks line the footpaths on either side", + description_less_explicit: None, + grid_coords: GridCoords { x: 1, y: -2, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_kingst_lonsdalest", + name: "King Street & Lonsdale St", + short: ansi!("##"), + description: "A wide road (5 lanes each way) intersects a narrower 2 lane each way road. Both have been rather poorly maintained. Potholes dot the ashphalt road", + description_less_explicit: None, + grid_coords: GridCoords { x: 1, y: -1, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_kingst_40", + name: ansi!("King Street - 40 block"), + short: ansi!("||"), + description: ansi!( + "A wide road (5 lanes each way) that has been rather poorly maintained. Potholes dot the ashphalt road, while cracks line the footpaths on either side"), + description_less_explicit: None, + grid_coords: GridCoords { x: 1, y: 0, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_homelessshelter", + name: ansi!("Homeless Shelter"), + short: ansi!("HS"), + description: ansi!( + "A spartan room with row after row of plain beds. A thick mist from a fog machine means you can't see or hear much going on here, and no one can attack anyone. It looks like a safe place to log off if you have no better choice"), + description_less_explicit: None, + grid_coords: GridCoords { x: 2, y: 0, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + ), + should_caption: true, + item_flags: vec!(ItemFlag::NoSay, ItemFlag::NoSeeContents), + repel_npc: true, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!( + SecondaryZoneRecord { + zone: "repro_xv", + short: ansi!("EX"), + grid_coords: GridCoords { x: 1, y: 0, z: 0 }, + caption: Some("Melbs"), + } + ), + code: "melbs_kingst_50", + name: ansi!("King Street - 50 block"), + short: ansi!("||"), + description: ansi!( + "A wide road (5 lanes each way) that has been rather poorly maintained. Potholes dot the ashphalt road, while cracks line the footpaths on either side"), + description_less_explicit: None, + grid_coords: GridCoords { x: 1, y: 1, z: 0 }, + exits: vec!( + Exit { + direction: Direction::EAST, + target: ExitTarget::Custom("room/repro_xv_lobby"), + ..Default::default() + }, + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_kingst_60", + name: "King Street - 60 block", + short: ansi!("||"), + description: "A wide road (5 lanes each way) that has been rather poorly maintained. Potholes dot the ashphalt road, while cracks line the footpaths on either side", + description_less_explicit: None, + grid_coords: GridCoords { x: 1, y: 2, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_kingst_bourkest", + name: "King Street & Bourke St", + short: ansi!("##"), + description: "A wide road (5 lanes each way) intersects a slightly narrower 4-lane road with wide but heavily cracked concrete footpaths. Potholes dot the ashphalt road", + description_less_explicit: None, + grid_coords: GridCoords { x: 1, y: 3, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_kingst_70", + name: "King Street - 70 block", + short: ansi!("||"), + description: "A wide road (5 lanes each way) that has been rather poorly maintained. Potholes dot the ashphalt road, while cracks line the footpaths on either side", + description_less_explicit: None, + grid_coords: GridCoords { x: 1, y: 4, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!( + SecondaryZoneRecord { + zone: "cok_murl", + short: ansi!("||"), + grid_coords: GridCoords { x: -1, y: 0, z: 0 }, + caption: Some("King Street") + } + ), + code: "melbs_kingst_80", + name: "King Street - 80 block", + short: ansi!("||"), + description: "A wide road (5 lanes each way) that has been rather poorly maintained. Potholes dot the ashphalt road, while cracks line the footpaths on either side", + description_less_explicit: None, + grid_coords: GridCoords { x: 1, y: 5, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + target: ExitTarget::Custom("room/cok_lobby"), + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_kingst_90", + name: "King Street - 90 block", + short: ansi!("||"), + description: "A wide road (5 lanes each way) that has been rather poorly maintained. Potholes dot the ashphalt road, while cracks line the footpaths on either side", + description_less_explicit: None, + grid_coords: GridCoords { x: 1, y: 6, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_kingst_collinsst", + name: "King Street & Collins St", + short: ansi!("##"), + description: "A wide road (5 lanes each way) intersects another wide 4-lane road. Potholes dot the ashphalt road, while cracks line the footpaths on either side", + description_less_explicit: None, + grid_coords: GridCoords { x: 1, y: 7, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_kingst_100", + name: "King Street - 100 block", + short: ansi!("||"), + description: "A wide road (5 lanes each way) that has been rather poorly maintained. Potholes dot the ashphalt road, while cracks line the footpaths on either side", + description_less_explicit: None, + grid_coords: GridCoords { x: 1, y: 8, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_roboporter_rentals", + name: "Roboporter Rentals", + short: ansi!("RP"), + description: ansi!("A spacious room with metal walls and a faint smell of oil. The room is filled with rows of charging stations and maintenance bays for massive robots designed to carry heavy things. At the centre of the room stands a counter where you can rent Roboporters. A large sign overhead reads 'Roboporter Rentals - Your Heavy Lifting Solution!'. [You can use the hire roboporter command, to hire a Roboporter (if any are available) for $100 / 10 minute block]"), + description_less_explicit: None, + grid_coords: GridCoords { x: 2, y: 8, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + ), + stock_list: vec!(), + should_caption: true, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_kingst_110", + name: "King Street - 110 block", + short: ansi!("##"), + description: "A wide road (5 lanes each way) that has been rather poorly maintained. Potholes dot the ashphalt road, while cracks line the footpaths on either side", + description_less_explicit: None, + grid_coords: GridCoords { x: 1, y: 9, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_kings_110_laneway", + name: "110 Kings Laneway", + short: ansi!("="), + description: "A narrow grotty and dingy laneway between concrete walls, both covered with layer upon layer of graffiti. The concrete path has long cracks on its surface", + description_less_explicit: None, + grid_coords: GridCoords { x: 2, y: 9, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec![], + code: "melbs_rustic_furnishings", + name: "Rustic Furnishings", + short: ansi!("RF"), + description: "The Rustic Furnishings unveils a captivating sight as you enter. Bathed in soft, natural light that filters through large windows, the furniture store reveals a world of comfort and nostalgia.\n\nA warm and inviting atmosphere surrounds you as you explore the meticulously arranged space. Rich, reclaimed hardwood floors stretch out beneath your feet, bearing the echoes of countless stories from the past. Worn yet sturdy, the wooden furniture exudes an enduring charm that captivates the eye, while the kitchen and bathroom sections of the store harbour more modern furniture.\n\nA seasoned storekeeper stands ready to assist shoppers", + description_less_explicit: None, + grid_coords: GridCoords { x: 3, y: 9, z: 0 }, + exits: vec![ + Exit { + direction: Direction::WEST, + ..Default::default() + } + ], + stock_list: vec![ + RoomStock { + possession_type: PossessionType::KitchenStove, + list_price: 1000, + ..Default::default() + } + ], + should_caption: true, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_kingst_120", + name: "King Street - 120 block", + short: ansi!("||"), + description: "A wide road (5 lanes each way) that has been rather poorly maintained. Potholes dot the ashphalt road, while cracks line the footpaths on either side", + description_less_explicit: None, + grid_coords: GridCoords { x: 1, y: 10, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_kingst_flinderst", + name: "King Street & Flinders St", + short: ansi!("##"), + description: "A wide road (5 lanes each way) intersects a wide road with rusted tram tracks in the middle. Potholes dot the ashphalt road", + description_less_explicit: None, + grid_coords: GridCoords { x: 1, y: 11, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_flindersst_210", - name: "Flinders St - 210 block", - short: ansi!("=="), - description: "A wide road with rusted tram tracks in the middle. Potholes dot the ashphalt road", - description_less_explicit: None, - grid_coords: GridCoords { x: 2, y: 11, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_flindersst_200", - name: "Flinders St - 200 block", - short: ansi!("=="), - description: "A wide road with rusted tram tracks in the middle. Potholes dot the ashphalt road", - description_less_explicit: None, - grid_coords: GridCoords { x: 3, y: 11, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_flindersst_190", - name: "Flinders St - 190 block", - short: ansi!("=="), - description: "A wide road with rusted tram tracks in the middle. Potholes dot the ashphalt road", - description_less_explicit: None, - grid_coords: GridCoords { x: 4, y: 11, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_williamsst_flindersst", - name: "Williams St & Flinders St", - short: ansi!("##"), - description: "An intersection of a steep asphalt road with a wide road with rusted tram tracks in the middle. Potholes dot the road surfaces", - description_less_explicit: None, - grid_coords: GridCoords { x: 5, y: 11, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_flindersst_180", - name: "Flinders St - 180 block", - short: ansi!("=="), - description: "A wide road with rusted tram tracks in the middle. Potholes dot the ashphalt road", - description_less_explicit: None, - grid_coords: GridCoords { x: 6, y: 11, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_flindersst_170", - name: "Flinders St - 170 block", - short: ansi!("=="), - description: "A wide road with rusted tram tracks in the middle. Potholes dot the ashphalt road", - description_less_explicit: None, - grid_coords: GridCoords { x: 7, y: 11, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_flindersst_160", - name: "Flinders St - 160 block", - short: ansi!("=="), - description: "A wide road with rusted tram tracks in the middle. Potholes dot the ashphalt road", - description_less_explicit: None, - grid_coords: GridCoords { x: 8, y: 11, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_queenst_flindersst", - name: "Queen St & Flinders St", - short: ansi!("##"), - description: "A wide road with rusted tram tracks in the middle intersects another wide road. Potholes dot the ashphalt", - description_less_explicit: None, - grid_coords: GridCoords { x: 9, y: 11, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_flindersst_150", - name: "Flinders St - 150 block", - short: ansi!("=="), - description: "A wide road with rusted tram tracks in the middle. Potholes dot the ashphalt road", - description_less_explicit: None, - grid_coords: GridCoords { x: 10, y: 11, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_flindersst_140", - name: "Flinders St - 140 block", - short: ansi!("=="), - description: "A wide road with rusted tram tracks in the middle. Potholes dot the ashphalt road", - description_less_explicit: None, - grid_coords: GridCoords { x: 11, y: 11, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_flindersst_130", - name: "Flinders St - 130 block", - short: ansi!("=="), - description: "A wide road with rusted tram tracks in the middle. Potholes dot the ashphalt road", - description_less_explicit: None, - grid_coords: GridCoords { x: 12, y: 11, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_elizabethst_flindersst", - name: "Elizabeth St & Flinders St", - short: ansi!("##"), - description: "A wide road with rusted tram tracks in the middle intersects a wide road stained from years of neglect. Potholes dot the ashphalt", - description_less_explicit: None, - grid_coords: GridCoords { x: 13, y: 11, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_flindersst_120", - name: "Flinders St - 120 block", - short: ansi!("=="), - description: "A wide road with rusted tram tracks in the middle. Potholes dot the ashphalt road", - description_less_explicit: None, - grid_coords: GridCoords { x: 14, y: 11, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_flindersst_110", - name: "Flinders St - 110 block", - short: ansi!("=="), - description: "A wide road with rusted tram tracks in the middle. Potholes dot the ashphalt road", - description_less_explicit: None, - grid_coords: GridCoords { x: 15, y: 11, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_flindersst_100", - name: "Flinders St - 100 block", - short: ansi!("=="), - description: "A wide road with rusted tram tracks in the middle. Potholes dot the ashphalt road", - description_less_explicit: None, - grid_coords: GridCoords { x: 16, y: 11, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_swanstonst_flindersst", - name: "Swanston St & Flinders St", - short: ansi!("##"), - description: "The intersection of two wide roads, with rusted tram tracks and infrastructure in the middle. Crumbling bollards line all corners of the intersection, and potholes dot the ashphalt road", - description_less_explicit: None, - grid_coords: GridCoords { x: 17, y: 11, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_flindersst_210", + name: "Flinders St - 210 block", + short: ansi!("=="), + description: "A wide road with rusted tram tracks in the middle. Potholes dot the ashphalt road", + description_less_explicit: None, + grid_coords: GridCoords { x: 2, y: 11, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_flindersst_200", + name: "Flinders St - 200 block", + short: ansi!("=="), + description: "A wide road with rusted tram tracks in the middle. Potholes dot the ashphalt road", + description_less_explicit: None, + grid_coords: GridCoords { x: 3, y: 11, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_flindersst_190", + name: "Flinders St - 190 block", + short: ansi!("=="), + description: "A wide road with rusted tram tracks in the middle. Potholes dot the ashphalt road", + description_less_explicit: None, + grid_coords: GridCoords { x: 4, y: 11, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_williamsst_flindersst", + name: "Williams St & Flinders St", + short: ansi!("##"), + description: "An intersection of a steep asphalt road with a wide road with rusted tram tracks in the middle. Potholes dot the road surfaces", + description_less_explicit: None, + grid_coords: GridCoords { x: 5, y: 11, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_flindersst_180", + name: "Flinders St - 180 block", + short: ansi!("=="), + description: "A wide road with rusted tram tracks in the middle. Potholes dot the ashphalt road", + description_less_explicit: None, + grid_coords: GridCoords { x: 6, y: 11, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_flindersst_170", + name: "Flinders St - 170 block", + short: ansi!("=="), + description: "A wide road with rusted tram tracks in the middle. Potholes dot the ashphalt road", + description_less_explicit: None, + grid_coords: GridCoords { x: 7, y: 11, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_flindersst_160", + name: "Flinders St - 160 block", + short: ansi!("=="), + description: "A wide road with rusted tram tracks in the middle. Potholes dot the ashphalt road", + description_less_explicit: None, + grid_coords: GridCoords { x: 8, y: 11, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_queenst_flindersst", + name: "Queen St & Flinders St", + short: ansi!("##"), + description: "A wide road with rusted tram tracks in the middle intersects another wide road. Potholes dot the ashphalt", + description_less_explicit: None, + grid_coords: GridCoords { x: 9, y: 11, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_flindersst_150", + name: "Flinders St - 150 block", + short: ansi!("=="), + description: "A wide road with rusted tram tracks in the middle. Potholes dot the ashphalt road", + description_less_explicit: None, + grid_coords: GridCoords { x: 10, y: 11, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_flindersst_140", + name: "Flinders St - 140 block", + short: ansi!("=="), + description: "A wide road with rusted tram tracks in the middle. Potholes dot the ashphalt road", + description_less_explicit: None, + grid_coords: GridCoords { x: 11, y: 11, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_flindersst_130", + name: "Flinders St - 130 block", + short: ansi!("=="), + description: "A wide road with rusted tram tracks in the middle. Potholes dot the ashphalt road", + description_less_explicit: None, + grid_coords: GridCoords { x: 12, y: 11, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_elizabethst_flindersst", + name: "Elizabeth St & Flinders St", + short: ansi!("##"), + description: "A wide road with rusted tram tracks in the middle intersects a wide road stained from years of neglect. Potholes dot the ashphalt", + description_less_explicit: None, + grid_coords: GridCoords { x: 13, y: 11, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_flindersst_120", + name: "Flinders St - 120 block", + short: ansi!("=="), + description: "A wide road with rusted tram tracks in the middle. Potholes dot the ashphalt road", + description_less_explicit: None, + grid_coords: GridCoords { x: 14, y: 11, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_flindersst_110", + name: "Flinders St - 110 block", + short: ansi!("=="), + description: "A wide road with rusted tram tracks in the middle. Potholes dot the ashphalt road", + description_less_explicit: None, + grid_coords: GridCoords { x: 15, y: 11, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_flindersst_100", + name: "Flinders St - 100 block", + short: ansi!("=="), + description: "A wide road with rusted tram tracks in the middle. Potholes dot the ashphalt road", + description_less_explicit: None, + grid_coords: GridCoords { x: 16, y: 11, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_swanstonst_flindersst", + name: "Swanston St & Flinders St", + short: ansi!("##"), + description: "The intersection of two wide roads, with rusted tram tracks and infrastructure in the middle. Crumbling bollards line all corners of the intersection, and potholes dot the ashphalt road", + description_less_explicit: None, + grid_coords: GridCoords { x: 17, y: 11, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_swanstonst_latrobest", - name: "Swanston Street & Latrobe St", - short: ansi!("##"), - description: "A dilapidated major tram thoroughfare intersects a narrower 3 lane road. Both have been rather poorly maintained. Potholes dot the ashphalt road", - description_less_explicit: None, - grid_coords: GridCoords { x: 17, y: -5, z: 0 }, - exits: vec!( - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - Exit { - direction: Direction::WEST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_swansonst_10", - name: "Swanston Street - 10 block", - short: ansi!("||"), - description: "A road that looks to have been a major tram thoroughfare before the collapse. Cracks line the filthy concrete footpaths and rusted tram tracks, and weeds poke out from holes in the concrete", - description_less_explicit: None, - grid_coords: GridCoords { x: 17, y: -4, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_swanstonst_20", - name: "Swanston Street - 20 block", - short: ansi!("||"), - description: "A road that looks to have been a major tram thoroughfare before the collapse. Cracks line the filthy concrete footpaths and rusted tram tracks, and weeds poke out from holes in the concrete", - description_less_explicit: None, - grid_coords: GridCoords { x: 17, y: -3, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_swanstonst_30", - name: "Swanston Street - 30 block", - short: ansi!("||"), - description: "A road that looks to have been a major tram thoroughfare before the collapse. Cracks line the filthy concrete footpaths and rusted tram tracks, and weeds poke out from holes in the concrete", - description_less_explicit: None, - grid_coords: GridCoords { x: 17, y: -2, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_swanstonst_lonsdalest", - name: "Swanston Street & Lonsdale St", - short: ansi!("##"), - description: "A dilapidated major tram thoroughfare intersects a narrower 2 lane each way road. Both have been rather poorly maintained. Potholes dot the ashphalt and weeds poke out from cracks in the concrete", - description_less_explicit: None, - grid_coords: GridCoords { x: 17, y: -1, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - Exit { - direction: Direction::WEST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_swanstonst_40", - name: ansi!("Swanston Street - 40 block"), - short: ansi!("||"), - description: ansi!( - "A wide road (5 lanes each way) that has been rather poorly maintained. Potholes dot the ashphalt road, while cracks line the footpaths on either side"), - description_less_explicit: None, - grid_coords: GridCoords { x: 17, y: 0, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_swanstonst_50", - name: ansi!("Swanston Street - 50 block"), - short: ansi!("||"), - description: ansi!( - "A road that looks to have been a major tram thoroughfare before the collapse. Cracks line the filthy concrete footpaths and rusted tram tracks, and weeds poke out from holes in the concrete"), - description_less_explicit: None, - grid_coords: GridCoords { x: 17, y: 1, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_swanstonst_60", - name: "Swanston Street - 60 block", - short: ansi!("||"), - description: "A road that looks to have been a major tram thoroughfare before the collapse. Cracks line the filthy concrete footpaths and rusted tram tracks, and weeds poke out from holes in the concrete", - description_less_explicit: None, - grid_coords: GridCoords { x: 17, y: 2, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_swanstonst_bourkest", - name: "Swanston Street & Bourke St", - short: ansi!("##"), - description: "A dilapidated major tram thoroughfare intersects a slightly narrower 4-lane road with wide but heavily cracked concrete footpaths. Potholes dot the ashphalt and weeds poke out from cracks in the concrete", - description_less_explicit: None, - grid_coords: GridCoords { x: 17, y: 3, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - Exit { - direction: Direction::WEST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_swanstonst_70", - name: "Swanston Street - 70 block", - short: ansi!("||"), - description: "A road that looks to have been a major tram thoroughfare before the collapse. Cracks line the filthy concrete footpaths and rusted tram tracks, and weeds poke out from holes in the concrete", - description_less_explicit: None, - grid_coords: GridCoords { x: 17, y: 4, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_swanstonst_80", - name: "Swanston Street - 80 block", - short: ansi!("||"), - description: "A road that looks to have been a major tram thoroughfare before the collapse. Cracks line the filthy concrete footpaths and rusted tram tracks, and weeds poke out from holes in the concrete", - description_less_explicit: None, - grid_coords: GridCoords { x: 17, y: 5, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_swanstonst_90", - name: "Swanston Street - 90 block", - short: ansi!("||"), - description: "A road that looks to have been a major tram thoroughfare before the collapse. Cracks line the filthy concrete footpaths and rusted tram tracks, and weeds poke out from holes in the concrete", - description_less_explicit: None, - grid_coords: GridCoords { x: 17, y: 6, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_swanstonst_collinsst", - name: "Swanston Street & Collins St", - short: ansi!("##"), - description: "A dilapidated major tram thoroughfare intersects another wide 4-lane road. Potholes dot the ashphalt road, while cracks line the footpaths on either side", - description_less_explicit: None, - grid_coords: GridCoords { x: 17, y: 7, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - Exit { - direction: Direction::WEST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_swanstonst_100", - name: "Swanston Street - 100 block", - short: ansi!("||"), - description: "A road that looks to have been a major tram thoroughfare before the collapse. Cracks line the filthy concrete footpaths and rusted tram tracks, and weeds poke out from holes in the concrete", - description_less_explicit: None, - grid_coords: GridCoords { x: 17, y: 8, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_swanstonst_110", - name: "Swanston Street - 110 block", - short: ansi!("||"), - description: "A road that looks to have been a major tram thoroughfare before the collapse. Cracks line the filthy concrete footpaths and rusted tram tracks, and weeds poke out from holes in the concrete", - description_less_explicit: None, - grid_coords: GridCoords { x: 17, y: 9, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_swanstonst_120", - name: "Swanston Street - 120 block", - short: ansi!("||"), - description: "A road that looks to have been a major tram thoroughfare before the collapse. Cracks line the filthy concrete footpaths and rusted tram tracks, and weeds poke out from holes in the concrete", - description_less_explicit: None, - grid_coords: GridCoords { x: 17, y: 10, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_swanstonst_latrobest", + name: "Swanston Street & Latrobe St", + short: ansi!("##"), + description: "A dilapidated major tram thoroughfare intersects a narrower 3 lane road. Both have been rather poorly maintained. Potholes dot the ashphalt road", + description_less_explicit: None, + grid_coords: GridCoords { x: 17, y: -5, z: 0 }, + exits: vec!( + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + Exit { + direction: Direction::WEST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_swansonst_10", + name: "Swanston Street - 10 block", + short: ansi!("||"), + description: "A road that looks to have been a major tram thoroughfare before the collapse. Cracks line the filthy concrete footpaths and rusted tram tracks, and weeds poke out from holes in the concrete", + description_less_explicit: None, + grid_coords: GridCoords { x: 17, y: -4, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_swanstonst_20", + name: "Swanston Street - 20 block", + short: ansi!("||"), + description: "A road that looks to have been a major tram thoroughfare before the collapse. Cracks line the filthy concrete footpaths and rusted tram tracks, and weeds poke out from holes in the concrete", + description_less_explicit: None, + grid_coords: GridCoords { x: 17, y: -3, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_swanstonst_30", + name: "Swanston Street - 30 block", + short: ansi!("||"), + description: "A road that looks to have been a major tram thoroughfare before the collapse. Cracks line the filthy concrete footpaths and rusted tram tracks, and weeds poke out from holes in the concrete", + description_less_explicit: None, + grid_coords: GridCoords { x: 17, y: -2, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_swanstonst_lonsdalest", + name: "Swanston Street & Lonsdale St", + short: ansi!("##"), + description: "A dilapidated major tram thoroughfare intersects a narrower 2 lane each way road. Both have been rather poorly maintained. Potholes dot the ashphalt and weeds poke out from cracks in the concrete", + description_less_explicit: None, + grid_coords: GridCoords { x: 17, y: -1, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + Exit { + direction: Direction::WEST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_swanstonst_40", + name: ansi!("Swanston Street - 40 block"), + short: ansi!("||"), + description: ansi!( + "A wide road (5 lanes each way) that has been rather poorly maintained. Potholes dot the ashphalt road, while cracks line the footpaths on either side"), + description_less_explicit: None, + grid_coords: GridCoords { x: 17, y: 0, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_swanstonst_50", + name: ansi!("Swanston Street - 50 block"), + short: ansi!("||"), + description: ansi!( + "A road that looks to have been a major tram thoroughfare before the collapse. Cracks line the filthy concrete footpaths and rusted tram tracks, and weeds poke out from holes in the concrete"), + description_less_explicit: None, + grid_coords: GridCoords { x: 17, y: 1, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_swanstonst_60", + name: "Swanston Street - 60 block", + short: ansi!("||"), + description: "A road that looks to have been a major tram thoroughfare before the collapse. Cracks line the filthy concrete footpaths and rusted tram tracks, and weeds poke out from holes in the concrete", + description_less_explicit: None, + grid_coords: GridCoords { x: 17, y: 2, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_swanstonst_bourkest", + name: "Swanston Street & Bourke St", + short: ansi!("##"), + description: "A dilapidated major tram thoroughfare intersects a slightly narrower 4-lane road with wide but heavily cracked concrete footpaths. Potholes dot the ashphalt and weeds poke out from cracks in the concrete", + description_less_explicit: None, + grid_coords: GridCoords { x: 17, y: 3, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + Exit { + direction: Direction::WEST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_swanstonst_70", + name: "Swanston Street - 70 block", + short: ansi!("||"), + description: "A road that looks to have been a major tram thoroughfare before the collapse. Cracks line the filthy concrete footpaths and rusted tram tracks, and weeds poke out from holes in the concrete", + description_less_explicit: None, + grid_coords: GridCoords { x: 17, y: 4, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_swanstonst_80", + name: "Swanston Street - 80 block", + short: ansi!("||"), + description: "A road that looks to have been a major tram thoroughfare before the collapse. Cracks line the filthy concrete footpaths and rusted tram tracks, and weeds poke out from holes in the concrete", + description_less_explicit: None, + grid_coords: GridCoords { x: 17, y: 5, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_swanstonst_90", + name: "Swanston Street - 90 block", + short: ansi!("||"), + description: "A road that looks to have been a major tram thoroughfare before the collapse. Cracks line the filthy concrete footpaths and rusted tram tracks, and weeds poke out from holes in the concrete", + description_less_explicit: None, + grid_coords: GridCoords { x: 17, y: 6, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_swanstonst_collinsst", + name: "Swanston Street & Collins St", + short: ansi!("##"), + description: "A dilapidated major tram thoroughfare intersects another wide 4-lane road. Potholes dot the ashphalt road, while cracks line the footpaths on either side", + description_less_explicit: None, + grid_coords: GridCoords { x: 17, y: 7, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + Exit { + direction: Direction::WEST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_swanstonst_100", + name: "Swanston Street - 100 block", + short: ansi!("||"), + description: "A road that looks to have been a major tram thoroughfare before the collapse. Cracks line the filthy concrete footpaths and rusted tram tracks, and weeds poke out from holes in the concrete", + description_less_explicit: None, + grid_coords: GridCoords { x: 17, y: 8, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_swanstonst_110", + name: "Swanston Street - 110 block", + short: ansi!("||"), + description: "A road that looks to have been a major tram thoroughfare before the collapse. Cracks line the filthy concrete footpaths and rusted tram tracks, and weeds poke out from holes in the concrete", + description_less_explicit: None, + grid_coords: GridCoords { x: 17, y: 9, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_swanstonst_120", + name: "Swanston Street - 120 block", + short: ansi!("||"), + description: "A road that looks to have been a major tram thoroughfare before the collapse. Cracks line the filthy concrete footpaths and rusted tram tracks, and weeds poke out from holes in the concrete", + description_less_explicit: None, + grid_coords: GridCoords { x: 17, y: 10, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_latrobest_210", - name: "La Trobe St - 210 block", - short: ansi!("=="), - description: "A moderately wide road that is now overgrown and completely covered in weeds", - description_less_explicit: None, - grid_coords: GridCoords { x: 2, y: -5, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_latrobesst_200", - name: "La Trobe St - 200 block", - short: ansi!("=="), - description: "A moderately wide road that is now overgrown and completely covered in weeds", - description_less_explicit: None, - grid_coords: GridCoords { x: 3, y: -5, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_latrobest_190", - name: "La Trobe St - 190 block", - short: ansi!("=="), - description: "A moderately wide road that is now overgrown and completely covered in weeds", - description_less_explicit: None, - grid_coords: GridCoords { x: 4, y: -5, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_williamstlatrobest", - name: "Williams St & La Trobe St", - short: ansi!("##"), - description: "An intersection of an overgrown weedy road with a wide road with rusted tram tracks in the middle. Potholes dot the visible road surfaces", - description_less_explicit: None, - grid_coords: GridCoords { x: 5, y: -5, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_latrobest_210", + name: "La Trobe St - 210 block", + short: ansi!("=="), + description: "A moderately wide road that is now overgrown and completely covered in weeds", + description_less_explicit: None, + grid_coords: GridCoords { x: 2, y: -5, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_latrobesst_200", + name: "La Trobe St - 200 block", + short: ansi!("=="), + description: "A moderately wide road that is now overgrown and completely covered in weeds", + description_less_explicit: None, + grid_coords: GridCoords { x: 3, y: -5, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_latrobest_190", + name: "La Trobe St - 190 block", + short: ansi!("=="), + description: "A moderately wide road that is now overgrown and completely covered in weeds", + description_less_explicit: None, + grid_coords: GridCoords { x: 4, y: -5, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_williamstlatrobest", + name: "Williams St & La Trobe St", + short: ansi!("##"), + description: "An intersection of an overgrown weedy road with a wide road with rusted tram tracks in the middle. Potholes dot the visible road surfaces", + description_less_explicit: None, + grid_coords: GridCoords { x: 5, y: -5, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_latrobest_180", - name: "La Trobe St - 180 block", - short: ansi!("=="), - description: "A moderately wide road that is now overgrown and completely covered in weeds", - description_less_explicit: None, - grid_coords: GridCoords { x: 6, y: -5, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_latrobest_170", - name: "La Trobe St - 170 block", - short: ansi!("=="), - description: "A moderately wide road that is now overgrown and completely covered in weeds", - description_less_explicit: None, - grid_coords: GridCoords { x: 7, y: -5, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_latrobest_160", - name: "La Trobe St - 160 block", - short: ansi!("=="), - description: "A moderately wide road that is now overgrown and completely covered in weeds", - description_less_explicit: None, - grid_coords: GridCoords { x: 8, y: -5, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_queenst_latrobest", - name: "Queen St & La Trobe St", - short: ansi!("##"), - description: "Two relatively wide roads intersects; the road running east to west is overgrown with weeds, while the road running to the south has been kept slightly clearer", - description_less_explicit: None, - grid_coords: GridCoords { x: 9, y: -5, z: 0 }, - exits: vec!( - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_latrobest_150", - name: "La Trobe St - 150 block", - short: ansi!("=="), - description: "A moderately wide road that is now overgrown and completely covered in weeds", - description_less_explicit: None, - grid_coords: GridCoords { x: 10, y: -5, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_latrobest_140", - name: "La Trobe St - 140 block", - short: ansi!("=="), - description: "A moderately wide road that is now overgrown and completely covered in weeds", - description_less_explicit: None, - grid_coords: GridCoords { x: 11, y: -5, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_latrobest_130", - name: "La Trobe St - 130 block", - short: ansi!("=="), - description: "A moderately wide road that is now overgrown and completely covered in weeds", - description_less_explicit: None, - grid_coords: GridCoords { x: 12, y: -5, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_elizabethst_latrobest", - name: "Elizabeth St & La Trobe St", - short: ansi!("##"), - description: "A moderately wide road that is now overgrown and completely covered in weeds intersects a wide road stained from years of neglect", - description_less_explicit: None, - grid_coords: GridCoords { x: 13, y: -5, z: 0 }, - exits: vec!( - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_latrobest_120", - name: "La Trobe St - 120 block", - short: ansi!("=="), - description: "A moderately wide road that is now overgrown and completely covered in weeds", - description_less_explicit: None, - grid_coords: GridCoords { x: 14, y: -5, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_latrobest_110", - name: "La Trobe St - 110 block", - short: ansi!("=="), - description: "A moderately wide road that is now overgrown and completely covered in weeds", - description_less_explicit: None, - grid_coords: GridCoords { x: 15, y: -5, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_latrobest_100", - name: "La Trobe St - 100 block", - short: ansi!("=="), - description: "A moderately wide road that is now overgrown and completely covered in weeds", - description_less_explicit: None, - grid_coords: GridCoords { x: 16, y: -5, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_latrobest_180", + name: "La Trobe St - 180 block", + short: ansi!("=="), + description: "A moderately wide road that is now overgrown and completely covered in weeds", + description_less_explicit: None, + grid_coords: GridCoords { x: 6, y: -5, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_latrobest_170", + name: "La Trobe St - 170 block", + short: ansi!("=="), + description: "A moderately wide road that is now overgrown and completely covered in weeds", + description_less_explicit: None, + grid_coords: GridCoords { x: 7, y: -5, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_latrobest_160", + name: "La Trobe St - 160 block", + short: ansi!("=="), + description: "A moderately wide road that is now overgrown and completely covered in weeds", + description_less_explicit: None, + grid_coords: GridCoords { x: 8, y: -5, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_queenst_latrobest", + name: "Queen St & La Trobe St", + short: ansi!("##"), + description: "Two relatively wide roads intersects; the road running east to west is overgrown with weeds, while the road running to the south has been kept slightly clearer", + description_less_explicit: None, + grid_coords: GridCoords { x: 9, y: -5, z: 0 }, + exits: vec!( + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_latrobest_150", + name: "La Trobe St - 150 block", + short: ansi!("=="), + description: "A moderately wide road that is now overgrown and completely covered in weeds", + description_less_explicit: None, + grid_coords: GridCoords { x: 10, y: -5, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_latrobest_140", + name: "La Trobe St - 140 block", + short: ansi!("=="), + description: "A moderately wide road that is now overgrown and completely covered in weeds", + description_less_explicit: None, + grid_coords: GridCoords { x: 11, y: -5, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_latrobest_130", + name: "La Trobe St - 130 block", + short: ansi!("=="), + description: "A moderately wide road that is now overgrown and completely covered in weeds", + description_less_explicit: None, + grid_coords: GridCoords { x: 12, y: -5, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_elizabethst_latrobest", + name: "Elizabeth St & La Trobe St", + short: ansi!("##"), + description: "A moderately wide road that is now overgrown and completely covered in weeds intersects a wide road stained from years of neglect", + description_less_explicit: None, + grid_coords: GridCoords { x: 13, y: -5, z: 0 }, + exits: vec!( + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_latrobest_120", + name: "La Trobe St - 120 block", + short: ansi!("=="), + description: "A moderately wide road that is now overgrown and completely covered in weeds", + description_less_explicit: None, + grid_coords: GridCoords { x: 14, y: -5, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_latrobest_110", + name: "La Trobe St - 110 block", + short: ansi!("=="), + description: "A moderately wide road that is now overgrown and completely covered in weeds", + description_less_explicit: None, + grid_coords: GridCoords { x: 15, y: -5, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_latrobest_100", + name: "La Trobe St - 100 block", + short: ansi!("=="), + description: "A moderately wide road that is now overgrown and completely covered in weeds", + description_less_explicit: None, + grid_coords: GridCoords { x: 16, y: -5, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_lonsdalest_210", - name: "Lonsdale St - 210 block", - short: ansi!("=="), - description: "A two-lane each way road that has been rather poorly maintained. Potholes dot the ashphalt and cracks line the footpaths", - description_less_explicit: None, - grid_coords: GridCoords { x: 2, y: -1, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_lonsdalest_200", - name: "Lonsdale St - 200 block", - short: ansi!("=="), - description: "A two-lane each way road that has been rather poorly maintained. Potholes dot the ashphalt and cracks line the footpaths", - description_less_explicit: None, - grid_coords: GridCoords { x: 3, y: -1, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_mckillocks_self_defence", - name: "McKillock's Self Defence", - short: ansi!("MS"), - description: ansi!("A neatly painted shop with bars covering the window, and a mean looking shop-keeper sitting behind a desk. [Use list to see stock for sale here]"), - description_less_explicit: None, - grid_coords: GridCoords { x: 3, y: 0, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - ), - should_caption: true, - stock_list: vec!( - RoomStock { - possession_type: PossessionType::AntennaWhip, - list_price: 100, - ..Default::default() - } - ), - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_lonsdalest_190", - name: "Lonsdale St - 190 block", - short: ansi!("=="), - description: "A two-lane each way road that has been rather poorly maintained. Potholes dot the ashphalt and cracks line the footpaths", - description_less_explicit: None, - grid_coords: GridCoords { x: 4, y: -1, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_williamstlonsdalest", - name: "Williams St & Lonsdale St", - short: ansi!("##"), - description: "An intersection of two moderately wide roads, both poorly maintained", - description_less_explicit: None, - grid_coords: GridCoords { x: 5, y: -1, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_lonsdalest_180", - name: "Lonsdale St - 180 block", - short: ansi!("=="), - description: "A two-lane each way road that has been rather poorly maintained. Potholes dot the ashphalt and cracks line the footpaths", - description_less_explicit: None, - grid_coords: GridCoords { x: 6, y: -1, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_lonsdalest_170", - name: "Lonsdale St - 170 block", - short: ansi!("=="), - description: "A two-lane each way road that has been rather poorly maintained. Potholes dot the ashphalt and cracks line the footpaths", - description_less_explicit: None, - grid_coords: GridCoords { x: 7, y: -1, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_lonsdalest_160", - name: "Lonsdale St - 160 block", - short: ansi!("=="), - description: "A two-lane each way road that has been rather poorly maintained. Potholes dot the ashphalt and cracks line the footpaths", - description_less_explicit: None, - grid_coords: GridCoords { x: 8, y: -1, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_queenst_lonsdalest", - name: "Queen St & Lonsdale St", - short: ansi!("##"), - description: "A relatively wide roads intersects a narrower road; both roads are littered with potholes in which weeds have set root", - description_less_explicit: None, - grid_coords: GridCoords { x: 9, y: -1, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_lonsdalest_150", - name: "Lonsdale St - 150 block", - short: ansi!("=="), - description: "A two-lane each way road that has been rather poorly maintained. Potholes dot the ashphalt and cracks line the footpaths", - description_less_explicit: None, - grid_coords: GridCoords { x: 10, y: -1, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_lonsdalest_140", - name: "Lonsdale St - 140 block", - short: ansi!("=="), - description: "A two-lane each way road that has been rather poorly maintained. Potholes dot the ashphalt and cracks line the footpaths", - description_less_explicit: None, - grid_coords: GridCoords { x: 11, y: -1, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_lonsdalest_130", - name: "Lonsdale St - 130 block", - short: ansi!("=="), - description: "A two-lane each way road that has been rather poorly maintained. Potholes dot the ashphalt and cracks line the footpaths", - description_less_explicit: None, - grid_coords: GridCoords { x: 12, y: -1, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_elizabethst_lonsdalest", - name: "Elizabeth St & Lonsdale St", - short: ansi!("##"), - description: "A pot-holded two-lane each way road intersects a wide road stained from years of neglect", - description_less_explicit: None, - grid_coords: GridCoords { x: 13, y: -1, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_lonsdalest_120", - name: "Lonsdale St - 120 block", - short: ansi!("=="), - description: "A two-lane each way road that has been rather poorly maintained. Potholes dot the ashphalt and cracks line the footpaths", - description_less_explicit: None, - grid_coords: GridCoords { x: 14, y: -1, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_lonsdalest_110", - name: "Lonsdale St - 110 block", - short: ansi!("=="), - description: "A two-lane each way road that has been rather poorly maintained. Potholes dot the ashphalt and cracks line the footpaths", - description_less_explicit: None, - grid_coords: GridCoords { x: 15, y: -1, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_lonsdalest_100", - name: "Lonsdale St - 100 block", - short: ansi!("=="), - description: "A two-lane each way road that has been rather poorly maintained. Potholes dot the ashphalt and cracks line the footpaths", - description_less_explicit: None, - grid_coords: GridCoords { x: 16, y: -1, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_lonsdalest_210", + name: "Lonsdale St - 210 block", + short: ansi!("=="), + description: "A two-lane each way road that has been rather poorly maintained. Potholes dot the ashphalt and cracks line the footpaths", + description_less_explicit: None, + grid_coords: GridCoords { x: 2, y: -1, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_lonsdalest_200", + name: "Lonsdale St - 200 block", + short: ansi!("=="), + description: "A two-lane each way road that has been rather poorly maintained. Potholes dot the ashphalt and cracks line the footpaths", + description_less_explicit: None, + grid_coords: GridCoords { x: 3, y: -1, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_mckillocks_self_defence", + name: "McKillock's Self Defence", + short: ansi!("MS"), + description: ansi!("A neatly painted shop with bars covering the window, and a mean looking shop-keeper sitting behind a desk. [Use list to see stock for sale here]"), + description_less_explicit: None, + grid_coords: GridCoords { x: 3, y: 0, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + ), + should_caption: true, + stock_list: vec!( + RoomStock { + possession_type: PossessionType::AntennaWhip, + list_price: 100, + ..Default::default() + } + ), + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_lonsdalest_190", + name: "Lonsdale St - 190 block", + short: ansi!("=="), + description: "A two-lane each way road that has been rather poorly maintained. Potholes dot the ashphalt and cracks line the footpaths", + description_less_explicit: None, + grid_coords: GridCoords { x: 4, y: -1, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_williamstlonsdalest", + name: "Williams St & Lonsdale St", + short: ansi!("##"), + description: "An intersection of two moderately wide roads, both poorly maintained", + description_less_explicit: None, + grid_coords: GridCoords { x: 5, y: -1, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_lonsdalest_180", + name: "Lonsdale St - 180 block", + short: ansi!("=="), + description: "A two-lane each way road that has been rather poorly maintained. Potholes dot the ashphalt and cracks line the footpaths", + description_less_explicit: None, + grid_coords: GridCoords { x: 6, y: -1, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_lonsdalest_170", + name: "Lonsdale St - 170 block", + short: ansi!("=="), + description: "A two-lane each way road that has been rather poorly maintained. Potholes dot the ashphalt and cracks line the footpaths", + description_less_explicit: None, + grid_coords: GridCoords { x: 7, y: -1, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_lonsdalest_160", + name: "Lonsdale St - 160 block", + short: ansi!("=="), + description: "A two-lane each way road that has been rather poorly maintained. Potholes dot the ashphalt and cracks line the footpaths", + description_less_explicit: None, + grid_coords: GridCoords { x: 8, y: -1, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_queenst_lonsdalest", + name: "Queen St & Lonsdale St", + short: ansi!("##"), + description: "A relatively wide roads intersects a narrower road; both roads are littered with potholes in which weeds have set root", + description_less_explicit: None, + grid_coords: GridCoords { x: 9, y: -1, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_lonsdalest_150", + name: "Lonsdale St - 150 block", + short: ansi!("=="), + description: "A two-lane each way road that has been rather poorly maintained. Potholes dot the ashphalt and cracks line the footpaths", + description_less_explicit: None, + grid_coords: GridCoords { x: 10, y: -1, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_lonsdalest_140", + name: "Lonsdale St - 140 block", + short: ansi!("=="), + description: "A two-lane each way road that has been rather poorly maintained. Potholes dot the ashphalt and cracks line the footpaths", + description_less_explicit: None, + grid_coords: GridCoords { x: 11, y: -1, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_lonsdalest_130", + name: "Lonsdale St - 130 block", + short: ansi!("=="), + description: "A two-lane each way road that has been rather poorly maintained. Potholes dot the ashphalt and cracks line the footpaths", + description_less_explicit: None, + grid_coords: GridCoords { x: 12, y: -1, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_elizabethst_lonsdalest", + name: "Elizabeth St & Lonsdale St", + short: ansi!("##"), + description: "A pot-holded two-lane each way road intersects a wide road stained from years of neglect", + description_less_explicit: None, + grid_coords: GridCoords { x: 13, y: -1, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_lonsdalest_120", + name: "Lonsdale St - 120 block", + short: ansi!("=="), + description: "A two-lane each way road that has been rather poorly maintained. Potholes dot the ashphalt and cracks line the footpaths", + description_less_explicit: None, + grid_coords: GridCoords { x: 14, y: -1, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_lonsdalest_110", + name: "Lonsdale St - 110 block", + short: ansi!("=="), + description: "A two-lane each way road that has been rather poorly maintained. Potholes dot the ashphalt and cracks line the footpaths", + description_less_explicit: None, + grid_coords: GridCoords { x: 15, y: -1, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_lonsdalest_100", + name: "Lonsdale St - 100 block", + short: ansi!("=="), + description: "A two-lane each way road that has been rather poorly maintained. Potholes dot the ashphalt and cracks line the footpaths", + description_less_explicit: None, + grid_coords: GridCoords { x: 16, y: -1, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_williamsst_10", - name: "Williams St - 10 block", - short: ansi!("||"), - description: "A moderately wide road with a long crack in the asphalt running along its length", - description_less_explicit: None, - grid_coords: GridCoords { x: 5, y: -4, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_williamsst_20", - name: "Williams St - 20 block", - short: ansi!("||"), - description: "A moderately wide road with a long crack in the asphalt running along its length", - description_less_explicit: None, - grid_coords: GridCoords { x: 5, y: -3, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_williamsst_30", - name: "Williams St - 30 block", - short: ansi!("||"), - description: "A moderately wide road with a long crack in the asphalt running along its length", - description_less_explicit: None, - grid_coords: GridCoords { x: 5, y: -2, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_williamsst_40", - name: ansi!("Williams St - 40 block"), - short: ansi!("||"), - description: ansi!( - "A moderately wide road with a long crack in the asphalt running along its length"), - description_less_explicit: None, - grid_coords: GridCoords { x: 5, y: 0, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_williamsst_50", - name: ansi!("Williams St - 50 block"), - short: ansi!("||"), - description: ansi!( - "A moderately wide road with a long crack in the asphalt running along its length"), - description_less_explicit: None, - grid_coords: GridCoords { x: 5, y: 1, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_williamsst_60", - name: "Williams St - 60 block", - short: ansi!("||"), - description: "A moderately wide road with a long crack in the asphalt running along its length", - description_less_explicit: None, - grid_coords: GridCoords { x: 5, y: 2, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - target: ExitTarget::Custom("room/melbs_atopboardedup"), - exit_climb: Some(ExitClimb { - height: 10, - difficulty: 10 - }), - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_boardedup", - name: "Boarded Up Building", - short: ansi!("BB"), - description: "It seems abandoned here - everything is boarded up", - description_less_explicit: None, - grid_coords: GridCoords { x: 6, y: 2, z: 0 }, - exits: vec!( - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_atopboardedup", - name: "Atop the Boarded Up Building", - short: ansi!("BB"), - description: "A flat concrete rooftop above an abandoned building. What was apparently once a rooftop garden in concrete planter boxes is now mostly a tangled mess of weeds and rubbish", - description_less_explicit: None, - grid_coords: GridCoords { x: 6, y: 2, z: 1 }, - exits: vec!( - Exit { - direction: Direction::WEST, - target: ExitTarget::Custom("room/melbs_williamsst_60"), - exit_climb: Some(ExitClimb { - height: -10, - difficulty: 1 - }), - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_williamsst_bourkest", - name: "Williams St & Bourke St", - short: ansi!("##"), - description: "A moderately wide road with a long crack in the asphalt running along its length intersects a 4-lane road with wide but heavily cracked concrete footpaths", - description_less_explicit: None, - grid_coords: GridCoords { x: 5, y: 3, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - Exit { - direction: Direction::WEST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_williamsst_70", - name: "Williams St - 70 block", - short: ansi!("||"), - description: "A moderately wide road with a long crack in the asphalt running along its length", - description_less_explicit: None, - grid_coords: GridCoords { x: 5, y: 4, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_dustypages", - name: "The Dusty Pages", - short: ansi!("DP"), - description: "Beneath a large hand-carved wooden sign reading \"The Dusty Pages\" lies a small oasis of knowledge. The room is dimly lit, with flickering candles and shafts of sunlight piercing through cracked windows. The air is heavy with the scent of decaying books and the lingering memories of a bygone era.\n\nShelves made of salvaged wood stand defiantly against the crumbling walls, bearing the weight of books that have miraculously survived the ravages of time and nuclear fallout. The covers are worn and the pages yellowed, but the knowledge contained within remains invaluable.\n\nThe inhabitants of this forsaken land gather here, seeking solace and hope within the forgotten stories and practical guides that line the shelves.\n\nThe Dusty Pages stands as a beacon of intellectual survival, a sanctuary where survivors can momentarily escape the harsh realities of their existence", - description_less_explicit: None, - grid_coords: GridCoords { x: 6, y: 4, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_williamsst_10", + name: "Williams St - 10 block", + short: ansi!("||"), + description: "A moderately wide road with a long crack in the asphalt running along its length", + description_less_explicit: None, + grid_coords: GridCoords { x: 5, y: -4, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_williamsst_20", + name: "Williams St - 20 block", + short: ansi!("||"), + description: "A moderately wide road with a long crack in the asphalt running along its length", + description_less_explicit: None, + grid_coords: GridCoords { x: 5, y: -3, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_williamsst_30", + name: "Williams St - 30 block", + short: ansi!("||"), + description: "A moderately wide road with a long crack in the asphalt running along its length", + description_less_explicit: None, + grid_coords: GridCoords { x: 5, y: -2, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_williamsst_40", + name: ansi!("Williams St - 40 block"), + short: ansi!("||"), + description: ansi!( + "A moderately wide road with a long crack in the asphalt running along its length"), + description_less_explicit: None, + grid_coords: GridCoords { x: 5, y: 0, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_williamsst_50", + name: ansi!("Williams St - 50 block"), + short: ansi!("||"), + description: ansi!( + "A moderately wide road with a long crack in the asphalt running along its length"), + description_less_explicit: None, + grid_coords: GridCoords { x: 5, y: 1, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_williamsst_60", + name: "Williams St - 60 block", + short: ansi!("||"), + description: "A moderately wide road with a long crack in the asphalt running along its length", + description_less_explicit: None, + grid_coords: GridCoords { x: 5, y: 2, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + target: ExitTarget::Custom("room/melbs_atopboardedup"), + exit_climb: Some(ExitClimb { + height: 10, + difficulty: 10 + }), + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_boardedup", + name: "Boarded Up Building", + short: ansi!("BB"), + description: "It seems abandoned here - everything is boarded up", + description_less_explicit: None, + grid_coords: GridCoords { x: 6, y: 2, z: 0 }, + exits: vec!( + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_atopboardedup", + name: "Atop the Boarded Up Building", + short: ansi!("BB"), + description: "A flat concrete rooftop above an abandoned building. What was apparently once a rooftop garden in concrete planter boxes is now mostly a tangled mess of weeds and rubbish", + description_less_explicit: None, + grid_coords: GridCoords { x: 6, y: 2, z: 1 }, + exits: vec!( + Exit { + direction: Direction::WEST, + target: ExitTarget::Custom("room/melbs_williamsst_60"), + exit_climb: Some(ExitClimb { + height: -10, + difficulty: 1 + }), + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_williamsst_bourkest", + name: "Williams St & Bourke St", + short: ansi!("##"), + description: "A moderately wide road with a long crack in the asphalt running along its length intersects a 4-lane road with wide but heavily cracked concrete footpaths", + description_less_explicit: None, + grid_coords: GridCoords { x: 5, y: 3, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + Exit { + direction: Direction::WEST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_williamsst_70", + name: "Williams St - 70 block", + short: ansi!("||"), + description: "A moderately wide road with a long crack in the asphalt running along its length", + description_less_explicit: None, + grid_coords: GridCoords { x: 5, y: 4, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_dustypages", + name: "The Dusty Pages", + short: ansi!("DP"), + description: "Beneath a large hand-carved wooden sign reading \"The Dusty Pages\" lies a small oasis of knowledge. The room is dimly lit, with flickering candles and shafts of sunlight piercing through cracked windows. The air is heavy with the scent of decaying books and the lingering memories of a bygone era.\n\nShelves made of salvaged wood stand defiantly against the crumbling walls, bearing the weight of books that have miraculously survived the ravages of time and nuclear fallout. The covers are worn and the pages yellowed, but the knowledge contained within remains invaluable.\n\nThe inhabitants of this forsaken land gather here, seeking solace and hope within the forgotten stories and practical guides that line the shelves.\n\nThe Dusty Pages stands as a beacon of intellectual survival, a sanctuary where survivors can momentarily escape the harsh realities of their existence", + description_less_explicit: None, + grid_coords: GridCoords { x: 6, y: 4, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + ), + should_caption: true, + stock_list: vec!( + RoomStock { + possession_type: PossessionType::CulinaryEssentials, + list_price: 200, + ..Default::default() + } + ), + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_williamsst_80", + name: "Williams St - 80 block", + short: ansi!("||"), + description: "A moderately wide road with a long crack in the asphalt running along its length", + description_less_explicit: None, + grid_coords: GridCoords { x: 5, y: 5, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "kings_office", + name: "Kings Office", + short: ansi!("KO"), + description: ansi!("A dilapidated office that clearly was once a grand governor's office under the empire. It is now barely maintained. The self-styled king slouches behind a desk in the corner, shuffling paperwork around his desk. [Use list to see contracts for sale here]"), + description_less_explicit: None, + grid_coords: GridCoords { x: 6, y: 5, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + ), + should_caption: true, + stock_list: vec!( + RoomStock { + possession_type: PossessionType::NewCorpLicence, + list_price: 5000, + ..Default::default() + } + ), + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_williamsst_90", + name: "Williams St - 90 block", + short: ansi!("||"), + description: "A moderately wide road with a long crack in the asphalt running along its length", + description_less_explicit: None, + grid_coords: GridCoords { x: 5, y: 6, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_williamsst_collinsst", + name: "Williams St & Collins St", + short: ansi!("##"), + description: "A moderately wide road with a long crack in the asphalt running along its length intersects a wide 4-lane road. Potholes dot the ashphalt road, while cracks line the footpaths on either side", + description_less_explicit: None, + grid_coords: GridCoords { x: 5, y: 7, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + Exit { + direction: Direction::WEST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_williamsst_100", + name: "Williams St - 100 block", + short: ansi!("||"), + description: "A moderately wide road with a long crack in the asphalt running along its length", + description_less_explicit: None, + grid_coords: GridCoords { x: 5, y: 8, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_williamsst_110", + name: "Williams St - 110 block", + short: ansi!("||"), + description: "A moderately wide road with a long crack in the asphalt running along its length", + description_less_explicit: None, + grid_coords: GridCoords { x: 5, y: 9, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_williamsst_120", + name: "Williams St - 120 block", + short: ansi!("||"), + description: "A moderately wide road with a long crack in the asphalt running along its length", + description_less_explicit: None, + grid_coords: GridCoords { x: 5, y: 10, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_bourkest_210", + name: "Bourke St - 210 block", + short: ansi!("=="), + description: "A 4-lane road with wide but heavily cracked concrete footpaths. Potholes dot the ashphalt", + description_less_explicit: None, + grid_coords: GridCoords { x: 2, y: 3, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_riotready", + name: "Riot Ready", + short: ansi!("RR"), + description: ansi!("A small shop filled with shelves, racks, and hangers that seem to hold all kinds of safety and tactical defensive equipment that one might need to survive in a post-apocalyptic world. A weary looking middle aged lady stands on the display floor, herself clad in black tactical helmets and vests, making you wonder if it is to showcase the wares, or protect herself from looters. Across her right breast is a name tag reading \"Sharon\" with a logo featuring a smiley face below it. [Type list to see what's for sale]"), + description_less_explicit: None, + grid_coords: GridCoords { x: 2, y: 2, z: 0 }, + exits: vec!( + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: true, + stock_list: vec!( + RoomStock { + possession_type: PossessionType::HockeyMask, + list_price: 1000, + ..Default::default() + }, + RoomStock { + possession_type: PossessionType::LeatherJacket, + list_price: 500, + ..Default::default() + }, + RoomStock { + possession_type: PossessionType::LeatherPants, + list_price: 500, + ..Default::default() + }, + ), + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_bourkest_200", + name: "Bourke St - 200 block", + short: ansi!("=="), + description: "A 4-lane road with wide but heavily cracked concrete footpaths. Potholes dot the ashphalt", + description_less_explicit: None, + grid_coords: GridCoords { x: 3, y: 3, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_healthtech", + name: "Healthtech", + short: ansi!("HT"), + description: "A store full of beeping gadgets locked in glass display cabinets, all of which seem to be focused around health and medicine. A tall male technician in a white lab coat stands behind a counter, his eyes following you hoping that you are going to buy something", + description_less_explicit: None, + grid_coords: GridCoords { x: 3, y: 2, z: 0 }, + exits: vec!( + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + stock_list: vec!( + RoomStock { + possession_type: PossessionType::MediumTraumaKit, + list_price: 80, + ..Default::default() + } + ), + should_caption: true, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_grande_outdoors", + name: "Grande Outdoors", + short: ansi!("GO"), + description: "A shop that looks like it once helped people camp for fun, its clientele now days are probably more focused on just surviving! A weary looking woman with calloused, grease covered hands paces the shop floor, prepared to spring on you and hype up whatever merchandise you look at as the best thing ever", + description_less_explicit: None, + grid_coords: GridCoords { x: 3, y: 4, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + ), + stock_list: vec!( + RoomStock { + possession_type: PossessionType::ButcherKnife, + list_price: 120, + ..Default::default() + }, + RoomStock { + possession_type: PossessionType::RustyMetalPot, + list_price: 400, + ..Default::default() + }, + RoomStock { + possession_type: PossessionType::DuffelBag, + list_price: 250, + ..Default::default() + }, + ), + should_caption: true, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_bourkest_190", + name: "Bourke St - 190 block", + short: ansi!("=="), + description: "A 4-lane road with wide but heavily cracked concrete footpaths. Potholes dot the ashphalt", + description_less_explicit: None, + grid_coords: GridCoords { x: 4, y: 3, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_bourkest_180", + name: "Bourke St - 180 block", + short: ansi!("=="), + description: "A 4-lane road with wide but heavily cracked concrete footpaths. Potholes dot the ashphalt", + description_less_explicit: None, + grid_coords: GridCoords { x: 6, y: 3, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_bourkest_170", + name: "Bourke St - 170 block", + short: ansi!("=="), + description: "A 4-lane road with wide but heavily cracked concrete footpaths. Potholes dot the ashphalt", + description_less_explicit: None, + grid_coords: GridCoords { x: 7, y: 3, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + code: "melbs_bourkest_160", + name: "Bourke St - 160 block", + short: ansi!("=="), + description: "A 4-lane road with wide but heavily cracked concrete footpaths. Potholes dot the ashphalt", + description_less_explicit: None, + grid_coords: GridCoords { x: 8, y: 3, z: 0 }, + secondary_zones: vec!( + SecondaryZoneRecord { + zone: "chonkers", + short: ansi!("=="), + grid_coords: GridCoords { x: 0, y: 1, z: 0 }, + caption: Some("Melbs") + } ), - should_caption: true, - stock_list: vec!( - RoomStock { - possession_type: PossessionType::CulinaryEssentials, - list_price: 200, - ..Default::default() - } - ), - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_williamsst_80", - name: "Williams St - 80 block", - short: ansi!("||"), - description: "A moderately wide road with a long crack in the asphalt running along its length", - description_less_explicit: None, - grid_coords: GridCoords { x: 5, y: 5, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "kings_office", - name: "Kings Office", - short: ansi!("KO"), - description: ansi!("A dilapidated office that clearly was once a grand governor's office under the empire. It is now barely maintained. The self-styled king slouches behind a desk in the corner, shuffling paperwork around his desk. [Use list to see contracts for sale here]"), - description_less_explicit: None, - grid_coords: GridCoords { x: 6, y: 5, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - ), - should_caption: true, - stock_list: vec!( - RoomStock { - possession_type: PossessionType::NewCorpLicence, - list_price: 5000, - ..Default::default() - } - ), - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_williamsst_90", - name: "Williams St - 90 block", - short: ansi!("||"), - description: "A moderately wide road with a long crack in the asphalt running along its length", - description_less_explicit: None, - grid_coords: GridCoords { x: 5, y: 6, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_williamsst_collinsst", - name: "Williams St & Collins St", - short: ansi!("##"), - description: "A moderately wide road with a long crack in the asphalt running along its length intersects a wide 4-lane road. Potholes dot the ashphalt road, while cracks line the footpaths on either side", - description_less_explicit: None, - grid_coords: GridCoords { x: 5, y: 7, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - Exit { - direction: Direction::WEST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_williamsst_100", - name: "Williams St - 100 block", - short: ansi!("||"), - description: "A moderately wide road with a long crack in the asphalt running along its length", - description_less_explicit: None, - grid_coords: GridCoords { x: 5, y: 8, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_williamsst_110", - name: "Williams St - 110 block", - short: ansi!("||"), - description: "A moderately wide road with a long crack in the asphalt running along its length", - description_less_explicit: None, - grid_coords: GridCoords { x: 5, y: 9, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_williamsst_120", - name: "Williams St - 120 block", - short: ansi!("||"), - description: "A moderately wide road with a long crack in the asphalt running along its length", - description_less_explicit: None, - grid_coords: GridCoords { x: 5, y: 10, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_bourkest_210", - name: "Bourke St - 210 block", - short: ansi!("=="), - description: "A 4-lane road with wide but heavily cracked concrete footpaths. Potholes dot the ashphalt", - description_less_explicit: None, - grid_coords: GridCoords { x: 2, y: 3, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_riotready", - name: "Riot Ready", - short: ansi!("RR"), - description: ansi!("A small shop filled with shelves, racks, and hangers that seem to hold all kinds of safety and tactical defensive equipment that one might need to survive in a post-apocalyptic world. A weary looking middle aged lady stands on the display floor, herself clad in black tactical helmets and vests, making you wonder if it is to showcase the wares, or protect herself from looters. Across her right breast is a name tag reading \"Sharon\" with a logo featuring a smiley face below it. [Type list to see what's for sale]"), - description_less_explicit: None, - grid_coords: GridCoords { x: 2, y: 2, z: 0 }, - exits: vec!( - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: true, - stock_list: vec!( - RoomStock { - possession_type: PossessionType::HockeyMask, - list_price: 1000, - ..Default::default() - }, - RoomStock { - possession_type: PossessionType::LeatherJacket, - list_price: 500, - ..Default::default() - }, - RoomStock { - possession_type: PossessionType::LeatherPants, - list_price: 500, - ..Default::default() - }, - ), - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_bourkest_200", - name: "Bourke St - 200 block", - short: ansi!("=="), - description: "A 4-lane road with wide but heavily cracked concrete footpaths. Potholes dot the ashphalt", - description_less_explicit: None, - grid_coords: GridCoords { x: 3, y: 3, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_healthtech", - name: "Healthtech", - short: ansi!("HT"), - description: "A store full of beeping gadgets locked in glass display cabinets, all of which seem to be focused around health and medicine. A tall male technician in a white lab coat stands behind a counter, his eyes following you hoping that you are going to buy something", - description_less_explicit: None, - grid_coords: GridCoords { x: 3, y: 2, z: 0 }, - exits: vec!( - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - stock_list: vec!( - RoomStock { - possession_type: PossessionType::MediumTraumaKit, - list_price: 80, - ..Default::default() - } - ), - should_caption: true, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_grande_outdoors", - name: "Grande Outdoors", - short: ansi!("GO"), - description: "A shop that looks like it once helped people camp for fun, its clientele now days are probably more focused on just surviving! A weary looking woman with calloused, grease covered hands paces the shop floor, prepared to spring on you and hype up whatever merchandise you look at as the best thing ever", - description_less_explicit: None, - grid_coords: GridCoords { x: 3, y: 4, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - ), - stock_list: vec!( - RoomStock { - possession_type: PossessionType::ButcherKnife, - list_price: 120, - ..Default::default() - }, - RoomStock { - possession_type: PossessionType::RustyMetalPot, - list_price: 400, - ..Default::default() - }, - ), - should_caption: true, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_bourkest_190", - name: "Bourke St - 190 block", - short: ansi!("=="), - description: "A 4-lane road with wide but heavily cracked concrete footpaths. Potholes dot the ashphalt", - description_less_explicit: None, - grid_coords: GridCoords { x: 4, y: 3, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_bourkest_180", - name: "Bourke St - 180 block", - short: ansi!("=="), - description: "A 4-lane road with wide but heavily cracked concrete footpaths. Potholes dot the ashphalt", - description_less_explicit: None, - grid_coords: GridCoords { x: 6, y: 3, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_bourkest_170", - name: "Bourke St - 170 block", - short: ansi!("=="), - description: "A 4-lane road with wide but heavily cracked concrete footpaths. Potholes dot the ashphalt", - description_less_explicit: None, - grid_coords: GridCoords { x: 7, y: 3, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - code: "melbs_bourkest_160", - name: "Bourke St - 160 block", - short: ansi!("=="), - description: "A 4-lane road with wide but heavily cracked concrete footpaths. Potholes dot the ashphalt", - description_less_explicit: None, - grid_coords: GridCoords { x: 8, y: 3, z: 0 }, - secondary_zones: vec!( - SecondaryZoneRecord { - zone: "chonkers", - short: ansi!("=="), - grid_coords: GridCoords { x: 0, y: 1, z: 0 }, - caption: Some("Melbs") - } - ), - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - Exit { - direction: Direction::NORTH, - target: ExitTarget::Custom("room/chonkers_strength_hall"), - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_queenst_bourkest", - name: "Queen St & Bourke St", - short: ansi!("##"), - description: "A relatively wide roads intersects a narrower road; both roads are littered with potholes in which weeds have set root", - description_less_explicit: None, - grid_coords: GridCoords { x: 9, y: 3, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_bourkest_150", - name: "Bourke St - 150 block", - short: ansi!("=="), - description: "A 4-lane road with wide but heavily cracked concrete footpaths. Potholes dot the ashphalt", - description_less_explicit: None, - grid_coords: GridCoords { x: 10, y: 3, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_bourkest_140", - name: "Bourke St - 140 block", - short: ansi!("=="), - description: "A 4-lane road with wide but heavily cracked concrete footpaths. Potholes dot the ashphalt", - description_less_explicit: None, - grid_coords: GridCoords { x: 11, y: 3, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_bourkest_130", - name: "Bourke St - 130 block", - short: ansi!("=="), - description: "A 4-lane road with wide but heavily cracked concrete footpaths. Potholes dot the ashphalt", - description_less_explicit: None, - grid_coords: GridCoords { x: 12, y: 3, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_elizabethst_bourkest", - name: "Elizabeth St & Bourke St", - short: ansi!("##"), - description: "A pot-holded two-lane each way road intersects a wide road stained from years of neglect", - description_less_explicit: None, - grid_coords: GridCoords { x: 13, y: 3, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_bourkest_120", - name: "Bourke St - 120 block", - short: ansi!("=="), - description: "A 4-lane road with wide but heavily cracked concrete footpaths. Potholes dot the ashphalt", - description_less_explicit: None, - grid_coords: GridCoords { x: 14, y: 3, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_bourkest_110", - name: "Bourke St - 110 block", - short: ansi!("=="), - description: "A 4-lane road with wide but heavily cracked concrete footpaths. Potholes dot the ashphalt", - description_less_explicit: None, - grid_coords: GridCoords { x: 15, y: 3, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_bourkest_100", - name: "Bourke St - 100 block", - short: ansi!("=="), - description: "A 4-lane road with wide but heavily cracked concrete footpaths. Potholes dot the ashphalt", - description_less_explicit: None, - grid_coords: GridCoords { x: 16, y: 3, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + Exit { + direction: Direction::NORTH, + target: ExitTarget::Custom("room/chonkers_strength_hall"), + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_queenst_bourkest", + name: "Queen St & Bourke St", + short: ansi!("##"), + description: "A relatively wide roads intersects a narrower road; both roads are littered with potholes in which weeds have set root", + description_less_explicit: None, + grid_coords: GridCoords { x: 9, y: 3, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_bourkest_150", + name: "Bourke St - 150 block", + short: ansi!("=="), + description: "A 4-lane road with wide but heavily cracked concrete footpaths. Potholes dot the ashphalt", + description_less_explicit: None, + grid_coords: GridCoords { x: 10, y: 3, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_bourkest_140", + name: "Bourke St - 140 block", + short: ansi!("=="), + description: "A 4-lane road with wide but heavily cracked concrete footpaths. Potholes dot the ashphalt", + description_less_explicit: None, + grid_coords: GridCoords { x: 11, y: 3, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_bourkest_130", + name: "Bourke St - 130 block", + short: ansi!("=="), + description: "A 4-lane road with wide but heavily cracked concrete footpaths. Potholes dot the ashphalt", + description_less_explicit: None, + grid_coords: GridCoords { x: 12, y: 3, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_elizabethst_bourkest", + name: "Elizabeth St & Bourke St", + short: ansi!("##"), + description: "A pot-holded two-lane each way road intersects a wide road stained from years of neglect", + description_less_explicit: None, + grid_coords: GridCoords { x: 13, y: 3, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_bourkest_120", + name: "Bourke St - 120 block", + short: ansi!("=="), + description: "A 4-lane road with wide but heavily cracked concrete footpaths. Potholes dot the ashphalt", + description_less_explicit: None, + grid_coords: GridCoords { x: 14, y: 3, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_bourkest_110", + name: "Bourke St - 110 block", + short: ansi!("=="), + description: "A 4-lane road with wide but heavily cracked concrete footpaths. Potholes dot the ashphalt", + description_less_explicit: None, + grid_coords: GridCoords { x: 15, y: 3, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_bourkest_100", + name: "Bourke St - 100 block", + short: ansi!("=="), + description: "A 4-lane road with wide but heavily cracked concrete footpaths. Potholes dot the ashphalt", + description_less_explicit: None, + grid_coords: GridCoords { x: 16, y: 3, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_queenst_10", - name: "Queen St - 10 block", - short: ansi!("||"), - description: "A fairly wide road where the surface has broken down but has been kept clear by regular foot traffic", - description_less_explicit: None, - grid_coords: GridCoords { x: 9, y: -4, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_queenst_20", - name: "Queen St - 20 block", - short: ansi!("||"), - description: "A fairly wide road where the surface has broken down but has been kept clear by regular foot traffic", - description_less_explicit: None, - grid_coords: GridCoords { x: 9, y: -3, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_queenst_30", - name: "Queen St - 30 block", - short: ansi!("||"), - description: "A fairly wide road where the surface has broken down but has been kept clear by regular foot traffic", - description_less_explicit: None, - grid_coords: GridCoords { x: 9, y: -2, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_queenst_40", - name: ansi!("Queen St - 40 block"), - short: ansi!("||"), - description: ansi!( - "A fairly wide road where the surface has broken down but has been kept clear by regular foot traffic"), - description_less_explicit: None, - grid_coords: GridCoords { x: 9, y: 0, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_queenst_50", - name: ansi!("Queen St - 50 block"), - short: ansi!("||"), - description: ansi!( - "A fairly wide road where the surface has broken down but has been kept clear by regular foot traffic"), - description_less_explicit: None, - grid_coords: GridCoords { x: 9, y: 1, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_queenst_60", - name: "Queen St - 60 block", - short: ansi!("||"), - description: "A fairly wide road where the surface has broken down but has been kept clear by regular foot traffic", - description_less_explicit: None, - grid_coords: GridCoords { x: 9, y: 2, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_queenst_70", - name: "Queen St - 70 block", - short: ansi!("||"), - description: "A fairly wide road where the surface has broken down but has been kept clear by regular foot traffic", - description_less_explicit: None, - grid_coords: GridCoords { x: 9, y: 4, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_queenst_80", - name: "Queen St - 80 block", - short: ansi!("||"), - description: "A fairly wide road where the surface has broken down but has been kept clear by regular foot traffic", - description_less_explicit: None, - grid_coords: GridCoords { x: 9, y: 5, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_queenst_90", - name: "Queen St - 90 block", - short: ansi!("||"), - description: "A fairly wide road where the surface has broken down but has been kept clear by regular foot traffic", - description_less_explicit: None, - grid_coords: GridCoords { x: 9, y: 6, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_queenst_collinsst", - name: "Queen St & Collins St", - short: ansi!("##"), - description: "A fairly wide road where the surface has broken down but has been kept clear by regular foot traffic intersects a wide 4-lane road. Potholes dot the ashphalt road, while cracks line the footpaths on either side", - description_less_explicit: None, - grid_coords: GridCoords { x: 9, y: 7, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - Exit { - direction: Direction::WEST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_queenst_100", - name: "Queen St - 100 block", - short: ansi!("||"), - description: "A fairly wide road where the surface has broken down but has been kept clear by regular foot traffic", - description_less_explicit: None, - grid_coords: GridCoords { x: 9, y: 8, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_queenst_110", - name: "Queen St - 110 block", - short: ansi!("||"), - description: "A fairly wide road where the surface has broken down but has been kept clear by regular foot traffic", - description_less_explicit: None, - grid_coords: GridCoords { x: 9, y: 9, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_queenst_120", - name: "Queen St - 120 block", - short: ansi!("||"), - description: "A fairly wide road where the surface has broken down but has been kept clear by regular foot traffic", - description_less_explicit: None, - grid_coords: GridCoords { x: 9, y: 10, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_queenst_10", + name: "Queen St - 10 block", + short: ansi!("||"), + description: "A fairly wide road where the surface has broken down but has been kept clear by regular foot traffic", + description_less_explicit: None, + grid_coords: GridCoords { x: 9, y: -4, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_queenst_20", + name: "Queen St - 20 block", + short: ansi!("||"), + description: "A fairly wide road where the surface has broken down but has been kept clear by regular foot traffic", + description_less_explicit: None, + grid_coords: GridCoords { x: 9, y: -3, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_queenst_30", + name: "Queen St - 30 block", + short: ansi!("||"), + description: "A fairly wide road where the surface has broken down but has been kept clear by regular foot traffic", + description_less_explicit: None, + grid_coords: GridCoords { x: 9, y: -2, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_queenst_40", + name: ansi!("Queen St - 40 block"), + short: ansi!("||"), + description: ansi!( + "A fairly wide road where the surface has broken down but has been kept clear by regular foot traffic"), + description_less_explicit: None, + grid_coords: GridCoords { x: 9, y: 0, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_queenst_50", + name: ansi!("Queen St - 50 block"), + short: ansi!("||"), + description: ansi!( + "A fairly wide road where the surface has broken down but has been kept clear by regular foot traffic"), + description_less_explicit: None, + grid_coords: GridCoords { x: 9, y: 1, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_queenst_60", + name: "Queen St - 60 block", + short: ansi!("||"), + description: "A fairly wide road where the surface has broken down but has been kept clear by regular foot traffic", + description_less_explicit: None, + grid_coords: GridCoords { x: 9, y: 2, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_queenst_70", + name: "Queen St - 70 block", + short: ansi!("||"), + description: "A fairly wide road where the surface has broken down but has been kept clear by regular foot traffic", + description_less_explicit: None, + grid_coords: GridCoords { x: 9, y: 4, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_queenst_80", + name: "Queen St - 80 block", + short: ansi!("||"), + description: "A fairly wide road where the surface has broken down but has been kept clear by regular foot traffic", + description_less_explicit: None, + grid_coords: GridCoords { x: 9, y: 5, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_queenst_90", + name: "Queen St - 90 block", + short: ansi!("||"), + description: "A fairly wide road where the surface has broken down but has been kept clear by regular foot traffic", + description_less_explicit: None, + grid_coords: GridCoords { x: 9, y: 6, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_queenst_collinsst", + name: "Queen St & Collins St", + short: ansi!("##"), + description: "A fairly wide road where the surface has broken down but has been kept clear by regular foot traffic intersects a wide 4-lane road. Potholes dot the ashphalt road, while cracks line the footpaths on either side", + description_less_explicit: None, + grid_coords: GridCoords { x: 9, y: 7, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + Exit { + direction: Direction::WEST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_queenst_100", + name: "Queen St - 100 block", + short: ansi!("||"), + description: "A fairly wide road where the surface has broken down but has been kept clear by regular foot traffic", + description_less_explicit: None, + grid_coords: GridCoords { x: 9, y: 8, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_queenst_110", + name: "Queen St - 110 block", + short: ansi!("||"), + description: "A fairly wide road where the surface has broken down but has been kept clear by regular foot traffic", + description_less_explicit: None, + grid_coords: GridCoords { x: 9, y: 9, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_queenst_120", + name: "Queen St - 120 block", + short: ansi!("||"), + description: "A fairly wide road where the surface has broken down but has been kept clear by regular foot traffic", + description_less_explicit: None, + grid_coords: GridCoords { x: 9, y: 10, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_collinsst_210", - name: "Collins St - 210 block", - short: ansi!("=="), - description: "A 4-lane road with round muddy potholes marring the poorly maintained asphalt surface", - description_less_explicit: None, - grid_coords: GridCoords { x: 2, y: 7, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_collinsst_200", - name: "Collins St - 200 block", - short: ansi!("=="), - description: "A 4-lane road with round muddy potholes marring the poorly maintained asphalt surface", - description_less_explicit: None, - grid_coords: GridCoords { x: 3, y: 7, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_collinsst_190", - name: "Collins St - 190 block", - short: ansi!("=="), - description: "A 4-lane road with round muddy potholes marring the poorly maintained asphalt surface", - description_less_explicit: None, - grid_coords: GridCoords { x: 4, y: 7, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_collinsst_180", - name: "Collins St - 180 block", - short: ansi!("=="), - description: "A 4-lane road with round muddy potholes marring the poorly maintained asphalt surface", - description_less_explicit: None, - grid_coords: GridCoords { x: 6, y: 7, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - Exit { - direction: Direction::SOUTHEAST, - ..Default::default() - } - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_lockedandloaded", - name: "Locked & Loaded", - short: ansi!("LL"), - description: "This seems to be some kind of security shop, selling locks from super high-tech to primitive. Behind a counter sits a grizzled old man, who appears eager to sell you something", - description_less_explicit: None, - grid_coords: GridCoords { x: 7, y: 8, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTHWEST, - ..Default::default() - }, - ), - stock_list: vec!( - RoomStock { - possession_type: PossessionType::Scanlock, - list_price: 200, - ..Default::default() - } - ), - should_caption: true, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_collinsst_170", - name: "Collins St - 170 block", - short: ansi!("=="), - description: "A 4-lane road with round muddy potholes marring the poorly maintained asphalt surface", - description_less_explicit: None, - grid_coords: GridCoords { x: 7, y: 7, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_collinsst_160", - name: "Collins St - 160 block", - short: ansi!("=="), - description: "A 4-lane road with round muddy potholes marring the poorly maintained asphalt surface", - description_less_explicit: None, - grid_coords: GridCoords { x: 8, y: 7, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_collinsst_150", - name: "Collins St - 150 block", - short: ansi!("=="), - description: "A 4-lane road with round muddy potholes marring the poorly maintained asphalt surface", - description_less_explicit: None, - grid_coords: GridCoords { x: 10, y: 7, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_collinsst_140", - name: "Collins St - 140 block", - short: ansi!("=="), - description: "A 4-lane road with round muddy potholes marring the poorly maintained asphalt surface", - description_less_explicit: None, - grid_coords: GridCoords { x: 11, y: 7, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_collinsst_130", - name: "Collins St - 130 block", - short: ansi!("=="), - description: "A 4-lane road with round muddy potholes marring the poorly maintained asphalt surface", - description_less_explicit: None, - grid_coords: GridCoords { x: 12, y: 7, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_elizabethst_collinsst", - name: "Elizabeth St & Collins St", - short: ansi!("##"), - description: "A 4-lane road with round muddy potholes intersects a wide road stained from years of neglect", - description_less_explicit: None, - grid_coords: GridCoords { x: 13, y: 7, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_collinsst_120", - name: "Collins St - 120 block", - short: ansi!("=="), - description: "A 4-lane road with round muddy potholes marring the poorly maintained asphalt surface", - description_less_explicit: None, - grid_coords: GridCoords { x: 14, y: 7, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_collinsst_110", - name: "Collins St - 110 block", - short: ansi!("=="), - description: "A 4-lane road with round muddy potholes marring the poorly maintained asphalt surface", - description_less_explicit: None, - grid_coords: GridCoords { x: 15, y: 7, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_collinsst_100", - name: "Collins St - 100 block", - short: ansi!("=="), - description: "A 4-lane road with round muddy potholes marring the poorly maintained asphalt surface", - description_less_explicit: None, - grid_coords: GridCoords { x: 16, y: 7, z: 0 }, - exits: vec!( - Exit { - direction: Direction::WEST, - ..Default::default() - }, - Exit { - direction: Direction::EAST, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_collinsst_210", + name: "Collins St - 210 block", + short: ansi!("=="), + description: "A 4-lane road with round muddy potholes marring the poorly maintained asphalt surface", + description_less_explicit: None, + grid_coords: GridCoords { x: 2, y: 7, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_collinsst_200", + name: "Collins St - 200 block", + short: ansi!("=="), + description: "A 4-lane road with round muddy potholes marring the poorly maintained asphalt surface", + description_less_explicit: None, + grid_coords: GridCoords { x: 3, y: 7, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_collinsst_190", + name: "Collins St - 190 block", + short: ansi!("=="), + description: "A 4-lane road with round muddy potholes marring the poorly maintained asphalt surface", + description_less_explicit: None, + grid_coords: GridCoords { x: 4, y: 7, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_collinsst_180", + name: "Collins St - 180 block", + short: ansi!("=="), + description: "A 4-lane road with round muddy potholes marring the poorly maintained asphalt surface", + description_less_explicit: None, + grid_coords: GridCoords { x: 6, y: 7, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + Exit { + direction: Direction::SOUTHEAST, + ..Default::default() + } + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_lockedandloaded", + name: "Locked & Loaded", + short: ansi!("LL"), + description: "This seems to be some kind of security shop, selling locks from super high-tech to primitive. Behind a counter sits a grizzled old man, who appears eager to sell you something", + description_less_explicit: None, + grid_coords: GridCoords { x: 7, y: 8, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTHWEST, + ..Default::default() + }, + ), + stock_list: vec!( + RoomStock { + possession_type: PossessionType::Scanlock, + list_price: 200, + ..Default::default() + } + ), + should_caption: true, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_collinsst_170", + name: "Collins St - 170 block", + short: ansi!("=="), + description: "A 4-lane road with round muddy potholes marring the poorly maintained asphalt surface", + description_less_explicit: None, + grid_coords: GridCoords { x: 7, y: 7, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_collinsst_160", + name: "Collins St - 160 block", + short: ansi!("=="), + description: "A 4-lane road with round muddy potholes marring the poorly maintained asphalt surface", + description_less_explicit: None, + grid_coords: GridCoords { x: 8, y: 7, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_collinsst_150", + name: "Collins St - 150 block", + short: ansi!("=="), + description: "A 4-lane road with round muddy potholes marring the poorly maintained asphalt surface", + description_less_explicit: None, + grid_coords: GridCoords { x: 10, y: 7, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_collinsst_140", + name: "Collins St - 140 block", + short: ansi!("=="), + description: "A 4-lane road with round muddy potholes marring the poorly maintained asphalt surface", + description_less_explicit: None, + grid_coords: GridCoords { x: 11, y: 7, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_collinsst_130", + name: "Collins St - 130 block", + short: ansi!("=="), + description: "A 4-lane road with round muddy potholes marring the poorly maintained asphalt surface", + description_less_explicit: None, + grid_coords: GridCoords { x: 12, y: 7, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_elizabethst_collinsst", + name: "Elizabeth St & Collins St", + short: ansi!("##"), + description: "A 4-lane road with round muddy potholes intersects a wide road stained from years of neglect", + description_less_explicit: None, + grid_coords: GridCoords { x: 13, y: 7, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_collinsst_120", + name: "Collins St - 120 block", + short: ansi!("=="), + description: "A 4-lane road with round muddy potholes marring the poorly maintained asphalt surface", + description_less_explicit: None, + grid_coords: GridCoords { x: 14, y: 7, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_collinsst_110", + name: "Collins St - 110 block", + short: ansi!("=="), + description: "A 4-lane road with round muddy potholes marring the poorly maintained asphalt surface", + description_less_explicit: None, + grid_coords: GridCoords { x: 15, y: 7, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_collinsst_100", + name: "Collins St - 100 block", + short: ansi!("=="), + description: "A 4-lane road with round muddy potholes marring the poorly maintained asphalt surface", + description_less_explicit: None, + grid_coords: GridCoords { x: 16, y: 7, z: 0 }, + exits: vec!( + Exit { + direction: Direction::WEST, + ..Default::default() + }, + Exit { + direction: Direction::EAST, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, - // New content marker - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_elizabethst_10", - name: "Elizabeth St - 10 block", - short: ansi!("||"), - description: "A wide road stained from years of neglect. The road smells foul, and you can make out brown, white, red, and even grey stains, as well as the occasional slick from ancient oil spilled on the surface", - description_less_explicit: None, - grid_coords: GridCoords { x: 13, y: -4, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_elizabethst_20", - name: "Elizabeth St - 20 block", - short: ansi!("||"), - description: "A wide road stained from years of neglect. The road smells foul, and you can make out brown, white, red, and even grey stains, as well as the occasional slick from ancient oil spilled on the surface", - description_less_explicit: None, - grid_coords: GridCoords { x: 13, y: -3, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_elizabethst_30", - name: "Elizabeth St - 30 block", - short: ansi!("||"), - description: "A wide road stained from years of neglect. The road smells foul, and you can make out brown, white, red, and even grey stains, as well as the occasional slick from ancient oil spilled on the surface", - description_less_explicit: None, - grid_coords: GridCoords { x: 13, y: -2, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_elizabethst_40", - name: ansi!("Elizabeth St - 40 block"), - short: ansi!("||"), - description: ansi!( - "A wide road stained from years of neglect. The road smells foul, and you can make out brown, white, red, and even grey stains, as well as the occasional slick from ancient oil spilled on the surface"), - description_less_explicit: None, - grid_coords: GridCoords { x: 13, y: 0, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_elizabethst_50", - name: ansi!("Elizabeth St - 50 block"), - short: ansi!("||"), - description: ansi!( - "A wide road stained from years of neglect. The road smells foul, and you can make out brown, white, red, and even grey stains, as well as the occasional slick from ancient oil spilled on the surface"), - description_less_explicit: None, - grid_coords: GridCoords { x: 13, y: 1, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_elizabethst_60", - name: "Elizabeth St - 60 block", - short: ansi!("||"), - description: "A wide road stained from years of neglect. The road smells foul, and you can make out brown, white, red, and even grey stains, as well as the occasional slick from ancient oil spilled on the surface", - description_less_explicit: None, - grid_coords: GridCoords { x: 13, y: 2, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_elizabethst_70", - name: "Elizabeth St - 70 block", - short: ansi!("||"), - description: "A wide road stained from years of neglect. The road smells foul, and you can make out brown, white, red, and even grey stains, as well as the occasional slick from ancient oil spilled on the surface", - description_less_explicit: None, - grid_coords: GridCoords { x: 13, y: 4, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_elizabethst_80", - name: "Elizabeth St - 80 block", - short: ansi!("||"), - description: "A wide road stained from years of neglect. The road smells foul, and you can make out brown, white, red, and even grey stains, as well as the occasional slick from ancient oil spilled on the surface", - description_less_explicit: None, - grid_coords: GridCoords { x: 13, y: 5, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_elizabethst_90", - name: "Elizabeth St - 90 block", - short: ansi!("||"), - description: "A wide road stained from years of neglect. The road smells foul, and you can make out brown, white, red, and even grey stains, as well as the occasional slick from ancient oil spilled on the surface", - description_less_explicit: None, - grid_coords: GridCoords { x: 13, y: 6, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_elizabethst_100", - name: "Elizabeth St - 100 block", - short: ansi!("||"), - description: "A wide road stained from years of neglect. The road smells foul, and you can make out brown, white, red, and even grey stains, as well as the occasional slick from ancient oil spilled on the surface", - description_less_explicit: None, - grid_coords: GridCoords { x: 13, y: 8, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_elizabethst_110", - name: "Elizabeth St - 110 block", - short: ansi!("||"), - description: "A wide road stained from years of neglect. The road smells foul, and you can make out brown, white, red, and even grey stains, as well as the occasional slick from ancient oil spilled on the surface", - description_less_explicit: None, - grid_coords: GridCoords { x: 13, y: 9, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - }, - Room { - zone: "melbs", - secondary_zones: vec!(), - code: "melbs_elizabethst_120", - name: "Elizabeth St - 120 block", - short: ansi!("||"), - description: "A fairly wide road where the surface has broken down but has been kept clear by regular foot traffic", - description_less_explicit: None, - grid_coords: GridCoords { x: 13, y: 10, z: 0 }, - exits: vec!( - Exit { - direction: Direction::NORTH, - ..Default::default() - }, - Exit { - direction: Direction::SOUTH, - ..Default::default() - }, - ), - should_caption: false, - ..Default::default() - } - ) + // New content marker + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_elizabethst_10", + name: "Elizabeth St - 10 block", + short: ansi!("||"), + description: "A wide road stained from years of neglect. The road smells foul, and you can make out brown, white, red, and even grey stains, as well as the occasional slick from ancient oil spilled on the surface", + description_less_explicit: None, + grid_coords: GridCoords { x: 13, y: -4, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_elizabethst_20", + name: "Elizabeth St - 20 block", + short: ansi!("||"), + description: "A wide road stained from years of neglect. The road smells foul, and you can make out brown, white, red, and even grey stains, as well as the occasional slick from ancient oil spilled on the surface", + description_less_explicit: None, + grid_coords: GridCoords { x: 13, y: -3, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_elizabethst_30", + name: "Elizabeth St - 30 block", + short: ansi!("||"), + description: "A wide road stained from years of neglect. The road smells foul, and you can make out brown, white, red, and even grey stains, as well as the occasional slick from ancient oil spilled on the surface", + description_less_explicit: None, + grid_coords: GridCoords { x: 13, y: -2, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_elizabethst_40", + name: ansi!("Elizabeth St - 40 block"), + short: ansi!("||"), + description: ansi!( + "A wide road stained from years of neglect. The road smells foul, and you can make out brown, white, red, and even grey stains, as well as the occasional slick from ancient oil spilled on the surface"), + description_less_explicit: None, + grid_coords: GridCoords { x: 13, y: 0, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_elizabethst_50", + name: ansi!("Elizabeth St - 50 block"), + short: ansi!("||"), + description: ansi!( + "A wide road stained from years of neglect. The road smells foul, and you can make out brown, white, red, and even grey stains, as well as the occasional slick from ancient oil spilled on the surface"), + description_less_explicit: None, + grid_coords: GridCoords { x: 13, y: 1, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_elizabethst_60", + name: "Elizabeth St - 60 block", + short: ansi!("||"), + description: "A wide road stained from years of neglect. The road smells foul, and you can make out brown, white, red, and even grey stains, as well as the occasional slick from ancient oil spilled on the surface", + description_less_explicit: None, + grid_coords: GridCoords { x: 13, y: 2, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_elizabethst_70", + name: "Elizabeth St - 70 block", + short: ansi!("||"), + description: "A wide road stained from years of neglect. The road smells foul, and you can make out brown, white, red, and even grey stains, as well as the occasional slick from ancient oil spilled on the surface", + description_less_explicit: None, + grid_coords: GridCoords { x: 13, y: 4, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_elizabethst_80", + name: "Elizabeth St - 80 block", + short: ansi!("||"), + description: "A wide road stained from years of neglect. The road smells foul, and you can make out brown, white, red, and even grey stains, as well as the occasional slick from ancient oil spilled on the surface", + description_less_explicit: None, + grid_coords: GridCoords { x: 13, y: 5, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_elizabethst_90", + name: "Elizabeth St - 90 block", + short: ansi!("||"), + description: "A wide road stained from years of neglect. The road smells foul, and you can make out brown, white, red, and even grey stains, as well as the occasional slick from ancient oil spilled on the surface", + description_less_explicit: None, + grid_coords: GridCoords { x: 13, y: 6, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_elizabethst_100", + name: "Elizabeth St - 100 block", + short: ansi!("||"), + description: "A wide road stained from years of neglect. The road smells foul, and you can make out brown, white, red, and even grey stains, as well as the occasional slick from ancient oil spilled on the surface", + description_less_explicit: None, + grid_coords: GridCoords { x: 13, y: 8, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_elizabethst_110", + name: "Elizabeth St - 110 block", + short: ansi!("||"), + description: "A wide road stained from years of neglect. The road smells foul, and you can make out brown, white, red, and even grey stains, as well as the occasional slick from ancient oil spilled on the surface", + description_less_explicit: None, + grid_coords: GridCoords { x: 13, y: 9, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + }, + Room { + zone: "melbs", + secondary_zones: vec!(), + code: "melbs_elizabethst_120", + name: "Elizabeth St - 120 block", + short: ansi!("||"), + description: "A fairly wide road where the surface has broken down but has been kept clear by regular foot traffic", + description_less_explicit: None, + grid_coords: GridCoords { x: 13, y: 10, z: 0 }, + exits: vec!( + Exit { + direction: Direction::NORTH, + ..Default::default() + }, + Exit { + direction: Direction::SOUTH, + ..Default::default() + }, + ), + should_caption: false, + ..Default::default() + } + ) } diff --git a/queued_command.rs b/queued_command.rs deleted file mode 100644 index e69de29..0000000