commit b70c047585627eefd4de896bb11f198f4c0bba38 Author: xeon Date: Mon May 19 17:34:33 2025 +0300 Hi diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7cb9186 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +# Rust build directory +target/ +/lib/proto/cs_proto/ + +# Server configuration directory +/config/ diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..b7a1cfe --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,2953 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "anyhow" +version = "1.0.97" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" + +[[package]] +name = "atoi" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" +dependencies = [ + "num-traits", +] + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "axum" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de45108900e1f9b9242f7f2e254aa3e2c029c921c258fe9e6b4217eeebd54288" +dependencies = [ + "axum-core", + "bytes", + "form_urlencoded", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-core" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68464cd0412f486726fb3373129ef5d2993f90c34bc2bc1c1e9943b2f4fc7ca6" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "sync_wrapper", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "backtrace" +version = "0.3.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets 0.52.6", +] + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64-simd" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "339abbe78e73178762e23bea9dfd08e697eb3f3301cd4be981c0f78ba5859195" +dependencies = [ + "outref", + "vsimd", +] + +[[package]] +name = "base64ct" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" + +[[package]] +name = "bitflags" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" +dependencies = [ + "serde", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" + +[[package]] +name = "cc" +version = "1.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e3a13707ac958681c13b39b458c073d0d9bc8a22cb1b2f4c8e55eb72c13f362" +dependencies = [ + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "common" +version = "0.0.1" +dependencies = [ + "serde", + "toml", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "config" +version = "0.0.1" +dependencies = [ + "const_format", + "flatbuffers", + "flatc-rust", + "itertools", + "num_enum", + "paste", + "serde", + "serde_json5", + "thiserror", + "vivian-codegen", + "xxhash-rust", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "const_format" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "cookie" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" +dependencies = [ + "percent-encoding", + "time", + "version_check", +] + +[[package]] +name = "cookie_store" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2eac901828f88a5241ee0600950ab981148a18f2f756900ffba1b125ca6a3ef9" +dependencies = [ + "cookie", + "document-features", + "idna", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "time", + "url", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "der" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "document-features" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95249b50c6c185bee49034bcb378a49dc2b5dff0be90ff6616d31d64febab05d" +dependencies = [ + "litrs", +] + +[[package]] +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +dependencies = [ + "serde", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "etcetera" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" +dependencies = [ + "cfg-if", + "home", + "windows-sys 0.48.0", +] + +[[package]] +name = "event-listener" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "fixedbitset" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" + +[[package]] +name = "flatbuffers" +version = "25.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1045398c1bfd89168b5fd3f1fc11f6e70b34f6f66300c87d44d3de849463abf1" +dependencies = [ + "bitflags", + "rustc_version", +] + +[[package]] +name = "flatc-rust" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57e61227926ef5b237af48bee74394cc4a5a221ebd10c5147a98e612f207851d" +dependencies = [ + "log", +] + +[[package]] +name = "flate2" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "flume" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" +dependencies = [ + "futures-core", + "futures-sink", + "spin", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-intrusive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" +dependencies = [ + "futures-core", + "lock_api", + "parking_lot", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + +[[package]] +name = "hashlink" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" +dependencies = [ + "hashbrown", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "home" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", +] + +[[package]] +name = "hyper-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" +dependencies = [ + "bytes", + "futures-util", + "http", + "http-body", + "hyper", + "pin-project-lite", + "tokio", + "tower-service", +] + +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] + +[[package]] +name = "libc" +version = "0.2.171" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" + +[[package]] +name = "libm" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" + +[[package]] +name = "libsqlite3-sys" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" +dependencies = [ + "pkg-config", + "vcpkg", +] + +[[package]] +name = "linux-raw-sys" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" + +[[package]] +name = "litemap" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" + +[[package]] +name = "litrs" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "matchit" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.52.0", +] + +[[package]] +name = "multimap" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "num-bigint-dig" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" +dependencies = [ + "byteorder", + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand", + "smallvec", + "zeroize", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_enum" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "outref" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e" + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pest" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "198db74531d58c70a361c42201efde7e2591e976d518caf7662a47dc5720e7b6" +dependencies = [ + "memchr", + "thiserror", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d725d9cfd79e87dccc9341a2ef39d1b6f6353d68c4b33c177febbe1a402c97c5" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db7d01726be8ab66ab32f9df467ae8b1148906685bbe75c82d1e65d7f5b3f841" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pest_meta" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f9f832470494906d1fca5329f8ab5791cc60beb230c74815dff541cbd2b5ca0" +dependencies = [ + "once_cell", + "pest", + "sha2", +] + +[[package]] +name = "petgraph" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772" +dependencies = [ + "fixedbitset", + "indexmap", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "prettyplease" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "664ec5419c51e34154eec046ebcba56312d5a2fc3b09a06da188e1ad21afadf6" +dependencies = [ + "proc-macro2", + "syn", +] + +[[package]] +name = "proc-macro-crate" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "prost" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-build" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be769465445e8c1474e9c5dac2018218498557af32d9ed057325ec9a41ae81bf" +dependencies = [ + "heck", + "itertools", + "log", + "multimap", + "once_cell", + "petgraph", + "prettyplease", + "prost", + "prost-types", + "regex", + "syn", + "tempfile", +] + +[[package]] +name = "prost-derive" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "prost-types" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52c2c1bf36ddb1a1c396b3601a3cec27c2462e45f07c386894ec3ccf5332bd16" +dependencies = [ + "prost", +] + +[[package]] +name = "proto-derive" +version = "0.0.1" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.15", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" + +[[package]] +name = "rand_mt" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9375873db1061df25ed185eb584cd8839196db7a43803daa0612c5ae53be5b5" +dependencies = [ + "rand_core 0.9.3", +] + +[[package]] +name = "redox_syscall" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.15", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rsa" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78928ac1ed176a5ca1d17e578a1825f3d81ca54cf41053a592584b020cfd691b" +dependencies = [ + "const-oid", + "digest", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core 0.6.4", + "sha2", + "signature", + "spki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustls" +version = "0.23.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df51b5869f3a441595eac5e8ff14d486ff285f7b8c0df8770e49c3b56351f0f0" +dependencies = [ + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" + +[[package]] +name = "rustls-webpki" +version = "0.103.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fef8b8769aaccf73098557a87cd1816b4f9c7c16811c9c77142aa695c16f2c03" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "scc" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea091f6cac2595aa38993f04f4ee692ed43757035c36e67c180b6828356385b1" +dependencies = [ + "sdd", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sdd" +version = "3.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "584e070911c7017da6cb2eb0788d09f43d789029b5877d3e5ecc8acf86ceee21" + +[[package]] +name = "semver" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_json5" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d34d03f54462862f2a42918391c9526337f53171eaa4d8894562be7f252edd3" +dependencies = [ + "pest", + "pest_derive", + "serde", +] + +[[package]] +name = "serde_path_to_error" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" +dependencies = [ + "itoa", + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core 0.6.4", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" +dependencies = [ + "serde", +] + +[[package]] +name = "socket2" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "sqlx" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3c3a85280daca669cfd3bcb68a337882a8bc57ec882f72c5d13a430613a738e" +dependencies = [ + "sqlx-core", + "sqlx-macros", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", +] + +[[package]] +name = "sqlx-core" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f743f2a3cea30a58cd479013f75550e879009e3a02f616f18ca699335aa248c3" +dependencies = [ + "base64", + "bytes", + "crc", + "crossbeam-queue", + "either", + "event-listener", + "futures-core", + "futures-intrusive", + "futures-io", + "futures-util", + "hashbrown", + "hashlink", + "indexmap", + "log", + "memchr", + "once_cell", + "percent-encoding", + "rustls", + "serde", + "serde_json", + "sha2", + "smallvec", + "thiserror", + "tokio", + "tokio-stream", + "tracing", + "url", + "webpki-roots", +] + +[[package]] +name = "sqlx-macros" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4200e0fde19834956d4252347c12a083bdcb237d7a1a1446bffd8768417dce" +dependencies = [ + "proc-macro2", + "quote", + "sqlx-core", + "sqlx-macros-core", + "syn", +] + +[[package]] +name = "sqlx-macros-core" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "882ceaa29cade31beca7129b6beeb05737f44f82dbe2a9806ecea5a7093d00b7" +dependencies = [ + "dotenvy", + "either", + "heck", + "hex", + "once_cell", + "proc-macro2", + "quote", + "serde", + "serde_json", + "sha2", + "sqlx-core", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", + "syn", + "tempfile", + "tokio", + "url", +] + +[[package]] +name = "sqlx-mysql" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0afdd3aa7a629683c2d750c2df343025545087081ab5942593a5288855b1b7a7" +dependencies = [ + "atoi", + "base64", + "bitflags", + "byteorder", + "bytes", + "crc", + "digest", + "dotenvy", + "either", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "generic-array", + "hex", + "hkdf", + "hmac", + "itoa", + "log", + "md-5", + "memchr", + "once_cell", + "percent-encoding", + "rand", + "rsa", + "serde", + "sha1", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror", + "tracing", + "whoami", +] + +[[package]] +name = "sqlx-postgres" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0bedbe1bbb5e2615ef347a5e9d8cd7680fb63e77d9dafc0f29be15e53f1ebe6" +dependencies = [ + "atoi", + "base64", + "bitflags", + "byteorder", + "crc", + "dotenvy", + "etcetera", + "futures-channel", + "futures-core", + "futures-util", + "hex", + "hkdf", + "hmac", + "home", + "itoa", + "log", + "md-5", + "memchr", + "once_cell", + "rand", + "serde", + "serde_json", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror", + "tracing", + "whoami", +] + +[[package]] +name = "sqlx-sqlite" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c26083e9a520e8eb87a06b12347679b142dc2ea29e6e409f805644a7a979a5bc" +dependencies = [ + "atoi", + "flume", + "futures-channel", + "futures-core", + "futures-executor", + "futures-intrusive", + "futures-util", + "libsqlite3-sys", + "log", + "percent-encoding", + "serde", + "serde_urlencoded", + "sqlx-core", + "thiserror", + "tracing", + "url", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "stringprep" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" +dependencies = [ + "unicode-bidi", + "unicode-normalization", + "unicode-properties", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" + +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tempfile" +version = "3.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" +dependencies = [ + "fastrand", + "getrandom 0.3.2", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "time" +version = "0.3.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" + +[[package]] +name = "time-macros" +version = "0.2.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.44.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-stream" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +dependencies = [ + "nu-ansi-term", + "sharded-slab", + "smallvec", + "thread_local", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + +[[package]] +name = "unicode-bidi" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "unicode-normalization" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-properties" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "ureq" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7a3e9af6113ecd57b8c63d3cd76a385b2e3881365f1f489e54f49801d0c83ea" +dependencies = [ + "base64", + "cookie_store", + "flate2", + "log", + "percent-encoding", + "rustls", + "rustls-pemfile", + "rustls-pki-types", + "serde", + "serde_json", + "ureq-proto", + "utf-8", + "webpki-roots", +] + +[[package]] +name = "ureq-proto" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fadf18427d33828c311234884b7ba2afb57143e6e7e69fda7ee883b624661e36" +dependencies = [ + "base64", + "http", + "httparse", + "log", +] + +[[package]] +name = "url" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vivian-codegen" +version = "0.0.1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "vivian-dbgate-server" +version = "0.0.1" +dependencies = [ + "common", + "const_format", + "rand", + "serde", + "serde_json5", + "sqlx", + "thiserror", + "tokio", + "tracing", + "ureq", + "vivian-proto", + "vivian-service", +] + +[[package]] +name = "vivian-dispatch-server" +version = "0.1.0" +dependencies = [ + "axum", + "common", + "const_format", + "serde", + "serde_json5", + "thiserror", + "tokio", + "vivian-encryption", +] + +[[package]] +name = "vivian-encryption" +version = "0.0.1" +dependencies = [ + "base64-simd", + "rand", + "rand_mt", + "rsa", + "serde", + "thiserror", +] + +[[package]] +name = "vivian-game-server" +version = "0.0.1" +dependencies = [ + "common", + "config", + "const_format", + "paste", + "rand", + "scc", + "serde", + "serde_json5", + "thiserror", + "tokio", + "tracing", + "vivian-codegen", + "vivian-logic", + "vivian-proto", + "vivian-service", +] + +[[package]] +name = "vivian-gate-server" +version = "0.0.1" +dependencies = [ + "common", + "const_format", + "paste", + "rand", + "scc", + "serde", + "thiserror", + "tokio", + "tracing", + "vivian-encryption", + "vivian-proto", + "vivian-service", +] + +[[package]] +name = "vivian-logic" +version = "0.0.1" +dependencies = [ + "common", + "config", + "hex", + "num_enum", + "paste", + "thiserror", + "tracing", + "vivian-proto", +] + +[[package]] +name = "vivian-proto" +version = "0.0.1" +dependencies = [ + "prettyplease", + "prost", + "prost-build", + "prost-types", + "proto-derive", + "serde", + "syn", +] + +[[package]] +name = "vivian-service" +version = "0.0.1" +dependencies = [ + "common", + "scc", + "serde", + "thiserror", + "tokio", + "tokio-util", + "tracing", + "vivian-proto", +] + +[[package]] +name = "vsimd" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "wasite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" + +[[package]] +name = "webpki-roots" +version = "0.26.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2210b291f7ea53617fbafcc4939f10914214ec15aace5ba62293a668f322c5c9" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "whoami" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6994d13118ab492c3c80c1f81928718159254c53c472bf9ce36f8dae4add02a7" +dependencies = [ + "redox_syscall", + "wasite", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63d3fcd9bba44b03821e7d699eeee959f3126dcc4aa8e4ae18ec617c2a5cea10" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags", +] + +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + +[[package]] +name = "xxhash-rust" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdd20c5420375476fbd4394763288da7eb0cc0b8c11deed431a91562af7335d3" + +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..3e54eb1 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,57 @@ +[workspace] +members = ["lib/*", "servers/*"] +resolver = "2" + +[workspace.package] +version = "0.0.1" + +[workspace.dependencies] +tokio = { version = "1.44.2", features = ["full"] } +tokio-util = "0.7.15" +axum = "0.8.3" +ureq = { version = "3.0.11", features = ["json"] } +sqlx = { version = "0.8.5", features = ["postgres", "runtime-tokio-rustls"] } + +const_format = "0.2.34" +thiserror = "2.0" +scc = "2.3.3" +num_enum = "0.7.3" +itertools = "0.14" + +serde = { version = "1.0", features = ["derive"] } +serde_json5 = "0.2.1" +toml = "0.8" + +rsa = { version = "0.9.8", features = ["sha2"] } +rand = "0.8.5" # locked on 0.8 due to RSA crate issues +base64-simd = "0.8.0" +rand_mt = "5.0.0" +xxhash-rust = { version = "0.8.15", features = ["const_xxh64"] } + +# Protobuf +prost = "0.13.5" +prost-types = "0.13.5" +prost-build = "0.13.5" + +# Flatbuffers +flatbuffers = "25.2.10" +flatc-rust = "0.2.0" + +# Logging +tracing = "0.1" +tracing-subscriber = "0.3" + +# Code Generation +proc-macro2 = "1.0" +syn = "2.0" +prettyplease = "0.2" +paste = "1.0" +quote = "1.0" + +common = { path = "lib/common" } +config = { path = "lib/config" } +vivian-codegen = { path = "lib/codegen" } +vivian-proto = { path = "lib/proto" } +vivian-logic = { path = "lib/logic" } +vivian-encryption = { path = "lib/encryption" } +vivian-service = { path = "lib/service" } diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..6aef18c --- /dev/null +++ b/LICENSE @@ -0,0 +1,235 @@ +GNU AFFERO GENERAL PUBLIC LICENSE +Version 3, 19 November 2007 + +Copyright (C) 2007 Free Software Foundation, Inc. + +Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + + Preamble + +The GNU Affero General Public License is a free, copyleft license for software and other kinds of works, specifically designed to ensure cooperation with the community in the case of network server software. + +The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, our General Public Licenses are intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. + +When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. + +Developers that use our General Public Licenses protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License which gives you legal permission to copy, distribute and/or modify the software. + +A secondary benefit of defending all users' freedom is that improvements made in alternate versions of the program, if they receive widespread use, become available for other developers to incorporate. Many developers of free software are heartened and encouraged by the resulting cooperation. However, in the case of software used on network servers, this result may fail to come about. The GNU General Public License permits making a modified version and letting the public access it on a server without ever releasing its source code to the public. + +The GNU Affero General Public License is designed specifically to ensure that, in such cases, the modified source code becomes available to the community. It requires the operator of a network server to provide the source code of the modified version running there to the users of that server. Therefore, public use of a modified version, on a publicly accessible server, gives the public access to the source code of the modified version. + +An older license, called the Affero General Public License and published by Affero, was designed to accomplish similar goals. This is a different license, not a version of the Affero GPL, but Affero has released a new version of the Affero GPL which permits relicensing under this license. + +The precise terms and conditions for copying, distribution and modification follow. + + TERMS AND CONDITIONS + +0. Definitions. + +"This License" refers to version 3 of the GNU Affero General Public License. + +"Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. + +"The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. + +To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. + +A "covered work" means either the unmodified Program or a work based on the Program. + +To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. + +To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. + +An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. + +1. Source Code. +The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. + +A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. + +The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. + +The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those +subprograms and other parts of the work. + +The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. + +The Corresponding Source for a work in source code form is that same work. + +2. Basic Permissions. +All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. + +You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. + +Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. + +3. Protecting Users' Legal Rights From Anti-Circumvention Law. +No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. + +When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. + +4. Conveying Verbatim Copies. +You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. + +You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. + +5. Conveying Modified Source Versions. +You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". + + c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. + +A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. + +6. Conveying Non-Source Forms. +You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: + + a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. + + d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. + +A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. + +A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. + +"Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. + +If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). + +The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. + +Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. + +7. Additional Terms. +"Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. + +When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. + +Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or authors of the material; or + + e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. + +All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. + +If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. + +Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. + +8. Termination. + +You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). + +However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. + +Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. + +Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. + +9. Acceptance Not Required for Having Copies. + +You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. + +10. Automatic Licensing of Downstream Recipients. + +Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. + +An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. + +You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. + +11. Patents. + +A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". + +A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. + +Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. + +In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. + +If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. + +If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. + +A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. + +Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. + +12. No Surrender of Others' Freedom. + +If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. + +13. Remote Network Interaction; Use with the GNU General Public License. + +Notwithstanding any other provision of this License, if you modify the Program, your modified version must prominently offer all users interacting with it remotely through a computer network (if your version supports such interaction) an opportunity to receive the Corresponding Source of your version by providing access to the Corresponding Source from a network server at no charge, through some standard or customary means of facilitating copying of software. This Corresponding Source shall include the Corresponding Source for any work covered by version 3 of the GNU General Public License that is incorporated pursuant to the following paragraph. + +Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the work with which it is combined will remain governed by version 3 of the GNU General Public License. + +14. Revised Versions of this License. + +The Free Software Foundation may publish revised and/or new versions of the GNU Affero General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU Affero General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU Affero General Public License, you may choose any version ever published by the Free Software Foundation. + +If the Program specifies that a proxy can decide which future versions of the GNU Affero General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. + +Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. + +15. Disclaimer of Warranty. + +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +16. Limitation of Liability. + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +17. Interpretation of Sections 15 and 16. + +If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. + +END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. + + vivian-rs + Copyright (C) 2025 ReversedRooms + + This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + +If your software can interact with users remotely through a computer network, you should also make sure that it provides a way for users to get its source. For example, if your program is a web application, its interface could display a "Source" link that leads users to an archive of the code. There are many ways you could offer source, and different solutions will be better for different programs; see section 13 for the specific requirements. + +You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU AGPL, see . diff --git a/README.md b/README.md new file mode 100644 index 0000000..06c6b43 --- /dev/null +++ b/README.md @@ -0,0 +1,57 @@ +# Vivian-rs +##### Experimental server emulator for the game Zenless Zone Zero +![title](assets/img/title.png) + +## Features +- Microservices Architecture +- Quest System +- "TV Mode" aka Monitor Array +- VR Training +- Gacha (with configurable banner schedule) +- NPC Interactions +- Miscellaneous items (Skins, W-Engines, Wallpapers) +#### NOTE: vivian-rs is currently under active development + +## Getting started +### Requirements +- [Rust 1.86+](https://www.rust-lang.org/tools/install) +- [PostgreSQL](https://www.postgresql.org/download/) +- [SDK server](https://git.xeondev.com/reversedrooms/hoyo-sdk) +##### NOTE: this server doesn't include the sdk server as it's not specific per game. You can use `hoyo-sdk` with this server. + +#### For additional help, you can join our [discord server](https://discord.xeondev.com) + +### Setup +#### a) building from sources +```sh +git clone https://git.xeondev.com/vivian-rs/vivian-rs.git +cd vivian-rs +cargo run --bin vivian-dispatch-server +cargo run --bin vivian-gate-server +cargo run --bin vivian-dbgate-server +cargo run --bin vivian-game-server +``` +#### b) using pre-built binaries +Navigate to the [Releases](https://git.xeondev.com/vivian-rs/vivian-rs/releases) page and download the latest release for your platform. +Start each service in order from option `a)`. + +### Configuration +The configuration of each server is located under the `config` directory (created upon first startup) +- To change network settings for internal server communication, edit the: `config/00-service/environment.toml` +- To change network settings for outer communication (e.g. with the game client), edit the dispatch-server and gate-server configuration, located in `config/10-dispatch-server/config.toml` and `config/20-gate-server/config.toml` respectively. +- To change database connection settings, edit the dbgate-server configuration, located in: `config/30-dbgate-server/config.toml` +- To change gameplay-related settings, edit one of game-server configuration files, for example: gacha banner schedule is located in: `config/40-game-server/gacha_schedule.toml` + +### Logging in +Currently supported client version is `OSPRODWin1.7.0`, you can get it from 3rd party sources (e.g. game launcher). Next, you have to apply the necessary [client patch](https://git.xeondev.com/vivian-rs/vivian-patch). It allows you to connect to the local server and replaces encryption keys with custom ones. + +### Obtaining characters without gacha +While playing on the server, you may want to obtain the characters that are not available in current gacha schedule. In order to do so, you can use in-game debug menu: find the 'Vivian' NPC in the WorkShop location, and interact with it. It'll send you to a debug TV mode scene, where you can select the characters to obtain. (The NPC will spawn as soon as you progress in starting quests!) +![debug_menu](assets/img/debug_menu.png) + +### Gameplay customization +The MainCity quests and TV mode levels are highly customizable by their nature. You may look around the `assets/LevelProcess` directory. +![tv_mode](assets/img/tv_mode.png) + +### Support +Your support for this project is greatly appreciated! If you'd like to contribute, feel free to send a tip [via Boosty](https://boosty.to/xeondev/donate)! diff --git a/assets/Filecfg/10010808373864040182 b/assets/Filecfg/10010808373864040182 new file mode 100644 index 0000000..7b4c096 Binary files /dev/null and b/assets/Filecfg/10010808373864040182 differ diff --git a/assets/Filecfg/10032827072742742911 b/assets/Filecfg/10032827072742742911 new file mode 100644 index 0000000..95649c8 Binary files /dev/null and b/assets/Filecfg/10032827072742742911 differ diff --git a/assets/Filecfg/10033721018158574140 b/assets/Filecfg/10033721018158574140 new file mode 100644 index 0000000..3870168 Binary files /dev/null and b/assets/Filecfg/10033721018158574140 differ diff --git a/assets/Filecfg/10052379260018520201 b/assets/Filecfg/10052379260018520201 new file mode 100644 index 0000000..7e1b278 Binary files /dev/null and b/assets/Filecfg/10052379260018520201 differ diff --git a/assets/Filecfg/10057086654148717548 b/assets/Filecfg/10057086654148717548 new file mode 100644 index 0000000..a898655 Binary files /dev/null and b/assets/Filecfg/10057086654148717548 differ diff --git a/assets/Filecfg/10075508127800540987 b/assets/Filecfg/10075508127800540987 new file mode 100644 index 0000000..4ddc0b2 Binary files /dev/null and b/assets/Filecfg/10075508127800540987 differ diff --git a/assets/Filecfg/10083105974566030817 b/assets/Filecfg/10083105974566030817 new file mode 100644 index 0000000..6d48a7c Binary files /dev/null and b/assets/Filecfg/10083105974566030817 differ diff --git a/assets/Filecfg/10096306203537588307 b/assets/Filecfg/10096306203537588307 new file mode 100644 index 0000000..cc9f6a7 Binary files /dev/null and b/assets/Filecfg/10096306203537588307 differ diff --git a/assets/Filecfg/10101100291003037823 b/assets/Filecfg/10101100291003037823 new file mode 100644 index 0000000..afa3b59 Binary files /dev/null and b/assets/Filecfg/10101100291003037823 differ diff --git a/assets/Filecfg/10104767631211237325 b/assets/Filecfg/10104767631211237325 new file mode 100644 index 0000000..eb69665 Binary files /dev/null and b/assets/Filecfg/10104767631211237325 differ diff --git a/assets/Filecfg/101768390240629794 b/assets/Filecfg/101768390240629794 new file mode 100644 index 0000000..ea989b2 Binary files /dev/null and b/assets/Filecfg/101768390240629794 differ diff --git a/assets/Filecfg/10184537830501628523 b/assets/Filecfg/10184537830501628523 new file mode 100644 index 0000000..ea4a53f Binary files /dev/null and b/assets/Filecfg/10184537830501628523 differ diff --git a/assets/Filecfg/10212618236512783304 b/assets/Filecfg/10212618236512783304 new file mode 100644 index 0000000..33d5965 Binary files /dev/null and b/assets/Filecfg/10212618236512783304 differ diff --git a/assets/Filecfg/10246105568315798383 b/assets/Filecfg/10246105568315798383 new file mode 100644 index 0000000..73cffb5 Binary files /dev/null and b/assets/Filecfg/10246105568315798383 differ diff --git a/assets/Filecfg/10251007154862986708 b/assets/Filecfg/10251007154862986708 new file mode 100644 index 0000000..ee6661b Binary files /dev/null and b/assets/Filecfg/10251007154862986708 differ diff --git a/assets/Filecfg/10259695595062109759 b/assets/Filecfg/10259695595062109759 new file mode 100644 index 0000000..7cff3e0 Binary files /dev/null and b/assets/Filecfg/10259695595062109759 differ diff --git a/assets/Filecfg/10264605482804442491 b/assets/Filecfg/10264605482804442491 new file mode 100644 index 0000000..4aec2e2 Binary files /dev/null and b/assets/Filecfg/10264605482804442491 differ diff --git a/assets/Filecfg/10275201845600476470 b/assets/Filecfg/10275201845600476470 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/10275201845600476470 differ diff --git a/assets/Filecfg/10278020695907736598 b/assets/Filecfg/10278020695907736598 new file mode 100644 index 0000000..095f71d Binary files /dev/null and b/assets/Filecfg/10278020695907736598 differ diff --git a/assets/Filecfg/10287818805481961745 b/assets/Filecfg/10287818805481961745 new file mode 100644 index 0000000..ee5ecec Binary files /dev/null and b/assets/Filecfg/10287818805481961745 differ diff --git a/assets/Filecfg/1029785068136330720 b/assets/Filecfg/1029785068136330720 new file mode 100644 index 0000000..63d8eb5 Binary files /dev/null and b/assets/Filecfg/1029785068136330720 differ diff --git a/assets/Filecfg/10321696286355204017 b/assets/Filecfg/10321696286355204017 new file mode 100644 index 0000000..5061bd2 Binary files /dev/null and b/assets/Filecfg/10321696286355204017 differ diff --git a/assets/Filecfg/10323332383746031993 b/assets/Filecfg/10323332383746031993 new file mode 100644 index 0000000..18a0b00 Binary files /dev/null and b/assets/Filecfg/10323332383746031993 differ diff --git a/assets/Filecfg/10330313329325452558 b/assets/Filecfg/10330313329325452558 new file mode 100644 index 0000000..2743653 Binary files /dev/null and b/assets/Filecfg/10330313329325452558 differ diff --git a/assets/Filecfg/1033767438085951951 b/assets/Filecfg/1033767438085951951 new file mode 100644 index 0000000..1a0a5e3 Binary files /dev/null and b/assets/Filecfg/1033767438085951951 differ diff --git a/assets/Filecfg/10352424718517234029 b/assets/Filecfg/10352424718517234029 new file mode 100644 index 0000000..3352cf7 Binary files /dev/null and b/assets/Filecfg/10352424718517234029 differ diff --git a/assets/Filecfg/10361992832664957090 b/assets/Filecfg/10361992832664957090 new file mode 100644 index 0000000..8163183 Binary files /dev/null and b/assets/Filecfg/10361992832664957090 differ diff --git a/assets/Filecfg/10382719409245932107 b/assets/Filecfg/10382719409245932107 new file mode 100644 index 0000000..8f7952a Binary files /dev/null and b/assets/Filecfg/10382719409245932107 differ diff --git a/assets/Filecfg/10390586540095996558 b/assets/Filecfg/10390586540095996558 new file mode 100644 index 0000000..06faa04 Binary files /dev/null and b/assets/Filecfg/10390586540095996558 differ diff --git a/assets/Filecfg/10411003461693016918 b/assets/Filecfg/10411003461693016918 new file mode 100644 index 0000000..c436874 Binary files /dev/null and b/assets/Filecfg/10411003461693016918 differ diff --git a/assets/Filecfg/10417110590820963172 b/assets/Filecfg/10417110590820963172 new file mode 100644 index 0000000..e396090 Binary files /dev/null and b/assets/Filecfg/10417110590820963172 differ diff --git a/assets/Filecfg/10436032873024071162 b/assets/Filecfg/10436032873024071162 new file mode 100644 index 0000000..c56a80b Binary files /dev/null and b/assets/Filecfg/10436032873024071162 differ diff --git a/assets/Filecfg/10455405343599765752 b/assets/Filecfg/10455405343599765752 new file mode 100644 index 0000000..470e358 Binary files /dev/null and b/assets/Filecfg/10455405343599765752 differ diff --git a/assets/Filecfg/10464897963229082692 b/assets/Filecfg/10464897963229082692 new file mode 100644 index 0000000..d687199 Binary files /dev/null and b/assets/Filecfg/10464897963229082692 differ diff --git a/assets/Filecfg/10480563344334136587 b/assets/Filecfg/10480563344334136587 new file mode 100644 index 0000000..1bbcbd2 Binary files /dev/null and b/assets/Filecfg/10480563344334136587 differ diff --git a/assets/Filecfg/10484454735791987522 b/assets/Filecfg/10484454735791987522 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/10484454735791987522 differ diff --git a/assets/Filecfg/10485730717761884545 b/assets/Filecfg/10485730717761884545 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/10485730717761884545 differ diff --git a/assets/Filecfg/10493597931472549480 b/assets/Filecfg/10493597931472549480 new file mode 100644 index 0000000..71560ea Binary files /dev/null and b/assets/Filecfg/10493597931472549480 differ diff --git a/assets/Filecfg/10502849963740494435 b/assets/Filecfg/10502849963740494435 new file mode 100644 index 0000000..994cb17 Binary files /dev/null and b/assets/Filecfg/10502849963740494435 differ diff --git a/assets/Filecfg/10549316106634130085 b/assets/Filecfg/10549316106634130085 new file mode 100644 index 0000000..54a4adf Binary files /dev/null and b/assets/Filecfg/10549316106634130085 differ diff --git a/assets/Filecfg/10560361692354968202 b/assets/Filecfg/10560361692354968202 new file mode 100644 index 0000000..2bc0ef0 Binary files /dev/null and b/assets/Filecfg/10560361692354968202 differ diff --git a/assets/Filecfg/10575436549903431580 b/assets/Filecfg/10575436549903431580 new file mode 100644 index 0000000..0174067 Binary files /dev/null and b/assets/Filecfg/10575436549903431580 differ diff --git a/assets/Filecfg/10581101117693960649 b/assets/Filecfg/10581101117693960649 new file mode 100644 index 0000000..27161fb Binary files /dev/null and b/assets/Filecfg/10581101117693960649 differ diff --git a/assets/Filecfg/10583926392046091507 b/assets/Filecfg/10583926392046091507 new file mode 100644 index 0000000..2095396 Binary files /dev/null and b/assets/Filecfg/10583926392046091507 differ diff --git a/assets/Filecfg/10594836358011099052 b/assets/Filecfg/10594836358011099052 new file mode 100644 index 0000000..d6d3db8 Binary files /dev/null and b/assets/Filecfg/10594836358011099052 differ diff --git a/assets/Filecfg/10605684946193948530 b/assets/Filecfg/10605684946193948530 new file mode 100644 index 0000000..5e47f38 Binary files /dev/null and b/assets/Filecfg/10605684946193948530 differ diff --git a/assets/Filecfg/10623379200565565688 b/assets/Filecfg/10623379200565565688 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/10623379200565565688 differ diff --git a/assets/Filecfg/10637721454916405633 b/assets/Filecfg/10637721454916405633 new file mode 100644 index 0000000..a2211ce Binary files /dev/null and b/assets/Filecfg/10637721454916405633 differ diff --git a/assets/Filecfg/10672647921413984319 b/assets/Filecfg/10672647921413984319 new file mode 100644 index 0000000..3bb359f Binary files /dev/null and b/assets/Filecfg/10672647921413984319 differ diff --git a/assets/Filecfg/10713666088169839691 b/assets/Filecfg/10713666088169839691 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/10713666088169839691 differ diff --git a/assets/Filecfg/10755349437026649161 b/assets/Filecfg/10755349437026649161 new file mode 100644 index 0000000..cbada57 Binary files /dev/null and b/assets/Filecfg/10755349437026649161 differ diff --git a/assets/Filecfg/10771863132607138542 b/assets/Filecfg/10771863132607138542 new file mode 100644 index 0000000..83bf979 Binary files /dev/null and b/assets/Filecfg/10771863132607138542 differ diff --git a/assets/Filecfg/1080965030186094106 b/assets/Filecfg/1080965030186094106 new file mode 100644 index 0000000..db356ce Binary files /dev/null and b/assets/Filecfg/1080965030186094106 differ diff --git a/assets/Filecfg/10820371194779877509 b/assets/Filecfg/10820371194779877509 new file mode 100644 index 0000000..5ae50f0 Binary files /dev/null and b/assets/Filecfg/10820371194779877509 differ diff --git a/assets/Filecfg/10829278488199004950 b/assets/Filecfg/10829278488199004950 new file mode 100644 index 0000000..d57f015 Binary files /dev/null and b/assets/Filecfg/10829278488199004950 differ diff --git a/assets/Filecfg/10832272359333086737 b/assets/Filecfg/10832272359333086737 new file mode 100644 index 0000000..8fc9d88 Binary files /dev/null and b/assets/Filecfg/10832272359333086737 differ diff --git a/assets/Filecfg/10863168905291409325 b/assets/Filecfg/10863168905291409325 new file mode 100644 index 0000000..85ad7dc Binary files /dev/null and b/assets/Filecfg/10863168905291409325 differ diff --git a/assets/Filecfg/10883875657856637824 b/assets/Filecfg/10883875657856637824 new file mode 100644 index 0000000..043543a Binary files /dev/null and b/assets/Filecfg/10883875657856637824 differ diff --git a/assets/Filecfg/10891989980564329405 b/assets/Filecfg/10891989980564329405 new file mode 100644 index 0000000..ef53d21 Binary files /dev/null and b/assets/Filecfg/10891989980564329405 differ diff --git a/assets/Filecfg/10918995900770977827 b/assets/Filecfg/10918995900770977827 new file mode 100644 index 0000000..c80e58f Binary files /dev/null and b/assets/Filecfg/10918995900770977827 differ diff --git a/assets/Filecfg/10921070745563497265 b/assets/Filecfg/10921070745563497265 new file mode 100644 index 0000000..21db672 Binary files /dev/null and b/assets/Filecfg/10921070745563497265 differ diff --git a/assets/Filecfg/10929851831336572039 b/assets/Filecfg/10929851831336572039 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/10929851831336572039 differ diff --git a/assets/Filecfg/10985729176151035082 b/assets/Filecfg/10985729176151035082 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/10985729176151035082 differ diff --git a/assets/Filecfg/10997546003453637036 b/assets/Filecfg/10997546003453637036 new file mode 100644 index 0000000..2a6912f Binary files /dev/null and b/assets/Filecfg/10997546003453637036 differ diff --git a/assets/Filecfg/11001884627201219264 b/assets/Filecfg/11001884627201219264 new file mode 100644 index 0000000..333f75d Binary files /dev/null and b/assets/Filecfg/11001884627201219264 differ diff --git a/assets/Filecfg/11061877619978527403 b/assets/Filecfg/11061877619978527403 new file mode 100644 index 0000000..157d88f Binary files /dev/null and b/assets/Filecfg/11061877619978527403 differ diff --git a/assets/Filecfg/11095720218123099694 b/assets/Filecfg/11095720218123099694 new file mode 100644 index 0000000..437d27c Binary files /dev/null and b/assets/Filecfg/11095720218123099694 differ diff --git a/assets/Filecfg/11118086357799758036 b/assets/Filecfg/11118086357799758036 new file mode 100644 index 0000000..9abfcb2 Binary files /dev/null and b/assets/Filecfg/11118086357799758036 differ diff --git a/assets/Filecfg/11133396948744986753 b/assets/Filecfg/11133396948744986753 new file mode 100644 index 0000000..1759923 Binary files /dev/null and b/assets/Filecfg/11133396948744986753 differ diff --git a/assets/Filecfg/11145421422043089170 b/assets/Filecfg/11145421422043089170 new file mode 100644 index 0000000..163e198 Binary files /dev/null and b/assets/Filecfg/11145421422043089170 differ diff --git a/assets/Filecfg/11147918958690334441 b/assets/Filecfg/11147918958690334441 new file mode 100644 index 0000000..1431184 Binary files /dev/null and b/assets/Filecfg/11147918958690334441 differ diff --git a/assets/Filecfg/11160220569733161756 b/assets/Filecfg/11160220569733161756 new file mode 100644 index 0000000..7425c06 Binary files /dev/null and b/assets/Filecfg/11160220569733161756 differ diff --git a/assets/Filecfg/11176191658388455544 b/assets/Filecfg/11176191658388455544 new file mode 100644 index 0000000..74a36ec Binary files /dev/null and b/assets/Filecfg/11176191658388455544 differ diff --git a/assets/Filecfg/11177589371513043525 b/assets/Filecfg/11177589371513043525 new file mode 100644 index 0000000..693101c Binary files /dev/null and b/assets/Filecfg/11177589371513043525 differ diff --git a/assets/Filecfg/11180705407392119105 b/assets/Filecfg/11180705407392119105 new file mode 100644 index 0000000..0c64d46 Binary files /dev/null and b/assets/Filecfg/11180705407392119105 differ diff --git a/assets/Filecfg/11209594489292861369 b/assets/Filecfg/11209594489292861369 new file mode 100644 index 0000000..64db468 Binary files /dev/null and b/assets/Filecfg/11209594489292861369 differ diff --git a/assets/Filecfg/11257951261350679402 b/assets/Filecfg/11257951261350679402 new file mode 100644 index 0000000..c1135be Binary files /dev/null and b/assets/Filecfg/11257951261350679402 differ diff --git a/assets/Filecfg/11259055931781962670 b/assets/Filecfg/11259055931781962670 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/11259055931781962670 differ diff --git a/assets/Filecfg/11261572877249488737 b/assets/Filecfg/11261572877249488737 new file mode 100644 index 0000000..20aec5e Binary files /dev/null and b/assets/Filecfg/11261572877249488737 differ diff --git a/assets/Filecfg/11263845697733264881 b/assets/Filecfg/11263845697733264881 new file mode 100644 index 0000000..20b16d7 Binary files /dev/null and b/assets/Filecfg/11263845697733264881 differ diff --git a/assets/Filecfg/11313388998170933063 b/assets/Filecfg/11313388998170933063 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/11313388998170933063 differ diff --git a/assets/Filecfg/11325527673350078476 b/assets/Filecfg/11325527673350078476 new file mode 100644 index 0000000..b528a4c Binary files /dev/null and b/assets/Filecfg/11325527673350078476 differ diff --git a/assets/Filecfg/11328306938234893396 b/assets/Filecfg/11328306938234893396 new file mode 100644 index 0000000..6bc6171 Binary files /dev/null and b/assets/Filecfg/11328306938234893396 differ diff --git a/assets/Filecfg/11333261129400886137 b/assets/Filecfg/11333261129400886137 new file mode 100644 index 0000000..f6a9200 Binary files /dev/null and b/assets/Filecfg/11333261129400886137 differ diff --git a/assets/Filecfg/11346621172623076142 b/assets/Filecfg/11346621172623076142 new file mode 100644 index 0000000..39612a4 Binary files /dev/null and b/assets/Filecfg/11346621172623076142 differ diff --git a/assets/Filecfg/1137361337225950086 b/assets/Filecfg/1137361337225950086 new file mode 100644 index 0000000..9426eb7 Binary files /dev/null and b/assets/Filecfg/1137361337225950086 differ diff --git a/assets/Filecfg/11378968201971191474 b/assets/Filecfg/11378968201971191474 new file mode 100644 index 0000000..aaf1689 Binary files /dev/null and b/assets/Filecfg/11378968201971191474 differ diff --git a/assets/Filecfg/11391034716444242591 b/assets/Filecfg/11391034716444242591 new file mode 100644 index 0000000..f4d812e Binary files /dev/null and b/assets/Filecfg/11391034716444242591 differ diff --git a/assets/Filecfg/11405729873520551596 b/assets/Filecfg/11405729873520551596 new file mode 100644 index 0000000..ce19c2d Binary files /dev/null and b/assets/Filecfg/11405729873520551596 differ diff --git a/assets/Filecfg/11425768876013818663 b/assets/Filecfg/11425768876013818663 new file mode 100644 index 0000000..53e41b8 Binary files /dev/null and b/assets/Filecfg/11425768876013818663 differ diff --git a/assets/Filecfg/1146581695882370054 b/assets/Filecfg/1146581695882370054 new file mode 100644 index 0000000..2366dca Binary files /dev/null and b/assets/Filecfg/1146581695882370054 differ diff --git a/assets/Filecfg/1146981540653313102 b/assets/Filecfg/1146981540653313102 new file mode 100644 index 0000000..a8c67a0 Binary files /dev/null and b/assets/Filecfg/1146981540653313102 differ diff --git a/assets/Filecfg/11503985408089543183 b/assets/Filecfg/11503985408089543183 new file mode 100644 index 0000000..3306794 Binary files /dev/null and b/assets/Filecfg/11503985408089543183 differ diff --git a/assets/Filecfg/11508638128627741009 b/assets/Filecfg/11508638128627741009 new file mode 100644 index 0000000..624d168 Binary files /dev/null and b/assets/Filecfg/11508638128627741009 differ diff --git a/assets/Filecfg/11532086544599591982 b/assets/Filecfg/11532086544599591982 new file mode 100644 index 0000000..5365852 Binary files /dev/null and b/assets/Filecfg/11532086544599591982 differ diff --git a/assets/Filecfg/11538510762943324782 b/assets/Filecfg/11538510762943324782 new file mode 100644 index 0000000..4b49344 Binary files /dev/null and b/assets/Filecfg/11538510762943324782 differ diff --git a/assets/Filecfg/11543073592625525720 b/assets/Filecfg/11543073592625525720 new file mode 100644 index 0000000..2347389 Binary files /dev/null and b/assets/Filecfg/11543073592625525720 differ diff --git a/assets/Filecfg/11558189285978823431 b/assets/Filecfg/11558189285978823431 new file mode 100644 index 0000000..e095d64 Binary files /dev/null and b/assets/Filecfg/11558189285978823431 differ diff --git a/assets/Filecfg/11559709126509750640 b/assets/Filecfg/11559709126509750640 new file mode 100644 index 0000000..a15aa81 Binary files /dev/null and b/assets/Filecfg/11559709126509750640 differ diff --git a/assets/Filecfg/11569439978021219103 b/assets/Filecfg/11569439978021219103 new file mode 100644 index 0000000..65270a2 Binary files /dev/null and b/assets/Filecfg/11569439978021219103 differ diff --git a/assets/Filecfg/11571469023360143076 b/assets/Filecfg/11571469023360143076 new file mode 100644 index 0000000..0dcfb2c Binary files /dev/null and b/assets/Filecfg/11571469023360143076 differ diff --git a/assets/Filecfg/11576478516819601041 b/assets/Filecfg/11576478516819601041 new file mode 100644 index 0000000..887f298 Binary files /dev/null and b/assets/Filecfg/11576478516819601041 differ diff --git a/assets/Filecfg/11576498535574093844 b/assets/Filecfg/11576498535574093844 new file mode 100644 index 0000000..a8da407 Binary files /dev/null and b/assets/Filecfg/11576498535574093844 differ diff --git a/assets/Filecfg/11588891466955194857 b/assets/Filecfg/11588891466955194857 new file mode 100644 index 0000000..4899fbc Binary files /dev/null and b/assets/Filecfg/11588891466955194857 differ diff --git a/assets/Filecfg/11596558123452275632 b/assets/Filecfg/11596558123452275632 new file mode 100644 index 0000000..dadb4a0 Binary files /dev/null and b/assets/Filecfg/11596558123452275632 differ diff --git a/assets/Filecfg/11638660576119419764 b/assets/Filecfg/11638660576119419764 new file mode 100644 index 0000000..5de4b6f Binary files /dev/null and b/assets/Filecfg/11638660576119419764 differ diff --git a/assets/Filecfg/11670857816102780953 b/assets/Filecfg/11670857816102780953 new file mode 100644 index 0000000..6e44576 Binary files /dev/null and b/assets/Filecfg/11670857816102780953 differ diff --git a/assets/Filecfg/11671227759228701133 b/assets/Filecfg/11671227759228701133 new file mode 100644 index 0000000..0b2cb55 Binary files /dev/null and b/assets/Filecfg/11671227759228701133 differ diff --git a/assets/Filecfg/11676252546146867380 b/assets/Filecfg/11676252546146867380 new file mode 100644 index 0000000..7e0025e Binary files /dev/null and b/assets/Filecfg/11676252546146867380 differ diff --git a/assets/Filecfg/11688598664039779956 b/assets/Filecfg/11688598664039779956 new file mode 100644 index 0000000..efc16d2 Binary files /dev/null and b/assets/Filecfg/11688598664039779956 differ diff --git a/assets/Filecfg/11699355294826183948 b/assets/Filecfg/11699355294826183948 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/11699355294826183948 differ diff --git a/assets/Filecfg/11770689083769959798 b/assets/Filecfg/11770689083769959798 new file mode 100644 index 0000000..2602c21 Binary files /dev/null and b/assets/Filecfg/11770689083769959798 differ diff --git a/assets/Filecfg/11807643707905074273 b/assets/Filecfg/11807643707905074273 new file mode 100644 index 0000000..2dd8d66 Binary files /dev/null and b/assets/Filecfg/11807643707905074273 differ diff --git a/assets/Filecfg/11808496458639916026 b/assets/Filecfg/11808496458639916026 new file mode 100644 index 0000000..43e9e21 Binary files /dev/null and b/assets/Filecfg/11808496458639916026 differ diff --git a/assets/Filecfg/11809116947716527594 b/assets/Filecfg/11809116947716527594 new file mode 100644 index 0000000..39b4706 Binary files /dev/null and b/assets/Filecfg/11809116947716527594 differ diff --git a/assets/Filecfg/11820760237859738376 b/assets/Filecfg/11820760237859738376 new file mode 100644 index 0000000..8fae822 Binary files /dev/null and b/assets/Filecfg/11820760237859738376 differ diff --git a/assets/Filecfg/11892429505887745703 b/assets/Filecfg/11892429505887745703 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/11892429505887745703 differ diff --git a/assets/Filecfg/11894889854788888516 b/assets/Filecfg/11894889854788888516 new file mode 100644 index 0000000..6a03519 Binary files /dev/null and b/assets/Filecfg/11894889854788888516 differ diff --git a/assets/Filecfg/11959741831023438532 b/assets/Filecfg/11959741831023438532 new file mode 100644 index 0000000..265486b Binary files /dev/null and b/assets/Filecfg/11959741831023438532 differ diff --git a/assets/Filecfg/11959874504332582423 b/assets/Filecfg/11959874504332582423 new file mode 100644 index 0000000..77441b6 Binary files /dev/null and b/assets/Filecfg/11959874504332582423 differ diff --git a/assets/Filecfg/11971826289350521223 b/assets/Filecfg/11971826289350521223 new file mode 100644 index 0000000..e34169a Binary files /dev/null and b/assets/Filecfg/11971826289350521223 differ diff --git a/assets/Filecfg/11973044386591920228 b/assets/Filecfg/11973044386591920228 new file mode 100644 index 0000000..47983b1 Binary files /dev/null and b/assets/Filecfg/11973044386591920228 differ diff --git a/assets/Filecfg/11977512613946124224 b/assets/Filecfg/11977512613946124224 new file mode 100644 index 0000000..e36564d Binary files /dev/null and b/assets/Filecfg/11977512613946124224 differ diff --git a/assets/Filecfg/12011173932213761153 b/assets/Filecfg/12011173932213761153 new file mode 100644 index 0000000..7d3f9ac Binary files /dev/null and b/assets/Filecfg/12011173932213761153 differ diff --git a/assets/Filecfg/12016222486323419139 b/assets/Filecfg/12016222486323419139 new file mode 100644 index 0000000..96c0599 Binary files /dev/null and b/assets/Filecfg/12016222486323419139 differ diff --git a/assets/Filecfg/12036034276248077488 b/assets/Filecfg/12036034276248077488 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/12036034276248077488 differ diff --git a/assets/Filecfg/12043283061816536973 b/assets/Filecfg/12043283061816536973 new file mode 100644 index 0000000..4523d73 Binary files /dev/null and b/assets/Filecfg/12043283061816536973 differ diff --git a/assets/Filecfg/12044395469458286489 b/assets/Filecfg/12044395469458286489 new file mode 100644 index 0000000..23f832b Binary files /dev/null and b/assets/Filecfg/12044395469458286489 differ diff --git a/assets/Filecfg/12044902111661106715 b/assets/Filecfg/12044902111661106715 new file mode 100644 index 0000000..bda250a Binary files /dev/null and b/assets/Filecfg/12044902111661106715 differ diff --git a/assets/Filecfg/12049394104971316677 b/assets/Filecfg/12049394104971316677 new file mode 100644 index 0000000..a3105c9 Binary files /dev/null and b/assets/Filecfg/12049394104971316677 differ diff --git a/assets/Filecfg/12051209902856777506 b/assets/Filecfg/12051209902856777506 new file mode 100644 index 0000000..40470ff Binary files /dev/null and b/assets/Filecfg/12051209902856777506 differ diff --git a/assets/Filecfg/12056881428250006971 b/assets/Filecfg/12056881428250006971 new file mode 100644 index 0000000..ad3fac9 Binary files /dev/null and b/assets/Filecfg/12056881428250006971 differ diff --git a/assets/Filecfg/12100765741811321761 b/assets/Filecfg/12100765741811321761 new file mode 100644 index 0000000..6f8ee6d Binary files /dev/null and b/assets/Filecfg/12100765741811321761 differ diff --git a/assets/Filecfg/12100832313736761596 b/assets/Filecfg/12100832313736761596 new file mode 100644 index 0000000..de80292 Binary files /dev/null and b/assets/Filecfg/12100832313736761596 differ diff --git a/assets/Filecfg/12101280889038810448 b/assets/Filecfg/12101280889038810448 new file mode 100644 index 0000000..bae5d8f Binary files /dev/null and b/assets/Filecfg/12101280889038810448 differ diff --git a/assets/Filecfg/12103836235461035012 b/assets/Filecfg/12103836235461035012 new file mode 100644 index 0000000..632609d Binary files /dev/null and b/assets/Filecfg/12103836235461035012 differ diff --git a/assets/Filecfg/12121898994649420732 b/assets/Filecfg/12121898994649420732 new file mode 100644 index 0000000..20a1458 Binary files /dev/null and b/assets/Filecfg/12121898994649420732 differ diff --git a/assets/Filecfg/12128262476502180224 b/assets/Filecfg/12128262476502180224 new file mode 100644 index 0000000..22011fa Binary files /dev/null and b/assets/Filecfg/12128262476502180224 differ diff --git a/assets/Filecfg/12138365840437978083 b/assets/Filecfg/12138365840437978083 new file mode 100644 index 0000000..568ac7d Binary files /dev/null and b/assets/Filecfg/12138365840437978083 differ diff --git a/assets/Filecfg/12167546449363201362 b/assets/Filecfg/12167546449363201362 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/12167546449363201362 differ diff --git a/assets/Filecfg/12200866403824151028 b/assets/Filecfg/12200866403824151028 new file mode 100644 index 0000000..1c2dc1f Binary files /dev/null and b/assets/Filecfg/12200866403824151028 differ diff --git a/assets/Filecfg/12219052880920443075 b/assets/Filecfg/12219052880920443075 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/12219052880920443075 differ diff --git a/assets/Filecfg/1223756082428729712 b/assets/Filecfg/1223756082428729712 new file mode 100644 index 0000000..8429383 Binary files /dev/null and b/assets/Filecfg/1223756082428729712 differ diff --git a/assets/Filecfg/12262365267424195694 b/assets/Filecfg/12262365267424195694 new file mode 100644 index 0000000..43cedc3 Binary files /dev/null and b/assets/Filecfg/12262365267424195694 differ diff --git a/assets/Filecfg/12273930952462579928 b/assets/Filecfg/12273930952462579928 new file mode 100644 index 0000000..08cbfb0 Binary files /dev/null and b/assets/Filecfg/12273930952462579928 differ diff --git a/assets/Filecfg/12287522643632282086 b/assets/Filecfg/12287522643632282086 new file mode 100644 index 0000000..044f41b Binary files /dev/null and b/assets/Filecfg/12287522643632282086 differ diff --git a/assets/Filecfg/12395448158179005395 b/assets/Filecfg/12395448158179005395 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/12395448158179005395 differ diff --git a/assets/Filecfg/12403361004188848171 b/assets/Filecfg/12403361004188848171 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/12403361004188848171 differ diff --git a/assets/Filecfg/12405619337966562409 b/assets/Filecfg/12405619337966562409 new file mode 100644 index 0000000..c85c3ff Binary files /dev/null and b/assets/Filecfg/12405619337966562409 differ diff --git a/assets/Filecfg/1241707129164649326 b/assets/Filecfg/1241707129164649326 new file mode 100644 index 0000000..e10b462 Binary files /dev/null and b/assets/Filecfg/1241707129164649326 differ diff --git a/assets/Filecfg/12439758950867566135 b/assets/Filecfg/12439758950867566135 new file mode 100644 index 0000000..2e9de10 Binary files /dev/null and b/assets/Filecfg/12439758950867566135 differ diff --git a/assets/Filecfg/12469726199860239004 b/assets/Filecfg/12469726199860239004 new file mode 100644 index 0000000..f602070 Binary files /dev/null and b/assets/Filecfg/12469726199860239004 differ diff --git a/assets/Filecfg/12483800510799063997 b/assets/Filecfg/12483800510799063997 new file mode 100644 index 0000000..dec556d Binary files /dev/null and b/assets/Filecfg/12483800510799063997 differ diff --git a/assets/Filecfg/12546009681141715283 b/assets/Filecfg/12546009681141715283 new file mode 100644 index 0000000..55b141b Binary files /dev/null and b/assets/Filecfg/12546009681141715283 differ diff --git a/assets/Filecfg/12575113757031609367 b/assets/Filecfg/12575113757031609367 new file mode 100644 index 0000000..9942426 Binary files /dev/null and b/assets/Filecfg/12575113757031609367 differ diff --git a/assets/Filecfg/12581178583431267755 b/assets/Filecfg/12581178583431267755 new file mode 100644 index 0000000..9430162 Binary files /dev/null and b/assets/Filecfg/12581178583431267755 differ diff --git a/assets/Filecfg/12581616406589161462 b/assets/Filecfg/12581616406589161462 new file mode 100644 index 0000000..0953d07 Binary files /dev/null and b/assets/Filecfg/12581616406589161462 differ diff --git a/assets/Filecfg/12615449732325789568 b/assets/Filecfg/12615449732325789568 new file mode 100644 index 0000000..d875c2d Binary files /dev/null and b/assets/Filecfg/12615449732325789568 differ diff --git a/assets/Filecfg/12622526531917724049 b/assets/Filecfg/12622526531917724049 new file mode 100644 index 0000000..a50e780 Binary files /dev/null and b/assets/Filecfg/12622526531917724049 differ diff --git a/assets/Filecfg/1262582139316939188 b/assets/Filecfg/1262582139316939188 new file mode 100644 index 0000000..64b7b3a Binary files /dev/null and b/assets/Filecfg/1262582139316939188 differ diff --git a/assets/Filecfg/12659626931666168309 b/assets/Filecfg/12659626931666168309 new file mode 100644 index 0000000..fbc40f9 Binary files /dev/null and b/assets/Filecfg/12659626931666168309 differ diff --git a/assets/Filecfg/12660071074277046286 b/assets/Filecfg/12660071074277046286 new file mode 100644 index 0000000..77376ff Binary files /dev/null and b/assets/Filecfg/12660071074277046286 differ diff --git a/assets/Filecfg/12675140779352371357 b/assets/Filecfg/12675140779352371357 new file mode 100644 index 0000000..30f16d4 Binary files /dev/null and b/assets/Filecfg/12675140779352371357 differ diff --git a/assets/Filecfg/12709344772788008567 b/assets/Filecfg/12709344772788008567 new file mode 100644 index 0000000..65b41a2 Binary files /dev/null and b/assets/Filecfg/12709344772788008567 differ diff --git a/assets/Filecfg/12717028082827741445 b/assets/Filecfg/12717028082827741445 new file mode 100644 index 0000000..ccb8885 Binary files /dev/null and b/assets/Filecfg/12717028082827741445 differ diff --git a/assets/Filecfg/1274778544211905570 b/assets/Filecfg/1274778544211905570 new file mode 100644 index 0000000..f887c88 Binary files /dev/null and b/assets/Filecfg/1274778544211905570 differ diff --git a/assets/Filecfg/12768323712919811086 b/assets/Filecfg/12768323712919811086 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/12768323712919811086 differ diff --git a/assets/Filecfg/12802194980258273454 b/assets/Filecfg/12802194980258273454 new file mode 100644 index 0000000..f48eeda Binary files /dev/null and b/assets/Filecfg/12802194980258273454 differ diff --git a/assets/Filecfg/12804219507527967255 b/assets/Filecfg/12804219507527967255 new file mode 100644 index 0000000..f50bc8e Binary files /dev/null and b/assets/Filecfg/12804219507527967255 differ diff --git a/assets/Filecfg/12805474889402148447 b/assets/Filecfg/12805474889402148447 new file mode 100644 index 0000000..43e5abe Binary files /dev/null and b/assets/Filecfg/12805474889402148447 differ diff --git a/assets/Filecfg/12809700518214419243 b/assets/Filecfg/12809700518214419243 new file mode 100644 index 0000000..d0e25e2 Binary files /dev/null and b/assets/Filecfg/12809700518214419243 differ diff --git a/assets/Filecfg/12830455477392440634 b/assets/Filecfg/12830455477392440634 new file mode 100644 index 0000000..d23baf7 Binary files /dev/null and b/assets/Filecfg/12830455477392440634 differ diff --git a/assets/Filecfg/12840126620800625719 b/assets/Filecfg/12840126620800625719 new file mode 100644 index 0000000..6f7d114 Binary files /dev/null and b/assets/Filecfg/12840126620800625719 differ diff --git a/assets/Filecfg/12856116839516311860 b/assets/Filecfg/12856116839516311860 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/12856116839516311860 differ diff --git a/assets/Filecfg/12866994806789710314 b/assets/Filecfg/12866994806789710314 new file mode 100644 index 0000000..73d05d2 Binary files /dev/null and b/assets/Filecfg/12866994806789710314 differ diff --git a/assets/Filecfg/12891725867948931595 b/assets/Filecfg/12891725867948931595 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/12891725867948931595 differ diff --git a/assets/Filecfg/12902298843805367156 b/assets/Filecfg/12902298843805367156 new file mode 100644 index 0000000..52bf0d3 Binary files /dev/null and b/assets/Filecfg/12902298843805367156 differ diff --git a/assets/Filecfg/12904534715703008618 b/assets/Filecfg/12904534715703008618 new file mode 100644 index 0000000..5c67526 Binary files /dev/null and b/assets/Filecfg/12904534715703008618 differ diff --git a/assets/Filecfg/12913035510487981219 b/assets/Filecfg/12913035510487981219 new file mode 100644 index 0000000..09dd448 Binary files /dev/null and b/assets/Filecfg/12913035510487981219 differ diff --git a/assets/Filecfg/12922675106655280279 b/assets/Filecfg/12922675106655280279 new file mode 100644 index 0000000..609e4b3 Binary files /dev/null and b/assets/Filecfg/12922675106655280279 differ diff --git a/assets/Filecfg/12931606162403483347 b/assets/Filecfg/12931606162403483347 new file mode 100644 index 0000000..af70e2c Binary files /dev/null and b/assets/Filecfg/12931606162403483347 differ diff --git a/assets/Filecfg/1293870182451517655 b/assets/Filecfg/1293870182451517655 new file mode 100644 index 0000000..84c0e76 Binary files /dev/null and b/assets/Filecfg/1293870182451517655 differ diff --git a/assets/Filecfg/1297544549941939366 b/assets/Filecfg/1297544549941939366 new file mode 100644 index 0000000..6b99eac Binary files /dev/null and b/assets/Filecfg/1297544549941939366 differ diff --git a/assets/Filecfg/13035985075193514114 b/assets/Filecfg/13035985075193514114 new file mode 100644 index 0000000..4db6695 Binary files /dev/null and b/assets/Filecfg/13035985075193514114 differ diff --git a/assets/Filecfg/1305064974803703511 b/assets/Filecfg/1305064974803703511 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/1305064974803703511 differ diff --git a/assets/Filecfg/13062340612302891740 b/assets/Filecfg/13062340612302891740 new file mode 100644 index 0000000..ebf530b Binary files /dev/null and b/assets/Filecfg/13062340612302891740 differ diff --git a/assets/Filecfg/13071000056023628193 b/assets/Filecfg/13071000056023628193 new file mode 100644 index 0000000..ace4802 Binary files /dev/null and b/assets/Filecfg/13071000056023628193 differ diff --git a/assets/Filecfg/13073074132856824709 b/assets/Filecfg/13073074132856824709 new file mode 100644 index 0000000..a124525 Binary files /dev/null and b/assets/Filecfg/13073074132856824709 differ diff --git a/assets/Filecfg/13074992593575536072 b/assets/Filecfg/13074992593575536072 new file mode 100644 index 0000000..969409f Binary files /dev/null and b/assets/Filecfg/13074992593575536072 differ diff --git a/assets/Filecfg/1309004668354716073 b/assets/Filecfg/1309004668354716073 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/1309004668354716073 differ diff --git a/assets/Filecfg/13104972531798664310 b/assets/Filecfg/13104972531798664310 new file mode 100644 index 0000000..e837fab Binary files /dev/null and b/assets/Filecfg/13104972531798664310 differ diff --git a/assets/Filecfg/13116247856823296222 b/assets/Filecfg/13116247856823296222 new file mode 100644 index 0000000..d856f01 Binary files /dev/null and b/assets/Filecfg/13116247856823296222 differ diff --git a/assets/Filecfg/13134457107230143672 b/assets/Filecfg/13134457107230143672 new file mode 100644 index 0000000..628199f Binary files /dev/null and b/assets/Filecfg/13134457107230143672 differ diff --git a/assets/Filecfg/13166379840389496628 b/assets/Filecfg/13166379840389496628 new file mode 100644 index 0000000..b98b812 Binary files /dev/null and b/assets/Filecfg/13166379840389496628 differ diff --git a/assets/Filecfg/13176846656471334555 b/assets/Filecfg/13176846656471334555 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/13176846656471334555 differ diff --git a/assets/Filecfg/13184663371782799818 b/assets/Filecfg/13184663371782799818 new file mode 100644 index 0000000..e06e722 Binary files /dev/null and b/assets/Filecfg/13184663371782799818 differ diff --git a/assets/Filecfg/13193430226524922428 b/assets/Filecfg/13193430226524922428 new file mode 100644 index 0000000..5276e09 Binary files /dev/null and b/assets/Filecfg/13193430226524922428 differ diff --git a/assets/Filecfg/13236827700232957373 b/assets/Filecfg/13236827700232957373 new file mode 100644 index 0000000..d54bd4f Binary files /dev/null and b/assets/Filecfg/13236827700232957373 differ diff --git a/assets/Filecfg/13239014933111672571 b/assets/Filecfg/13239014933111672571 new file mode 100644 index 0000000..5fc70c7 Binary files /dev/null and b/assets/Filecfg/13239014933111672571 differ diff --git a/assets/Filecfg/13256350733720567779 b/assets/Filecfg/13256350733720567779 new file mode 100644 index 0000000..6517177 Binary files /dev/null and b/assets/Filecfg/13256350733720567779 differ diff --git a/assets/Filecfg/13272091846621142377 b/assets/Filecfg/13272091846621142377 new file mode 100644 index 0000000..a65ee1d Binary files /dev/null and b/assets/Filecfg/13272091846621142377 differ diff --git a/assets/Filecfg/13278838050380503017 b/assets/Filecfg/13278838050380503017 new file mode 100644 index 0000000..630b46f Binary files /dev/null and b/assets/Filecfg/13278838050380503017 differ diff --git a/assets/Filecfg/13287987426830237373 b/assets/Filecfg/13287987426830237373 new file mode 100644 index 0000000..c37307a Binary files /dev/null and b/assets/Filecfg/13287987426830237373 differ diff --git a/assets/Filecfg/13293167532335638372 b/assets/Filecfg/13293167532335638372 new file mode 100644 index 0000000..05c33e4 Binary files /dev/null and b/assets/Filecfg/13293167532335638372 differ diff --git a/assets/Filecfg/13301111260919602299 b/assets/Filecfg/13301111260919602299 new file mode 100644 index 0000000..64a15d8 Binary files /dev/null and b/assets/Filecfg/13301111260919602299 differ diff --git a/assets/Filecfg/13320103313176105867 b/assets/Filecfg/13320103313176105867 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/13320103313176105867 differ diff --git a/assets/Filecfg/13321200043378441022 b/assets/Filecfg/13321200043378441022 new file mode 100644 index 0000000..dfb685a Binary files /dev/null and b/assets/Filecfg/13321200043378441022 differ diff --git a/assets/Filecfg/13346225442421927579 b/assets/Filecfg/13346225442421927579 new file mode 100644 index 0000000..1099662 Binary files /dev/null and b/assets/Filecfg/13346225442421927579 differ diff --git a/assets/Filecfg/13352754361227645360 b/assets/Filecfg/13352754361227645360 new file mode 100644 index 0000000..a798978 Binary files /dev/null and b/assets/Filecfg/13352754361227645360 differ diff --git a/assets/Filecfg/13425191432873069515 b/assets/Filecfg/13425191432873069515 new file mode 100644 index 0000000..ea69668 Binary files /dev/null and b/assets/Filecfg/13425191432873069515 differ diff --git a/assets/Filecfg/13433870276842583658 b/assets/Filecfg/13433870276842583658 new file mode 100644 index 0000000..88efdcb Binary files /dev/null and b/assets/Filecfg/13433870276842583658 differ diff --git a/assets/Filecfg/13491796520735982853 b/assets/Filecfg/13491796520735982853 new file mode 100644 index 0000000..b7a94f1 Binary files /dev/null and b/assets/Filecfg/13491796520735982853 differ diff --git a/assets/Filecfg/13496442706850755117 b/assets/Filecfg/13496442706850755117 new file mode 100644 index 0000000..0593470 Binary files /dev/null and b/assets/Filecfg/13496442706850755117 differ diff --git a/assets/Filecfg/13498195941959368917 b/assets/Filecfg/13498195941959368917 new file mode 100644 index 0000000..55d63b1 Binary files /dev/null and b/assets/Filecfg/13498195941959368917 differ diff --git a/assets/Filecfg/13508364860378153571 b/assets/Filecfg/13508364860378153571 new file mode 100644 index 0000000..e2f200c Binary files /dev/null and b/assets/Filecfg/13508364860378153571 differ diff --git a/assets/Filecfg/1351496110992085534 b/assets/Filecfg/1351496110992085534 new file mode 100644 index 0000000..c1c4868 Binary files /dev/null and b/assets/Filecfg/1351496110992085534 differ diff --git a/assets/Filecfg/13518303033006913259 b/assets/Filecfg/13518303033006913259 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/13518303033006913259 differ diff --git a/assets/Filecfg/13544481804320678007 b/assets/Filecfg/13544481804320678007 new file mode 100644 index 0000000..e0081b1 Binary files /dev/null and b/assets/Filecfg/13544481804320678007 differ diff --git a/assets/Filecfg/13550289249233563902 b/assets/Filecfg/13550289249233563902 new file mode 100644 index 0000000..037b394 Binary files /dev/null and b/assets/Filecfg/13550289249233563902 differ diff --git a/assets/Filecfg/13572559845507003101 b/assets/Filecfg/13572559845507003101 new file mode 100644 index 0000000..373a8f4 Binary files /dev/null and b/assets/Filecfg/13572559845507003101 differ diff --git a/assets/Filecfg/13585509144909758927 b/assets/Filecfg/13585509144909758927 new file mode 100644 index 0000000..3d1b048 Binary files /dev/null and b/assets/Filecfg/13585509144909758927 differ diff --git a/assets/Filecfg/13637197919189542106 b/assets/Filecfg/13637197919189542106 new file mode 100644 index 0000000..bc0c0b7 Binary files /dev/null and b/assets/Filecfg/13637197919189542106 differ diff --git a/assets/Filecfg/13644480641097944469 b/assets/Filecfg/13644480641097944469 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/13644480641097944469 differ diff --git a/assets/Filecfg/13653452728974023680 b/assets/Filecfg/13653452728974023680 new file mode 100644 index 0000000..41403b9 Binary files /dev/null and b/assets/Filecfg/13653452728974023680 differ diff --git a/assets/Filecfg/13705898059580423066 b/assets/Filecfg/13705898059580423066 new file mode 100644 index 0000000..250d3f2 Binary files /dev/null and b/assets/Filecfg/13705898059580423066 differ diff --git a/assets/Filecfg/13722361251227540977 b/assets/Filecfg/13722361251227540977 new file mode 100644 index 0000000..fc32862 Binary files /dev/null and b/assets/Filecfg/13722361251227540977 differ diff --git a/assets/Filecfg/13746236377553233605 b/assets/Filecfg/13746236377553233605 new file mode 100644 index 0000000..abd72da Binary files /dev/null and b/assets/Filecfg/13746236377553233605 differ diff --git a/assets/Filecfg/13765769592196355671 b/assets/Filecfg/13765769592196355671 new file mode 100644 index 0000000..cb84c6e Binary files /dev/null and b/assets/Filecfg/13765769592196355671 differ diff --git a/assets/Filecfg/13765802363697424021 b/assets/Filecfg/13765802363697424021 new file mode 100644 index 0000000..488f3a6 Binary files /dev/null and b/assets/Filecfg/13765802363697424021 differ diff --git a/assets/Filecfg/13778518747960869120 b/assets/Filecfg/13778518747960869120 new file mode 100644 index 0000000..9bdff39 Binary files /dev/null and b/assets/Filecfg/13778518747960869120 differ diff --git a/assets/Filecfg/13781160914055196826 b/assets/Filecfg/13781160914055196826 new file mode 100644 index 0000000..2b3d01c Binary files /dev/null and b/assets/Filecfg/13781160914055196826 differ diff --git a/assets/Filecfg/13809843761264367748 b/assets/Filecfg/13809843761264367748 new file mode 100644 index 0000000..74ec848 Binary files /dev/null and b/assets/Filecfg/13809843761264367748 differ diff --git a/assets/Filecfg/13834844884842592152 b/assets/Filecfg/13834844884842592152 new file mode 100644 index 0000000..24a0d80 Binary files /dev/null and b/assets/Filecfg/13834844884842592152 differ diff --git a/assets/Filecfg/13904826857160967453 b/assets/Filecfg/13904826857160967453 new file mode 100644 index 0000000..b3cdf59 Binary files /dev/null and b/assets/Filecfg/13904826857160967453 differ diff --git a/assets/Filecfg/13923107011105172226 b/assets/Filecfg/13923107011105172226 new file mode 100644 index 0000000..bd17f6c Binary files /dev/null and b/assets/Filecfg/13923107011105172226 differ diff --git a/assets/Filecfg/13949285509812412624 b/assets/Filecfg/13949285509812412624 new file mode 100644 index 0000000..ae41fa0 Binary files /dev/null and b/assets/Filecfg/13949285509812412624 differ diff --git a/assets/Filecfg/1395698546342447684 b/assets/Filecfg/1395698546342447684 new file mode 100644 index 0000000..c1dbcc5 Binary files /dev/null and b/assets/Filecfg/1395698546342447684 differ diff --git a/assets/Filecfg/13964482500288682634 b/assets/Filecfg/13964482500288682634 new file mode 100644 index 0000000..ea42586 Binary files /dev/null and b/assets/Filecfg/13964482500288682634 differ diff --git a/assets/Filecfg/1397479047159434901 b/assets/Filecfg/1397479047159434901 new file mode 100644 index 0000000..2e2cb87 Binary files /dev/null and b/assets/Filecfg/1397479047159434901 differ diff --git a/assets/Filecfg/13988620112675139837 b/assets/Filecfg/13988620112675139837 new file mode 100644 index 0000000..2682a45 Binary files /dev/null and b/assets/Filecfg/13988620112675139837 differ diff --git a/assets/Filecfg/14050239669595699822 b/assets/Filecfg/14050239669595699822 new file mode 100644 index 0000000..20a3ead Binary files /dev/null and b/assets/Filecfg/14050239669595699822 differ diff --git a/assets/Filecfg/14084850265651115920 b/assets/Filecfg/14084850265651115920 new file mode 100644 index 0000000..0746c29 Binary files /dev/null and b/assets/Filecfg/14084850265651115920 differ diff --git a/assets/Filecfg/14087313421243846419 b/assets/Filecfg/14087313421243846419 new file mode 100644 index 0000000..2f70edf Binary files /dev/null and b/assets/Filecfg/14087313421243846419 differ diff --git a/assets/Filecfg/1409773412335339592 b/assets/Filecfg/1409773412335339592 new file mode 100644 index 0000000..412c6ab Binary files /dev/null and b/assets/Filecfg/1409773412335339592 differ diff --git a/assets/Filecfg/14131799385197245791 b/assets/Filecfg/14131799385197245791 new file mode 100644 index 0000000..104e8df Binary files /dev/null and b/assets/Filecfg/14131799385197245791 differ diff --git a/assets/Filecfg/14149587450341291303 b/assets/Filecfg/14149587450341291303 new file mode 100644 index 0000000..64d30b0 Binary files /dev/null and b/assets/Filecfg/14149587450341291303 differ diff --git a/assets/Filecfg/1416984879331540405 b/assets/Filecfg/1416984879331540405 new file mode 100644 index 0000000..d1d0461 Binary files /dev/null and b/assets/Filecfg/1416984879331540405 differ diff --git a/assets/Filecfg/14173138344789738914 b/assets/Filecfg/14173138344789738914 new file mode 100644 index 0000000..c7b5f77 Binary files /dev/null and b/assets/Filecfg/14173138344789738914 differ diff --git a/assets/Filecfg/14177385661982796762 b/assets/Filecfg/14177385661982796762 new file mode 100644 index 0000000..c18ff2b Binary files /dev/null and b/assets/Filecfg/14177385661982796762 differ diff --git a/assets/Filecfg/14180047985117673399 b/assets/Filecfg/14180047985117673399 new file mode 100644 index 0000000..58d809b Binary files /dev/null and b/assets/Filecfg/14180047985117673399 differ diff --git a/assets/Filecfg/1418465119912415878 b/assets/Filecfg/1418465119912415878 new file mode 100644 index 0000000..c50b4ce Binary files /dev/null and b/assets/Filecfg/1418465119912415878 differ diff --git a/assets/Filecfg/14185932005100629794 b/assets/Filecfg/14185932005100629794 new file mode 100644 index 0000000..79ecb0e Binary files /dev/null and b/assets/Filecfg/14185932005100629794 differ diff --git a/assets/Filecfg/14189466468575768998 b/assets/Filecfg/14189466468575768998 new file mode 100644 index 0000000..50ba783 Binary files /dev/null and b/assets/Filecfg/14189466468575768998 differ diff --git a/assets/Filecfg/14227516318002665789 b/assets/Filecfg/14227516318002665789 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/14227516318002665789 differ diff --git a/assets/Filecfg/14245525708290308349 b/assets/Filecfg/14245525708290308349 new file mode 100644 index 0000000..928be16 Binary files /dev/null and b/assets/Filecfg/14245525708290308349 differ diff --git a/assets/Filecfg/14247919854262882755 b/assets/Filecfg/14247919854262882755 new file mode 100644 index 0000000..57e749d Binary files /dev/null and b/assets/Filecfg/14247919854262882755 differ diff --git a/assets/Filecfg/142484686357782867 b/assets/Filecfg/142484686357782867 new file mode 100644 index 0000000..12c8e95 Binary files /dev/null and b/assets/Filecfg/142484686357782867 differ diff --git a/assets/Filecfg/14251884787148089304 b/assets/Filecfg/14251884787148089304 new file mode 100644 index 0000000..a11762c Binary files /dev/null and b/assets/Filecfg/14251884787148089304 differ diff --git a/assets/Filecfg/14333103689596831117 b/assets/Filecfg/14333103689596831117 new file mode 100644 index 0000000..4e8a764 Binary files /dev/null and b/assets/Filecfg/14333103689596831117 differ diff --git a/assets/Filecfg/14365167321843138183 b/assets/Filecfg/14365167321843138183 new file mode 100644 index 0000000..a75c318 Binary files /dev/null and b/assets/Filecfg/14365167321843138183 differ diff --git a/assets/Filecfg/14375750515667949368 b/assets/Filecfg/14375750515667949368 new file mode 100644 index 0000000..0053ff2 Binary files /dev/null and b/assets/Filecfg/14375750515667949368 differ diff --git a/assets/Filecfg/14396763538925579954 b/assets/Filecfg/14396763538925579954 new file mode 100644 index 0000000..6a4db4d Binary files /dev/null and b/assets/Filecfg/14396763538925579954 differ diff --git a/assets/Filecfg/14407397166304674716 b/assets/Filecfg/14407397166304674716 new file mode 100644 index 0000000..ec625f9 Binary files /dev/null and b/assets/Filecfg/14407397166304674716 differ diff --git a/assets/Filecfg/14414139782965732304 b/assets/Filecfg/14414139782965732304 new file mode 100644 index 0000000..1223fdc Binary files /dev/null and b/assets/Filecfg/14414139782965732304 differ diff --git a/assets/Filecfg/14415295214063432900 b/assets/Filecfg/14415295214063432900 new file mode 100644 index 0000000..0b6fa8b Binary files /dev/null and b/assets/Filecfg/14415295214063432900 differ diff --git a/assets/Filecfg/14439772529272487197 b/assets/Filecfg/14439772529272487197 new file mode 100644 index 0000000..878a03d Binary files /dev/null and b/assets/Filecfg/14439772529272487197 differ diff --git a/assets/Filecfg/14448875816240030299 b/assets/Filecfg/14448875816240030299 new file mode 100644 index 0000000..70d8682 Binary files /dev/null and b/assets/Filecfg/14448875816240030299 differ diff --git a/assets/Filecfg/14501395200832516578 b/assets/Filecfg/14501395200832516578 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/14501395200832516578 differ diff --git a/assets/Filecfg/14509983001649012467 b/assets/Filecfg/14509983001649012467 new file mode 100644 index 0000000..734f817 Binary files /dev/null and b/assets/Filecfg/14509983001649012467 differ diff --git a/assets/Filecfg/14528180718124524489 b/assets/Filecfg/14528180718124524489 new file mode 100644 index 0000000..bc30e91 Binary files /dev/null and b/assets/Filecfg/14528180718124524489 differ diff --git a/assets/Filecfg/14544618190594154009 b/assets/Filecfg/14544618190594154009 new file mode 100644 index 0000000..581d8eb Binary files /dev/null and b/assets/Filecfg/14544618190594154009 differ diff --git a/assets/Filecfg/14567317528246056031 b/assets/Filecfg/14567317528246056031 new file mode 100644 index 0000000..3e14af5 Binary files /dev/null and b/assets/Filecfg/14567317528246056031 differ diff --git a/assets/Filecfg/14587103447317810560 b/assets/Filecfg/14587103447317810560 new file mode 100644 index 0000000..d8bce4e Binary files /dev/null and b/assets/Filecfg/14587103447317810560 differ diff --git a/assets/Filecfg/14614244785039130034 b/assets/Filecfg/14614244785039130034 new file mode 100644 index 0000000..2e38e2b Binary files /dev/null and b/assets/Filecfg/14614244785039130034 differ diff --git a/assets/Filecfg/14618877808015363190 b/assets/Filecfg/14618877808015363190 new file mode 100644 index 0000000..19e38ed Binary files /dev/null and b/assets/Filecfg/14618877808015363190 differ diff --git a/assets/Filecfg/14623487382975925447 b/assets/Filecfg/14623487382975925447 new file mode 100644 index 0000000..64b95dc Binary files /dev/null and b/assets/Filecfg/14623487382975925447 differ diff --git a/assets/Filecfg/14630370977321247341 b/assets/Filecfg/14630370977321247341 new file mode 100644 index 0000000..34fdc97 Binary files /dev/null and b/assets/Filecfg/14630370977321247341 differ diff --git a/assets/Filecfg/14638439064665827593 b/assets/Filecfg/14638439064665827593 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/14638439064665827593 differ diff --git a/assets/Filecfg/14657151593404735059 b/assets/Filecfg/14657151593404735059 new file mode 100644 index 0000000..0c3aa46 Binary files /dev/null and b/assets/Filecfg/14657151593404735059 differ diff --git a/assets/Filecfg/14679168041817353525 b/assets/Filecfg/14679168041817353525 new file mode 100644 index 0000000..ce2aaac Binary files /dev/null and b/assets/Filecfg/14679168041817353525 differ diff --git a/assets/Filecfg/14726279791535155635 b/assets/Filecfg/14726279791535155635 new file mode 100644 index 0000000..e00fb5a Binary files /dev/null and b/assets/Filecfg/14726279791535155635 differ diff --git a/assets/Filecfg/14753593690928226185 b/assets/Filecfg/14753593690928226185 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/14753593690928226185 differ diff --git a/assets/Filecfg/1477302348147525041 b/assets/Filecfg/1477302348147525041 new file mode 100644 index 0000000..6e87831 Binary files /dev/null and b/assets/Filecfg/1477302348147525041 differ diff --git a/assets/Filecfg/14773810293201511602 b/assets/Filecfg/14773810293201511602 new file mode 100644 index 0000000..e6ea9cc Binary files /dev/null and b/assets/Filecfg/14773810293201511602 differ diff --git a/assets/Filecfg/14774258885467277257 b/assets/Filecfg/14774258885467277257 new file mode 100644 index 0000000..0ca1611 Binary files /dev/null and b/assets/Filecfg/14774258885467277257 differ diff --git a/assets/Filecfg/14779991894617658760 b/assets/Filecfg/14779991894617658760 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/14779991894617658760 differ diff --git a/assets/Filecfg/14798518911483988711 b/assets/Filecfg/14798518911483988711 new file mode 100644 index 0000000..cacf3e6 Binary files /dev/null and b/assets/Filecfg/14798518911483988711 differ diff --git a/assets/Filecfg/14836042990086056769 b/assets/Filecfg/14836042990086056769 new file mode 100644 index 0000000..f07fdb5 Binary files /dev/null and b/assets/Filecfg/14836042990086056769 differ diff --git a/assets/Filecfg/14859382666509833841 b/assets/Filecfg/14859382666509833841 new file mode 100644 index 0000000..24988fc Binary files /dev/null and b/assets/Filecfg/14859382666509833841 differ diff --git a/assets/Filecfg/14878140180919653945 b/assets/Filecfg/14878140180919653945 new file mode 100644 index 0000000..3dedb85 Binary files /dev/null and b/assets/Filecfg/14878140180919653945 differ diff --git a/assets/Filecfg/14880601422967220575 b/assets/Filecfg/14880601422967220575 new file mode 100644 index 0000000..a4b6406 Binary files /dev/null and b/assets/Filecfg/14880601422967220575 differ diff --git a/assets/Filecfg/14883436848086719726 b/assets/Filecfg/14883436848086719726 new file mode 100644 index 0000000..75601c3 Binary files /dev/null and b/assets/Filecfg/14883436848086719726 differ diff --git a/assets/Filecfg/14886686227716462045 b/assets/Filecfg/14886686227716462045 new file mode 100644 index 0000000..de1d799 Binary files /dev/null and b/assets/Filecfg/14886686227716462045 differ diff --git a/assets/Filecfg/14894035694170872126 b/assets/Filecfg/14894035694170872126 new file mode 100644 index 0000000..213654f Binary files /dev/null and b/assets/Filecfg/14894035694170872126 differ diff --git a/assets/Filecfg/14897347133108629906 b/assets/Filecfg/14897347133108629906 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/14897347133108629906 differ diff --git a/assets/Filecfg/14899954601798562137 b/assets/Filecfg/14899954601798562137 new file mode 100644 index 0000000..766842a Binary files /dev/null and b/assets/Filecfg/14899954601798562137 differ diff --git a/assets/Filecfg/14911437053553658602 b/assets/Filecfg/14911437053553658602 new file mode 100644 index 0000000..3ba71f6 Binary files /dev/null and b/assets/Filecfg/14911437053553658602 differ diff --git a/assets/Filecfg/14911485270597938132 b/assets/Filecfg/14911485270597938132 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/14911485270597938132 differ diff --git a/assets/Filecfg/14912461623142099042 b/assets/Filecfg/14912461623142099042 new file mode 100644 index 0000000..379cbd8 Binary files /dev/null and b/assets/Filecfg/14912461623142099042 differ diff --git a/assets/Filecfg/14926064852284025859 b/assets/Filecfg/14926064852284025859 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/14926064852284025859 differ diff --git a/assets/Filecfg/14971056691342632441 b/assets/Filecfg/14971056691342632441 new file mode 100644 index 0000000..eec1394 Binary files /dev/null and b/assets/Filecfg/14971056691342632441 differ diff --git a/assets/Filecfg/15040478076295584373 b/assets/Filecfg/15040478076295584373 new file mode 100644 index 0000000..e84f802 Binary files /dev/null and b/assets/Filecfg/15040478076295584373 differ diff --git a/assets/Filecfg/15067925551531875125 b/assets/Filecfg/15067925551531875125 new file mode 100644 index 0000000..5db1583 Binary files /dev/null and b/assets/Filecfg/15067925551531875125 differ diff --git a/assets/Filecfg/15121068905018267741 b/assets/Filecfg/15121068905018267741 new file mode 100644 index 0000000..d0785fe Binary files /dev/null and b/assets/Filecfg/15121068905018267741 differ diff --git a/assets/Filecfg/15132616948550538663 b/assets/Filecfg/15132616948550538663 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/15132616948550538663 differ diff --git a/assets/Filecfg/15166482051048453349 b/assets/Filecfg/15166482051048453349 new file mode 100644 index 0000000..0d5c2e6 Binary files /dev/null and b/assets/Filecfg/15166482051048453349 differ diff --git a/assets/Filecfg/15186815016194517077 b/assets/Filecfg/15186815016194517077 new file mode 100644 index 0000000..b6eb8b6 Binary files /dev/null and b/assets/Filecfg/15186815016194517077 differ diff --git a/assets/Filecfg/15211490010423952966 b/assets/Filecfg/15211490010423952966 new file mode 100644 index 0000000..3dc1dd8 Binary files /dev/null and b/assets/Filecfg/15211490010423952966 differ diff --git a/assets/Filecfg/15241906445437139312 b/assets/Filecfg/15241906445437139312 new file mode 100644 index 0000000..b1d6c54 Binary files /dev/null and b/assets/Filecfg/15241906445437139312 differ diff --git a/assets/Filecfg/15251455596929566749 b/assets/Filecfg/15251455596929566749 new file mode 100644 index 0000000..74844c1 Binary files /dev/null and b/assets/Filecfg/15251455596929566749 differ diff --git a/assets/Filecfg/15254597663737104982 b/assets/Filecfg/15254597663737104982 new file mode 100644 index 0000000..fff83eb Binary files /dev/null and b/assets/Filecfg/15254597663737104982 differ diff --git a/assets/Filecfg/15270407298024470328 b/assets/Filecfg/15270407298024470328 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/15270407298024470328 differ diff --git a/assets/Filecfg/15288514970295313087 b/assets/Filecfg/15288514970295313087 new file mode 100644 index 0000000..153f8d8 Binary files /dev/null and b/assets/Filecfg/15288514970295313087 differ diff --git a/assets/Filecfg/15303798081872481882 b/assets/Filecfg/15303798081872481882 new file mode 100644 index 0000000..c84affa Binary files /dev/null and b/assets/Filecfg/15303798081872481882 differ diff --git a/assets/Filecfg/15303972613188608196 b/assets/Filecfg/15303972613188608196 new file mode 100644 index 0000000..ff8c618 Binary files /dev/null and b/assets/Filecfg/15303972613188608196 differ diff --git a/assets/Filecfg/15307737526062011842 b/assets/Filecfg/15307737526062011842 new file mode 100644 index 0000000..d591177 Binary files /dev/null and b/assets/Filecfg/15307737526062011842 differ diff --git a/assets/Filecfg/15312449512287049412 b/assets/Filecfg/15312449512287049412 new file mode 100644 index 0000000..8a05458 Binary files /dev/null and b/assets/Filecfg/15312449512287049412 differ diff --git a/assets/Filecfg/15316876935117494032 b/assets/Filecfg/15316876935117494032 new file mode 100644 index 0000000..43cbb85 Binary files /dev/null and b/assets/Filecfg/15316876935117494032 differ diff --git a/assets/Filecfg/15362923336771866225 b/assets/Filecfg/15362923336771866225 new file mode 100644 index 0000000..f4d812e Binary files /dev/null and b/assets/Filecfg/15362923336771866225 differ diff --git a/assets/Filecfg/1539060663115785898 b/assets/Filecfg/1539060663115785898 new file mode 100644 index 0000000..cd6106e Binary files /dev/null and b/assets/Filecfg/1539060663115785898 differ diff --git a/assets/Filecfg/15400950485201580840 b/assets/Filecfg/15400950485201580840 new file mode 100644 index 0000000..9e504ea Binary files /dev/null and b/assets/Filecfg/15400950485201580840 differ diff --git a/assets/Filecfg/15409805925485251008 b/assets/Filecfg/15409805925485251008 new file mode 100644 index 0000000..e36cc48 Binary files /dev/null and b/assets/Filecfg/15409805925485251008 differ diff --git a/assets/Filecfg/15410003658996142807 b/assets/Filecfg/15410003658996142807 new file mode 100644 index 0000000..1041949 Binary files /dev/null and b/assets/Filecfg/15410003658996142807 differ diff --git a/assets/Filecfg/15441986858596373221 b/assets/Filecfg/15441986858596373221 new file mode 100644 index 0000000..baf9086 Binary files /dev/null and b/assets/Filecfg/15441986858596373221 differ diff --git a/assets/Filecfg/15470938365241671230 b/assets/Filecfg/15470938365241671230 new file mode 100644 index 0000000..6874507 Binary files /dev/null and b/assets/Filecfg/15470938365241671230 differ diff --git a/assets/Filecfg/15489395169122449635 b/assets/Filecfg/15489395169122449635 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/15489395169122449635 differ diff --git a/assets/Filecfg/15501002987359032337 b/assets/Filecfg/15501002987359032337 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/15501002987359032337 differ diff --git a/assets/Filecfg/15506941526779051881 b/assets/Filecfg/15506941526779051881 new file mode 100644 index 0000000..724b7c1 Binary files /dev/null and b/assets/Filecfg/15506941526779051881 differ diff --git a/assets/Filecfg/15524320808900866740 b/assets/Filecfg/15524320808900866740 new file mode 100644 index 0000000..b49e076 Binary files /dev/null and b/assets/Filecfg/15524320808900866740 differ diff --git a/assets/Filecfg/15545822074222067185 b/assets/Filecfg/15545822074222067185 new file mode 100644 index 0000000..b1f249f Binary files /dev/null and b/assets/Filecfg/15545822074222067185 differ diff --git a/assets/Filecfg/15549373402073803458 b/assets/Filecfg/15549373402073803458 new file mode 100644 index 0000000..b142209 Binary files /dev/null and b/assets/Filecfg/15549373402073803458 differ diff --git a/assets/Filecfg/15594062289943813663 b/assets/Filecfg/15594062289943813663 new file mode 100644 index 0000000..f8594be Binary files /dev/null and b/assets/Filecfg/15594062289943813663 differ diff --git a/assets/Filecfg/15622760484849350859 b/assets/Filecfg/15622760484849350859 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/15622760484849350859 differ diff --git a/assets/Filecfg/15632408244537827961 b/assets/Filecfg/15632408244537827961 new file mode 100644 index 0000000..25697cc Binary files /dev/null and b/assets/Filecfg/15632408244537827961 differ diff --git a/assets/Filecfg/15646209716291730401 b/assets/Filecfg/15646209716291730401 new file mode 100644 index 0000000..3878d2e Binary files /dev/null and b/assets/Filecfg/15646209716291730401 differ diff --git a/assets/Filecfg/15658830744480494538 b/assets/Filecfg/15658830744480494538 new file mode 100644 index 0000000..b3508af Binary files /dev/null and b/assets/Filecfg/15658830744480494538 differ diff --git a/assets/Filecfg/15695511824803571290 b/assets/Filecfg/15695511824803571290 new file mode 100644 index 0000000..dfd150f Binary files /dev/null and b/assets/Filecfg/15695511824803571290 differ diff --git a/assets/Filecfg/1570689389637577787 b/assets/Filecfg/1570689389637577787 new file mode 100644 index 0000000..5853bc6 Binary files /dev/null and b/assets/Filecfg/1570689389637577787 differ diff --git a/assets/Filecfg/1571718597024046675 b/assets/Filecfg/1571718597024046675 new file mode 100644 index 0000000..8b743d8 Binary files /dev/null and b/assets/Filecfg/1571718597024046675 differ diff --git a/assets/Filecfg/15729195528559823925 b/assets/Filecfg/15729195528559823925 new file mode 100644 index 0000000..404c32c Binary files /dev/null and b/assets/Filecfg/15729195528559823925 differ diff --git a/assets/Filecfg/15773904141049734075 b/assets/Filecfg/15773904141049734075 new file mode 100644 index 0000000..061d551 Binary files /dev/null and b/assets/Filecfg/15773904141049734075 differ diff --git a/assets/Filecfg/1578293031176218193 b/assets/Filecfg/1578293031176218193 new file mode 100644 index 0000000..193eaf4 Binary files /dev/null and b/assets/Filecfg/1578293031176218193 differ diff --git a/assets/Filecfg/1578774368618242581 b/assets/Filecfg/1578774368618242581 new file mode 100644 index 0000000..989981e Binary files /dev/null and b/assets/Filecfg/1578774368618242581 differ diff --git a/assets/Filecfg/15804915007442755305 b/assets/Filecfg/15804915007442755305 new file mode 100644 index 0000000..cb33131 Binary files /dev/null and b/assets/Filecfg/15804915007442755305 differ diff --git a/assets/Filecfg/15806565573090948950 b/assets/Filecfg/15806565573090948950 new file mode 100644 index 0000000..8b97e8d Binary files /dev/null and b/assets/Filecfg/15806565573090948950 differ diff --git a/assets/Filecfg/15807777027181158216 b/assets/Filecfg/15807777027181158216 new file mode 100644 index 0000000..59ae88c Binary files /dev/null and b/assets/Filecfg/15807777027181158216 differ diff --git a/assets/Filecfg/15834143471307611160 b/assets/Filecfg/15834143471307611160 new file mode 100644 index 0000000..2a14c1c Binary files /dev/null and b/assets/Filecfg/15834143471307611160 differ diff --git a/assets/Filecfg/15844052642833219510 b/assets/Filecfg/15844052642833219510 new file mode 100644 index 0000000..f6c07e2 Binary files /dev/null and b/assets/Filecfg/15844052642833219510 differ diff --git a/assets/Filecfg/15870018414592873962 b/assets/Filecfg/15870018414592873962 new file mode 100644 index 0000000..a6751e8 Binary files /dev/null and b/assets/Filecfg/15870018414592873962 differ diff --git a/assets/Filecfg/15875933411266514291 b/assets/Filecfg/15875933411266514291 new file mode 100644 index 0000000..bf16f38 Binary files /dev/null and b/assets/Filecfg/15875933411266514291 differ diff --git a/assets/Filecfg/15890027231320375119 b/assets/Filecfg/15890027231320375119 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/15890027231320375119 differ diff --git a/assets/Filecfg/15904043964571740588 b/assets/Filecfg/15904043964571740588 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/15904043964571740588 differ diff --git a/assets/Filecfg/15904063259096645254 b/assets/Filecfg/15904063259096645254 new file mode 100644 index 0000000..cb36eed Binary files /dev/null and b/assets/Filecfg/15904063259096645254 differ diff --git a/assets/Filecfg/15906352837225957047 b/assets/Filecfg/15906352837225957047 new file mode 100644 index 0000000..3e22cb4 Binary files /dev/null and b/assets/Filecfg/15906352837225957047 differ diff --git a/assets/Filecfg/15907551784920260925 b/assets/Filecfg/15907551784920260925 new file mode 100644 index 0000000..4b3ebe4 Binary files /dev/null and b/assets/Filecfg/15907551784920260925 differ diff --git a/assets/Filecfg/15933303335118997678 b/assets/Filecfg/15933303335118997678 new file mode 100644 index 0000000..350cfe8 Binary files /dev/null and b/assets/Filecfg/15933303335118997678 differ diff --git a/assets/Filecfg/15946347731032959133 b/assets/Filecfg/15946347731032959133 new file mode 100644 index 0000000..d7386a4 Binary files /dev/null and b/assets/Filecfg/15946347731032959133 differ diff --git a/assets/Filecfg/15957030647356160211 b/assets/Filecfg/15957030647356160211 new file mode 100644 index 0000000..c481faa Binary files /dev/null and b/assets/Filecfg/15957030647356160211 differ diff --git a/assets/Filecfg/15969860011322236633 b/assets/Filecfg/15969860011322236633 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/15969860011322236633 differ diff --git a/assets/Filecfg/15983442122238197258 b/assets/Filecfg/15983442122238197258 new file mode 100644 index 0000000..d77081f Binary files /dev/null and b/assets/Filecfg/15983442122238197258 differ diff --git a/assets/Filecfg/15988073134565610493 b/assets/Filecfg/15988073134565610493 new file mode 100644 index 0000000..d140b22 Binary files /dev/null and b/assets/Filecfg/15988073134565610493 differ diff --git a/assets/Filecfg/15988586703153746326 b/assets/Filecfg/15988586703153746326 new file mode 100644 index 0000000..8337894 Binary files /dev/null and b/assets/Filecfg/15988586703153746326 differ diff --git a/assets/Filecfg/16007037990746056138 b/assets/Filecfg/16007037990746056138 new file mode 100644 index 0000000..07acb42 Binary files /dev/null and b/assets/Filecfg/16007037990746056138 differ diff --git a/assets/Filecfg/16014650853850080608 b/assets/Filecfg/16014650853850080608 new file mode 100644 index 0000000..f50c57e Binary files /dev/null and b/assets/Filecfg/16014650853850080608 differ diff --git a/assets/Filecfg/1603271705711825474 b/assets/Filecfg/1603271705711825474 new file mode 100644 index 0000000..22a345f Binary files /dev/null and b/assets/Filecfg/1603271705711825474 differ diff --git a/assets/Filecfg/16055159074348500195 b/assets/Filecfg/16055159074348500195 new file mode 100644 index 0000000..46b9cfb Binary files /dev/null and b/assets/Filecfg/16055159074348500195 differ diff --git a/assets/Filecfg/16064002114816030890 b/assets/Filecfg/16064002114816030890 new file mode 100644 index 0000000..8e86b4f Binary files /dev/null and b/assets/Filecfg/16064002114816030890 differ diff --git a/assets/Filecfg/16074799027887229044 b/assets/Filecfg/16074799027887229044 new file mode 100644 index 0000000..dca535d Binary files /dev/null and b/assets/Filecfg/16074799027887229044 differ diff --git a/assets/Filecfg/16112621655467849386 b/assets/Filecfg/16112621655467849386 new file mode 100644 index 0000000..6da2a19 Binary files /dev/null and b/assets/Filecfg/16112621655467849386 differ diff --git a/assets/Filecfg/16130487891656506093 b/assets/Filecfg/16130487891656506093 new file mode 100644 index 0000000..1aa5fdc Binary files /dev/null and b/assets/Filecfg/16130487891656506093 differ diff --git a/assets/Filecfg/16139845889764901953 b/assets/Filecfg/16139845889764901953 new file mode 100644 index 0000000..7c81d76 Binary files /dev/null and b/assets/Filecfg/16139845889764901953 differ diff --git a/assets/Filecfg/16179374026644280624 b/assets/Filecfg/16179374026644280624 new file mode 100644 index 0000000..522b9a5 Binary files /dev/null and b/assets/Filecfg/16179374026644280624 differ diff --git a/assets/Filecfg/16179628215770403003 b/assets/Filecfg/16179628215770403003 new file mode 100644 index 0000000..2f899ba Binary files /dev/null and b/assets/Filecfg/16179628215770403003 differ diff --git a/assets/Filecfg/16192258845077282619 b/assets/Filecfg/16192258845077282619 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/16192258845077282619 differ diff --git a/assets/Filecfg/16197993451130822804 b/assets/Filecfg/16197993451130822804 new file mode 100644 index 0000000..ea8590a Binary files /dev/null and b/assets/Filecfg/16197993451130822804 differ diff --git a/assets/Filecfg/16238630940224398087 b/assets/Filecfg/16238630940224398087 new file mode 100644 index 0000000..a0fb014 Binary files /dev/null and b/assets/Filecfg/16238630940224398087 differ diff --git a/assets/Filecfg/16240031809611026230 b/assets/Filecfg/16240031809611026230 new file mode 100644 index 0000000..f96f07d Binary files /dev/null and b/assets/Filecfg/16240031809611026230 differ diff --git a/assets/Filecfg/16290760817118507148 b/assets/Filecfg/16290760817118507148 new file mode 100644 index 0000000..7998ff5 Binary files /dev/null and b/assets/Filecfg/16290760817118507148 differ diff --git a/assets/Filecfg/16324056421217771084 b/assets/Filecfg/16324056421217771084 new file mode 100644 index 0000000..381123d Binary files /dev/null and b/assets/Filecfg/16324056421217771084 differ diff --git a/assets/Filecfg/16324982617011196051 b/assets/Filecfg/16324982617011196051 new file mode 100644 index 0000000..d73fe90 Binary files /dev/null and b/assets/Filecfg/16324982617011196051 differ diff --git a/assets/Filecfg/16333234778873907410 b/assets/Filecfg/16333234778873907410 new file mode 100644 index 0000000..72b1ef1 Binary files /dev/null and b/assets/Filecfg/16333234778873907410 differ diff --git a/assets/Filecfg/16378965274825575811 b/assets/Filecfg/16378965274825575811 new file mode 100644 index 0000000..5c725cb Binary files /dev/null and b/assets/Filecfg/16378965274825575811 differ diff --git a/assets/Filecfg/16393251806309524050 b/assets/Filecfg/16393251806309524050 new file mode 100644 index 0000000..42e95ad Binary files /dev/null and b/assets/Filecfg/16393251806309524050 differ diff --git a/assets/Filecfg/16413562552844629742 b/assets/Filecfg/16413562552844629742 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/16413562552844629742 differ diff --git a/assets/Filecfg/16444703681335810183 b/assets/Filecfg/16444703681335810183 new file mode 100644 index 0000000..375213e Binary files /dev/null and b/assets/Filecfg/16444703681335810183 differ diff --git a/assets/Filecfg/16459344374846575695 b/assets/Filecfg/16459344374846575695 new file mode 100644 index 0000000..7ed5058 Binary files /dev/null and b/assets/Filecfg/16459344374846575695 differ diff --git a/assets/Filecfg/16482985620622694664 b/assets/Filecfg/16482985620622694664 new file mode 100644 index 0000000..6b10297 Binary files /dev/null and b/assets/Filecfg/16482985620622694664 differ diff --git a/assets/Filecfg/16494740275528318664 b/assets/Filecfg/16494740275528318664 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/16494740275528318664 differ diff --git a/assets/Filecfg/16503679850988577810 b/assets/Filecfg/16503679850988577810 new file mode 100644 index 0000000..2e80935 Binary files /dev/null and b/assets/Filecfg/16503679850988577810 differ diff --git a/assets/Filecfg/16516820372135311247 b/assets/Filecfg/16516820372135311247 new file mode 100644 index 0000000..fcbdd65 Binary files /dev/null and b/assets/Filecfg/16516820372135311247 differ diff --git a/assets/Filecfg/16544920091706739954 b/assets/Filecfg/16544920091706739954 new file mode 100644 index 0000000..69d18cb Binary files /dev/null and b/assets/Filecfg/16544920091706739954 differ diff --git a/assets/Filecfg/16546810405760084501 b/assets/Filecfg/16546810405760084501 new file mode 100644 index 0000000..5462542 Binary files /dev/null and b/assets/Filecfg/16546810405760084501 differ diff --git a/assets/Filecfg/16571711469822288902 b/assets/Filecfg/16571711469822288902 new file mode 100644 index 0000000..87f7af5 Binary files /dev/null and b/assets/Filecfg/16571711469822288902 differ diff --git a/assets/Filecfg/16578500980582480688 b/assets/Filecfg/16578500980582480688 new file mode 100644 index 0000000..ee7b9a4 Binary files /dev/null and b/assets/Filecfg/16578500980582480688 differ diff --git a/assets/Filecfg/1658183049320602714 b/assets/Filecfg/1658183049320602714 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/1658183049320602714 differ diff --git a/assets/Filecfg/16584046450728409586 b/assets/Filecfg/16584046450728409586 new file mode 100644 index 0000000..23c9be8 Binary files /dev/null and b/assets/Filecfg/16584046450728409586 differ diff --git a/assets/Filecfg/16605748273141312846 b/assets/Filecfg/16605748273141312846 new file mode 100644 index 0000000..45fd2b7 Binary files /dev/null and b/assets/Filecfg/16605748273141312846 differ diff --git a/assets/Filecfg/16625794866364433338 b/assets/Filecfg/16625794866364433338 new file mode 100644 index 0000000..8069321 Binary files /dev/null and b/assets/Filecfg/16625794866364433338 differ diff --git a/assets/Filecfg/16635717357696998008 b/assets/Filecfg/16635717357696998008 new file mode 100644 index 0000000..2c206e0 Binary files /dev/null and b/assets/Filecfg/16635717357696998008 differ diff --git a/assets/Filecfg/16651737039497501267 b/assets/Filecfg/16651737039497501267 new file mode 100644 index 0000000..ec37acb Binary files /dev/null and b/assets/Filecfg/16651737039497501267 differ diff --git a/assets/Filecfg/16662061295853661761 b/assets/Filecfg/16662061295853661761 new file mode 100644 index 0000000..4d92137 Binary files /dev/null and b/assets/Filecfg/16662061295853661761 differ diff --git a/assets/Filecfg/16673840777493866690 b/assets/Filecfg/16673840777493866690 new file mode 100644 index 0000000..10277da Binary files /dev/null and b/assets/Filecfg/16673840777493866690 differ diff --git a/assets/Filecfg/16681370351558380036 b/assets/Filecfg/16681370351558380036 new file mode 100644 index 0000000..0593cbd Binary files /dev/null and b/assets/Filecfg/16681370351558380036 differ diff --git a/assets/Filecfg/16691932500999702814 b/assets/Filecfg/16691932500999702814 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/16691932500999702814 differ diff --git a/assets/Filecfg/16738078874530206992 b/assets/Filecfg/16738078874530206992 new file mode 100644 index 0000000..538f2e9 Binary files /dev/null and b/assets/Filecfg/16738078874530206992 differ diff --git a/assets/Filecfg/16760849719621245134 b/assets/Filecfg/16760849719621245134 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/16760849719621245134 differ diff --git a/assets/Filecfg/16763685147320816316 b/assets/Filecfg/16763685147320816316 new file mode 100644 index 0000000..772106a Binary files /dev/null and b/assets/Filecfg/16763685147320816316 differ diff --git a/assets/Filecfg/16793299012860506339 b/assets/Filecfg/16793299012860506339 new file mode 100644 index 0000000..58cce05 Binary files /dev/null and b/assets/Filecfg/16793299012860506339 differ diff --git a/assets/Filecfg/16798233019149286916 b/assets/Filecfg/16798233019149286916 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/16798233019149286916 differ diff --git a/assets/Filecfg/16833696817019307911 b/assets/Filecfg/16833696817019307911 new file mode 100644 index 0000000..bd762d0 Binary files /dev/null and b/assets/Filecfg/16833696817019307911 differ diff --git a/assets/Filecfg/16853304864289304300 b/assets/Filecfg/16853304864289304300 new file mode 100644 index 0000000..9e5f8ff Binary files /dev/null and b/assets/Filecfg/16853304864289304300 differ diff --git a/assets/Filecfg/16856651538334138774 b/assets/Filecfg/16856651538334138774 new file mode 100644 index 0000000..e7aba99 Binary files /dev/null and b/assets/Filecfg/16856651538334138774 differ diff --git a/assets/Filecfg/16861007395451367659 b/assets/Filecfg/16861007395451367659 new file mode 100644 index 0000000..a85f30a Binary files /dev/null and b/assets/Filecfg/16861007395451367659 differ diff --git a/assets/Filecfg/16863238104441968946 b/assets/Filecfg/16863238104441968946 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/16863238104441968946 differ diff --git a/assets/Filecfg/16867577331151273051 b/assets/Filecfg/16867577331151273051 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/16867577331151273051 differ diff --git a/assets/Filecfg/16869154005911558933 b/assets/Filecfg/16869154005911558933 new file mode 100644 index 0000000..5c145a7 Binary files /dev/null and b/assets/Filecfg/16869154005911558933 differ diff --git a/assets/Filecfg/16876476203681338986 b/assets/Filecfg/16876476203681338986 new file mode 100644 index 0000000..0557654 Binary files /dev/null and b/assets/Filecfg/16876476203681338986 differ diff --git a/assets/Filecfg/16886634100595396916 b/assets/Filecfg/16886634100595396916 new file mode 100644 index 0000000..554b396 Binary files /dev/null and b/assets/Filecfg/16886634100595396916 differ diff --git a/assets/Filecfg/16905993943924436622 b/assets/Filecfg/16905993943924436622 new file mode 100644 index 0000000..2810679 Binary files /dev/null and b/assets/Filecfg/16905993943924436622 differ diff --git a/assets/Filecfg/16909573490162449484 b/assets/Filecfg/16909573490162449484 new file mode 100644 index 0000000..094d271 Binary files /dev/null and b/assets/Filecfg/16909573490162449484 differ diff --git a/assets/Filecfg/16926580968750817179 b/assets/Filecfg/16926580968750817179 new file mode 100644 index 0000000..f7fdf11 Binary files /dev/null and b/assets/Filecfg/16926580968750817179 differ diff --git a/assets/Filecfg/16946095821918921996 b/assets/Filecfg/16946095821918921996 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/16946095821918921996 differ diff --git a/assets/Filecfg/16969131164116866721 b/assets/Filecfg/16969131164116866721 new file mode 100644 index 0000000..b542bd0 Binary files /dev/null and b/assets/Filecfg/16969131164116866721 differ diff --git a/assets/Filecfg/16971704391008544017 b/assets/Filecfg/16971704391008544017 new file mode 100644 index 0000000..75f2275 Binary files /dev/null and b/assets/Filecfg/16971704391008544017 differ diff --git a/assets/Filecfg/16976853454769725135 b/assets/Filecfg/16976853454769725135 new file mode 100644 index 0000000..f4760e1 Binary files /dev/null and b/assets/Filecfg/16976853454769725135 differ diff --git a/assets/Filecfg/16978915387688306484 b/assets/Filecfg/16978915387688306484 new file mode 100644 index 0000000..1ac1881 Binary files /dev/null and b/assets/Filecfg/16978915387688306484 differ diff --git a/assets/Filecfg/16995593627330168593 b/assets/Filecfg/16995593627330168593 new file mode 100644 index 0000000..f0fb167 Binary files /dev/null and b/assets/Filecfg/16995593627330168593 differ diff --git a/assets/Filecfg/16998780403666074439 b/assets/Filecfg/16998780403666074439 new file mode 100644 index 0000000..78cc3d1 Binary files /dev/null and b/assets/Filecfg/16998780403666074439 differ diff --git a/assets/Filecfg/17012571334041316281 b/assets/Filecfg/17012571334041316281 new file mode 100644 index 0000000..252b298 Binary files /dev/null and b/assets/Filecfg/17012571334041316281 differ diff --git a/assets/Filecfg/17026320857182211317 b/assets/Filecfg/17026320857182211317 new file mode 100644 index 0000000..f28b5b7 Binary files /dev/null and b/assets/Filecfg/17026320857182211317 differ diff --git a/assets/Filecfg/1704174975439697013 b/assets/Filecfg/1704174975439697013 new file mode 100644 index 0000000..4804a3c Binary files /dev/null and b/assets/Filecfg/1704174975439697013 differ diff --git a/assets/Filecfg/17093957310185311491 b/assets/Filecfg/17093957310185311491 new file mode 100644 index 0000000..bf8aa8f Binary files /dev/null and b/assets/Filecfg/17093957310185311491 differ diff --git a/assets/Filecfg/17100545376450777353 b/assets/Filecfg/17100545376450777353 new file mode 100644 index 0000000..93a365f Binary files /dev/null and b/assets/Filecfg/17100545376450777353 differ diff --git a/assets/Filecfg/17126260729234062960 b/assets/Filecfg/17126260729234062960 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/17126260729234062960 differ diff --git a/assets/Filecfg/1715392502967218061 b/assets/Filecfg/1715392502967218061 new file mode 100644 index 0000000..fdb0152 Binary files /dev/null and b/assets/Filecfg/1715392502967218061 differ diff --git a/assets/Filecfg/17246246054768518525 b/assets/Filecfg/17246246054768518525 new file mode 100644 index 0000000..e36a626 Binary files /dev/null and b/assets/Filecfg/17246246054768518525 differ diff --git a/assets/Filecfg/17251681821253269957 b/assets/Filecfg/17251681821253269957 new file mode 100644 index 0000000..5f6b12e Binary files /dev/null and b/assets/Filecfg/17251681821253269957 differ diff --git a/assets/Filecfg/17267277100264609801 b/assets/Filecfg/17267277100264609801 new file mode 100644 index 0000000..d1e2213 Binary files /dev/null and b/assets/Filecfg/17267277100264609801 differ diff --git a/assets/Filecfg/17349120341340974472 b/assets/Filecfg/17349120341340974472 new file mode 100644 index 0000000..df2e9f3 Binary files /dev/null and b/assets/Filecfg/17349120341340974472 differ diff --git a/assets/Filecfg/17352420597349404629 b/assets/Filecfg/17352420597349404629 new file mode 100644 index 0000000..fa042ec Binary files /dev/null and b/assets/Filecfg/17352420597349404629 differ diff --git a/assets/Filecfg/1737674809135062440 b/assets/Filecfg/1737674809135062440 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/1737674809135062440 differ diff --git a/assets/Filecfg/17384437476860684548 b/assets/Filecfg/17384437476860684548 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/17384437476860684548 differ diff --git a/assets/Filecfg/17446168365715090825 b/assets/Filecfg/17446168365715090825 new file mode 100644 index 0000000..da97379 Binary files /dev/null and b/assets/Filecfg/17446168365715090825 differ diff --git a/assets/Filecfg/17494673306553180103 b/assets/Filecfg/17494673306553180103 new file mode 100644 index 0000000..15eeed1 Binary files /dev/null and b/assets/Filecfg/17494673306553180103 differ diff --git a/assets/Filecfg/17507966498268344733 b/assets/Filecfg/17507966498268344733 new file mode 100644 index 0000000..4e63b91 Binary files /dev/null and b/assets/Filecfg/17507966498268344733 differ diff --git a/assets/Filecfg/17526275210350473840 b/assets/Filecfg/17526275210350473840 new file mode 100644 index 0000000..6c728cc Binary files /dev/null and b/assets/Filecfg/17526275210350473840 differ diff --git a/assets/Filecfg/17539925924761152046 b/assets/Filecfg/17539925924761152046 new file mode 100644 index 0000000..c7d55c4 Binary files /dev/null and b/assets/Filecfg/17539925924761152046 differ diff --git a/assets/Filecfg/1755450209154972901 b/assets/Filecfg/1755450209154972901 new file mode 100644 index 0000000..bdecade Binary files /dev/null and b/assets/Filecfg/1755450209154972901 differ diff --git a/assets/Filecfg/1755658498868996357 b/assets/Filecfg/1755658498868996357 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/1755658498868996357 differ diff --git a/assets/Filecfg/17576556801589514533 b/assets/Filecfg/17576556801589514533 new file mode 100644 index 0000000..81396f4 Binary files /dev/null and b/assets/Filecfg/17576556801589514533 differ diff --git a/assets/Filecfg/17592604955757308611 b/assets/Filecfg/17592604955757308611 new file mode 100644 index 0000000..19fcf84 Binary files /dev/null and b/assets/Filecfg/17592604955757308611 differ diff --git a/assets/Filecfg/17597212029148278466 b/assets/Filecfg/17597212029148278466 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/17597212029148278466 differ diff --git a/assets/Filecfg/17676787827363938789 b/assets/Filecfg/17676787827363938789 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/17676787827363938789 differ diff --git a/assets/Filecfg/17703030915287211674 b/assets/Filecfg/17703030915287211674 new file mode 100644 index 0000000..f3b7af4 Binary files /dev/null and b/assets/Filecfg/17703030915287211674 differ diff --git a/assets/Filecfg/17758662200547618821 b/assets/Filecfg/17758662200547618821 new file mode 100644 index 0000000..9a6ac2d Binary files /dev/null and b/assets/Filecfg/17758662200547618821 differ diff --git a/assets/Filecfg/17772162429084340568 b/assets/Filecfg/17772162429084340568 new file mode 100644 index 0000000..46f1d9d Binary files /dev/null and b/assets/Filecfg/17772162429084340568 differ diff --git a/assets/Filecfg/17806229805802578838 b/assets/Filecfg/17806229805802578838 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/17806229805802578838 differ diff --git a/assets/Filecfg/17859011509485623081 b/assets/Filecfg/17859011509485623081 new file mode 100644 index 0000000..6a418b0 Binary files /dev/null and b/assets/Filecfg/17859011509485623081 differ diff --git a/assets/Filecfg/17860180586880556932 b/assets/Filecfg/17860180586880556932 new file mode 100644 index 0000000..08fbe35 Binary files /dev/null and b/assets/Filecfg/17860180586880556932 differ diff --git a/assets/Filecfg/17877146966003461477 b/assets/Filecfg/17877146966003461477 new file mode 100644 index 0000000..ed43f18 Binary files /dev/null and b/assets/Filecfg/17877146966003461477 differ diff --git a/assets/Filecfg/17886175188499572367 b/assets/Filecfg/17886175188499572367 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/17886175188499572367 differ diff --git a/assets/Filecfg/17893180218715366414 b/assets/Filecfg/17893180218715366414 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/17893180218715366414 differ diff --git a/assets/Filecfg/1797544968731348212 b/assets/Filecfg/1797544968731348212 new file mode 100644 index 0000000..4f6f3d8 Binary files /dev/null and b/assets/Filecfg/1797544968731348212 differ diff --git a/assets/Filecfg/17984109216017165078 b/assets/Filecfg/17984109216017165078 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/17984109216017165078 differ diff --git a/assets/Filecfg/17996975142993546921 b/assets/Filecfg/17996975142993546921 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/17996975142993546921 differ diff --git a/assets/Filecfg/18014826953876114038 b/assets/Filecfg/18014826953876114038 new file mode 100644 index 0000000..2053a94 Binary files /dev/null and b/assets/Filecfg/18014826953876114038 differ diff --git a/assets/Filecfg/18103682095756680770 b/assets/Filecfg/18103682095756680770 new file mode 100644 index 0000000..11ce422 Binary files /dev/null and b/assets/Filecfg/18103682095756680770 differ diff --git a/assets/Filecfg/18112304099597269174 b/assets/Filecfg/18112304099597269174 new file mode 100644 index 0000000..ed64eb4 Binary files /dev/null and b/assets/Filecfg/18112304099597269174 differ diff --git a/assets/Filecfg/18118188609662778074 b/assets/Filecfg/18118188609662778074 new file mode 100644 index 0000000..e1098c9 Binary files /dev/null and b/assets/Filecfg/18118188609662778074 differ diff --git a/assets/Filecfg/18119836748290980609 b/assets/Filecfg/18119836748290980609 new file mode 100644 index 0000000..3b1cf4e Binary files /dev/null and b/assets/Filecfg/18119836748290980609 differ diff --git a/assets/Filecfg/18123355951154042595 b/assets/Filecfg/18123355951154042595 new file mode 100644 index 0000000..9727280 Binary files /dev/null and b/assets/Filecfg/18123355951154042595 differ diff --git a/assets/Filecfg/18136853944384635191 b/assets/Filecfg/18136853944384635191 new file mode 100644 index 0000000..d6d49b3 Binary files /dev/null and b/assets/Filecfg/18136853944384635191 differ diff --git a/assets/Filecfg/18138453723717130199 b/assets/Filecfg/18138453723717130199 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/18138453723717130199 differ diff --git a/assets/Filecfg/18162908962843319184 b/assets/Filecfg/18162908962843319184 new file mode 100644 index 0000000..7786431 Binary files /dev/null and b/assets/Filecfg/18162908962843319184 differ diff --git a/assets/Filecfg/18165515282597522149 b/assets/Filecfg/18165515282597522149 new file mode 100644 index 0000000..8788858 Binary files /dev/null and b/assets/Filecfg/18165515282597522149 differ diff --git a/assets/Filecfg/18180353749747269373 b/assets/Filecfg/18180353749747269373 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/18180353749747269373 differ diff --git a/assets/Filecfg/18221028465068541580 b/assets/Filecfg/18221028465068541580 new file mode 100644 index 0000000..ef633a1 Binary files /dev/null and b/assets/Filecfg/18221028465068541580 differ diff --git a/assets/Filecfg/18234532823109020000 b/assets/Filecfg/18234532823109020000 new file mode 100644 index 0000000..6df657b Binary files /dev/null and b/assets/Filecfg/18234532823109020000 differ diff --git a/assets/Filecfg/18252091989078892077 b/assets/Filecfg/18252091989078892077 new file mode 100644 index 0000000..1b08c6b Binary files /dev/null and b/assets/Filecfg/18252091989078892077 differ diff --git a/assets/Filecfg/18278567530613138612 b/assets/Filecfg/18278567530613138612 new file mode 100644 index 0000000..9d649e0 Binary files /dev/null and b/assets/Filecfg/18278567530613138612 differ diff --git a/assets/Filecfg/18287614963970305832 b/assets/Filecfg/18287614963970305832 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/18287614963970305832 differ diff --git a/assets/Filecfg/18300365285310890529 b/assets/Filecfg/18300365285310890529 new file mode 100644 index 0000000..20308a1 Binary files /dev/null and b/assets/Filecfg/18300365285310890529 differ diff --git a/assets/Filecfg/18312275575128140047 b/assets/Filecfg/18312275575128140047 new file mode 100644 index 0000000..e62437f Binary files /dev/null and b/assets/Filecfg/18312275575128140047 differ diff --git a/assets/Filecfg/183137264260827830 b/assets/Filecfg/183137264260827830 new file mode 100644 index 0000000..e323ac1 Binary files /dev/null and b/assets/Filecfg/183137264260827830 differ diff --git a/assets/Filecfg/1832320409577516955 b/assets/Filecfg/1832320409577516955 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/1832320409577516955 differ diff --git a/assets/Filecfg/18323258119688840913 b/assets/Filecfg/18323258119688840913 new file mode 100644 index 0000000..e06bfeb Binary files /dev/null and b/assets/Filecfg/18323258119688840913 differ diff --git a/assets/Filecfg/1833407448126432146 b/assets/Filecfg/1833407448126432146 new file mode 100644 index 0000000..4973bc4 Binary files /dev/null and b/assets/Filecfg/1833407448126432146 differ diff --git a/assets/Filecfg/18337748807159300140 b/assets/Filecfg/18337748807159300140 new file mode 100644 index 0000000..6161a86 Binary files /dev/null and b/assets/Filecfg/18337748807159300140 differ diff --git a/assets/Filecfg/18345214241551806419 b/assets/Filecfg/18345214241551806419 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/18345214241551806419 differ diff --git a/assets/Filecfg/18348757873061332915 b/assets/Filecfg/18348757873061332915 new file mode 100644 index 0000000..b8293fb Binary files /dev/null and b/assets/Filecfg/18348757873061332915 differ diff --git a/assets/Filecfg/18429855385479262239 b/assets/Filecfg/18429855385479262239 new file mode 100644 index 0000000..c06f954 Binary files /dev/null and b/assets/Filecfg/18429855385479262239 differ diff --git a/assets/Filecfg/18437241970588357438 b/assets/Filecfg/18437241970588357438 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/18437241970588357438 differ diff --git a/assets/Filecfg/1863492454016592181 b/assets/Filecfg/1863492454016592181 new file mode 100644 index 0000000..63f001e Binary files /dev/null and b/assets/Filecfg/1863492454016592181 differ diff --git a/assets/Filecfg/1864163116568496519 b/assets/Filecfg/1864163116568496519 new file mode 100644 index 0000000..b4169a4 Binary files /dev/null and b/assets/Filecfg/1864163116568496519 differ diff --git a/assets/Filecfg/1869559326717889116 b/assets/Filecfg/1869559326717889116 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/1869559326717889116 differ diff --git a/assets/Filecfg/1869900174837741380 b/assets/Filecfg/1869900174837741380 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/1869900174837741380 differ diff --git a/assets/Filecfg/1886161128444375830 b/assets/Filecfg/1886161128444375830 new file mode 100644 index 0000000..8ec1ae9 Binary files /dev/null and b/assets/Filecfg/1886161128444375830 differ diff --git a/assets/Filecfg/190217661418671921 b/assets/Filecfg/190217661418671921 new file mode 100644 index 0000000..dc67b84 Binary files /dev/null and b/assets/Filecfg/190217661418671921 differ diff --git a/assets/Filecfg/1930695055998351757 b/assets/Filecfg/1930695055998351757 new file mode 100644 index 0000000..6ba7078 Binary files /dev/null and b/assets/Filecfg/1930695055998351757 differ diff --git a/assets/Filecfg/1933807358013958223 b/assets/Filecfg/1933807358013958223 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/1933807358013958223 differ diff --git a/assets/Filecfg/1935933208303028939 b/assets/Filecfg/1935933208303028939 new file mode 100644 index 0000000..1aac84b Binary files /dev/null and b/assets/Filecfg/1935933208303028939 differ diff --git a/assets/Filecfg/1960440286656315387 b/assets/Filecfg/1960440286656315387 new file mode 100644 index 0000000..9e84982 Binary files /dev/null and b/assets/Filecfg/1960440286656315387 differ diff --git a/assets/Filecfg/1968299341235412081 b/assets/Filecfg/1968299341235412081 new file mode 100644 index 0000000..d7db5f1 Binary files /dev/null and b/assets/Filecfg/1968299341235412081 differ diff --git a/assets/Filecfg/197059875523462462 b/assets/Filecfg/197059875523462462 new file mode 100644 index 0000000..74b5a30 Binary files /dev/null and b/assets/Filecfg/197059875523462462 differ diff --git a/assets/Filecfg/1972567483144540836 b/assets/Filecfg/1972567483144540836 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/1972567483144540836 differ diff --git a/assets/Filecfg/1989572437731387488 b/assets/Filecfg/1989572437731387488 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/1989572437731387488 differ diff --git a/assets/Filecfg/2007066277962638804 b/assets/Filecfg/2007066277962638804 new file mode 100644 index 0000000..00b4612 Binary files /dev/null and b/assets/Filecfg/2007066277962638804 differ diff --git a/assets/Filecfg/2015879438169790806 b/assets/Filecfg/2015879438169790806 new file mode 100644 index 0000000..fa01456 Binary files /dev/null and b/assets/Filecfg/2015879438169790806 differ diff --git a/assets/Filecfg/2024597437236454750 b/assets/Filecfg/2024597437236454750 new file mode 100644 index 0000000..7a67a3f Binary files /dev/null and b/assets/Filecfg/2024597437236454750 differ diff --git a/assets/Filecfg/2045877481836403926 b/assets/Filecfg/2045877481836403926 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/2045877481836403926 differ diff --git a/assets/Filecfg/2053989849882628054 b/assets/Filecfg/2053989849882628054 new file mode 100644 index 0000000..bd41f42 Binary files /dev/null and b/assets/Filecfg/2053989849882628054 differ diff --git a/assets/Filecfg/2058034255503392848 b/assets/Filecfg/2058034255503392848 new file mode 100644 index 0000000..39defe9 Binary files /dev/null and b/assets/Filecfg/2058034255503392848 differ diff --git a/assets/Filecfg/2077369291592631210 b/assets/Filecfg/2077369291592631210 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/2077369291592631210 differ diff --git a/assets/Filecfg/20909665685182681 b/assets/Filecfg/20909665685182681 new file mode 100644 index 0000000..72aef75 Binary files /dev/null and b/assets/Filecfg/20909665685182681 differ diff --git a/assets/Filecfg/2092584270349690273 b/assets/Filecfg/2092584270349690273 new file mode 100644 index 0000000..3afbcf6 Binary files /dev/null and b/assets/Filecfg/2092584270349690273 differ diff --git a/assets/Filecfg/2096455291785127848 b/assets/Filecfg/2096455291785127848 new file mode 100644 index 0000000..98cdf19 Binary files /dev/null and b/assets/Filecfg/2096455291785127848 differ diff --git a/assets/Filecfg/2162688849992516830 b/assets/Filecfg/2162688849992516830 new file mode 100644 index 0000000..4e23df5 Binary files /dev/null and b/assets/Filecfg/2162688849992516830 differ diff --git a/assets/Filecfg/2175908598245937450 b/assets/Filecfg/2175908598245937450 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/2175908598245937450 differ diff --git a/assets/Filecfg/2176175673083458595 b/assets/Filecfg/2176175673083458595 new file mode 100644 index 0000000..111ddb8 Binary files /dev/null and b/assets/Filecfg/2176175673083458595 differ diff --git a/assets/Filecfg/217792621079760936 b/assets/Filecfg/217792621079760936 new file mode 100644 index 0000000..4eff078 Binary files /dev/null and b/assets/Filecfg/217792621079760936 differ diff --git a/assets/Filecfg/2206529640176526753 b/assets/Filecfg/2206529640176526753 new file mode 100644 index 0000000..fb56b29 Binary files /dev/null and b/assets/Filecfg/2206529640176526753 differ diff --git a/assets/Filecfg/2207432098380582691 b/assets/Filecfg/2207432098380582691 new file mode 100644 index 0000000..aec1d56 Binary files /dev/null and b/assets/Filecfg/2207432098380582691 differ diff --git a/assets/Filecfg/2208897950612587092 b/assets/Filecfg/2208897950612587092 new file mode 100644 index 0000000..b2d8190 Binary files /dev/null and b/assets/Filecfg/2208897950612587092 differ diff --git a/assets/Filecfg/2210760586058128939 b/assets/Filecfg/2210760586058128939 new file mode 100644 index 0000000..e858901 Binary files /dev/null and b/assets/Filecfg/2210760586058128939 differ diff --git a/assets/Filecfg/2223590210619930678 b/assets/Filecfg/2223590210619930678 new file mode 100644 index 0000000..bb98ad2 Binary files /dev/null and b/assets/Filecfg/2223590210619930678 differ diff --git a/assets/Filecfg/2238072873407748797 b/assets/Filecfg/2238072873407748797 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/2238072873407748797 differ diff --git a/assets/Filecfg/2268812643507569089 b/assets/Filecfg/2268812643507569089 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/2268812643507569089 differ diff --git a/assets/Filecfg/2299240695239458625 b/assets/Filecfg/2299240695239458625 new file mode 100644 index 0000000..132c474 Binary files /dev/null and b/assets/Filecfg/2299240695239458625 differ diff --git a/assets/Filecfg/2312811490754452247 b/assets/Filecfg/2312811490754452247 new file mode 100644 index 0000000..9eae354 Binary files /dev/null and b/assets/Filecfg/2312811490754452247 differ diff --git a/assets/Filecfg/2346607706094760537 b/assets/Filecfg/2346607706094760537 new file mode 100644 index 0000000..1af816e Binary files /dev/null and b/assets/Filecfg/2346607706094760537 differ diff --git a/assets/Filecfg/2381940660585476292 b/assets/Filecfg/2381940660585476292 new file mode 100644 index 0000000..4f81b28 Binary files /dev/null and b/assets/Filecfg/2381940660585476292 differ diff --git a/assets/Filecfg/2395432736385378810 b/assets/Filecfg/2395432736385378810 new file mode 100644 index 0000000..917f973 Binary files /dev/null and b/assets/Filecfg/2395432736385378810 differ diff --git a/assets/Filecfg/2401600676527436511 b/assets/Filecfg/2401600676527436511 new file mode 100644 index 0000000..48cfdcb Binary files /dev/null and b/assets/Filecfg/2401600676527436511 differ diff --git a/assets/Filecfg/2419495616957123213 b/assets/Filecfg/2419495616957123213 new file mode 100644 index 0000000..432e8d2 Binary files /dev/null and b/assets/Filecfg/2419495616957123213 differ diff --git a/assets/Filecfg/2480704004922028301 b/assets/Filecfg/2480704004922028301 new file mode 100644 index 0000000..02450e7 Binary files /dev/null and b/assets/Filecfg/2480704004922028301 differ diff --git a/assets/Filecfg/248155404909201059 b/assets/Filecfg/248155404909201059 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/248155404909201059 differ diff --git a/assets/Filecfg/2487326323249462112 b/assets/Filecfg/2487326323249462112 new file mode 100644 index 0000000..82867cd Binary files /dev/null and b/assets/Filecfg/2487326323249462112 differ diff --git a/assets/Filecfg/250629919739255792 b/assets/Filecfg/250629919739255792 new file mode 100644 index 0000000..897657b Binary files /dev/null and b/assets/Filecfg/250629919739255792 differ diff --git a/assets/Filecfg/2519094753860620369 b/assets/Filecfg/2519094753860620369 new file mode 100644 index 0000000..8dae40e Binary files /dev/null and b/assets/Filecfg/2519094753860620369 differ diff --git a/assets/Filecfg/2530876314564213345 b/assets/Filecfg/2530876314564213345 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/2530876314564213345 differ diff --git a/assets/Filecfg/2593550976051202990 b/assets/Filecfg/2593550976051202990 new file mode 100644 index 0000000..ed6b348 Binary files /dev/null and b/assets/Filecfg/2593550976051202990 differ diff --git a/assets/Filecfg/2594816649161444419 b/assets/Filecfg/2594816649161444419 new file mode 100644 index 0000000..21328d1 Binary files /dev/null and b/assets/Filecfg/2594816649161444419 differ diff --git a/assets/Filecfg/2602935684721354384 b/assets/Filecfg/2602935684721354384 new file mode 100644 index 0000000..7f1b18d Binary files /dev/null and b/assets/Filecfg/2602935684721354384 differ diff --git a/assets/Filecfg/260993300563246424 b/assets/Filecfg/260993300563246424 new file mode 100644 index 0000000..e729a24 Binary files /dev/null and b/assets/Filecfg/260993300563246424 differ diff --git a/assets/Filecfg/2637778505549153338 b/assets/Filecfg/2637778505549153338 new file mode 100644 index 0000000..c12445c Binary files /dev/null and b/assets/Filecfg/2637778505549153338 differ diff --git a/assets/Filecfg/2652008538949392327 b/assets/Filecfg/2652008538949392327 new file mode 100644 index 0000000..d60b983 Binary files /dev/null and b/assets/Filecfg/2652008538949392327 differ diff --git a/assets/Filecfg/2671902836520385492 b/assets/Filecfg/2671902836520385492 new file mode 100644 index 0000000..b5dfed4 Binary files /dev/null and b/assets/Filecfg/2671902836520385492 differ diff --git a/assets/Filecfg/2692803403669867903 b/assets/Filecfg/2692803403669867903 new file mode 100644 index 0000000..a1047e2 Binary files /dev/null and b/assets/Filecfg/2692803403669867903 differ diff --git a/assets/Filecfg/27201124956052349 b/assets/Filecfg/27201124956052349 new file mode 100644 index 0000000..47105a1 Binary files /dev/null and b/assets/Filecfg/27201124956052349 differ diff --git a/assets/Filecfg/272619092500281060 b/assets/Filecfg/272619092500281060 new file mode 100644 index 0000000..23eb384 Binary files /dev/null and b/assets/Filecfg/272619092500281060 differ diff --git a/assets/Filecfg/2731270946451915044 b/assets/Filecfg/2731270946451915044 new file mode 100644 index 0000000..bdb088d Binary files /dev/null and b/assets/Filecfg/2731270946451915044 differ diff --git a/assets/Filecfg/2737386615395344409 b/assets/Filecfg/2737386615395344409 new file mode 100644 index 0000000..c090b32 Binary files /dev/null and b/assets/Filecfg/2737386615395344409 differ diff --git a/assets/Filecfg/2738964800363149789 b/assets/Filecfg/2738964800363149789 new file mode 100644 index 0000000..f3e072a Binary files /dev/null and b/assets/Filecfg/2738964800363149789 differ diff --git a/assets/Filecfg/2745395814375722499 b/assets/Filecfg/2745395814375722499 new file mode 100644 index 0000000..31c17f0 Binary files /dev/null and b/assets/Filecfg/2745395814375722499 differ diff --git a/assets/Filecfg/274979733812875016 b/assets/Filecfg/274979733812875016 new file mode 100644 index 0000000..83e8af7 Binary files /dev/null and b/assets/Filecfg/274979733812875016 differ diff --git a/assets/Filecfg/2755290917730016861 b/assets/Filecfg/2755290917730016861 new file mode 100644 index 0000000..4c0fff3 Binary files /dev/null and b/assets/Filecfg/2755290917730016861 differ diff --git a/assets/Filecfg/2852711949810215938 b/assets/Filecfg/2852711949810215938 new file mode 100644 index 0000000..45592cf Binary files /dev/null and b/assets/Filecfg/2852711949810215938 differ diff --git a/assets/Filecfg/2855915576188386107 b/assets/Filecfg/2855915576188386107 new file mode 100644 index 0000000..604d5bd Binary files /dev/null and b/assets/Filecfg/2855915576188386107 differ diff --git a/assets/Filecfg/2857653356620194355 b/assets/Filecfg/2857653356620194355 new file mode 100644 index 0000000..1193620 Binary files /dev/null and b/assets/Filecfg/2857653356620194355 differ diff --git a/assets/Filecfg/2864584403899025436 b/assets/Filecfg/2864584403899025436 new file mode 100644 index 0000000..bf95304 Binary files /dev/null and b/assets/Filecfg/2864584403899025436 differ diff --git a/assets/Filecfg/2891100817787755216 b/assets/Filecfg/2891100817787755216 new file mode 100644 index 0000000..2d376e5 Binary files /dev/null and b/assets/Filecfg/2891100817787755216 differ diff --git a/assets/Filecfg/2893168799536316643 b/assets/Filecfg/2893168799536316643 new file mode 100644 index 0000000..8ee3cba Binary files /dev/null and b/assets/Filecfg/2893168799536316643 differ diff --git a/assets/Filecfg/2932696475725359642 b/assets/Filecfg/2932696475725359642 new file mode 100644 index 0000000..cf1304c Binary files /dev/null and b/assets/Filecfg/2932696475725359642 differ diff --git a/assets/Filecfg/2951367533771701822 b/assets/Filecfg/2951367533771701822 new file mode 100644 index 0000000..ef1d7b3 Binary files /dev/null and b/assets/Filecfg/2951367533771701822 differ diff --git a/assets/Filecfg/2962813049972084077 b/assets/Filecfg/2962813049972084077 new file mode 100644 index 0000000..b2656ec Binary files /dev/null and b/assets/Filecfg/2962813049972084077 differ diff --git a/assets/Filecfg/2962994202286280011 b/assets/Filecfg/2962994202286280011 new file mode 100644 index 0000000..05842d6 Binary files /dev/null and b/assets/Filecfg/2962994202286280011 differ diff --git a/assets/Filecfg/29634884419278537 b/assets/Filecfg/29634884419278537 new file mode 100644 index 0000000..73752f1 Binary files /dev/null and b/assets/Filecfg/29634884419278537 differ diff --git a/assets/Filecfg/2981302727909090632 b/assets/Filecfg/2981302727909090632 new file mode 100644 index 0000000..3219bdc Binary files /dev/null and b/assets/Filecfg/2981302727909090632 differ diff --git a/assets/Filecfg/3012998129418412458 b/assets/Filecfg/3012998129418412458 new file mode 100644 index 0000000..7ff9c38 Binary files /dev/null and b/assets/Filecfg/3012998129418412458 differ diff --git a/assets/Filecfg/3014710301384001710 b/assets/Filecfg/3014710301384001710 new file mode 100644 index 0000000..80c2590 Binary files /dev/null and b/assets/Filecfg/3014710301384001710 differ diff --git a/assets/Filecfg/301776851920480983 b/assets/Filecfg/301776851920480983 new file mode 100644 index 0000000..7f9e155 Binary files /dev/null and b/assets/Filecfg/301776851920480983 differ diff --git a/assets/Filecfg/3027460788917960765 b/assets/Filecfg/3027460788917960765 new file mode 100644 index 0000000..13611dc Binary files /dev/null and b/assets/Filecfg/3027460788917960765 differ diff --git a/assets/Filecfg/3092829203569982104 b/assets/Filecfg/3092829203569982104 new file mode 100644 index 0000000..2c98b52 Binary files /dev/null and b/assets/Filecfg/3092829203569982104 differ diff --git a/assets/Filecfg/3158106684137634569 b/assets/Filecfg/3158106684137634569 new file mode 100644 index 0000000..c6ff60d Binary files /dev/null and b/assets/Filecfg/3158106684137634569 differ diff --git a/assets/Filecfg/3218532634789796614 b/assets/Filecfg/3218532634789796614 new file mode 100644 index 0000000..1da86a6 Binary files /dev/null and b/assets/Filecfg/3218532634789796614 differ diff --git a/assets/Filecfg/3241268659427504083 b/assets/Filecfg/3241268659427504083 new file mode 100644 index 0000000..528cbfd Binary files /dev/null and b/assets/Filecfg/3241268659427504083 differ diff --git a/assets/Filecfg/328541797003270023 b/assets/Filecfg/328541797003270023 new file mode 100644 index 0000000..721eba9 Binary files /dev/null and b/assets/Filecfg/328541797003270023 differ diff --git a/assets/Filecfg/3310863710456551694 b/assets/Filecfg/3310863710456551694 new file mode 100644 index 0000000..b8dc2b7 Binary files /dev/null and b/assets/Filecfg/3310863710456551694 differ diff --git a/assets/Filecfg/3326709194301765583 b/assets/Filecfg/3326709194301765583 new file mode 100644 index 0000000..633c105 Binary files /dev/null and b/assets/Filecfg/3326709194301765583 differ diff --git a/assets/Filecfg/3327520657579810281 b/assets/Filecfg/3327520657579810281 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/3327520657579810281 differ diff --git a/assets/Filecfg/3345622251367048522 b/assets/Filecfg/3345622251367048522 new file mode 100644 index 0000000..f86d9b3 Binary files /dev/null and b/assets/Filecfg/3345622251367048522 differ diff --git a/assets/Filecfg/3351190077481903147 b/assets/Filecfg/3351190077481903147 new file mode 100644 index 0000000..dd3ba12 Binary files /dev/null and b/assets/Filecfg/3351190077481903147 differ diff --git a/assets/Filecfg/3356808598547420785 b/assets/Filecfg/3356808598547420785 new file mode 100644 index 0000000..b6c67f3 Binary files /dev/null and b/assets/Filecfg/3356808598547420785 differ diff --git a/assets/Filecfg/3361892142424398238 b/assets/Filecfg/3361892142424398238 new file mode 100644 index 0000000..6fc79f4 Binary files /dev/null and b/assets/Filecfg/3361892142424398238 differ diff --git a/assets/Filecfg/3382467764650857281 b/assets/Filecfg/3382467764650857281 new file mode 100644 index 0000000..919f175 Binary files /dev/null and b/assets/Filecfg/3382467764650857281 differ diff --git a/assets/Filecfg/3402844739574635393 b/assets/Filecfg/3402844739574635393 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/3402844739574635393 differ diff --git a/assets/Filecfg/3424212571198265162 b/assets/Filecfg/3424212571198265162 new file mode 100644 index 0000000..9d8abd0 Binary files /dev/null and b/assets/Filecfg/3424212571198265162 differ diff --git a/assets/Filecfg/3466801593639758266 b/assets/Filecfg/3466801593639758266 new file mode 100644 index 0000000..5e56d0d Binary files /dev/null and b/assets/Filecfg/3466801593639758266 differ diff --git a/assets/Filecfg/346842429888394423 b/assets/Filecfg/346842429888394423 new file mode 100644 index 0000000..9b818a6 Binary files /dev/null and b/assets/Filecfg/346842429888394423 differ diff --git a/assets/Filecfg/3478946528208561482 b/assets/Filecfg/3478946528208561482 new file mode 100644 index 0000000..30a6b76 Binary files /dev/null and b/assets/Filecfg/3478946528208561482 differ diff --git a/assets/Filecfg/3499657357945652980 b/assets/Filecfg/3499657357945652980 new file mode 100644 index 0000000..7665467 Binary files /dev/null and b/assets/Filecfg/3499657357945652980 differ diff --git a/assets/Filecfg/3505320623537172373 b/assets/Filecfg/3505320623537172373 new file mode 100644 index 0000000..8a5fb35 Binary files /dev/null and b/assets/Filecfg/3505320623537172373 differ diff --git a/assets/Filecfg/3510704990694538261 b/assets/Filecfg/3510704990694538261 new file mode 100644 index 0000000..7712e4d Binary files /dev/null and b/assets/Filecfg/3510704990694538261 differ diff --git a/assets/Filecfg/3544517709547791978 b/assets/Filecfg/3544517709547791978 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/3544517709547791978 differ diff --git a/assets/Filecfg/3546083046167294008 b/assets/Filecfg/3546083046167294008 new file mode 100644 index 0000000..9e1538e Binary files /dev/null and b/assets/Filecfg/3546083046167294008 differ diff --git a/assets/Filecfg/3584244899879426926 b/assets/Filecfg/3584244899879426926 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/3584244899879426926 differ diff --git a/assets/Filecfg/3590837255934342544 b/assets/Filecfg/3590837255934342544 new file mode 100644 index 0000000..7675d81 Binary files /dev/null and b/assets/Filecfg/3590837255934342544 differ diff --git a/assets/Filecfg/3609168762045976379 b/assets/Filecfg/3609168762045976379 new file mode 100644 index 0000000..3ed7ac3 Binary files /dev/null and b/assets/Filecfg/3609168762045976379 differ diff --git a/assets/Filecfg/3616154196158214054 b/assets/Filecfg/3616154196158214054 new file mode 100644 index 0000000..3f04d02 Binary files /dev/null and b/assets/Filecfg/3616154196158214054 differ diff --git a/assets/Filecfg/3630539366393835295 b/assets/Filecfg/3630539366393835295 new file mode 100644 index 0000000..a3e31df Binary files /dev/null and b/assets/Filecfg/3630539366393835295 differ diff --git a/assets/Filecfg/3646012107235028811 b/assets/Filecfg/3646012107235028811 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/3646012107235028811 differ diff --git a/assets/Filecfg/3658459329928177688 b/assets/Filecfg/3658459329928177688 new file mode 100644 index 0000000..5486d39 Binary files /dev/null and b/assets/Filecfg/3658459329928177688 differ diff --git a/assets/Filecfg/3671648230437173305 b/assets/Filecfg/3671648230437173305 new file mode 100644 index 0000000..1a67a2f Binary files /dev/null and b/assets/Filecfg/3671648230437173305 differ diff --git a/assets/Filecfg/3689987739556907068 b/assets/Filecfg/3689987739556907068 new file mode 100644 index 0000000..202d783 Binary files /dev/null and b/assets/Filecfg/3689987739556907068 differ diff --git a/assets/Filecfg/3738513350421562920 b/assets/Filecfg/3738513350421562920 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/3738513350421562920 differ diff --git a/assets/Filecfg/3747072044321015026 b/assets/Filecfg/3747072044321015026 new file mode 100644 index 0000000..0afff73 Binary files /dev/null and b/assets/Filecfg/3747072044321015026 differ diff --git a/assets/Filecfg/3780260043727311227 b/assets/Filecfg/3780260043727311227 new file mode 100644 index 0000000..2ef7bfa Binary files /dev/null and b/assets/Filecfg/3780260043727311227 differ diff --git a/assets/Filecfg/3792216722869982564 b/assets/Filecfg/3792216722869982564 new file mode 100644 index 0000000..a47f3ca Binary files /dev/null and b/assets/Filecfg/3792216722869982564 differ diff --git a/assets/Filecfg/3820124373911535309 b/assets/Filecfg/3820124373911535309 new file mode 100644 index 0000000..175c648 Binary files /dev/null and b/assets/Filecfg/3820124373911535309 differ diff --git a/assets/Filecfg/3840320365945661046 b/assets/Filecfg/3840320365945661046 new file mode 100644 index 0000000..b1a6e07 Binary files /dev/null and b/assets/Filecfg/3840320365945661046 differ diff --git a/assets/Filecfg/386748977202537910 b/assets/Filecfg/386748977202537910 new file mode 100644 index 0000000..2e375f4 Binary files /dev/null and b/assets/Filecfg/386748977202537910 differ diff --git a/assets/Filecfg/3901292406778730676 b/assets/Filecfg/3901292406778730676 new file mode 100644 index 0000000..6c003f7 Binary files /dev/null and b/assets/Filecfg/3901292406778730676 differ diff --git a/assets/Filecfg/3909674130182140788 b/assets/Filecfg/3909674130182140788 new file mode 100644 index 0000000..30cfc8b Binary files /dev/null and b/assets/Filecfg/3909674130182140788 differ diff --git a/assets/Filecfg/3944622134803778346 b/assets/Filecfg/3944622134803778346 new file mode 100644 index 0000000..a15bf99 Binary files /dev/null and b/assets/Filecfg/3944622134803778346 differ diff --git a/assets/Filecfg/3962159577619234647 b/assets/Filecfg/3962159577619234647 new file mode 100644 index 0000000..38fe62e Binary files /dev/null and b/assets/Filecfg/3962159577619234647 differ diff --git a/assets/Filecfg/39695835372774476 b/assets/Filecfg/39695835372774476 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/39695835372774476 differ diff --git a/assets/Filecfg/3988750615363737148 b/assets/Filecfg/3988750615363737148 new file mode 100644 index 0000000..3045284 Binary files /dev/null and b/assets/Filecfg/3988750615363737148 differ diff --git a/assets/Filecfg/3999579049136014506 b/assets/Filecfg/3999579049136014506 new file mode 100644 index 0000000..bb0c403 Binary files /dev/null and b/assets/Filecfg/3999579049136014506 differ diff --git a/assets/Filecfg/400639141751599232 b/assets/Filecfg/400639141751599232 new file mode 100644 index 0000000..d9f6fa4 Binary files /dev/null and b/assets/Filecfg/400639141751599232 differ diff --git a/assets/Filecfg/4015385578732402244 b/assets/Filecfg/4015385578732402244 new file mode 100644 index 0000000..e1fb3fc Binary files /dev/null and b/assets/Filecfg/4015385578732402244 differ diff --git a/assets/Filecfg/4043988176912404933 b/assets/Filecfg/4043988176912404933 new file mode 100644 index 0000000..0e18cdf Binary files /dev/null and b/assets/Filecfg/4043988176912404933 differ diff --git a/assets/Filecfg/4046468400196384420 b/assets/Filecfg/4046468400196384420 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/4046468400196384420 differ diff --git a/assets/Filecfg/4068241849831304957 b/assets/Filecfg/4068241849831304957 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/4068241849831304957 differ diff --git a/assets/Filecfg/4069416385955677556 b/assets/Filecfg/4069416385955677556 new file mode 100644 index 0000000..7ba0f8c Binary files /dev/null and b/assets/Filecfg/4069416385955677556 differ diff --git a/assets/Filecfg/4077855027830047137 b/assets/Filecfg/4077855027830047137 new file mode 100644 index 0000000..9d0334d Binary files /dev/null and b/assets/Filecfg/4077855027830047137 differ diff --git a/assets/Filecfg/4083769932937869689 b/assets/Filecfg/4083769932937869689 new file mode 100644 index 0000000..e9323ad Binary files /dev/null and b/assets/Filecfg/4083769932937869689 differ diff --git a/assets/Filecfg/4098280244579905437 b/assets/Filecfg/4098280244579905437 new file mode 100644 index 0000000..4b1910f Binary files /dev/null and b/assets/Filecfg/4098280244579905437 differ diff --git a/assets/Filecfg/4180605936868382118 b/assets/Filecfg/4180605936868382118 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/4180605936868382118 differ diff --git a/assets/Filecfg/4191612783841341498 b/assets/Filecfg/4191612783841341498 new file mode 100644 index 0000000..d3cb351 Binary files /dev/null and b/assets/Filecfg/4191612783841341498 differ diff --git a/assets/Filecfg/419422299619199660 b/assets/Filecfg/419422299619199660 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/419422299619199660 differ diff --git a/assets/Filecfg/4223699954634888159 b/assets/Filecfg/4223699954634888159 new file mode 100644 index 0000000..e742919 Binary files /dev/null and b/assets/Filecfg/4223699954634888159 differ diff --git a/assets/Filecfg/4231196613968221522 b/assets/Filecfg/4231196613968221522 new file mode 100644 index 0000000..15370b2 Binary files /dev/null and b/assets/Filecfg/4231196613968221522 differ diff --git a/assets/Filecfg/423504933705999517 b/assets/Filecfg/423504933705999517 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/423504933705999517 differ diff --git a/assets/Filecfg/4295324096899713378 b/assets/Filecfg/4295324096899713378 new file mode 100644 index 0000000..ba2b808 Binary files /dev/null and b/assets/Filecfg/4295324096899713378 differ diff --git a/assets/Filecfg/4311382081443601719 b/assets/Filecfg/4311382081443601719 new file mode 100644 index 0000000..04a356f Binary files /dev/null and b/assets/Filecfg/4311382081443601719 differ diff --git a/assets/Filecfg/4318575998390099403 b/assets/Filecfg/4318575998390099403 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/4318575998390099403 differ diff --git a/assets/Filecfg/4322443222382903272 b/assets/Filecfg/4322443222382903272 new file mode 100644 index 0000000..bee53b5 Binary files /dev/null and b/assets/Filecfg/4322443222382903272 differ diff --git a/assets/Filecfg/4322562012382843708 b/assets/Filecfg/4322562012382843708 new file mode 100644 index 0000000..28738aa Binary files /dev/null and b/assets/Filecfg/4322562012382843708 differ diff --git a/assets/Filecfg/433246340728281894 b/assets/Filecfg/433246340728281894 new file mode 100644 index 0000000..1ce53b8 Binary files /dev/null and b/assets/Filecfg/433246340728281894 differ diff --git a/assets/Filecfg/434113416997914010 b/assets/Filecfg/434113416997914010 new file mode 100644 index 0000000..9b7f79f Binary files /dev/null and b/assets/Filecfg/434113416997914010 differ diff --git a/assets/Filecfg/4365203010580842577 b/assets/Filecfg/4365203010580842577 new file mode 100644 index 0000000..eb80b9c Binary files /dev/null and b/assets/Filecfg/4365203010580842577 differ diff --git a/assets/Filecfg/4406151592867089138 b/assets/Filecfg/4406151592867089138 new file mode 100644 index 0000000..3454af1 Binary files /dev/null and b/assets/Filecfg/4406151592867089138 differ diff --git a/assets/Filecfg/4430080433073206673 b/assets/Filecfg/4430080433073206673 new file mode 100644 index 0000000..ad45e64 Binary files /dev/null and b/assets/Filecfg/4430080433073206673 differ diff --git a/assets/Filecfg/4432696996197112833 b/assets/Filecfg/4432696996197112833 new file mode 100644 index 0000000..8504f32 Binary files /dev/null and b/assets/Filecfg/4432696996197112833 differ diff --git a/assets/Filecfg/4442450954842002296 b/assets/Filecfg/4442450954842002296 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/4442450954842002296 differ diff --git a/assets/Filecfg/4476469277308246099 b/assets/Filecfg/4476469277308246099 new file mode 100644 index 0000000..f06ff8d Binary files /dev/null and b/assets/Filecfg/4476469277308246099 differ diff --git a/assets/Filecfg/4484260707124731316 b/assets/Filecfg/4484260707124731316 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/4484260707124731316 differ diff --git a/assets/Filecfg/4557829179661179292 b/assets/Filecfg/4557829179661179292 new file mode 100644 index 0000000..c385542 Binary files /dev/null and b/assets/Filecfg/4557829179661179292 differ diff --git a/assets/Filecfg/4575946353574646632 b/assets/Filecfg/4575946353574646632 new file mode 100644 index 0000000..ebb6e36 Binary files /dev/null and b/assets/Filecfg/4575946353574646632 differ diff --git a/assets/Filecfg/4628273475630412933 b/assets/Filecfg/4628273475630412933 new file mode 100644 index 0000000..cf3fb91 Binary files /dev/null and b/assets/Filecfg/4628273475630412933 differ diff --git a/assets/Filecfg/4646140664244381952 b/assets/Filecfg/4646140664244381952 new file mode 100644 index 0000000..b089cf5 Binary files /dev/null and b/assets/Filecfg/4646140664244381952 differ diff --git a/assets/Filecfg/4648863585108110386 b/assets/Filecfg/4648863585108110386 new file mode 100644 index 0000000..e9323ad Binary files /dev/null and b/assets/Filecfg/4648863585108110386 differ diff --git a/assets/Filecfg/4665998316422434481 b/assets/Filecfg/4665998316422434481 new file mode 100644 index 0000000..ba755c0 Binary files /dev/null and b/assets/Filecfg/4665998316422434481 differ diff --git a/assets/Filecfg/4707073853855051787 b/assets/Filecfg/4707073853855051787 new file mode 100644 index 0000000..717a4ac Binary files /dev/null and b/assets/Filecfg/4707073853855051787 differ diff --git a/assets/Filecfg/4726610649075133362 b/assets/Filecfg/4726610649075133362 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/4726610649075133362 differ diff --git a/assets/Filecfg/4742680758715633658 b/assets/Filecfg/4742680758715633658 new file mode 100644 index 0000000..20b9691 Binary files /dev/null and b/assets/Filecfg/4742680758715633658 differ diff --git a/assets/Filecfg/4798972979962811557 b/assets/Filecfg/4798972979962811557 new file mode 100644 index 0000000..5bed80f Binary files /dev/null and b/assets/Filecfg/4798972979962811557 differ diff --git a/assets/Filecfg/4808074969794812463 b/assets/Filecfg/4808074969794812463 new file mode 100644 index 0000000..262627f Binary files /dev/null and b/assets/Filecfg/4808074969794812463 differ diff --git a/assets/Filecfg/4823795780447614403 b/assets/Filecfg/4823795780447614403 new file mode 100644 index 0000000..99ce347 Binary files /dev/null and b/assets/Filecfg/4823795780447614403 differ diff --git a/assets/Filecfg/4876412103089812073 b/assets/Filecfg/4876412103089812073 new file mode 100644 index 0000000..2a956ef Binary files /dev/null and b/assets/Filecfg/4876412103089812073 differ diff --git a/assets/Filecfg/4884094205404253149 b/assets/Filecfg/4884094205404253149 new file mode 100644 index 0000000..acc05b5 Binary files /dev/null and b/assets/Filecfg/4884094205404253149 differ diff --git a/assets/Filecfg/4896216915043856052 b/assets/Filecfg/4896216915043856052 new file mode 100644 index 0000000..60cccf3 Binary files /dev/null and b/assets/Filecfg/4896216915043856052 differ diff --git a/assets/Filecfg/4933800558068123475 b/assets/Filecfg/4933800558068123475 new file mode 100644 index 0000000..379527e Binary files /dev/null and b/assets/Filecfg/4933800558068123475 differ diff --git a/assets/Filecfg/495688825170845425 b/assets/Filecfg/495688825170845425 new file mode 100644 index 0000000..f7b9184 Binary files /dev/null and b/assets/Filecfg/495688825170845425 differ diff --git a/assets/Filecfg/4973475081465143496 b/assets/Filecfg/4973475081465143496 new file mode 100644 index 0000000..1e69604 Binary files /dev/null and b/assets/Filecfg/4973475081465143496 differ diff --git a/assets/Filecfg/4983281615073778540 b/assets/Filecfg/4983281615073778540 new file mode 100644 index 0000000..9c67742 Binary files /dev/null and b/assets/Filecfg/4983281615073778540 differ diff --git a/assets/Filecfg/4989364694718517966 b/assets/Filecfg/4989364694718517966 new file mode 100644 index 0000000..16d197b Binary files /dev/null and b/assets/Filecfg/4989364694718517966 differ diff --git a/assets/Filecfg/4991014209748711197 b/assets/Filecfg/4991014209748711197 new file mode 100644 index 0000000..17376e9 Binary files /dev/null and b/assets/Filecfg/4991014209748711197 differ diff --git a/assets/Filecfg/5016571262644860971 b/assets/Filecfg/5016571262644860971 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/5016571262644860971 differ diff --git a/assets/Filecfg/5021129077020954462 b/assets/Filecfg/5021129077020954462 new file mode 100644 index 0000000..b4293c4 Binary files /dev/null and b/assets/Filecfg/5021129077020954462 differ diff --git a/assets/Filecfg/5067632430352176432 b/assets/Filecfg/5067632430352176432 new file mode 100644 index 0000000..e31ca34 Binary files /dev/null and b/assets/Filecfg/5067632430352176432 differ diff --git a/assets/Filecfg/5101466068534146025 b/assets/Filecfg/5101466068534146025 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/5101466068534146025 differ diff --git a/assets/Filecfg/5140344398596274082 b/assets/Filecfg/5140344398596274082 new file mode 100644 index 0000000..1fdbb2f Binary files /dev/null and b/assets/Filecfg/5140344398596274082 differ diff --git a/assets/Filecfg/5148838875781963058 b/assets/Filecfg/5148838875781963058 new file mode 100644 index 0000000..4c83579 Binary files /dev/null and b/assets/Filecfg/5148838875781963058 differ diff --git a/assets/Filecfg/5182221938443139485 b/assets/Filecfg/5182221938443139485 new file mode 100644 index 0000000..7b186be Binary files /dev/null and b/assets/Filecfg/5182221938443139485 differ diff --git a/assets/Filecfg/5214067167864480161 b/assets/Filecfg/5214067167864480161 new file mode 100644 index 0000000..ce5ff7d Binary files /dev/null and b/assets/Filecfg/5214067167864480161 differ diff --git a/assets/Filecfg/5227613755459309830 b/assets/Filecfg/5227613755459309830 new file mode 100644 index 0000000..20a3ead Binary files /dev/null and b/assets/Filecfg/5227613755459309830 differ diff --git a/assets/Filecfg/5241612153153753772 b/assets/Filecfg/5241612153153753772 new file mode 100644 index 0000000..e06d509 Binary files /dev/null and b/assets/Filecfg/5241612153153753772 differ diff --git a/assets/Filecfg/5271172447929564733 b/assets/Filecfg/5271172447929564733 new file mode 100644 index 0000000..7d72a8c Binary files /dev/null and b/assets/Filecfg/5271172447929564733 differ diff --git a/assets/Filecfg/5277044137070422479 b/assets/Filecfg/5277044137070422479 new file mode 100644 index 0000000..ac697cc Binary files /dev/null and b/assets/Filecfg/5277044137070422479 differ diff --git a/assets/Filecfg/5322243554571421711 b/assets/Filecfg/5322243554571421711 new file mode 100644 index 0000000..2b3c6f6 Binary files /dev/null and b/assets/Filecfg/5322243554571421711 differ diff --git a/assets/Filecfg/5331782770993804119 b/assets/Filecfg/5331782770993804119 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/5331782770993804119 differ diff --git a/assets/Filecfg/5338651134174835218 b/assets/Filecfg/5338651134174835218 new file mode 100644 index 0000000..e7bd326 Binary files /dev/null and b/assets/Filecfg/5338651134174835218 differ diff --git a/assets/Filecfg/5342933196565250546 b/assets/Filecfg/5342933196565250546 new file mode 100644 index 0000000..3d62d16 Binary files /dev/null and b/assets/Filecfg/5342933196565250546 differ diff --git a/assets/Filecfg/5365849458490020924 b/assets/Filecfg/5365849458490020924 new file mode 100644 index 0000000..1329444 Binary files /dev/null and b/assets/Filecfg/5365849458490020924 differ diff --git a/assets/Filecfg/5388176696410509632 b/assets/Filecfg/5388176696410509632 new file mode 100644 index 0000000..4254a3e Binary files /dev/null and b/assets/Filecfg/5388176696410509632 differ diff --git a/assets/Filecfg/5417178987160315640 b/assets/Filecfg/5417178987160315640 new file mode 100644 index 0000000..94f5333 Binary files /dev/null and b/assets/Filecfg/5417178987160315640 differ diff --git a/assets/Filecfg/5456963605774396189 b/assets/Filecfg/5456963605774396189 new file mode 100644 index 0000000..75944fa Binary files /dev/null and b/assets/Filecfg/5456963605774396189 differ diff --git a/assets/Filecfg/5472833244517683052 b/assets/Filecfg/5472833244517683052 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/5472833244517683052 differ diff --git a/assets/Filecfg/5490568096248478764 b/assets/Filecfg/5490568096248478764 new file mode 100644 index 0000000..8abe950 Binary files /dev/null and b/assets/Filecfg/5490568096248478764 differ diff --git a/assets/Filecfg/5493243568412109329 b/assets/Filecfg/5493243568412109329 new file mode 100644 index 0000000..790c5cd Binary files /dev/null and b/assets/Filecfg/5493243568412109329 differ diff --git a/assets/Filecfg/5522586486560494559 b/assets/Filecfg/5522586486560494559 new file mode 100644 index 0000000..cd53de2 Binary files /dev/null and b/assets/Filecfg/5522586486560494559 differ diff --git a/assets/Filecfg/5535291084163037121 b/assets/Filecfg/5535291084163037121 new file mode 100644 index 0000000..0c23f06 Binary files /dev/null and b/assets/Filecfg/5535291084163037121 differ diff --git a/assets/Filecfg/5552686315293711460 b/assets/Filecfg/5552686315293711460 new file mode 100644 index 0000000..8ea96db Binary files /dev/null and b/assets/Filecfg/5552686315293711460 differ diff --git a/assets/Filecfg/556046180280184869 b/assets/Filecfg/556046180280184869 new file mode 100644 index 0000000..1cb5077 Binary files /dev/null and b/assets/Filecfg/556046180280184869 differ diff --git a/assets/Filecfg/5564637725110186407 b/assets/Filecfg/5564637725110186407 new file mode 100644 index 0000000..2e6e853 Binary files /dev/null and b/assets/Filecfg/5564637725110186407 differ diff --git a/assets/Filecfg/559785165092901407 b/assets/Filecfg/559785165092901407 new file mode 100644 index 0000000..0e4b985 Binary files /dev/null and b/assets/Filecfg/559785165092901407 differ diff --git a/assets/Filecfg/5608201771348093274 b/assets/Filecfg/5608201771348093274 new file mode 100644 index 0000000..450b94a Binary files /dev/null and b/assets/Filecfg/5608201771348093274 differ diff --git a/assets/Filecfg/5623978840017255148 b/assets/Filecfg/5623978840017255148 new file mode 100644 index 0000000..5304254 Binary files /dev/null and b/assets/Filecfg/5623978840017255148 differ diff --git a/assets/Filecfg/5630894096142710352 b/assets/Filecfg/5630894096142710352 new file mode 100644 index 0000000..3c2be5f Binary files /dev/null and b/assets/Filecfg/5630894096142710352 differ diff --git a/assets/Filecfg/5638582523082315489 b/assets/Filecfg/5638582523082315489 new file mode 100644 index 0000000..deec707 Binary files /dev/null and b/assets/Filecfg/5638582523082315489 differ diff --git a/assets/Filecfg/5666267118015377145 b/assets/Filecfg/5666267118015377145 new file mode 100644 index 0000000..2a188d2 Binary files /dev/null and b/assets/Filecfg/5666267118015377145 differ diff --git a/assets/Filecfg/5696865296250390458 b/assets/Filecfg/5696865296250390458 new file mode 100644 index 0000000..187b2ae Binary files /dev/null and b/assets/Filecfg/5696865296250390458 differ diff --git a/assets/Filecfg/5706336166406855909 b/assets/Filecfg/5706336166406855909 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/5706336166406855909 differ diff --git a/assets/Filecfg/5713167030326272869 b/assets/Filecfg/5713167030326272869 new file mode 100644 index 0000000..a32f4bd Binary files /dev/null and b/assets/Filecfg/5713167030326272869 differ diff --git a/assets/Filecfg/572994088085723519 b/assets/Filecfg/572994088085723519 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/572994088085723519 differ diff --git a/assets/Filecfg/5745062042580171251 b/assets/Filecfg/5745062042580171251 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/5745062042580171251 differ diff --git a/assets/Filecfg/5746590765952042202 b/assets/Filecfg/5746590765952042202 new file mode 100644 index 0000000..025cf41 Binary files /dev/null and b/assets/Filecfg/5746590765952042202 differ diff --git a/assets/Filecfg/5781289229209719908 b/assets/Filecfg/5781289229209719908 new file mode 100644 index 0000000..28826a6 Binary files /dev/null and b/assets/Filecfg/5781289229209719908 differ diff --git a/assets/Filecfg/5795562063956775112 b/assets/Filecfg/5795562063956775112 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/5795562063956775112 differ diff --git a/assets/Filecfg/5796726407752245716 b/assets/Filecfg/5796726407752245716 new file mode 100644 index 0000000..d41edd6 Binary files /dev/null and b/assets/Filecfg/5796726407752245716 differ diff --git a/assets/Filecfg/582939841689474478 b/assets/Filecfg/582939841689474478 new file mode 100644 index 0000000..3fb6976 Binary files /dev/null and b/assets/Filecfg/582939841689474478 differ diff --git a/assets/Filecfg/5845959695290159047 b/assets/Filecfg/5845959695290159047 new file mode 100644 index 0000000..2e21cc0 Binary files /dev/null and b/assets/Filecfg/5845959695290159047 differ diff --git a/assets/Filecfg/5852295172050390875 b/assets/Filecfg/5852295172050390875 new file mode 100644 index 0000000..f6cc885 Binary files /dev/null and b/assets/Filecfg/5852295172050390875 differ diff --git a/assets/Filecfg/5980391681890253812 b/assets/Filecfg/5980391681890253812 new file mode 100644 index 0000000..c3ad0a8 Binary files /dev/null and b/assets/Filecfg/5980391681890253812 differ diff --git a/assets/Filecfg/5984172531843457703 b/assets/Filecfg/5984172531843457703 new file mode 100644 index 0000000..6585a96 Binary files /dev/null and b/assets/Filecfg/5984172531843457703 differ diff --git a/assets/Filecfg/6011913858023298481 b/assets/Filecfg/6011913858023298481 new file mode 100644 index 0000000..17ba2ef Binary files /dev/null and b/assets/Filecfg/6011913858023298481 differ diff --git a/assets/Filecfg/601791899811637093 b/assets/Filecfg/601791899811637093 new file mode 100644 index 0000000..7d11e6d Binary files /dev/null and b/assets/Filecfg/601791899811637093 differ diff --git a/assets/Filecfg/6024246851548553443 b/assets/Filecfg/6024246851548553443 new file mode 100644 index 0000000..1c1d755 Binary files /dev/null and b/assets/Filecfg/6024246851548553443 differ diff --git a/assets/Filecfg/603278252225036850 b/assets/Filecfg/603278252225036850 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/603278252225036850 differ diff --git a/assets/Filecfg/6033075306250302764 b/assets/Filecfg/6033075306250302764 new file mode 100644 index 0000000..236953f Binary files /dev/null and b/assets/Filecfg/6033075306250302764 differ diff --git a/assets/Filecfg/6072499206397206205 b/assets/Filecfg/6072499206397206205 new file mode 100644 index 0000000..18fabe4 Binary files /dev/null and b/assets/Filecfg/6072499206397206205 differ diff --git a/assets/Filecfg/608952191416494120 b/assets/Filecfg/608952191416494120 new file mode 100644 index 0000000..97d117a Binary files /dev/null and b/assets/Filecfg/608952191416494120 differ diff --git a/assets/Filecfg/6090281425287496789 b/assets/Filecfg/6090281425287496789 new file mode 100644 index 0000000..0cb3a6a Binary files /dev/null and b/assets/Filecfg/6090281425287496789 differ diff --git a/assets/Filecfg/6094382926748238718 b/assets/Filecfg/6094382926748238718 new file mode 100644 index 0000000..f66fb3b Binary files /dev/null and b/assets/Filecfg/6094382926748238718 differ diff --git a/assets/Filecfg/615793448359982885 b/assets/Filecfg/615793448359982885 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/615793448359982885 differ diff --git a/assets/Filecfg/6188366052458360326 b/assets/Filecfg/6188366052458360326 new file mode 100644 index 0000000..9660730 Binary files /dev/null and b/assets/Filecfg/6188366052458360326 differ diff --git a/assets/Filecfg/6218034251536054336 b/assets/Filecfg/6218034251536054336 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/6218034251536054336 differ diff --git a/assets/Filecfg/6223966678419761311 b/assets/Filecfg/6223966678419761311 new file mode 100644 index 0000000..02f9f3c Binary files /dev/null and b/assets/Filecfg/6223966678419761311 differ diff --git a/assets/Filecfg/6251447854375625944 b/assets/Filecfg/6251447854375625944 new file mode 100644 index 0000000..288f1dc Binary files /dev/null and b/assets/Filecfg/6251447854375625944 differ diff --git a/assets/Filecfg/6260329655157612261 b/assets/Filecfg/6260329655157612261 new file mode 100644 index 0000000..41ecd07 Binary files /dev/null and b/assets/Filecfg/6260329655157612261 differ diff --git a/assets/Filecfg/6273475661586655886 b/assets/Filecfg/6273475661586655886 new file mode 100644 index 0000000..674964b Binary files /dev/null and b/assets/Filecfg/6273475661586655886 differ diff --git a/assets/Filecfg/628207196036792204 b/assets/Filecfg/628207196036792204 new file mode 100644 index 0000000..cfbd4b0 Binary files /dev/null and b/assets/Filecfg/628207196036792204 differ diff --git a/assets/Filecfg/6283720036608458522 b/assets/Filecfg/6283720036608458522 new file mode 100644 index 0000000..1505ab9 Binary files /dev/null and b/assets/Filecfg/6283720036608458522 differ diff --git a/assets/Filecfg/6306365957015510962 b/assets/Filecfg/6306365957015510962 new file mode 100644 index 0000000..dd36c02 Binary files /dev/null and b/assets/Filecfg/6306365957015510962 differ diff --git a/assets/Filecfg/6351841168483752320 b/assets/Filecfg/6351841168483752320 new file mode 100644 index 0000000..0a7c083 Binary files /dev/null and b/assets/Filecfg/6351841168483752320 differ diff --git a/assets/Filecfg/6357726650763480126 b/assets/Filecfg/6357726650763480126 new file mode 100644 index 0000000..e8c1f8b Binary files /dev/null and b/assets/Filecfg/6357726650763480126 differ diff --git a/assets/Filecfg/6359054397836103676 b/assets/Filecfg/6359054397836103676 new file mode 100644 index 0000000..0f30796 Binary files /dev/null and b/assets/Filecfg/6359054397836103676 differ diff --git a/assets/Filecfg/6375107998608770865 b/assets/Filecfg/6375107998608770865 new file mode 100644 index 0000000..4cb1622 Binary files /dev/null and b/assets/Filecfg/6375107998608770865 differ diff --git a/assets/Filecfg/6387764370072092160 b/assets/Filecfg/6387764370072092160 new file mode 100644 index 0000000..ffdfae6 Binary files /dev/null and b/assets/Filecfg/6387764370072092160 differ diff --git a/assets/Filecfg/6397633074437211389 b/assets/Filecfg/6397633074437211389 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/6397633074437211389 differ diff --git a/assets/Filecfg/6404610631777808492 b/assets/Filecfg/6404610631777808492 new file mode 100644 index 0000000..61670cd Binary files /dev/null and b/assets/Filecfg/6404610631777808492 differ diff --git a/assets/Filecfg/6416038822944569864 b/assets/Filecfg/6416038822944569864 new file mode 100644 index 0000000..456252d Binary files /dev/null and b/assets/Filecfg/6416038822944569864 differ diff --git a/assets/Filecfg/6421029858264432253 b/assets/Filecfg/6421029858264432253 new file mode 100644 index 0000000..91f2f2b Binary files /dev/null and b/assets/Filecfg/6421029858264432253 differ diff --git a/assets/Filecfg/6428357863320970990 b/assets/Filecfg/6428357863320970990 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/6428357863320970990 differ diff --git a/assets/Filecfg/6445772635280955354 b/assets/Filecfg/6445772635280955354 new file mode 100644 index 0000000..e5f650d Binary files /dev/null and b/assets/Filecfg/6445772635280955354 differ diff --git a/assets/Filecfg/6483972302645118660 b/assets/Filecfg/6483972302645118660 new file mode 100644 index 0000000..fe67cf2 Binary files /dev/null and b/assets/Filecfg/6483972302645118660 differ diff --git a/assets/Filecfg/6506397768004755162 b/assets/Filecfg/6506397768004755162 new file mode 100644 index 0000000..121124a Binary files /dev/null and b/assets/Filecfg/6506397768004755162 differ diff --git a/assets/Filecfg/6522592891747923878 b/assets/Filecfg/6522592891747923878 new file mode 100644 index 0000000..943cdad Binary files /dev/null and b/assets/Filecfg/6522592891747923878 differ diff --git a/assets/Filecfg/6540179825903711172 b/assets/Filecfg/6540179825903711172 new file mode 100644 index 0000000..3181329 Binary files /dev/null and b/assets/Filecfg/6540179825903711172 differ diff --git a/assets/Filecfg/6540331362746530508 b/assets/Filecfg/6540331362746530508 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/6540331362746530508 differ diff --git a/assets/Filecfg/6577360597312919022 b/assets/Filecfg/6577360597312919022 new file mode 100644 index 0000000..eda18ad Binary files /dev/null and b/assets/Filecfg/6577360597312919022 differ diff --git a/assets/Filecfg/6582963331327313050 b/assets/Filecfg/6582963331327313050 new file mode 100644 index 0000000..2b65d24 Binary files /dev/null and b/assets/Filecfg/6582963331327313050 differ diff --git a/assets/Filecfg/6587217776238216689 b/assets/Filecfg/6587217776238216689 new file mode 100644 index 0000000..1bd0a35 Binary files /dev/null and b/assets/Filecfg/6587217776238216689 differ diff --git a/assets/Filecfg/6607623785316453520 b/assets/Filecfg/6607623785316453520 new file mode 100644 index 0000000..b360706 Binary files /dev/null and b/assets/Filecfg/6607623785316453520 differ diff --git a/assets/Filecfg/6608359530843780464 b/assets/Filecfg/6608359530843780464 new file mode 100644 index 0000000..bd9fc77 Binary files /dev/null and b/assets/Filecfg/6608359530843780464 differ diff --git a/assets/Filecfg/66317880366008642 b/assets/Filecfg/66317880366008642 new file mode 100644 index 0000000..339d364 Binary files /dev/null and b/assets/Filecfg/66317880366008642 differ diff --git a/assets/Filecfg/6646034291024969384 b/assets/Filecfg/6646034291024969384 new file mode 100644 index 0000000..d4391fd Binary files /dev/null and b/assets/Filecfg/6646034291024969384 differ diff --git a/assets/Filecfg/6650075698645347761 b/assets/Filecfg/6650075698645347761 new file mode 100644 index 0000000..3a61de8 Binary files /dev/null and b/assets/Filecfg/6650075698645347761 differ diff --git a/assets/Filecfg/6661411246670551702 b/assets/Filecfg/6661411246670551702 new file mode 100644 index 0000000..f5add95 Binary files /dev/null and b/assets/Filecfg/6661411246670551702 differ diff --git a/assets/Filecfg/6688920929600713677 b/assets/Filecfg/6688920929600713677 new file mode 100644 index 0000000..8a4bb67 Binary files /dev/null and b/assets/Filecfg/6688920929600713677 differ diff --git a/assets/Filecfg/673035193650838499 b/assets/Filecfg/673035193650838499 new file mode 100644 index 0000000..e9d4465 Binary files /dev/null and b/assets/Filecfg/673035193650838499 differ diff --git a/assets/Filecfg/6760514233425161886 b/assets/Filecfg/6760514233425161886 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/6760514233425161886 differ diff --git a/assets/Filecfg/6765781962548632577 b/assets/Filecfg/6765781962548632577 new file mode 100644 index 0000000..ae27957 Binary files /dev/null and b/assets/Filecfg/6765781962548632577 differ diff --git a/assets/Filecfg/6778591944296498041 b/assets/Filecfg/6778591944296498041 new file mode 100644 index 0000000..01c09cb Binary files /dev/null and b/assets/Filecfg/6778591944296498041 differ diff --git a/assets/Filecfg/6813894472301903824 b/assets/Filecfg/6813894472301903824 new file mode 100644 index 0000000..e8f901c Binary files /dev/null and b/assets/Filecfg/6813894472301903824 differ diff --git a/assets/Filecfg/6814351203372082247 b/assets/Filecfg/6814351203372082247 new file mode 100644 index 0000000..ba518d2 Binary files /dev/null and b/assets/Filecfg/6814351203372082247 differ diff --git a/assets/Filecfg/6826483969186172767 b/assets/Filecfg/6826483969186172767 new file mode 100644 index 0000000..816d8ed Binary files /dev/null and b/assets/Filecfg/6826483969186172767 differ diff --git a/assets/Filecfg/6836502171695862267 b/assets/Filecfg/6836502171695862267 new file mode 100644 index 0000000..d26f8c0 Binary files /dev/null and b/assets/Filecfg/6836502171695862267 differ diff --git a/assets/Filecfg/6844842845887099120 b/assets/Filecfg/6844842845887099120 new file mode 100644 index 0000000..ffa451e Binary files /dev/null and b/assets/Filecfg/6844842845887099120 differ diff --git a/assets/Filecfg/6857520792299602651 b/assets/Filecfg/6857520792299602651 new file mode 100644 index 0000000..a8e02ef Binary files /dev/null and b/assets/Filecfg/6857520792299602651 differ diff --git a/assets/Filecfg/6867969377074818228 b/assets/Filecfg/6867969377074818228 new file mode 100644 index 0000000..ee2a04c Binary files /dev/null and b/assets/Filecfg/6867969377074818228 differ diff --git a/assets/Filecfg/6905488467993895503 b/assets/Filecfg/6905488467993895503 new file mode 100644 index 0000000..be4cba8 Binary files /dev/null and b/assets/Filecfg/6905488467993895503 differ diff --git a/assets/Filecfg/6914627935860238436 b/assets/Filecfg/6914627935860238436 new file mode 100644 index 0000000..9c1ddaf Binary files /dev/null and b/assets/Filecfg/6914627935860238436 differ diff --git a/assets/Filecfg/6925740560359359217 b/assets/Filecfg/6925740560359359217 new file mode 100644 index 0000000..1f2334e Binary files /dev/null and b/assets/Filecfg/6925740560359359217 differ diff --git a/assets/Filecfg/6941721697424973764 b/assets/Filecfg/6941721697424973764 new file mode 100644 index 0000000..37a459e Binary files /dev/null and b/assets/Filecfg/6941721697424973764 differ diff --git a/assets/Filecfg/7001144833812547231 b/assets/Filecfg/7001144833812547231 new file mode 100644 index 0000000..17f7035 Binary files /dev/null and b/assets/Filecfg/7001144833812547231 differ diff --git a/assets/Filecfg/7011738137837809076 b/assets/Filecfg/7011738137837809076 new file mode 100644 index 0000000..7f2dc03 Binary files /dev/null and b/assets/Filecfg/7011738137837809076 differ diff --git a/assets/Filecfg/7030817949299661269 b/assets/Filecfg/7030817949299661269 new file mode 100644 index 0000000..c401acb Binary files /dev/null and b/assets/Filecfg/7030817949299661269 differ diff --git a/assets/Filecfg/7046167479044756840 b/assets/Filecfg/7046167479044756840 new file mode 100644 index 0000000..1d7a095 Binary files /dev/null and b/assets/Filecfg/7046167479044756840 differ diff --git a/assets/Filecfg/7051302360825128375 b/assets/Filecfg/7051302360825128375 new file mode 100644 index 0000000..44e086e Binary files /dev/null and b/assets/Filecfg/7051302360825128375 differ diff --git a/assets/Filecfg/7057820080930574222 b/assets/Filecfg/7057820080930574222 new file mode 100644 index 0000000..b37021f Binary files /dev/null and b/assets/Filecfg/7057820080930574222 differ diff --git a/assets/Filecfg/708066623181265654 b/assets/Filecfg/708066623181265654 new file mode 100644 index 0000000..61526f7 Binary files /dev/null and b/assets/Filecfg/708066623181265654 differ diff --git a/assets/Filecfg/7087891702701456780 b/assets/Filecfg/7087891702701456780 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/7087891702701456780 differ diff --git a/assets/Filecfg/7120358968393608637 b/assets/Filecfg/7120358968393608637 new file mode 100644 index 0000000..3425613 Binary files /dev/null and b/assets/Filecfg/7120358968393608637 differ diff --git a/assets/Filecfg/7141826777393398338 b/assets/Filecfg/7141826777393398338 new file mode 100644 index 0000000..6224a62 Binary files /dev/null and b/assets/Filecfg/7141826777393398338 differ diff --git a/assets/Filecfg/7162529132440428623 b/assets/Filecfg/7162529132440428623 new file mode 100644 index 0000000..227f28b Binary files /dev/null and b/assets/Filecfg/7162529132440428623 differ diff --git a/assets/Filecfg/7169585438842254010 b/assets/Filecfg/7169585438842254010 new file mode 100644 index 0000000..de1cf1a Binary files /dev/null and b/assets/Filecfg/7169585438842254010 differ diff --git a/assets/Filecfg/7173540617430375709 b/assets/Filecfg/7173540617430375709 new file mode 100644 index 0000000..ae22244 Binary files /dev/null and b/assets/Filecfg/7173540617430375709 differ diff --git a/assets/Filecfg/7180571613805754292 b/assets/Filecfg/7180571613805754292 new file mode 100644 index 0000000..a5632e6 Binary files /dev/null and b/assets/Filecfg/7180571613805754292 differ diff --git a/assets/Filecfg/7182609167982907788 b/assets/Filecfg/7182609167982907788 new file mode 100644 index 0000000..0525699 Binary files /dev/null and b/assets/Filecfg/7182609167982907788 differ diff --git a/assets/Filecfg/7190999988002719754 b/assets/Filecfg/7190999988002719754 new file mode 100644 index 0000000..1c8187c Binary files /dev/null and b/assets/Filecfg/7190999988002719754 differ diff --git a/assets/Filecfg/7198191077222570883 b/assets/Filecfg/7198191077222570883 new file mode 100644 index 0000000..50bd544 Binary files /dev/null and b/assets/Filecfg/7198191077222570883 differ diff --git a/assets/Filecfg/7209791037652234772 b/assets/Filecfg/7209791037652234772 new file mode 100644 index 0000000..0eb69ea Binary files /dev/null and b/assets/Filecfg/7209791037652234772 differ diff --git a/assets/Filecfg/7212677034780886850 b/assets/Filecfg/7212677034780886850 new file mode 100644 index 0000000..87d7c34 Binary files /dev/null and b/assets/Filecfg/7212677034780886850 differ diff --git a/assets/Filecfg/7218943265950679503 b/assets/Filecfg/7218943265950679503 new file mode 100644 index 0000000..570d6f6 Binary files /dev/null and b/assets/Filecfg/7218943265950679503 differ diff --git a/assets/Filecfg/723690312347539887 b/assets/Filecfg/723690312347539887 new file mode 100644 index 0000000..b325fba Binary files /dev/null and b/assets/Filecfg/723690312347539887 differ diff --git a/assets/Filecfg/7239635034267373801 b/assets/Filecfg/7239635034267373801 new file mode 100644 index 0000000..9539c79 Binary files /dev/null and b/assets/Filecfg/7239635034267373801 differ diff --git a/assets/Filecfg/7250095079405484598 b/assets/Filecfg/7250095079405484598 new file mode 100644 index 0000000..44dac8d Binary files /dev/null and b/assets/Filecfg/7250095079405484598 differ diff --git a/assets/Filecfg/7250327834753341237 b/assets/Filecfg/7250327834753341237 new file mode 100644 index 0000000..ef10e0c Binary files /dev/null and b/assets/Filecfg/7250327834753341237 differ diff --git a/assets/Filecfg/7268064813769085440 b/assets/Filecfg/7268064813769085440 new file mode 100644 index 0000000..1496995 Binary files /dev/null and b/assets/Filecfg/7268064813769085440 differ diff --git a/assets/Filecfg/7311442373878923176 b/assets/Filecfg/7311442373878923176 new file mode 100644 index 0000000..4b1a541 Binary files /dev/null and b/assets/Filecfg/7311442373878923176 differ diff --git a/assets/Filecfg/7319824502586803861 b/assets/Filecfg/7319824502586803861 new file mode 100644 index 0000000..6986079 Binary files /dev/null and b/assets/Filecfg/7319824502586803861 differ diff --git a/assets/Filecfg/7331084814745371929 b/assets/Filecfg/7331084814745371929 new file mode 100644 index 0000000..f9486df Binary files /dev/null and b/assets/Filecfg/7331084814745371929 differ diff --git a/assets/Filecfg/7405348821674496753 b/assets/Filecfg/7405348821674496753 new file mode 100644 index 0000000..6b0ccbc Binary files /dev/null and b/assets/Filecfg/7405348821674496753 differ diff --git a/assets/Filecfg/7408572754356014100 b/assets/Filecfg/7408572754356014100 new file mode 100644 index 0000000..afa631c Binary files /dev/null and b/assets/Filecfg/7408572754356014100 differ diff --git a/assets/Filecfg/7427637773170975488 b/assets/Filecfg/7427637773170975488 new file mode 100644 index 0000000..da3868a Binary files /dev/null and b/assets/Filecfg/7427637773170975488 differ diff --git a/assets/Filecfg/7442332404038222688 b/assets/Filecfg/7442332404038222688 new file mode 100644 index 0000000..75f2d0b Binary files /dev/null and b/assets/Filecfg/7442332404038222688 differ diff --git a/assets/Filecfg/7472501407775985718 b/assets/Filecfg/7472501407775985718 new file mode 100644 index 0000000..0feb0f0 Binary files /dev/null and b/assets/Filecfg/7472501407775985718 differ diff --git a/assets/Filecfg/7473855951945249780 b/assets/Filecfg/7473855951945249780 new file mode 100644 index 0000000..0dfe502 Binary files /dev/null and b/assets/Filecfg/7473855951945249780 differ diff --git a/assets/Filecfg/7506836345910041654 b/assets/Filecfg/7506836345910041654 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/7506836345910041654 differ diff --git a/assets/Filecfg/7508608714015708012 b/assets/Filecfg/7508608714015708012 new file mode 100644 index 0000000..73bef1b Binary files /dev/null and b/assets/Filecfg/7508608714015708012 differ diff --git a/assets/Filecfg/7526289770049199415 b/assets/Filecfg/7526289770049199415 new file mode 100644 index 0000000..0a317b4 Binary files /dev/null and b/assets/Filecfg/7526289770049199415 differ diff --git a/assets/Filecfg/7528100220914435851 b/assets/Filecfg/7528100220914435851 new file mode 100644 index 0000000..23d8f93 Binary files /dev/null and b/assets/Filecfg/7528100220914435851 differ diff --git a/assets/Filecfg/7547982117909530468 b/assets/Filecfg/7547982117909530468 new file mode 100644 index 0000000..aa2c7fc Binary files /dev/null and b/assets/Filecfg/7547982117909530468 differ diff --git a/assets/Filecfg/7551313784087570641 b/assets/Filecfg/7551313784087570641 new file mode 100644 index 0000000..f24a920 Binary files /dev/null and b/assets/Filecfg/7551313784087570641 differ diff --git a/assets/Filecfg/7582542723069570376 b/assets/Filecfg/7582542723069570376 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/7582542723069570376 differ diff --git a/assets/Filecfg/7590111018438936693 b/assets/Filecfg/7590111018438936693 new file mode 100644 index 0000000..be7e98c Binary files /dev/null and b/assets/Filecfg/7590111018438936693 differ diff --git a/assets/Filecfg/7624277123107507921 b/assets/Filecfg/7624277123107507921 new file mode 100644 index 0000000..795b58b Binary files /dev/null and b/assets/Filecfg/7624277123107507921 differ diff --git a/assets/Filecfg/7664606656836329748 b/assets/Filecfg/7664606656836329748 new file mode 100644 index 0000000..f21538f Binary files /dev/null and b/assets/Filecfg/7664606656836329748 differ diff --git a/assets/Filecfg/766628786739420425 b/assets/Filecfg/766628786739420425 new file mode 100644 index 0000000..5902396 Binary files /dev/null and b/assets/Filecfg/766628786739420425 differ diff --git a/assets/Filecfg/7724458189753760037 b/assets/Filecfg/7724458189753760037 new file mode 100644 index 0000000..516a8a5 Binary files /dev/null and b/assets/Filecfg/7724458189753760037 differ diff --git a/assets/Filecfg/7736454529302382901 b/assets/Filecfg/7736454529302382901 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/7736454529302382901 differ diff --git a/assets/Filecfg/7742202155848433127 b/assets/Filecfg/7742202155848433127 new file mode 100644 index 0000000..010b1e5 Binary files /dev/null and b/assets/Filecfg/7742202155848433127 differ diff --git a/assets/Filecfg/7748376448209488322 b/assets/Filecfg/7748376448209488322 new file mode 100644 index 0000000..dc56add Binary files /dev/null and b/assets/Filecfg/7748376448209488322 differ diff --git a/assets/Filecfg/7786713688702736436 b/assets/Filecfg/7786713688702736436 new file mode 100644 index 0000000..f400f17 Binary files /dev/null and b/assets/Filecfg/7786713688702736436 differ diff --git a/assets/Filecfg/7792309304550418807 b/assets/Filecfg/7792309304550418807 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/7792309304550418807 differ diff --git a/assets/Filecfg/7813393483149197176 b/assets/Filecfg/7813393483149197176 new file mode 100644 index 0000000..1cd3a6d Binary files /dev/null and b/assets/Filecfg/7813393483149197176 differ diff --git a/assets/Filecfg/781419333931468835 b/assets/Filecfg/781419333931468835 new file mode 100644 index 0000000..ae98225 Binary files /dev/null and b/assets/Filecfg/781419333931468835 differ diff --git a/assets/Filecfg/7828910871119522531 b/assets/Filecfg/7828910871119522531 new file mode 100644 index 0000000..7e56e8c Binary files /dev/null and b/assets/Filecfg/7828910871119522531 differ diff --git a/assets/Filecfg/7834636393766946678 b/assets/Filecfg/7834636393766946678 new file mode 100644 index 0000000..f238c1c Binary files /dev/null and b/assets/Filecfg/7834636393766946678 differ diff --git a/assets/Filecfg/7848515778940555130 b/assets/Filecfg/7848515778940555130 new file mode 100644 index 0000000..a056480 Binary files /dev/null and b/assets/Filecfg/7848515778940555130 differ diff --git a/assets/Filecfg/7879873639924936388 b/assets/Filecfg/7879873639924936388 new file mode 100644 index 0000000..1b07b39 Binary files /dev/null and b/assets/Filecfg/7879873639924936388 differ diff --git a/assets/Filecfg/7893056275979074529 b/assets/Filecfg/7893056275979074529 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/7893056275979074529 differ diff --git a/assets/Filecfg/7894957784507733531 b/assets/Filecfg/7894957784507733531 new file mode 100644 index 0000000..5352f07 Binary files /dev/null and b/assets/Filecfg/7894957784507733531 differ diff --git a/assets/Filecfg/7901115025451095874 b/assets/Filecfg/7901115025451095874 new file mode 100644 index 0000000..a75f0d5 Binary files /dev/null and b/assets/Filecfg/7901115025451095874 differ diff --git a/assets/Filecfg/7908754707154632059 b/assets/Filecfg/7908754707154632059 new file mode 100644 index 0000000..364d561 Binary files /dev/null and b/assets/Filecfg/7908754707154632059 differ diff --git a/assets/Filecfg/7911460613507447756 b/assets/Filecfg/7911460613507447756 new file mode 100644 index 0000000..e5e344e Binary files /dev/null and b/assets/Filecfg/7911460613507447756 differ diff --git a/assets/Filecfg/7931004587574038476 b/assets/Filecfg/7931004587574038476 new file mode 100644 index 0000000..bb5cea3 Binary files /dev/null and b/assets/Filecfg/7931004587574038476 differ diff --git a/assets/Filecfg/7936003670498878436 b/assets/Filecfg/7936003670498878436 new file mode 100644 index 0000000..8a823fb Binary files /dev/null and b/assets/Filecfg/7936003670498878436 differ diff --git a/assets/Filecfg/7971815614617610191 b/assets/Filecfg/7971815614617610191 new file mode 100644 index 0000000..be484cc Binary files /dev/null and b/assets/Filecfg/7971815614617610191 differ diff --git a/assets/Filecfg/8027688342001646977 b/assets/Filecfg/8027688342001646977 new file mode 100644 index 0000000..4f14345 Binary files /dev/null and b/assets/Filecfg/8027688342001646977 differ diff --git a/assets/Filecfg/8050366203177089831 b/assets/Filecfg/8050366203177089831 new file mode 100644 index 0000000..816979c Binary files /dev/null and b/assets/Filecfg/8050366203177089831 differ diff --git a/assets/Filecfg/8062797356143764877 b/assets/Filecfg/8062797356143764877 new file mode 100644 index 0000000..52e7088 Binary files /dev/null and b/assets/Filecfg/8062797356143764877 differ diff --git a/assets/Filecfg/8086154499671606560 b/assets/Filecfg/8086154499671606560 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/8086154499671606560 differ diff --git a/assets/Filecfg/8101003333114683111 b/assets/Filecfg/8101003333114683111 new file mode 100644 index 0000000..9d55385 Binary files /dev/null and b/assets/Filecfg/8101003333114683111 differ diff --git a/assets/Filecfg/8156868536333564561 b/assets/Filecfg/8156868536333564561 new file mode 100644 index 0000000..4aa5bf1 Binary files /dev/null and b/assets/Filecfg/8156868536333564561 differ diff --git a/assets/Filecfg/8175365764534371349 b/assets/Filecfg/8175365764534371349 new file mode 100644 index 0000000..6c9db09 Binary files /dev/null and b/assets/Filecfg/8175365764534371349 differ diff --git a/assets/Filecfg/8184344771834509870 b/assets/Filecfg/8184344771834509870 new file mode 100644 index 0000000..2e7554f Binary files /dev/null and b/assets/Filecfg/8184344771834509870 differ diff --git a/assets/Filecfg/8217425671041376379 b/assets/Filecfg/8217425671041376379 new file mode 100644 index 0000000..b04900d Binary files /dev/null and b/assets/Filecfg/8217425671041376379 differ diff --git a/assets/Filecfg/8238330479339169855 b/assets/Filecfg/8238330479339169855 new file mode 100644 index 0000000..171da7a Binary files /dev/null and b/assets/Filecfg/8238330479339169855 differ diff --git a/assets/Filecfg/8247785116158566912 b/assets/Filecfg/8247785116158566912 new file mode 100644 index 0000000..7c087c7 Binary files /dev/null and b/assets/Filecfg/8247785116158566912 differ diff --git a/assets/Filecfg/8250335477554233941 b/assets/Filecfg/8250335477554233941 new file mode 100644 index 0000000..37b061b Binary files /dev/null and b/assets/Filecfg/8250335477554233941 differ diff --git a/assets/Filecfg/8255237385185724297 b/assets/Filecfg/8255237385185724297 new file mode 100644 index 0000000..708153a Binary files /dev/null and b/assets/Filecfg/8255237385185724297 differ diff --git a/assets/Filecfg/8263094187038505641 b/assets/Filecfg/8263094187038505641 new file mode 100644 index 0000000..e6f60cd Binary files /dev/null and b/assets/Filecfg/8263094187038505641 differ diff --git a/assets/Filecfg/828056376203326553 b/assets/Filecfg/828056376203326553 new file mode 100644 index 0000000..9ebe48c Binary files /dev/null and b/assets/Filecfg/828056376203326553 differ diff --git a/assets/Filecfg/8321467627018168117 b/assets/Filecfg/8321467627018168117 new file mode 100644 index 0000000..54387d6 Binary files /dev/null and b/assets/Filecfg/8321467627018168117 differ diff --git a/assets/Filecfg/8325824682387933807 b/assets/Filecfg/8325824682387933807 new file mode 100644 index 0000000..182f647 Binary files /dev/null and b/assets/Filecfg/8325824682387933807 differ diff --git a/assets/Filecfg/8334915805853391523 b/assets/Filecfg/8334915805853391523 new file mode 100644 index 0000000..cc8bb27 Binary files /dev/null and b/assets/Filecfg/8334915805853391523 differ diff --git a/assets/Filecfg/8346674518396583610 b/assets/Filecfg/8346674518396583610 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/8346674518396583610 differ diff --git a/assets/Filecfg/8372357115379337292 b/assets/Filecfg/8372357115379337292 new file mode 100644 index 0000000..311abdb Binary files /dev/null and b/assets/Filecfg/8372357115379337292 differ diff --git a/assets/Filecfg/8414088752704172220 b/assets/Filecfg/8414088752704172220 new file mode 100644 index 0000000..ec83f71 Binary files /dev/null and b/assets/Filecfg/8414088752704172220 differ diff --git a/assets/Filecfg/8423183413999768910 b/assets/Filecfg/8423183413999768910 new file mode 100644 index 0000000..059554c Binary files /dev/null and b/assets/Filecfg/8423183413999768910 differ diff --git a/assets/Filecfg/8427886683727920394 b/assets/Filecfg/8427886683727920394 new file mode 100644 index 0000000..778c8fb Binary files /dev/null and b/assets/Filecfg/8427886683727920394 differ diff --git a/assets/Filecfg/8438608575385583409 b/assets/Filecfg/8438608575385583409 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/8438608575385583409 differ diff --git a/assets/Filecfg/8440346875689163448 b/assets/Filecfg/8440346875689163448 new file mode 100644 index 0000000..f067d71 Binary files /dev/null and b/assets/Filecfg/8440346875689163448 differ diff --git a/assets/Filecfg/8452193808770671395 b/assets/Filecfg/8452193808770671395 new file mode 100644 index 0000000..5791f49 Binary files /dev/null and b/assets/Filecfg/8452193808770671395 differ diff --git a/assets/Filecfg/8460749846310410997 b/assets/Filecfg/8460749846310410997 new file mode 100644 index 0000000..b36954e Binary files /dev/null and b/assets/Filecfg/8460749846310410997 differ diff --git a/assets/Filecfg/8474112736325860281 b/assets/Filecfg/8474112736325860281 new file mode 100644 index 0000000..d4b1f5c Binary files /dev/null and b/assets/Filecfg/8474112736325860281 differ diff --git a/assets/Filecfg/848336827277675618 b/assets/Filecfg/848336827277675618 new file mode 100644 index 0000000..48937f7 Binary files /dev/null and b/assets/Filecfg/848336827277675618 differ diff --git a/assets/Filecfg/85070725188803265 b/assets/Filecfg/85070725188803265 new file mode 100644 index 0000000..2b75ff3 Binary files /dev/null and b/assets/Filecfg/85070725188803265 differ diff --git a/assets/Filecfg/8549530509245269722 b/assets/Filecfg/8549530509245269722 new file mode 100644 index 0000000..83af5d0 Binary files /dev/null and b/assets/Filecfg/8549530509245269722 differ diff --git a/assets/Filecfg/8550038072630473629 b/assets/Filecfg/8550038072630473629 new file mode 100644 index 0000000..3b1c633 Binary files /dev/null and b/assets/Filecfg/8550038072630473629 differ diff --git a/assets/Filecfg/8559480722930511057 b/assets/Filecfg/8559480722930511057 new file mode 100644 index 0000000..99d33da Binary files /dev/null and b/assets/Filecfg/8559480722930511057 differ diff --git a/assets/Filecfg/8590908186037251559 b/assets/Filecfg/8590908186037251559 new file mode 100644 index 0000000..21dde00 Binary files /dev/null and b/assets/Filecfg/8590908186037251559 differ diff --git a/assets/Filecfg/859625879752109210 b/assets/Filecfg/859625879752109210 new file mode 100644 index 0000000..027f912 Binary files /dev/null and b/assets/Filecfg/859625879752109210 differ diff --git a/assets/Filecfg/8598062458901851960 b/assets/Filecfg/8598062458901851960 new file mode 100644 index 0000000..e347fed Binary files /dev/null and b/assets/Filecfg/8598062458901851960 differ diff --git a/assets/Filecfg/8626789370395767000 b/assets/Filecfg/8626789370395767000 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/8626789370395767000 differ diff --git a/assets/Filecfg/8677563882817361889 b/assets/Filecfg/8677563882817361889 new file mode 100644 index 0000000..9d16691 Binary files /dev/null and b/assets/Filecfg/8677563882817361889 differ diff --git a/assets/Filecfg/8679261923045226816 b/assets/Filecfg/8679261923045226816 new file mode 100644 index 0000000..84bc79e Binary files /dev/null and b/assets/Filecfg/8679261923045226816 differ diff --git a/assets/Filecfg/8685563037247385093 b/assets/Filecfg/8685563037247385093 new file mode 100644 index 0000000..5bc160e Binary files /dev/null and b/assets/Filecfg/8685563037247385093 differ diff --git a/assets/Filecfg/8695388784892993671 b/assets/Filecfg/8695388784892993671 new file mode 100644 index 0000000..bc7b442 Binary files /dev/null and b/assets/Filecfg/8695388784892993671 differ diff --git a/assets/Filecfg/8716358915657733872 b/assets/Filecfg/8716358915657733872 new file mode 100644 index 0000000..1626898 Binary files /dev/null and b/assets/Filecfg/8716358915657733872 differ diff --git a/assets/Filecfg/8719221542142925258 b/assets/Filecfg/8719221542142925258 new file mode 100644 index 0000000..32df601 Binary files /dev/null and b/assets/Filecfg/8719221542142925258 differ diff --git a/assets/Filecfg/8729696361346081291 b/assets/Filecfg/8729696361346081291 new file mode 100644 index 0000000..57d86aa Binary files /dev/null and b/assets/Filecfg/8729696361346081291 differ diff --git a/assets/Filecfg/877572054287999288 b/assets/Filecfg/877572054287999288 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/877572054287999288 differ diff --git a/assets/Filecfg/8779429102941650428 b/assets/Filecfg/8779429102941650428 new file mode 100644 index 0000000..a8ec2dc Binary files /dev/null and b/assets/Filecfg/8779429102941650428 differ diff --git a/assets/Filecfg/8798903072746402610 b/assets/Filecfg/8798903072746402610 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/8798903072746402610 differ diff --git a/assets/Filecfg/8803447847625139883 b/assets/Filecfg/8803447847625139883 new file mode 100644 index 0000000..7cb0776 Binary files /dev/null and b/assets/Filecfg/8803447847625139883 differ diff --git a/assets/Filecfg/8809758175783275198 b/assets/Filecfg/8809758175783275198 new file mode 100644 index 0000000..c5f38ad Binary files /dev/null and b/assets/Filecfg/8809758175783275198 differ diff --git a/assets/Filecfg/8845029306532149380 b/assets/Filecfg/8845029306532149380 new file mode 100644 index 0000000..8b37b45 Binary files /dev/null and b/assets/Filecfg/8845029306532149380 differ diff --git a/assets/Filecfg/8872047814460235401 b/assets/Filecfg/8872047814460235401 new file mode 100644 index 0000000..dc5a7b6 Binary files /dev/null and b/assets/Filecfg/8872047814460235401 differ diff --git a/assets/Filecfg/8872377035075937123 b/assets/Filecfg/8872377035075937123 new file mode 100644 index 0000000..9b7f2d0 Binary files /dev/null and b/assets/Filecfg/8872377035075937123 differ diff --git a/assets/Filecfg/8872452560058994030 b/assets/Filecfg/8872452560058994030 new file mode 100644 index 0000000..2c216f7 Binary files /dev/null and b/assets/Filecfg/8872452560058994030 differ diff --git a/assets/Filecfg/8880028015680628287 b/assets/Filecfg/8880028015680628287 new file mode 100644 index 0000000..858ad6f Binary files /dev/null and b/assets/Filecfg/8880028015680628287 differ diff --git a/assets/Filecfg/8937175177938765831 b/assets/Filecfg/8937175177938765831 new file mode 100644 index 0000000..546f992 Binary files /dev/null and b/assets/Filecfg/8937175177938765831 differ diff --git a/assets/Filecfg/8951893546700102005 b/assets/Filecfg/8951893546700102005 new file mode 100644 index 0000000..58d9992 Binary files /dev/null and b/assets/Filecfg/8951893546700102005 differ diff --git a/assets/Filecfg/8959272498091446370 b/assets/Filecfg/8959272498091446370 new file mode 100644 index 0000000..622e407 Binary files /dev/null and b/assets/Filecfg/8959272498091446370 differ diff --git a/assets/Filecfg/8961185141736945526 b/assets/Filecfg/8961185141736945526 new file mode 100644 index 0000000..1688067 Binary files /dev/null and b/assets/Filecfg/8961185141736945526 differ diff --git a/assets/Filecfg/8970734175279121870 b/assets/Filecfg/8970734175279121870 new file mode 100644 index 0000000..c266b99 Binary files /dev/null and b/assets/Filecfg/8970734175279121870 differ diff --git a/assets/Filecfg/8985622331091516613 b/assets/Filecfg/8985622331091516613 new file mode 100644 index 0000000..f14c50a Binary files /dev/null and b/assets/Filecfg/8985622331091516613 differ diff --git a/assets/Filecfg/9030987216080192771 b/assets/Filecfg/9030987216080192771 new file mode 100644 index 0000000..0e6e9e8 Binary files /dev/null and b/assets/Filecfg/9030987216080192771 differ diff --git a/assets/Filecfg/9033112072321845430 b/assets/Filecfg/9033112072321845430 new file mode 100644 index 0000000..dc21518 Binary files /dev/null and b/assets/Filecfg/9033112072321845430 differ diff --git a/assets/Filecfg/903482074700089401 b/assets/Filecfg/903482074700089401 new file mode 100644 index 0000000..a58b6b6 Binary files /dev/null and b/assets/Filecfg/903482074700089401 differ diff --git a/assets/Filecfg/905281217711625678 b/assets/Filecfg/905281217711625678 new file mode 100644 index 0000000..93518a6 Binary files /dev/null and b/assets/Filecfg/905281217711625678 differ diff --git a/assets/Filecfg/9064693920417212588 b/assets/Filecfg/9064693920417212588 new file mode 100644 index 0000000..1669ad4 Binary files /dev/null and b/assets/Filecfg/9064693920417212588 differ diff --git a/assets/Filecfg/9087871170656055284 b/assets/Filecfg/9087871170656055284 new file mode 100644 index 0000000..40134ef Binary files /dev/null and b/assets/Filecfg/9087871170656055284 differ diff --git a/assets/Filecfg/9099834627053784232 b/assets/Filecfg/9099834627053784232 new file mode 100644 index 0000000..97633a9 Binary files /dev/null and b/assets/Filecfg/9099834627053784232 differ diff --git a/assets/Filecfg/9126199833091859762 b/assets/Filecfg/9126199833091859762 new file mode 100644 index 0000000..163e5c7 Binary files /dev/null and b/assets/Filecfg/9126199833091859762 differ diff --git a/assets/Filecfg/9130693811865081476 b/assets/Filecfg/9130693811865081476 new file mode 100644 index 0000000..cb6f497 Binary files /dev/null and b/assets/Filecfg/9130693811865081476 differ diff --git a/assets/Filecfg/9135930614063381672 b/assets/Filecfg/9135930614063381672 new file mode 100644 index 0000000..aaf75da Binary files /dev/null and b/assets/Filecfg/9135930614063381672 differ diff --git a/assets/Filecfg/9137130419922174585 b/assets/Filecfg/9137130419922174585 new file mode 100644 index 0000000..29d164b Binary files /dev/null and b/assets/Filecfg/9137130419922174585 differ diff --git a/assets/Filecfg/9141409437965288128 b/assets/Filecfg/9141409437965288128 new file mode 100644 index 0000000..6069815 Binary files /dev/null and b/assets/Filecfg/9141409437965288128 differ diff --git a/assets/Filecfg/9145599323473507780 b/assets/Filecfg/9145599323473507780 new file mode 100644 index 0000000..5d15335 Binary files /dev/null and b/assets/Filecfg/9145599323473507780 differ diff --git a/assets/Filecfg/9153764265796743942 b/assets/Filecfg/9153764265796743942 new file mode 100644 index 0000000..600c189 Binary files /dev/null and b/assets/Filecfg/9153764265796743942 differ diff --git a/assets/Filecfg/9201692730144629542 b/assets/Filecfg/9201692730144629542 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/9201692730144629542 differ diff --git a/assets/Filecfg/9206557182427272968 b/assets/Filecfg/9206557182427272968 new file mode 100644 index 0000000..84619b4 Binary files /dev/null and b/assets/Filecfg/9206557182427272968 differ diff --git a/assets/Filecfg/9258232675512883798 b/assets/Filecfg/9258232675512883798 new file mode 100644 index 0000000..2f291e5 Binary files /dev/null and b/assets/Filecfg/9258232675512883798 differ diff --git a/assets/Filecfg/9258873494249717930 b/assets/Filecfg/9258873494249717930 new file mode 100644 index 0000000..e992e0e Binary files /dev/null and b/assets/Filecfg/9258873494249717930 differ diff --git a/assets/Filecfg/9326665936409759579 b/assets/Filecfg/9326665936409759579 new file mode 100644 index 0000000..9c21b71 Binary files /dev/null and b/assets/Filecfg/9326665936409759579 differ diff --git a/assets/Filecfg/9329167680433812008 b/assets/Filecfg/9329167680433812008 new file mode 100644 index 0000000..46c9aa8 Binary files /dev/null and b/assets/Filecfg/9329167680433812008 differ diff --git a/assets/Filecfg/9331034127907776777 b/assets/Filecfg/9331034127907776777 new file mode 100644 index 0000000..4672d1d Binary files /dev/null and b/assets/Filecfg/9331034127907776777 differ diff --git a/assets/Filecfg/9335870077406161015 b/assets/Filecfg/9335870077406161015 new file mode 100644 index 0000000..fab0336 Binary files /dev/null and b/assets/Filecfg/9335870077406161015 differ diff --git a/assets/Filecfg/9337240458718602058 b/assets/Filecfg/9337240458718602058 new file mode 100644 index 0000000..eea79c3 Binary files /dev/null and b/assets/Filecfg/9337240458718602058 differ diff --git a/assets/Filecfg/933954710001114044 b/assets/Filecfg/933954710001114044 new file mode 100644 index 0000000..d9daa65 Binary files /dev/null and b/assets/Filecfg/933954710001114044 differ diff --git a/assets/Filecfg/940073597227482778 b/assets/Filecfg/940073597227482778 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/940073597227482778 differ diff --git a/assets/Filecfg/9444633967657090670 b/assets/Filecfg/9444633967657090670 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/9444633967657090670 differ diff --git a/assets/Filecfg/9448624827259043379 b/assets/Filecfg/9448624827259043379 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/9448624827259043379 differ diff --git a/assets/Filecfg/9459503375186787325 b/assets/Filecfg/9459503375186787325 new file mode 100644 index 0000000..eed2dae Binary files /dev/null and b/assets/Filecfg/9459503375186787325 differ diff --git a/assets/Filecfg/9465188592908203808 b/assets/Filecfg/9465188592908203808 new file mode 100644 index 0000000..6faa1d6 Binary files /dev/null and b/assets/Filecfg/9465188592908203808 differ diff --git a/assets/Filecfg/9493336127098324892 b/assets/Filecfg/9493336127098324892 new file mode 100644 index 0000000..ca3dae5 Binary files /dev/null and b/assets/Filecfg/9493336127098324892 differ diff --git a/assets/Filecfg/9499293573010721560 b/assets/Filecfg/9499293573010721560 new file mode 100644 index 0000000..42177a2 Binary files /dev/null and b/assets/Filecfg/9499293573010721560 differ diff --git a/assets/Filecfg/9505511188509173579 b/assets/Filecfg/9505511188509173579 new file mode 100644 index 0000000..1f18b2f Binary files /dev/null and b/assets/Filecfg/9505511188509173579 differ diff --git a/assets/Filecfg/9515828890157155341 b/assets/Filecfg/9515828890157155341 new file mode 100644 index 0000000..adda9e3 Binary files /dev/null and b/assets/Filecfg/9515828890157155341 differ diff --git a/assets/Filecfg/9523705909030256855 b/assets/Filecfg/9523705909030256855 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/9523705909030256855 differ diff --git a/assets/Filecfg/9573918954488329199 b/assets/Filecfg/9573918954488329199 new file mode 100644 index 0000000..565a1c7 Binary files /dev/null and b/assets/Filecfg/9573918954488329199 differ diff --git a/assets/Filecfg/9590823707900079479 b/assets/Filecfg/9590823707900079479 new file mode 100644 index 0000000..6cadd57 Binary files /dev/null and b/assets/Filecfg/9590823707900079479 differ diff --git a/assets/Filecfg/9596679144362003011 b/assets/Filecfg/9596679144362003011 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/9596679144362003011 differ diff --git a/assets/Filecfg/9612311876650013013 b/assets/Filecfg/9612311876650013013 new file mode 100644 index 0000000..b1c1e26 Binary files /dev/null and b/assets/Filecfg/9612311876650013013 differ diff --git a/assets/Filecfg/9634120457077202900 b/assets/Filecfg/9634120457077202900 new file mode 100644 index 0000000..f0240b0 Binary files /dev/null and b/assets/Filecfg/9634120457077202900 differ diff --git a/assets/Filecfg/9663857087711171314 b/assets/Filecfg/9663857087711171314 new file mode 100644 index 0000000..2dc7b2a Binary files /dev/null and b/assets/Filecfg/9663857087711171314 differ diff --git a/assets/Filecfg/9666108443210717102 b/assets/Filecfg/9666108443210717102 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/9666108443210717102 differ diff --git a/assets/Filecfg/9695468580974720779 b/assets/Filecfg/9695468580974720779 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/9695468580974720779 differ diff --git a/assets/Filecfg/9779317207751653756 b/assets/Filecfg/9779317207751653756 new file mode 100644 index 0000000..c6583ee Binary files /dev/null and b/assets/Filecfg/9779317207751653756 differ diff --git a/assets/Filecfg/9799352662332638841 b/assets/Filecfg/9799352662332638841 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/9799352662332638841 differ diff --git a/assets/Filecfg/9833455141632462445 b/assets/Filecfg/9833455141632462445 new file mode 100644 index 0000000..416b1fa Binary files /dev/null and b/assets/Filecfg/9833455141632462445 differ diff --git a/assets/Filecfg/9839361577377760518 b/assets/Filecfg/9839361577377760518 new file mode 100644 index 0000000..05f1675 Binary files /dev/null and b/assets/Filecfg/9839361577377760518 differ diff --git a/assets/Filecfg/9878148909610449168 b/assets/Filecfg/9878148909610449168 new file mode 100644 index 0000000..ebc32ad Binary files /dev/null and b/assets/Filecfg/9878148909610449168 differ diff --git a/assets/Filecfg/9903627260419294647 b/assets/Filecfg/9903627260419294647 new file mode 100644 index 0000000..dde8fb2 Binary files /dev/null and b/assets/Filecfg/9903627260419294647 differ diff --git a/assets/Filecfg/9911005749735895956 b/assets/Filecfg/9911005749735895956 new file mode 100644 index 0000000..2a1f002 Binary files /dev/null and b/assets/Filecfg/9911005749735895956 differ diff --git a/assets/Filecfg/9931621731592481460 b/assets/Filecfg/9931621731592481460 new file mode 100644 index 0000000..f768b0c Binary files /dev/null and b/assets/Filecfg/9931621731592481460 differ diff --git a/assets/Filecfg/9943738889816267402 b/assets/Filecfg/9943738889816267402 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/9943738889816267402 differ diff --git a/assets/Filecfg/9988821387577408331 b/assets/Filecfg/9988821387577408331 new file mode 100644 index 0000000..5b0dab0 Binary files /dev/null and b/assets/Filecfg/9988821387577408331 differ diff --git a/assets/LevelProcess/Hollow/Chessboard/Chessboard_10002.json b/assets/LevelProcess/Hollow/Chessboard/Chessboard_10002.json new file mode 100644 index 0000000..b7b8490 --- /dev/null +++ b/assets/LevelProcess/Hollow/Chessboard/Chessboard_10002.json @@ -0,0 +1,1517 @@ +{ + "ID": 10002, + "DefaultPlayerPos": { "X": 0, "Y": 5 }, + "DefaultSectionIndex": 0, + "Sections": [ + { + "Grids": [ + { + "Position": { + "X": 21, + "Y": 7 + }, + "NodeState": "Locked", + "NodeVisible": "VisibleByTriggerEvent", + "GridLinks": [ + "Up", + "Right" + ], + "GridFlags": [ + "CanTriggerEvent", + "VisibleByTriggerEvent", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 23, + "Y": 7 + }, + "NodeState": "Locked", + "NodeVisible": "VisibleByTriggerEvent", + "GridLinks": [ + "Left", + "Up" + ], + "GridFlags": [ + "CanTriggerEvent", + "VisibleByTriggerEvent", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 18, + "Y": 3 + }, + "NodeState": "Locked", + "NodeVisible": "VisibleByTriggerEvent", + "GridLinks": [ + "Left", + "Up", + "Right", + "Down" + ], + "GridFlags": [ + "CanTriggerEvent", + "VisibleByTriggerEvent", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 23, + "Y": 6 + }, + "NodeState": "ShowEvent", + "NodeVisible": "VisibleByTriggerEvent", + "GridLinks": [ + "Left", + "Up", + "Down" + ], + "GridFlags": [ + "ShowEventType", + "ShowEventId", + "CanTriggerEvent", + "VisibleByTriggerEvent", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 18, + "Y": 2 + }, + "NodeState": "ShowEvent", + "NodeVisible": "VisibleByTriggerEvent", + "GridLinks": [ + "Left", + "Up", + "Right", + "Down" + ], + "GridFlags": [ + "Core", + "ShowEventType", + "ShowEventId", + "CanTriggerEvent", + "VisibleByTriggerEvent", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 10, + "Y": 5 + }, + "NodeState": "Locked", + "NodeVisible": "Visible", + "GridLinks": [ + "Left", + "Right" + ], + "GridFlags": [ + "CanMove", + "CanTriggerEvent", + "Visible", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 23, + "Y": 5 + }, + "NodeState": "Locked", + "NodeVisible": "VisibleByTriggerEvent", + "GridLinks": [ + "Left", + "Down" + ], + "GridFlags": [ + "CanTriggerEvent", + "VisibleByTriggerEvent", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 18, + "Y": 1 + }, + "NodeState": "ShowEvent", + "NodeVisible": "VisibleByTriggerEvent", + "GridLinks": [ + "Down" + ], + "GridFlags": [ + "ShowEventType", + "ShowEventId", + "CanTriggerEvent", + "VisibleByTriggerEvent", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 7, + "Y": 5 + }, + "NodeState": "ShowEvent", + "NodeVisible": "Visible", + "GridLinks": [ + "Left", + "Right" + ], + "GridFlags": [ + "CanMove", + "ShowEventType", + "ShowEventId", + "CanTriggerEvent", + "Visible", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 15, + "Y": 2 + }, + "NodeState": "Locked", + "NodeVisible": "VisibleByTriggerEvent", + "GridLinks": [ + "Right", + "Down" + ], + "GridFlags": [ + "CanTriggerEvent", + "VisibleByTriggerEvent", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 20, + "Y": 6 + }, + "NodeState": "ShowEvent", + "NodeVisible": "VisibleByTriggerEvent", + "GridLinks": [ + "Left", + "Right" + ], + "GridFlags": [ + "ShowEventType", + "ShowEventId", + "CanTriggerEvent", + "VisibleByTriggerEvent", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 4, + "Y": 6 + }, + "NodeState": "ShowEvent", + "NodeVisible": "Visible", + "GridLinks": [ + "Up", + "Down" + ], + "GridFlags": [ + "CanMove", + "ShowEventType", + "ShowEventId", + "CanTriggerEvent", + "Visible", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 17, + "Y": 7 + }, + "NodeState": "Locked", + "NodeVisible": "VisibleByTriggerEvent", + "GridLinks": [ + "Up", + "Right" + ], + "GridFlags": [ + "CanTriggerEvent", + "VisibleByTriggerEvent", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 21, + "Y": 2 + }, + "NodeState": "ShowEvent", + "NodeVisible": "VisibleByTriggerEvent", + "GridLinks": [ + "Left", + "Right" + ], + "GridFlags": [ + "ShowEventType", + "ShowEventId", + "CanTriggerEvent", + "VisibleByTriggerEvent", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 13, + "Y": 5 + }, + "NodeState": "Locked", + "NodeVisible": "Visible", + "GridLinks": [ + "Left", + "Right" + ], + "GridFlags": [ + "CanMove", + "CanTriggerEvent", + "Visible", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 18, + "Y": 6 + }, + "NodeState": "ShowEvent", + "NodeVisible": "VisibleByTriggerEvent", + "GridLinks": [ + "Left", + "Up", + "Right", + "Down" + ], + "GridFlags": [ + "Core", + "ShowEventType", + "ShowEventId", + "CanTriggerEvent", + "VisibleByTriggerEvent", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 5, + "Y": 5 + }, + "NodeState": "Locked", + "NodeVisible": "Visible", + "GridLinks": [ + "Left", + "Right" + ], + "GridFlags": [ + "CanMove", + "CanTriggerEvent", + "Visible", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 22, + "Y": 7 + }, + "NodeState": "ShowEvent", + "NodeVisible": "VisibleByTriggerEvent", + "GridLinks": [ + "Left", + "Up", + "Right" + ], + "GridFlags": [ + "Core", + "ShowEventType", + "ShowEventId", + "CanTriggerEvent", + "VisibleByTriggerEvent", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 9, + "Y": 6 + }, + "NodeState": "ShowEvent", + "NodeVisible": "Visible", + "GridLinks": [ + "Up", + "Down" + ], + "GridFlags": [ + "CanMove", + "ShowEventType", + "ShowEventId", + "CanTriggerEvent", + "Visible", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 17, + "Y": 3 + }, + "NodeState": "Locked", + "NodeVisible": "VisibleByTriggerEvent", + "GridLinks": [ + "Up", + "Right" + ], + "GridFlags": [ + "CanTriggerEvent", + "VisibleByTriggerEvent", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 12, + "Y": 5 + }, + "NodeState": "Locked", + "NodeVisible": "Visible", + "GridLinks": [ + "Left", + "Right" + ], + "GridFlags": [ + "CanMove", + "CanTriggerEvent", + "Visible", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 20, + "Y": 2 + }, + "NodeState": "ShowEvent", + "NodeVisible": "VisibleByTriggerEvent", + "GridLinks": [ + "Left", + "Right" + ], + "GridFlags": [ + "ShowEventType", + "ShowEventId", + "CanTriggerEvent", + "VisibleByTriggerEvent", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 14, + "Y": 5 + }, + "NodeState": "ShowEvent", + "NodeVisible": "Visible", + "GridLinks": [ + "Left", + "Right" + ], + "GridFlags": [ + "CanMove", + "ShowEventType", + "ShowEventId", + "CanTriggerEvent", + "Visible", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 22, + "Y": 2 + }, + "NodeState": "ShowEvent", + "NodeVisible": "VisibleByTriggerEvent", + "GridLinks": [ + "Left", + "Down" + ], + "GridFlags": [ + "ShowEventType", + "ShowEventId", + "CanTriggerEvent", + "VisibleByTriggerEvent", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 6, + "Y": 7 + }, + "NodeState": "ShowEvent", + "NodeVisible": "Visible", + "GridLinks": [ + "Left", + "Right" + ], + "GridFlags": [ + "CanMove", + "ShowEventType", + "ShowEventId", + "CanTriggerEvent", + "Visible", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 15, + "Y": 4 + }, + "NodeState": "Locked", + "NodeVisible": "VisibleByTriggerEvent", + "GridLinks": [ + "Up", + "Down" + ], + "GridFlags": [ + "CanTriggerEvent", + "VisibleByTriggerEvent", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 7, + "Y": 7 + }, + "NodeState": "ShowEvent", + "NodeVisible": "Visible", + "GridLinks": [ + "Left", + "Right" + ], + "GridFlags": [ + "CanMove", + "ShowEventType", + "ShowEventId", + "CanTriggerEvent", + "Visible", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 22, + "Y": 4 + }, + "NodeState": "ShowEvent", + "NodeVisible": "VisibleByTriggerEvent", + "GridLinks": [ + "Up", + "Down" + ], + "GridFlags": [ + "ShowEventType", + "ShowEventId", + "CanTriggerEvent", + "VisibleByTriggerEvent", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 8, + "Y": 7 + }, + "NodeState": "ShowEvent", + "NodeVisible": "Visible", + "GridLinks": [ + "Left", + "Right" + ], + "GridFlags": [ + "CanMove", + "ShowEventType", + "ShowEventId", + "CanTriggerEvent", + "Visible", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 0, + "Y": 5 + }, + "NodeState": "ShowEvent", + "NodeVisible": "Visible", + "GridLinks": [ + "Right" + ], + "GridFlags": [ + "CanMove", + "Travelled", + "ShowEventType", + "ShowEventId", + "CanTriggerEvent", + "Visible", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 22, + "Y": 5 + }, + "NodeState": "ShowEvent", + "NodeVisible": "VisibleByTriggerEvent", + "GridLinks": [ + "Left", + "Up", + "Right", + "Down" + ], + "GridFlags": [ + "ShowEventType", + "ShowEventId", + "CanTriggerEvent", + "VisibleByTriggerEvent", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 18, + "Y": 5 + }, + "NodeState": "Locked", + "NodeVisible": "VisibleByTriggerEvent", + "GridLinks": [ + "Left", + "Up", + "Right", + "Down" + ], + "GridFlags": [ + "CanTriggerEvent", + "VisibleByTriggerEvent", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 5, + "Y": 7 + }, + "NodeState": "ShowEvent", + "NodeVisible": "Visible", + "GridLinks": [ + "Left", + "Right" + ], + "GridFlags": [ + "CanMove", + "ShowEventType", + "ShowEventId", + "CanTriggerEvent", + "Visible", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 17, + "Y": 5 + }, + "NodeState": "Locked", + "NodeVisible": "VisibleByTriggerEvent", + "GridLinks": [ + "Right", + "Down" + ], + "GridFlags": [ + "CanTriggerEvent", + "VisibleByTriggerEvent", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 4, + "Y": 7 + }, + "NodeState": "ShowEvent", + "NodeVisible": "Visible", + "GridLinks": [ + "Up", + "Right" + ], + "GridFlags": [ + "CanMove", + "ShowEventType", + "ShowEventId", + "CanTriggerEvent", + "Visible", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 3, + "Y": 5 + }, + "NodeState": "Locked", + "NodeVisible": "Visible", + "GridLinks": [ + "Left", + "Right" + ], + "GridFlags": [ + "CanMove", + "CanTriggerEvent", + "Visible", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 22, + "Y": 3 + }, + "NodeState": "ShowEvent", + "NodeVisible": "VisibleByTriggerEvent", + "GridLinks": [ + "Up", + "Down" + ], + "GridFlags": [ + "ShowEventType", + "ShowEventId", + "CanTriggerEvent", + "VisibleByTriggerEvent", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 1, + "Y": 5 + }, + "NodeState": "Locked", + "NodeVisible": "Visible", + "GridLinks": [ + "Left", + "Right" + ], + "GridFlags": [ + "CanMove", + "CanTriggerEvent", + "Visible", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 21, + "Y": 5 + }, + "NodeState": "Locked", + "NodeVisible": "VisibleByTriggerEvent", + "GridLinks": [ + "Right", + "Down" + ], + "GridFlags": [ + "CanTriggerEvent", + "VisibleByTriggerEvent", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 9, + "Y": 7 + }, + "NodeState": "ShowEvent", + "NodeVisible": "Visible", + "GridLinks": [ + "Left", + "Up" + ], + "GridFlags": [ + "CanMove", + "ShowEventType", + "ShowEventId", + "CanTriggerEvent", + "Visible", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 19, + "Y": 5 + }, + "NodeState": "Locked", + "NodeVisible": "VisibleByTriggerEvent", + "GridLinks": [ + "Left", + "Down" + ], + "GridFlags": [ + "CanTriggerEvent", + "VisibleByTriggerEvent", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 15, + "Y": 5 + }, + "NodeState": "ShowEvent", + "NodeVisible": "VisibleByTriggerEvent", + "GridLinks": [ + "Left", + "Up" + ], + "GridFlags": [ + "ShowEventType", + "ShowEventId", + "CanTriggerEvent", + "VisibleByTriggerEvent", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 15, + "Y": 3 + }, + "NodeState": "Locked", + "NodeVisible": "VisibleByTriggerEvent", + "GridLinks": [ + "Up", + "Down" + ], + "GridFlags": [ + "CanTriggerEvent", + "VisibleByTriggerEvent", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 2, + "Y": 5 + }, + "NodeState": "Locked", + "NodeVisible": "Visible", + "GridLinks": [ + "Left", + "Right" + ], + "GridFlags": [ + "CanMove", + "CanTriggerEvent", + "Visible", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 19, + "Y": 6 + }, + "NodeState": "ShowEvent", + "NodeVisible": "VisibleByTriggerEvent", + "GridLinks": [ + "Left", + "Up", + "Right", + "Down" + ], + "GridFlags": [ + "ShowEventType", + "ShowEventId", + "CanTriggerEvent", + "VisibleByTriggerEvent", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 6, + "Y": 5 + }, + "NodeState": "ShowEvent", + "NodeVisible": "Visible", + "GridLinks": [ + "Left", + "Right" + ], + "GridFlags": [ + "CanMove", + "ShowEventType", + "ShowEventId", + "CanTriggerEvent", + "Visible", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 19, + "Y": 3 + }, + "NodeState": "ShowEvent", + "NodeVisible": "VisibleByTriggerEvent", + "GridLinks": [ + "Left", + "Up" + ], + "GridFlags": [ + "ShowEventType", + "ShowEventId", + "CanTriggerEvent", + "VisibleByTriggerEvent", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 19, + "Y": 2 + }, + "NodeState": "Locked", + "NodeVisible": "VisibleByTriggerEvent", + "GridLinks": [ + "Left", + "Right", + "Down" + ], + "GridFlags": [ + "CanTriggerEvent", + "VisibleByTriggerEvent", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 11, + "Y": 5 + }, + "NodeState": "Locked", + "NodeVisible": "Visible", + "GridLinks": [ + "Left", + "Right" + ], + "GridFlags": [ + "CanMove", + "CanTriggerEvent", + "Visible", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 17, + "Y": 6 + }, + "NodeState": "ShowEvent", + "NodeVisible": "VisibleByTriggerEvent", + "GridLinks": [ + "Up", + "Right", + "Down" + ], + "GridFlags": [ + "ShowEventType", + "ShowEventId", + "CanTriggerEvent", + "VisibleByTriggerEvent", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 4, + "Y": 5 + }, + "NodeState": "ShowEvent", + "NodeVisible": "Visible", + "GridLinks": [ + "Left", + "Right", + "Down" + ], + "GridFlags": [ + "CanMove", + "ShowEventType", + "ShowEventId", + "CanTriggerEvent", + "Visible", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 18, + "Y": 7 + }, + "NodeState": "ShowEvent", + "NodeVisible": "VisibleByTriggerEvent", + "GridLinks": [ + "Left", + "Up", + "Right" + ], + "GridFlags": [ + "ShowEventType", + "ShowEventId", + "CanTriggerEvent", + "VisibleByTriggerEvent", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 21, + "Y": 6 + }, + "NodeState": "ShowEvent", + "NodeVisible": "VisibleByTriggerEvent", + "GridLinks": [ + "Left", + "Up", + "Right", + "Down" + ], + "GridFlags": [ + "ShowEventType", + "ShowEventId", + "CanTriggerEvent", + "VisibleByTriggerEvent", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 16, + "Y": 2 + }, + "NodeState": "Locked", + "NodeVisible": "VisibleByTriggerEvent", + "GridLinks": [ + "Left", + "Right" + ], + "GridFlags": [ + "CanTriggerEvent", + "VisibleByTriggerEvent", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 8, + "Y": 5 + }, + "NodeState": "Locked", + "NodeVisible": "Visible", + "GridLinks": [ + "Left", + "Right" + ], + "GridFlags": [ + "CanMove", + "CanTriggerEvent", + "Visible", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 19, + "Y": 7 + }, + "NodeState": "Locked", + "NodeVisible": "VisibleByTriggerEvent", + "GridLinks": [ + "Left", + "Up" + ], + "GridFlags": [ + "CanTriggerEvent", + "VisibleByTriggerEvent", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 9, + "Y": 5 + }, + "NodeState": "Locked", + "NodeVisible": "Visible", + "GridLinks": [ + "Left", + "Right", + "Down" + ], + "GridFlags": [ + "CanMove", + "CanTriggerEvent", + "Visible", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 17, + "Y": 2 + }, + "NodeState": "Locked", + "NodeVisible": "VisibleByTriggerEvent", + "GridLinks": [ + "Left", + "Right", + "Down" + ], + "GridFlags": [ + "CanTriggerEvent", + "VisibleByTriggerEvent", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 22, + "Y": 6 + }, + "NodeState": "ShowEvent", + "NodeVisible": "VisibleByTriggerEvent", + "GridLinks": [ + "Left", + "Up", + "Right", + "Down" + ], + "GridFlags": [ + "Core", + "ShowEventType", + "ShowEventId", + "CanTriggerEvent", + "VisibleByTriggerEvent", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 18, + "Y": 4 + }, + "NodeState": "ShowEvent", + "NodeVisible": "VisibleByTriggerEvent", + "GridLinks": [ + "Up", + "Down" + ], + "GridFlags": [ + "ShowEventType", + "ShowEventId", + "CanTriggerEvent", + "VisibleByTriggerEvent", + "CanTriggerMultiTimes" + ] + } + ], + "Events": [ + { + "OwnedBy": { "$type": "Share.CEventOwnerGlobal" }, + "EventID": 1003, + "Priority": 1000 + }, + { + "OwnedBy": { + "$type": "Share.CEventOwnerGrid", + "Position": { + "X": 23, + "Y": 6 + } + }, + "EventID": 50002, + "Priority": 1000 + }, + { + "OwnedBy": { + "$type": "Share.CEventOwnerGrid", + "Position": { + "X": 18, + "Y": 2 + } + }, + "EventID": 30004, + "Priority": 1000 + }, + { + "OwnedBy": { + "$type": "Share.CEventOwnerGrid", + "Position": { + "X": 18, + "Y": 1 + } + }, + "EventID": 1000209, + "Priority": 1000 + }, + { + "OwnedBy": { + "$type": "Share.CEventOwnerGrid", + "Position": { + "X": 7, + "Y": 5 + } + }, + "EventID": 60002, + "Priority": 1000 + }, + { + "OwnedBy": { + "$type": "Share.CEventOwnerGrid", + "Position": { + "X": 20, + "Y": 6 + } + }, + "EventID": 1097, + "Priority": 1000 + }, + { + "OwnedBy": { + "$type": "Share.CEventOwnerGrid", + "Position": { + "X": 4, + "Y": 6 + } + }, + "EventID": 1098, + "Priority": 1000 + }, + { + "OwnedBy": { + "$type": "Share.CEventOwnerGrid", + "Position": { + "X": 21, + "Y": 2 + } + }, + "EventID": 1096, + "Priority": 1000 + }, + { + "OwnedBy": { + "$type": "Share.CEventOwnerGrid", + "Position": { + "X": 18, + "Y": 6 + } + }, + "EventID": 30005, + "Priority": 1000 + }, + { + "OwnedBy": { + "$type": "Share.CEventOwnerGrid", + "Position": { + "X": 22, + "Y": 7 + } + }, + "EventID": 30006, + "Priority": 1000 + }, + { + "OwnedBy": { + "$type": "Share.CEventOwnerGrid", + "Position": { + "X": 9, + "Y": 6 + } + }, + "EventID": 1065, + "Priority": 1000 + }, + { + "OwnedBy": { + "$type": "Share.CEventOwnerGrid", + "Position": { + "X": 20, + "Y": 2 + } + }, + "EventID": 1096, + "Priority": 1000 + }, + { + "OwnedBy": { + "$type": "Share.CEventOwnerGrid", + "Position": { + "X": 14, + "Y": 5 + } + }, + "EventID": 1000233, + "Priority": 1000 + }, + { + "OwnedBy": { + "$type": "Share.CEventOwnerGrid", + "Position": { + "X": 22, + "Y": 2 + } + }, + "EventID": 1096, + "Priority": 1000 + }, + { + "OwnedBy": { + "$type": "Share.CEventOwnerGrid", + "Position": { + "X": 6, + "Y": 7 + } + }, + "EventID": 1062, + "Priority": 1000 + }, + { + "OwnedBy": { + "$type": "Share.CEventOwnerGrid", + "Position": { + "X": 7, + "Y": 7 + } + }, + "EventID": 1062, + "Priority": 1000 + }, + { + "OwnedBy": { + "$type": "Share.CEventOwnerGrid", + "Position": { + "X": 22, + "Y": 4 + } + }, + "EventID": 1064, + "Priority": 1000 + }, + { + "OwnedBy": { + "$type": "Share.CEventOwnerGrid", + "Position": { + "X": 8, + "Y": 7 + } + }, + "EventID": 1070, + "Priority": 1000 + }, + { + "OwnedBy": { + "$type": "Share.CEventOwnerGrid", + "Position": { + "X": 0, + "Y": 5 + } + }, + "EventID": 1000211, + "Priority": 1000 + }, + { + "OwnedBy": { + "$type": "Share.CEventOwnerGrid", + "Position": { + "X": 22, + "Y": 5 + } + }, + "EventID": 1000234, + "Priority": 1000 + }, + { + "OwnedBy": { + "$type": "Share.CEventOwnerGrid", + "Position": { + "X": 5, + "Y": 7 + } + }, + "EventID": 1066, + "Priority": 1000 + }, + { + "OwnedBy": { + "$type": "Share.CEventOwnerGrid", + "Position": { + "X": 4, + "Y": 7 + } + }, + "EventID": 1098, + "Priority": 1000 + }, + { + "OwnedBy": { + "$type": "Share.CEventOwnerGrid", + "Position": { + "X": 22, + "Y": 3 + } + }, + "EventID": 1064, + "Priority": 1000 + }, + { + "OwnedBy": { + "$type": "Share.CEventOwnerGrid", + "Position": { + "X": 9, + "Y": 7 + } + }, + "EventID": 1070, + "Priority": 1000 + }, + { + "OwnedBy": { + "$type": "Share.CEventOwnerGrid", + "Position": { + "X": 15, + "Y": 5 + } + }, + "EventID": 60003, + "Priority": 1000 + }, + { + "OwnedBy": { + "$type": "Share.CEventOwnerGrid", + "Position": { + "X": 19, + "Y": 6 + } + }, + "EventID": 1025, + "Priority": 1000 + }, + { + "OwnedBy": { + "$type": "Share.CEventOwnerGrid", + "Position": { + "X": 6, + "Y": 5 + } + }, + "EventID": 1013, + "Priority": 1000 + }, + { + "OwnedBy": { + "$type": "Share.CEventOwnerGrid", + "Position": { + "X": 19, + "Y": 3 + } + }, + "EventID": 1000232, + "Priority": 1000 + }, + { + "OwnedBy": { + "$type": "Share.CEventOwnerGrid", + "Position": { + "X": 17, + "Y": 6 + } + }, + "EventID": 1025, + "Priority": 1000 + }, + { + "OwnedBy": { + "$type": "Share.CEventOwnerGrid", + "Position": { + "X": 4, + "Y": 5 + } + }, + "EventID": 1000231, + "Priority": 1000 + }, + { + "OwnedBy": { + "$type": "Share.CEventOwnerGrid", + "Position": { + "X": 18, + "Y": 7 + } + }, + "EventID": 1000232, + "Priority": 1000 + }, + { + "OwnedBy": { + "$type": "Share.CEventOwnerGrid", + "Position": { + "X": 21, + "Y": 6 + } + }, + "EventID": 1025, + "Priority": 1000 + }, + { + "OwnedBy": { + "$type": "Share.CEventOwnerGrid", + "Position": { + "X": 22, + "Y": 6 + } + }, + "EventID": 1000223, + "Priority": 1000 + }, + { + "OwnedBy": { + "$type": "Share.CEventOwnerGrid", + "Position": { + "X": 18, + "Y": 4 + } + }, + "EventID": 1098, + "Priority": 1000 + } + ] + } + ] +} diff --git a/assets/LevelProcess/Hollow/Chessboard/Chessboard_10104.json b/assets/LevelProcess/Hollow/Chessboard/Chessboard_10104.json new file mode 100644 index 0000000..ad741c9 --- /dev/null +++ b/assets/LevelProcess/Hollow/Chessboard/Chessboard_10104.json @@ -0,0 +1,70 @@ +// Experimental 'Debug Menu' chessboard +{ + "ID": 10104, + "DefaultPlayerPos": { "X": 0, "Y": 0 }, + "DefaultSectionIndex": 0, + "Sections": [ + { + "Grids": [ + { + "Position": { + "X": 0, + "Y": 0 + }, + "NodeState": "ShowEvent", + "NodeVisible": "Visible", + "GridLinks": [ + "Right" + ], + "GridFlags": [ + "CanMove", + "Travelled", + "ShowEventType", + "ShowEventId", + "CanTriggerEvent", + "Visible", + "CanTriggerMultiTimes" + ] + }, + { + "Position": { + "X": 1, + "Y": 0 + }, + "NodeState": "ShowEvent", + "NodeVisible": "Visible", + "GridLinks": [ + "Left", + "Right" + ], + "GridFlags": [ + "CanMove", + "CanTriggerEvent", + "Visible", + "CanTriggerMultiTimes", + "ShowEventType", + "ShowEventId" + ] + } + ], + "Events": [ + { + "OwnedBy": { "$type": "Share.CEventOwnerGlobal" }, + "EventID": 1003, + "Priority": 1000 + }, + { + "OwnedBy": { + "$type": "Share.CEventOwnerGrid", + "Position": { + "X": 1, + "Y": 0 + } + }, + "EventID": 1010408, + "Priority": 1000 + } + ] + } + ] +} diff --git a/assets/LevelProcess/Hollow/Event/Event_1000209.json b/assets/LevelProcess/Hollow/Event/Event_1000209.json new file mode 100644 index 0000000..d6c0c05 --- /dev/null +++ b/assets/LevelProcess/Hollow/Event/Event_1000209.json @@ -0,0 +1,127 @@ +{ + "ID": 1000209, + "Events": { + "OnStart": { + "ID": 10002091, + "Actions": [ + { + "$type": "Share.CConfigPushWithDirection", + "ID": 101, + "Direction": 1, + "Predicates": + [ + { + "$type": "Share.CConfigEventByHollowVariable", + "Key": "GetWeapon", + "CompareType": "Equal", + "Count": 0 + } + ] + }, + { + "$type": "Share.CConfigShowTip", + "ID": 102, + "TipID": 100020042, + "Predicates": + [ + { + "$type": "Share.CConfigEventByHollowVariable", + "Key": "GetWeapon", + "CompareType": "Equal", + "Count": 0 + } + ] + }, + { + "$type": "Share.CConfigOpenDialog", + "ID": 1, + "OpenEvent": true, + "CameraMove": true, + "UnkOpenDialog": true, + "OpenParam": { + "UnkOpenDialogFlag1": true, + "StartTextureSheet": "30122", + "UnkOpenDialogFlag2": false, + "LoopTextureSheet": "30123", + "EndTextureSheet": "30124", + "UnkOpenDialogFlag3": true + }, + "Predicates": + [ + { + "$type": "Share.CConfigEventByHollowVariable", + "Key": "GetWeapon", + "CompareType": "Equal", + "Count": 1 + } + ] + }, + { + "$type": "Share.CConfigMakeDialogChoice", + "ID": 4, + "Title": "CommonEvent_LeaveTips_Title", + "Description": "CommonEvent_LeaveTips_Description", + "QuestionDescription": "CommonEvent_LeaveTips_QuestionDescription", + "ChoiceDetails": [ + { + "OptionText": "CommonEvent_LeaveTips_Option1Text1", + "OptionID": "107", + "OptionText2": "CommonEvent_LeaveTips_Option1Text2", + "ChoiceID": 8, + "UID": 1 + }, + { + "OptionText": "CommonEvent_LeaveTips_Option2Text1", + "OptionID": "108", + "OptionText2": "", + "ChoiceID": 10, + "UID": 2 + } + ], + "Predicates": + [ + { + "$type": "Share.CConfigEventByHollowVariable", + "Key": "GetWeapon", + "CompareType": "Equal", + "Count": 1 + } + ] + }, + { + "$type": "Share.CConfigCloseDialog", + "ID": 5, + "CameraMove": true, + "NeedResetCenter": true, + "Predicates": + [ + { + "$type": "Share.CConfigEventByHollowVariable", + "Key": "GetWeapon", + "CompareType": "Equal", + "Count": 1 + } + ] + }, + { + "$type": "Share.CConfigFinishHollow", + "ID": 6, + "Predicates": + [ + { + "$type": "Share.CConfigEventByHollowVariable", + "Key": "GetWeapon", + "CompareType": "Equal", + "Count": 1 + }, + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 1 + } + ] + } + ] + } + } +} diff --git a/assets/LevelProcess/Hollow/Event/Event_1000211.json b/assets/LevelProcess/Hollow/Event/Event_1000211.json new file mode 100644 index 0000000..3fad537 --- /dev/null +++ b/assets/LevelProcess/Hollow/Event/Event_1000211.json @@ -0,0 +1,100 @@ +{ + "ID": 1000211, + "Specials": { + "PopWindowID": 20016 + }, + "Events": { + "OnStart": { + "ID": 0, + "Actions": [ + { + "$type": "Share.CConfigOpenDialog", + "ID": 3, + "OpenEvent": true, + "CameraMove": true, + "UnkOpenDialog": true, + "OpenParam": { + "UnkOpenDialogFlag1": true, + "StartTextureSheet": "30122", + "UnkOpenDialogFlag2": false, + "LoopTextureSheet": "30123", + "EndTextureSheet": "30124", + "UnkOpenDialogFlag3": true + } + }, + { + "$type": "Share.CConfigLogText", + "ID": 4, + "Messages": [ + "AutoEvent1000211_0", + "AutoEvent1000211_1", + "AutoEvent1000211_2" + ], + "LogTitle": "AutoEvent1000211_3", + "Voicelines": [ + "VO_Chessboard/VO_AI/Chessboard_Chapter0_SRL1_AI_04", + "VO_Chessboard/VO_AI/Chessboard_Chapter0_SRL1_AI_05", + "VO_Chessboard/VO_AI/Chessboard_Chapter0_SRL1_AI_06" + ] + }, + { + "$type": "Share.CConfigCloseDialog", + "ID": 5, + "CameraMove": true, + "NeedResetCenter": true + }, + { + "$type": "Share.CConfigCameraMoveV2", + "ID": 6, + "StretchKey": "TargetSlow", + "Type": "CustomBound", + "PositionOffsetType": "Relative", + "PositionOffsetX": "", + "PositionOffsetY": "", + "RadiusX": "", + "RadiusY": "", + "BoundIndexX": { "X": 13, "Y": 4 }, + "BoundIndexY": { "X": 15, "Y": 6 }, + "FreezeZ": false, + "Parallel": true + }, + { + "$type": "Share.CConfigWaitSeconds", + "ID": 18, + "WaitTime": 2.0 + }, + { + "$type": "Share.CConfigShowTip", + "ID": 9, + "TipID": 100020032 + }, + { + "$type": "Share.CConfigWaitSeconds", + "ID": 26, + "WaitTime": 2.0 + }, + { + "$type": "Share.CConfigCameraMoveV2", + "ID": 13, + "StretchKey": "Back", + "Type": "Back", + "PositionOffsetType": "Relative", + "PositionOffsetX": "", + "PositionOffsetY": "", + "RadiusX": "", + "RadiusY": "", + "BoundIndexX": { "X": -32768, "Y": -32768 }, + "BoundIndexY": { "X": -32768, "Y": -32768 }, + "FreezeZ": false, + "Parallel": false + }, + { + "$type": "Share.CConfigShowPopWindow", + "ID": 29, + "PopID": 20004, + "ShowDirectly": true + } + ] + } + } +} diff --git a/assets/LevelProcess/Hollow/Event/Event_1000223.json b/assets/LevelProcess/Hollow/Event/Event_1000223.json new file mode 100644 index 0000000..8a9be14 --- /dev/null +++ b/assets/LevelProcess/Hollow/Event/Event_1000223.json @@ -0,0 +1,221 @@ +{ + "ID": 1000223, + "Events": { + // Grab the W-Engine + "OnStart": { + "ID": 10002231, + "Actions": [ + // Subsequent event triggers (after getting weapon) + { + "$type": "Share.CConfigOpenDialog", + "ID": 101, + "OpenEvent": true, + "CameraMove": true, + "Predicates": + [ + { + "$type": "Share.CConfigEventByHollowVariable", + "Key": "GetWeapon", + "CompareType": "Equal", + "Count": 1 + } + ] + }, + { + "$type": "Share.CConfigLogText", + "ID": 102, + "Messages": ["AutoEvent1000224_1"], + "Voicelines": [], + "LogTitle": "AutoEvent1000224_0", + "Predicates": + [ + { + "$type": "Share.CConfigEventByHollowVariable", + "Key": "GetWeapon", + "CompareType": "Equal", + "Count": 1 + } + ] + }, + { + "$type": "Share.CConfigCloseDialog", + "ID": 103, + "CameraMove": true, + "NeedResetCenter": true, + "Predicates": + [ + { + "$type": "Share.CConfigEventByHollowVariable", + "Key": "GetWeapon", + "CompareType": "Equal", + "Count": 1 + } + ] + }, + // First-time event trigger + { + "$type": "Share.CConfigOpenDialog", + "ID": 1, + "OpenEvent": true, + "CameraMove": true, + "UnkOpenDialog": true, + "OpenParam": { + "UnkOpenDialogFlag1": true, + "StartTextureSheet": "30122", + "UnkOpenDialogFlag2": false, + "LoopTextureSheet": "30123", + "EndTextureSheet": "30124", + "UnkOpenDialogFlag3": true + }, + "Predicates": + [ + { + "$type": "Share.CConfigEventByHollowVariable", + "Key": "GetWeapon", + "CompareType": "Equal", + "Count": 0 + } + ] + }, + { + "$type": "Share.CConfigLogText", + "ID": 2, + "Messages": [ + "AutoEvent1000223_0", + "AutoEvent1000223_1" + ], + "LogTitle": "AutoEvent1000211_3", + "Voicelines": [ + "VO_Chessboard/VO_AI/Chessboard_Chapter0_SRL1_AI_07", + "VO_Chessboard/VO_AI/Chessboard_Chapter0_SRL1_AI_08" + ], + "Predicates": + [ + { + "$type": "Share.CConfigEventByHollowVariable", + "Key": "GetWeapon", + "CompareType": "Equal", + "Count": 0 + } + ] + }, + { + "$type": "Share.CConfigBreakDialogAnim", + "ID": 3, + "Predicates": + [ + { + "$type": "Share.CConfigEventByHollowVariable", + "Key": "GetWeapon", + "CompareType": "Equal", + "Count": 0 + } + ] + }, + { + "$type": "Share.CConfigMakeDialogChoice", + "ID": 4, + "Title": "AutoEvent1000223_2", + "Description": "AutoEvent1000223_3", + "QuestionDescription": "AutoEvent1000223_4", + "ChoiceDetails": [ + { + "OptionText": "AutoEvent1000223_5", + "OptionID": "111", + "OptionText2": "", + "ChoiceID": 5, + "UID": 1 + } + ], + "Predicates": + [ + { + "$type": "Share.CConfigEventByHollowVariable", + "Key": "GetWeapon", + "CompareType": "Equal", + "Count": 0 + } + ] + }, + { + "$type": "Share.CConfigCloseDialog", + "ID": 5, + "CameraMove": true, + "NeedResetCenter": true, + "Predicates": + [ + { + "$type": "Share.CConfigEventByHollowVariable", + "Key": "GetWeapon", + "CompareType": "Equal", + "Count": 0 + } + ] + }, + { + "$type": "Share.CConfigPlayAnim", + "ID": 6, + "AnimID": 20009, + "Indexes": [], + "Predicates": + [ + { + "$type": "Share.CConfigEventByHollowVariable", + "Key": "GetWeapon", + "CompareType": "Equal", + "Count": 0 + } + ] + }, + { + "$type": "Share.CConfigShowTip", + "ID": 7, + "TipID": 100020038, + "Predicates": + [ + { + "$type": "Share.CConfigEventByHollowVariable", + "Key": "GetWeapon", + "CompareType": "Equal", + "Count": 0 + } + ] + }, + { + "$type": "Share.CConfigWaitTipsEnd", + "ID": 8, + "TipsID": [100020037, 100020038], + "Predicates": + [ + { + "$type": "Share.CConfigEventByHollowVariable", + "Key": "GetWeapon", + "CompareType": "Equal", + "Count": 0 + } + ] + }, + { + "$type": "Share.CConfigShowTip", + "ID": 9, + "TipID": 100020040, + "Predicates": + [ + { + "$type": "Share.CConfigEventByHollowVariable", + "Key": "GetWeapon", + "CompareType": "Equal", + "Count": 0 + } + ] + }, + { + "$type": "Share.CConfigSetHollowVariable", + "ID": 10, + "Key": "GetWeapon", + "Value": 1 + } + ] + } + } +} diff --git a/assets/LevelProcess/Hollow/Event/Event_1000231.json b/assets/LevelProcess/Hollow/Event/Event_1000231.json new file mode 100644 index 0000000..df5e9f2 --- /dev/null +++ b/assets/LevelProcess/Hollow/Event/Event_1000231.json @@ -0,0 +1,227 @@ +{ + "ID": 1000231, + "Events": { + "OnStart": { + "ID": 10002311, + "Actions": [ + { + "$type": "Share.CConfigCameraStretch", + "ID": 3, + "ShakeKey": "Shake_Standard_Light_LV3", + "Type": "TriggerPosition", + "Parallel": true + }, + { + "$type": "Share.CConfigPlayAnim", + "ID": 4, + "AnimID": 21033, + "Indexes": [ { "X": 4, "Y": 5 } ] + }, + { + "$type": "Share.CConfigWaitSeconds", + "ID": 6, + "WaitTime": 0.1 + }, + { + "$type": "Share.CConfigCameraMoveV2", + "ID": 7, + "StretchKey": "TargetSlow", + "Type": "CustomBound", + "PositionOffsetType": "Relative", + "PositionOffsetX": "", + "PositionOffsetY": "", + "RadiusX": "", + "RadiusY": "", + "BoundIndexX": { "X": 4, "Y": 5 }, + "BoundIndexY": { "X": 9, "Y": 7 }, + "FreezeZ": false, + "Parallel": true + }, + { + "$type": "Share.CConfigCameraStretch", + "ID": 8, + "ShakeKey": "Shake_Standard_Light_LV3", + "Type": "TriggerPosition", + "Parallel": true + }, + { + "$type": "Share.CConfigWaitSeconds", + "ID": 7, + "WaitTime": 0.5 + }, + { + "$type": "Share.CConfigEventModification", + "ID": 10, + "X": 0, + "Y": 1, + "Position": "Relative", + "Radius": 1, + "ModificationNum": 1, + "ModificationType": 1, + "EventID": [1065], + "EventState": "ShowEvent", + "VisibleState": "Visible" + }, + { + "$type": "Share.CConfigWaitSeconds", + "ID": 11, + "WaitTime": 0.1 + }, + { + "$type": "Share.CConfigEventModification", + "ID": 12, + "X": 0, + "Y": 2, + "Position": "Relative", + "Radius": 1, + "ModificationNum": 1, + "ModificationType": 1, + "EventID": [1067], + "EventState": "ShowEvent", + "VisibleState": "Visible" + }, + { + "$type": "Share.CConfigWaitSeconds", + "ID": 13, + "WaitTime": 0.1 + }, + { + "$type": "Share.CConfigEventModification", + "ID": 14, + "X": 1, + "Y": 2, + "Position": "Relative", + "Radius": 1, + "ModificationNum": 1, + "ModificationType": 1, + "EventID": [1067], + "EventState": "ShowEvent", + "VisibleState": "Visible" + }, + { + "$type": "Share.CConfigWaitSeconds", + "ID": 15, + "WaitTime": 0.1 + }, + { + "$type": "Share.CConfigEventModification", + "ID": 16, + "X": 2, + "Y": 2, + "Position": "Relative", + "Radius": 1, + "ModificationNum": 1, + "ModificationType": 1, + "EventID": [1067], + "EventState": "ShowEvent", + "VisibleState": "Visible" + }, + { + "$type": "Share.CConfigWaitSeconds", + "ID": 15, + "WaitTime": 0.1 + }, + { + "$type": "Share.CConfigEventModification", + "ID": 16, + "X": 3, + "Y": 2, + "Position": "Relative", + "Radius": 1, + "ModificationNum": 1, + "ModificationType": 1, + "EventID": [1067], + "EventState": "ShowEvent", + "VisibleState": "Visible" + }, + { + "$type": "Share.CConfigWaitSeconds", + "ID": 17, + "WaitTime": 0.1 + }, + { + "$type": "Share.CConfigEventModification", + "ID": 18, + "X": 4, + "Y": 2, + "Position": "Relative", + "Radius": 1, + "ModificationNum": 1, + "ModificationType": 1, + "EventID": [1067], + "EventState": "ShowEvent", + "VisibleState": "Visible" + }, + { + "$type": "Share.CConfigWaitSeconds", + "ID": 19, + "WaitTime": 0.1 + }, + { + "$type": "Share.CConfigEventModification", + "ID": 20, + "X": 5, + "Y": 2, + "Position": "Relative", + "Radius": 1, + "ModificationNum": 1, + "ModificationType": 1, + "EventID": [1072], + "EventState": "ShowEvent", + "VisibleState": "Visible" + }, + { + "$type": "Share.CConfigWaitSeconds", + "ID": 21, + "WaitTime": 0.1 + }, + { + "$type": "Share.CConfigEventModification", + "ID": 22, + "X": 5, + "Y": 1, + "Position": "Relative", + "Radius": 1, + "ModificationNum": 1, + "ModificationType": 1, + "EventID": [1072], + "EventState": "ShowEvent", + "VisibleState": "Visible" + }, + { + "$type": "Share.CConfigShowTip", + "ID": 114, + "TipID": 100020004 + }, + { + "$type": "Share.CConfigCameraMoveV2", + "ID": 111, + "StretchKey": "Back", + "Type": "Back", + "PositionOffsetType": "Relative", + "PositionOffsetX": "", + "PositionOffsetY": "", + "RadiusX": "", + "RadiusY": "", + "BoundIndexX": { "X": -32768, "Y": -32768 }, + "BoundIndexY": { "X": -32768, "Y": -32768 }, + "FreezeZ": false, + "Parallel": false + }, + { + "$type": "Share.CConfigEventModification", + "ID": 200, + "X": 0, + "Y": 0, + "Position": "Relative", + "Radius": 1, + "ModificationNum": 1, + "ModificationType": 1, + "EventID": [1000231], + "EventState": "ShowEvent", + "VisibleState": "Visible" + } + ] + } + } +} diff --git a/assets/LevelProcess/Hollow/Event/Event_1000232.json b/assets/LevelProcess/Hollow/Event/Event_1000232.json new file mode 100644 index 0000000..fd72eba --- /dev/null +++ b/assets/LevelProcess/Hollow/Event/Event_1000232.json @@ -0,0 +1,99 @@ +{ + "ID": 1000232, + "Events": { + "OnStart": { + "ID": 10002321, + "Actions": [ + { + "$type": "Share.CConfigCameraStretch", + "ID": 1, + "ShakeKey": "Shake_Standard_Light_LV3", + "Type": "TriggerPosition", + "Parallel": true + }, + { + "$type": "Share.CConfigPlayAnim", + "ID": 2, + "AnimID": 21033, + "Indexes": [ { "X": 19, "Y": 3 } ], + "Looping": false + }, + { + "$type": "Share.CConfigWaitSeconds", + "ID": 3, + "WaitTime": 0.1 + }, + { + "$type": "Share.CConfigCameraStretch", + "ID": 4, + "ShakeKey": "Shake_Standard_Light_LV3", + "Type": "TriggerPosition", + "Parallel": true + }, + { + "$type": "Share.CConfigCameraMoveV2", + "ID": 5, + "StretchKey": "TargetSlow", + "Type": "CustomBound", + "PositionOffsetType": "Relative", + "PositionOffsetX": "", + "PositionOffsetY": "", + "RadiusX": "", + "RadiusY": "", + "BoundIndexX": { "X": 17, "Y": 4 }, + "BoundIndexY": { "X": 20, "Y": 7 }, + "FreezeZ": false, + "Parallel": false + }, + { + "$type": "Share.CConfigEventModification", + "ID": 6, + "X": 18, + "Y": 4, + "Position": "Absolute", + "Radius": 1, + "ModificationNum": 1, + "ModificationType": 1, + "TargetEventID": [1098, 1095], + "EventID": [1095, 1098], + "EventState": "ShowEvent", + "VisibleState": "Visible" + }, + { + "$type": "Share.CConfigEventModification", + "ID": 7, + "X": 20, + "Y": 6, + "Position": "Absolute", + "Radius": 1, + "ModificationNum": 1, + "ModificationType": 1, + "TargetEventID": [1097, 1096], + "EventID": [1096, 1097], + "EventState": "ShowEvent", + "VisibleState": "Visible" + }, + { + "$type": "Share.CConfigWaitSeconds", + "ID": 8, + "WaitTime": 1 + }, + { + "$type": "Share.CConfigCameraMoveV2", + "ID": 9, + "StretchKey": "Back", + "Type": "Back", + "PositionOffsetType": "Relative", + "PositionOffsetX": "", + "PositionOffsetY": "", + "RadiusX": "", + "RadiusY": "", + "BoundIndexX": { "X": -32768, "Y": -32768 }, + "BoundIndexY": { "X": -32768, "Y": -32768 }, + "FreezeZ": false, + "Parallel": false + } + ] + } + } +} diff --git a/assets/LevelProcess/Hollow/Event/Event_1000233.json b/assets/LevelProcess/Hollow/Event/Event_1000233.json new file mode 100644 index 0000000..bf1d584 --- /dev/null +++ b/assets/LevelProcess/Hollow/Event/Event_1000233.json @@ -0,0 +1,716 @@ +{ + "ID": 1000233, + "Events": { + "OnStart": { + "ID": 10002331, + "Actions": [ + // Hide previous grids except current one + { + "$type": "Share.CConfigSetMapState", + "ID": 1, + "X": 10, + "Y": 5, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["Visible"], + "ToVisibleState": ["VisibleByTriggerEvent"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 2, + "X": 7, + "Y": 5, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["Visible"], + "ToVisibleState": ["VisibleByTriggerEvent"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 3, + "X": 4, + "Y": 6, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["Visible"], + "ToVisibleState": ["VisibleByTriggerEvent"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 4, + "X": 13, + "Y": 5, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["Visible"], + "ToVisibleState": ["VisibleByTriggerEvent"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 5, + "X": 5, + "Y": 5, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["Visible"], + "ToVisibleState": ["VisibleByTriggerEvent"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 6, + "X": 9, + "Y": 6, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["Visible"], + "ToVisibleState": ["VisibleByTriggerEvent"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 7, + "X": 12, + "Y": 5, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["Visible"], + "ToVisibleState": ["VisibleByTriggerEvent"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 8, + "X": 6, + "Y": 7, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["Visible"], + "ToVisibleState": ["VisibleByTriggerEvent"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 9, + "X": 7, + "Y": 7, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["Visible"], + "ToVisibleState": ["VisibleByTriggerEvent"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 10, + "X": 8, + "Y": 7, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["Visible"], + "ToVisibleState": ["VisibleByTriggerEvent"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 11, + "X": 0, + "Y": 5, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["Visible"], + "ToVisibleState": ["VisibleByTriggerEvent"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 12, + "X": 5, + "Y": 7, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["Visible"], + "ToVisibleState": ["VisibleByTriggerEvent"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 13, + "X": 4, + "Y": 7, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["Visible"], + "ToVisibleState": ["VisibleByTriggerEvent"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 14, + "X": 3, + "Y": 5, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["Visible"], + "ToVisibleState": ["VisibleByTriggerEvent"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 15, + "X": 1, + "Y": 5, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["Visible"], + "ToVisibleState": ["VisibleByTriggerEvent"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 16, + "X": 9, + "Y": 7, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["Visible"], + "ToVisibleState": ["VisibleByTriggerEvent"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 17, + "X": 2, + "Y": 5, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["Visible"], + "ToVisibleState": ["VisibleByTriggerEvent"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 18, + "X": 6, + "Y": 5, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["Visible"], + "ToVisibleState": ["VisibleByTriggerEvent"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 19, + "X": 11, + "Y": 5, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["Visible"], + "ToVisibleState": ["VisibleByTriggerEvent"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 20, + "X": 4, + "Y": 5, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["Visible"], + "ToVisibleState": ["VisibleByTriggerEvent"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 21, + "X": 8, + "Y": 5, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["Visible"], + "ToVisibleState": ["VisibleByTriggerEvent"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 22, + "X": 9, + "Y": 5, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["Visible"], + "ToVisibleState": ["VisibleByTriggerEvent"] + }, + // Start anim + { + "$type": "Share.CConfigPlayAnim", + "ID": 50, + "AnimID": 20008, + "Indexes": [ { "X": 14, "Y": 5 } ] + }, + // Show newly 'explored' grids + { + "$type": "Share.CConfigSetMapState", + "ID": 101, + "X": 21, + "Y": 7, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["VisibleByTriggerEvent"], + "ToVisibleState": ["Visible"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 102, + "X": 23, + "Y": 7, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["VisibleByTriggerEvent"], + "ToVisibleState": ["Visible"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 103, + "X": 18, + "Y": 3, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["VisibleByTriggerEvent"], + "ToVisibleState": ["Visible"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 104, + "X": 23, + "Y": 6, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["VisibleByTriggerEvent"], + "ToVisibleState": ["Visible"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 105, + "X": 18, + "Y": 2, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["VisibleByTriggerEvent"], + "ToVisibleState": ["Visible"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 106, + "X": 23, + "Y": 5, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["VisibleByTriggerEvent"], + "ToVisibleState": ["Visible"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 107, + "X": 18, + "Y": 1, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["VisibleByTriggerEvent"], + "ToVisibleState": ["Visible"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 108, + "X": 15, + "Y": 2, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["VisibleByTriggerEvent"], + "ToVisibleState": ["Visible"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 109, + "X": 20, + "Y": 6, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["VisibleByTriggerEvent"], + "ToVisibleState": ["Visible"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 110, + "X": 17, + "Y": 7, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["VisibleByTriggerEvent"], + "ToVisibleState": ["Visible"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 112, + "X": 18, + "Y": 6, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["VisibleByTriggerEvent"], + "ToVisibleState": ["Visible"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 113, + "X": 22, + "Y": 7, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["VisibleByTriggerEvent"], + "ToVisibleState": ["Visible"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 114, + "X": 17, + "Y": 3, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["VisibleByTriggerEvent"], + "ToVisibleState": ["Visible"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 117, + "X": 15, + "Y": 4, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["VisibleByTriggerEvent"], + "ToVisibleState": ["Visible"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 119, + "X": 22, + "Y": 5, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["VisibleByTriggerEvent"], + "ToVisibleState": ["Visible"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 120, + "X": 18, + "Y": 5, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["VisibleByTriggerEvent"], + "ToVisibleState": ["Visible"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 121, + "X": 17, + "Y": 5, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["VisibleByTriggerEvent"], + "ToVisibleState": ["Visible"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 123, + "X": 21, + "Y": 5, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["VisibleByTriggerEvent"], + "ToVisibleState": ["Visible"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 124, + "X": 19, + "Y": 5, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["VisibleByTriggerEvent"], + "ToVisibleState": ["Visible"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 125, + "X": 15, + "Y": 5, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["VisibleByTriggerEvent"], + "ToVisibleState": ["Visible"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 126, + "X": 15, + "Y": 3, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["VisibleByTriggerEvent"], + "ToVisibleState": ["Visible"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 127, + "X": 19, + "Y": 6, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["VisibleByTriggerEvent"], + "ToVisibleState": ["Visible"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 128, + "X": 19, + "Y": 3, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["VisibleByTriggerEvent"], + "ToVisibleState": ["Visible"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 129, + "X": 19, + "Y": 2, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["VisibleByTriggerEvent"], + "ToVisibleState": ["Visible"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 130, + "X": 17, + "Y": 6, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["VisibleByTriggerEvent"], + "ToVisibleState": ["Visible"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 131, + "X": 18, + "Y": 7, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["VisibleByTriggerEvent"], + "ToVisibleState": ["Visible"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 132, + "X": 21, + "Y": 6, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["VisibleByTriggerEvent"], + "ToVisibleState": ["Visible"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 133, + "X": 16, + "Y": 2, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["VisibleByTriggerEvent"], + "ToVisibleState": ["Visible"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 134, + "X": 19, + "Y": 7, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["VisibleByTriggerEvent"], + "ToVisibleState": ["Visible"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 135, + "X": 17, + "Y": 2, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["VisibleByTriggerEvent"], + "ToVisibleState": ["Visible"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 136, + "X": 22, + "Y": 6, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["VisibleByTriggerEvent"], + "ToVisibleState": ["Visible"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 137, + "X": 18, + "Y": 4, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["VisibleByTriggerEvent"], + "ToVisibleState": ["Visible"] + }, + // Post appear camera move + { + "$type": "Share.CConfigCameraMoveV2", + "ID": 51, + "StretchKey": "TargetSlow", + "Type": "CustomBound", + "PositionOffsetType": "Relative", + "PositionOffsetX": "", + "PositionOffsetY": "", + "RadiusX": "", + "RadiusY": "", + "BoundIndexX": { "X": 16, "Y": 1 }, + "BoundIndexY": { "X": 23, "Y": 7 }, + "FreezeZ": false, + "Parallel": true + }, + { + "$type": "Share.CConfigWaitSeconds", + "ID": 52, + "WaitTime": 2 + }, + // Post appear tips + { + "$type": "Share.CConfigCameraMoveV2", + "ID": 201, + "StretchKey": "TargetFast", + "Type": "CustomBound", + "PositionOffsetType": "Relative", + "PositionOffsetX": "", + "PositionOffsetY": "", + "RadiusX": "", + "RadiusY": "", + "BoundIndexX": { "X": 21, "Y": 5 }, + "BoundIndexY": { "X": 23, "Y": 7 }, + "FreezeZ": false, + "Parallel": false + }, + { + "$type": "Share.CConfigWaitSeconds", + "ID": 202, + "WaitTime": 0.5 + }, + { + "$type": "Share.CConfigShowTip", + "ID": 203, + "TipID": 100020034 + }, + { + "$type": "Share.CConfigWaitTipsEnd", + "ID": 204, + "TipsID": [100020033, 100020034] + }, + { + "$type": "Share.CConfigCameraMoveV2", + "ID": 205, + "StretchKey": "TargetFast", + "Type": "CustomBound", + "PositionOffsetType": "Relative", + "PositionOffsetX": "", + "PositionOffsetY": "", + "RadiusX": "", + "RadiusY": "", + "BoundIndexX": { "X": 17, "Y": 0 }, + "BoundIndexY": { "X": 19, "Y": 2 }, + "FreezeZ": true, + "Parallel": false + }, + { + "$type": "Share.CConfigWaitSeconds", + "ID": 206, + "WaitTime": 0.5 + }, + { + "$type": "Share.CConfigShowTip", + "ID": 207, + "TipID": 100020036 + }, + { + "$type": "Share.CConfigWaitTipsEnd", + "ID": 208, + "TipsID": [100020035, 100020036] + }, + { + "$type": "Share.CConfigCameraMoveV2", + "ID": 209, + "StretchKey": "Back", + "Type": "Back", + "PositionOffsetType": "Relative", + "PositionOffsetX": "", + "PositionOffsetY": "", + "RadiusX": "", + "RadiusY": "", + "BoundIndexX": { "X": -32768, "Y": -32768 }, + "BoundIndexY": { "X": -32768, "Y": -32768 }, + "FreezeZ": false, + "Parallel": false + }, + { + "$type": "Share.CConfigShowPopWindow", + "ID": 210, + "PopID": 20016, + "ShowDirectly": true + } + ] + } + } +} diff --git a/assets/LevelProcess/Hollow/Event/Event_1000234.json b/assets/LevelProcess/Hollow/Event/Event_1000234.json new file mode 100644 index 0000000..d24334f --- /dev/null +++ b/assets/LevelProcess/Hollow/Event/Event_1000234.json @@ -0,0 +1,105 @@ +{ + "ID": 1000234, + "Events": { + "OnStart": { + "ID": 10002341, + "Actions": [ + { + "$type": "Share.CConfigCameraMoveV2", + "ID": 1, + "StretchKey": "TargetSlow", + "Type": "CustomBound", + "PositionOffsetType": "Relative", + "PositionOffsetX": "", + "PositionOffsetY": "", + "RadiusX": "", + "RadiusY": "", + "BoundIndexX": { "X": 20, "Y": 2 }, + "BoundIndexY": { "X": 22, "Y": 4 }, + "FreezeZ": true, + "Parallel": true + }, + { + "$type": "Share.CConfigWaitSeconds", + "ID": 2, + "WaitTime": 1 + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 3, + "X": 22, + "Y": 2, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["VisibleByTriggerEvent"], + "ToVisibleState": ["Visible"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 4, + "X": 22, + "Y": 4, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["VisibleByTriggerEvent"], + "ToVisibleState": ["Visible"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 5, + "X": 22, + "Y": 3, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["VisibleByTriggerEvent"], + "ToVisibleState": ["Visible"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 6, + "X": 21, + "Y": 2, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["VisibleByTriggerEvent"], + "ToVisibleState": ["Visible"] + }, + { + "$type": "Share.CConfigSetMapState", + "ID": 7, + "X": 20, + "Y": 2, + "Position": "Absolute", + "Radius": 0, + "Count": 1, + "FromVisibleState": ["VisibleByTriggerEvent"], + "ToVisibleState": ["Visible"] + }, + { + "$type": "Share.CConfigWaitSeconds", + "ID": 8, + "WaitTime": 1 + }, + { + "$type": "Share.CConfigCameraMoveV2", + "ID": 9, + "StretchKey": "Back", + "Type": "Back", + "PositionOffsetType": "Relative", + "PositionOffsetX": "", + "PositionOffsetY": "", + "RadiusX": "", + "RadiusY": "", + "BoundIndexX": { "X": -32768, "Y": -32768 }, + "BoundIndexY": { "X": -32768, "Y": -32768 }, + "FreezeZ": false, + "Parallel": false + } + ] + } + } +} diff --git a/assets/LevelProcess/Hollow/Event/Event_1013.json b/assets/LevelProcess/Hollow/Event/Event_1013.json new file mode 100644 index 0000000..567dd02 --- /dev/null +++ b/assets/LevelProcess/Hollow/Event/Event_1013.json @@ -0,0 +1,28 @@ +{ + "ID": 1013, + "Specials": { + "HpPercentage": 10, + "HpRatio": 1000 + }, + "Events": { + "OnStart": { + "ID": 10131, + "Actions": [ + // TODO: damage the squad. In chessboard 10002 this is useless though, since the squad is empty + // { + // "$type": "Share.CConfigModifyProperty", + // "ID": 1, + // "Property": "Hp", + // "Count": "-property(HpMax_Battle)*(specials(HpPercentage)+scenevar(TrapEnhance_1013))*0.01" + // }, + { + "$type": "Share.CConfigPlayAnim", + "ID": 2, + "AnimID": 20004, + "Indexes": [], + "Looping": true + } + ] + } + } +} diff --git a/assets/LevelProcess/Hollow/Event/Event_1023.json b/assets/LevelProcess/Hollow/Event/Event_1023.json new file mode 100644 index 0000000..39611e3 --- /dev/null +++ b/assets/LevelProcess/Hollow/Event/Event_1023.json @@ -0,0 +1,39 @@ +{ + "ID": 1023, + "Events": { + "OnStart": { + "ID": 10231, + "Actions": [ + { + "$type": "Share.CConfigReward", + "ID": 1, + "OnceRewardID": "specials(OnceRewardID)" + }, + { + "$type": "Share.CConfigPlayAnim", + "ID": 2, + "AnimID": 21052, + "Indexes": [] + }, + { + "$type": "Share.CConfigWaitSeconds", + "ID": 3, + "WaitTime": 0.5 + }, + { + "$type": "Share.CConfigEventModification", + "ID": 4, + "X": 0, + "Y": 0, + "Position": "Relative", + "Radius": 1, + "ModificationNum": 1, + "ModificationType": 1, + "EventID": [1000], + "EventState": "Finished", + "VisibleState": "Visible" + } + ] + } + } +} diff --git a/assets/LevelProcess/Hollow/Event/Event_1024.json b/assets/LevelProcess/Hollow/Event/Event_1024.json new file mode 100644 index 0000000..d177e72 --- /dev/null +++ b/assets/LevelProcess/Hollow/Event/Event_1024.json @@ -0,0 +1,34 @@ +{ + "ID": 1024, + "Events": { + "OnStart": { + "ID": 10241, + "Actions": [ + { + "$type": "Share.CConfigReward", + "ID": 1, + "OnceRewardID": "specials(OnceRewardID)" + }, + { + "$type": "Share.CConfigPlayAnim", + "ID": 2, + "AnimID": 21048, + "Indexes": [] + }, + { + "$type": "Share.CConfigEventModification", + "ID": 3, + "X": 0, + "Y": 0, + "Position": "Relative", + "Radius": 1, + "ModificationNum": 1, + "ModificationType": 1, + "EventID": [1000], + "EventState": "Finished", + "VisibleState": "Visible" + } + ] + } + } +} diff --git a/assets/LevelProcess/Hollow/Event/Event_1025.json b/assets/LevelProcess/Hollow/Event/Event_1025.json new file mode 100644 index 0000000..18c5634 --- /dev/null +++ b/assets/LevelProcess/Hollow/Event/Event_1025.json @@ -0,0 +1,36 @@ +{ + "ID": 1025, + "Events": { + "OnStart": { + "ID": 10251, + "Actions": [ + { + "$type": "Share.CConfigAddItem", + "ID": 1, + "ItemID": 10, + "Count": "specials(Diny)" + }, + { + "$type": "Share.CConfigPlayAnim", + "ID": 2, + "AnimID": 21050, + "Indexes": [], + "Looping": true + }, + { + "$type": "Share.CConfigEventModification", + "ID": 3, + "X": 0, + "Y": 0, + "Position": "Relative", + "Radius": 1, + "ModificationNum": 1, + "ModificationType": 1, + "EventID": [1000], + "EventState": "Finished", + "VisibleState": "Visible" + } + ] + } + } +} diff --git a/assets/LevelProcess/Hollow/Event/Event_1061.json b/assets/LevelProcess/Hollow/Event/Event_1061.json new file mode 100644 index 0000000..369cc0e --- /dev/null +++ b/assets/LevelProcess/Hollow/Event/Event_1061.json @@ -0,0 +1,15 @@ +{ + "ID": 1061, + "Events": { + "OnStart": { + "ID": 10611, + "Actions": [ + { + "$type": "Share.CConfigPushWithDirection", + "ID": 1, + "Direction": "specials(direct)" + } + ] + } + } +} diff --git a/assets/LevelProcess/Hollow/Event/Event_DebugMenu.json b/assets/LevelProcess/Hollow/Event/Event_DebugMenu.json new file mode 100644 index 0000000..894dba4 --- /dev/null +++ b/assets/LevelProcess/Hollow/Event/Event_DebugMenu.json @@ -0,0 +1,958 @@ +{ + "ID": 1010408, + "Events": { + "OnStart": { + "ID": 10104081, + "Actions": [ + { + "$type": "Share.CConfigOpenDialog", + "ID": 1, + "OpenEvent": true, + "CameraMove": true, + "UnkOpenDialog": true, + "OpenParam": { + "UnkOpenDialogFlag1": true, + "StartTextureSheet": "30122", + "UnkOpenDialogFlag2": false, + "LoopTextureSheet": "30123", + "EndTextureSheet": "30124", + "UnkOpenDialogFlag3": true + } + }, + { + "$type": "Share.CConfigLogText", + "ID": 2, + "Messages": [ + "Welcome to vivian-rs Debug Menu!" + ], + "LogTitle": "Debug Menu", + "Voicelines": [] + }, + { + "$type": "Share.CConfigBreakDialogAnim", + "ID": 3 + }, + { + "$type": "Share.CConfigMakeDialogChoice", + "ID": 4, + "Title": "Debug Menu", + "Description": "Welcome to vivian-rs Debug Menu!", + "QuestionDescription": "Make a choice..", + "ChoiceDetails": [ + { + "OptionText": "Unlock a character...", + "OptionID": "107", + "OptionText2": "", + "ChoiceID": 5, + "UID": 1 + }, + { + "OptionText": "Return to the city", + "OptionID": "107", + "OptionText2": "", + "ChoiceID": 5, + "UID": 5555 + } + ] + }, + { + "$type": "Share.CConfigFinishHollow", + "ID": 5, + "Predicates": + [ + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 5555 + } + ] + }, + { + "$type": "Share.CConfigMakeDialogChoice", + "ID": 1000, + "Title": "Debug Menu", + "Description": "Choose an agent you want to obtain", + "QuestionDescription": "Make a choice..", + "ChoiceDetails": [ + { + "OptionText": "Anby", + "OptionID": "1011", + "OptionText2": "", + "ChoiceID": 5, + "UID": 1011 + }, + { + "OptionText": "Nekomata", + "OptionID": "1021", + "OptionText2": "", + "ChoiceID": 5, + "UID": 1021 + }, + { + "OptionText": "Nicole", + "OptionID": "1031", + "OptionText2": "", + "ChoiceID": 5, + "UID": 1031 + }, + { + "OptionText": "Next page", + "OptionID": "107", + "OptionText2": "", + "ChoiceID": 5, + "UID": 8888 + } + ] + }, + { + "$type": "Share.CConfigMakeDialogChoice", + "ID": 2000, + "Title": "Debug Menu", + "Description": "Choose an agent you want to obtain", + "QuestionDescription": "Make a choice..", + "ChoiceDetails": [ + { + "OptionText": "Soldier 11", + "OptionID": "1041", + "OptionText2": "", + "ChoiceID": 5, + "UID": 1041 + }, + { + "OptionText": "Corin", + "OptionID": "1061", + "OptionText2": "", + "ChoiceID": 5, + "UID": 1061 + }, + { + "OptionText": "Caesar", + "OptionID": "1071", + "OptionText2": "", + "ChoiceID": 5, + "UID": 1071 + }, + { + "OptionText": "Next page", + "OptionID": "107", + "OptionText2": "", + "ChoiceID": 5, + "UID": 8888 + } + ], + "Predicates": [ + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 8888 + } + ] + }, + { + "$type": "Share.CConfigMakeDialogChoice", + "ID": 3000, + "Title": "Debug Menu", + "Description": "Choose an agent you want to obtain", + "QuestionDescription": "Make a choice..", + "ChoiceDetails": [ + { + "OptionText": "Billy", + "OptionID": "1081", + "OptionText2": "", + "ChoiceID": 5, + "UID": 1081 + }, + { + "OptionText": "Miyabi", + "OptionID": "1091", + "OptionText2": "", + "ChoiceID": 5, + "UID": 1091 + }, + { + "OptionText": "Koleda", + "OptionID": "1101", + "OptionText2": "", + "ChoiceID": 5, + "UID": 1101 + }, + { + "OptionText": "Next page", + "OptionID": "107", + "OptionText2": "", + "ChoiceID": 5, + "UID": 8888 + } + ], + "Predicates": [ + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 8888 + } + ] + }, + { + "$type": "Share.CConfigMakeDialogChoice", + "ID": 4000, + "Title": "Debug Menu", + "Description": "Choose an agent you want to obtain", + "QuestionDescription": "Make a choice..", + "ChoiceDetails": [ + { + "OptionText": "Anton", + "OptionID": "1111", + "OptionText2": "", + "ChoiceID": 5, + "UID": 1111 + }, + { + "OptionText": "Ben", + "OptionID": "1121", + "OptionText2": "", + "ChoiceID": 5, + "UID": 1121 + }, + { + "OptionText": "Soukaku", + "OptionID": "1131", + "OptionText2": "", + "ChoiceID": 5, + "UID": 1131 + }, + { + "OptionText": "Next page", + "OptionID": "107", + "OptionText2": "", + "ChoiceID": 5, + "UID": 8888 + } + ], + "Predicates": [ + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 8888 + } + ] + }, + { + "$type": "Share.CConfigMakeDialogChoice", + "ID": 5000, + "Title": "Debug Menu", + "Description": "Choose an agent you want to obtain", + "QuestionDescription": "Make a choice..", + "ChoiceDetails": [ + { + "OptionText": "Lycaon", + "OptionID": "1141", + "OptionText2": "", + "ChoiceID": 5, + "UID": 1141 + }, + { + "OptionText": "Lucy", + "OptionID": "1151", + "OptionText2": "", + "ChoiceID": 5, + "UID": 1151 + }, + { + "OptionText": "Lighter", + "OptionID": "1161", + "OptionText2": "", + "ChoiceID": 5, + "UID": 1161 + }, + { + "OptionText": "Next page", + "OptionID": "107", + "OptionText2": "", + "ChoiceID": 5, + "UID": 8888 + } + ], + "Predicates": [ + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 8888 + } + ] + }, + { + "$type": "Share.CConfigMakeDialogChoice", + "ID": 6000, + "Title": "Debug Menu", + "Description": "Choose an agent you want to obtain", + "QuestionDescription": "Make a choice..", + "ChoiceDetails": [ + { + "OptionText": "Burnice", + "OptionID": "1171", + "OptionText2": "", + "ChoiceID": 5, + "UID": 1171 + }, + { + "OptionText": "Grace", + "OptionID": "1181", + "OptionText2": "", + "ChoiceID": 5, + "UID": 1181 + }, + { + "OptionText": "Ellen", + "OptionID": "1191", + "OptionText2": "", + "ChoiceID": 5, + "UID": 1191 + }, + { + "OptionText": "Next page", + "OptionID": "107", + "OptionText2": "", + "ChoiceID": 5, + "UID": 8888 + } + ], + "Predicates": [ + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 8888 + } + ] + }, + { + "$type": "Share.CConfigMakeDialogChoice", + "ID": 7000, + "Title": "Debug Menu", + "Description": "Choose an agent you want to obtain", + "QuestionDescription": "Make a choice..", + "ChoiceDetails": [ + { + "OptionText": "Harumasa", + "OptionID": "1201", + "OptionText2": "", + "ChoiceID": 5, + "UID": 1201 + }, + { + "OptionText": "Rina", + "OptionID": "1211", + "OptionText2": "", + "ChoiceID": 5, + "UID": 1211 + }, + { + "OptionText": "Yanagi", + "OptionID": "1221", + "OptionText2": "", + "ChoiceID": 5, + "UID": 1221 + }, + { + "OptionText": "Next page", + "OptionID": "107", + "OptionText2": "", + "ChoiceID": 5, + "UID": 8888 + } + ], + "Predicates": [ + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 8888 + } + ] + }, + { + "$type": "Share.CConfigMakeDialogChoice", + "ID": 8000, + "Title": "Debug Menu", + "Description": "Choose an agent you want to obtain", + "QuestionDescription": "Make a choice..", + "ChoiceDetails": [ + { + "OptionText": "Zhu Yuan", + "OptionID": "1241", + "OptionText2": "", + "ChoiceID": 5, + "UID": 1241 + }, + { + "OptionText": "Qingyi", + "OptionID": "1251", + "OptionText2": "", + "ChoiceID": 5, + "UID": 1251 + }, + { + "OptionText": "Jane", + "OptionID": "1261", + "OptionText2": "", + "ChoiceID": 5, + "UID": 1261 + }, + { + "OptionText": "Next page", + "OptionID": "107", + "OptionText2": "", + "ChoiceID": 5, + "UID": 8888 + } + ], + "Predicates": [ + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 8888 + } + ] + }, + { + "$type": "Share.CConfigMakeDialogChoice", + "ID": 9000, + "Title": "Debug Menu", + "Description": "Choose an agent you want to obtain", + "QuestionDescription": "Make a choice..", + "ChoiceDetails": [ + { + "OptionText": "Seth", + "OptionID": "1271", + "OptionText2": "", + "ChoiceID": 5, + "UID": 1271 + }, + { + "OptionText": "Piper", + "OptionID": "1281", + "OptionText2": "", + "ChoiceID": 5, + "UID": 1281 + }, + { + "OptionText": "Astra Yao", + "OptionID": "107", + "OptionText2": "", + "ChoiceID": 5, + "UID": 1311 + }, + { + "OptionText": "Next page", + "OptionID": "107", + "OptionText2": "", + "ChoiceID": 5, + "UID": 8888 + } + ], + "Predicates": [ + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 8888 + } + ] + }, + { + "$type": "Share.CConfigMakeDialogChoice", + "ID": 10000, + "Title": "Debug Menu", + "Description": "Choose an agent you want to obtain", + "QuestionDescription": "Make a choice..", + "ChoiceDetails": [ + { + "OptionText": "Evelyn", + "OptionID": "107", + "OptionText2": "", + "ChoiceID": 5, + "UID": 1321 + }, + { + "OptionText": "Vivian", + "OptionID": "107", + "OptionText2": "", + "ChoiceID": 5, + "UID": 1331 + }, + { + "OptionText": "Trigger", + "OptionID": "107", + "OptionText2": "", + "ChoiceID": 5, + "UID": 1361 + }, + { + "OptionText": "Next page", + "OptionID": "107", + "OptionText2": "", + "ChoiceID": 5, + "UID": 8888 + } + ], + "Predicates": [ + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 8888 + } + ] + }, + { + "$type": "Share.CConfigMakeDialogChoice", + "ID": 11000, + "Title": "Debug Menu", + "Description": "Choose an agent you want to obtain", + "QuestionDescription": "Make a choice..", + "ChoiceDetails": [ + { + "OptionText": "Soldier 0 Anby", + "OptionID": "107", + "OptionText2": "", + "ChoiceID": 5, + "UID": 1381 + }, + { + "OptionText": "Pulchra", + "OptionID": "107", + "OptionText2": "", + "ChoiceID": 5, + "UID": 1351 + } + ], + "Predicates": [ + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 8888 + } + ] + }, + { + "$type": "Share.CConfigAddItem", + "ID": 1011, + "ItemID": 1011, + "Count": 1, + "Predicates": [ + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 1011 + } + ] + }, + { + "$type": "Share.CConfigAddItem", + "ID": 1021, + "ItemID": 1021, + "Count": 1, + "Predicates": [ + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 1021 + } + ] + }, + { + "$type": "Share.CConfigAddItem", + "ID": 1031, + "ItemID": 1031, + "Count": 1, + "Predicates": [ + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 1031 + } + ] + }, + { + "$type": "Share.CConfigAddItem", + "ID": 1041, + "ItemID": 1041, + "Count": 1, + "Predicates": [ + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 1041 + } + ] + }, + { + "$type": "Share.CConfigAddItem", + "ID": 1061, + "ItemID": 1061, + "Count": 1, + "Predicates": [ + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 1061 + } + ] + }, + { + "$type": "Share.CConfigAddItem", + "ID": 1071, + "ItemID": 1071, + "Count": 1, + "Predicates": [ + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 1071 + } + ] + }, + { + "$type": "Share.CConfigAddItem", + "ID": 1081, + "ItemID": 1081, + "Count": 1, + "Predicates": [ + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 1081 + } + ] + }, + { + "$type": "Share.CConfigAddItem", + "ID": 1091, + "ItemID": 1091, + "Count": 1, + "Predicates": [ + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 1091 + } + ] + }, + { + "$type": "Share.CConfigAddItem", + "ID": 1101, + "ItemID": 1101, + "Count": 1, + "Predicates": [ + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 1101 + } + ] + }, + { + "$type": "Share.CConfigAddItem", + "ID": 1111, + "ItemID": 1111, + "Count": 1, + "Predicates": [ + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 1111 + } + ] + }, + { + "$type": "Share.CConfigAddItem", + "ID": 1121, + "ItemID": 1121, + "Count": 1, + "Predicates": [ + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 1121 + } + ] + }, + { + "$type": "Share.CConfigAddItem", + "ID": 1131, + "ItemID": 1131, + "Count": 1, + "Predicates": [ + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 1131 + } + ] + }, + { + "$type": "Share.CConfigAddItem", + "ID": 1141, + "ItemID": 1141, + "Count": 1, + "Predicates": [ + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 1141 + } + ] + }, + { + "$type": "Share.CConfigAddItem", + "ID": 1151, + "ItemID": 1151, + "Count": 1, + "Predicates": [ + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 1151 + } + ] + }, + { + "$type": "Share.CConfigAddItem", + "ID": 1161, + "ItemID": 1161, + "Count": 1, + "Predicates": [ + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 1161 + } + ] + }, + { + "$type": "Share.CConfigAddItem", + "ID": 1171, + "ItemID": 1171, + "Count": 1, + "Predicates": [ + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 1171 + } + ] + }, + { + "$type": "Share.CConfigAddItem", + "ID": 1181, + "ItemID": 1181, + "Count": 1, + "Predicates": [ + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 1181 + } + ] + }, + { + "$type": "Share.CConfigAddItem", + "ID": 1191, + "ItemID": 1191, + "Count": 1, + "Predicates": [ + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 1191 + } + ] + }, + { + "$type": "Share.CConfigAddItem", + "ID": 1201, + "ItemID": 1201, + "Count": 1, + "Predicates": [ + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 1201 + } + ] + }, + { + "$type": "Share.CConfigAddItem", + "ID": 1211, + "ItemID": 1211, + "Count": 1, + "Predicates": [ + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 1211 + } + ] + }, + { + "$type": "Share.CConfigAddItem", + "ID": 1221, + "ItemID": 1221, + "Count": 1, + "Predicates": [ + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 1221 + } + ] + }, + { + "$type": "Share.CConfigAddItem", + "ID": 1241, + "ItemID": 1241, + "Count": 1, + "Predicates": [ + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 1241 + } + ] + }, + { + "$type": "Share.CConfigAddItem", + "ID": 1251, + "ItemID": 1251, + "Count": 1, + "Predicates": [ + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 1251 + } + ] + }, + { + "$type": "Share.CConfigAddItem", + "ID": 1261, + "ItemID": 1261, + "Count": 1, + "Predicates": [ + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 1261 + } + ] + }, + { + "$type": "Share.CConfigAddItem", + "ID": 1271, + "ItemID": 1271, + "Count": 1, + "Predicates": [ + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 1271 + } + ] + }, + { + "$type": "Share.CConfigAddItem", + "ID": 1281, + "ItemID": 1281, + "Count": 1, + "Predicates": [ + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 1281 + } + ] + }, + { + "$type": "Share.CConfigAddItem", + "ID": 1311, + "ItemID": 1311, + "Count": 1, + "Predicates": [ + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 1311 + } + ] + }, + { + "$type": "Share.CConfigAddItem", + "ID": 1321, + "ItemID": 1321, + "Count": 1, + "Predicates": [ + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 1321 + } + ] + }, + { + "$type": "Share.CConfigAddItem", + "ID": 1331, + "ItemID": 1331, + "Count": 1, + "Predicates": [ + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 1331 + } + ] + }, + { + "$type": "Share.CConfigAddItem", + "ID": 1361, + "ItemID": 1361, + "Count": 1, + "Predicates": [ + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 1361 + } + ] + }, + { + "$type": "Share.CConfigAddItem", + "ID": 1381, + "ItemID": 1381, + "Count": 1, + "Predicates": [ + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 1381 + } + ] + }, + { + "$type": "Share.CConfigAddItem", + "ID": 1351, + "ItemID": 1351, + "Count": 1, + "Predicates": [ + { + "$type": "Share.CConfigEventByChoiceServer", + "CompareType": "Equal", + "UID": 1351 + } + ] + }, + { + "$type": "Share.CConfigCloseDialog", + "ID": 99998, + "CameraMove": true, + "NeedResetCenter": true + } + ] + } + } +} diff --git a/assets/LevelProcess/MainCity/Interact/Interact_10000001.json b/assets/LevelProcess/MainCity/Interact/Interact_10000001.json new file mode 100644 index 0000000..84794dc --- /dev/null +++ b/assets/LevelProcess/MainCity/Interact/Interact_10000001.json @@ -0,0 +1,26 @@ +{ + //主城默认传送-Street2Workshop + "ID": 10000001, + "Specials": { + "Radius": 2000 + }, + "Events": { + "OnInteract": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionSwitchSection", + "ID": 101, + "SectionID": 2, + "Transform": "Workshop_PlayerPos_FromStreet", + "CameraY": 6000,// must * 10000 + "CameraX": 0 + }, + { + "$type": "Share.CActionResetEventCfg", + "ID": 102 + } + ] + } + } +} diff --git a/assets/LevelProcess/MainCity/Interact/Interact_10000002.json b/assets/LevelProcess/MainCity/Interact/Interact_10000002.json new file mode 100644 index 0000000..f1310e2 --- /dev/null +++ b/assets/LevelProcess/MainCity/Interact/Interact_10000002.json @@ -0,0 +1,26 @@ +{ + //主城默认传送-Street2Garage + "ID": 10000002, + "Specials": { + "Radius": 2000 + }, + "Events": { + "OnInteract": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionSwitchSection", + "ID": 101, + "SectionID": 3, + "Transform": "Garage_PlayerPos_FromStreet", + "CameraY": 6000,// must * 10000 + "CameraX": 0 + }, + { + "$type": "Share.CActionResetEventCfg", + "ID": 102 + } + ] + } + } +} diff --git a/assets/LevelProcess/MainCity/Interact/Interact_10000003.json b/assets/LevelProcess/MainCity/Interact/Interact_10000003.json new file mode 100644 index 0000000..a5e2119 --- /dev/null +++ b/assets/LevelProcess/MainCity/Interact/Interact_10000003.json @@ -0,0 +1,26 @@ +{ + //主城默认传送-Workshop2Street + "ID": 10000003, + "Specials": { + "Radius": 2000 + }, + "Events": { + "OnInteract": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionSwitchSection", + "ID": 101, + "SectionID": 1, + "Transform": "Street_PlayerPos_FromWorkshop", + "CameraY": 6000,// must * 10000 + "CameraX": 0 + }, + { + "$type": "Share.CActionResetEventCfg", + "ID": 102 + } + ] + } + } +} diff --git a/assets/LevelProcess/MainCity/Interact/Interact_10000004.json b/assets/LevelProcess/MainCity/Interact/Interact_10000004.json new file mode 100644 index 0000000..721b17a --- /dev/null +++ b/assets/LevelProcess/MainCity/Interact/Interact_10000004.json @@ -0,0 +1,26 @@ +{ + //主城默认传送-Workshop2Garage + "ID": 10000004, + "Specials": { + "Radius": 2000 + }, + "Events": { + "OnInteract": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionSwitchSection", + "ID": 101, + "SectionID": 3, + "Transform": "Garage_PlayerPos_FromWorkshop", + "CameraY": 6000,// must * 10000 + "CameraX": 0 + }, + { + "$type": "Share.CActionResetEventCfg", + "ID": 102 + } + ] + } + } +} diff --git a/assets/LevelProcess/MainCity/Interact/Interact_10000005.json b/assets/LevelProcess/MainCity/Interact/Interact_10000005.json new file mode 100644 index 0000000..569da4b --- /dev/null +++ b/assets/LevelProcess/MainCity/Interact/Interact_10000005.json @@ -0,0 +1,26 @@ +{ + //主城默认传送-Garage2Street + "ID": 10000005, + "Specials": { + "Radius": 2000 + }, + "Events": { + "OnInteract": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionSwitchSection", + "ID": 101, + "SectionID": 1, + "Transform": "Street_PlayerPos_FromGarage", + "CameraY": 6000,// must * 10000 + "CameraX": 0 + }, + { + "$type": "Share.CActionResetEventCfg", + "ID": 102 + } + ] + } + } +} diff --git a/assets/LevelProcess/MainCity/Interact/Interact_10000006.json b/assets/LevelProcess/MainCity/Interact/Interact_10000006.json new file mode 100644 index 0000000..432325c --- /dev/null +++ b/assets/LevelProcess/MainCity/Interact/Interact_10000006.json @@ -0,0 +1,26 @@ +{ + //主城默认传送-Garage2Workshop + "ID": 10000006, + "Specials": { + "Radius": 2000 + }, + "Events": { + "OnInteract": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionSwitchSection", + "ID": 101, + "SectionID": 2, + "Transform": "Workshop_PlayerPos_FromGarage", + "CameraY": 6000,// must * 10000 + "CameraX": 600000 + }, + { + "$type": "Share.CActionResetEventCfg", + "ID": 102 + } + ] + } + } +} diff --git a/assets/LevelProcess/MainCity/Interact/Interact_10000009.json b/assets/LevelProcess/MainCity/Interact/Interact_10000009.json new file mode 100644 index 0000000..cba17b0 --- /dev/null +++ b/assets/LevelProcess/MainCity/Interact/Interact_10000009.json @@ -0,0 +1,24 @@ +{ + //主城打开空洞 + "ID": 10000009, + "Specials": { + "Radius": 2000 + }, + "Events": { + "OnInteract": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionOpenUI", + "ID": 101, + "UI": "UIYorozuyaPage", + "StoreTemplateID": 1161 + }, + { + "$type": "Share.CActionResetEventCfg", + "ID": 102 + } + ] + } + } +} diff --git a/assets/LevelProcess/MainCity/Interact/Interact_10000016.json b/assets/LevelProcess/MainCity/Interact/Interact_10000016.json new file mode 100644 index 0000000..586f9dc --- /dev/null +++ b/assets/LevelProcess/MainCity/Interact/Interact_10000016.json @@ -0,0 +1,32 @@ +{ + //主城默认传送-Street2Garage2 + "ID": 10000016, + "Specials": { + "Radius": 2000 + }, + "Events": { + "OnInteract": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionSwitchSection", + "ID": 101, + "SectionID": 3, + "Transform": "Garage_PlayerPos_FromStreet2", + "CameraY": 6000,// must * 10000 + "CameraX": 0 + }, + // { + // "$type": "Share.CActionChangeCameraCfg", + // "ID": 103, + // "CameraY": 10, + // "CameraX": 10 + // }, + { + "$type": "Share.CActionResetEventCfg", + "ID": 102 + } + ] + } + } +} diff --git a/assets/LevelProcess/MainCity/Interact/Interact_10000017.json b/assets/LevelProcess/MainCity/Interact/Interact_10000017.json new file mode 100644 index 0000000..d044868 --- /dev/null +++ b/assets/LevelProcess/MainCity/Interact/Interact_10000017.json @@ -0,0 +1,32 @@ +{ + //主城默认传送-Garage2Street2 + "ID": 10000017, + "Specials": { + "Radius": 2000 + }, + "Events": { + "OnInteract": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionSwitchSection", + "ID": 101, + "SectionID": 1, + "Transform": "Street_PlayerPos_FromGarage2", + "CameraY": 6000,// must * 10000 + "CameraX": 0 + }, + // { + // "$type": "Share.CActionChangeCameraCfg", + // "ID": 103, + // "CameraY": 50,// must * 10000 + // "CameraX": 180 + // }, + { + "$type": "Share.CActionResetEventCfg", + "ID": 102 + } + ] + } + } +} diff --git a/assets/LevelProcess/MainCity/Interact/Interact_10000021.json b/assets/LevelProcess/MainCity/Interact/Interact_10000021.json new file mode 100644 index 0000000..4e03365 --- /dev/null +++ b/assets/LevelProcess/MainCity/Interact/Interact_10000021.json @@ -0,0 +1,22 @@ +{ + "ID": 10000021, + "Specials": { + "Radius": 2000 + }, + "Events": { + "OnInteract": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionShowTeleportUI", + "ID": 101, + "BlackMask": true + }, + { + "$type": "Share.CActionResetEventCfg", + "ID": 102 + } + ] + } + } +} diff --git a/assets/LevelProcess/MainCity/Interact/Interact_10001001.json b/assets/LevelProcess/MainCity/Interact/Interact_10001001.json new file mode 100644 index 0000000..c9d3a9c --- /dev/null +++ b/assets/LevelProcess/MainCity/Interact/Interact_10001001.json @@ -0,0 +1,29 @@ +{ + "ID": 10001001, + "Events": { + "OnInteract": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionPerformCfg", + "ID": 101, + "PerformID": 3000019, + "Participators": { "2001": "A" } + }, + { + "$type": "Share.CActionSetQuestPhaseCfg", + "ID": 102, + "TargetPhase": "Finished", + //Unlocked InProgress Finished + "QuestID": 10020003 + } + ] + } + }, + "Predicates": [ + { + "$type": "Share.CConfigEventByCharacterType", + "Type": "1" + } + ] +} diff --git a/assets/LevelProcess/MainCity/Interact/Interact_10001005.json b/assets/LevelProcess/MainCity/Interact/Interact_10001005.json new file mode 100644 index 0000000..6d6b732 --- /dev/null +++ b/assets/LevelProcess/MainCity/Interact/Interact_10001005.json @@ -0,0 +1,49 @@ +{ + "ID": 10001005, + "Events": { + "OnInteract": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionPerformCfg", + "ID": 101, + "PerformID": 3000032, + "Participators": { "2256": "A", "2011": "B" }, + "Predicates": [ + { + "$type": "Share.CConfigEventByMainCharacter", + "CompareType": "Equal", + "AvatarID":2011 + } + ] + }, + { + "$type": "Share.CActionPerformCfg", + "ID": 102, + "PerformID": 3000032, + "Participators": { "2257": "A", "2011": "B" }, + "Predicates": [ + { + "$type": "Share.CConfigEventByMainCharacter", + "CompareType": "Equal", + "AvatarID":2021 + } + ] + }, + { + "$type": "Share.CActionSetQuestPhaseCfg", + "ID": 103, + "TargetPhase": "Finished", + //Unlocked InProgress Finished + "QuestID": 10020032 + } + ] + } + }, + "Predicates": [ + { + "$type": "Share.CConfigEventByCharacterType", + "Type": "1" + } + ] +} diff --git a/assets/LevelProcess/MainCity/Interact/Interact_10001028.json b/assets/LevelProcess/MainCity/Interact/Interact_10001028.json new file mode 100644 index 0000000..e8eb91f --- /dev/null +++ b/assets/LevelProcess/MainCity/Interact/Interact_10001028.json @@ -0,0 +1,40 @@ +{ + "ID": 10001028, + "Events": { + "OnInteract": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionPerformCfg", + "ID": 101, + "PerformID": 3000037, + "Participators": { "2256": "A", "2011": "B" }, + "Predicates": [ + { + "$type": "Share.CConfigEventByMainCharacter", + "CompareType": "Equal", + "AvatarID":2011 + } + ] + }, + { + "$type": "Share.CActionPerformCfg", + "ID": 102, + "PerformID": 3000037, + "Participators": { "2257": "A", "2011": "B" }, + "Predicates": [ + { + "$type": "Share.CConfigEventByMainCharacter", + "CompareType": "Equal", + "AvatarID":2021 + } + ] + }, + { + "$type": "Share.CActionResetEventCfg", + "ID": 103 + } + ] + } + } +} diff --git a/assets/LevelProcess/MainCity/Interact/Interact_10001059.json b/assets/LevelProcess/MainCity/Interact/Interact_10001059.json new file mode 100644 index 0000000..7479208 --- /dev/null +++ b/assets/LevelProcess/MainCity/Interact/Interact_10001059.json @@ -0,0 +1,32 @@ +{ + "ID": 10001059, + "Events": { + "OnInteract": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionPerformCfg", + "ID": 101, + "PerformID": 60000008, + "PerformID2": 10000002, + "AvatarID": 1011, + "NpcID": 10046, + "Participators": { "2103": "A" } + }, + { + "$type": "Share.CActionSetQuestPhaseCfg", + "ID": 102, + "TargetPhase": "Finished", + //Unlocked InProgress Finished + "QuestID": 10020044 + } + ] + } + }, + "Predicates": [ + { + "$type": "Share.CConfigEventByCharacterType", + "Type": "1" + } + ] +} diff --git a/assets/LevelProcess/MainCity/Interact/Interact_10001065.json b/assets/LevelProcess/MainCity/Interact/Interact_10001065.json new file mode 100644 index 0000000..631fb3f --- /dev/null +++ b/assets/LevelProcess/MainCity/Interact/Interact_10001065.json @@ -0,0 +1,34 @@ +{ + "ID": 10001065, + "Events": { + "OnInteract": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionPerformCfg", + "ID": 101, + "PerformID": 30000008, + "Participators": { "2103": "A" } + }, + { + "$type": "Share.CConfigUnlockHollowQuest", + "ID": 102, + "QuestID": 10010002 + }, + { + "$type": "Share.CActionSetQuestPhaseCfg", + "ID": 103, + "TargetPhase": "Finished", + //Unlocked InProgress Finished + "QuestID": 10020078 + } + ] + } + }, + "Predicates": [ + { + "$type": "Share.CConfigEventByCharacterType", + "Type": "1" + } + ] +} diff --git a/assets/LevelProcess/MainCity/Interact/Interact_10001066.json b/assets/LevelProcess/MainCity/Interact/Interact_10001066.json new file mode 100644 index 0000000..bf77aba --- /dev/null +++ b/assets/LevelProcess/MainCity/Interact/Interact_10001066.json @@ -0,0 +1,23 @@ +{ + "ID": 10001066, + "Specials": { + "Firsttalk": 1 + }, + "Events": { + "OnInteract": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionOpenUI", + "ID": 10, + "UI": "UINewsStandPageController", + "StoreTemplateID": 1061 + }, + { + "$type": "Share.CActionResetEventCfg", + "ID": 11 + } + ] + } + } +} diff --git a/assets/LevelProcess/MainCity/Interact/Interact_15000301.json b/assets/LevelProcess/MainCity/Interact/Interact_15000301.json new file mode 100644 index 0000000..bd7a61e --- /dev/null +++ b/assets/LevelProcess/MainCity/Interact/Interact_15000301.json @@ -0,0 +1,20 @@ +{ + "ID": 15000301, + "Events": { + "OnInteract": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionOpenUI", + "ID": 10, + "UI": "UINewsStandPageController", + "StoreTemplateID": 1061 + }, + { + "$type": "Share.CActionResetEventCfg", + "ID": 11 + } + ] + } + } +} diff --git a/assets/LevelProcess/MainCity/Interact/Interact_15511101.json b/assets/LevelProcess/MainCity/Interact/Interact_15511101.json new file mode 100644 index 0000000..30ded20 --- /dev/null +++ b/assets/LevelProcess/MainCity/Interact/Interact_15511101.json @@ -0,0 +1,21 @@ +{ + "ID": 15511101, + "Specials": { + }, + "Events": { + "OnInteract": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionPerformCfg", + "ID": 101, + "PerformID": 30051117 + }, + { + "$type": "Share.CActionResetEventCfg", + "ID": 102 + } + ] + } + } +} diff --git a/assets/LevelProcess/MainCity/Interact/Interact_19900006.json b/assets/LevelProcess/MainCity/Interact/Interact_19900006.json new file mode 100644 index 0000000..e252154 --- /dev/null +++ b/assets/LevelProcess/MainCity/Interact/Interact_19900006.json @@ -0,0 +1,51 @@ +{ + //主城气泡交互测试 + "ID": 19900006, + "Specials": { + }, + "Events": { + "OnInteract": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionShowTip", + "ID": 101, + "TipID": 999200027, + "ShowPage": 1, + "Predicates": + [ + { + "$type": "Share.CConfigEventByMainCharacter", + "CompareType": "Equal", + "AvatarID":2011 + } + ] + }, + { + "$type": "Share.CActionShowTip", + "ID": 103, + "TipID": 999200127, + "ShowPage": 1, + "Predicates": + [ + { + "$type": "Share.CConfigEventByMainCharacter", + "CompareType": "Equal", + "AvatarID":2021 + } + ] + }, + { + "$type": "Share.CActionResetEventCfg", + "ID": 102 + } + ] + } + } + // "Predicates": [ + // { + // "$type": "Share.CConfigEventByCharacterType", + // "Type": "1" + // } + // ] +} diff --git a/assets/LevelProcess/MainCity/Interact/Interact_19900030.json b/assets/LevelProcess/MainCity/Interact/Interact_19900030.json new file mode 100644 index 0000000..abeab0d --- /dev/null +++ b/assets/LevelProcess/MainCity/Interact/Interact_19900030.json @@ -0,0 +1,48 @@ +{ + //主城任务与诺查对话 + "ID": 19900030, + "Specials": { + "Radius": 7000 + }, + "Events": { + "OnInteract": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionPerformCfg", + "ID": 101, + // "BlackMaskFadeOut": true, + "PerformID": 1000002, + "Participators": { "2000": "A" } + }, + { + "$type": "Share.CActionSetQuestPhaseCfg", + "ID": 103, + "TargetPhase": "Finished", + //Unlocked InProgress Finished + "QuestID": 10020001 + } + ] + }, + "OnStart": { + "ID": 200, + "Actions": [ + { + "$type": "Share.CActionPerformCfg", + "ID": 201, + "PerformID": 40005 + }, + { + "$type": "Share.CActionResetEventCfg", + "ID": 202 + } + ] + } + }, + "Predicates": [ + { + "$type": "Share.CConfigEventByCharacterType", + "Type": "1" + } + ] +} diff --git a/assets/LevelProcess/MainCity/Interact/Interact_19900044.json b/assets/LevelProcess/MainCity/Interact/Interact_19900044.json new file mode 100644 index 0000000..7809168 --- /dev/null +++ b/assets/LevelProcess/MainCity/Interact/Interact_19900044.json @@ -0,0 +1,53 @@ +{ + //主城任务车库气泡 + "ID": 19900044, + "Specials": { + "Radius": 7000 + }, + "Events": { + "OnInteract": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionPerformCfg", + "ID": 101, + "PerformID": 3000052 + }, + { + "$type": "Share.CActionSetQuestPhaseCfg", + "ID": 108, + "TargetPhase": "Finished", + //Unlocked InProgress Finished + "QuestID": 10020064 + }, + { + "$type": "Share.CActionChangeInteractCfg", + "ID": 111, + "InteractID": 19900055, + "TagIDs": [ + 2001 + ], + "Participators": { + "2001": "A" + }, + "InteractShape": "Sphere", + "InteractScale": { + "X": 2, + "Y": 0, + "Z": 0 + } + }, + { + "$type": "Share.CActionResetEventCfg", + "ID": 102 + } + ] + } + }, + "Predicates": [ + { + "$type": "Share.CConfigEventByCharacterType", + "Type": "1" + } + ] +} diff --git a/assets/LevelProcess/MainCity/Interact/Interact_19900047.json b/assets/LevelProcess/MainCity/Interact/Interact_19900047.json new file mode 100644 index 0000000..f555120 --- /dev/null +++ b/assets/LevelProcess/MainCity/Interact/Interact_19900047.json @@ -0,0 +1,28 @@ +{ + "ID": 19900047, + "Specials": { + "Radius": 7000 + }, + "Events": { + "OnInteract": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionPerformCfg", + "ID": 101, + "PerformID": 3000008 + }, + { + "$type": "Share.CActionResetEventCfg", + "ID": 102 + } + ] + } + }, + "Predicates": [ + { + "$type": "Share.CConfigEventByCharacterType", + "Type": "1" + } + ] +} diff --git a/assets/LevelProcess/MainCity/Interact/Interact_19900048.json b/assets/LevelProcess/MainCity/Interact/Interact_19900048.json new file mode 100644 index 0000000..a2e1476 --- /dev/null +++ b/assets/LevelProcess/MainCity/Interact/Interact_19900048.json @@ -0,0 +1,28 @@ +{ + "ID": 19900048, + "Specials": { + "Radius": 7000 + }, + "Events": { + "OnInteract": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionPerformCfg", + "ID": 101, + "PerformID": 3000009 + }, + { + "$type": "Share.CActionResetEventCfg", + "ID": 102 + } + ] + } + }, + "Predicates": [ + { + "$type": "Share.CConfigEventByCharacterType", + "Type": "1" + } + ] +} diff --git a/assets/LevelProcess/MainCity/Interact/Interact_19900049.json b/assets/LevelProcess/MainCity/Interact/Interact_19900049.json new file mode 100644 index 0000000..79ea296 --- /dev/null +++ b/assets/LevelProcess/MainCity/Interact/Interact_19900049.json @@ -0,0 +1,29 @@ +{ + "ID": 19900049, + "Specials": { + "Radius": 7000 + }, + "Events": { + "OnInteract": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionPerformCfg", + "ID": 101, + "PerformID": 3000052, + "Participators": { "2001": "A" } + }, + { + "$type": "Share.CActionResetEventCfg", + "ID": 102 + } + ] + } + }, + "Predicates": [ + { + "$type": "Share.CConfigEventByCharacterType", + "Type": "1" + } + ] +} diff --git a/assets/LevelProcess/MainCity/Interact/Interact_19900052.json b/assets/LevelProcess/MainCity/Interact/Interact_19900052.json new file mode 100644 index 0000000..c444c70 --- /dev/null +++ b/assets/LevelProcess/MainCity/Interact/Interact_19900052.json @@ -0,0 +1,29 @@ +{ + //录像店老板对话 + "ID": 19900052, + "Specials": { + "Radius": 7000 + }, + "Events": { + "OnInteract": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionPerformCfg", + "ID": 101, + "PerformID": 3000011 + }, + { + "$type": "Share.CActionResetEventCfg", + "ID": 102 + } + ] + } + }, + "Predicates": [ + { + "$type": "Share.CConfigEventByCharacterType", + "Type": "1" + } + ] +} diff --git a/assets/LevelProcess/MainCity/Interact/Interact_19900054.json b/assets/LevelProcess/MainCity/Interact/Interact_19900054.json new file mode 100644 index 0000000..c0efdda --- /dev/null +++ b/assets/LevelProcess/MainCity/Interact/Interact_19900054.json @@ -0,0 +1,29 @@ +{ + "ID": 19900054, + "Specials": { + "Radius": 7000 + }, + "Events": { + "OnInteract": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionPerformCfg", + "ID": 101, + "PerformID": 3000013, + "Participators": { "2000": "A" } + }, + { + "$type": "Share.CActionResetEventCfg", + "ID": 102 + } + ] + } + }, + "Predicates": [ + { + "$type": "Share.CConfigEventByCharacterType", + "Type": "1" + } + ] +} diff --git a/assets/LevelProcess/MainCity/Interact/Interact_19900055.json b/assets/LevelProcess/MainCity/Interact/Interact_19900055.json new file mode 100644 index 0000000..56a8a61 --- /dev/null +++ b/assets/LevelProcess/MainCity/Interact/Interact_19900055.json @@ -0,0 +1,9 @@ +{ + "ID": 19900055, + "Events": { + "OnInteract": { + "ID": 100, + "Actions": [] + } + } +} diff --git a/assets/LevelProcess/MainCity/Interact/Interact_19900062.json b/assets/LevelProcess/MainCity/Interact/Interact_19900062.json new file mode 100644 index 0000000..05d9303 --- /dev/null +++ b/assets/LevelProcess/MainCity/Interact/Interact_19900062.json @@ -0,0 +1,51 @@ +{ + //主城气泡交互测试 + "ID": 19900062, + "Specials": { + }, + "Events": { + "OnInteract": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionShowTip", + "ID": 101, + "TipID": 999200027, + "ShowPage": 1, + "Predicates": + [ + { + "$type": "Share.CConfigEventByMainCharacter", + "CompareType": "Equal", + "AvatarID":2011 + } + ] + }, + { + "$type": "Share.CActionShowTip", + "ID": 103, + "TipID": 999200127, + "ShowPage": 1, + "Predicates": + [ + { + "$type": "Share.CConfigEventByMainCharacter", + "CompareType": "Equal", + "AvatarID":2021 + } + ] + }, + { + "$type": "Share.CActionResetEventCfg", + "ID": 102 + } + ] + } + } + // "Predicates": [ + // { + // "$type": "Share.CConfigEventByCharacterType", + // "Type": "1" + // } + // ] +} diff --git a/assets/LevelProcess/MainCity/Interact/Interact_70000015.json b/assets/LevelProcess/MainCity/Interact/Interact_70000015.json new file mode 100644 index 0000000..abdc321 --- /dev/null +++ b/assets/LevelProcess/MainCity/Interact/Interact_70000015.json @@ -0,0 +1,23 @@ +{ + "ID": 70000015, + "Specials": { + "Radius": 2000, + "RandomState": 0 + }, + "Events": { + "OnInteract": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionPerformCfg", + "ID": 101, + "PerformID": 3013163 + }, + { + "$type": "Share.CActionResetEventCfg", + "ID": 102 + } + ] + } + } +} diff --git a/assets/LevelProcess/MainCity/Interact/Interact_Custom.json b/assets/LevelProcess/MainCity/Interact/Interact_Custom.json new file mode 100644 index 0000000..bc034a8 --- /dev/null +++ b/assets/LevelProcess/MainCity/Interact/Interact_Custom.json @@ -0,0 +1,19 @@ +{ + "ID": 100860, + "Events": { + "OnInteract": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionResetEventCfg", + "ID": 101 + }, + { + "$type": "Share.CActionEnterHollowQuest", + "ID": 102, + "HollowID": 10010104 + } + ] + } + } +} diff --git a/assets/LevelProcess/MainCity/Interact/NPCBumble_100901.json b/assets/LevelProcess/MainCity/Interact/NPCBumble_100901.json new file mode 100644 index 0000000..d09dd3b --- /dev/null +++ b/assets/LevelProcess/MainCity/Interact/NPCBumble_100901.json @@ -0,0 +1,29 @@ +{ + "ID": 100901, + "Events": { + "OnInteract": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionPerformCfg", + "ID": 101, + "PerformID": 3000001, + "Participators": {} + }, + { + "$type": "Share.CActionSetQuestPhaseCfg", + "ID": 102, + "TargetPhase": "Finished", + //Unlocked InProgress Finished + "QuestID": 10020029 + } + ] + } + }, + "Predicates": [ + { + "$type": "Share.CConfigEventByCharacterType", + "Type": "1" + } + ] +} diff --git a/assets/LevelProcess/MainCity/Interact/NPCBumble_100904.json b/assets/LevelProcess/MainCity/Interact/NPCBumble_100904.json new file mode 100644 index 0000000..02118bc --- /dev/null +++ b/assets/LevelProcess/MainCity/Interact/NPCBumble_100904.json @@ -0,0 +1,34 @@ +{ + "ID": 100904, + "Events": { + "OnInteract": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionPerformCfg", + "ID": 101, + "PerformID": 3000004, + "Participators": {} + }, + { + "$type": "Share.CConfigUnlockHollowQuest", + "ID": 102, + "QuestID": 10010003 + }, + { + "$type": "Share.CActionSetQuestPhaseCfg", + "ID": 103, + "TargetPhase": "Finished", + //Unlocked InProgress Finished + "QuestID": 10020006 + } + ] + } + }, + "Predicates": [ + { + "$type": "Share.CConfigEventByCharacterType", + "Type": "1" + } + ] +} diff --git a/assets/LevelProcess/MainCity/Interact/ViceCharacter_QuestNPC.json b/assets/LevelProcess/MainCity/Interact/ViceCharacter_QuestNPC.json new file mode 100644 index 0000000..ddf52bf --- /dev/null +++ b/assets/LevelProcess/MainCity/Interact/ViceCharacter_QuestNPC.json @@ -0,0 +1,29 @@ +{ + //副主角交互-任务NPC + "ID": 20000002, + "Specials": { + "Radius": 2000 + }, + "Events": { + "OnInteract": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionPerformCfg", + "ID": 101, + "PerformID": 3019021 + }, + { + "$type": "Share.CActionResetEventCfg", + "ID": 103 + } + ] + } + }, + "Predicates": [ + { + "$type": "Share.CConfigEventByCharacterType", + "Type": "2" + } + ] +} diff --git a/assets/LevelProcess/MainCity/MainCity_1.json b/assets/LevelProcess/MainCity/MainCity_1.json new file mode 100644 index 0000000..0119068 --- /dev/null +++ b/assets/LevelProcess/MainCity/MainCity_1.json @@ -0,0 +1,233 @@ +{ + "ID": 1, + "DefaultSectionID": 2, + "Sections": { + "1": { + "UnityScenePath": "MainCity_Street", + "BornTransform": "Street_PlayerPos_Default", + "SectionProgress": { + "ID": 100, + "OnAdd": [ + "Sec1_DefaultTrigger", + "Sec1_DefaultTrigger2" + ], + "OnEnter": [], + "Events": { + "Sec1_DefaultTrigger": { + "ID": 100, + "Actions": [ + //主城默认传送-Street2Workshop + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 101, + "TagID": 1 + }, + //主城默认传送-Street2Garage + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 102, + "TagID": 2 + }, + //主城默认传送-Street2Garage2 + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 103, + "TagID": 7 + } + ] + }, + "Sec1_DefaultTrigger2": { + "ID": 200, + "Actions": [ + //主城打开锻造店 + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 201, + "TagID": 1003 + }, + //邦布三人组 + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 202, + "TagID": 2016 + }, + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 203, + "TagID": 2017 + }, + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 204, + "TagID": 2018 + } + ] + } + } + } + }, + "2": { + "UnityScenePath": "MainCity_Workshop", + "BornTransform": "Workshop_PlayerPos_Default", + "SectionProgress": { + "ID": 200, + "OnAdd": [ + "Sec2_DefaultTrigger", + "Sec2_DefaultTrigger2" + ], + "OnEnter": [ + "Sec2_EnterTrigger1" + ], + "Events": { + "Sec2_DefaultTrigger": { + "ID": 100, + "Actions": [ + //主城默认传送-Workshop2Street + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 103, + "TagID": 3 + }, + //主城默认传送-Workshop2Garage + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 104, + "TagID": 4 + } + ] + }, + "Sec2_DefaultTrigger2": { + "ID": 200, + "Actions": [ + //主城打开空洞 + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 201, + "TagID": 1002 + }, + //测试用扭蛋 + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 203, + "TagID": 1004 + }, + //主城打开工作台 + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 204, + "TagID": 1005 + }, + //录像店邦布 + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 205, + "TagID": 2028 + }, + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 206, + "TagID": 520001 + } + ] + }, + "Sec2_EnterTrigger1": { + "ID": 300, + "Actions": [ + { + "$type": "Share.CActionSetMainCityObjectState", + "ID": 301, + "ObjectState": { + "999": 10007, + "1000": 10001, + "1001": 10003, + "1003": 10013, + "1004": 10014, + "1005": 10027, + "1006": 10015, + "1007": 10016, + "1008": 10017, + "1009": 10018, + "1010": 10019, + "1011": 10020, + "1012": 10021, + "1013": 10022, + "1014": 10023, + "1015": 10024, + "1016": 10025, + "1017": 10026, + "1018": 10028, + "1019": 10029, + "1020": 10030, + "1021": 10031, + "1022": 10032, + "1023": 10033, + "1024": 10034, + "1025": 10035, + "1026": 10036, + "1027": 10037, + "1028": 10038, + "1029": 10039, + "1101": 11001, + "1201": 12001, + "1301": 13001, + "1302": 13002, + "1303": 13003, + "1304": 13004, + "1305": 13005 + } + } + ] + } + } + } + }, + "3": { + "UnityScenePath": "MainCity_Street", + "BornTransform": "Garage_PlayerPos_Default", + "SectionProgress": { + "ID": 300, + "OnAdd": [ + "Sec3_DefaultTrigger" + ], + "OnEnter": [], + "Events": { + "Sec3_DefaultTrigger": { + "ID": 100, + "Actions": [ + //主城默认传送-Garage2Street + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 101, + "TagID": 5 + }, + //主城默认传送-Garage2Workshop + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 102, + "TagID": 6 + }, + //主城默认传送-Garage2Workshop2 + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 103, + "TagID": 8 + }, + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 104, + "TagIDs": [ + 5016, + 5017, + 5018, + 5019, + 5020 + ] + } + ] + } + } + } + } + } +} + diff --git a/assets/LevelProcess/MainCity/Quest/Quest10020001.json b/assets/LevelProcess/MainCity/Quest/Quest10020001.json new file mode 100644 index 0000000..2beea8d --- /dev/null +++ b/assets/LevelProcess/MainCity/Quest/Quest10020001.json @@ -0,0 +1,204 @@ +{ + "ID": 10020001, + "Sections": { + "2": { + "SectionProgress": { + "ID": 10020001, + "OnBeforeEnter": [ + "Sec1_SetPlayerPosTrigger" + ], + "OnEnter": [ + "Sec1_DefaultTrigger" + ], + "Events": { + "Sec1_SetPlayerPosTrigger": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionChangeBackSceneInfoCfg", + "ID": 101, + "SectionID": 2, + //"OpenUI": "None", + "Transform": "Workshop_PlayerPos_Quest10020001", + "CameraY": 6000,// must * 10000 + "CameraX": 0 + }, + { + "$type": "Share.CActionSetMainCityTime", + "ID": 102, + "TimePeriod": "Morning" + } + ] + }, + "Sec1_DefaultTrigger": { + "ID": 200, + "Actions": [ + //创建妮可 + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 201, + "TagID": 2000 + }, + //工作室妹妹 + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 202, + "TagID": 2051, + "Predicates": + [ + { + "$type": "Share.CConfigEventByMainCharacter", + "CompareType": "Equal", + "AvatarID":2011 + } + ] + }, + //工作室哥哥 + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 203, + "TagID": 2052, + "Predicates": + [ + { + "$type": "Share.CConfigEventByMainCharacter", + "CompareType": "Equal", + "AvatarID":2021 + } + ] + }, + //妹妹头顶气泡 + { + "$type": "Share.CActionChangeInteractCfg", + "ID": 205, + "InteractID": 19900030, + "TagIDs": [ + 2000 + ], + "Participators": { + "2000": "A", + "2051": "B" + }, + "InteractShape": "Sphere", + "InteractScale": { + "X": 2, + "Y": 0, + "Z": 0 + }, + "Predicates": + [ + { + "$type": "Share.CConfigEventByMainCharacter", + "CompareType": "Equal", + "AvatarID":2011 + } + ] + }, + //哥哥头顶气泡 + + { + "$type": "Share.CActionChangeInteractCfg", + "ID": 206, + "InteractID": 19900030, + "TagIDs": [ + 2000 + ], + "Participators": { + "2000": "A", + "2052": "B" + }, + "InteractShape": "Sphere", + "InteractScale": { + "X": 2, + "Y": 0, + "Z": 0 + }, + "Predicates": + [ + { + "$type": "Share.CConfigEventByMainCharacter", + "CompareType": "Equal", + "AvatarID":2021 + } + ] + }, + { + "$type": "Share.CActionChangeInteractCfg", + "ID": 207, + "InteractID": 19900006, + "TagIDs": [ + 3, + 4 + ], + "Participators": { + "0": "" + }, + "InteractShape": "Sphere", + "InteractScale": { + "X": 2, + "Y": 0, + "Z": 0 + } + }, + // { + // "$type": "Share.CActionChangeInteractCfg", + // "ID": 208, + // "InteractID": 19900061, + // "TagIDs": [ + // 1001 + // ], + // "Participators": { + // "0": "" + // }, + // "InteractShape": "Sphere", + // "InteractScale": { + // "X": 2, + // "Y": 0, + // "Z": 0 + // } + // }, + { + "$type": "Share.CActionChangeInteractCfg", + "ID": 209, + "InteractID": 19900062, + "TagIDs": [ + 1002 + ], + "Participators": { + "0": "" + }, + "InteractShape": "Sphere", + "InteractScale": { + "X": 2, + "Y": 0, + "Z": 0 + } + }, + { + "$type": "Share.CActionForceRefreshCfg", + "ID": 210, + "IsMask": false + }, + //妮可状态机修改 + // { + // "$type": "Share.CActionAnimCtrlerParam", + // "ID": 209, + // "Target": 2000, + // "ParamType": "Int", + // "ParamName": "Int_MainCityAnimParam", + // "IntVal": 1 + // }, + //演出 + { + "$type": "Share.CActionPerformCfg", + "ID": 211, + "PerformID": 2000006, + "BlackMask": true + } + ] + } + } + } + } + } +} diff --git a/assets/LevelProcess/MainCity/Quest/Quest10020001_End.json b/assets/LevelProcess/MainCity/Quest/Quest10020001_End.json new file mode 100644 index 0000000..05b0c5e --- /dev/null +++ b/assets/LevelProcess/MainCity/Quest/Quest10020001_End.json @@ -0,0 +1,43 @@ +{ + "ID": 100200011, + "Sections": { + "2": { + "SectionProgress": { + "ID": 100200011, + "OnAdd": [ + "Sec1_DefaultTrigger" + ], + "OnExit": [ + "Sec1_OnExitTrigger" + ], + "Events": { + "Sec1_DefaultTrigger": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionRemoveMainCityQuestInteractCfg", + "ID": 101 + } + ] + }, + "Sec1_OnExitTrigger": { + "ID": 200, + "Actions": [ + //删除所有的交互 + { + "$type": "Share.CActionRemoveMainCityQuestInteractCfg", + "ID": 201 + }, + //退出Section时,删除对应NPC + { + "$type": "Share.CActionRemoveMainCityQuestNpcCfg", + "ID": 202 + } + + ] + } + } + } + } + } +} diff --git a/assets/LevelProcess/MainCity/Quest/Quest10020002.json b/assets/LevelProcess/MainCity/Quest/Quest10020002.json new file mode 100644 index 0000000..8a25ac2 --- /dev/null +++ b/assets/LevelProcess/MainCity/Quest/Quest10020002.json @@ -0,0 +1,212 @@ +{ + "ID": 10020002, + "Sections": { + "2": { + "SectionProgress": { + "ID": 10020002, + "OnBeforeEnter": [ + // "Sec1_SetPlayerPosTrigger" + ], + "OnAdd": [ + "Sec1_DefaultTrigger" + ], + "Events": { + "Sec1_DefaultTrigger": { + "ID": 100, + "Actions": [ + //工作室妹妹 + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 101, + "TagID": 2051, + "Predicates": + [ + { + "$type": "Share.CConfigEventByMainCharacter", + "CompareType": "Equal", + "AvatarID":2011 + } + ] + }, + //工作室哥哥 + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 102, + "TagID": 2052, + "Predicates": + [ + { + "$type": "Share.CConfigEventByMainCharacter", + "CompareType": "Equal", + "AvatarID":2021 + } + ] + }, + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 108, + "TagID": 2000 + }, + //修改交互 + { + "$type": "Share.CActionChangeInteractCfg", + "ID": 103, + "InteractID": 19900006, + "TagIDs": [ + 3, + 4 + ], + "Participators": { + "0": "" + }, + "InteractShape": "Sphere", + "InteractScale": { + "X": 2, + "Y": 0, + "Z": 0 + } + }, + // { + // "$type": "Share.CActionChangeInteractCfg", + // "ID": 105, + // "InteractID": 19900061, + // "TagIDs": [ + // 1001 + // ], + // "Participators": { + // "0": "" + // }, + // "InteractShape": "Sphere", + // "InteractScale": { + // "X": 2, + // "Y": 0, + // "Z": 0 + // } + // }, + + //妹妹头顶气泡 + + { + "$type": "Share.CActionChangeInteractCfg", + "ID": 106, + "InteractID": 19900037, + "TagIDs": [ + 2000 + ], + "Participators": { + "2000": "A", + "2051": "B" + }, + "InteractShape": "Sphere", + "InteractScale": { + "X": 2, + "Y": 0, + "Z": 0 + }, + "Predicates": + [ + { + "$type": "Share.CConfigEventByMainCharacter", + "CompareType": "Equal", + "AvatarID":2011 + } + ] + }, + { + "$type": "Share.CActionChangeInteractCfg", + "ID": 107, + "InteractID": 19900037, + "TagIDs": [ + 2000 + ], + "Participators": { + "2000": "A", + "2052": "B" + }, + "InteractShape": "Sphere", + "InteractScale": { + "X": 2, + "Y": 0, + "Z": 0 + }, + "Predicates": + [ + { + "$type": "Share.CConfigEventByMainCharacter", + "CompareType": "Equal", + "AvatarID":2021 + } + ] + }, + { + "$type": "Share.CActionChangeInteractCfg", + "ID": 109, + "InteractID": 19900054, + "TagIDs": [ + 2000 + ], + "Participators": { + "2000": "A" + }, + "InteractShape": "Sphere", + "InteractScale": { + "X": 2, + "Y": 0, + "Z": 0 + } + } , + // { + // "$type": "Share.CActionForceRefreshCfg", + // "IsMask": false + // } + // { + // "$type": "Share.CActionCreateNPCCfg", + // "ID": 106, + // "TagID": 2000 + // }, + // { + // "$type": "Share.CActionChangeInteractCfg", + // "ID": 107, + // "InteractID": 19900009, + // "TagIDs": [ + // 2000 + // ], + // "Participators": { + // "2000": "A" + // }, + // "InteractShape": "Sphere", + // "InteractScale": { + // "X": 5, + // "Y": 0, + // "Z": 5 + // } + // } + // { + // "$type": "Share.CActionEnterHollowQuest", + // "ID": 108, + // "HollowID": 10010001, + // "CloseBlackMask": true + // } + ] + }, + "Sec1_SetPlayerPosTrigger": { + "ID": 200, + "Actions": [ + // { + // "$type": "Share.CActionChangeBackSceneInfoCfg", + // "ID": 201, + // "SectionID": 2, + // "OpenUI": "None", + // "Transform": "Workshop_PlayerPos_Quest10020001" + // }, + { + "$type": "Share.CActionResetEventCfg", + "ID": 202 + } + ] + } + } + } + } + } +} diff --git a/assets/LevelProcess/MainCity/Quest/Quest10020002_End.json b/assets/LevelProcess/MainCity/Quest/Quest10020002_End.json new file mode 100644 index 0000000..94a323c --- /dev/null +++ b/assets/LevelProcess/MainCity/Quest/Quest10020002_End.json @@ -0,0 +1,43 @@ +{ + "ID": 100200021, + "Sections": { + "2": { + "SectionProgress": { + "ID": 100200021, + "OnAdd": [ + "Sec1_DefaultTrigger" + ], + "OnExit": [ + "Sec1_OnExitTrigger" + ], + "Events": { + "Sec1_DefaultTrigger": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionRemoveMainCityQuestInteractCfg", + "ID": 101 + } + ] + }, + "Sec1_OnExitTrigger": { + "ID": 200, + "Actions": [ + //删除所有的交互 + { + "$type": "Share.CActionRemoveMainCityQuestInteractCfg", + "ID": 201 + }, + //退出Section时,删除对应NPC + { + "$type": "Share.CActionRemoveMainCityQuestNpcCfg", + "ID": 202 + } + + ] + } + } + } + } + } +} diff --git a/assets/LevelProcess/MainCity/Quest/Quest10020003.json b/assets/LevelProcess/MainCity/Quest/Quest10020003.json new file mode 100644 index 0000000..71ff50e --- /dev/null +++ b/assets/LevelProcess/MainCity/Quest/Quest10020003.json @@ -0,0 +1,186 @@ +{ + "ID": 10020003, + "Sections": { + "2": { + "SectionProgress": { + "ID": 100200031, + "OnBeforeEnter": [ + ], + "OnEnter": [ + "Sec1_DefaultTrigger" + ], + "OnExit": [ + ], + "OnAdd": [ + ], + "Events": { + "Sec1_DefaultTrigger": { + "ID": 101, + "Actions": [ + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 202, + "TagID": 200001, + "Predicates": + [ + { + "$type": "Share.CConfigEventByMainCharacter", + "CompareType": "Equal", + "AvatarID":2011 + } + ] + }, + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 203, + "TagID": 200002, + "Predicates": + [ + { + "$type": "Share.CConfigEventByMainCharacter", + "CompareType": "Equal", + "AvatarID":2021 + } + ] + }, + { + "$type": "Share.CActionChangeInteractCfg", + "ID": 205, + "InteractID": 10001001, + "TagIDs": [ + 200001 + ], + "Participators": { + "200001": "A" + }, + "InteractShape": "Sphere", + "InteractScale": { + "X": 2, + "Y": 0, + "Z": 0 + }, + "Predicates": + [ + { + "$type": "Share.CConfigEventByMainCharacter", + "CompareType": "Equal", + "AvatarID":2011 + } + ] + }, + { + "$type": "Share.CActionChangeInteractCfg", + "ID": 206, + "InteractID": 10001001, + "TagIDs": [ + 200002 + ], + "Participators": { + "200002": "A" + }, + "InteractShape": "Sphere", + "InteractScale": { + "X": 2, + "Y": 0, + "Z": 0 + }, + "Predicates": + [ + { + "$type": "Share.CConfigEventByMainCharacter", + "CompareType": "Equal", + "AvatarID":2021 + } + ] + }, + { + "$type": "Share.CActionChangeInteractCfg", + "ID": 207, + "InteractID": 19900006, + "TagIDs": [ + 3, + 4 + ], + "Participators": { + "0": "" + }, + "InteractShape": "Sphere", + "InteractScale": { + "X": 2, + "Y": 0, + "Z": 0 + } + }, + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 206, + "TagID": 520001 + } + ] + } + } + } + }, + "3": { + "SectionProgress": { + "ID": 100200032, + "OnBeforeEnter": [ + ], + "OnEnter": [ + "Sec1_DefaultTrigger" + ], + "OnExit": [ + ], + "OnAdd": [ + "Sec1_CreateTrigger" + ], + "Events": { + "Sec1_CreateTrigger": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionDownloadFullResourceCfg", + "ID": 101 + }, + { + "$type": "Share.CActionChangeInteractCfg", + "ID": 109, + "InteractID": 19900055, + "TagIDs": [ + 2001 + ], + "Participators": { + "2001": "A" + }, + "InteractShape": "Sphere", + "InteractScale": { + "X": 2, + "Y": 0, + "Z": 0 + } + }, + { + "$type": "Share.CActionChangeInteractCfg", + "ID": 110, + "InteractID": 19900049, + "TagIDs": [ + 2002 + ], + "Participators": { + "2002": "A", + "2003": "B" + }, + "InteractShape": "Sphere", + "InteractScale": { + "X": 2, + "Y": 0, + "Z": 0 + } + } + ] + } + } + } + } + } +} diff --git a/assets/LevelProcess/MainCity/Quest/Quest10020003_End.json b/assets/LevelProcess/MainCity/Quest/Quest10020003_End.json new file mode 100644 index 0000000..df41b2f --- /dev/null +++ b/assets/LevelProcess/MainCity/Quest/Quest10020003_End.json @@ -0,0 +1,41 @@ +{ + "ID": 100200031, + "Sections": { + "2": { + "SectionProgress": { + "ID": 1002000311, + "OnAdd": [ + "Sec1_DefaultTrigger" + ], + "OnExit": [ + "Sec1_OnExitTrigger" + ], + "Events": { + "Sec1_DefaultTrigger": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionRemoveMainCityQuestInteractCfg", + "ID": 101 + } + ] + }, + "Sec1_OnExitTrigger": { + "ID": 200, + "Actions": [ + { + "$type": "Share.CActionRemoveMainCityQuestInteractCfg", + "ID": 201 + }, + { + "$type": "Share.CActionRemoveMainCityQuestNpcCfg", + "ID": 202 + } + + ] + } + } + } + } + } +} diff --git a/assets/LevelProcess/MainCity/Quest/Quest10020004.json b/assets/LevelProcess/MainCity/Quest/Quest10020004.json new file mode 100644 index 0000000..1df1ca8 --- /dev/null +++ b/assets/LevelProcess/MainCity/Quest/Quest10020004.json @@ -0,0 +1,52 @@ +{ + "ID": 10020004, + "Sections": { + "2": { + "SectionProgress": { + "ID": 100200041, + "OnBeforeEnter": [], + "OnEnter": [], + "OnExit": [], + "OnAdd": [ + "Sec1_CreateTrigger" + ], + "Events": { + "Sec1_CreateTrigger": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionSetMainCityTime", + "ID": 201, + "TimePeriod": "Afternoon" + }, + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 202, + "TagID": 200001, + "Predicates": [ + { + "$type": "Share.CConfigEventByMainCharacter", + "CompareType": "Equal", + "AvatarID": 2011 + } + ] + }, + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 203, + "TagID": 200002, + "Predicates": [ + { + "$type": "Share.CConfigEventByMainCharacter", + "CompareType": "Equal", + "AvatarID": 2021 + } + ] + } + ] + } + } + } + } + } +} diff --git a/assets/LevelProcess/MainCity/Quest/Quest10020004_End.json b/assets/LevelProcess/MainCity/Quest/Quest10020004_End.json new file mode 100644 index 0000000..3f65796 --- /dev/null +++ b/assets/LevelProcess/MainCity/Quest/Quest10020004_End.json @@ -0,0 +1,40 @@ +{ + "ID": 100200041, + "Sections": { + "2": { + "SectionProgress": { + "ID": 1002000411, + "OnAdd": [ + "Sec1_DefaultTrigger" + ], + "OnExit": [ + "Sec1_OnExitTrigger" + ], + "Events": { + "Sec1_DefaultTrigger": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionRemoveMainCityQuestInteractCfg", + "ID": 101 + } + ] + }, + "Sec1_OnExitTrigger": { + "ID": 200, + "Actions": [ + { + "$type": "Share.CActionRemoveMainCityQuestInteractCfg", + "ID": 201 + }, + { + "$type": "Share.CActionRemoveMainCityQuestNpcCfg", + "ID": 202 + } + ] + } + } + } + } + } +} diff --git a/assets/LevelProcess/MainCity/Quest/Quest10020006.json b/assets/LevelProcess/MainCity/Quest/Quest10020006.json new file mode 100644 index 0000000..8509922 --- /dev/null +++ b/assets/LevelProcess/MainCity/Quest/Quest10020006.json @@ -0,0 +1,58 @@ +{ + "ID": 10020006, + "Sections": { + "1": { + "SectionProgress": { + "ID": 100200061, + "OnBeforeEnter": [], + "OnEnter": [], + "OnExit": [], + "OnAdd": [ + "Sec1_CreateTrigger" + ], + "Events": { + "Sec1_CreateTrigger": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 101, + "TagIDs": [ + 2070, + 2071, + 2072, + 5002, + 2004 + ] + }, + { + "$type": "Share.CActionChangeInteractCfg", + "ID": 102, + "InteractID": 100904, + "TagIDs": [ + 2070 + ], + "Participators": { + "2070": "A" + }, + "InteractShape": "Sector", + "InteractScale": { + "X": 0, + "Y": 2.4, + "Z": 2, + "W": 150, + "R": 10 + } + }, + { + "$type": "Share.CActionForceRefreshCfg", + "ID": 103, + "IsMask": false + } + ] + } + } + } + } + } +} diff --git a/assets/LevelProcess/MainCity/Quest/Quest10020006_End.json b/assets/LevelProcess/MainCity/Quest/Quest10020006_End.json new file mode 100644 index 0000000..f486712 --- /dev/null +++ b/assets/LevelProcess/MainCity/Quest/Quest10020006_End.json @@ -0,0 +1,16 @@ +{ + "ID": 100200061, + "Sections": { + "2": { + "SectionProgress": { + "ID": 1002000611, + "OnAdd": [ + ], + "OnExit": [ + ], + "Events": { + } + } + } + } +} diff --git a/assets/LevelProcess/MainCity/Quest/Quest10020007.json b/assets/LevelProcess/MainCity/Quest/Quest10020007.json new file mode 100644 index 0000000..4ae0647 --- /dev/null +++ b/assets/LevelProcess/MainCity/Quest/Quest10020007.json @@ -0,0 +1,153 @@ +{ + "ID": 10020007, + "Sections": { + "1": { + "SectionProgress": { + "ID": 100200071, + "OnAdd": ["Street_CreateTrigger"], + "Events": { + "Street_CreateTrigger": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 204, + "TagID": 2019 + }, + { + "$type": "Share.CActionChangeInteractCfg", + "ID": 101, + "InteractID": 20000002, + "TagIDs": [ + 2019 + ], + "Participators": { + "2019": "A" + }, + "InteractShape": "Sector", + "InteractScale": { + "X": 0, + "Y": 2.4, + "Z": 2, + "W": 150, + "R": 10 + } + } + ] + } + } + } + }, + "2": { + "SectionProgress": { + "ID": 100200072, + "OnAdd": [ + "Sec1_DefaultTrigger" + ], + "Events": { + "Sec1_DefaultTrigger": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionChangeInteractCfg", + "ID": 101, + "InteractID": 10001028, + "TagIDs": [ + 2256 + ], + "Participators": { + "2256": "A", + "2011": "B" + }, + "InteractShape": "Sphere", + "InteractScale": { + "X": 2, + "Y": 0, + "Z": 0 + }, + "Predicates": + [ + { + "$type": "Share.CConfigEventByMainCharacter", + "CompareType": "Equal", + "AvatarID":2011 + } + ] + }, + { + "$type": "Share.CActionChangeInteractCfg", + "ID": 102, + "InteractID": 10001028, + "TagIDs": [ + 2257 + ], + "Participators": { + "2257": "A", + "2011": "B" + }, + "InteractShape": "Sphere", + "InteractScale": { + "X": 2, + "Y": 0, + "Z": 0 + }, + "Predicates": + [ + { + "$type": "Share.CConfigEventByMainCharacter", + "CompareType": "Equal", + "AvatarID":2021 + } + ] + }, + { + "$type": "Share.CActionChangeInteractCfg", + "ID": 209, + "InteractID": 10000009, + "TagIDs": [ + 1002 + ], + "Participators": { + "0": "" + }, + "InteractShape": "Sphere", + "InteractScale": { + "X": 2, + "Y": 0, + "Z": 0 + } + }, + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 206, + "TagID": 520001 + }, + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 210, + "TagID": 90330301 + }, + { + "$type": "Share.CActionChangeInteractCfg", + "ID": 211, + "InteractID": 100860, + "TagIDs": [ + 90330301 + ], + "Participators": { + "90330301": "B" + }, + "InteractShape": "Sector", + "InteractScale": { + "X": 1.2, + "Y": 0, + "Z": 0 + } + } + ] + } + } + } + } + } +} diff --git a/assets/LevelProcess/MainCity/Quest/Quest10020028.json b/assets/LevelProcess/MainCity/Quest/Quest10020028.json new file mode 100644 index 0000000..1abaa11 --- /dev/null +++ b/assets/LevelProcess/MainCity/Quest/Quest10020028.json @@ -0,0 +1,69 @@ +{ + "ID": 10020028, + "Sections": { + "2": { + "SectionProgress": { + "ID": 100200281, + // CUSTOM! + "OnAdd": ["WorkShop_OnAdd_CreateDebugNPC"], + "OnEnter": ["WorkShop_OnEnter_CreateDebugNPC"], + "Events": { + "WorkShop_OnAdd_CreateDebugNPC": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 103, + "TagID": 90330301 + }, + { + "$type": "Share.CActionChangeInteractCfg", + "ID": 104, + "InteractID": 100860, + "TagIDs": [ + 90330301 + ], + "Participators": { + "90330301": "B" + }, + "InteractShape": "Sector", + "InteractScale": { + "X": 1.2, + "Y": 0, + "Z": 0 + } + } + ] + }, + "WorkShop_OnEnter_CreateDebugNPC": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 101, + "TagID": 90330301 + }, + { + "$type": "Share.CActionChangeInteractCfg", + "ID": 102, + "InteractID": 100860, + "TagIDs": [ + 90330301 + ], + "Participators": { + "90330301": "B" + }, + "InteractShape": "Sector", + "InteractScale": { + "X": 1.2, + "Y": 0, + "Z": 0 + } + } + ] + } + } + } + } + } +} diff --git a/assets/LevelProcess/MainCity/Quest/Quest10020029.json b/assets/LevelProcess/MainCity/Quest/Quest10020029.json new file mode 100644 index 0000000..18d8203 --- /dev/null +++ b/assets/LevelProcess/MainCity/Quest/Quest10020029.json @@ -0,0 +1,135 @@ +{ + "ID": 10020029, + "Sections": { + "2": { + "SectionProgress": { + "ID": 100200291, + "OnBeforeEnter": [ + ], + "OnEnter": [ + ], + "OnExit": [ + ], + "OnAdd": [ + "Sec1_CreateTrigger" + ], + "Events": { + "Sec1_CreateTrigger": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 202, + "TagID": 200001, + "Predicates": + [ + { + "$type": "Share.CConfigEventByMainCharacter", + "CompareType": "Equal", + "AvatarID":2011 + } + ] + }, + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 203, + "TagID": 200002, + "Predicates": + [ + { + "$type": "Share.CConfigEventByMainCharacter", + "CompareType": "Equal", + "AvatarID":2021 + } + ] + }, + { + "$type": "Share.CActionChangeInteractCfg", + "ID": 205, + "InteractID": 100901, + "TagIDs": [ + 200001 + ], + "Participators": { + "200001": "A" + }, + "InteractShape": "Sphere", + "InteractScale": { + "X": 2, + "Y": 0, + "Z": 0 + }, + "Predicates": + [ + { + "$type": "Share.CConfigEventByMainCharacter", + "CompareType": "Equal", + "AvatarID":2011 + } + ] + }, + { + "$type": "Share.CActionChangeInteractCfg", + "ID": 206, + "InteractID": 100901, + "TagIDs": [ + 200002 + ], + "Participators": { + "200002": "A" + }, + "InteractShape": "Sphere", + "InteractScale": { + "X": 2, + "Y": 0, + "Z": 0 + }, + "Predicates": + [ + { + "$type": "Share.CConfigEventByMainCharacter", + "CompareType": "Equal", + "AvatarID":2021 + } + ] + }, + { + "$type": "Share.CActionTriggerInteractCfg", + "ID": 107, + "TagID": 200001, + "InteractID": 100901, + "Predicates": + [ + { + "$type": "Share.CConfigEventByMainCharacter", + "CompareType": "Equal", + "AvatarID":2011 + } + ] + }, + { + "$type": "Share.CActionTriggerInteractCfg", + "ID": 107, + "TagID": 200002, + "InteractID": 100901, + "Predicates": + [ + { + "$type": "Share.CConfigEventByMainCharacter", + "CompareType": "Equal", + "AvatarID":2021 + } + ] + }, + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 206, + "TagID": 520001 + } + ] + } + } + } + } + } +} diff --git a/assets/LevelProcess/MainCity/Quest/Quest10020029_End.json b/assets/LevelProcess/MainCity/Quest/Quest10020029_End.json new file mode 100644 index 0000000..9e126e6 --- /dev/null +++ b/assets/LevelProcess/MainCity/Quest/Quest10020029_End.json @@ -0,0 +1,41 @@ +{ + "ID": 100200291, + "Sections": { + "2": { + "SectionProgress": { + "ID": 1002002911, + "OnAdd": [ + "Sec1_DefaultTrigger" + ], + "OnExit": [ + "Sec1_OnExitTrigger" + ], + "Events": { + "Sec1_DefaultTrigger": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionRemoveMainCityQuestInteractCfg", + "ID": 101 + } + ] + }, + "Sec1_OnExitTrigger": { + "ID": 200, + "Actions": [ + { + "$type": "Share.CActionRemoveMainCityQuestInteractCfg", + "ID": 201 + }, + { + "$type": "Share.CActionRemoveMainCityQuestNpcCfg", + "ID": 202 + } + + ] + } + } + } + } + } +} diff --git a/assets/LevelProcess/MainCity/Quest/Quest10020031.json b/assets/LevelProcess/MainCity/Quest/Quest10020031.json new file mode 100644 index 0000000..0bc28b8 --- /dev/null +++ b/assets/LevelProcess/MainCity/Quest/Quest10020031.json @@ -0,0 +1,77 @@ +{ + "ID": 10020031, + "Sections": { + "1": { + "SectionProgress": { + "ID": 100200311, + "OnBeforeEnter": [], + "OnEnter": [ + "Sec1_EnterTrigger" + ], + "OnExit": [], + "OnAdd": [], + "Events": { + "Sec1_EnterTrigger": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionSetBGM", + "ID": 101, + "MainCityMusicID": 0 + }, + { + "$type": "Share.CActionSetQuestPhaseCfg", + "ID": 102, + "TargetPhase": "Finished", + //Unlocked InProgress Finished + "QuestID": 10020031 + } + ] + } + } + } + }, + "2": { + "SectionProgress": { + "ID": 100200312, + "OnBeforeEnter": [], + "OnEnter": [], + "OnExit": [], + "OnAdd": [ + "Sec2_CreateTrigger" + ], + "Events": { + "Sec2_CreateTrigger": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 202, + "TagID": 200001, + "Predicates": [ + { + "$type": "Share.CConfigEventByMainCharacter", + "CompareType": "Equal", + "AvatarID": 2011 + } + ] + }, + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 203, + "TagID": 200002, + "Predicates": [ + { + "$type": "Share.CConfigEventByMainCharacter", + "CompareType": "Equal", + "AvatarID": 2021 + } + ] + } + ] + } + } + } + } + } +} diff --git a/assets/LevelProcess/MainCity/Quest/Quest10020031_End.json b/assets/LevelProcess/MainCity/Quest/Quest10020031_End.json new file mode 100644 index 0000000..453441f --- /dev/null +++ b/assets/LevelProcess/MainCity/Quest/Quest10020031_End.json @@ -0,0 +1,13 @@ +{ + "ID": 100200311, + "Sections": { + "1": { + "SectionProgress": { + "ID": 1002003111, + "OnAdd": [], + "OnExit": [], + "Events": {} + } + } + } +} diff --git a/assets/LevelProcess/MainCity/Quest/Quest10020032.json b/assets/LevelProcess/MainCity/Quest/Quest10020032.json new file mode 100644 index 0000000..95fe898 --- /dev/null +++ b/assets/LevelProcess/MainCity/Quest/Quest10020032.json @@ -0,0 +1,156 @@ +{ + "ID": 10020032, + "Sections": { + "1": { + "SectionProgress": { + "ID": 100200321, + "OnBeforeEnter": [], + "OnEnter": [], + "OnExit": [], + "OnAdd": [ + "Sec1_CreateTrigger" + ], + "Events": { + "Sec1_CreateTrigger": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionChangeInteractCfg", + "ID": 101, + "InteractID": 20000002, + "TagIDs": [ + 2070 + ], + "Participators": { + "2070": "A" + }, + "InteractShape": "Sector", + "InteractScale": { + "X": 0, + "Y": 2.4, + "Z": 2, + "W": 150, + "R": 10 + } + }, + { + "$type": "Share.CActionForceRefreshCfg", + "ID": 103, + "IsMask": false + } + ] + } + } + } + }, + "2": { + "SectionProgress": { + "ID": 100200322, + "OnEnter": [ + "Sec2_EnterTrigger" + ], + "Events": { + "Sec2_EnterTrigger": { + "ID": 200, + "Actions": [ + // Lock H.D.D. + { + "$type": "Share.CActionChangeInteractCfg", + "ID": 201, + "InteractID": 19900062, + "TagIDs": [ + 1002 + ], + "Participators": { + "0": "" + }, + "InteractShape": "Sphere", + "InteractScale": { + "X": 2, + "Y": 0, + "Z": 0 + } + }, + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 202, + "TagID": 2256, + "Predicates": [ + { + "$type": "Share.CConfigEventByMainCharacter", + "CompareType": "Equal", + "AvatarID":2011 + } + ] + }, + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 203, + "TagID": 2257, + "Predicates": [ + { + "$type": "Share.CConfigEventByMainCharacter", + "CompareType": "Equal", + "AvatarID":2021 + } + ] + }, + { + "$type": "Share.CActionChangeInteractCfg", + "ID": 205, + "InteractID": 10001005, + "TagIDs": [ + 2256 + ], + "Participators": { + "2256": "A", + "2011": "B" + }, + "InteractShape": "Sphere", + "InteractScale": { + "X": 2, + "Y": 0, + "Z": 0 + }, + "Predicates": + [ + { + "$type": "Share.CConfigEventByMainCharacter", + "CompareType": "Equal", + "AvatarID":2011 + } + ] + }, + { + "$type": "Share.CActionChangeInteractCfg", + "ID": 205, + "InteractID": 10001005, + "TagIDs": [ + 2257 + ], + "Participators": { + "2257": "A", + "2011": "B" + }, + "InteractShape": "Sphere", + "InteractScale": { + "X": 2, + "Y": 0, + "Z": 0 + }, + "Predicates": + [ + { + "$type": "Share.CConfigEventByMainCharacter", + "CompareType": "Equal", + "AvatarID":2021 + } + ] + } + ] + } + } + } + } + } +} diff --git a/assets/LevelProcess/MainCity/Quest/Quest10020032_End.json b/assets/LevelProcess/MainCity/Quest/Quest10020032_End.json new file mode 100644 index 0000000..b19a7ba --- /dev/null +++ b/assets/LevelProcess/MainCity/Quest/Quest10020032_End.json @@ -0,0 +1,25 @@ +{ + "ID": 100200321, + "Sections": { + "2": { + "SectionProgress": { + "ID": 1002003211, + "OnAdd": [ + "Sec1_DefaultTrigger" + ], + "OnExit": [], + "Events": { + "Sec1_DefaultTrigger": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionRemoveMainCityQuestInteractCfg", + "ID": 101 + } + ] + } + } + } + } + } +} diff --git a/assets/LevelProcess/MainCity/Quest/Quest10020044.json b/assets/LevelProcess/MainCity/Quest/Quest10020044.json new file mode 100644 index 0000000..b22124f --- /dev/null +++ b/assets/LevelProcess/MainCity/Quest/Quest10020044.json @@ -0,0 +1,50 @@ +{ + "ID": 10020044, + "Sections": { + "1": { + "SectionProgress": { + "ID": 100200441, + "OnBeforeEnter": [], + "OnEnter": [], + "OnExit": [], + "OnAdd": [ + "Sec1_CreateTrigger" + ], + "Events": { + "Sec1_CreateTrigger": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 101, + "TagID": 2103 + }, + { + "$type": "Share.CActionChangeInteractCfg", + "ID": 102, + "InteractID": 10001059, + "TagIDs": [ + 2103 + ], + "Participators": { + "2103": "A" + }, + "InteractShape": "Sector", + "InteractScale": { + "X": 2, + "Y": 0, + "Z": 0 + } + }, + { + "$type": "Share.CActionForceRefreshCfg", + "ID": 103, + "IsMask": false + } + ] + } + } + } + } + } +} diff --git a/assets/LevelProcess/MainCity/Quest/Quest10020044_End.json b/assets/LevelProcess/MainCity/Quest/Quest10020044_End.json new file mode 100644 index 0000000..1c709d4 --- /dev/null +++ b/assets/LevelProcess/MainCity/Quest/Quest10020044_End.json @@ -0,0 +1,16 @@ +{ + "ID": 100200441, + "Sections": { + "1": { + "SectionProgress": { + "ID": 1002004411, + "OnAdd": [ + ], + "OnExit": [ + ], + "Events": { + } + } + } + } +} diff --git a/assets/LevelProcess/MainCity/Quest/Quest10020062.json b/assets/LevelProcess/MainCity/Quest/Quest10020062.json new file mode 100644 index 0000000..11c248a --- /dev/null +++ b/assets/LevelProcess/MainCity/Quest/Quest10020062.json @@ -0,0 +1,82 @@ +{ + "ID": 10020062, + "Sections": { + "1": { + "SectionProgress": { + "ID": 100200621, + "OnAdd": [ + "Sec1_CreateTrigger" + ], + "Events": { + "Sec1_CreateTrigger": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 101, + "TagID": 10021 + }, + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 102, + "TagID": 20281 + }, + // Anbi, Billy + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 103, + "TagIDs": [2071, 2072] + }, + // Newsstand + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 111, + "TagID": 2099 + }, + // RamenStore + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 114, + "TagID": 2070 + }, + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 115, + "TagID": 500023 + }, + // Newsstand interact + { + "$type": "Share.CActionChangeInteractCfg", + "ID": 151, + "InteractID": 10001066, + "TagIDs": [2099], + "Participators": { + "2099": "A" + }, + "InteractShape": "Sphere", + "InteractScale": { + "X": 0, + "Y": 2.4, + "Z": 2.0 + } + }, + { + "$type": "Share.CActionPerformCfg", + "ID": 198, + "PerformID": 50000001, + "NpcID": 10021 + }, + { + "$type": "Share.CActionSetQuestPhaseCfg", + "ID": 199, + "TargetPhase": "Finished", + //Unlocked InProgress Finished + "QuestID": 10020062 + } + ] + } + } + } + } + } +} diff --git a/assets/LevelProcess/MainCity/Quest/Quest10020062_End.json b/assets/LevelProcess/MainCity/Quest/Quest10020062_End.json new file mode 100644 index 0000000..632d0c8 --- /dev/null +++ b/assets/LevelProcess/MainCity/Quest/Quest10020062_End.json @@ -0,0 +1,16 @@ +{ + "ID": 100200621, + "Sections": { + "1": { + "SectionProgress": { + "ID": 1002006211, + "OnAdd": [ + ], + "OnExit": [ + ], + "Events": { + } + } + } + } +} diff --git a/assets/LevelProcess/MainCity/Quest/Quest10020064.json b/assets/LevelProcess/MainCity/Quest/Quest10020064.json new file mode 100644 index 0000000..a427b75 --- /dev/null +++ b/assets/LevelProcess/MainCity/Quest/Quest10020064.json @@ -0,0 +1,152 @@ +{ + "ID": 10020064, + "Sections": { + "2": { + "SectionProgress": { + "ID": 100200641, + "OnBeforeEnter": [ + "Sec1_PreloadTrigger" + ], + "OnEnter": [ + ], + "OnExit": [ + ], + "OnAdd": [ + ], + "Events": { + "Sec1_PreloadTrigger": { + "ID": 300, + "Actions": [ + { + "$type": "Share.CActionChangeBackSceneInfoCfg", + "ID": 301, + "SectionID": 3, + "OpenUI": "None", + "Transform": "Garage_PlayerPos_Quest10020003" + }, + { + "$type": "Share.CActionResetEventCfg", + "ID": 302 + } + ] + } + } + } + }, + "3": { + "SectionProgress": { + "ID": 100200642, + "OnBeforeEnter": [ + ], + "OnEnter": [ + "Sec1_DefaultTrigger" + ], + "OnExit": [ + ], + "OnAdd": [ + ], + "Events": { + "Sec1_DefaultTrigger": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionSetBGM", + "ID": 101, + "MainCityMusicID": 1005 + }, + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 103, + "TagID": 2001 + }, + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 104, + "TagID": 2002 + }, + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 105, + "TagID": 2003 + }, + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 108, + "TagID": 5001 + }, + { + "$type": "Share.CActionChangeInteractCfg", + "ID": 109, + "InteractID": 19900044, + "TagIDs": [ + 2001 + ], + "Participators": { + "2001": "A" + }, + "InteractShape": "Sphere", + "InteractScale": { + "X": 2, + "Y": 0, + "Z": 0 + } + }, + { + "$type": "Share.CActionChangeInteractCfg", + "ID": 110, + "InteractID": 19900049, + "TagIDs": [ + 2002 + ], + "Participators": { + "2002": "A", + "2003": "B" + }, + "InteractShape": "Sphere", + "InteractScale": { + "X": 2, + "Y": 0, + "Z": 0 + } + }, + { + "$type": "Share.CActionForceRefreshCfg", + "ID": 106, + "IsMask": false + }, + { + "$type": "Share.CActionPerformCfg", + "ID": 107, + "PerformID": 1000005, + "BlackMask": true + }, + { + "$type": "Share.CActionTriggerInteractCfg", + "ID": 108, + "TagID": 2001, + "InteractID": 19900044 + }, + // { + // "$type": "Share.CActionChangeInteractCfg", + // "ID": 111, + // "InteractID": 19900055, + // "TagIDs": [ + // 2001 + // ], + // "Participators": { + // "2001": "A" + // }, + // "InteractShape": "Sphere", + // "InteractScale": { + // "X": 2, + // "Y": 0, + // "Z": 0 + // } + // }, + ] + } + } + } + } + } +} diff --git a/assets/LevelProcess/MainCity/Quest/Quest10020064_End.json b/assets/LevelProcess/MainCity/Quest/Quest10020064_End.json new file mode 100644 index 0000000..93b229f --- /dev/null +++ b/assets/LevelProcess/MainCity/Quest/Quest10020064_End.json @@ -0,0 +1,43 @@ +{ + "ID": 100200641, + "Sections": { + "3": { + "SectionProgress": { + "ID": 1002006411, + "OnAdd": [ + "Sec1_DefaultTrigger" + ], + "OnExit": [ + "Sec1_OnExitTrigger" + ], + "Events": { + "Sec1_DefaultTrigger": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionRemoveMainCityQuestInteractCfg", + "ID": 101 + } + ] + }, + "Sec1_OnExitTrigger": { + "ID": 200, + "Actions": [ + //删除所有的交互 + { + "$type": "Share.CActionRemoveMainCityQuestInteractCfg", + "ID": 201 + }, + //退出Section时,删除对应NPC + { + "$type": "Share.CActionRemoveMainCityQuestNpcCfg", + "ID": 202 + } + + ] + } + } + } + } + } +} diff --git a/assets/LevelProcess/MainCity/Quest/Quest10020074.json b/assets/LevelProcess/MainCity/Quest/Quest10020074.json new file mode 100644 index 0000000..1bb829d --- /dev/null +++ b/assets/LevelProcess/MainCity/Quest/Quest10020074.json @@ -0,0 +1,42 @@ +{ + "ID": 10020074, + "Sections": { + "2": { + "SectionProgress": { + "ID": 100200741, + "OnAdd": [ + "Sec1_DefaultTrigger" + ], + "Events": { + "Sec1_DefaultTrigger": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionChangeInteractCfg", + "ID": 201, + "InteractID": 19900062, + "TagIDs": [ + 1002 + ], + "Participators": { + "0": "" + }, + "InteractShape": "Sphere", + "InteractScale": { + "X": 2, + "Y": 0, + "Z": 0 + } + }, + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 206, + "TagID": 520001 + } + ] + } + } + } + } + } +} diff --git a/assets/LevelProcess/MainCity/Quest/Quest10020074_End.json b/assets/LevelProcess/MainCity/Quest/Quest10020074_End.json new file mode 100644 index 0000000..34b77a1 --- /dev/null +++ b/assets/LevelProcess/MainCity/Quest/Quest10020074_End.json @@ -0,0 +1,25 @@ +{ + "ID": 100200741, + "Sections": { + "2": { + "SectionProgress": { + "ID": 1002007411, + "OnAdd": [ + "Sec1_DefaultTrigger" + ], + "OnExit": [], + "Events": { + "Sec1_DefaultTrigger": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionRemoveMainCityQuestInteractCfg", + "ID": 101 + } + ] + } + } + } + } + } +} diff --git a/assets/LevelProcess/MainCity/Quest/Quest10020077.json b/assets/LevelProcess/MainCity/Quest/Quest10020077.json new file mode 100644 index 0000000..f7f03fb --- /dev/null +++ b/assets/LevelProcess/MainCity/Quest/Quest10020077.json @@ -0,0 +1,16 @@ +{ + "ID": 10020077, + "Sections": { + "1": { + "SectionProgress": { + "ID": 100200771, + "OnAdd": [ + ], + "OnExit": [ + ], + "Events": { + } + } + } + } +} diff --git a/assets/LevelProcess/MainCity/Quest/Quest10020077_End.json b/assets/LevelProcess/MainCity/Quest/Quest10020077_End.json new file mode 100644 index 0000000..2c426e9 --- /dev/null +++ b/assets/LevelProcess/MainCity/Quest/Quest10020077_End.json @@ -0,0 +1,16 @@ +{ + "ID": 100200771, + "Sections": { + "1": { + "SectionProgress": { + "ID": 1002007711, + "OnAdd": [ + ], + "OnExit": [ + ], + "Events": { + } + } + } + } +} diff --git a/assets/LevelProcess/MainCity/Quest/Quest10020078.json b/assets/LevelProcess/MainCity/Quest/Quest10020078.json new file mode 100644 index 0000000..a93aaf3 --- /dev/null +++ b/assets/LevelProcess/MainCity/Quest/Quest10020078.json @@ -0,0 +1,43 @@ +{ + "ID": 10020078, + "Sections": { + "1": { + "SectionProgress": { + "ID": 100200781, + "OnAdd": [ + "Sec1_CreateTrigger" + ], + "Events": { + "Sec1_CreateTrigger": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionChangeInteractCfg", + "ID": 101, + "InteractID": 10001065, + "TagIDs": [ + 2103 + ], + "Participators": { + "2103": "A" + }, + "InteractShape": "Sphere", + "InteractScale": { + "X": 2, + "Y": 0, + "Z": 0 + } + }, + { + "$type": "Share.CActionTriggerInteractCfg", + "ID": 102, + "TagID": 2103, + "InteractID": 10001065 + } + ] + } + } + } + } + } +} diff --git a/assets/LevelProcess/MainCity/Quest/Quest10020078_End.json b/assets/LevelProcess/MainCity/Quest/Quest10020078_End.json new file mode 100644 index 0000000..9f06456 --- /dev/null +++ b/assets/LevelProcess/MainCity/Quest/Quest10020078_End.json @@ -0,0 +1,40 @@ +{ + "ID": 100200781, + "Sections": { + "1": { + "SectionProgress": { + "ID": 1002007811, + "OnAdd": [ + "Sec1_DefaultTrigger" + ], + "OnExit": [ + "Sec1_ClearTrigger" + ], + "Events": { + "Sec1_DefaultTrigger": { + "ID": 100, + "Actions": [ + { + "$type": "Share.CActionRemoveMainCityQuestInteractCfg", + "ID": 101 + } + ] + }, + "Sec1_ClearTrigger": { + "ID": 200, + "Actions": [ + { + "$type": "Share.CActionRemoveMainCityQuestInteractCfg", + "ID": 201 + }, + { + "$type": "Share.CActionRemoveMainCityQuestNpcCfg", + "ID": 202 + } + ] + } + } + } + } + } +} diff --git a/assets/LevelProcess/MainCity/Quest/Quest10020079.json b/assets/LevelProcess/MainCity/Quest/Quest10020079.json new file mode 100644 index 0000000..5cb0f96 --- /dev/null +++ b/assets/LevelProcess/MainCity/Quest/Quest10020079.json @@ -0,0 +1,54 @@ +{ + "ID": 10020079, + "Sections": { + "1": { + "SectionProgress": { + "ID": 100200791, + "OnAdd": [ + "Sec1_CreateTrigger" + ], + "Events": { + "Sec1_CreateTrigger": { + "ID": 100, + "Actions": [ + // Anbi, Billy + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 103, + "TagIDs": [2071, 2072] + }, + // Newsstand + { + "$type": "Share.CActionCreateNPCCfg", + "ID": 101, + "TagID": 2099 + }, + // Newsstand interact + { + "$type": "Share.CActionChangeInteractCfg", + "ID": 102, + "InteractID": 10001066, + "TagIDs": [2099], + "Participators": { + "2099": "A" + }, + "InteractShape": "Sphere", + "InteractScale": { + "X": 0, + "Y": 2.4, + "Z": 2, + "W": 150, + "R": 10 + } + }, + { + "$type": "Share.CActionForceRefreshCfg", + "ID": 104 + } + ] + } + } + } + } + } +} diff --git a/assets/LevelProcess/MainCity/Quest/Quest10020079_End.json b/assets/LevelProcess/MainCity/Quest/Quest10020079_End.json new file mode 100644 index 0000000..f6251a8 --- /dev/null +++ b/assets/LevelProcess/MainCity/Quest/Quest10020079_End.json @@ -0,0 +1,27 @@ +{ + "ID": 100200791, + "Sections": { + "1": { + "SectionProgress": { + "ID": 1002007911, + "OnAdd": [ + ], + "OnExit": [ + "Sec1_OnExitTrigger" + ], + "Events": { + "Sec1_OnExitTrigger": { + "ID": 200, + "Actions": [ + //删除所有的交互 + { + "$type": "Share.CActionRemoveMainCityQuestInteractCfg", + "ID": 201 + } + ] + } + } + } + } + } +} diff --git a/assets/img/debug_menu.png b/assets/img/debug_menu.png new file mode 100644 index 0000000..8ce3f03 Binary files /dev/null and b/assets/img/debug_menu.png differ diff --git a/assets/img/title.png b/assets/img/title.png new file mode 100644 index 0000000..bf74d66 Binary files /dev/null and b/assets/img/title.png differ diff --git a/assets/img/tv_mode.png b/assets/img/tv_mode.png new file mode 100644 index 0000000..c55c149 Binary files /dev/null and b/assets/img/tv_mode.png differ diff --git a/assets/usm_enc_keys.json b/assets/usm_enc_keys.json new file mode 100644 index 0000000..854c760 --- /dev/null +++ b/assets/usm_enc_keys.json @@ -0,0 +1,48 @@ +{ + "2017": "13500412378380878154", + "2018": "14194867541683931705", + "2019": "2957086938990414376", + "2020": "8742342484979049747", + "2021": "5645466204257553278", + "2022": "14586085151593785032", + "2064": "17952144832019838350", + "2065": "15281280375613692392", + "2066": "11241578508858209624", + "2067": "4318065802661480984", + "2068": "11466288314126409567", + "2069": "6629300120414293425", + "2070": "15537665457465093468", + "2071": "17080637392005433816", + "2072": "17056177331191094609", + "2073": "12204333558595811624", + "2074": "8849477343914147640", + "2075": "5109306950347573912", + "2076": "15484853160206090995", + "2077": "14792757867709523111", + "2078": "2819963691494717092", + "2079": "803325263687118701", + "2087": "5005993697629750226", + "2088": "13097170729875846226", + "2089": "12381516076256549817", + "2090": "15289692747112270671", + "2101": "16828912159601295724", + "2102": "14833705503436008493", + "2103": "6462063499844811445", + "2104": "408265427432521143", + "2105": "3822120889165637690", + "2106": "7053652082690964751", + "2107": "8536262181850849909", + "2108": "3558403912923967341", + "2109": "16039702702970639022", + "2110": "16380882204181083938", + "2111": "8983995639456568721", + "2112": "13816213721650361773", + "2113": "9195781985253751076", + "2114": "5090447770357593731", + "2115": "11351697985258364657", + "2116": "4532048256158158265", + "2117": "7953504079100754206", + "2118": "10344197842536189788", + "2119": "9548510827818393465", + "2120": "15619253749818121064" +} diff --git a/lib/codegen/Cargo.toml b/lib/codegen/Cargo.toml new file mode 100644 index 0000000..ca65500 --- /dev/null +++ b/lib/codegen/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "vivian-codegen" +edition = "2024" +version.workspace = true + +[lib] +proc-macro = true + +[dependencies] +proc-macro2.workspace = true +syn.workspace = true +quote.workspace = true diff --git a/lib/codegen/src/config.rs b/lib/codegen/src/config.rs new file mode 100644 index 0000000..863bb33 --- /dev/null +++ b/lib/codegen/src/config.rs @@ -0,0 +1,30 @@ +use proc_macro::TokenStream; +use quote::quote; +use syn::{Fields, ItemStruct, parse_macro_input}; + +pub fn impl_action(input: TokenStream) -> TokenStream { + let item = parse_macro_input!(input as ItemStruct); + let name = &item.ident; + let vis = &item.vis; + let attrs = &item.attrs; + + let Fields::Named(fields) = &item.fields else { + panic!("unnamed fields are not supported"); + }; + + let fields = &fields.named; + + quote! { + #[derive(::serde::Deserialize, Debug)] + #[serde(rename_all = "PascalCase")] + #(#attrs)* + #vis struct #name { + #[serde(rename = "ID")] + pub id: u32, + #[serde(default)] + pub predicates: Vec, + #fields + } + } + .into() +} diff --git a/lib/codegen/src/game_server/mod.rs b/lib/codegen/src/game_server/mod.rs new file mode 100644 index 0000000..09d796a --- /dev/null +++ b/lib/codegen/src/game_server/mod.rs @@ -0,0 +1,107 @@ +// Helper macros for game-server + +use proc_macro::TokenStream; +use quote::quote; +use syn::{Data, DeriveInput, parse_macro_input}; + +pub fn impl_model_manager(item: TokenStream) -> TokenStream { + let input = parse_macro_input!(item as DeriveInput); + + let Data::Struct(data) = input.data else { + panic!("unexpected input type"); + }; + + let model_field_names = data + .fields + .iter() + .filter_map(|field| { + field + .attrs + .iter() + .any(|attr| attr.path().is_ident("model")) + .then_some(field.ident.as_ref().unwrap()) + }) + .collect::>(); + + let name = &input.ident; + quote! { + impl ModelManager for #name { + fn is_any_model_modified(&self) -> bool { + #(self.#model_field_names.is_any_field_changed() )||* + } + + fn changes_acknowledged(&mut self) { + #(self.#model_field_names.reset_changed_fields();)* + } + + fn has_models_to_synchronize(&self) -> bool { + #((self.#model_field_names.supports_player_sync() && self.#model_field_names.is_any_field_changed()))||* + } + + fn for_each_model(&self, mut f: impl FnMut(&dyn Model)) { + #(f(&self.#model_field_names);)* + } + + fn for_each_model_mut(&mut self, mut f: impl FnMut(&mut dyn Model)) { + #(f(&mut self.#model_field_names);)* + } + } + } + .into() +} + +pub fn impl_model_trait(item: TokenStream) -> TokenStream { + let input = parse_macro_input!(item as DeriveInput); + + let Data::Struct(data) = input.data else { + panic!("unexpected input type"); + }; + + let fields = data + .fields + .iter() + .filter_map(|field| field.ident.as_ref()) + .collect::>(); + + let name = &input.ident; + quote! { + impl Model for #name { + fn is_any_field_changed(&self) -> bool { + #(self.#fields.is_changed() )||* + } + + fn reset_changed_fields(&mut self) { + #(self.#fields.reset_changed_state();)* + } + } + } + .into() +} + +pub fn impl_property_trait(item: TokenStream) -> TokenStream { + let input = parse_macro_input!(item as DeriveInput); + + let Data::Struct(data) = input.data else { + panic!("unexpected input type"); + }; + + let fields = data + .fields + .iter() + .filter_map(|field| field.ident.as_ref()) + .collect::>(); + + let name = &input.ident; + quote! { + impl Property for #name { + fn is_changed(&self) -> bool { + #(self.#fields.is_changed() )||* + } + + fn reset_changed_state(&mut self) { + #(self.#fields.reset_changed_state();)* + } + } + } + .into() +} diff --git a/lib/codegen/src/lib.rs b/lib/codegen/src/lib.rs new file mode 100644 index 0000000..633dcab --- /dev/null +++ b/lib/codegen/src/lib.rs @@ -0,0 +1,35 @@ +use proc_macro::TokenStream; + +mod config; +mod game_server; +mod packet_handling; + +#[proc_macro_attribute] +pub fn handlers(attr: TokenStream, input: TokenStream) -> TokenStream { + packet_handling::impl_handlers(attr, input) +} + +#[proc_macro_attribute] +pub fn required_state(attr: TokenStream, input: TokenStream) -> TokenStream { + packet_handling::impl_required_state(attr, input) +} + +#[proc_macro_derive(ModelManager, attributes(model))] +pub fn derive_model_manager(item: TokenStream) -> TokenStream { + game_server::impl_model_manager(item) +} + +#[proc_macro_derive(Model)] +pub fn derive_model(item: TokenStream) -> TokenStream { + game_server::impl_model_trait(item) +} + +#[proc_macro_derive(Property)] +pub fn derive_property(item: TokenStream) -> TokenStream { + game_server::impl_property_trait(item) +} + +#[proc_macro_attribute] +pub fn action(_: TokenStream, item: TokenStream) -> TokenStream { + config::impl_action(item) +} diff --git a/lib/codegen/src/packet_handling.rs b/lib/codegen/src/packet_handling.rs new file mode 100644 index 0000000..55b9c97 --- /dev/null +++ b/lib/codegen/src/packet_handling.rs @@ -0,0 +1,119 @@ +use proc_macro::TokenStream; +use quote::{ToTokens, quote}; +use syn::{FnArg, Ident, ImplItem, ItemFn, ItemImpl, ReturnType, parse_macro_input}; + +pub fn impl_handlers(_attr: TokenStream, input: TokenStream) -> TokenStream { + let impl_block = parse_macro_input!(input as ItemImpl); + let impl_name = &impl_block.self_ty; + + let mut output_module = proc_macro2::TokenStream::new(); + let mut registrations = proc_macro2::TokenStream::new(); + + for item in impl_block.items.iter() { + let ImplItem::Fn(func) = item else { + output_module.extend(item.to_token_stream()); + continue; + }; + + let sig = &func.sig; + let name = &sig.ident; + + assert_eq!(sig.inputs.len(), 2); + + let argument = match sig.inputs.get(1).as_ref().unwrap() { + FnArg::Typed(argument) => argument, + FnArg::Receiver(_) => unreachable!(), + }; + + output_module.extend(quote! { + #[::tracing::instrument(skip_all)] + #func + }); + + let request_type = argument.ty.as_ref(); + let has_return_message = ReturnType::Default != sig.output; + + if has_return_message { + registrations.extend(quote! { + handler_map.insert(#request_type::CMD_ID, |context, cmd_id, body| { + let Ok(req) = #request_type::decode(body.as_ref()) else { + ::tracing::error!("failed to decode {}", stringify!(#request_type)); + return; + }; + + let rsp = Self::#name(context, req); + context.response = Some((rsp.get_cmd_id(), rsp.encode_to_vec())) + }); + }); + } else { + registrations.extend(quote! { + handler_map.insert(#request_type::CMD_ID, |context, cmd_id, body| { + let Ok(req) = #request_type::decode(body.as_ref()) else { + ::tracing::error!("failed to decode {}", stringify!(#request_type)); + return; + }; + + Self::#name(context, req); + }); + }); + } + } + + quote! { + impl #impl_name { + pub fn register_handlers(handler_map: &mut ::std::collections::HashMap) { + use vivian_proto::*; + + #registrations + } + + #output_module + } + } + .into() +} + +pub fn impl_required_state(attr: TokenStream, input: TokenStream) -> TokenStream { + let attr = parse_macro_input!(attr as Ident); + let func = parse_macro_input!(input as ItemFn); + + let vis = &func.vis; + let sig = &func.sig; + let func_name = &sig.ident; + let block = &func.block; + + let FnArg::Typed(context_arg) = func.sig.inputs.get(0).unwrap() else { + panic!("First argument should be of type &mut NetContext<'_>"); + }; + + let context_arg_pat = &context_arg.pat; + + if let ReturnType::Type(_, return_message) = &func.sig.output { + quote! { + #vis #sig { + if !#context_arg_pat.player.ensure_state(crate::logic::player::LoadingState::#attr) { + ::tracing::error!("{}: ensure_state({:?}) failed", stringify!(#func_name), stringify!(#attr)); + + #[allow(clippy::needless_update)] + return #return_message { + retcode: 1, + ..Default::default() + }; + } + + #block + } + }.into() + } else { + quote! { + #vis #sig { + if #context_arg_pat.player.ensure_state(crate::logic::player::PlayerState::#attr) { + ::tracing::error!("{}: ensure_state({:?}) failed", stringify!(#func_name), stringify!(#attr)); + return; + } + + #block + } + }.into() + } +} diff --git a/lib/common/Cargo.toml b/lib/common/Cargo.toml new file mode 100644 index 0000000..70b512c --- /dev/null +++ b/lib/common/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "common" +edition = "2024" +version.workspace = true + +[dependencies] +serde.workspace = true +toml.workspace = true + +tracing.workspace = true +tracing-subscriber.workspace = true diff --git a/lib/common/src/config_util.rs b/lib/common/src/config_util.rs new file mode 100644 index 0000000..e2d3543 --- /dev/null +++ b/lib/common/src/config_util.rs @@ -0,0 +1,32 @@ +use std::path::Path; + +use serde::de::DeserializeOwned; + +pub fn load_or_create(path: &str, defaults: &str) -> T { + let path = Path::new(path); + + std::fs::read_to_string(path).map_or_else( + |_| { + path.parent() + .inspect(|parent| std::fs::create_dir_all(parent).unwrap()); + + std::fs::write(path, defaults).unwrap(); + toml::from_str(defaults).unwrap_or_else(|err| { + panic!( + "failed to parse defaults for configuration file {}: {}", + path.display(), + err + ) + }) + }, + |data| { + toml::from_str(&data).unwrap_or_else(|err| { + panic!( + "failed to parse configuration file {}: {}", + path.display(), + err + ) + }) + }, + ) +} diff --git a/lib/common/src/lib.rs b/lib/common/src/lib.rs new file mode 100644 index 0000000..302e0d4 --- /dev/null +++ b/lib/common/src/lib.rs @@ -0,0 +1,3 @@ +pub mod config_util; +pub mod logging; +pub mod time_util; diff --git a/lib/common/src/logging.rs b/lib/common/src/logging.rs new file mode 100644 index 0000000..678b869 --- /dev/null +++ b/lib/common/src/logging.rs @@ -0,0 +1,5 @@ +use tracing::Level; + +pub fn init_tracing(level: Level) { + tracing_subscriber::fmt().with_max_level(level).init() +} diff --git a/lib/common/src/time_util.rs b/lib/common/src/time_util.rs new file mode 100644 index 0000000..46b0b97 --- /dev/null +++ b/lib/common/src/time_util.rs @@ -0,0 +1,13 @@ +use std::time::{Duration, SystemTime, UNIX_EPOCH}; + +pub fn unix_timestamp() -> Duration { + SystemTime::now().duration_since(UNIX_EPOCH).unwrap() +} + +pub fn unix_timestamp_seconds() -> i64 { + unix_timestamp().as_secs() as i64 +} + +pub fn unix_timestamp_ms() -> u64 { + unix_timestamp().as_millis() as u64 +} diff --git a/lib/config/Cargo.toml b/lib/config/Cargo.toml new file mode 100644 index 0000000..70ad3b0 --- /dev/null +++ b/lib/config/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "config" +edition = "2024" +version.workspace = true + +[dependencies] +flatbuffers.workspace = true +serde.workspace = true +serde_json5.workspace = true + +paste.workspace = true +const_format.workspace = true +xxhash-rust.workspace = true +thiserror.workspace = true +num_enum.workspace = true +itertools.workspace = true + +vivian-codegen.workspace = true + +[build-dependencies] +flatc-rust.workspace = true diff --git a/lib/config/build.rs b/lib/config/build.rs new file mode 100644 index 0000000..b40bc4b --- /dev/null +++ b/lib/config/build.rs @@ -0,0 +1,16 @@ +use std::path::Path; + +fn main() { + println!("cargo:rerun-if-changed=fbs"); + + let inputs = std::fs::read_dir("fbs") + .unwrap() + .map(|entry| entry.unwrap().path()) + .collect::>(); + + let _ = flatc_rust::run(flatc_rust::Args { + inputs: &inputs.iter().map(|buf| buf.as_path()).collect::>(), + out_dir: Path::new("gen_flatbuffers"), + ..Default::default() + }); +} diff --git a/lib/config/fbs/avatar_base_template.fbs b/lib/config/fbs/avatar_base_template.fbs new file mode 100644 index 0000000..b8e253c --- /dev/null +++ b/lib/config/fbs/avatar_base_template.fbs @@ -0,0 +1,18 @@ +table AvatarBaseTemplate { + id: uint; + code_name: string; + name: string; + full_name: string; + audio_event_replace_param: string; + audio_bank: string; + hit_types: [int]; + element_types: [int]; + unk_1: int; + gender: uint; + camp: uint; + unk_2: [string]; +} + +table AvatarBaseTemplateTb { + data: [AvatarBaseTemplate]; +} diff --git a/lib/config/fbs/avatar_battle_template.fbs b/lib/config/fbs/avatar_battle_template.fbs new file mode 100644 index 0000000..473d31a --- /dev/null +++ b/lib/config/fbs/avatar_battle_template.fbs @@ -0,0 +1,83 @@ +table AvatarBattleTemplate { + id: uint; + unk_1: [int]; + unk_2: [int]; + unk_3: [int]; + unk_4: [int]; + unk_5: [int]; + unk_6: [int]; + unk_7: [int]; + unk_8: int; + unk_9: int; + unk_10: int; + avatar_piece_id: int; + unk_12: int; + unk_13: int; + hp_max: int; + health_growth: int; + unk_16: int; + unk_17: int; + unk_18: int; + unk_19: int; + unk_20: int; + attack: int; + attack_growth: int; + defence: int; + defence_growth: int; + crit: int; + crit_damage: int; + crit_res: int; + crit_damage_res: int; + pen_rate: int; + pen_delta: int; + luck: int; + stun: int; + break_stun: int; + element_abnormal_power: int; + sp_bar_point: int; + sp_recover: int; + element_mystery: int; + rbl: int; + rbl_correction_factor: int; + rbl_probability: int; + unk_41: int; + unk_42: int; + unk_43: int; + unk_44: int; + unk_45: int; + unk_46: int; + unk_47: int; + unk_48: int; + unk_49: int; + unk_50: int; + unk_51: int; + unk_52: int; + unk_53: int; + unk_54: int; + unk_55: int; + unk_56: int; + unk_57: int; + unk_58: int; + unk_59: int; + unk_60: int; + unk_61: int; + unk_62: int; + unk_63: int; + unk_64: int; + unk_65: int; + unk_66: int; + tags: [string]; + unk_68: [int]; + unk_69: [int]; + unk_70: int; + unk_71: int; + element: [int]; + hit_type: [int]; + unk_element_camp: [string]; + unk_75: int; + unk_76: short; +} + +table AvatarBattleTemplateTb { + data: [AvatarBattleTemplate]; +} diff --git a/lib/config/fbs/avatar_level_advance_template.fbs b/lib/config/fbs/avatar_level_advance_template.fbs new file mode 100644 index 0000000..f3e522f --- /dev/null +++ b/lib/config/fbs/avatar_level_advance_template.fbs @@ -0,0 +1,31 @@ +struct RefineCost { + item_id: uint; + number: int; +} + +table AvatarLevelAdvanceTemplate { + avatar_id: uint; + id: uint; + min_level: uint; + max_level: uint; + hp_max: int; + unk_5: int; + unk_6: int; + attack: int; + defence: int; + unk_9: int; + unk_10: int; + unk_11: int; + unk_12: int; + unk_13: int; + unk_14: int; + unk_15: int; + unk_16: int; + unk_17: int; + unk_18: [int]; + promotion_costs: [RefineCost]; +} + +table AvatarLevelAdvanceTemplateTb { + data: [AvatarLevelAdvanceTemplate]; +} diff --git a/lib/config/fbs/avatar_level_template.fbs b/lib/config/fbs/avatar_level_template.fbs new file mode 100644 index 0000000..cc063c3 --- /dev/null +++ b/lib/config/fbs/avatar_level_template.fbs @@ -0,0 +1,8 @@ +table AvatarLevelTemplate { + level: uint; + exp: uint; +} + +table AvatarLevelTemplateTb { + data: [AvatarLevelTemplate]; +} diff --git a/lib/config/fbs/avatar_passive_skill_template.fbs b/lib/config/fbs/avatar_passive_skill_template.fbs new file mode 100644 index 0000000..03fa1d1 --- /dev/null +++ b/lib/config/fbs/avatar_passive_skill_template.fbs @@ -0,0 +1,31 @@ +struct RefineCost { + item_id: uint; + number: int; +} + +struct Property { + property: uint; + value: int; +} + +table AvatarPassiveSkillTemplate { + skill_id: int; + avatar_id: uint; + min_avatar_level: uint; + min_passive_skill_level: uint; + unlock_passive_skill_level: uint; + unk_5: int; + unk_levelup: string; + unk_7: int; + unk_8: int; + unk_9: int; + unk_10: int; + propertys: [Property]; + names: [string]; + descriptions: [string]; + materials_costs: [RefineCost]; +} + +table AvatarPassiveSkillTemplateTb { + data: [AvatarPassiveSkillTemplate]; +} diff --git a/lib/config/fbs/avatar_skin_base_template.fbs b/lib/config/fbs/avatar_skin_base_template.fbs new file mode 100644 index 0000000..3254f4c --- /dev/null +++ b/lib/config/fbs/avatar_skin_base_template.fbs @@ -0,0 +1,30 @@ +table AvatarSkinBaseTemplate { + id: uint; + server_only_0: int; + DLFHPHCLIBA: string; + NFIEGMLEEFE: string; + avatar_id: uint; + server_only_1: int; + server_only_2: int; + server_only_3: int; + GMBBOEGOEPH: string; + HMIOIBHJGCM: [string]; + server_only_4: int; + OEMHKAENMHN: int; + FGJJELBGBBC: string; + FKBJLMBAPDI: int; + server_only_5: int; + server_only_6: int; + server_only_7: int; + server_only_8: int; + server_only_9: int; + DIGLJDFKAMN: string; + BKFKIDCLHKL: int; + FHJDONJMNKP: string; + AHHLKMJEEAE: string; + HPMCPJGPKJB: int; +} + +table AvatarSkinBaseTemplateTb { + data: [AvatarSkinBaseTemplate]; +} diff --git a/lib/config/fbs/battle_group_config_template.fbs b/lib/config/fbs/battle_group_config_template.fbs new file mode 100644 index 0000000..5843070 --- /dev/null +++ b/lib/config/fbs/battle_group_config_template.fbs @@ -0,0 +1,18 @@ +table BattleGroupConfigTemplate { + id: uint; + quest_id: uint; + unk_1: int; + unk_2: string; + unk_3: int; + unk_4: string; + unk_5: string; + unk_6: [string]; + battle_event_id: uint; + unk_8: bool; + unk_9: bool; + unk_10: [string]; +} + +table BattleGroupConfigTemplateTb { + data: [BattleGroupConfigTemplate]; +} diff --git a/lib/config/fbs/condition_config_template.fbs b/lib/config/fbs/condition_config_template.fbs new file mode 100644 index 0000000..5af6243 --- /dev/null +++ b/lib/config/fbs/condition_config_template.fbs @@ -0,0 +1,13 @@ +table ConditionConfigTemplate { + condition_id: int; + args: string; + commentary: string; + unk_2: [int]; + statis_type: uint; + target_num: uint; + type: int; +} + +table ConditionConfigTemplateTb { + data: [ConditionConfigTemplate]; +} diff --git a/lib/config/fbs/equipment_level_template.fbs b/lib/config/fbs/equipment_level_template.fbs new file mode 100644 index 0000000..398aa0a --- /dev/null +++ b/lib/config/fbs/equipment_level_template.fbs @@ -0,0 +1,13 @@ +table EquipmentLevelTemplate { + rarity: uint; + level: uint; + property_rate: uint; + unk_3: int; + unk_4: int; + unk_5: int; + unk_6: int; +} + +table EquipmentLevelTemplateTb { + data: [EquipmentLevelTemplate]; +} diff --git a/lib/config/fbs/equipment_suit_template.fbs b/lib/config/fbs/equipment_suit_template.fbs new file mode 100644 index 0000000..dcfc492 --- /dev/null +++ b/lib/config/fbs/equipment_suit_template.fbs @@ -0,0 +1,40 @@ +struct Property { + property: uint; + value: int; +} + +table EquipmentSuitTemplate { + id: uint; + name: string; + primary_condition: uint; + unk_3: int; + primary_suit_ability: uint; + primary_description: string; + secondary_condition: uint; + unk_7: int; + secondary_suit_ability: int; + secondary_description: string; + suit_icon: string; + suit_story: string; + suit_filter_option: string; + suit_item_icon: string; + unk_14: int; + order: int; + unk_16: int; + unk_17: int; + unk_18: int; + unk_19: int; + unk_20: int; + unk_21: int; + primary_suit_propertys: [Property]; + unk_23: [int]; + unk_24: int; + unk_25: [int]; + unk_26: [int]; + unk_27: [int]; + tag: string; +} + +table EquipmentSuitTemplateTb { + data: [EquipmentSuitTemplate]; +} diff --git a/lib/config/fbs/equipment_template.fbs b/lib/config/fbs/equipment_template.fbs new file mode 100644 index 0000000..08e3a87 --- /dev/null +++ b/lib/config/fbs/equipment_template.fbs @@ -0,0 +1,16 @@ +table EquipmentTemplate { + item_id: uint; + equipment_type: uint; + suit_type: uint; + disk_icon_path: string; + drawing_path: string; + front_label_texture_path: string; + back_label_texture_path: string; + disk_texture_path: string; + play_music_tag: string; + pause_music_tag: string; +} + +table EquipmentTemplateTb { + data: [EquipmentTemplate]; +} diff --git a/lib/config/fbs/hollow_challenge_template.fbs b/lib/config/fbs/hollow_challenge_template.fbs new file mode 100644 index 0000000..b87b1cc --- /dev/null +++ b/lib/config/fbs/hollow_challenge_template.fbs @@ -0,0 +1,10 @@ +table HollowChallengeTemplate { + id: uint; + hollow_quest_id: uint; + unk_1: bool; + unk_2: bool; +} + +table HollowChallengeTemplateTb { + data: [HollowChallengeTemplate]; +} diff --git a/lib/config/fbs/hollow_config_template.fbs b/lib/config/fbs/hollow_config_template.fbs new file mode 100644 index 0000000..4a4ef10 --- /dev/null +++ b/lib/config/fbs/hollow_config_template.fbs @@ -0,0 +1,18 @@ +table HollowConfigTemplate { + id: uint; + hollow_group: uint; + name: string; + unlock_condition: string; + lock_hint: string; + pic_res: string; + model_res: string; + locked_color: string; + unlocked_color: string; + unk_1: bool; + unk_2: string; + unk_3: string; +} + +table HollowConfigTemplateTb { + data: [HollowConfigTemplate]; +} diff --git a/lib/config/fbs/hollow_event_template.fbs b/lib/config/fbs/hollow_event_template.fbs new file mode 100644 index 0000000..16d2bce --- /dev/null +++ b/lib/config/fbs/hollow_event_template.fbs @@ -0,0 +1,24 @@ +table HollowEventTemplate { + id: uint; + unlock_condition: string; + unk_1: [string]; + type: uint; + can_trigger_times: int; + pre_icon_res: string; + interact_icon_texture_sheet_id: int; + icon_texture_sheet_id: int; + target_id: uint; + param_1: string; + param_2: string; + param_3: string; + param_4: string; + param_5: string; + param_6: string; + param_exts: [string]; + unk_3: int; + unk_4: int; +} + +table HollowEventTemplateTb { + data: [HollowEventTemplate]; +} diff --git a/lib/config/fbs/hollow_quest_template.fbs b/lib/config/fbs/hollow_quest_template.fbs new file mode 100644 index 0000000..d6a69b5 --- /dev/null +++ b/lib/config/fbs/hollow_quest_template.fbs @@ -0,0 +1,106 @@ +enum HollowQuestType: int { + AbyssS2_HobaPrefac = 26, + NormalBattle = 10, + MainQuest = 1, + AbyssS2_Period = 20, + DifficutyBattle = 12, + AbyssS2_RoleChallenge = 22, + SideQuest = 2, + Common = 0, + EnumCount = 27, + Urgent = 3, + TheGun = 18, + AbyssS2_Story = 19, + NestVeryHard = 15, + Arpeggio = 17, + Challenge = 5, + DreamEndLess = 24, + AvatarSide = 7, + BossRushBattle = 14, + RallyBattle = 13, + ChallengeChaos = 6, + PromoteBattle = 11, + World = 8, + HackerActivity = 16, + AbyssS2_Event = 25, + DreamNormal = 23, + MainQuestChessboard = 21, + UrgentSupplement = 4 +} + +table HollowQuestTemplate { + id: uint; + unk_1: int; + chessboard_id: uint; + unk_2: int; + hollow_id: uint; + hollow_quest_type: HollowQuestType; + unk_3: int; + duration: string; + has_stamina: string; + environments: [string]; + main_difficulty: string; + difficulties: [string]; + recommended_elements: [string]; + client: string; + unk_4: int; + unk_5: bool; + unk_6: int; + scale: int; + show_tip: int; + monster_level: int; + recommended_level: int; + average_level_tips: int; + recommended_hit_types: [int]; + unk_7: [int]; + unk_8: bool; + unk_9: bool; + unk_10: string; + unk_11: int; + unk_12: bool; + unk_13: int; + slot_1_avatar: int; + slot_2_avatar: int; + slot_3_avatar: int; + unk_14: int; + unk_15: bool; + unk_16: bool; + unk_17: int; + preview_res_group_id: int; + chessboard_res_group_id: int; + bgm_chapter_state: string; + unk_18: int; + unk_19: string; + unk_20: int; + unk_21: [int]; + unk_22: int; + unk_23: int; + unk_24: int; + unk_25: bool; + unk_26: int; + title: string; + difficulty: string; + target: string; + unk_27: [string]; + unk_28: int; + unk_29: int; + unk_30: bool; + unk_31: int; + unk_32: bool; + unk_33: int; + hollow_item_ban_lists: [int]; + unk_34: bool; + enemy_types: [string]; + background: string; + unk_35: int; + unk_36: [int]; + unk_37: [int]; + unk_38: int; + unk_39: int; + unk_40: int; + unk_41: int; +} + +table HollowQuestTemplateTb { + data: [HollowQuestTemplate]; +} diff --git a/lib/config/fbs/item_template.fbs b/lib/config/fbs/item_template.fbs new file mode 100644 index 0000000..a431890 --- /dev/null +++ b/lib/config/fbs/item_template.fbs @@ -0,0 +1,48 @@ +table ItemTemplate { + id: uint; + name: string; + rarity: uint; + class: uint; + unk_1: int; + unk_2: int; + desc: string; + show_detail: int; + story: string; + unk_101: int; + icon_path: string; + unk_102: int; + small_icon_path: string; + unk_103: int; + big_icon: string; + unk_3: int; + prefab_path: string; + package: uint; + unk_4: int; + keep_max: uint; + value: uint; + unk_5: int; + unk_6: string; + unk_7: int; + unk_8: int; + unk_9: int; + unk_10: int; + born_effect_path: string; + remain_effect_path: string; + interaction_effect_path: string; + dead_effect_path: string; + item_drop_effect_name: string; + unk_11: int; + unk_12: int; + unk_13: int; + unk_14: string; + grocery_icon: string; + unk_15: [int]; + unk_16: [int]; + unk_17: ulong; + unk_18: int; + parameters: [uint]; +} + +table ItemTemplateTb { + data: [ItemTemplate]; +} diff --git a/lib/config/fbs/main_city_object_template.fbs b/lib/config/fbs/main_city_object_template.fbs new file mode 100644 index 0000000..1cf4a25 --- /dev/null +++ b/lib/config/fbs/main_city_object_template.fbs @@ -0,0 +1,48 @@ +table MainCityObjectTemplate { + tag_id: int; + npc_id: int; + create_position: string; + create_type: int; + npc_name: string; + unk_0: int; + unk_1: int; + dialogue: string; + interact_name: string; + interact_shape: int; + interact_scale: string; + secondary_interact_shape: int; + secondary_interact_scale: string; + fan_interact_param: string; + focus_interact_scale: float; + unk_2: bool; + unk_3: bool; + unk_4: bool; + unk_5: bool; + unk_6: int; + unk_7: bool; + unk_8: bool; + unk_9: uint; + unk_10: uint; + unk_11: uint; + unk_12: uint; + unk_13: uint; + unk_14: uint; + unk_15: bool; + unk_16: uint; + unk_17: bool; + unk_18: uint; + unk_19: uint; + unk_20: uint; + unk_21: uint; + unk_22: uint; + unk_23: bool; + unk_24: uint; + unk_25: bool; + unk_26: uint; + unk_27: uint; + default_interact_ids: [int]; +} + +table MainCityObjectTemplateTb { + data: [MainCityObjectTemplate]; +} diff --git a/lib/config/fbs/main_city_quest_template.fbs b/lib/config/fbs/main_city_quest_template.fbs new file mode 100644 index 0000000..45a463d --- /dev/null +++ b/lib/config/fbs/main_city_quest_template.fbs @@ -0,0 +1,39 @@ +table Time { + hour: int; + minute: int; +} + +table MainCityQuestTemplate { + id: uint; + quest_name: string; + type: int; + show_finish_tip: int; + unk_2: string; + unk_3: bool; + quest_desc: string; + unk_5: string; + start_time: Time; + unk_6: int; + unk_7: int; + group: int; + priority: int; + auto_distribution: bool; + script_exec_type: int; + unk_8: [int]; + quest_begin_script: int; + quest_end_script: int; + quest_end_action_type: int; + action_arg_1: string; + action_arg_2: string; + action_arg_3: string; + action_arg_4: string; + unk_9: bool; + unk_10: bool; + npcs: [int]; + areas: [int]; + unk_11: [int]; +} + +table MainCityQuestTemplateTb { + data: [MainCityQuestTemplate]; +} diff --git a/lib/config/fbs/newbie_group_template.fbs b/lib/config/fbs/newbie_group_template.fbs new file mode 100644 index 0000000..177022c --- /dev/null +++ b/lib/config/fbs/newbie_group_template.fbs @@ -0,0 +1,9 @@ +table NewbieGroupTemplate { + id: int; + unk_1: int; + trigger_condition: string; +} + +table NewbieGroupTemplateTb { + data: [NewbieGroupTemplate]; +} diff --git a/lib/config/fbs/once_reward_template.fbs b/lib/config/fbs/once_reward_template.fbs new file mode 100644 index 0000000..98b1c2a --- /dev/null +++ b/lib/config/fbs/once_reward_template.fbs @@ -0,0 +1,18 @@ +struct RewardConfig { + item_id: uint; + amount: uint; + unk_1: int; +} + +table OnceRewardTemplate { + reward_id: uint; + unk_1: int; + unk_2: int; + unk_3: [int]; + unk_4: [int]; + reward_list: [RewardConfig]; +} + +table OnceRewardTemplateTb { + data: [OnceRewardTemplate]; +} diff --git a/lib/config/fbs/post_girl_config_template.fbs b/lib/config/fbs/post_girl_config_template.fbs new file mode 100644 index 0000000..1d32325 --- /dev/null +++ b/lib/config/fbs/post_girl_config_template.fbs @@ -0,0 +1,15 @@ +table PostGirlConfigTemplate { + id: uint; + name: string; + tag: string; + unk_1: int; + unk_2: string; + unk_3: int; + role_icon_name: string; + unk_4: string; + unk_5: [int]; +} + +table PostGirlConfigTemplateTb { + data: [PostGirlConfigTemplate]; +} diff --git a/lib/config/fbs/quest_config_template.fbs b/lib/config/fbs/quest_config_template.fbs new file mode 100644 index 0000000..112b4e1 --- /dev/null +++ b/lib/config/fbs/quest_config_template.fbs @@ -0,0 +1,30 @@ +table QuestConfigTemplate { + quest_id: uint; + quest_name: string; + quest_type: int; + desc: string; + target_desc: string; + quest_desc: string; + icon: string; + auto_finish: bool; + sub_quests: [int]; + unk_0: [int]; + unk_1: int; + unlock_condition: string; + finish_condition: string; + reward_id: uint; + unk_3: int; + unk_4: int; + unk_5: string; + unk_6: [string]; + unk_7: string; + unk_8: [string]; + unk_9: [int]; + unk_10: int; + unk_11: int; + preorder_quest_ids: [uint]; +} + +table QuestConfigTemplateTb { + data: [QuestConfigTemplate]; +} diff --git a/lib/config/fbs/section_config_template.fbs b/lib/config/fbs/section_config_template.fbs new file mode 100644 index 0000000..2e21881 --- /dev/null +++ b/lib/config/fbs/section_config_template.fbs @@ -0,0 +1,13 @@ +table SectionConfigTemplate { + section_id: uint; + section_photo: string; + name: string; + born_transform: string; + alternative_born_transform: string; + unk_3: int; + section_name: string; +} + +table SectionConfigTemplateTb { + data: [SectionConfigTemplate]; +} diff --git a/lib/config/fbs/traning_quest_template.fbs b/lib/config/fbs/traning_quest_template.fbs new file mode 100644 index 0000000..1bb0c04 --- /dev/null +++ b/lib/config/fbs/traning_quest_template.fbs @@ -0,0 +1,18 @@ +table TraningQuestTemplate { + id: uint; + training_type: int; + battle_event_id: uint; + special_training_name: string; + special_training_id: int; + unk_1: int; + unk_2: int; + unk_3: int; + unk_4: bool; + unk_5: bool; + unk_6: string; + unk_7: string; +} + +table TraningQuestTemplateTb { + data: [TraningQuestTemplate]; +} diff --git a/lib/config/fbs/unlock_config_template.fbs b/lib/config/fbs/unlock_config_template.fbs new file mode 100644 index 0000000..90b9ea1 --- /dev/null +++ b/lib/config/fbs/unlock_config_template.fbs @@ -0,0 +1,31 @@ +table UnlockConfigTemplate { + id: int; + unk_1: string; + unk_2: [int]; + unk_3: int; + unk_4: int; + unk_5: int; + unk_6: string; + unk_7: int; + unk_8: string; + icon_res: string; + unk_9: int; + name: string; + unk_10: string; + unk_11: int; + unk_12: int; + unk_13: bool; + unk_14: int; + unk_15: string; + unk_16: int; + unk_17: string; + unk_18: int; + unk_19: int; + unk_20: string; + unk_21: int; + unk_22: string; +} + +table UnlockConfigTemplateTb { + data: [UnlockConfigTemplate]; +} diff --git a/lib/config/fbs/weapon_level_template.fbs b/lib/config/fbs/weapon_level_template.fbs new file mode 100644 index 0000000..befc07e --- /dev/null +++ b/lib/config/fbs/weapon_level_template.fbs @@ -0,0 +1,10 @@ +table WeaponLevelTemplate { + rarity: uint; + level: uint; + rate: uint; + exp: uint; +} + +table WeaponLevelTemplateTb { + data: [WeaponLevelTemplate]; +} diff --git a/lib/config/fbs/weapon_star_template.fbs b/lib/config/fbs/weapon_star_template.fbs new file mode 100644 index 0000000..39c08be --- /dev/null +++ b/lib/config/fbs/weapon_star_template.fbs @@ -0,0 +1,19 @@ +table WeaponStarTemplate { + rarity: uint; + star: uint; + min_level: uint; + max_level: uint; + star_rate: uint; + rand_rate: uint; + unk_6: int; + unk_7: int; + unk_8: int; + unk_9: int; + unk_10: int; + unk_11: int; + unk_12: int; +} + +table WeaponStarTemplateTb { + data: [WeaponStarTemplate]; +} diff --git a/lib/config/fbs/weapon_template.fbs b/lib/config/fbs/weapon_template.fbs new file mode 100644 index 0000000..b12ea09 --- /dev/null +++ b/lib/config/fbs/weapon_template.fbs @@ -0,0 +1,43 @@ +struct RefineCost { + item_id: uint; + number: int; +} + +struct Property { + property: uint; + value: int; +} + +table WeaponTemplate { + item_id: uint; + weapon_name: string; + unk_missing_field: int; + base_property: Property; + rand_property: Property; + star_limit: uint; + exp_recycle: int; + weapon_script_config: string; + weapon_ui_model: string; + unk_1: int; + unk_missing_field_2: int; + unk_weapon_path: string; + unk_missing_field_3: int; + refine_initial: uint; + refine_limit: uint; + unk_missing_field_4: int; + unk_missing_field_5: int; + unk_string_with_values: string; + unk_missing_field_6: int; + unk_2: int; + weapon_desc: string; + weapon_release_tag: string; + unk_empty_string: string; + avatar_id: uint; + weapon_comment: string; + refine_costs: [RefineCost]; + unk_3: int; +} + +table WeaponTemplateTb { + data: [WeaponTemplate]; +} diff --git a/lib/config/fbs/yorozuya_level_template.fbs b/lib/config/fbs/yorozuya_level_template.fbs new file mode 100644 index 0000000..ef47074 --- /dev/null +++ b/lib/config/fbs/yorozuya_level_template.fbs @@ -0,0 +1,16 @@ +table YorozuyaLevelTemplate { + level: uint; + experience: uint; + reward_id: uint; + unk_1: int; + unk_2: string; + unk_3: string; + unk_4: string; + unk_5: string; + unk_6: string; + unk_7: string; +} + +table YorozuyaLevelTemplateTb { + data: [YorozuyaLevelTemplate]; +} diff --git a/lib/config/gen_flatbuffers/avatar_base_template_generated.rs b/lib/config/gen_flatbuffers/avatar_base_template_generated.rs new file mode 100644 index 0000000..965f6a0 --- /dev/null +++ b/lib/config/gen_flatbuffers/avatar_base_template_generated.rs @@ -0,0 +1,392 @@ +// automatically generated by the FlatBuffers compiler, do not modify + + +// @generated + +use core::mem; +use core::cmp::Ordering; + +extern crate flatbuffers; +use self::flatbuffers::{EndianScalar, Follow}; + +pub enum AvatarBaseTemplateOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct AvatarBaseTemplate<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for AvatarBaseTemplate<'a> { + type Inner = AvatarBaseTemplate<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> AvatarBaseTemplate<'a> { + pub const VT_ID: flatbuffers::VOffsetT = 4; + pub const VT_CODE_NAME: flatbuffers::VOffsetT = 6; + pub const VT_NAME: flatbuffers::VOffsetT = 8; + pub const VT_FULL_NAME: flatbuffers::VOffsetT = 10; + pub const VT_AUDIO_EVENT_REPLACE_PARAM: flatbuffers::VOffsetT = 12; + pub const VT_AUDIO_BANK: flatbuffers::VOffsetT = 14; + pub const VT_HIT_TYPES: flatbuffers::VOffsetT = 16; + pub const VT_ELEMENT_TYPES: flatbuffers::VOffsetT = 18; + pub const VT_UNK_1: flatbuffers::VOffsetT = 20; + pub const VT_GENDER: flatbuffers::VOffsetT = 22; + pub const VT_CAMP: flatbuffers::VOffsetT = 24; + pub const VT_UNK_2: flatbuffers::VOffsetT = 26; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + AvatarBaseTemplate { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args AvatarBaseTemplateArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = AvatarBaseTemplateBuilder::new(_fbb); + if let Some(x) = args.unk_2 { builder.add_unk_2(x); } + builder.add_camp(args.camp); + builder.add_gender(args.gender); + builder.add_unk_1(args.unk_1); + if let Some(x) = args.element_types { builder.add_element_types(x); } + if let Some(x) = args.hit_types { builder.add_hit_types(x); } + if let Some(x) = args.audio_bank { builder.add_audio_bank(x); } + if let Some(x) = args.audio_event_replace_param { builder.add_audio_event_replace_param(x); } + if let Some(x) = args.full_name { builder.add_full_name(x); } + if let Some(x) = args.name { builder.add_name(x); } + if let Some(x) = args.code_name { builder.add_code_name(x); } + builder.add_id(args.id); + builder.finish() + } + + + #[inline] + pub fn id(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBaseTemplate::VT_ID, Some(0)).unwrap()} + } + #[inline] + pub fn code_name(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(AvatarBaseTemplate::VT_CODE_NAME, None)} + } + #[inline] + pub fn name(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(AvatarBaseTemplate::VT_NAME, None)} + } + #[inline] + pub fn full_name(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(AvatarBaseTemplate::VT_FULL_NAME, None)} + } + #[inline] + pub fn audio_event_replace_param(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(AvatarBaseTemplate::VT_AUDIO_EVENT_REPLACE_PARAM, None)} + } + #[inline] + pub fn audio_bank(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(AvatarBaseTemplate::VT_AUDIO_BANK, None)} + } + #[inline] + pub fn hit_types(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(AvatarBaseTemplate::VT_HIT_TYPES, None)} + } + #[inline] + pub fn element_types(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(AvatarBaseTemplate::VT_ELEMENT_TYPES, None)} + } + #[inline] + pub fn unk_1(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBaseTemplate::VT_UNK_1, Some(0)).unwrap()} + } + #[inline] + pub fn gender(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBaseTemplate::VT_GENDER, Some(0)).unwrap()} + } + #[inline] + pub fn camp(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBaseTemplate::VT_CAMP, Some(0)).unwrap()} + } + #[inline] + pub fn unk_2(&self) -> Option>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(AvatarBaseTemplate::VT_UNK_2, None)} + } +} + +impl flatbuffers::Verifiable for AvatarBaseTemplate<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::("id", Self::VT_ID, false)? + .visit_field::>("code_name", Self::VT_CODE_NAME, false)? + .visit_field::>("name", Self::VT_NAME, false)? + .visit_field::>("full_name", Self::VT_FULL_NAME, false)? + .visit_field::>("audio_event_replace_param", Self::VT_AUDIO_EVENT_REPLACE_PARAM, false)? + .visit_field::>("audio_bank", Self::VT_AUDIO_BANK, false)? + .visit_field::>>("hit_types", Self::VT_HIT_TYPES, false)? + .visit_field::>>("element_types", Self::VT_ELEMENT_TYPES, false)? + .visit_field::("unk_1", Self::VT_UNK_1, false)? + .visit_field::("gender", Self::VT_GENDER, false)? + .visit_field::("camp", Self::VT_CAMP, false)? + .visit_field::>>>("unk_2", Self::VT_UNK_2, false)? + .finish(); + Ok(()) + } +} +pub struct AvatarBaseTemplateArgs<'a> { + pub id: u32, + pub code_name: Option>, + pub name: Option>, + pub full_name: Option>, + pub audio_event_replace_param: Option>, + pub audio_bank: Option>, + pub hit_types: Option>>, + pub element_types: Option>>, + pub unk_1: i32, + pub gender: u32, + pub camp: u32, + pub unk_2: Option>>>, +} +impl<'a> Default for AvatarBaseTemplateArgs<'a> { + #[inline] + fn default() -> Self { + AvatarBaseTemplateArgs { + id: 0, + code_name: None, + name: None, + full_name: None, + audio_event_replace_param: None, + audio_bank: None, + hit_types: None, + element_types: None, + unk_1: 0, + gender: 0, + camp: 0, + unk_2: None, + } + } +} + +pub struct AvatarBaseTemplateBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> AvatarBaseTemplateBuilder<'a, 'b, A> { + #[inline] + pub fn add_id(&mut self, id: u32) { + self.fbb_.push_slot::(AvatarBaseTemplate::VT_ID, id, 0); + } + #[inline] + pub fn add_code_name(&mut self, code_name: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(AvatarBaseTemplate::VT_CODE_NAME, code_name); + } + #[inline] + pub fn add_name(&mut self, name: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(AvatarBaseTemplate::VT_NAME, name); + } + #[inline] + pub fn add_full_name(&mut self, full_name: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(AvatarBaseTemplate::VT_FULL_NAME, full_name); + } + #[inline] + pub fn add_audio_event_replace_param(&mut self, audio_event_replace_param: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(AvatarBaseTemplate::VT_AUDIO_EVENT_REPLACE_PARAM, audio_event_replace_param); + } + #[inline] + pub fn add_audio_bank(&mut self, audio_bank: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(AvatarBaseTemplate::VT_AUDIO_BANK, audio_bank); + } + #[inline] + pub fn add_hit_types(&mut self, hit_types: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(AvatarBaseTemplate::VT_HIT_TYPES, hit_types); + } + #[inline] + pub fn add_element_types(&mut self, element_types: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(AvatarBaseTemplate::VT_ELEMENT_TYPES, element_types); + } + #[inline] + pub fn add_unk_1(&mut self, unk_1: i32) { + self.fbb_.push_slot::(AvatarBaseTemplate::VT_UNK_1, unk_1, 0); + } + #[inline] + pub fn add_gender(&mut self, gender: u32) { + self.fbb_.push_slot::(AvatarBaseTemplate::VT_GENDER, gender, 0); + } + #[inline] + pub fn add_camp(&mut self, camp: u32) { + self.fbb_.push_slot::(AvatarBaseTemplate::VT_CAMP, camp, 0); + } + #[inline] + pub fn add_unk_2(&mut self, unk_2: flatbuffers::WIPOffset>>) { + self.fbb_.push_slot_always::>(AvatarBaseTemplate::VT_UNK_2, unk_2); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> AvatarBaseTemplateBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + AvatarBaseTemplateBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for AvatarBaseTemplate<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("AvatarBaseTemplate"); + ds.field("id", &self.id()); + ds.field("code_name", &self.code_name()); + ds.field("name", &self.name()); + ds.field("full_name", &self.full_name()); + ds.field("audio_event_replace_param", &self.audio_event_replace_param()); + ds.field("audio_bank", &self.audio_bank()); + ds.field("hit_types", &self.hit_types()); + ds.field("element_types", &self.element_types()); + ds.field("unk_1", &self.unk_1()); + ds.field("gender", &self.gender()); + ds.field("camp", &self.camp()); + ds.field("unk_2", &self.unk_2()); + ds.finish() + } +} +pub enum AvatarBaseTemplateTbOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct AvatarBaseTemplateTb<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for AvatarBaseTemplateTb<'a> { + type Inner = AvatarBaseTemplateTb<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> AvatarBaseTemplateTb<'a> { + pub const VT_DATA: flatbuffers::VOffsetT = 4; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + AvatarBaseTemplateTb { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args AvatarBaseTemplateTbArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = AvatarBaseTemplateTbBuilder::new(_fbb); + if let Some(x) = args.data { builder.add_data(x); } + builder.finish() + } + + + #[inline] + pub fn data(&self) -> Option>>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(AvatarBaseTemplateTb::VT_DATA, None)} + } +} + +impl flatbuffers::Verifiable for AvatarBaseTemplateTb<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::>>>("data", Self::VT_DATA, false)? + .finish(); + Ok(()) + } +} +pub struct AvatarBaseTemplateTbArgs<'a> { + pub data: Option>>>>, +} +impl<'a> Default for AvatarBaseTemplateTbArgs<'a> { + #[inline] + fn default() -> Self { + AvatarBaseTemplateTbArgs { + data: None, + } + } +} + +pub struct AvatarBaseTemplateTbBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> AvatarBaseTemplateTbBuilder<'a, 'b, A> { + #[inline] + pub fn add_data(&mut self, data: flatbuffers::WIPOffset>>>) { + self.fbb_.push_slot_always::>(AvatarBaseTemplateTb::VT_DATA, data); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> AvatarBaseTemplateTbBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + AvatarBaseTemplateTbBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for AvatarBaseTemplateTb<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("AvatarBaseTemplateTb"); + ds.field("data", &self.data()); + ds.finish() + } +} diff --git a/lib/config/gen_flatbuffers/avatar_battle_template_generated.rs b/lib/config/gen_flatbuffers/avatar_battle_template_generated.rs new file mode 100644 index 0000000..2133f94 --- /dev/null +++ b/lib/config/gen_flatbuffers/avatar_battle_template_generated.rs @@ -0,0 +1,1497 @@ +// automatically generated by the FlatBuffers compiler, do not modify + + +// @generated + +use core::mem; +use core::cmp::Ordering; + +extern crate flatbuffers; +use self::flatbuffers::{EndianScalar, Follow}; + +pub enum AvatarBattleTemplateOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct AvatarBattleTemplate<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for AvatarBattleTemplate<'a> { + type Inner = AvatarBattleTemplate<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> AvatarBattleTemplate<'a> { + pub const VT_ID: flatbuffers::VOffsetT = 4; + pub const VT_UNK_1: flatbuffers::VOffsetT = 6; + pub const VT_UNK_2: flatbuffers::VOffsetT = 8; + pub const VT_UNK_3: flatbuffers::VOffsetT = 10; + pub const VT_UNK_4: flatbuffers::VOffsetT = 12; + pub const VT_UNK_5: flatbuffers::VOffsetT = 14; + pub const VT_UNK_6: flatbuffers::VOffsetT = 16; + pub const VT_UNK_7: flatbuffers::VOffsetT = 18; + pub const VT_UNK_8: flatbuffers::VOffsetT = 20; + pub const VT_UNK_9: flatbuffers::VOffsetT = 22; + pub const VT_UNK_10: flatbuffers::VOffsetT = 24; + pub const VT_AVATAR_PIECE_ID: flatbuffers::VOffsetT = 26; + pub const VT_UNK_12: flatbuffers::VOffsetT = 28; + pub const VT_UNK_13: flatbuffers::VOffsetT = 30; + pub const VT_HP_MAX: flatbuffers::VOffsetT = 32; + pub const VT_HEALTH_GROWTH: flatbuffers::VOffsetT = 34; + pub const VT_UNK_16: flatbuffers::VOffsetT = 36; + pub const VT_UNK_17: flatbuffers::VOffsetT = 38; + pub const VT_UNK_18: flatbuffers::VOffsetT = 40; + pub const VT_UNK_19: flatbuffers::VOffsetT = 42; + pub const VT_UNK_20: flatbuffers::VOffsetT = 44; + pub const VT_ATTACK: flatbuffers::VOffsetT = 46; + pub const VT_ATTACK_GROWTH: flatbuffers::VOffsetT = 48; + pub const VT_DEFENCE: flatbuffers::VOffsetT = 50; + pub const VT_DEFENCE_GROWTH: flatbuffers::VOffsetT = 52; + pub const VT_CRIT: flatbuffers::VOffsetT = 54; + pub const VT_CRIT_DAMAGE: flatbuffers::VOffsetT = 56; + pub const VT_CRIT_RES: flatbuffers::VOffsetT = 58; + pub const VT_CRIT_DAMAGE_RES: flatbuffers::VOffsetT = 60; + pub const VT_PEN_RATE: flatbuffers::VOffsetT = 62; + pub const VT_PEN_DELTA: flatbuffers::VOffsetT = 64; + pub const VT_LUCK: flatbuffers::VOffsetT = 66; + pub const VT_STUN: flatbuffers::VOffsetT = 68; + pub const VT_BREAK_STUN: flatbuffers::VOffsetT = 70; + pub const VT_ELEMENT_ABNORMAL_POWER: flatbuffers::VOffsetT = 72; + pub const VT_SP_BAR_POINT: flatbuffers::VOffsetT = 74; + pub const VT_SP_RECOVER: flatbuffers::VOffsetT = 76; + pub const VT_ELEMENT_MYSTERY: flatbuffers::VOffsetT = 78; + pub const VT_RBL: flatbuffers::VOffsetT = 80; + pub const VT_RBL_CORRECTION_FACTOR: flatbuffers::VOffsetT = 82; + pub const VT_RBL_PROBABILITY: flatbuffers::VOffsetT = 84; + pub const VT_UNK_41: flatbuffers::VOffsetT = 86; + pub const VT_UNK_42: flatbuffers::VOffsetT = 88; + pub const VT_UNK_43: flatbuffers::VOffsetT = 90; + pub const VT_UNK_44: flatbuffers::VOffsetT = 92; + pub const VT_UNK_45: flatbuffers::VOffsetT = 94; + pub const VT_UNK_46: flatbuffers::VOffsetT = 96; + pub const VT_UNK_47: flatbuffers::VOffsetT = 98; + pub const VT_UNK_48: flatbuffers::VOffsetT = 100; + pub const VT_UNK_49: flatbuffers::VOffsetT = 102; + pub const VT_UNK_50: flatbuffers::VOffsetT = 104; + pub const VT_UNK_51: flatbuffers::VOffsetT = 106; + pub const VT_UNK_52: flatbuffers::VOffsetT = 108; + pub const VT_UNK_53: flatbuffers::VOffsetT = 110; + pub const VT_UNK_54: flatbuffers::VOffsetT = 112; + pub const VT_UNK_55: flatbuffers::VOffsetT = 114; + pub const VT_UNK_56: flatbuffers::VOffsetT = 116; + pub const VT_UNK_57: flatbuffers::VOffsetT = 118; + pub const VT_UNK_58: flatbuffers::VOffsetT = 120; + pub const VT_UNK_59: flatbuffers::VOffsetT = 122; + pub const VT_UNK_60: flatbuffers::VOffsetT = 124; + pub const VT_UNK_61: flatbuffers::VOffsetT = 126; + pub const VT_UNK_62: flatbuffers::VOffsetT = 128; + pub const VT_UNK_63: flatbuffers::VOffsetT = 130; + pub const VT_UNK_64: flatbuffers::VOffsetT = 132; + pub const VT_UNK_65: flatbuffers::VOffsetT = 134; + pub const VT_UNK_66: flatbuffers::VOffsetT = 136; + pub const VT_TAGS: flatbuffers::VOffsetT = 138; + pub const VT_UNK_68: flatbuffers::VOffsetT = 140; + pub const VT_UNK_69: flatbuffers::VOffsetT = 142; + pub const VT_UNK_70: flatbuffers::VOffsetT = 144; + pub const VT_UNK_71: flatbuffers::VOffsetT = 146; + pub const VT_ELEMENT: flatbuffers::VOffsetT = 148; + pub const VT_HIT_TYPE: flatbuffers::VOffsetT = 150; + pub const VT_UNK_ELEMENT_CAMP: flatbuffers::VOffsetT = 152; + pub const VT_UNK_75: flatbuffers::VOffsetT = 154; + pub const VT_UNK_76: flatbuffers::VOffsetT = 156; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + AvatarBattleTemplate { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args AvatarBattleTemplateArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = AvatarBattleTemplateBuilder::new(_fbb); + builder.add_unk_75(args.unk_75); + if let Some(x) = args.unk_element_camp { builder.add_unk_element_camp(x); } + if let Some(x) = args.hit_type { builder.add_hit_type(x); } + if let Some(x) = args.element { builder.add_element(x); } + builder.add_unk_71(args.unk_71); + builder.add_unk_70(args.unk_70); + if let Some(x) = args.unk_69 { builder.add_unk_69(x); } + if let Some(x) = args.unk_68 { builder.add_unk_68(x); } + if let Some(x) = args.tags { builder.add_tags(x); } + builder.add_unk_66(args.unk_66); + builder.add_unk_65(args.unk_65); + builder.add_unk_64(args.unk_64); + builder.add_unk_63(args.unk_63); + builder.add_unk_62(args.unk_62); + builder.add_unk_61(args.unk_61); + builder.add_unk_60(args.unk_60); + builder.add_unk_59(args.unk_59); + builder.add_unk_58(args.unk_58); + builder.add_unk_57(args.unk_57); + builder.add_unk_56(args.unk_56); + builder.add_unk_55(args.unk_55); + builder.add_unk_54(args.unk_54); + builder.add_unk_53(args.unk_53); + builder.add_unk_52(args.unk_52); + builder.add_unk_51(args.unk_51); + builder.add_unk_50(args.unk_50); + builder.add_unk_49(args.unk_49); + builder.add_unk_48(args.unk_48); + builder.add_unk_47(args.unk_47); + builder.add_unk_46(args.unk_46); + builder.add_unk_45(args.unk_45); + builder.add_unk_44(args.unk_44); + builder.add_unk_43(args.unk_43); + builder.add_unk_42(args.unk_42); + builder.add_unk_41(args.unk_41); + builder.add_rbl_probability(args.rbl_probability); + builder.add_rbl_correction_factor(args.rbl_correction_factor); + builder.add_rbl(args.rbl); + builder.add_element_mystery(args.element_mystery); + builder.add_sp_recover(args.sp_recover); + builder.add_sp_bar_point(args.sp_bar_point); + builder.add_element_abnormal_power(args.element_abnormal_power); + builder.add_break_stun(args.break_stun); + builder.add_stun(args.stun); + builder.add_luck(args.luck); + builder.add_pen_delta(args.pen_delta); + builder.add_pen_rate(args.pen_rate); + builder.add_crit_damage_res(args.crit_damage_res); + builder.add_crit_res(args.crit_res); + builder.add_crit_damage(args.crit_damage); + builder.add_crit(args.crit); + builder.add_defence_growth(args.defence_growth); + builder.add_defence(args.defence); + builder.add_attack_growth(args.attack_growth); + builder.add_attack(args.attack); + builder.add_unk_20(args.unk_20); + builder.add_unk_19(args.unk_19); + builder.add_unk_18(args.unk_18); + builder.add_unk_17(args.unk_17); + builder.add_unk_16(args.unk_16); + builder.add_health_growth(args.health_growth); + builder.add_hp_max(args.hp_max); + builder.add_unk_13(args.unk_13); + builder.add_unk_12(args.unk_12); + builder.add_avatar_piece_id(args.avatar_piece_id); + builder.add_unk_10(args.unk_10); + builder.add_unk_9(args.unk_9); + builder.add_unk_8(args.unk_8); + if let Some(x) = args.unk_7 { builder.add_unk_7(x); } + if let Some(x) = args.unk_6 { builder.add_unk_6(x); } + if let Some(x) = args.unk_5 { builder.add_unk_5(x); } + if let Some(x) = args.unk_4 { builder.add_unk_4(x); } + if let Some(x) = args.unk_3 { builder.add_unk_3(x); } + if let Some(x) = args.unk_2 { builder.add_unk_2(x); } + if let Some(x) = args.unk_1 { builder.add_unk_1(x); } + builder.add_id(args.id); + builder.add_unk_76(args.unk_76); + builder.finish() + } + + + #[inline] + pub fn id(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_ID, Some(0)).unwrap()} + } + #[inline] + pub fn unk_1(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(AvatarBattleTemplate::VT_UNK_1, None)} + } + #[inline] + pub fn unk_2(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(AvatarBattleTemplate::VT_UNK_2, None)} + } + #[inline] + pub fn unk_3(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(AvatarBattleTemplate::VT_UNK_3, None)} + } + #[inline] + pub fn unk_4(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(AvatarBattleTemplate::VT_UNK_4, None)} + } + #[inline] + pub fn unk_5(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(AvatarBattleTemplate::VT_UNK_5, None)} + } + #[inline] + pub fn unk_6(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(AvatarBattleTemplate::VT_UNK_6, None)} + } + #[inline] + pub fn unk_7(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(AvatarBattleTemplate::VT_UNK_7, None)} + } + #[inline] + pub fn unk_8(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_UNK_8, Some(0)).unwrap()} + } + #[inline] + pub fn unk_9(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_UNK_9, Some(0)).unwrap()} + } + #[inline] + pub fn unk_10(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_UNK_10, Some(0)).unwrap()} + } + #[inline] + pub fn avatar_piece_id(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_AVATAR_PIECE_ID, Some(0)).unwrap()} + } + #[inline] + pub fn unk_12(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_UNK_12, Some(0)).unwrap()} + } + #[inline] + pub fn unk_13(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_UNK_13, Some(0)).unwrap()} + } + #[inline] + pub fn hp_max(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_HP_MAX, Some(0)).unwrap()} + } + #[inline] + pub fn health_growth(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_HEALTH_GROWTH, Some(0)).unwrap()} + } + #[inline] + pub fn unk_16(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_UNK_16, Some(0)).unwrap()} + } + #[inline] + pub fn unk_17(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_UNK_17, Some(0)).unwrap()} + } + #[inline] + pub fn unk_18(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_UNK_18, Some(0)).unwrap()} + } + #[inline] + pub fn unk_19(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_UNK_19, Some(0)).unwrap()} + } + #[inline] + pub fn unk_20(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_UNK_20, Some(0)).unwrap()} + } + #[inline] + pub fn attack(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_ATTACK, Some(0)).unwrap()} + } + #[inline] + pub fn attack_growth(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_ATTACK_GROWTH, Some(0)).unwrap()} + } + #[inline] + pub fn defence(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_DEFENCE, Some(0)).unwrap()} + } + #[inline] + pub fn defence_growth(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_DEFENCE_GROWTH, Some(0)).unwrap()} + } + #[inline] + pub fn crit(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_CRIT, Some(0)).unwrap()} + } + #[inline] + pub fn crit_damage(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_CRIT_DAMAGE, Some(0)).unwrap()} + } + #[inline] + pub fn crit_res(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_CRIT_RES, Some(0)).unwrap()} + } + #[inline] + pub fn crit_damage_res(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_CRIT_DAMAGE_RES, Some(0)).unwrap()} + } + #[inline] + pub fn pen_rate(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_PEN_RATE, Some(0)).unwrap()} + } + #[inline] + pub fn pen_delta(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_PEN_DELTA, Some(0)).unwrap()} + } + #[inline] + pub fn luck(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_LUCK, Some(0)).unwrap()} + } + #[inline] + pub fn stun(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_STUN, Some(0)).unwrap()} + } + #[inline] + pub fn break_stun(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_BREAK_STUN, Some(0)).unwrap()} + } + #[inline] + pub fn element_abnormal_power(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_ELEMENT_ABNORMAL_POWER, Some(0)).unwrap()} + } + #[inline] + pub fn sp_bar_point(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_SP_BAR_POINT, Some(0)).unwrap()} + } + #[inline] + pub fn sp_recover(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_SP_RECOVER, Some(0)).unwrap()} + } + #[inline] + pub fn element_mystery(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_ELEMENT_MYSTERY, Some(0)).unwrap()} + } + #[inline] + pub fn rbl(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_RBL, Some(0)).unwrap()} + } + #[inline] + pub fn rbl_correction_factor(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_RBL_CORRECTION_FACTOR, Some(0)).unwrap()} + } + #[inline] + pub fn rbl_probability(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_RBL_PROBABILITY, Some(0)).unwrap()} + } + #[inline] + pub fn unk_41(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_UNK_41, Some(0)).unwrap()} + } + #[inline] + pub fn unk_42(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_UNK_42, Some(0)).unwrap()} + } + #[inline] + pub fn unk_43(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_UNK_43, Some(0)).unwrap()} + } + #[inline] + pub fn unk_44(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_UNK_44, Some(0)).unwrap()} + } + #[inline] + pub fn unk_45(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_UNK_45, Some(0)).unwrap()} + } + #[inline] + pub fn unk_46(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_UNK_46, Some(0)).unwrap()} + } + #[inline] + pub fn unk_47(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_UNK_47, Some(0)).unwrap()} + } + #[inline] + pub fn unk_48(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_UNK_48, Some(0)).unwrap()} + } + #[inline] + pub fn unk_49(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_UNK_49, Some(0)).unwrap()} + } + #[inline] + pub fn unk_50(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_UNK_50, Some(0)).unwrap()} + } + #[inline] + pub fn unk_51(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_UNK_51, Some(0)).unwrap()} + } + #[inline] + pub fn unk_52(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_UNK_52, Some(0)).unwrap()} + } + #[inline] + pub fn unk_53(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_UNK_53, Some(0)).unwrap()} + } + #[inline] + pub fn unk_54(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_UNK_54, Some(0)).unwrap()} + } + #[inline] + pub fn unk_55(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_UNK_55, Some(0)).unwrap()} + } + #[inline] + pub fn unk_56(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_UNK_56, Some(0)).unwrap()} + } + #[inline] + pub fn unk_57(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_UNK_57, Some(0)).unwrap()} + } + #[inline] + pub fn unk_58(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_UNK_58, Some(0)).unwrap()} + } + #[inline] + pub fn unk_59(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_UNK_59, Some(0)).unwrap()} + } + #[inline] + pub fn unk_60(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_UNK_60, Some(0)).unwrap()} + } + #[inline] + pub fn unk_61(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_UNK_61, Some(0)).unwrap()} + } + #[inline] + pub fn unk_62(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_UNK_62, Some(0)).unwrap()} + } + #[inline] + pub fn unk_63(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_UNK_63, Some(0)).unwrap()} + } + #[inline] + pub fn unk_64(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_UNK_64, Some(0)).unwrap()} + } + #[inline] + pub fn unk_65(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_UNK_65, Some(0)).unwrap()} + } + #[inline] + pub fn unk_66(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_UNK_66, Some(0)).unwrap()} + } + #[inline] + pub fn tags(&self) -> Option>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(AvatarBattleTemplate::VT_TAGS, None)} + } + #[inline] + pub fn unk_68(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(AvatarBattleTemplate::VT_UNK_68, None)} + } + #[inline] + pub fn unk_69(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(AvatarBattleTemplate::VT_UNK_69, None)} + } + #[inline] + pub fn unk_70(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_UNK_70, Some(0)).unwrap()} + } + #[inline] + pub fn unk_71(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_UNK_71, Some(0)).unwrap()} + } + #[inline] + pub fn element(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(AvatarBattleTemplate::VT_ELEMENT, None)} + } + #[inline] + pub fn hit_type(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(AvatarBattleTemplate::VT_HIT_TYPE, None)} + } + #[inline] + pub fn unk_element_camp(&self) -> Option>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(AvatarBattleTemplate::VT_UNK_ELEMENT_CAMP, None)} + } + #[inline] + pub fn unk_75(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_UNK_75, Some(0)).unwrap()} + } + #[inline] + pub fn unk_76(&self) -> i16 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarBattleTemplate::VT_UNK_76, Some(0)).unwrap()} + } +} + +impl flatbuffers::Verifiable for AvatarBattleTemplate<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::("id", Self::VT_ID, false)? + .visit_field::>>("unk_1", Self::VT_UNK_1, false)? + .visit_field::>>("unk_2", Self::VT_UNK_2, false)? + .visit_field::>>("unk_3", Self::VT_UNK_3, false)? + .visit_field::>>("unk_4", Self::VT_UNK_4, false)? + .visit_field::>>("unk_5", Self::VT_UNK_5, false)? + .visit_field::>>("unk_6", Self::VT_UNK_6, false)? + .visit_field::>>("unk_7", Self::VT_UNK_7, false)? + .visit_field::("unk_8", Self::VT_UNK_8, false)? + .visit_field::("unk_9", Self::VT_UNK_9, false)? + .visit_field::("unk_10", Self::VT_UNK_10, false)? + .visit_field::("avatar_piece_id", Self::VT_AVATAR_PIECE_ID, false)? + .visit_field::("unk_12", Self::VT_UNK_12, false)? + .visit_field::("unk_13", Self::VT_UNK_13, false)? + .visit_field::("hp_max", Self::VT_HP_MAX, false)? + .visit_field::("health_growth", Self::VT_HEALTH_GROWTH, false)? + .visit_field::("unk_16", Self::VT_UNK_16, false)? + .visit_field::("unk_17", Self::VT_UNK_17, false)? + .visit_field::("unk_18", Self::VT_UNK_18, false)? + .visit_field::("unk_19", Self::VT_UNK_19, false)? + .visit_field::("unk_20", Self::VT_UNK_20, false)? + .visit_field::("attack", Self::VT_ATTACK, false)? + .visit_field::("attack_growth", Self::VT_ATTACK_GROWTH, false)? + .visit_field::("defence", Self::VT_DEFENCE, false)? + .visit_field::("defence_growth", Self::VT_DEFENCE_GROWTH, false)? + .visit_field::("crit", Self::VT_CRIT, false)? + .visit_field::("crit_damage", Self::VT_CRIT_DAMAGE, false)? + .visit_field::("crit_res", Self::VT_CRIT_RES, false)? + .visit_field::("crit_damage_res", Self::VT_CRIT_DAMAGE_RES, false)? + .visit_field::("pen_rate", Self::VT_PEN_RATE, false)? + .visit_field::("pen_delta", Self::VT_PEN_DELTA, false)? + .visit_field::("luck", Self::VT_LUCK, false)? + .visit_field::("stun", Self::VT_STUN, false)? + .visit_field::("break_stun", Self::VT_BREAK_STUN, false)? + .visit_field::("element_abnormal_power", Self::VT_ELEMENT_ABNORMAL_POWER, false)? + .visit_field::("sp_bar_point", Self::VT_SP_BAR_POINT, false)? + .visit_field::("sp_recover", Self::VT_SP_RECOVER, false)? + .visit_field::("element_mystery", Self::VT_ELEMENT_MYSTERY, false)? + .visit_field::("rbl", Self::VT_RBL, false)? + .visit_field::("rbl_correction_factor", Self::VT_RBL_CORRECTION_FACTOR, false)? + .visit_field::("rbl_probability", Self::VT_RBL_PROBABILITY, false)? + .visit_field::("unk_41", Self::VT_UNK_41, false)? + .visit_field::("unk_42", Self::VT_UNK_42, false)? + .visit_field::("unk_43", Self::VT_UNK_43, false)? + .visit_field::("unk_44", Self::VT_UNK_44, false)? + .visit_field::("unk_45", Self::VT_UNK_45, false)? + .visit_field::("unk_46", Self::VT_UNK_46, false)? + .visit_field::("unk_47", Self::VT_UNK_47, false)? + .visit_field::("unk_48", Self::VT_UNK_48, false)? + .visit_field::("unk_49", Self::VT_UNK_49, false)? + .visit_field::("unk_50", Self::VT_UNK_50, false)? + .visit_field::("unk_51", Self::VT_UNK_51, false)? + .visit_field::("unk_52", Self::VT_UNK_52, false)? + .visit_field::("unk_53", Self::VT_UNK_53, false)? + .visit_field::("unk_54", Self::VT_UNK_54, false)? + .visit_field::("unk_55", Self::VT_UNK_55, false)? + .visit_field::("unk_56", Self::VT_UNK_56, false)? + .visit_field::("unk_57", Self::VT_UNK_57, false)? + .visit_field::("unk_58", Self::VT_UNK_58, false)? + .visit_field::("unk_59", Self::VT_UNK_59, false)? + .visit_field::("unk_60", Self::VT_UNK_60, false)? + .visit_field::("unk_61", Self::VT_UNK_61, false)? + .visit_field::("unk_62", Self::VT_UNK_62, false)? + .visit_field::("unk_63", Self::VT_UNK_63, false)? + .visit_field::("unk_64", Self::VT_UNK_64, false)? + .visit_field::("unk_65", Self::VT_UNK_65, false)? + .visit_field::("unk_66", Self::VT_UNK_66, false)? + .visit_field::>>>("tags", Self::VT_TAGS, false)? + .visit_field::>>("unk_68", Self::VT_UNK_68, false)? + .visit_field::>>("unk_69", Self::VT_UNK_69, false)? + .visit_field::("unk_70", Self::VT_UNK_70, false)? + .visit_field::("unk_71", Self::VT_UNK_71, false)? + .visit_field::>>("element", Self::VT_ELEMENT, false)? + .visit_field::>>("hit_type", Self::VT_HIT_TYPE, false)? + .visit_field::>>>("unk_element_camp", Self::VT_UNK_ELEMENT_CAMP, false)? + .visit_field::("unk_75", Self::VT_UNK_75, false)? + .visit_field::("unk_76", Self::VT_UNK_76, false)? + .finish(); + Ok(()) + } +} +pub struct AvatarBattleTemplateArgs<'a> { + pub id: u32, + pub unk_1: Option>>, + pub unk_2: Option>>, + pub unk_3: Option>>, + pub unk_4: Option>>, + pub unk_5: Option>>, + pub unk_6: Option>>, + pub unk_7: Option>>, + pub unk_8: i32, + pub unk_9: i32, + pub unk_10: i32, + pub avatar_piece_id: i32, + pub unk_12: i32, + pub unk_13: i32, + pub hp_max: i32, + pub health_growth: i32, + pub unk_16: i32, + pub unk_17: i32, + pub unk_18: i32, + pub unk_19: i32, + pub unk_20: i32, + pub attack: i32, + pub attack_growth: i32, + pub defence: i32, + pub defence_growth: i32, + pub crit: i32, + pub crit_damage: i32, + pub crit_res: i32, + pub crit_damage_res: i32, + pub pen_rate: i32, + pub pen_delta: i32, + pub luck: i32, + pub stun: i32, + pub break_stun: i32, + pub element_abnormal_power: i32, + pub sp_bar_point: i32, + pub sp_recover: i32, + pub element_mystery: i32, + pub rbl: i32, + pub rbl_correction_factor: i32, + pub rbl_probability: i32, + pub unk_41: i32, + pub unk_42: i32, + pub unk_43: i32, + pub unk_44: i32, + pub unk_45: i32, + pub unk_46: i32, + pub unk_47: i32, + pub unk_48: i32, + pub unk_49: i32, + pub unk_50: i32, + pub unk_51: i32, + pub unk_52: i32, + pub unk_53: i32, + pub unk_54: i32, + pub unk_55: i32, + pub unk_56: i32, + pub unk_57: i32, + pub unk_58: i32, + pub unk_59: i32, + pub unk_60: i32, + pub unk_61: i32, + pub unk_62: i32, + pub unk_63: i32, + pub unk_64: i32, + pub unk_65: i32, + pub unk_66: i32, + pub tags: Option>>>, + pub unk_68: Option>>, + pub unk_69: Option>>, + pub unk_70: i32, + pub unk_71: i32, + pub element: Option>>, + pub hit_type: Option>>, + pub unk_element_camp: Option>>>, + pub unk_75: i32, + pub unk_76: i16, +} +impl<'a> Default for AvatarBattleTemplateArgs<'a> { + #[inline] + fn default() -> Self { + AvatarBattleTemplateArgs { + id: 0, + unk_1: None, + unk_2: None, + unk_3: None, + unk_4: None, + unk_5: None, + unk_6: None, + unk_7: None, + unk_8: 0, + unk_9: 0, + unk_10: 0, + avatar_piece_id: 0, + unk_12: 0, + unk_13: 0, + hp_max: 0, + health_growth: 0, + unk_16: 0, + unk_17: 0, + unk_18: 0, + unk_19: 0, + unk_20: 0, + attack: 0, + attack_growth: 0, + defence: 0, + defence_growth: 0, + crit: 0, + crit_damage: 0, + crit_res: 0, + crit_damage_res: 0, + pen_rate: 0, + pen_delta: 0, + luck: 0, + stun: 0, + break_stun: 0, + element_abnormal_power: 0, + sp_bar_point: 0, + sp_recover: 0, + element_mystery: 0, + rbl: 0, + rbl_correction_factor: 0, + rbl_probability: 0, + unk_41: 0, + unk_42: 0, + unk_43: 0, + unk_44: 0, + unk_45: 0, + unk_46: 0, + unk_47: 0, + unk_48: 0, + unk_49: 0, + unk_50: 0, + unk_51: 0, + unk_52: 0, + unk_53: 0, + unk_54: 0, + unk_55: 0, + unk_56: 0, + unk_57: 0, + unk_58: 0, + unk_59: 0, + unk_60: 0, + unk_61: 0, + unk_62: 0, + unk_63: 0, + unk_64: 0, + unk_65: 0, + unk_66: 0, + tags: None, + unk_68: None, + unk_69: None, + unk_70: 0, + unk_71: 0, + element: None, + hit_type: None, + unk_element_camp: None, + unk_75: 0, + unk_76: 0, + } + } +} + +pub struct AvatarBattleTemplateBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> AvatarBattleTemplateBuilder<'a, 'b, A> { + #[inline] + pub fn add_id(&mut self, id: u32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_ID, id, 0); + } + #[inline] + pub fn add_unk_1(&mut self, unk_1: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(AvatarBattleTemplate::VT_UNK_1, unk_1); + } + #[inline] + pub fn add_unk_2(&mut self, unk_2: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(AvatarBattleTemplate::VT_UNK_2, unk_2); + } + #[inline] + pub fn add_unk_3(&mut self, unk_3: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(AvatarBattleTemplate::VT_UNK_3, unk_3); + } + #[inline] + pub fn add_unk_4(&mut self, unk_4: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(AvatarBattleTemplate::VT_UNK_4, unk_4); + } + #[inline] + pub fn add_unk_5(&mut self, unk_5: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(AvatarBattleTemplate::VT_UNK_5, unk_5); + } + #[inline] + pub fn add_unk_6(&mut self, unk_6: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(AvatarBattleTemplate::VT_UNK_6, unk_6); + } + #[inline] + pub fn add_unk_7(&mut self, unk_7: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(AvatarBattleTemplate::VT_UNK_7, unk_7); + } + #[inline] + pub fn add_unk_8(&mut self, unk_8: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_UNK_8, unk_8, 0); + } + #[inline] + pub fn add_unk_9(&mut self, unk_9: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_UNK_9, unk_9, 0); + } + #[inline] + pub fn add_unk_10(&mut self, unk_10: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_UNK_10, unk_10, 0); + } + #[inline] + pub fn add_avatar_piece_id(&mut self, avatar_piece_id: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_AVATAR_PIECE_ID, avatar_piece_id, 0); + } + #[inline] + pub fn add_unk_12(&mut self, unk_12: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_UNK_12, unk_12, 0); + } + #[inline] + pub fn add_unk_13(&mut self, unk_13: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_UNK_13, unk_13, 0); + } + #[inline] + pub fn add_hp_max(&mut self, hp_max: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_HP_MAX, hp_max, 0); + } + #[inline] + pub fn add_health_growth(&mut self, health_growth: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_HEALTH_GROWTH, health_growth, 0); + } + #[inline] + pub fn add_unk_16(&mut self, unk_16: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_UNK_16, unk_16, 0); + } + #[inline] + pub fn add_unk_17(&mut self, unk_17: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_UNK_17, unk_17, 0); + } + #[inline] + pub fn add_unk_18(&mut self, unk_18: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_UNK_18, unk_18, 0); + } + #[inline] + pub fn add_unk_19(&mut self, unk_19: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_UNK_19, unk_19, 0); + } + #[inline] + pub fn add_unk_20(&mut self, unk_20: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_UNK_20, unk_20, 0); + } + #[inline] + pub fn add_attack(&mut self, attack: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_ATTACK, attack, 0); + } + #[inline] + pub fn add_attack_growth(&mut self, attack_growth: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_ATTACK_GROWTH, attack_growth, 0); + } + #[inline] + pub fn add_defence(&mut self, defence: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_DEFENCE, defence, 0); + } + #[inline] + pub fn add_defence_growth(&mut self, defence_growth: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_DEFENCE_GROWTH, defence_growth, 0); + } + #[inline] + pub fn add_crit(&mut self, crit: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_CRIT, crit, 0); + } + #[inline] + pub fn add_crit_damage(&mut self, crit_damage: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_CRIT_DAMAGE, crit_damage, 0); + } + #[inline] + pub fn add_crit_res(&mut self, crit_res: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_CRIT_RES, crit_res, 0); + } + #[inline] + pub fn add_crit_damage_res(&mut self, crit_damage_res: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_CRIT_DAMAGE_RES, crit_damage_res, 0); + } + #[inline] + pub fn add_pen_rate(&mut self, pen_rate: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_PEN_RATE, pen_rate, 0); + } + #[inline] + pub fn add_pen_delta(&mut self, pen_delta: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_PEN_DELTA, pen_delta, 0); + } + #[inline] + pub fn add_luck(&mut self, luck: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_LUCK, luck, 0); + } + #[inline] + pub fn add_stun(&mut self, stun: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_STUN, stun, 0); + } + #[inline] + pub fn add_break_stun(&mut self, break_stun: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_BREAK_STUN, break_stun, 0); + } + #[inline] + pub fn add_element_abnormal_power(&mut self, element_abnormal_power: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_ELEMENT_ABNORMAL_POWER, element_abnormal_power, 0); + } + #[inline] + pub fn add_sp_bar_point(&mut self, sp_bar_point: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_SP_BAR_POINT, sp_bar_point, 0); + } + #[inline] + pub fn add_sp_recover(&mut self, sp_recover: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_SP_RECOVER, sp_recover, 0); + } + #[inline] + pub fn add_element_mystery(&mut self, element_mystery: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_ELEMENT_MYSTERY, element_mystery, 0); + } + #[inline] + pub fn add_rbl(&mut self, rbl: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_RBL, rbl, 0); + } + #[inline] + pub fn add_rbl_correction_factor(&mut self, rbl_correction_factor: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_RBL_CORRECTION_FACTOR, rbl_correction_factor, 0); + } + #[inline] + pub fn add_rbl_probability(&mut self, rbl_probability: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_RBL_PROBABILITY, rbl_probability, 0); + } + #[inline] + pub fn add_unk_41(&mut self, unk_41: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_UNK_41, unk_41, 0); + } + #[inline] + pub fn add_unk_42(&mut self, unk_42: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_UNK_42, unk_42, 0); + } + #[inline] + pub fn add_unk_43(&mut self, unk_43: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_UNK_43, unk_43, 0); + } + #[inline] + pub fn add_unk_44(&mut self, unk_44: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_UNK_44, unk_44, 0); + } + #[inline] + pub fn add_unk_45(&mut self, unk_45: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_UNK_45, unk_45, 0); + } + #[inline] + pub fn add_unk_46(&mut self, unk_46: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_UNK_46, unk_46, 0); + } + #[inline] + pub fn add_unk_47(&mut self, unk_47: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_UNK_47, unk_47, 0); + } + #[inline] + pub fn add_unk_48(&mut self, unk_48: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_UNK_48, unk_48, 0); + } + #[inline] + pub fn add_unk_49(&mut self, unk_49: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_UNK_49, unk_49, 0); + } + #[inline] + pub fn add_unk_50(&mut self, unk_50: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_UNK_50, unk_50, 0); + } + #[inline] + pub fn add_unk_51(&mut self, unk_51: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_UNK_51, unk_51, 0); + } + #[inline] + pub fn add_unk_52(&mut self, unk_52: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_UNK_52, unk_52, 0); + } + #[inline] + pub fn add_unk_53(&mut self, unk_53: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_UNK_53, unk_53, 0); + } + #[inline] + pub fn add_unk_54(&mut self, unk_54: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_UNK_54, unk_54, 0); + } + #[inline] + pub fn add_unk_55(&mut self, unk_55: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_UNK_55, unk_55, 0); + } + #[inline] + pub fn add_unk_56(&mut self, unk_56: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_UNK_56, unk_56, 0); + } + #[inline] + pub fn add_unk_57(&mut self, unk_57: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_UNK_57, unk_57, 0); + } + #[inline] + pub fn add_unk_58(&mut self, unk_58: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_UNK_58, unk_58, 0); + } + #[inline] + pub fn add_unk_59(&mut self, unk_59: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_UNK_59, unk_59, 0); + } + #[inline] + pub fn add_unk_60(&mut self, unk_60: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_UNK_60, unk_60, 0); + } + #[inline] + pub fn add_unk_61(&mut self, unk_61: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_UNK_61, unk_61, 0); + } + #[inline] + pub fn add_unk_62(&mut self, unk_62: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_UNK_62, unk_62, 0); + } + #[inline] + pub fn add_unk_63(&mut self, unk_63: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_UNK_63, unk_63, 0); + } + #[inline] + pub fn add_unk_64(&mut self, unk_64: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_UNK_64, unk_64, 0); + } + #[inline] + pub fn add_unk_65(&mut self, unk_65: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_UNK_65, unk_65, 0); + } + #[inline] + pub fn add_unk_66(&mut self, unk_66: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_UNK_66, unk_66, 0); + } + #[inline] + pub fn add_tags(&mut self, tags: flatbuffers::WIPOffset>>) { + self.fbb_.push_slot_always::>(AvatarBattleTemplate::VT_TAGS, tags); + } + #[inline] + pub fn add_unk_68(&mut self, unk_68: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(AvatarBattleTemplate::VT_UNK_68, unk_68); + } + #[inline] + pub fn add_unk_69(&mut self, unk_69: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(AvatarBattleTemplate::VT_UNK_69, unk_69); + } + #[inline] + pub fn add_unk_70(&mut self, unk_70: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_UNK_70, unk_70, 0); + } + #[inline] + pub fn add_unk_71(&mut self, unk_71: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_UNK_71, unk_71, 0); + } + #[inline] + pub fn add_element(&mut self, element: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(AvatarBattleTemplate::VT_ELEMENT, element); + } + #[inline] + pub fn add_hit_type(&mut self, hit_type: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(AvatarBattleTemplate::VT_HIT_TYPE, hit_type); + } + #[inline] + pub fn add_unk_element_camp(&mut self, unk_element_camp: flatbuffers::WIPOffset>>) { + self.fbb_.push_slot_always::>(AvatarBattleTemplate::VT_UNK_ELEMENT_CAMP, unk_element_camp); + } + #[inline] + pub fn add_unk_75(&mut self, unk_75: i32) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_UNK_75, unk_75, 0); + } + #[inline] + pub fn add_unk_76(&mut self, unk_76: i16) { + self.fbb_.push_slot::(AvatarBattleTemplate::VT_UNK_76, unk_76, 0); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> AvatarBattleTemplateBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + AvatarBattleTemplateBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for AvatarBattleTemplate<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("AvatarBattleTemplate"); + ds.field("id", &self.id()); + ds.field("unk_1", &self.unk_1()); + ds.field("unk_2", &self.unk_2()); + ds.field("unk_3", &self.unk_3()); + ds.field("unk_4", &self.unk_4()); + ds.field("unk_5", &self.unk_5()); + ds.field("unk_6", &self.unk_6()); + ds.field("unk_7", &self.unk_7()); + ds.field("unk_8", &self.unk_8()); + ds.field("unk_9", &self.unk_9()); + ds.field("unk_10", &self.unk_10()); + ds.field("avatar_piece_id", &self.avatar_piece_id()); + ds.field("unk_12", &self.unk_12()); + ds.field("unk_13", &self.unk_13()); + ds.field("hp_max", &self.hp_max()); + ds.field("health_growth", &self.health_growth()); + ds.field("unk_16", &self.unk_16()); + ds.field("unk_17", &self.unk_17()); + ds.field("unk_18", &self.unk_18()); + ds.field("unk_19", &self.unk_19()); + ds.field("unk_20", &self.unk_20()); + ds.field("attack", &self.attack()); + ds.field("attack_growth", &self.attack_growth()); + ds.field("defence", &self.defence()); + ds.field("defence_growth", &self.defence_growth()); + ds.field("crit", &self.crit()); + ds.field("crit_damage", &self.crit_damage()); + ds.field("crit_res", &self.crit_res()); + ds.field("crit_damage_res", &self.crit_damage_res()); + ds.field("pen_rate", &self.pen_rate()); + ds.field("pen_delta", &self.pen_delta()); + ds.field("luck", &self.luck()); + ds.field("stun", &self.stun()); + ds.field("break_stun", &self.break_stun()); + ds.field("element_abnormal_power", &self.element_abnormal_power()); + ds.field("sp_bar_point", &self.sp_bar_point()); + ds.field("sp_recover", &self.sp_recover()); + ds.field("element_mystery", &self.element_mystery()); + ds.field("rbl", &self.rbl()); + ds.field("rbl_correction_factor", &self.rbl_correction_factor()); + ds.field("rbl_probability", &self.rbl_probability()); + ds.field("unk_41", &self.unk_41()); + ds.field("unk_42", &self.unk_42()); + ds.field("unk_43", &self.unk_43()); + ds.field("unk_44", &self.unk_44()); + ds.field("unk_45", &self.unk_45()); + ds.field("unk_46", &self.unk_46()); + ds.field("unk_47", &self.unk_47()); + ds.field("unk_48", &self.unk_48()); + ds.field("unk_49", &self.unk_49()); + ds.field("unk_50", &self.unk_50()); + ds.field("unk_51", &self.unk_51()); + ds.field("unk_52", &self.unk_52()); + ds.field("unk_53", &self.unk_53()); + ds.field("unk_54", &self.unk_54()); + ds.field("unk_55", &self.unk_55()); + ds.field("unk_56", &self.unk_56()); + ds.field("unk_57", &self.unk_57()); + ds.field("unk_58", &self.unk_58()); + ds.field("unk_59", &self.unk_59()); + ds.field("unk_60", &self.unk_60()); + ds.field("unk_61", &self.unk_61()); + ds.field("unk_62", &self.unk_62()); + ds.field("unk_63", &self.unk_63()); + ds.field("unk_64", &self.unk_64()); + ds.field("unk_65", &self.unk_65()); + ds.field("unk_66", &self.unk_66()); + ds.field("tags", &self.tags()); + ds.field("unk_68", &self.unk_68()); + ds.field("unk_69", &self.unk_69()); + ds.field("unk_70", &self.unk_70()); + ds.field("unk_71", &self.unk_71()); + ds.field("element", &self.element()); + ds.field("hit_type", &self.hit_type()); + ds.field("unk_element_camp", &self.unk_element_camp()); + ds.field("unk_75", &self.unk_75()); + ds.field("unk_76", &self.unk_76()); + ds.finish() + } +} +pub enum AvatarBattleTemplateTbOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct AvatarBattleTemplateTb<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for AvatarBattleTemplateTb<'a> { + type Inner = AvatarBattleTemplateTb<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> AvatarBattleTemplateTb<'a> { + pub const VT_DATA: flatbuffers::VOffsetT = 4; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + AvatarBattleTemplateTb { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args AvatarBattleTemplateTbArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = AvatarBattleTemplateTbBuilder::new(_fbb); + if let Some(x) = args.data { builder.add_data(x); } + builder.finish() + } + + + #[inline] + pub fn data(&self) -> Option>>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(AvatarBattleTemplateTb::VT_DATA, None)} + } +} + +impl flatbuffers::Verifiable for AvatarBattleTemplateTb<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::>>>("data", Self::VT_DATA, false)? + .finish(); + Ok(()) + } +} +pub struct AvatarBattleTemplateTbArgs<'a> { + pub data: Option>>>>, +} +impl<'a> Default for AvatarBattleTemplateTbArgs<'a> { + #[inline] + fn default() -> Self { + AvatarBattleTemplateTbArgs { + data: None, + } + } +} + +pub struct AvatarBattleTemplateTbBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> AvatarBattleTemplateTbBuilder<'a, 'b, A> { + #[inline] + pub fn add_data(&mut self, data: flatbuffers::WIPOffset>>>) { + self.fbb_.push_slot_always::>(AvatarBattleTemplateTb::VT_DATA, data); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> AvatarBattleTemplateTbBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + AvatarBattleTemplateTbBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for AvatarBattleTemplateTb<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("AvatarBattleTemplateTb"); + ds.field("data", &self.data()); + ds.finish() + } +} diff --git a/lib/config/gen_flatbuffers/avatar_level_advance_template_generated.rs b/lib/config/gen_flatbuffers/avatar_level_advance_template_generated.rs new file mode 100644 index 0000000..53dd19f --- /dev/null +++ b/lib/config/gen_flatbuffers/avatar_level_advance_template_generated.rs @@ -0,0 +1,656 @@ +// automatically generated by the FlatBuffers compiler, do not modify + + +// @generated + +use core::mem; +use core::cmp::Ordering; + +extern crate flatbuffers; +use self::flatbuffers::{EndianScalar, Follow}; + +// struct RefineCost, aligned to 4 +#[repr(transparent)] +#[derive(Clone, Copy, PartialEq)] +pub struct RefineCost(pub [u8; 8]); +impl Default for RefineCost { + fn default() -> Self { + Self([0; 8]) + } +} +impl core::fmt::Debug for RefineCost { + fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { + f.debug_struct("RefineCost") + .field("item_id", &self.item_id()) + .field("number", &self.number()) + .finish() + } +} + +impl flatbuffers::SimpleToVerifyInSlice for RefineCost {} +impl<'a> flatbuffers::Follow<'a> for RefineCost { + type Inner = &'a RefineCost; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + <&'a RefineCost>::follow(buf, loc) + } +} +impl<'a> flatbuffers::Follow<'a> for &'a RefineCost { + type Inner = &'a RefineCost; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + flatbuffers::follow_cast_ref::(buf, loc) + } +} +impl<'b> flatbuffers::Push for RefineCost { + type Output = RefineCost; + #[inline] + unsafe fn push(&self, dst: &mut [u8], _written_len: usize) { + let src = ::core::slice::from_raw_parts(self as *const RefineCost as *const u8, ::size()); + dst.copy_from_slice(src); + } + #[inline] + fn alignment() -> flatbuffers::PushAlignment { + flatbuffers::PushAlignment::new(4) + } +} + +impl<'a> flatbuffers::Verifiable for RefineCost { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.in_buffer::(pos) + } +} + +impl<'a> RefineCost { + #[allow(clippy::too_many_arguments)] + pub fn new( + item_id: u32, + number: i32, + ) -> Self { + let mut s = Self([0; 8]); + s.set_item_id(item_id); + s.set_number(number); + s + } + + pub fn item_id(&self) -> u32 { + let mut mem = core::mem::MaybeUninit::<::Scalar>::uninit(); + // Safety: + // Created from a valid Table for this object + // Which contains a valid value in this slot + EndianScalar::from_little_endian(unsafe { + core::ptr::copy_nonoverlapping( + self.0[0..].as_ptr(), + mem.as_mut_ptr() as *mut u8, + core::mem::size_of::<::Scalar>(), + ); + mem.assume_init() + }) + } + + pub fn set_item_id(&mut self, x: u32) { + let x_le = x.to_little_endian(); + // Safety: + // Created from a valid Table for this object + // Which contains a valid value in this slot + unsafe { + core::ptr::copy_nonoverlapping( + &x_le as *const _ as *const u8, + self.0[0..].as_mut_ptr(), + core::mem::size_of::<::Scalar>(), + ); + } + } + + pub fn number(&self) -> i32 { + let mut mem = core::mem::MaybeUninit::<::Scalar>::uninit(); + // Safety: + // Created from a valid Table for this object + // Which contains a valid value in this slot + EndianScalar::from_little_endian(unsafe { + core::ptr::copy_nonoverlapping( + self.0[4..].as_ptr(), + mem.as_mut_ptr() as *mut u8, + core::mem::size_of::<::Scalar>(), + ); + mem.assume_init() + }) + } + + pub fn set_number(&mut self, x: i32) { + let x_le = x.to_little_endian(); + // Safety: + // Created from a valid Table for this object + // Which contains a valid value in this slot + unsafe { + core::ptr::copy_nonoverlapping( + &x_le as *const _ as *const u8, + self.0[4..].as_mut_ptr(), + core::mem::size_of::<::Scalar>(), + ); + } + } + +} + +pub enum AvatarLevelAdvanceTemplateOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct AvatarLevelAdvanceTemplate<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for AvatarLevelAdvanceTemplate<'a> { + type Inner = AvatarLevelAdvanceTemplate<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> AvatarLevelAdvanceTemplate<'a> { + pub const VT_AVATAR_ID: flatbuffers::VOffsetT = 4; + pub const VT_ID: flatbuffers::VOffsetT = 6; + pub const VT_MIN_LEVEL: flatbuffers::VOffsetT = 8; + pub const VT_MAX_LEVEL: flatbuffers::VOffsetT = 10; + pub const VT_HP_MAX: flatbuffers::VOffsetT = 12; + pub const VT_UNK_5: flatbuffers::VOffsetT = 14; + pub const VT_UNK_6: flatbuffers::VOffsetT = 16; + pub const VT_ATTACK: flatbuffers::VOffsetT = 18; + pub const VT_DEFENCE: flatbuffers::VOffsetT = 20; + pub const VT_UNK_9: flatbuffers::VOffsetT = 22; + pub const VT_UNK_10: flatbuffers::VOffsetT = 24; + pub const VT_UNK_11: flatbuffers::VOffsetT = 26; + pub const VT_UNK_12: flatbuffers::VOffsetT = 28; + pub const VT_UNK_13: flatbuffers::VOffsetT = 30; + pub const VT_UNK_14: flatbuffers::VOffsetT = 32; + pub const VT_UNK_15: flatbuffers::VOffsetT = 34; + pub const VT_UNK_16: flatbuffers::VOffsetT = 36; + pub const VT_UNK_17: flatbuffers::VOffsetT = 38; + pub const VT_UNK_18: flatbuffers::VOffsetT = 40; + pub const VT_PROMOTION_COSTS: flatbuffers::VOffsetT = 42; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + AvatarLevelAdvanceTemplate { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args AvatarLevelAdvanceTemplateArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = AvatarLevelAdvanceTemplateBuilder::new(_fbb); + if let Some(x) = args.promotion_costs { builder.add_promotion_costs(x); } + if let Some(x) = args.unk_18 { builder.add_unk_18(x); } + builder.add_unk_17(args.unk_17); + builder.add_unk_16(args.unk_16); + builder.add_unk_15(args.unk_15); + builder.add_unk_14(args.unk_14); + builder.add_unk_13(args.unk_13); + builder.add_unk_12(args.unk_12); + builder.add_unk_11(args.unk_11); + builder.add_unk_10(args.unk_10); + builder.add_unk_9(args.unk_9); + builder.add_defence(args.defence); + builder.add_attack(args.attack); + builder.add_unk_6(args.unk_6); + builder.add_unk_5(args.unk_5); + builder.add_hp_max(args.hp_max); + builder.add_max_level(args.max_level); + builder.add_min_level(args.min_level); + builder.add_id(args.id); + builder.add_avatar_id(args.avatar_id); + builder.finish() + } + + + #[inline] + pub fn avatar_id(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarLevelAdvanceTemplate::VT_AVATAR_ID, Some(0)).unwrap()} + } + #[inline] + pub fn id(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarLevelAdvanceTemplate::VT_ID, Some(0)).unwrap()} + } + #[inline] + pub fn min_level(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarLevelAdvanceTemplate::VT_MIN_LEVEL, Some(0)).unwrap()} + } + #[inline] + pub fn max_level(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarLevelAdvanceTemplate::VT_MAX_LEVEL, Some(0)).unwrap()} + } + #[inline] + pub fn hp_max(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarLevelAdvanceTemplate::VT_HP_MAX, Some(0)).unwrap()} + } + #[inline] + pub fn unk_5(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarLevelAdvanceTemplate::VT_UNK_5, Some(0)).unwrap()} + } + #[inline] + pub fn unk_6(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarLevelAdvanceTemplate::VT_UNK_6, Some(0)).unwrap()} + } + #[inline] + pub fn attack(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarLevelAdvanceTemplate::VT_ATTACK, Some(0)).unwrap()} + } + #[inline] + pub fn defence(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarLevelAdvanceTemplate::VT_DEFENCE, Some(0)).unwrap()} + } + #[inline] + pub fn unk_9(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarLevelAdvanceTemplate::VT_UNK_9, Some(0)).unwrap()} + } + #[inline] + pub fn unk_10(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarLevelAdvanceTemplate::VT_UNK_10, Some(0)).unwrap()} + } + #[inline] + pub fn unk_11(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarLevelAdvanceTemplate::VT_UNK_11, Some(0)).unwrap()} + } + #[inline] + pub fn unk_12(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarLevelAdvanceTemplate::VT_UNK_12, Some(0)).unwrap()} + } + #[inline] + pub fn unk_13(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarLevelAdvanceTemplate::VT_UNK_13, Some(0)).unwrap()} + } + #[inline] + pub fn unk_14(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarLevelAdvanceTemplate::VT_UNK_14, Some(0)).unwrap()} + } + #[inline] + pub fn unk_15(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarLevelAdvanceTemplate::VT_UNK_15, Some(0)).unwrap()} + } + #[inline] + pub fn unk_16(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarLevelAdvanceTemplate::VT_UNK_16, Some(0)).unwrap()} + } + #[inline] + pub fn unk_17(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarLevelAdvanceTemplate::VT_UNK_17, Some(0)).unwrap()} + } + #[inline] + pub fn unk_18(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(AvatarLevelAdvanceTemplate::VT_UNK_18, None)} + } + #[inline] + pub fn promotion_costs(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(AvatarLevelAdvanceTemplate::VT_PROMOTION_COSTS, None)} + } +} + +impl flatbuffers::Verifiable for AvatarLevelAdvanceTemplate<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::("avatar_id", Self::VT_AVATAR_ID, false)? + .visit_field::("id", Self::VT_ID, false)? + .visit_field::("min_level", Self::VT_MIN_LEVEL, false)? + .visit_field::("max_level", Self::VT_MAX_LEVEL, false)? + .visit_field::("hp_max", Self::VT_HP_MAX, false)? + .visit_field::("unk_5", Self::VT_UNK_5, false)? + .visit_field::("unk_6", Self::VT_UNK_6, false)? + .visit_field::("attack", Self::VT_ATTACK, false)? + .visit_field::("defence", Self::VT_DEFENCE, false)? + .visit_field::("unk_9", Self::VT_UNK_9, false)? + .visit_field::("unk_10", Self::VT_UNK_10, false)? + .visit_field::("unk_11", Self::VT_UNK_11, false)? + .visit_field::("unk_12", Self::VT_UNK_12, false)? + .visit_field::("unk_13", Self::VT_UNK_13, false)? + .visit_field::("unk_14", Self::VT_UNK_14, false)? + .visit_field::("unk_15", Self::VT_UNK_15, false)? + .visit_field::("unk_16", Self::VT_UNK_16, false)? + .visit_field::("unk_17", Self::VT_UNK_17, false)? + .visit_field::>>("unk_18", Self::VT_UNK_18, false)? + .visit_field::>>("promotion_costs", Self::VT_PROMOTION_COSTS, false)? + .finish(); + Ok(()) + } +} +pub struct AvatarLevelAdvanceTemplateArgs<'a> { + pub avatar_id: u32, + pub id: u32, + pub min_level: u32, + pub max_level: u32, + pub hp_max: i32, + pub unk_5: i32, + pub unk_6: i32, + pub attack: i32, + pub defence: i32, + pub unk_9: i32, + pub unk_10: i32, + pub unk_11: i32, + pub unk_12: i32, + pub unk_13: i32, + pub unk_14: i32, + pub unk_15: i32, + pub unk_16: i32, + pub unk_17: i32, + pub unk_18: Option>>, + pub promotion_costs: Option>>, +} +impl<'a> Default for AvatarLevelAdvanceTemplateArgs<'a> { + #[inline] + fn default() -> Self { + AvatarLevelAdvanceTemplateArgs { + avatar_id: 0, + id: 0, + min_level: 0, + max_level: 0, + hp_max: 0, + unk_5: 0, + unk_6: 0, + attack: 0, + defence: 0, + unk_9: 0, + unk_10: 0, + unk_11: 0, + unk_12: 0, + unk_13: 0, + unk_14: 0, + unk_15: 0, + unk_16: 0, + unk_17: 0, + unk_18: None, + promotion_costs: None, + } + } +} + +pub struct AvatarLevelAdvanceTemplateBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> AvatarLevelAdvanceTemplateBuilder<'a, 'b, A> { + #[inline] + pub fn add_avatar_id(&mut self, avatar_id: u32) { + self.fbb_.push_slot::(AvatarLevelAdvanceTemplate::VT_AVATAR_ID, avatar_id, 0); + } + #[inline] + pub fn add_id(&mut self, id: u32) { + self.fbb_.push_slot::(AvatarLevelAdvanceTemplate::VT_ID, id, 0); + } + #[inline] + pub fn add_min_level(&mut self, min_level: u32) { + self.fbb_.push_slot::(AvatarLevelAdvanceTemplate::VT_MIN_LEVEL, min_level, 0); + } + #[inline] + pub fn add_max_level(&mut self, max_level: u32) { + self.fbb_.push_slot::(AvatarLevelAdvanceTemplate::VT_MAX_LEVEL, max_level, 0); + } + #[inline] + pub fn add_hp_max(&mut self, hp_max: i32) { + self.fbb_.push_slot::(AvatarLevelAdvanceTemplate::VT_HP_MAX, hp_max, 0); + } + #[inline] + pub fn add_unk_5(&mut self, unk_5: i32) { + self.fbb_.push_slot::(AvatarLevelAdvanceTemplate::VT_UNK_5, unk_5, 0); + } + #[inline] + pub fn add_unk_6(&mut self, unk_6: i32) { + self.fbb_.push_slot::(AvatarLevelAdvanceTemplate::VT_UNK_6, unk_6, 0); + } + #[inline] + pub fn add_attack(&mut self, attack: i32) { + self.fbb_.push_slot::(AvatarLevelAdvanceTemplate::VT_ATTACK, attack, 0); + } + #[inline] + pub fn add_defence(&mut self, defence: i32) { + self.fbb_.push_slot::(AvatarLevelAdvanceTemplate::VT_DEFENCE, defence, 0); + } + #[inline] + pub fn add_unk_9(&mut self, unk_9: i32) { + self.fbb_.push_slot::(AvatarLevelAdvanceTemplate::VT_UNK_9, unk_9, 0); + } + #[inline] + pub fn add_unk_10(&mut self, unk_10: i32) { + self.fbb_.push_slot::(AvatarLevelAdvanceTemplate::VT_UNK_10, unk_10, 0); + } + #[inline] + pub fn add_unk_11(&mut self, unk_11: i32) { + self.fbb_.push_slot::(AvatarLevelAdvanceTemplate::VT_UNK_11, unk_11, 0); + } + #[inline] + pub fn add_unk_12(&mut self, unk_12: i32) { + self.fbb_.push_slot::(AvatarLevelAdvanceTemplate::VT_UNK_12, unk_12, 0); + } + #[inline] + pub fn add_unk_13(&mut self, unk_13: i32) { + self.fbb_.push_slot::(AvatarLevelAdvanceTemplate::VT_UNK_13, unk_13, 0); + } + #[inline] + pub fn add_unk_14(&mut self, unk_14: i32) { + self.fbb_.push_slot::(AvatarLevelAdvanceTemplate::VT_UNK_14, unk_14, 0); + } + #[inline] + pub fn add_unk_15(&mut self, unk_15: i32) { + self.fbb_.push_slot::(AvatarLevelAdvanceTemplate::VT_UNK_15, unk_15, 0); + } + #[inline] + pub fn add_unk_16(&mut self, unk_16: i32) { + self.fbb_.push_slot::(AvatarLevelAdvanceTemplate::VT_UNK_16, unk_16, 0); + } + #[inline] + pub fn add_unk_17(&mut self, unk_17: i32) { + self.fbb_.push_slot::(AvatarLevelAdvanceTemplate::VT_UNK_17, unk_17, 0); + } + #[inline] + pub fn add_unk_18(&mut self, unk_18: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(AvatarLevelAdvanceTemplate::VT_UNK_18, unk_18); + } + #[inline] + pub fn add_promotion_costs(&mut self, promotion_costs: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(AvatarLevelAdvanceTemplate::VT_PROMOTION_COSTS, promotion_costs); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> AvatarLevelAdvanceTemplateBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + AvatarLevelAdvanceTemplateBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for AvatarLevelAdvanceTemplate<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("AvatarLevelAdvanceTemplate"); + ds.field("avatar_id", &self.avatar_id()); + ds.field("id", &self.id()); + ds.field("min_level", &self.min_level()); + ds.field("max_level", &self.max_level()); + ds.field("hp_max", &self.hp_max()); + ds.field("unk_5", &self.unk_5()); + ds.field("unk_6", &self.unk_6()); + ds.field("attack", &self.attack()); + ds.field("defence", &self.defence()); + ds.field("unk_9", &self.unk_9()); + ds.field("unk_10", &self.unk_10()); + ds.field("unk_11", &self.unk_11()); + ds.field("unk_12", &self.unk_12()); + ds.field("unk_13", &self.unk_13()); + ds.field("unk_14", &self.unk_14()); + ds.field("unk_15", &self.unk_15()); + ds.field("unk_16", &self.unk_16()); + ds.field("unk_17", &self.unk_17()); + ds.field("unk_18", &self.unk_18()); + ds.field("promotion_costs", &self.promotion_costs()); + ds.finish() + } +} +pub enum AvatarLevelAdvanceTemplateTbOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct AvatarLevelAdvanceTemplateTb<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for AvatarLevelAdvanceTemplateTb<'a> { + type Inner = AvatarLevelAdvanceTemplateTb<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> AvatarLevelAdvanceTemplateTb<'a> { + pub const VT_DATA: flatbuffers::VOffsetT = 4; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + AvatarLevelAdvanceTemplateTb { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args AvatarLevelAdvanceTemplateTbArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = AvatarLevelAdvanceTemplateTbBuilder::new(_fbb); + if let Some(x) = args.data { builder.add_data(x); } + builder.finish() + } + + + #[inline] + pub fn data(&self) -> Option>>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(AvatarLevelAdvanceTemplateTb::VT_DATA, None)} + } +} + +impl flatbuffers::Verifiable for AvatarLevelAdvanceTemplateTb<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::>>>("data", Self::VT_DATA, false)? + .finish(); + Ok(()) + } +} +pub struct AvatarLevelAdvanceTemplateTbArgs<'a> { + pub data: Option>>>>, +} +impl<'a> Default for AvatarLevelAdvanceTemplateTbArgs<'a> { + #[inline] + fn default() -> Self { + AvatarLevelAdvanceTemplateTbArgs { + data: None, + } + } +} + +pub struct AvatarLevelAdvanceTemplateTbBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> AvatarLevelAdvanceTemplateTbBuilder<'a, 'b, A> { + #[inline] + pub fn add_data(&mut self, data: flatbuffers::WIPOffset>>>) { + self.fbb_.push_slot_always::>(AvatarLevelAdvanceTemplateTb::VT_DATA, data); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> AvatarLevelAdvanceTemplateTbBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + AvatarLevelAdvanceTemplateTbBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for AvatarLevelAdvanceTemplateTb<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("AvatarLevelAdvanceTemplateTb"); + ds.field("data", &self.data()); + ds.finish() + } +} diff --git a/lib/config/gen_flatbuffers/avatar_level_template_generated.rs b/lib/config/gen_flatbuffers/avatar_level_template_generated.rs new file mode 100644 index 0000000..07fedba --- /dev/null +++ b/lib/config/gen_flatbuffers/avatar_level_template_generated.rs @@ -0,0 +1,222 @@ +// automatically generated by the FlatBuffers compiler, do not modify + + +// @generated + +use core::mem; +use core::cmp::Ordering; + +extern crate flatbuffers; +use self::flatbuffers::{EndianScalar, Follow}; + +pub enum AvatarLevelTemplateOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct AvatarLevelTemplate<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for AvatarLevelTemplate<'a> { + type Inner = AvatarLevelTemplate<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> AvatarLevelTemplate<'a> { + pub const VT_LEVEL: flatbuffers::VOffsetT = 4; + pub const VT_EXP: flatbuffers::VOffsetT = 6; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + AvatarLevelTemplate { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args AvatarLevelTemplateArgs + ) -> flatbuffers::WIPOffset> { + let mut builder = AvatarLevelTemplateBuilder::new(_fbb); + builder.add_exp(args.exp); + builder.add_level(args.level); + builder.finish() + } + + + #[inline] + pub fn level(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarLevelTemplate::VT_LEVEL, Some(0)).unwrap()} + } + #[inline] + pub fn exp(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarLevelTemplate::VT_EXP, Some(0)).unwrap()} + } +} + +impl flatbuffers::Verifiable for AvatarLevelTemplate<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::("level", Self::VT_LEVEL, false)? + .visit_field::("exp", Self::VT_EXP, false)? + .finish(); + Ok(()) + } +} +pub struct AvatarLevelTemplateArgs { + pub level: u32, + pub exp: u32, +} +impl<'a> Default for AvatarLevelTemplateArgs { + #[inline] + fn default() -> Self { + AvatarLevelTemplateArgs { + level: 0, + exp: 0, + } + } +} + +pub struct AvatarLevelTemplateBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> AvatarLevelTemplateBuilder<'a, 'b, A> { + #[inline] + pub fn add_level(&mut self, level: u32) { + self.fbb_.push_slot::(AvatarLevelTemplate::VT_LEVEL, level, 0); + } + #[inline] + pub fn add_exp(&mut self, exp: u32) { + self.fbb_.push_slot::(AvatarLevelTemplate::VT_EXP, exp, 0); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> AvatarLevelTemplateBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + AvatarLevelTemplateBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for AvatarLevelTemplate<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("AvatarLevelTemplate"); + ds.field("level", &self.level()); + ds.field("exp", &self.exp()); + ds.finish() + } +} +pub enum AvatarLevelTemplateTbOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct AvatarLevelTemplateTb<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for AvatarLevelTemplateTb<'a> { + type Inner = AvatarLevelTemplateTb<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> AvatarLevelTemplateTb<'a> { + pub const VT_DATA: flatbuffers::VOffsetT = 4; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + AvatarLevelTemplateTb { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args AvatarLevelTemplateTbArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = AvatarLevelTemplateTbBuilder::new(_fbb); + if let Some(x) = args.data { builder.add_data(x); } + builder.finish() + } + + + #[inline] + pub fn data(&self) -> Option>>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(AvatarLevelTemplateTb::VT_DATA, None)} + } +} + +impl flatbuffers::Verifiable for AvatarLevelTemplateTb<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::>>>("data", Self::VT_DATA, false)? + .finish(); + Ok(()) + } +} +pub struct AvatarLevelTemplateTbArgs<'a> { + pub data: Option>>>>, +} +impl<'a> Default for AvatarLevelTemplateTbArgs<'a> { + #[inline] + fn default() -> Self { + AvatarLevelTemplateTbArgs { + data: None, + } + } +} + +pub struct AvatarLevelTemplateTbBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> AvatarLevelTemplateTbBuilder<'a, 'b, A> { + #[inline] + pub fn add_data(&mut self, data: flatbuffers::WIPOffset>>>) { + self.fbb_.push_slot_always::>(AvatarLevelTemplateTb::VT_DATA, data); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> AvatarLevelTemplateTbBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + AvatarLevelTemplateTbBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for AvatarLevelTemplateTb<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("AvatarLevelTemplateTb"); + ds.field("data", &self.data()); + ds.finish() + } +} diff --git a/lib/config/gen_flatbuffers/avatar_passive_skill_template_generated.rs b/lib/config/gen_flatbuffers/avatar_passive_skill_template_generated.rs new file mode 100644 index 0000000..850e258 --- /dev/null +++ b/lib/config/gen_flatbuffers/avatar_passive_skill_template_generated.rs @@ -0,0 +1,699 @@ +// automatically generated by the FlatBuffers compiler, do not modify + + +// @generated + +use core::mem; +use core::cmp::Ordering; + +extern crate flatbuffers; +use self::flatbuffers::{EndianScalar, Follow}; + +// struct RefineCost, aligned to 4 +#[repr(transparent)] +#[derive(Clone, Copy, PartialEq)] +pub struct RefineCost(pub [u8; 8]); +impl Default for RefineCost { + fn default() -> Self { + Self([0; 8]) + } +} +impl core::fmt::Debug for RefineCost { + fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { + f.debug_struct("RefineCost") + .field("item_id", &self.item_id()) + .field("number", &self.number()) + .finish() + } +} + +impl flatbuffers::SimpleToVerifyInSlice for RefineCost {} +impl<'a> flatbuffers::Follow<'a> for RefineCost { + type Inner = &'a RefineCost; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + <&'a RefineCost>::follow(buf, loc) + } +} +impl<'a> flatbuffers::Follow<'a> for &'a RefineCost { + type Inner = &'a RefineCost; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + flatbuffers::follow_cast_ref::(buf, loc) + } +} +impl<'b> flatbuffers::Push for RefineCost { + type Output = RefineCost; + #[inline] + unsafe fn push(&self, dst: &mut [u8], _written_len: usize) { + let src = ::core::slice::from_raw_parts(self as *const RefineCost as *const u8, ::size()); + dst.copy_from_slice(src); + } + #[inline] + fn alignment() -> flatbuffers::PushAlignment { + flatbuffers::PushAlignment::new(4) + } +} + +impl<'a> flatbuffers::Verifiable for RefineCost { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.in_buffer::(pos) + } +} + +impl<'a> RefineCost { + #[allow(clippy::too_many_arguments)] + pub fn new( + item_id: u32, + number: i32, + ) -> Self { + let mut s = Self([0; 8]); + s.set_item_id(item_id); + s.set_number(number); + s + } + + pub fn item_id(&self) -> u32 { + let mut mem = core::mem::MaybeUninit::<::Scalar>::uninit(); + // Safety: + // Created from a valid Table for this object + // Which contains a valid value in this slot + EndianScalar::from_little_endian(unsafe { + core::ptr::copy_nonoverlapping( + self.0[0..].as_ptr(), + mem.as_mut_ptr() as *mut u8, + core::mem::size_of::<::Scalar>(), + ); + mem.assume_init() + }) + } + + pub fn set_item_id(&mut self, x: u32) { + let x_le = x.to_little_endian(); + // Safety: + // Created from a valid Table for this object + // Which contains a valid value in this slot + unsafe { + core::ptr::copy_nonoverlapping( + &x_le as *const _ as *const u8, + self.0[0..].as_mut_ptr(), + core::mem::size_of::<::Scalar>(), + ); + } + } + + pub fn number(&self) -> i32 { + let mut mem = core::mem::MaybeUninit::<::Scalar>::uninit(); + // Safety: + // Created from a valid Table for this object + // Which contains a valid value in this slot + EndianScalar::from_little_endian(unsafe { + core::ptr::copy_nonoverlapping( + self.0[4..].as_ptr(), + mem.as_mut_ptr() as *mut u8, + core::mem::size_of::<::Scalar>(), + ); + mem.assume_init() + }) + } + + pub fn set_number(&mut self, x: i32) { + let x_le = x.to_little_endian(); + // Safety: + // Created from a valid Table for this object + // Which contains a valid value in this slot + unsafe { + core::ptr::copy_nonoverlapping( + &x_le as *const _ as *const u8, + self.0[4..].as_mut_ptr(), + core::mem::size_of::<::Scalar>(), + ); + } + } + +} + +// struct Property, aligned to 4 +#[repr(transparent)] +#[derive(Clone, Copy, PartialEq)] +pub struct Property(pub [u8; 8]); +impl Default for Property { + fn default() -> Self { + Self([0; 8]) + } +} +impl core::fmt::Debug for Property { + fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { + f.debug_struct("Property") + .field("property", &self.property()) + .field("value", &self.value()) + .finish() + } +} + +impl flatbuffers::SimpleToVerifyInSlice for Property {} +impl<'a> flatbuffers::Follow<'a> for Property { + type Inner = &'a Property; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + <&'a Property>::follow(buf, loc) + } +} +impl<'a> flatbuffers::Follow<'a> for &'a Property { + type Inner = &'a Property; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + flatbuffers::follow_cast_ref::(buf, loc) + } +} +impl<'b> flatbuffers::Push for Property { + type Output = Property; + #[inline] + unsafe fn push(&self, dst: &mut [u8], _written_len: usize) { + let src = ::core::slice::from_raw_parts(self as *const Property as *const u8, ::size()); + dst.copy_from_slice(src); + } + #[inline] + fn alignment() -> flatbuffers::PushAlignment { + flatbuffers::PushAlignment::new(4) + } +} + +impl<'a> flatbuffers::Verifiable for Property { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.in_buffer::(pos) + } +} + +impl<'a> Property { + #[allow(clippy::too_many_arguments)] + pub fn new( + property: u32, + value: i32, + ) -> Self { + let mut s = Self([0; 8]); + s.set_property(property); + s.set_value(value); + s + } + + pub fn property(&self) -> u32 { + let mut mem = core::mem::MaybeUninit::<::Scalar>::uninit(); + // Safety: + // Created from a valid Table for this object + // Which contains a valid value in this slot + EndianScalar::from_little_endian(unsafe { + core::ptr::copy_nonoverlapping( + self.0[0..].as_ptr(), + mem.as_mut_ptr() as *mut u8, + core::mem::size_of::<::Scalar>(), + ); + mem.assume_init() + }) + } + + pub fn set_property(&mut self, x: u32) { + let x_le = x.to_little_endian(); + // Safety: + // Created from a valid Table for this object + // Which contains a valid value in this slot + unsafe { + core::ptr::copy_nonoverlapping( + &x_le as *const _ as *const u8, + self.0[0..].as_mut_ptr(), + core::mem::size_of::<::Scalar>(), + ); + } + } + + pub fn value(&self) -> i32 { + let mut mem = core::mem::MaybeUninit::<::Scalar>::uninit(); + // Safety: + // Created from a valid Table for this object + // Which contains a valid value in this slot + EndianScalar::from_little_endian(unsafe { + core::ptr::copy_nonoverlapping( + self.0[4..].as_ptr(), + mem.as_mut_ptr() as *mut u8, + core::mem::size_of::<::Scalar>(), + ); + mem.assume_init() + }) + } + + pub fn set_value(&mut self, x: i32) { + let x_le = x.to_little_endian(); + // Safety: + // Created from a valid Table for this object + // Which contains a valid value in this slot + unsafe { + core::ptr::copy_nonoverlapping( + &x_le as *const _ as *const u8, + self.0[4..].as_mut_ptr(), + core::mem::size_of::<::Scalar>(), + ); + } + } + +} + +pub enum AvatarPassiveSkillTemplateOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct AvatarPassiveSkillTemplate<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for AvatarPassiveSkillTemplate<'a> { + type Inner = AvatarPassiveSkillTemplate<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> AvatarPassiveSkillTemplate<'a> { + pub const VT_SKILL_ID: flatbuffers::VOffsetT = 4; + pub const VT_AVATAR_ID: flatbuffers::VOffsetT = 6; + pub const VT_MIN_AVATAR_LEVEL: flatbuffers::VOffsetT = 8; + pub const VT_MIN_PASSIVE_SKILL_LEVEL: flatbuffers::VOffsetT = 10; + pub const VT_UNLOCK_PASSIVE_SKILL_LEVEL: flatbuffers::VOffsetT = 12; + pub const VT_UNK_5: flatbuffers::VOffsetT = 14; + pub const VT_UNK_LEVELUP: flatbuffers::VOffsetT = 16; + pub const VT_UNK_7: flatbuffers::VOffsetT = 18; + pub const VT_UNK_8: flatbuffers::VOffsetT = 20; + pub const VT_UNK_9: flatbuffers::VOffsetT = 22; + pub const VT_UNK_10: flatbuffers::VOffsetT = 24; + pub const VT_PROPERTYS: flatbuffers::VOffsetT = 26; + pub const VT_NAMES: flatbuffers::VOffsetT = 28; + pub const VT_DESCRIPTIONS: flatbuffers::VOffsetT = 30; + pub const VT_MATERIALS_COSTS: flatbuffers::VOffsetT = 32; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + AvatarPassiveSkillTemplate { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args AvatarPassiveSkillTemplateArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = AvatarPassiveSkillTemplateBuilder::new(_fbb); + if let Some(x) = args.materials_costs { builder.add_materials_costs(x); } + if let Some(x) = args.descriptions { builder.add_descriptions(x); } + if let Some(x) = args.names { builder.add_names(x); } + if let Some(x) = args.propertys { builder.add_propertys(x); } + builder.add_unk_10(args.unk_10); + builder.add_unk_9(args.unk_9); + builder.add_unk_8(args.unk_8); + builder.add_unk_7(args.unk_7); + if let Some(x) = args.unk_levelup { builder.add_unk_levelup(x); } + builder.add_unk_5(args.unk_5); + builder.add_unlock_passive_skill_level(args.unlock_passive_skill_level); + builder.add_min_passive_skill_level(args.min_passive_skill_level); + builder.add_min_avatar_level(args.min_avatar_level); + builder.add_avatar_id(args.avatar_id); + builder.add_skill_id(args.skill_id); + builder.finish() + } + + + #[inline] + pub fn skill_id(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarPassiveSkillTemplate::VT_SKILL_ID, Some(0)).unwrap()} + } + #[inline] + pub fn avatar_id(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarPassiveSkillTemplate::VT_AVATAR_ID, Some(0)).unwrap()} + } + #[inline] + pub fn min_avatar_level(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarPassiveSkillTemplate::VT_MIN_AVATAR_LEVEL, Some(0)).unwrap()} + } + #[inline] + pub fn min_passive_skill_level(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarPassiveSkillTemplate::VT_MIN_PASSIVE_SKILL_LEVEL, Some(0)).unwrap()} + } + #[inline] + pub fn unlock_passive_skill_level(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarPassiveSkillTemplate::VT_UNLOCK_PASSIVE_SKILL_LEVEL, Some(0)).unwrap()} + } + #[inline] + pub fn unk_5(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarPassiveSkillTemplate::VT_UNK_5, Some(0)).unwrap()} + } + #[inline] + pub fn unk_levelup(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(AvatarPassiveSkillTemplate::VT_UNK_LEVELUP, None)} + } + #[inline] + pub fn unk_7(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarPassiveSkillTemplate::VT_UNK_7, Some(0)).unwrap()} + } + #[inline] + pub fn unk_8(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarPassiveSkillTemplate::VT_UNK_8, Some(0)).unwrap()} + } + #[inline] + pub fn unk_9(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarPassiveSkillTemplate::VT_UNK_9, Some(0)).unwrap()} + } + #[inline] + pub fn unk_10(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarPassiveSkillTemplate::VT_UNK_10, Some(0)).unwrap()} + } + #[inline] + pub fn propertys(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(AvatarPassiveSkillTemplate::VT_PROPERTYS, None)} + } + #[inline] + pub fn names(&self) -> Option>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(AvatarPassiveSkillTemplate::VT_NAMES, None)} + } + #[inline] + pub fn descriptions(&self) -> Option>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(AvatarPassiveSkillTemplate::VT_DESCRIPTIONS, None)} + } + #[inline] + pub fn materials_costs(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(AvatarPassiveSkillTemplate::VT_MATERIALS_COSTS, None)} + } +} + +impl flatbuffers::Verifiable for AvatarPassiveSkillTemplate<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::("skill_id", Self::VT_SKILL_ID, false)? + .visit_field::("avatar_id", Self::VT_AVATAR_ID, false)? + .visit_field::("min_avatar_level", Self::VT_MIN_AVATAR_LEVEL, false)? + .visit_field::("min_passive_skill_level", Self::VT_MIN_PASSIVE_SKILL_LEVEL, false)? + .visit_field::("unlock_passive_skill_level", Self::VT_UNLOCK_PASSIVE_SKILL_LEVEL, false)? + .visit_field::("unk_5", Self::VT_UNK_5, false)? + .visit_field::>("unk_levelup", Self::VT_UNK_LEVELUP, false)? + .visit_field::("unk_7", Self::VT_UNK_7, false)? + .visit_field::("unk_8", Self::VT_UNK_8, false)? + .visit_field::("unk_9", Self::VT_UNK_9, false)? + .visit_field::("unk_10", Self::VT_UNK_10, false)? + .visit_field::>>("propertys", Self::VT_PROPERTYS, false)? + .visit_field::>>>("names", Self::VT_NAMES, false)? + .visit_field::>>>("descriptions", Self::VT_DESCRIPTIONS, false)? + .visit_field::>>("materials_costs", Self::VT_MATERIALS_COSTS, false)? + .finish(); + Ok(()) + } +} +pub struct AvatarPassiveSkillTemplateArgs<'a> { + pub skill_id: i32, + pub avatar_id: u32, + pub min_avatar_level: u32, + pub min_passive_skill_level: u32, + pub unlock_passive_skill_level: u32, + pub unk_5: i32, + pub unk_levelup: Option>, + pub unk_7: i32, + pub unk_8: i32, + pub unk_9: i32, + pub unk_10: i32, + pub propertys: Option>>, + pub names: Option>>>, + pub descriptions: Option>>>, + pub materials_costs: Option>>, +} +impl<'a> Default for AvatarPassiveSkillTemplateArgs<'a> { + #[inline] + fn default() -> Self { + AvatarPassiveSkillTemplateArgs { + skill_id: 0, + avatar_id: 0, + min_avatar_level: 0, + min_passive_skill_level: 0, + unlock_passive_skill_level: 0, + unk_5: 0, + unk_levelup: None, + unk_7: 0, + unk_8: 0, + unk_9: 0, + unk_10: 0, + propertys: None, + names: None, + descriptions: None, + materials_costs: None, + } + } +} + +pub struct AvatarPassiveSkillTemplateBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> AvatarPassiveSkillTemplateBuilder<'a, 'b, A> { + #[inline] + pub fn add_skill_id(&mut self, skill_id: i32) { + self.fbb_.push_slot::(AvatarPassiveSkillTemplate::VT_SKILL_ID, skill_id, 0); + } + #[inline] + pub fn add_avatar_id(&mut self, avatar_id: u32) { + self.fbb_.push_slot::(AvatarPassiveSkillTemplate::VT_AVATAR_ID, avatar_id, 0); + } + #[inline] + pub fn add_min_avatar_level(&mut self, min_avatar_level: u32) { + self.fbb_.push_slot::(AvatarPassiveSkillTemplate::VT_MIN_AVATAR_LEVEL, min_avatar_level, 0); + } + #[inline] + pub fn add_min_passive_skill_level(&mut self, min_passive_skill_level: u32) { + self.fbb_.push_slot::(AvatarPassiveSkillTemplate::VT_MIN_PASSIVE_SKILL_LEVEL, min_passive_skill_level, 0); + } + #[inline] + pub fn add_unlock_passive_skill_level(&mut self, unlock_passive_skill_level: u32) { + self.fbb_.push_slot::(AvatarPassiveSkillTemplate::VT_UNLOCK_PASSIVE_SKILL_LEVEL, unlock_passive_skill_level, 0); + } + #[inline] + pub fn add_unk_5(&mut self, unk_5: i32) { + self.fbb_.push_slot::(AvatarPassiveSkillTemplate::VT_UNK_5, unk_5, 0); + } + #[inline] + pub fn add_unk_levelup(&mut self, unk_levelup: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(AvatarPassiveSkillTemplate::VT_UNK_LEVELUP, unk_levelup); + } + #[inline] + pub fn add_unk_7(&mut self, unk_7: i32) { + self.fbb_.push_slot::(AvatarPassiveSkillTemplate::VT_UNK_7, unk_7, 0); + } + #[inline] + pub fn add_unk_8(&mut self, unk_8: i32) { + self.fbb_.push_slot::(AvatarPassiveSkillTemplate::VT_UNK_8, unk_8, 0); + } + #[inline] + pub fn add_unk_9(&mut self, unk_9: i32) { + self.fbb_.push_slot::(AvatarPassiveSkillTemplate::VT_UNK_9, unk_9, 0); + } + #[inline] + pub fn add_unk_10(&mut self, unk_10: i32) { + self.fbb_.push_slot::(AvatarPassiveSkillTemplate::VT_UNK_10, unk_10, 0); + } + #[inline] + pub fn add_propertys(&mut self, propertys: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(AvatarPassiveSkillTemplate::VT_PROPERTYS, propertys); + } + #[inline] + pub fn add_names(&mut self, names: flatbuffers::WIPOffset>>) { + self.fbb_.push_slot_always::>(AvatarPassiveSkillTemplate::VT_NAMES, names); + } + #[inline] + pub fn add_descriptions(&mut self, descriptions: flatbuffers::WIPOffset>>) { + self.fbb_.push_slot_always::>(AvatarPassiveSkillTemplate::VT_DESCRIPTIONS, descriptions); + } + #[inline] + pub fn add_materials_costs(&mut self, materials_costs: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(AvatarPassiveSkillTemplate::VT_MATERIALS_COSTS, materials_costs); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> AvatarPassiveSkillTemplateBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + AvatarPassiveSkillTemplateBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for AvatarPassiveSkillTemplate<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("AvatarPassiveSkillTemplate"); + ds.field("skill_id", &self.skill_id()); + ds.field("avatar_id", &self.avatar_id()); + ds.field("min_avatar_level", &self.min_avatar_level()); + ds.field("min_passive_skill_level", &self.min_passive_skill_level()); + ds.field("unlock_passive_skill_level", &self.unlock_passive_skill_level()); + ds.field("unk_5", &self.unk_5()); + ds.field("unk_levelup", &self.unk_levelup()); + ds.field("unk_7", &self.unk_7()); + ds.field("unk_8", &self.unk_8()); + ds.field("unk_9", &self.unk_9()); + ds.field("unk_10", &self.unk_10()); + ds.field("propertys", &self.propertys()); + ds.field("names", &self.names()); + ds.field("descriptions", &self.descriptions()); + ds.field("materials_costs", &self.materials_costs()); + ds.finish() + } +} +pub enum AvatarPassiveSkillTemplateTbOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct AvatarPassiveSkillTemplateTb<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for AvatarPassiveSkillTemplateTb<'a> { + type Inner = AvatarPassiveSkillTemplateTb<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> AvatarPassiveSkillTemplateTb<'a> { + pub const VT_DATA: flatbuffers::VOffsetT = 4; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + AvatarPassiveSkillTemplateTb { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args AvatarPassiveSkillTemplateTbArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = AvatarPassiveSkillTemplateTbBuilder::new(_fbb); + if let Some(x) = args.data { builder.add_data(x); } + builder.finish() + } + + + #[inline] + pub fn data(&self) -> Option>>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(AvatarPassiveSkillTemplateTb::VT_DATA, None)} + } +} + +impl flatbuffers::Verifiable for AvatarPassiveSkillTemplateTb<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::>>>("data", Self::VT_DATA, false)? + .finish(); + Ok(()) + } +} +pub struct AvatarPassiveSkillTemplateTbArgs<'a> { + pub data: Option>>>>, +} +impl<'a> Default for AvatarPassiveSkillTemplateTbArgs<'a> { + #[inline] + fn default() -> Self { + AvatarPassiveSkillTemplateTbArgs { + data: None, + } + } +} + +pub struct AvatarPassiveSkillTemplateTbBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> AvatarPassiveSkillTemplateTbBuilder<'a, 'b, A> { + #[inline] + pub fn add_data(&mut self, data: flatbuffers::WIPOffset>>>) { + self.fbb_.push_slot_always::>(AvatarPassiveSkillTemplateTb::VT_DATA, data); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> AvatarPassiveSkillTemplateTbBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + AvatarPassiveSkillTemplateTbBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for AvatarPassiveSkillTemplateTb<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("AvatarPassiveSkillTemplateTb"); + ds.field("data", &self.data()); + ds.finish() + } +} diff --git a/lib/config/gen_flatbuffers/avatar_skin_base_template_generated.rs b/lib/config/gen_flatbuffers/avatar_skin_base_template_generated.rs new file mode 100644 index 0000000..39db594 --- /dev/null +++ b/lib/config/gen_flatbuffers/avatar_skin_base_template_generated.rs @@ -0,0 +1,596 @@ +// automatically generated by the FlatBuffers compiler, do not modify + + +// @generated + +use core::mem; +use core::cmp::Ordering; + +extern crate flatbuffers; +use self::flatbuffers::{EndianScalar, Follow}; + +pub enum AvatarSkinBaseTemplateOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct AvatarSkinBaseTemplate<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for AvatarSkinBaseTemplate<'a> { + type Inner = AvatarSkinBaseTemplate<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> AvatarSkinBaseTemplate<'a> { + pub const VT_ID: flatbuffers::VOffsetT = 4; + pub const VT_SERVER_ONLY_0: flatbuffers::VOffsetT = 6; + pub const VT_DLFHPHCLIBA: flatbuffers::VOffsetT = 8; + pub const VT_NFIEGMLEEFE: flatbuffers::VOffsetT = 10; + pub const VT_AVATAR_ID: flatbuffers::VOffsetT = 12; + pub const VT_SERVER_ONLY_1: flatbuffers::VOffsetT = 14; + pub const VT_SERVER_ONLY_2: flatbuffers::VOffsetT = 16; + pub const VT_SERVER_ONLY_3: flatbuffers::VOffsetT = 18; + pub const VT_GMBBOEGOEPH: flatbuffers::VOffsetT = 20; + pub const VT_HMIOIBHJGCM: flatbuffers::VOffsetT = 22; + pub const VT_SERVER_ONLY_4: flatbuffers::VOffsetT = 24; + pub const VT_OEMHKAENMHN: flatbuffers::VOffsetT = 26; + pub const VT_FGJJELBGBBC: flatbuffers::VOffsetT = 28; + pub const VT_FKBJLMBAPDI: flatbuffers::VOffsetT = 30; + pub const VT_SERVER_ONLY_5: flatbuffers::VOffsetT = 32; + pub const VT_SERVER_ONLY_6: flatbuffers::VOffsetT = 34; + pub const VT_SERVER_ONLY_7: flatbuffers::VOffsetT = 36; + pub const VT_SERVER_ONLY_8: flatbuffers::VOffsetT = 38; + pub const VT_SERVER_ONLY_9: flatbuffers::VOffsetT = 40; + pub const VT_DIGLJDFKAMN: flatbuffers::VOffsetT = 42; + pub const VT_BKFKIDCLHKL: flatbuffers::VOffsetT = 44; + pub const VT_FHJDONJMNKP: flatbuffers::VOffsetT = 46; + pub const VT_AHHLKMJEEAE: flatbuffers::VOffsetT = 48; + pub const VT_HPMCPJGPKJB: flatbuffers::VOffsetT = 50; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + AvatarSkinBaseTemplate { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args AvatarSkinBaseTemplateArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = AvatarSkinBaseTemplateBuilder::new(_fbb); + builder.add_HPMCPJGPKJB(args.HPMCPJGPKJB); + if let Some(x) = args.AHHLKMJEEAE { builder.add_AHHLKMJEEAE(x); } + if let Some(x) = args.FHJDONJMNKP { builder.add_FHJDONJMNKP(x); } + builder.add_BKFKIDCLHKL(args.BKFKIDCLHKL); + if let Some(x) = args.DIGLJDFKAMN { builder.add_DIGLJDFKAMN(x); } + builder.add_server_only_9(args.server_only_9); + builder.add_server_only_8(args.server_only_8); + builder.add_server_only_7(args.server_only_7); + builder.add_server_only_6(args.server_only_6); + builder.add_server_only_5(args.server_only_5); + builder.add_FKBJLMBAPDI(args.FKBJLMBAPDI); + if let Some(x) = args.FGJJELBGBBC { builder.add_FGJJELBGBBC(x); } + builder.add_OEMHKAENMHN(args.OEMHKAENMHN); + builder.add_server_only_4(args.server_only_4); + if let Some(x) = args.HMIOIBHJGCM { builder.add_HMIOIBHJGCM(x); } + if let Some(x) = args.GMBBOEGOEPH { builder.add_GMBBOEGOEPH(x); } + builder.add_server_only_3(args.server_only_3); + builder.add_server_only_2(args.server_only_2); + builder.add_server_only_1(args.server_only_1); + builder.add_avatar_id(args.avatar_id); + if let Some(x) = args.NFIEGMLEEFE { builder.add_NFIEGMLEEFE(x); } + if let Some(x) = args.DLFHPHCLIBA { builder.add_DLFHPHCLIBA(x); } + builder.add_server_only_0(args.server_only_0); + builder.add_id(args.id); + builder.finish() + } + + + #[inline] + pub fn id(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarSkinBaseTemplate::VT_ID, Some(0)).unwrap()} + } + #[inline] + pub fn server_only_0(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarSkinBaseTemplate::VT_SERVER_ONLY_0, Some(0)).unwrap()} + } + #[inline] + pub fn DLFHPHCLIBA(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(AvatarSkinBaseTemplate::VT_DLFHPHCLIBA, None)} + } + #[inline] + pub fn NFIEGMLEEFE(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(AvatarSkinBaseTemplate::VT_NFIEGMLEEFE, None)} + } + #[inline] + pub fn avatar_id(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarSkinBaseTemplate::VT_AVATAR_ID, Some(0)).unwrap()} + } + #[inline] + pub fn server_only_1(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarSkinBaseTemplate::VT_SERVER_ONLY_1, Some(0)).unwrap()} + } + #[inline] + pub fn server_only_2(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarSkinBaseTemplate::VT_SERVER_ONLY_2, Some(0)).unwrap()} + } + #[inline] + pub fn server_only_3(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarSkinBaseTemplate::VT_SERVER_ONLY_3, Some(0)).unwrap()} + } + #[inline] + pub fn GMBBOEGOEPH(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(AvatarSkinBaseTemplate::VT_GMBBOEGOEPH, None)} + } + #[inline] + pub fn HMIOIBHJGCM(&self) -> Option>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(AvatarSkinBaseTemplate::VT_HMIOIBHJGCM, None)} + } + #[inline] + pub fn server_only_4(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarSkinBaseTemplate::VT_SERVER_ONLY_4, Some(0)).unwrap()} + } + #[inline] + pub fn OEMHKAENMHN(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarSkinBaseTemplate::VT_OEMHKAENMHN, Some(0)).unwrap()} + } + #[inline] + pub fn FGJJELBGBBC(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(AvatarSkinBaseTemplate::VT_FGJJELBGBBC, None)} + } + #[inline] + pub fn FKBJLMBAPDI(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarSkinBaseTemplate::VT_FKBJLMBAPDI, Some(0)).unwrap()} + } + #[inline] + pub fn server_only_5(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarSkinBaseTemplate::VT_SERVER_ONLY_5, Some(0)).unwrap()} + } + #[inline] + pub fn server_only_6(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarSkinBaseTemplate::VT_SERVER_ONLY_6, Some(0)).unwrap()} + } + #[inline] + pub fn server_only_7(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarSkinBaseTemplate::VT_SERVER_ONLY_7, Some(0)).unwrap()} + } + #[inline] + pub fn server_only_8(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarSkinBaseTemplate::VT_SERVER_ONLY_8, Some(0)).unwrap()} + } + #[inline] + pub fn server_only_9(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarSkinBaseTemplate::VT_SERVER_ONLY_9, Some(0)).unwrap()} + } + #[inline] + pub fn DIGLJDFKAMN(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(AvatarSkinBaseTemplate::VT_DIGLJDFKAMN, None)} + } + #[inline] + pub fn BKFKIDCLHKL(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarSkinBaseTemplate::VT_BKFKIDCLHKL, Some(0)).unwrap()} + } + #[inline] + pub fn FHJDONJMNKP(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(AvatarSkinBaseTemplate::VT_FHJDONJMNKP, None)} + } + #[inline] + pub fn AHHLKMJEEAE(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(AvatarSkinBaseTemplate::VT_AHHLKMJEEAE, None)} + } + #[inline] + pub fn HPMCPJGPKJB(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(AvatarSkinBaseTemplate::VT_HPMCPJGPKJB, Some(0)).unwrap()} + } +} + +impl flatbuffers::Verifiable for AvatarSkinBaseTemplate<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::("id", Self::VT_ID, false)? + .visit_field::("server_only_0", Self::VT_SERVER_ONLY_0, false)? + .visit_field::>("DLFHPHCLIBA", Self::VT_DLFHPHCLIBA, false)? + .visit_field::>("NFIEGMLEEFE", Self::VT_NFIEGMLEEFE, false)? + .visit_field::("avatar_id", Self::VT_AVATAR_ID, false)? + .visit_field::("server_only_1", Self::VT_SERVER_ONLY_1, false)? + .visit_field::("server_only_2", Self::VT_SERVER_ONLY_2, false)? + .visit_field::("server_only_3", Self::VT_SERVER_ONLY_3, false)? + .visit_field::>("GMBBOEGOEPH", Self::VT_GMBBOEGOEPH, false)? + .visit_field::>>>("HMIOIBHJGCM", Self::VT_HMIOIBHJGCM, false)? + .visit_field::("server_only_4", Self::VT_SERVER_ONLY_4, false)? + .visit_field::("OEMHKAENMHN", Self::VT_OEMHKAENMHN, false)? + .visit_field::>("FGJJELBGBBC", Self::VT_FGJJELBGBBC, false)? + .visit_field::("FKBJLMBAPDI", Self::VT_FKBJLMBAPDI, false)? + .visit_field::("server_only_5", Self::VT_SERVER_ONLY_5, false)? + .visit_field::("server_only_6", Self::VT_SERVER_ONLY_6, false)? + .visit_field::("server_only_7", Self::VT_SERVER_ONLY_7, false)? + .visit_field::("server_only_8", Self::VT_SERVER_ONLY_8, false)? + .visit_field::("server_only_9", Self::VT_SERVER_ONLY_9, false)? + .visit_field::>("DIGLJDFKAMN", Self::VT_DIGLJDFKAMN, false)? + .visit_field::("BKFKIDCLHKL", Self::VT_BKFKIDCLHKL, false)? + .visit_field::>("FHJDONJMNKP", Self::VT_FHJDONJMNKP, false)? + .visit_field::>("AHHLKMJEEAE", Self::VT_AHHLKMJEEAE, false)? + .visit_field::("HPMCPJGPKJB", Self::VT_HPMCPJGPKJB, false)? + .finish(); + Ok(()) + } +} +pub struct AvatarSkinBaseTemplateArgs<'a> { + pub id: u32, + pub server_only_0: i32, + pub DLFHPHCLIBA: Option>, + pub NFIEGMLEEFE: Option>, + pub avatar_id: u32, + pub server_only_1: i32, + pub server_only_2: i32, + pub server_only_3: i32, + pub GMBBOEGOEPH: Option>, + pub HMIOIBHJGCM: Option>>>, + pub server_only_4: i32, + pub OEMHKAENMHN: i32, + pub FGJJELBGBBC: Option>, + pub FKBJLMBAPDI: i32, + pub server_only_5: i32, + pub server_only_6: i32, + pub server_only_7: i32, + pub server_only_8: i32, + pub server_only_9: i32, + pub DIGLJDFKAMN: Option>, + pub BKFKIDCLHKL: i32, + pub FHJDONJMNKP: Option>, + pub AHHLKMJEEAE: Option>, + pub HPMCPJGPKJB: i32, +} +impl<'a> Default for AvatarSkinBaseTemplateArgs<'a> { + #[inline] + fn default() -> Self { + AvatarSkinBaseTemplateArgs { + id: 0, + server_only_0: 0, + DLFHPHCLIBA: None, + NFIEGMLEEFE: None, + avatar_id: 0, + server_only_1: 0, + server_only_2: 0, + server_only_3: 0, + GMBBOEGOEPH: None, + HMIOIBHJGCM: None, + server_only_4: 0, + OEMHKAENMHN: 0, + FGJJELBGBBC: None, + FKBJLMBAPDI: 0, + server_only_5: 0, + server_only_6: 0, + server_only_7: 0, + server_only_8: 0, + server_only_9: 0, + DIGLJDFKAMN: None, + BKFKIDCLHKL: 0, + FHJDONJMNKP: None, + AHHLKMJEEAE: None, + HPMCPJGPKJB: 0, + } + } +} + +pub struct AvatarSkinBaseTemplateBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> AvatarSkinBaseTemplateBuilder<'a, 'b, A> { + #[inline] + pub fn add_id(&mut self, id: u32) { + self.fbb_.push_slot::(AvatarSkinBaseTemplate::VT_ID, id, 0); + } + #[inline] + pub fn add_server_only_0(&mut self, server_only_0: i32) { + self.fbb_.push_slot::(AvatarSkinBaseTemplate::VT_SERVER_ONLY_0, server_only_0, 0); + } + #[inline] + pub fn add_DLFHPHCLIBA(&mut self, DLFHPHCLIBA: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(AvatarSkinBaseTemplate::VT_DLFHPHCLIBA, DLFHPHCLIBA); + } + #[inline] + pub fn add_NFIEGMLEEFE(&mut self, NFIEGMLEEFE: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(AvatarSkinBaseTemplate::VT_NFIEGMLEEFE, NFIEGMLEEFE); + } + #[inline] + pub fn add_avatar_id(&mut self, avatar_id: u32) { + self.fbb_.push_slot::(AvatarSkinBaseTemplate::VT_AVATAR_ID, avatar_id, 0); + } + #[inline] + pub fn add_server_only_1(&mut self, server_only_1: i32) { + self.fbb_.push_slot::(AvatarSkinBaseTemplate::VT_SERVER_ONLY_1, server_only_1, 0); + } + #[inline] + pub fn add_server_only_2(&mut self, server_only_2: i32) { + self.fbb_.push_slot::(AvatarSkinBaseTemplate::VT_SERVER_ONLY_2, server_only_2, 0); + } + #[inline] + pub fn add_server_only_3(&mut self, server_only_3: i32) { + self.fbb_.push_slot::(AvatarSkinBaseTemplate::VT_SERVER_ONLY_3, server_only_3, 0); + } + #[inline] + pub fn add_GMBBOEGOEPH(&mut self, GMBBOEGOEPH: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(AvatarSkinBaseTemplate::VT_GMBBOEGOEPH, GMBBOEGOEPH); + } + #[inline] + pub fn add_HMIOIBHJGCM(&mut self, HMIOIBHJGCM: flatbuffers::WIPOffset>>) { + self.fbb_.push_slot_always::>(AvatarSkinBaseTemplate::VT_HMIOIBHJGCM, HMIOIBHJGCM); + } + #[inline] + pub fn add_server_only_4(&mut self, server_only_4: i32) { + self.fbb_.push_slot::(AvatarSkinBaseTemplate::VT_SERVER_ONLY_4, server_only_4, 0); + } + #[inline] + pub fn add_OEMHKAENMHN(&mut self, OEMHKAENMHN: i32) { + self.fbb_.push_slot::(AvatarSkinBaseTemplate::VT_OEMHKAENMHN, OEMHKAENMHN, 0); + } + #[inline] + pub fn add_FGJJELBGBBC(&mut self, FGJJELBGBBC: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(AvatarSkinBaseTemplate::VT_FGJJELBGBBC, FGJJELBGBBC); + } + #[inline] + pub fn add_FKBJLMBAPDI(&mut self, FKBJLMBAPDI: i32) { + self.fbb_.push_slot::(AvatarSkinBaseTemplate::VT_FKBJLMBAPDI, FKBJLMBAPDI, 0); + } + #[inline] + pub fn add_server_only_5(&mut self, server_only_5: i32) { + self.fbb_.push_slot::(AvatarSkinBaseTemplate::VT_SERVER_ONLY_5, server_only_5, 0); + } + #[inline] + pub fn add_server_only_6(&mut self, server_only_6: i32) { + self.fbb_.push_slot::(AvatarSkinBaseTemplate::VT_SERVER_ONLY_6, server_only_6, 0); + } + #[inline] + pub fn add_server_only_7(&mut self, server_only_7: i32) { + self.fbb_.push_slot::(AvatarSkinBaseTemplate::VT_SERVER_ONLY_7, server_only_7, 0); + } + #[inline] + pub fn add_server_only_8(&mut self, server_only_8: i32) { + self.fbb_.push_slot::(AvatarSkinBaseTemplate::VT_SERVER_ONLY_8, server_only_8, 0); + } + #[inline] + pub fn add_server_only_9(&mut self, server_only_9: i32) { + self.fbb_.push_slot::(AvatarSkinBaseTemplate::VT_SERVER_ONLY_9, server_only_9, 0); + } + #[inline] + pub fn add_DIGLJDFKAMN(&mut self, DIGLJDFKAMN: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(AvatarSkinBaseTemplate::VT_DIGLJDFKAMN, DIGLJDFKAMN); + } + #[inline] + pub fn add_BKFKIDCLHKL(&mut self, BKFKIDCLHKL: i32) { + self.fbb_.push_slot::(AvatarSkinBaseTemplate::VT_BKFKIDCLHKL, BKFKIDCLHKL, 0); + } + #[inline] + pub fn add_FHJDONJMNKP(&mut self, FHJDONJMNKP: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(AvatarSkinBaseTemplate::VT_FHJDONJMNKP, FHJDONJMNKP); + } + #[inline] + pub fn add_AHHLKMJEEAE(&mut self, AHHLKMJEEAE: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(AvatarSkinBaseTemplate::VT_AHHLKMJEEAE, AHHLKMJEEAE); + } + #[inline] + pub fn add_HPMCPJGPKJB(&mut self, HPMCPJGPKJB: i32) { + self.fbb_.push_slot::(AvatarSkinBaseTemplate::VT_HPMCPJGPKJB, HPMCPJGPKJB, 0); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> AvatarSkinBaseTemplateBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + AvatarSkinBaseTemplateBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for AvatarSkinBaseTemplate<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("AvatarSkinBaseTemplate"); + ds.field("id", &self.id()); + ds.field("server_only_0", &self.server_only_0()); + ds.field("DLFHPHCLIBA", &self.DLFHPHCLIBA()); + ds.field("NFIEGMLEEFE", &self.NFIEGMLEEFE()); + ds.field("avatar_id", &self.avatar_id()); + ds.field("server_only_1", &self.server_only_1()); + ds.field("server_only_2", &self.server_only_2()); + ds.field("server_only_3", &self.server_only_3()); + ds.field("GMBBOEGOEPH", &self.GMBBOEGOEPH()); + ds.field("HMIOIBHJGCM", &self.HMIOIBHJGCM()); + ds.field("server_only_4", &self.server_only_4()); + ds.field("OEMHKAENMHN", &self.OEMHKAENMHN()); + ds.field("FGJJELBGBBC", &self.FGJJELBGBBC()); + ds.field("FKBJLMBAPDI", &self.FKBJLMBAPDI()); + ds.field("server_only_5", &self.server_only_5()); + ds.field("server_only_6", &self.server_only_6()); + ds.field("server_only_7", &self.server_only_7()); + ds.field("server_only_8", &self.server_only_8()); + ds.field("server_only_9", &self.server_only_9()); + ds.field("DIGLJDFKAMN", &self.DIGLJDFKAMN()); + ds.field("BKFKIDCLHKL", &self.BKFKIDCLHKL()); + ds.field("FHJDONJMNKP", &self.FHJDONJMNKP()); + ds.field("AHHLKMJEEAE", &self.AHHLKMJEEAE()); + ds.field("HPMCPJGPKJB", &self.HPMCPJGPKJB()); + ds.finish() + } +} +pub enum AvatarSkinBaseTemplateTbOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct AvatarSkinBaseTemplateTb<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for AvatarSkinBaseTemplateTb<'a> { + type Inner = AvatarSkinBaseTemplateTb<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> AvatarSkinBaseTemplateTb<'a> { + pub const VT_DATA: flatbuffers::VOffsetT = 4; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + AvatarSkinBaseTemplateTb { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args AvatarSkinBaseTemplateTbArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = AvatarSkinBaseTemplateTbBuilder::new(_fbb); + if let Some(x) = args.data { builder.add_data(x); } + builder.finish() + } + + + #[inline] + pub fn data(&self) -> Option>>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(AvatarSkinBaseTemplateTb::VT_DATA, None)} + } +} + +impl flatbuffers::Verifiable for AvatarSkinBaseTemplateTb<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::>>>("data", Self::VT_DATA, false)? + .finish(); + Ok(()) + } +} +pub struct AvatarSkinBaseTemplateTbArgs<'a> { + pub data: Option>>>>, +} +impl<'a> Default for AvatarSkinBaseTemplateTbArgs<'a> { + #[inline] + fn default() -> Self { + AvatarSkinBaseTemplateTbArgs { + data: None, + } + } +} + +pub struct AvatarSkinBaseTemplateTbBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> AvatarSkinBaseTemplateTbBuilder<'a, 'b, A> { + #[inline] + pub fn add_data(&mut self, data: flatbuffers::WIPOffset>>>) { + self.fbb_.push_slot_always::>(AvatarSkinBaseTemplateTb::VT_DATA, data); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> AvatarSkinBaseTemplateTbBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + AvatarSkinBaseTemplateTbBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for AvatarSkinBaseTemplateTb<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("AvatarSkinBaseTemplateTb"); + ds.field("data", &self.data()); + ds.finish() + } +} diff --git a/lib/config/gen_flatbuffers/battle_group_config_template_generated.rs b/lib/config/gen_flatbuffers/battle_group_config_template_generated.rs new file mode 100644 index 0000000..b9069a8 --- /dev/null +++ b/lib/config/gen_flatbuffers/battle_group_config_template_generated.rs @@ -0,0 +1,392 @@ +// automatically generated by the FlatBuffers compiler, do not modify + + +// @generated + +use core::mem; +use core::cmp::Ordering; + +extern crate flatbuffers; +use self::flatbuffers::{EndianScalar, Follow}; + +pub enum BattleGroupConfigTemplateOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct BattleGroupConfigTemplate<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for BattleGroupConfigTemplate<'a> { + type Inner = BattleGroupConfigTemplate<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> BattleGroupConfigTemplate<'a> { + pub const VT_ID: flatbuffers::VOffsetT = 4; + pub const VT_QUEST_ID: flatbuffers::VOffsetT = 6; + pub const VT_UNK_1: flatbuffers::VOffsetT = 8; + pub const VT_UNK_2: flatbuffers::VOffsetT = 10; + pub const VT_UNK_3: flatbuffers::VOffsetT = 12; + pub const VT_UNK_4: flatbuffers::VOffsetT = 14; + pub const VT_UNK_5: flatbuffers::VOffsetT = 16; + pub const VT_UNK_6: flatbuffers::VOffsetT = 18; + pub const VT_BATTLE_EVENT_ID: flatbuffers::VOffsetT = 20; + pub const VT_UNK_8: flatbuffers::VOffsetT = 22; + pub const VT_UNK_9: flatbuffers::VOffsetT = 24; + pub const VT_UNK_10: flatbuffers::VOffsetT = 26; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + BattleGroupConfigTemplate { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args BattleGroupConfigTemplateArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = BattleGroupConfigTemplateBuilder::new(_fbb); + if let Some(x) = args.unk_10 { builder.add_unk_10(x); } + builder.add_battle_event_id(args.battle_event_id); + if let Some(x) = args.unk_6 { builder.add_unk_6(x); } + if let Some(x) = args.unk_5 { builder.add_unk_5(x); } + if let Some(x) = args.unk_4 { builder.add_unk_4(x); } + builder.add_unk_3(args.unk_3); + if let Some(x) = args.unk_2 { builder.add_unk_2(x); } + builder.add_unk_1(args.unk_1); + builder.add_quest_id(args.quest_id); + builder.add_id(args.id); + builder.add_unk_9(args.unk_9); + builder.add_unk_8(args.unk_8); + builder.finish() + } + + + #[inline] + pub fn id(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(BattleGroupConfigTemplate::VT_ID, Some(0)).unwrap()} + } + #[inline] + pub fn quest_id(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(BattleGroupConfigTemplate::VT_QUEST_ID, Some(0)).unwrap()} + } + #[inline] + pub fn unk_1(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(BattleGroupConfigTemplate::VT_UNK_1, Some(0)).unwrap()} + } + #[inline] + pub fn unk_2(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(BattleGroupConfigTemplate::VT_UNK_2, None)} + } + #[inline] + pub fn unk_3(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(BattleGroupConfigTemplate::VT_UNK_3, Some(0)).unwrap()} + } + #[inline] + pub fn unk_4(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(BattleGroupConfigTemplate::VT_UNK_4, None)} + } + #[inline] + pub fn unk_5(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(BattleGroupConfigTemplate::VT_UNK_5, None)} + } + #[inline] + pub fn unk_6(&self) -> Option>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(BattleGroupConfigTemplate::VT_UNK_6, None)} + } + #[inline] + pub fn battle_event_id(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(BattleGroupConfigTemplate::VT_BATTLE_EVENT_ID, Some(0)).unwrap()} + } + #[inline] + pub fn unk_8(&self) -> bool { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(BattleGroupConfigTemplate::VT_UNK_8, Some(false)).unwrap()} + } + #[inline] + pub fn unk_9(&self) -> bool { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(BattleGroupConfigTemplate::VT_UNK_9, Some(false)).unwrap()} + } + #[inline] + pub fn unk_10(&self) -> Option>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(BattleGroupConfigTemplate::VT_UNK_10, None)} + } +} + +impl flatbuffers::Verifiable for BattleGroupConfigTemplate<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::("id", Self::VT_ID, false)? + .visit_field::("quest_id", Self::VT_QUEST_ID, false)? + .visit_field::("unk_1", Self::VT_UNK_1, false)? + .visit_field::>("unk_2", Self::VT_UNK_2, false)? + .visit_field::("unk_3", Self::VT_UNK_3, false)? + .visit_field::>("unk_4", Self::VT_UNK_4, false)? + .visit_field::>("unk_5", Self::VT_UNK_5, false)? + .visit_field::>>>("unk_6", Self::VT_UNK_6, false)? + .visit_field::("battle_event_id", Self::VT_BATTLE_EVENT_ID, false)? + .visit_field::("unk_8", Self::VT_UNK_8, false)? + .visit_field::("unk_9", Self::VT_UNK_9, false)? + .visit_field::>>>("unk_10", Self::VT_UNK_10, false)? + .finish(); + Ok(()) + } +} +pub struct BattleGroupConfigTemplateArgs<'a> { + pub id: u32, + pub quest_id: u32, + pub unk_1: i32, + pub unk_2: Option>, + pub unk_3: i32, + pub unk_4: Option>, + pub unk_5: Option>, + pub unk_6: Option>>>, + pub battle_event_id: u32, + pub unk_8: bool, + pub unk_9: bool, + pub unk_10: Option>>>, +} +impl<'a> Default for BattleGroupConfigTemplateArgs<'a> { + #[inline] + fn default() -> Self { + BattleGroupConfigTemplateArgs { + id: 0, + quest_id: 0, + unk_1: 0, + unk_2: None, + unk_3: 0, + unk_4: None, + unk_5: None, + unk_6: None, + battle_event_id: 0, + unk_8: false, + unk_9: false, + unk_10: None, + } + } +} + +pub struct BattleGroupConfigTemplateBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> BattleGroupConfigTemplateBuilder<'a, 'b, A> { + #[inline] + pub fn add_id(&mut self, id: u32) { + self.fbb_.push_slot::(BattleGroupConfigTemplate::VT_ID, id, 0); + } + #[inline] + pub fn add_quest_id(&mut self, quest_id: u32) { + self.fbb_.push_slot::(BattleGroupConfigTemplate::VT_QUEST_ID, quest_id, 0); + } + #[inline] + pub fn add_unk_1(&mut self, unk_1: i32) { + self.fbb_.push_slot::(BattleGroupConfigTemplate::VT_UNK_1, unk_1, 0); + } + #[inline] + pub fn add_unk_2(&mut self, unk_2: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(BattleGroupConfigTemplate::VT_UNK_2, unk_2); + } + #[inline] + pub fn add_unk_3(&mut self, unk_3: i32) { + self.fbb_.push_slot::(BattleGroupConfigTemplate::VT_UNK_3, unk_3, 0); + } + #[inline] + pub fn add_unk_4(&mut self, unk_4: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(BattleGroupConfigTemplate::VT_UNK_4, unk_4); + } + #[inline] + pub fn add_unk_5(&mut self, unk_5: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(BattleGroupConfigTemplate::VT_UNK_5, unk_5); + } + #[inline] + pub fn add_unk_6(&mut self, unk_6: flatbuffers::WIPOffset>>) { + self.fbb_.push_slot_always::>(BattleGroupConfigTemplate::VT_UNK_6, unk_6); + } + #[inline] + pub fn add_battle_event_id(&mut self, battle_event_id: u32) { + self.fbb_.push_slot::(BattleGroupConfigTemplate::VT_BATTLE_EVENT_ID, battle_event_id, 0); + } + #[inline] + pub fn add_unk_8(&mut self, unk_8: bool) { + self.fbb_.push_slot::(BattleGroupConfigTemplate::VT_UNK_8, unk_8, false); + } + #[inline] + pub fn add_unk_9(&mut self, unk_9: bool) { + self.fbb_.push_slot::(BattleGroupConfigTemplate::VT_UNK_9, unk_9, false); + } + #[inline] + pub fn add_unk_10(&mut self, unk_10: flatbuffers::WIPOffset>>) { + self.fbb_.push_slot_always::>(BattleGroupConfigTemplate::VT_UNK_10, unk_10); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> BattleGroupConfigTemplateBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + BattleGroupConfigTemplateBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for BattleGroupConfigTemplate<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("BattleGroupConfigTemplate"); + ds.field("id", &self.id()); + ds.field("quest_id", &self.quest_id()); + ds.field("unk_1", &self.unk_1()); + ds.field("unk_2", &self.unk_2()); + ds.field("unk_3", &self.unk_3()); + ds.field("unk_4", &self.unk_4()); + ds.field("unk_5", &self.unk_5()); + ds.field("unk_6", &self.unk_6()); + ds.field("battle_event_id", &self.battle_event_id()); + ds.field("unk_8", &self.unk_8()); + ds.field("unk_9", &self.unk_9()); + ds.field("unk_10", &self.unk_10()); + ds.finish() + } +} +pub enum BattleGroupConfigTemplateTbOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct BattleGroupConfigTemplateTb<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for BattleGroupConfigTemplateTb<'a> { + type Inner = BattleGroupConfigTemplateTb<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> BattleGroupConfigTemplateTb<'a> { + pub const VT_DATA: flatbuffers::VOffsetT = 4; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + BattleGroupConfigTemplateTb { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args BattleGroupConfigTemplateTbArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = BattleGroupConfigTemplateTbBuilder::new(_fbb); + if let Some(x) = args.data { builder.add_data(x); } + builder.finish() + } + + + #[inline] + pub fn data(&self) -> Option>>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(BattleGroupConfigTemplateTb::VT_DATA, None)} + } +} + +impl flatbuffers::Verifiable for BattleGroupConfigTemplateTb<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::>>>("data", Self::VT_DATA, false)? + .finish(); + Ok(()) + } +} +pub struct BattleGroupConfigTemplateTbArgs<'a> { + pub data: Option>>>>, +} +impl<'a> Default for BattleGroupConfigTemplateTbArgs<'a> { + #[inline] + fn default() -> Self { + BattleGroupConfigTemplateTbArgs { + data: None, + } + } +} + +pub struct BattleGroupConfigTemplateTbBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> BattleGroupConfigTemplateTbBuilder<'a, 'b, A> { + #[inline] + pub fn add_data(&mut self, data: flatbuffers::WIPOffset>>>) { + self.fbb_.push_slot_always::>(BattleGroupConfigTemplateTb::VT_DATA, data); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> BattleGroupConfigTemplateTbBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + BattleGroupConfigTemplateTbBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for BattleGroupConfigTemplateTb<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("BattleGroupConfigTemplateTb"); + ds.field("data", &self.data()); + ds.finish() + } +} diff --git a/lib/config/gen_flatbuffers/condition_config_template_generated.rs b/lib/config/gen_flatbuffers/condition_config_template_generated.rs new file mode 100644 index 0000000..fe21853 --- /dev/null +++ b/lib/config/gen_flatbuffers/condition_config_template_generated.rs @@ -0,0 +1,307 @@ +// automatically generated by the FlatBuffers compiler, do not modify + + +// @generated + +use core::mem; +use core::cmp::Ordering; + +extern crate flatbuffers; +use self::flatbuffers::{EndianScalar, Follow}; + +pub enum ConditionConfigTemplateOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct ConditionConfigTemplate<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for ConditionConfigTemplate<'a> { + type Inner = ConditionConfigTemplate<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> ConditionConfigTemplate<'a> { + pub const VT_CONDITION_ID: flatbuffers::VOffsetT = 4; + pub const VT_ARGS: flatbuffers::VOffsetT = 6; + pub const VT_COMMENTARY: flatbuffers::VOffsetT = 8; + pub const VT_UNK_2: flatbuffers::VOffsetT = 10; + pub const VT_STATIS_TYPE: flatbuffers::VOffsetT = 12; + pub const VT_TARGET_NUM: flatbuffers::VOffsetT = 14; + pub const VT_TYPE_: flatbuffers::VOffsetT = 16; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + ConditionConfigTemplate { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args ConditionConfigTemplateArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = ConditionConfigTemplateBuilder::new(_fbb); + builder.add_type_(args.type_); + builder.add_target_num(args.target_num); + builder.add_statis_type(args.statis_type); + if let Some(x) = args.unk_2 { builder.add_unk_2(x); } + if let Some(x) = args.commentary { builder.add_commentary(x); } + if let Some(x) = args.args { builder.add_args(x); } + builder.add_condition_id(args.condition_id); + builder.finish() + } + + + #[inline] + pub fn condition_id(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(ConditionConfigTemplate::VT_CONDITION_ID, Some(0)).unwrap()} + } + #[inline] + pub fn args(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(ConditionConfigTemplate::VT_ARGS, None)} + } + #[inline] + pub fn commentary(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(ConditionConfigTemplate::VT_COMMENTARY, None)} + } + #[inline] + pub fn unk_2(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(ConditionConfigTemplate::VT_UNK_2, None)} + } + #[inline] + pub fn statis_type(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(ConditionConfigTemplate::VT_STATIS_TYPE, Some(0)).unwrap()} + } + #[inline] + pub fn target_num(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(ConditionConfigTemplate::VT_TARGET_NUM, Some(0)).unwrap()} + } + #[inline] + pub fn type_(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(ConditionConfigTemplate::VT_TYPE_, Some(0)).unwrap()} + } +} + +impl flatbuffers::Verifiable for ConditionConfigTemplate<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::("condition_id", Self::VT_CONDITION_ID, false)? + .visit_field::>("args", Self::VT_ARGS, false)? + .visit_field::>("commentary", Self::VT_COMMENTARY, false)? + .visit_field::>>("unk_2", Self::VT_UNK_2, false)? + .visit_field::("statis_type", Self::VT_STATIS_TYPE, false)? + .visit_field::("target_num", Self::VT_TARGET_NUM, false)? + .visit_field::("type_", Self::VT_TYPE_, false)? + .finish(); + Ok(()) + } +} +pub struct ConditionConfigTemplateArgs<'a> { + pub condition_id: i32, + pub args: Option>, + pub commentary: Option>, + pub unk_2: Option>>, + pub statis_type: u32, + pub target_num: u32, + pub type_: i32, +} +impl<'a> Default for ConditionConfigTemplateArgs<'a> { + #[inline] + fn default() -> Self { + ConditionConfigTemplateArgs { + condition_id: 0, + args: None, + commentary: None, + unk_2: None, + statis_type: 0, + target_num: 0, + type_: 0, + } + } +} + +pub struct ConditionConfigTemplateBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> ConditionConfigTemplateBuilder<'a, 'b, A> { + #[inline] + pub fn add_condition_id(&mut self, condition_id: i32) { + self.fbb_.push_slot::(ConditionConfigTemplate::VT_CONDITION_ID, condition_id, 0); + } + #[inline] + pub fn add_args(&mut self, args: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(ConditionConfigTemplate::VT_ARGS, args); + } + #[inline] + pub fn add_commentary(&mut self, commentary: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(ConditionConfigTemplate::VT_COMMENTARY, commentary); + } + #[inline] + pub fn add_unk_2(&mut self, unk_2: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(ConditionConfigTemplate::VT_UNK_2, unk_2); + } + #[inline] + pub fn add_statis_type(&mut self, statis_type: u32) { + self.fbb_.push_slot::(ConditionConfigTemplate::VT_STATIS_TYPE, statis_type, 0); + } + #[inline] + pub fn add_target_num(&mut self, target_num: u32) { + self.fbb_.push_slot::(ConditionConfigTemplate::VT_TARGET_NUM, target_num, 0); + } + #[inline] + pub fn add_type_(&mut self, type_: i32) { + self.fbb_.push_slot::(ConditionConfigTemplate::VT_TYPE_, type_, 0); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> ConditionConfigTemplateBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + ConditionConfigTemplateBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for ConditionConfigTemplate<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("ConditionConfigTemplate"); + ds.field("condition_id", &self.condition_id()); + ds.field("args", &self.args()); + ds.field("commentary", &self.commentary()); + ds.field("unk_2", &self.unk_2()); + ds.field("statis_type", &self.statis_type()); + ds.field("target_num", &self.target_num()); + ds.field("type_", &self.type_()); + ds.finish() + } +} +pub enum ConditionConfigTemplateTbOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct ConditionConfigTemplateTb<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for ConditionConfigTemplateTb<'a> { + type Inner = ConditionConfigTemplateTb<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> ConditionConfigTemplateTb<'a> { + pub const VT_DATA: flatbuffers::VOffsetT = 4; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + ConditionConfigTemplateTb { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args ConditionConfigTemplateTbArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = ConditionConfigTemplateTbBuilder::new(_fbb); + if let Some(x) = args.data { builder.add_data(x); } + builder.finish() + } + + + #[inline] + pub fn data(&self) -> Option>>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(ConditionConfigTemplateTb::VT_DATA, None)} + } +} + +impl flatbuffers::Verifiable for ConditionConfigTemplateTb<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::>>>("data", Self::VT_DATA, false)? + .finish(); + Ok(()) + } +} +pub struct ConditionConfigTemplateTbArgs<'a> { + pub data: Option>>>>, +} +impl<'a> Default for ConditionConfigTemplateTbArgs<'a> { + #[inline] + fn default() -> Self { + ConditionConfigTemplateTbArgs { + data: None, + } + } +} + +pub struct ConditionConfigTemplateTbBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> ConditionConfigTemplateTbBuilder<'a, 'b, A> { + #[inline] + pub fn add_data(&mut self, data: flatbuffers::WIPOffset>>>) { + self.fbb_.push_slot_always::>(ConditionConfigTemplateTb::VT_DATA, data); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> ConditionConfigTemplateTbBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + ConditionConfigTemplateTbBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for ConditionConfigTemplateTb<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("ConditionConfigTemplateTb"); + ds.field("data", &self.data()); + ds.finish() + } +} diff --git a/lib/config/gen_flatbuffers/equipment_level_template_generated.rs b/lib/config/gen_flatbuffers/equipment_level_template_generated.rs new file mode 100644 index 0000000..b2c305c --- /dev/null +++ b/lib/config/gen_flatbuffers/equipment_level_template_generated.rs @@ -0,0 +1,307 @@ +// automatically generated by the FlatBuffers compiler, do not modify + + +// @generated + +use core::mem; +use core::cmp::Ordering; + +extern crate flatbuffers; +use self::flatbuffers::{EndianScalar, Follow}; + +pub enum EquipmentLevelTemplateOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct EquipmentLevelTemplate<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for EquipmentLevelTemplate<'a> { + type Inner = EquipmentLevelTemplate<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> EquipmentLevelTemplate<'a> { + pub const VT_RARITY: flatbuffers::VOffsetT = 4; + pub const VT_LEVEL: flatbuffers::VOffsetT = 6; + pub const VT_PROPERTY_RATE: flatbuffers::VOffsetT = 8; + pub const VT_UNK_3: flatbuffers::VOffsetT = 10; + pub const VT_UNK_4: flatbuffers::VOffsetT = 12; + pub const VT_UNK_5: flatbuffers::VOffsetT = 14; + pub const VT_UNK_6: flatbuffers::VOffsetT = 16; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + EquipmentLevelTemplate { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args EquipmentLevelTemplateArgs + ) -> flatbuffers::WIPOffset> { + let mut builder = EquipmentLevelTemplateBuilder::new(_fbb); + builder.add_unk_6(args.unk_6); + builder.add_unk_5(args.unk_5); + builder.add_unk_4(args.unk_4); + builder.add_unk_3(args.unk_3); + builder.add_property_rate(args.property_rate); + builder.add_level(args.level); + builder.add_rarity(args.rarity); + builder.finish() + } + + + #[inline] + pub fn rarity(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(EquipmentLevelTemplate::VT_RARITY, Some(0)).unwrap()} + } + #[inline] + pub fn level(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(EquipmentLevelTemplate::VT_LEVEL, Some(0)).unwrap()} + } + #[inline] + pub fn property_rate(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(EquipmentLevelTemplate::VT_PROPERTY_RATE, Some(0)).unwrap()} + } + #[inline] + pub fn unk_3(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(EquipmentLevelTemplate::VT_UNK_3, Some(0)).unwrap()} + } + #[inline] + pub fn unk_4(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(EquipmentLevelTemplate::VT_UNK_4, Some(0)).unwrap()} + } + #[inline] + pub fn unk_5(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(EquipmentLevelTemplate::VT_UNK_5, Some(0)).unwrap()} + } + #[inline] + pub fn unk_6(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(EquipmentLevelTemplate::VT_UNK_6, Some(0)).unwrap()} + } +} + +impl flatbuffers::Verifiable for EquipmentLevelTemplate<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::("rarity", Self::VT_RARITY, false)? + .visit_field::("level", Self::VT_LEVEL, false)? + .visit_field::("property_rate", Self::VT_PROPERTY_RATE, false)? + .visit_field::("unk_3", Self::VT_UNK_3, false)? + .visit_field::("unk_4", Self::VT_UNK_4, false)? + .visit_field::("unk_5", Self::VT_UNK_5, false)? + .visit_field::("unk_6", Self::VT_UNK_6, false)? + .finish(); + Ok(()) + } +} +pub struct EquipmentLevelTemplateArgs { + pub rarity: u32, + pub level: u32, + pub property_rate: u32, + pub unk_3: i32, + pub unk_4: i32, + pub unk_5: i32, + pub unk_6: i32, +} +impl<'a> Default for EquipmentLevelTemplateArgs { + #[inline] + fn default() -> Self { + EquipmentLevelTemplateArgs { + rarity: 0, + level: 0, + property_rate: 0, + unk_3: 0, + unk_4: 0, + unk_5: 0, + unk_6: 0, + } + } +} + +pub struct EquipmentLevelTemplateBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> EquipmentLevelTemplateBuilder<'a, 'b, A> { + #[inline] + pub fn add_rarity(&mut self, rarity: u32) { + self.fbb_.push_slot::(EquipmentLevelTemplate::VT_RARITY, rarity, 0); + } + #[inline] + pub fn add_level(&mut self, level: u32) { + self.fbb_.push_slot::(EquipmentLevelTemplate::VT_LEVEL, level, 0); + } + #[inline] + pub fn add_property_rate(&mut self, property_rate: u32) { + self.fbb_.push_slot::(EquipmentLevelTemplate::VT_PROPERTY_RATE, property_rate, 0); + } + #[inline] + pub fn add_unk_3(&mut self, unk_3: i32) { + self.fbb_.push_slot::(EquipmentLevelTemplate::VT_UNK_3, unk_3, 0); + } + #[inline] + pub fn add_unk_4(&mut self, unk_4: i32) { + self.fbb_.push_slot::(EquipmentLevelTemplate::VT_UNK_4, unk_4, 0); + } + #[inline] + pub fn add_unk_5(&mut self, unk_5: i32) { + self.fbb_.push_slot::(EquipmentLevelTemplate::VT_UNK_5, unk_5, 0); + } + #[inline] + pub fn add_unk_6(&mut self, unk_6: i32) { + self.fbb_.push_slot::(EquipmentLevelTemplate::VT_UNK_6, unk_6, 0); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> EquipmentLevelTemplateBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + EquipmentLevelTemplateBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for EquipmentLevelTemplate<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("EquipmentLevelTemplate"); + ds.field("rarity", &self.rarity()); + ds.field("level", &self.level()); + ds.field("property_rate", &self.property_rate()); + ds.field("unk_3", &self.unk_3()); + ds.field("unk_4", &self.unk_4()); + ds.field("unk_5", &self.unk_5()); + ds.field("unk_6", &self.unk_6()); + ds.finish() + } +} +pub enum EquipmentLevelTemplateTbOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct EquipmentLevelTemplateTb<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for EquipmentLevelTemplateTb<'a> { + type Inner = EquipmentLevelTemplateTb<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> EquipmentLevelTemplateTb<'a> { + pub const VT_DATA: flatbuffers::VOffsetT = 4; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + EquipmentLevelTemplateTb { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args EquipmentLevelTemplateTbArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = EquipmentLevelTemplateTbBuilder::new(_fbb); + if let Some(x) = args.data { builder.add_data(x); } + builder.finish() + } + + + #[inline] + pub fn data(&self) -> Option>>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(EquipmentLevelTemplateTb::VT_DATA, None)} + } +} + +impl flatbuffers::Verifiable for EquipmentLevelTemplateTb<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::>>>("data", Self::VT_DATA, false)? + .finish(); + Ok(()) + } +} +pub struct EquipmentLevelTemplateTbArgs<'a> { + pub data: Option>>>>, +} +impl<'a> Default for EquipmentLevelTemplateTbArgs<'a> { + #[inline] + fn default() -> Self { + EquipmentLevelTemplateTbArgs { + data: None, + } + } +} + +pub struct EquipmentLevelTemplateTbBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> EquipmentLevelTemplateTbBuilder<'a, 'b, A> { + #[inline] + pub fn add_data(&mut self, data: flatbuffers::WIPOffset>>>) { + self.fbb_.push_slot_always::>(EquipmentLevelTemplateTb::VT_DATA, data); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> EquipmentLevelTemplateTbBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + EquipmentLevelTemplateTbBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for EquipmentLevelTemplateTb<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("EquipmentLevelTemplateTb"); + ds.field("data", &self.data()); + ds.finish() + } +} diff --git a/lib/config/gen_flatbuffers/equipment_suit_template_generated.rs b/lib/config/gen_flatbuffers/equipment_suit_template_generated.rs new file mode 100644 index 0000000..b6b8419 --- /dev/null +++ b/lib/config/gen_flatbuffers/equipment_suit_template_generated.rs @@ -0,0 +1,809 @@ +// automatically generated by the FlatBuffers compiler, do not modify + + +// @generated + +use core::mem; +use core::cmp::Ordering; + +extern crate flatbuffers; +use self::flatbuffers::{EndianScalar, Follow}; + +// struct Property, aligned to 4 +#[repr(transparent)] +#[derive(Clone, Copy, PartialEq)] +pub struct Property(pub [u8; 8]); +impl Default for Property { + fn default() -> Self { + Self([0; 8]) + } +} +impl core::fmt::Debug for Property { + fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { + f.debug_struct("Property") + .field("property", &self.property()) + .field("value", &self.value()) + .finish() + } +} + +impl flatbuffers::SimpleToVerifyInSlice for Property {} +impl<'a> flatbuffers::Follow<'a> for Property { + type Inner = &'a Property; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + <&'a Property>::follow(buf, loc) + } +} +impl<'a> flatbuffers::Follow<'a> for &'a Property { + type Inner = &'a Property; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + flatbuffers::follow_cast_ref::(buf, loc) + } +} +impl<'b> flatbuffers::Push for Property { + type Output = Property; + #[inline] + unsafe fn push(&self, dst: &mut [u8], _written_len: usize) { + let src = ::core::slice::from_raw_parts(self as *const Property as *const u8, ::size()); + dst.copy_from_slice(src); + } + #[inline] + fn alignment() -> flatbuffers::PushAlignment { + flatbuffers::PushAlignment::new(4) + } +} + +impl<'a> flatbuffers::Verifiable for Property { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.in_buffer::(pos) + } +} + +impl<'a> Property { + #[allow(clippy::too_many_arguments)] + pub fn new( + property: u32, + value: i32, + ) -> Self { + let mut s = Self([0; 8]); + s.set_property(property); + s.set_value(value); + s + } + + pub fn property(&self) -> u32 { + let mut mem = core::mem::MaybeUninit::<::Scalar>::uninit(); + // Safety: + // Created from a valid Table for this object + // Which contains a valid value in this slot + EndianScalar::from_little_endian(unsafe { + core::ptr::copy_nonoverlapping( + self.0[0..].as_ptr(), + mem.as_mut_ptr() as *mut u8, + core::mem::size_of::<::Scalar>(), + ); + mem.assume_init() + }) + } + + pub fn set_property(&mut self, x: u32) { + let x_le = x.to_little_endian(); + // Safety: + // Created from a valid Table for this object + // Which contains a valid value in this slot + unsafe { + core::ptr::copy_nonoverlapping( + &x_le as *const _ as *const u8, + self.0[0..].as_mut_ptr(), + core::mem::size_of::<::Scalar>(), + ); + } + } + + pub fn value(&self) -> i32 { + let mut mem = core::mem::MaybeUninit::<::Scalar>::uninit(); + // Safety: + // Created from a valid Table for this object + // Which contains a valid value in this slot + EndianScalar::from_little_endian(unsafe { + core::ptr::copy_nonoverlapping( + self.0[4..].as_ptr(), + mem.as_mut_ptr() as *mut u8, + core::mem::size_of::<::Scalar>(), + ); + mem.assume_init() + }) + } + + pub fn set_value(&mut self, x: i32) { + let x_le = x.to_little_endian(); + // Safety: + // Created from a valid Table for this object + // Which contains a valid value in this slot + unsafe { + core::ptr::copy_nonoverlapping( + &x_le as *const _ as *const u8, + self.0[4..].as_mut_ptr(), + core::mem::size_of::<::Scalar>(), + ); + } + } + +} + +pub enum EquipmentSuitTemplateOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct EquipmentSuitTemplate<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for EquipmentSuitTemplate<'a> { + type Inner = EquipmentSuitTemplate<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> EquipmentSuitTemplate<'a> { + pub const VT_ID: flatbuffers::VOffsetT = 4; + pub const VT_NAME: flatbuffers::VOffsetT = 6; + pub const VT_PRIMARY_CONDITION: flatbuffers::VOffsetT = 8; + pub const VT_UNK_3: flatbuffers::VOffsetT = 10; + pub const VT_PRIMARY_SUIT_ABILITY: flatbuffers::VOffsetT = 12; + pub const VT_PRIMARY_DESCRIPTION: flatbuffers::VOffsetT = 14; + pub const VT_SECONDARY_CONDITION: flatbuffers::VOffsetT = 16; + pub const VT_UNK_7: flatbuffers::VOffsetT = 18; + pub const VT_SECONDARY_SUIT_ABILITY: flatbuffers::VOffsetT = 20; + pub const VT_SECONDARY_DESCRIPTION: flatbuffers::VOffsetT = 22; + pub const VT_SUIT_ICON: flatbuffers::VOffsetT = 24; + pub const VT_SUIT_STORY: flatbuffers::VOffsetT = 26; + pub const VT_SUIT_FILTER_OPTION: flatbuffers::VOffsetT = 28; + pub const VT_SUIT_ITEM_ICON: flatbuffers::VOffsetT = 30; + pub const VT_UNK_14: flatbuffers::VOffsetT = 32; + pub const VT_ORDER: flatbuffers::VOffsetT = 34; + pub const VT_UNK_16: flatbuffers::VOffsetT = 36; + pub const VT_UNK_17: flatbuffers::VOffsetT = 38; + pub const VT_UNK_18: flatbuffers::VOffsetT = 40; + pub const VT_UNK_19: flatbuffers::VOffsetT = 42; + pub const VT_UNK_20: flatbuffers::VOffsetT = 44; + pub const VT_UNK_21: flatbuffers::VOffsetT = 46; + pub const VT_PRIMARY_SUIT_PROPERTYS: flatbuffers::VOffsetT = 48; + pub const VT_UNK_23: flatbuffers::VOffsetT = 50; + pub const VT_UNK_24: flatbuffers::VOffsetT = 52; + pub const VT_UNK_25: flatbuffers::VOffsetT = 54; + pub const VT_UNK_26: flatbuffers::VOffsetT = 56; + pub const VT_UNK_27: flatbuffers::VOffsetT = 58; + pub const VT_TAG: flatbuffers::VOffsetT = 60; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + EquipmentSuitTemplate { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args EquipmentSuitTemplateArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = EquipmentSuitTemplateBuilder::new(_fbb); + if let Some(x) = args.tag { builder.add_tag(x); } + if let Some(x) = args.unk_27 { builder.add_unk_27(x); } + if let Some(x) = args.unk_26 { builder.add_unk_26(x); } + if let Some(x) = args.unk_25 { builder.add_unk_25(x); } + builder.add_unk_24(args.unk_24); + if let Some(x) = args.unk_23 { builder.add_unk_23(x); } + if let Some(x) = args.primary_suit_propertys { builder.add_primary_suit_propertys(x); } + builder.add_unk_21(args.unk_21); + builder.add_unk_20(args.unk_20); + builder.add_unk_19(args.unk_19); + builder.add_unk_18(args.unk_18); + builder.add_unk_17(args.unk_17); + builder.add_unk_16(args.unk_16); + builder.add_order(args.order); + builder.add_unk_14(args.unk_14); + if let Some(x) = args.suit_item_icon { builder.add_suit_item_icon(x); } + if let Some(x) = args.suit_filter_option { builder.add_suit_filter_option(x); } + if let Some(x) = args.suit_story { builder.add_suit_story(x); } + if let Some(x) = args.suit_icon { builder.add_suit_icon(x); } + if let Some(x) = args.secondary_description { builder.add_secondary_description(x); } + builder.add_secondary_suit_ability(args.secondary_suit_ability); + builder.add_unk_7(args.unk_7); + builder.add_secondary_condition(args.secondary_condition); + if let Some(x) = args.primary_description { builder.add_primary_description(x); } + builder.add_primary_suit_ability(args.primary_suit_ability); + builder.add_unk_3(args.unk_3); + builder.add_primary_condition(args.primary_condition); + if let Some(x) = args.name { builder.add_name(x); } + builder.add_id(args.id); + builder.finish() + } + + + #[inline] + pub fn id(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(EquipmentSuitTemplate::VT_ID, Some(0)).unwrap()} + } + #[inline] + pub fn name(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(EquipmentSuitTemplate::VT_NAME, None)} + } + #[inline] + pub fn primary_condition(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(EquipmentSuitTemplate::VT_PRIMARY_CONDITION, Some(0)).unwrap()} + } + #[inline] + pub fn unk_3(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(EquipmentSuitTemplate::VT_UNK_3, Some(0)).unwrap()} + } + #[inline] + pub fn primary_suit_ability(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(EquipmentSuitTemplate::VT_PRIMARY_SUIT_ABILITY, Some(0)).unwrap()} + } + #[inline] + pub fn primary_description(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(EquipmentSuitTemplate::VT_PRIMARY_DESCRIPTION, None)} + } + #[inline] + pub fn secondary_condition(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(EquipmentSuitTemplate::VT_SECONDARY_CONDITION, Some(0)).unwrap()} + } + #[inline] + pub fn unk_7(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(EquipmentSuitTemplate::VT_UNK_7, Some(0)).unwrap()} + } + #[inline] + pub fn secondary_suit_ability(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(EquipmentSuitTemplate::VT_SECONDARY_SUIT_ABILITY, Some(0)).unwrap()} + } + #[inline] + pub fn secondary_description(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(EquipmentSuitTemplate::VT_SECONDARY_DESCRIPTION, None)} + } + #[inline] + pub fn suit_icon(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(EquipmentSuitTemplate::VT_SUIT_ICON, None)} + } + #[inline] + pub fn suit_story(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(EquipmentSuitTemplate::VT_SUIT_STORY, None)} + } + #[inline] + pub fn suit_filter_option(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(EquipmentSuitTemplate::VT_SUIT_FILTER_OPTION, None)} + } + #[inline] + pub fn suit_item_icon(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(EquipmentSuitTemplate::VT_SUIT_ITEM_ICON, None)} + } + #[inline] + pub fn unk_14(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(EquipmentSuitTemplate::VT_UNK_14, Some(0)).unwrap()} + } + #[inline] + pub fn order(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(EquipmentSuitTemplate::VT_ORDER, Some(0)).unwrap()} + } + #[inline] + pub fn unk_16(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(EquipmentSuitTemplate::VT_UNK_16, Some(0)).unwrap()} + } + #[inline] + pub fn unk_17(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(EquipmentSuitTemplate::VT_UNK_17, Some(0)).unwrap()} + } + #[inline] + pub fn unk_18(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(EquipmentSuitTemplate::VT_UNK_18, Some(0)).unwrap()} + } + #[inline] + pub fn unk_19(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(EquipmentSuitTemplate::VT_UNK_19, Some(0)).unwrap()} + } + #[inline] + pub fn unk_20(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(EquipmentSuitTemplate::VT_UNK_20, Some(0)).unwrap()} + } + #[inline] + pub fn unk_21(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(EquipmentSuitTemplate::VT_UNK_21, Some(0)).unwrap()} + } + #[inline] + pub fn primary_suit_propertys(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(EquipmentSuitTemplate::VT_PRIMARY_SUIT_PROPERTYS, None)} + } + #[inline] + pub fn unk_23(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(EquipmentSuitTemplate::VT_UNK_23, None)} + } + #[inline] + pub fn unk_24(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(EquipmentSuitTemplate::VT_UNK_24, Some(0)).unwrap()} + } + #[inline] + pub fn unk_25(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(EquipmentSuitTemplate::VT_UNK_25, None)} + } + #[inline] + pub fn unk_26(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(EquipmentSuitTemplate::VT_UNK_26, None)} + } + #[inline] + pub fn unk_27(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(EquipmentSuitTemplate::VT_UNK_27, None)} + } + #[inline] + pub fn tag(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(EquipmentSuitTemplate::VT_TAG, None)} + } +} + +impl flatbuffers::Verifiable for EquipmentSuitTemplate<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::("id", Self::VT_ID, false)? + .visit_field::>("name", Self::VT_NAME, false)? + .visit_field::("primary_condition", Self::VT_PRIMARY_CONDITION, false)? + .visit_field::("unk_3", Self::VT_UNK_3, false)? + .visit_field::("primary_suit_ability", Self::VT_PRIMARY_SUIT_ABILITY, false)? + .visit_field::>("primary_description", Self::VT_PRIMARY_DESCRIPTION, false)? + .visit_field::("secondary_condition", Self::VT_SECONDARY_CONDITION, false)? + .visit_field::("unk_7", Self::VT_UNK_7, false)? + .visit_field::("secondary_suit_ability", Self::VT_SECONDARY_SUIT_ABILITY, false)? + .visit_field::>("secondary_description", Self::VT_SECONDARY_DESCRIPTION, false)? + .visit_field::>("suit_icon", Self::VT_SUIT_ICON, false)? + .visit_field::>("suit_story", Self::VT_SUIT_STORY, false)? + .visit_field::>("suit_filter_option", Self::VT_SUIT_FILTER_OPTION, false)? + .visit_field::>("suit_item_icon", Self::VT_SUIT_ITEM_ICON, false)? + .visit_field::("unk_14", Self::VT_UNK_14, false)? + .visit_field::("order", Self::VT_ORDER, false)? + .visit_field::("unk_16", Self::VT_UNK_16, false)? + .visit_field::("unk_17", Self::VT_UNK_17, false)? + .visit_field::("unk_18", Self::VT_UNK_18, false)? + .visit_field::("unk_19", Self::VT_UNK_19, false)? + .visit_field::("unk_20", Self::VT_UNK_20, false)? + .visit_field::("unk_21", Self::VT_UNK_21, false)? + .visit_field::>>("primary_suit_propertys", Self::VT_PRIMARY_SUIT_PROPERTYS, false)? + .visit_field::>>("unk_23", Self::VT_UNK_23, false)? + .visit_field::("unk_24", Self::VT_UNK_24, false)? + .visit_field::>>("unk_25", Self::VT_UNK_25, false)? + .visit_field::>>("unk_26", Self::VT_UNK_26, false)? + .visit_field::>>("unk_27", Self::VT_UNK_27, false)? + .visit_field::>("tag", Self::VT_TAG, false)? + .finish(); + Ok(()) + } +} +pub struct EquipmentSuitTemplateArgs<'a> { + pub id: u32, + pub name: Option>, + pub primary_condition: u32, + pub unk_3: i32, + pub primary_suit_ability: u32, + pub primary_description: Option>, + pub secondary_condition: u32, + pub unk_7: i32, + pub secondary_suit_ability: i32, + pub secondary_description: Option>, + pub suit_icon: Option>, + pub suit_story: Option>, + pub suit_filter_option: Option>, + pub suit_item_icon: Option>, + pub unk_14: i32, + pub order: i32, + pub unk_16: i32, + pub unk_17: i32, + pub unk_18: i32, + pub unk_19: i32, + pub unk_20: i32, + pub unk_21: i32, + pub primary_suit_propertys: Option>>, + pub unk_23: Option>>, + pub unk_24: i32, + pub unk_25: Option>>, + pub unk_26: Option>>, + pub unk_27: Option>>, + pub tag: Option>, +} +impl<'a> Default for EquipmentSuitTemplateArgs<'a> { + #[inline] + fn default() -> Self { + EquipmentSuitTemplateArgs { + id: 0, + name: None, + primary_condition: 0, + unk_3: 0, + primary_suit_ability: 0, + primary_description: None, + secondary_condition: 0, + unk_7: 0, + secondary_suit_ability: 0, + secondary_description: None, + suit_icon: None, + suit_story: None, + suit_filter_option: None, + suit_item_icon: None, + unk_14: 0, + order: 0, + unk_16: 0, + unk_17: 0, + unk_18: 0, + unk_19: 0, + unk_20: 0, + unk_21: 0, + primary_suit_propertys: None, + unk_23: None, + unk_24: 0, + unk_25: None, + unk_26: None, + unk_27: None, + tag: None, + } + } +} + +pub struct EquipmentSuitTemplateBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> EquipmentSuitTemplateBuilder<'a, 'b, A> { + #[inline] + pub fn add_id(&mut self, id: u32) { + self.fbb_.push_slot::(EquipmentSuitTemplate::VT_ID, id, 0); + } + #[inline] + pub fn add_name(&mut self, name: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(EquipmentSuitTemplate::VT_NAME, name); + } + #[inline] + pub fn add_primary_condition(&mut self, primary_condition: u32) { + self.fbb_.push_slot::(EquipmentSuitTemplate::VT_PRIMARY_CONDITION, primary_condition, 0); + } + #[inline] + pub fn add_unk_3(&mut self, unk_3: i32) { + self.fbb_.push_slot::(EquipmentSuitTemplate::VT_UNK_3, unk_3, 0); + } + #[inline] + pub fn add_primary_suit_ability(&mut self, primary_suit_ability: u32) { + self.fbb_.push_slot::(EquipmentSuitTemplate::VT_PRIMARY_SUIT_ABILITY, primary_suit_ability, 0); + } + #[inline] + pub fn add_primary_description(&mut self, primary_description: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(EquipmentSuitTemplate::VT_PRIMARY_DESCRIPTION, primary_description); + } + #[inline] + pub fn add_secondary_condition(&mut self, secondary_condition: u32) { + self.fbb_.push_slot::(EquipmentSuitTemplate::VT_SECONDARY_CONDITION, secondary_condition, 0); + } + #[inline] + pub fn add_unk_7(&mut self, unk_7: i32) { + self.fbb_.push_slot::(EquipmentSuitTemplate::VT_UNK_7, unk_7, 0); + } + #[inline] + pub fn add_secondary_suit_ability(&mut self, secondary_suit_ability: i32) { + self.fbb_.push_slot::(EquipmentSuitTemplate::VT_SECONDARY_SUIT_ABILITY, secondary_suit_ability, 0); + } + #[inline] + pub fn add_secondary_description(&mut self, secondary_description: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(EquipmentSuitTemplate::VT_SECONDARY_DESCRIPTION, secondary_description); + } + #[inline] + pub fn add_suit_icon(&mut self, suit_icon: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(EquipmentSuitTemplate::VT_SUIT_ICON, suit_icon); + } + #[inline] + pub fn add_suit_story(&mut self, suit_story: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(EquipmentSuitTemplate::VT_SUIT_STORY, suit_story); + } + #[inline] + pub fn add_suit_filter_option(&mut self, suit_filter_option: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(EquipmentSuitTemplate::VT_SUIT_FILTER_OPTION, suit_filter_option); + } + #[inline] + pub fn add_suit_item_icon(&mut self, suit_item_icon: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(EquipmentSuitTemplate::VT_SUIT_ITEM_ICON, suit_item_icon); + } + #[inline] + pub fn add_unk_14(&mut self, unk_14: i32) { + self.fbb_.push_slot::(EquipmentSuitTemplate::VT_UNK_14, unk_14, 0); + } + #[inline] + pub fn add_order(&mut self, order: i32) { + self.fbb_.push_slot::(EquipmentSuitTemplate::VT_ORDER, order, 0); + } + #[inline] + pub fn add_unk_16(&mut self, unk_16: i32) { + self.fbb_.push_slot::(EquipmentSuitTemplate::VT_UNK_16, unk_16, 0); + } + #[inline] + pub fn add_unk_17(&mut self, unk_17: i32) { + self.fbb_.push_slot::(EquipmentSuitTemplate::VT_UNK_17, unk_17, 0); + } + #[inline] + pub fn add_unk_18(&mut self, unk_18: i32) { + self.fbb_.push_slot::(EquipmentSuitTemplate::VT_UNK_18, unk_18, 0); + } + #[inline] + pub fn add_unk_19(&mut self, unk_19: i32) { + self.fbb_.push_slot::(EquipmentSuitTemplate::VT_UNK_19, unk_19, 0); + } + #[inline] + pub fn add_unk_20(&mut self, unk_20: i32) { + self.fbb_.push_slot::(EquipmentSuitTemplate::VT_UNK_20, unk_20, 0); + } + #[inline] + pub fn add_unk_21(&mut self, unk_21: i32) { + self.fbb_.push_slot::(EquipmentSuitTemplate::VT_UNK_21, unk_21, 0); + } + #[inline] + pub fn add_primary_suit_propertys(&mut self, primary_suit_propertys: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(EquipmentSuitTemplate::VT_PRIMARY_SUIT_PROPERTYS, primary_suit_propertys); + } + #[inline] + pub fn add_unk_23(&mut self, unk_23: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(EquipmentSuitTemplate::VT_UNK_23, unk_23); + } + #[inline] + pub fn add_unk_24(&mut self, unk_24: i32) { + self.fbb_.push_slot::(EquipmentSuitTemplate::VT_UNK_24, unk_24, 0); + } + #[inline] + pub fn add_unk_25(&mut self, unk_25: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(EquipmentSuitTemplate::VT_UNK_25, unk_25); + } + #[inline] + pub fn add_unk_26(&mut self, unk_26: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(EquipmentSuitTemplate::VT_UNK_26, unk_26); + } + #[inline] + pub fn add_unk_27(&mut self, unk_27: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(EquipmentSuitTemplate::VT_UNK_27, unk_27); + } + #[inline] + pub fn add_tag(&mut self, tag: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(EquipmentSuitTemplate::VT_TAG, tag); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> EquipmentSuitTemplateBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + EquipmentSuitTemplateBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for EquipmentSuitTemplate<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("EquipmentSuitTemplate"); + ds.field("id", &self.id()); + ds.field("name", &self.name()); + ds.field("primary_condition", &self.primary_condition()); + ds.field("unk_3", &self.unk_3()); + ds.field("primary_suit_ability", &self.primary_suit_ability()); + ds.field("primary_description", &self.primary_description()); + ds.field("secondary_condition", &self.secondary_condition()); + ds.field("unk_7", &self.unk_7()); + ds.field("secondary_suit_ability", &self.secondary_suit_ability()); + ds.field("secondary_description", &self.secondary_description()); + ds.field("suit_icon", &self.suit_icon()); + ds.field("suit_story", &self.suit_story()); + ds.field("suit_filter_option", &self.suit_filter_option()); + ds.field("suit_item_icon", &self.suit_item_icon()); + ds.field("unk_14", &self.unk_14()); + ds.field("order", &self.order()); + ds.field("unk_16", &self.unk_16()); + ds.field("unk_17", &self.unk_17()); + ds.field("unk_18", &self.unk_18()); + ds.field("unk_19", &self.unk_19()); + ds.field("unk_20", &self.unk_20()); + ds.field("unk_21", &self.unk_21()); + ds.field("primary_suit_propertys", &self.primary_suit_propertys()); + ds.field("unk_23", &self.unk_23()); + ds.field("unk_24", &self.unk_24()); + ds.field("unk_25", &self.unk_25()); + ds.field("unk_26", &self.unk_26()); + ds.field("unk_27", &self.unk_27()); + ds.field("tag", &self.tag()); + ds.finish() + } +} +pub enum EquipmentSuitTemplateTbOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct EquipmentSuitTemplateTb<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for EquipmentSuitTemplateTb<'a> { + type Inner = EquipmentSuitTemplateTb<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> EquipmentSuitTemplateTb<'a> { + pub const VT_DATA: flatbuffers::VOffsetT = 4; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + EquipmentSuitTemplateTb { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args EquipmentSuitTemplateTbArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = EquipmentSuitTemplateTbBuilder::new(_fbb); + if let Some(x) = args.data { builder.add_data(x); } + builder.finish() + } + + + #[inline] + pub fn data(&self) -> Option>>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(EquipmentSuitTemplateTb::VT_DATA, None)} + } +} + +impl flatbuffers::Verifiable for EquipmentSuitTemplateTb<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::>>>("data", Self::VT_DATA, false)? + .finish(); + Ok(()) + } +} +pub struct EquipmentSuitTemplateTbArgs<'a> { + pub data: Option>>>>, +} +impl<'a> Default for EquipmentSuitTemplateTbArgs<'a> { + #[inline] + fn default() -> Self { + EquipmentSuitTemplateTbArgs { + data: None, + } + } +} + +pub struct EquipmentSuitTemplateTbBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> EquipmentSuitTemplateTbBuilder<'a, 'b, A> { + #[inline] + pub fn add_data(&mut self, data: flatbuffers::WIPOffset>>>) { + self.fbb_.push_slot_always::>(EquipmentSuitTemplateTb::VT_DATA, data); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> EquipmentSuitTemplateTbBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + EquipmentSuitTemplateTbBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for EquipmentSuitTemplateTb<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("EquipmentSuitTemplateTb"); + ds.field("data", &self.data()); + ds.finish() + } +} diff --git a/lib/config/gen_flatbuffers/equipment_template_generated.rs b/lib/config/gen_flatbuffers/equipment_template_generated.rs new file mode 100644 index 0000000..8273481 --- /dev/null +++ b/lib/config/gen_flatbuffers/equipment_template_generated.rs @@ -0,0 +1,358 @@ +// automatically generated by the FlatBuffers compiler, do not modify + + +// @generated + +use core::mem; +use core::cmp::Ordering; + +extern crate flatbuffers; +use self::flatbuffers::{EndianScalar, Follow}; + +pub enum EquipmentTemplateOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct EquipmentTemplate<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for EquipmentTemplate<'a> { + type Inner = EquipmentTemplate<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> EquipmentTemplate<'a> { + pub const VT_ITEM_ID: flatbuffers::VOffsetT = 4; + pub const VT_EQUIPMENT_TYPE: flatbuffers::VOffsetT = 6; + pub const VT_SUIT_TYPE: flatbuffers::VOffsetT = 8; + pub const VT_DISK_ICON_PATH: flatbuffers::VOffsetT = 10; + pub const VT_DRAWING_PATH: flatbuffers::VOffsetT = 12; + pub const VT_FRONT_LABEL_TEXTURE_PATH: flatbuffers::VOffsetT = 14; + pub const VT_BACK_LABEL_TEXTURE_PATH: flatbuffers::VOffsetT = 16; + pub const VT_DISK_TEXTURE_PATH: flatbuffers::VOffsetT = 18; + pub const VT_PLAY_MUSIC_TAG: flatbuffers::VOffsetT = 20; + pub const VT_PAUSE_MUSIC_TAG: flatbuffers::VOffsetT = 22; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + EquipmentTemplate { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args EquipmentTemplateArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = EquipmentTemplateBuilder::new(_fbb); + if let Some(x) = args.pause_music_tag { builder.add_pause_music_tag(x); } + if let Some(x) = args.play_music_tag { builder.add_play_music_tag(x); } + if let Some(x) = args.disk_texture_path { builder.add_disk_texture_path(x); } + if let Some(x) = args.back_label_texture_path { builder.add_back_label_texture_path(x); } + if let Some(x) = args.front_label_texture_path { builder.add_front_label_texture_path(x); } + if let Some(x) = args.drawing_path { builder.add_drawing_path(x); } + if let Some(x) = args.disk_icon_path { builder.add_disk_icon_path(x); } + builder.add_suit_type(args.suit_type); + builder.add_equipment_type(args.equipment_type); + builder.add_item_id(args.item_id); + builder.finish() + } + + + #[inline] + pub fn item_id(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(EquipmentTemplate::VT_ITEM_ID, Some(0)).unwrap()} + } + #[inline] + pub fn equipment_type(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(EquipmentTemplate::VT_EQUIPMENT_TYPE, Some(0)).unwrap()} + } + #[inline] + pub fn suit_type(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(EquipmentTemplate::VT_SUIT_TYPE, Some(0)).unwrap()} + } + #[inline] + pub fn disk_icon_path(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(EquipmentTemplate::VT_DISK_ICON_PATH, None)} + } + #[inline] + pub fn drawing_path(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(EquipmentTemplate::VT_DRAWING_PATH, None)} + } + #[inline] + pub fn front_label_texture_path(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(EquipmentTemplate::VT_FRONT_LABEL_TEXTURE_PATH, None)} + } + #[inline] + pub fn back_label_texture_path(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(EquipmentTemplate::VT_BACK_LABEL_TEXTURE_PATH, None)} + } + #[inline] + pub fn disk_texture_path(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(EquipmentTemplate::VT_DISK_TEXTURE_PATH, None)} + } + #[inline] + pub fn play_music_tag(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(EquipmentTemplate::VT_PLAY_MUSIC_TAG, None)} + } + #[inline] + pub fn pause_music_tag(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(EquipmentTemplate::VT_PAUSE_MUSIC_TAG, None)} + } +} + +impl flatbuffers::Verifiable for EquipmentTemplate<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::("item_id", Self::VT_ITEM_ID, false)? + .visit_field::("equipment_type", Self::VT_EQUIPMENT_TYPE, false)? + .visit_field::("suit_type", Self::VT_SUIT_TYPE, false)? + .visit_field::>("disk_icon_path", Self::VT_DISK_ICON_PATH, false)? + .visit_field::>("drawing_path", Self::VT_DRAWING_PATH, false)? + .visit_field::>("front_label_texture_path", Self::VT_FRONT_LABEL_TEXTURE_PATH, false)? + .visit_field::>("back_label_texture_path", Self::VT_BACK_LABEL_TEXTURE_PATH, false)? + .visit_field::>("disk_texture_path", Self::VT_DISK_TEXTURE_PATH, false)? + .visit_field::>("play_music_tag", Self::VT_PLAY_MUSIC_TAG, false)? + .visit_field::>("pause_music_tag", Self::VT_PAUSE_MUSIC_TAG, false)? + .finish(); + Ok(()) + } +} +pub struct EquipmentTemplateArgs<'a> { + pub item_id: u32, + pub equipment_type: u32, + pub suit_type: u32, + pub disk_icon_path: Option>, + pub drawing_path: Option>, + pub front_label_texture_path: Option>, + pub back_label_texture_path: Option>, + pub disk_texture_path: Option>, + pub play_music_tag: Option>, + pub pause_music_tag: Option>, +} +impl<'a> Default for EquipmentTemplateArgs<'a> { + #[inline] + fn default() -> Self { + EquipmentTemplateArgs { + item_id: 0, + equipment_type: 0, + suit_type: 0, + disk_icon_path: None, + drawing_path: None, + front_label_texture_path: None, + back_label_texture_path: None, + disk_texture_path: None, + play_music_tag: None, + pause_music_tag: None, + } + } +} + +pub struct EquipmentTemplateBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> EquipmentTemplateBuilder<'a, 'b, A> { + #[inline] + pub fn add_item_id(&mut self, item_id: u32) { + self.fbb_.push_slot::(EquipmentTemplate::VT_ITEM_ID, item_id, 0); + } + #[inline] + pub fn add_equipment_type(&mut self, equipment_type: u32) { + self.fbb_.push_slot::(EquipmentTemplate::VT_EQUIPMENT_TYPE, equipment_type, 0); + } + #[inline] + pub fn add_suit_type(&mut self, suit_type: u32) { + self.fbb_.push_slot::(EquipmentTemplate::VT_SUIT_TYPE, suit_type, 0); + } + #[inline] + pub fn add_disk_icon_path(&mut self, disk_icon_path: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(EquipmentTemplate::VT_DISK_ICON_PATH, disk_icon_path); + } + #[inline] + pub fn add_drawing_path(&mut self, drawing_path: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(EquipmentTemplate::VT_DRAWING_PATH, drawing_path); + } + #[inline] + pub fn add_front_label_texture_path(&mut self, front_label_texture_path: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(EquipmentTemplate::VT_FRONT_LABEL_TEXTURE_PATH, front_label_texture_path); + } + #[inline] + pub fn add_back_label_texture_path(&mut self, back_label_texture_path: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(EquipmentTemplate::VT_BACK_LABEL_TEXTURE_PATH, back_label_texture_path); + } + #[inline] + pub fn add_disk_texture_path(&mut self, disk_texture_path: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(EquipmentTemplate::VT_DISK_TEXTURE_PATH, disk_texture_path); + } + #[inline] + pub fn add_play_music_tag(&mut self, play_music_tag: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(EquipmentTemplate::VT_PLAY_MUSIC_TAG, play_music_tag); + } + #[inline] + pub fn add_pause_music_tag(&mut self, pause_music_tag: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(EquipmentTemplate::VT_PAUSE_MUSIC_TAG, pause_music_tag); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> EquipmentTemplateBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + EquipmentTemplateBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for EquipmentTemplate<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("EquipmentTemplate"); + ds.field("item_id", &self.item_id()); + ds.field("equipment_type", &self.equipment_type()); + ds.field("suit_type", &self.suit_type()); + ds.field("disk_icon_path", &self.disk_icon_path()); + ds.field("drawing_path", &self.drawing_path()); + ds.field("front_label_texture_path", &self.front_label_texture_path()); + ds.field("back_label_texture_path", &self.back_label_texture_path()); + ds.field("disk_texture_path", &self.disk_texture_path()); + ds.field("play_music_tag", &self.play_music_tag()); + ds.field("pause_music_tag", &self.pause_music_tag()); + ds.finish() + } +} +pub enum EquipmentTemplateTbOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct EquipmentTemplateTb<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for EquipmentTemplateTb<'a> { + type Inner = EquipmentTemplateTb<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> EquipmentTemplateTb<'a> { + pub const VT_DATA: flatbuffers::VOffsetT = 4; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + EquipmentTemplateTb { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args EquipmentTemplateTbArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = EquipmentTemplateTbBuilder::new(_fbb); + if let Some(x) = args.data { builder.add_data(x); } + builder.finish() + } + + + #[inline] + pub fn data(&self) -> Option>>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(EquipmentTemplateTb::VT_DATA, None)} + } +} + +impl flatbuffers::Verifiable for EquipmentTemplateTb<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::>>>("data", Self::VT_DATA, false)? + .finish(); + Ok(()) + } +} +pub struct EquipmentTemplateTbArgs<'a> { + pub data: Option>>>>, +} +impl<'a> Default for EquipmentTemplateTbArgs<'a> { + #[inline] + fn default() -> Self { + EquipmentTemplateTbArgs { + data: None, + } + } +} + +pub struct EquipmentTemplateTbBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> EquipmentTemplateTbBuilder<'a, 'b, A> { + #[inline] + pub fn add_data(&mut self, data: flatbuffers::WIPOffset>>>) { + self.fbb_.push_slot_always::>(EquipmentTemplateTb::VT_DATA, data); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> EquipmentTemplateTbBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + EquipmentTemplateTbBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for EquipmentTemplateTb<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("EquipmentTemplateTb"); + ds.field("data", &self.data()); + ds.finish() + } +} diff --git a/lib/config/gen_flatbuffers/hollow_challenge_template_generated.rs b/lib/config/gen_flatbuffers/hollow_challenge_template_generated.rs new file mode 100644 index 0000000..fd67f3a --- /dev/null +++ b/lib/config/gen_flatbuffers/hollow_challenge_template_generated.rs @@ -0,0 +1,256 @@ +// automatically generated by the FlatBuffers compiler, do not modify + + +// @generated + +use core::mem; +use core::cmp::Ordering; + +extern crate flatbuffers; +use self::flatbuffers::{EndianScalar, Follow}; + +pub enum HollowChallengeTemplateOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct HollowChallengeTemplate<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for HollowChallengeTemplate<'a> { + type Inner = HollowChallengeTemplate<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> HollowChallengeTemplate<'a> { + pub const VT_ID: flatbuffers::VOffsetT = 4; + pub const VT_HOLLOW_QUEST_ID: flatbuffers::VOffsetT = 6; + pub const VT_UNK_1: flatbuffers::VOffsetT = 8; + pub const VT_UNK_2: flatbuffers::VOffsetT = 10; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + HollowChallengeTemplate { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args HollowChallengeTemplateArgs + ) -> flatbuffers::WIPOffset> { + let mut builder = HollowChallengeTemplateBuilder::new(_fbb); + builder.add_hollow_quest_id(args.hollow_quest_id); + builder.add_id(args.id); + builder.add_unk_2(args.unk_2); + builder.add_unk_1(args.unk_1); + builder.finish() + } + + + #[inline] + pub fn id(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowChallengeTemplate::VT_ID, Some(0)).unwrap()} + } + #[inline] + pub fn hollow_quest_id(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowChallengeTemplate::VT_HOLLOW_QUEST_ID, Some(0)).unwrap()} + } + #[inline] + pub fn unk_1(&self) -> bool { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowChallengeTemplate::VT_UNK_1, Some(false)).unwrap()} + } + #[inline] + pub fn unk_2(&self) -> bool { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowChallengeTemplate::VT_UNK_2, Some(false)).unwrap()} + } +} + +impl flatbuffers::Verifiable for HollowChallengeTemplate<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::("id", Self::VT_ID, false)? + .visit_field::("hollow_quest_id", Self::VT_HOLLOW_QUEST_ID, false)? + .visit_field::("unk_1", Self::VT_UNK_1, false)? + .visit_field::("unk_2", Self::VT_UNK_2, false)? + .finish(); + Ok(()) + } +} +pub struct HollowChallengeTemplateArgs { + pub id: u32, + pub hollow_quest_id: u32, + pub unk_1: bool, + pub unk_2: bool, +} +impl<'a> Default for HollowChallengeTemplateArgs { + #[inline] + fn default() -> Self { + HollowChallengeTemplateArgs { + id: 0, + hollow_quest_id: 0, + unk_1: false, + unk_2: false, + } + } +} + +pub struct HollowChallengeTemplateBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> HollowChallengeTemplateBuilder<'a, 'b, A> { + #[inline] + pub fn add_id(&mut self, id: u32) { + self.fbb_.push_slot::(HollowChallengeTemplate::VT_ID, id, 0); + } + #[inline] + pub fn add_hollow_quest_id(&mut self, hollow_quest_id: u32) { + self.fbb_.push_slot::(HollowChallengeTemplate::VT_HOLLOW_QUEST_ID, hollow_quest_id, 0); + } + #[inline] + pub fn add_unk_1(&mut self, unk_1: bool) { + self.fbb_.push_slot::(HollowChallengeTemplate::VT_UNK_1, unk_1, false); + } + #[inline] + pub fn add_unk_2(&mut self, unk_2: bool) { + self.fbb_.push_slot::(HollowChallengeTemplate::VT_UNK_2, unk_2, false); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> HollowChallengeTemplateBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + HollowChallengeTemplateBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for HollowChallengeTemplate<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("HollowChallengeTemplate"); + ds.field("id", &self.id()); + ds.field("hollow_quest_id", &self.hollow_quest_id()); + ds.field("unk_1", &self.unk_1()); + ds.field("unk_2", &self.unk_2()); + ds.finish() + } +} +pub enum HollowChallengeTemplateTbOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct HollowChallengeTemplateTb<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for HollowChallengeTemplateTb<'a> { + type Inner = HollowChallengeTemplateTb<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> HollowChallengeTemplateTb<'a> { + pub const VT_DATA: flatbuffers::VOffsetT = 4; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + HollowChallengeTemplateTb { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args HollowChallengeTemplateTbArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = HollowChallengeTemplateTbBuilder::new(_fbb); + if let Some(x) = args.data { builder.add_data(x); } + builder.finish() + } + + + #[inline] + pub fn data(&self) -> Option>>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(HollowChallengeTemplateTb::VT_DATA, None)} + } +} + +impl flatbuffers::Verifiable for HollowChallengeTemplateTb<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::>>>("data", Self::VT_DATA, false)? + .finish(); + Ok(()) + } +} +pub struct HollowChallengeTemplateTbArgs<'a> { + pub data: Option>>>>, +} +impl<'a> Default for HollowChallengeTemplateTbArgs<'a> { + #[inline] + fn default() -> Self { + HollowChallengeTemplateTbArgs { + data: None, + } + } +} + +pub struct HollowChallengeTemplateTbBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> HollowChallengeTemplateTbBuilder<'a, 'b, A> { + #[inline] + pub fn add_data(&mut self, data: flatbuffers::WIPOffset>>>) { + self.fbb_.push_slot_always::>(HollowChallengeTemplateTb::VT_DATA, data); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> HollowChallengeTemplateTbBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + HollowChallengeTemplateTbBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for HollowChallengeTemplateTb<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("HollowChallengeTemplateTb"); + ds.field("data", &self.data()); + ds.finish() + } +} diff --git a/lib/config/gen_flatbuffers/hollow_config_template_generated.rs b/lib/config/gen_flatbuffers/hollow_config_template_generated.rs new file mode 100644 index 0000000..8a0bbb5 --- /dev/null +++ b/lib/config/gen_flatbuffers/hollow_config_template_generated.rs @@ -0,0 +1,392 @@ +// automatically generated by the FlatBuffers compiler, do not modify + + +// @generated + +use core::mem; +use core::cmp::Ordering; + +extern crate flatbuffers; +use self::flatbuffers::{EndianScalar, Follow}; + +pub enum HollowConfigTemplateOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct HollowConfigTemplate<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for HollowConfigTemplate<'a> { + type Inner = HollowConfigTemplate<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> HollowConfigTemplate<'a> { + pub const VT_ID: flatbuffers::VOffsetT = 4; + pub const VT_HOLLOW_GROUP: flatbuffers::VOffsetT = 6; + pub const VT_NAME: flatbuffers::VOffsetT = 8; + pub const VT_UNLOCK_CONDITION: flatbuffers::VOffsetT = 10; + pub const VT_LOCK_HINT: flatbuffers::VOffsetT = 12; + pub const VT_PIC_RES: flatbuffers::VOffsetT = 14; + pub const VT_MODEL_RES: flatbuffers::VOffsetT = 16; + pub const VT_LOCKED_COLOR: flatbuffers::VOffsetT = 18; + pub const VT_UNLOCKED_COLOR: flatbuffers::VOffsetT = 20; + pub const VT_UNK_1: flatbuffers::VOffsetT = 22; + pub const VT_UNK_2: flatbuffers::VOffsetT = 24; + pub const VT_UNK_3: flatbuffers::VOffsetT = 26; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + HollowConfigTemplate { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args HollowConfigTemplateArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = HollowConfigTemplateBuilder::new(_fbb); + if let Some(x) = args.unk_3 { builder.add_unk_3(x); } + if let Some(x) = args.unk_2 { builder.add_unk_2(x); } + if let Some(x) = args.unlocked_color { builder.add_unlocked_color(x); } + if let Some(x) = args.locked_color { builder.add_locked_color(x); } + if let Some(x) = args.model_res { builder.add_model_res(x); } + if let Some(x) = args.pic_res { builder.add_pic_res(x); } + if let Some(x) = args.lock_hint { builder.add_lock_hint(x); } + if let Some(x) = args.unlock_condition { builder.add_unlock_condition(x); } + if let Some(x) = args.name { builder.add_name(x); } + builder.add_hollow_group(args.hollow_group); + builder.add_id(args.id); + builder.add_unk_1(args.unk_1); + builder.finish() + } + + + #[inline] + pub fn id(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowConfigTemplate::VT_ID, Some(0)).unwrap()} + } + #[inline] + pub fn hollow_group(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowConfigTemplate::VT_HOLLOW_GROUP, Some(0)).unwrap()} + } + #[inline] + pub fn name(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(HollowConfigTemplate::VT_NAME, None)} + } + #[inline] + pub fn unlock_condition(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(HollowConfigTemplate::VT_UNLOCK_CONDITION, None)} + } + #[inline] + pub fn lock_hint(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(HollowConfigTemplate::VT_LOCK_HINT, None)} + } + #[inline] + pub fn pic_res(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(HollowConfigTemplate::VT_PIC_RES, None)} + } + #[inline] + pub fn model_res(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(HollowConfigTemplate::VT_MODEL_RES, None)} + } + #[inline] + pub fn locked_color(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(HollowConfigTemplate::VT_LOCKED_COLOR, None)} + } + #[inline] + pub fn unlocked_color(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(HollowConfigTemplate::VT_UNLOCKED_COLOR, None)} + } + #[inline] + pub fn unk_1(&self) -> bool { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowConfigTemplate::VT_UNK_1, Some(false)).unwrap()} + } + #[inline] + pub fn unk_2(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(HollowConfigTemplate::VT_UNK_2, None)} + } + #[inline] + pub fn unk_3(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(HollowConfigTemplate::VT_UNK_3, None)} + } +} + +impl flatbuffers::Verifiable for HollowConfigTemplate<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::("id", Self::VT_ID, false)? + .visit_field::("hollow_group", Self::VT_HOLLOW_GROUP, false)? + .visit_field::>("name", Self::VT_NAME, false)? + .visit_field::>("unlock_condition", Self::VT_UNLOCK_CONDITION, false)? + .visit_field::>("lock_hint", Self::VT_LOCK_HINT, false)? + .visit_field::>("pic_res", Self::VT_PIC_RES, false)? + .visit_field::>("model_res", Self::VT_MODEL_RES, false)? + .visit_field::>("locked_color", Self::VT_LOCKED_COLOR, false)? + .visit_field::>("unlocked_color", Self::VT_UNLOCKED_COLOR, false)? + .visit_field::("unk_1", Self::VT_UNK_1, false)? + .visit_field::>("unk_2", Self::VT_UNK_2, false)? + .visit_field::>("unk_3", Self::VT_UNK_3, false)? + .finish(); + Ok(()) + } +} +pub struct HollowConfigTemplateArgs<'a> { + pub id: u32, + pub hollow_group: u32, + pub name: Option>, + pub unlock_condition: Option>, + pub lock_hint: Option>, + pub pic_res: Option>, + pub model_res: Option>, + pub locked_color: Option>, + pub unlocked_color: Option>, + pub unk_1: bool, + pub unk_2: Option>, + pub unk_3: Option>, +} +impl<'a> Default for HollowConfigTemplateArgs<'a> { + #[inline] + fn default() -> Self { + HollowConfigTemplateArgs { + id: 0, + hollow_group: 0, + name: None, + unlock_condition: None, + lock_hint: None, + pic_res: None, + model_res: None, + locked_color: None, + unlocked_color: None, + unk_1: false, + unk_2: None, + unk_3: None, + } + } +} + +pub struct HollowConfigTemplateBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> HollowConfigTemplateBuilder<'a, 'b, A> { + #[inline] + pub fn add_id(&mut self, id: u32) { + self.fbb_.push_slot::(HollowConfigTemplate::VT_ID, id, 0); + } + #[inline] + pub fn add_hollow_group(&mut self, hollow_group: u32) { + self.fbb_.push_slot::(HollowConfigTemplate::VT_HOLLOW_GROUP, hollow_group, 0); + } + #[inline] + pub fn add_name(&mut self, name: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(HollowConfigTemplate::VT_NAME, name); + } + #[inline] + pub fn add_unlock_condition(&mut self, unlock_condition: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(HollowConfigTemplate::VT_UNLOCK_CONDITION, unlock_condition); + } + #[inline] + pub fn add_lock_hint(&mut self, lock_hint: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(HollowConfigTemplate::VT_LOCK_HINT, lock_hint); + } + #[inline] + pub fn add_pic_res(&mut self, pic_res: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(HollowConfigTemplate::VT_PIC_RES, pic_res); + } + #[inline] + pub fn add_model_res(&mut self, model_res: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(HollowConfigTemplate::VT_MODEL_RES, model_res); + } + #[inline] + pub fn add_locked_color(&mut self, locked_color: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(HollowConfigTemplate::VT_LOCKED_COLOR, locked_color); + } + #[inline] + pub fn add_unlocked_color(&mut self, unlocked_color: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(HollowConfigTemplate::VT_UNLOCKED_COLOR, unlocked_color); + } + #[inline] + pub fn add_unk_1(&mut self, unk_1: bool) { + self.fbb_.push_slot::(HollowConfigTemplate::VT_UNK_1, unk_1, false); + } + #[inline] + pub fn add_unk_2(&mut self, unk_2: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(HollowConfigTemplate::VT_UNK_2, unk_2); + } + #[inline] + pub fn add_unk_3(&mut self, unk_3: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(HollowConfigTemplate::VT_UNK_3, unk_3); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> HollowConfigTemplateBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + HollowConfigTemplateBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for HollowConfigTemplate<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("HollowConfigTemplate"); + ds.field("id", &self.id()); + ds.field("hollow_group", &self.hollow_group()); + ds.field("name", &self.name()); + ds.field("unlock_condition", &self.unlock_condition()); + ds.field("lock_hint", &self.lock_hint()); + ds.field("pic_res", &self.pic_res()); + ds.field("model_res", &self.model_res()); + ds.field("locked_color", &self.locked_color()); + ds.field("unlocked_color", &self.unlocked_color()); + ds.field("unk_1", &self.unk_1()); + ds.field("unk_2", &self.unk_2()); + ds.field("unk_3", &self.unk_3()); + ds.finish() + } +} +pub enum HollowConfigTemplateTbOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct HollowConfigTemplateTb<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for HollowConfigTemplateTb<'a> { + type Inner = HollowConfigTemplateTb<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> HollowConfigTemplateTb<'a> { + pub const VT_DATA: flatbuffers::VOffsetT = 4; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + HollowConfigTemplateTb { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args HollowConfigTemplateTbArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = HollowConfigTemplateTbBuilder::new(_fbb); + if let Some(x) = args.data { builder.add_data(x); } + builder.finish() + } + + + #[inline] + pub fn data(&self) -> Option>>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(HollowConfigTemplateTb::VT_DATA, None)} + } +} + +impl flatbuffers::Verifiable for HollowConfigTemplateTb<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::>>>("data", Self::VT_DATA, false)? + .finish(); + Ok(()) + } +} +pub struct HollowConfigTemplateTbArgs<'a> { + pub data: Option>>>>, +} +impl<'a> Default for HollowConfigTemplateTbArgs<'a> { + #[inline] + fn default() -> Self { + HollowConfigTemplateTbArgs { + data: None, + } + } +} + +pub struct HollowConfigTemplateTbBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> HollowConfigTemplateTbBuilder<'a, 'b, A> { + #[inline] + pub fn add_data(&mut self, data: flatbuffers::WIPOffset>>>) { + self.fbb_.push_slot_always::>(HollowConfigTemplateTb::VT_DATA, data); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> HollowConfigTemplateTbBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + HollowConfigTemplateTbBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for HollowConfigTemplateTb<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("HollowConfigTemplateTb"); + ds.field("data", &self.data()); + ds.finish() + } +} diff --git a/lib/config/gen_flatbuffers/hollow_event_template_generated.rs b/lib/config/gen_flatbuffers/hollow_event_template_generated.rs new file mode 100644 index 0000000..7d53153 --- /dev/null +++ b/lib/config/gen_flatbuffers/hollow_event_template_generated.rs @@ -0,0 +1,494 @@ +// automatically generated by the FlatBuffers compiler, do not modify + + +// @generated + +use core::mem; +use core::cmp::Ordering; + +extern crate flatbuffers; +use self::flatbuffers::{EndianScalar, Follow}; + +pub enum HollowEventTemplateOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct HollowEventTemplate<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for HollowEventTemplate<'a> { + type Inner = HollowEventTemplate<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> HollowEventTemplate<'a> { + pub const VT_ID: flatbuffers::VOffsetT = 4; + pub const VT_UNLOCK_CONDITION: flatbuffers::VOffsetT = 6; + pub const VT_UNK_1: flatbuffers::VOffsetT = 8; + pub const VT_TYPE_: flatbuffers::VOffsetT = 10; + pub const VT_CAN_TRIGGER_TIMES: flatbuffers::VOffsetT = 12; + pub const VT_PRE_ICON_RES: flatbuffers::VOffsetT = 14; + pub const VT_INTERACT_ICON_TEXTURE_SHEET_ID: flatbuffers::VOffsetT = 16; + pub const VT_ICON_TEXTURE_SHEET_ID: flatbuffers::VOffsetT = 18; + pub const VT_TARGET_ID: flatbuffers::VOffsetT = 20; + pub const VT_PARAM_1: flatbuffers::VOffsetT = 22; + pub const VT_PARAM_2: flatbuffers::VOffsetT = 24; + pub const VT_PARAM_3: flatbuffers::VOffsetT = 26; + pub const VT_PARAM_4: flatbuffers::VOffsetT = 28; + pub const VT_PARAM_5: flatbuffers::VOffsetT = 30; + pub const VT_PARAM_6: flatbuffers::VOffsetT = 32; + pub const VT_PARAM_EXTS: flatbuffers::VOffsetT = 34; + pub const VT_UNK_3: flatbuffers::VOffsetT = 36; + pub const VT_UNK_4: flatbuffers::VOffsetT = 38; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + HollowEventTemplate { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args HollowEventTemplateArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = HollowEventTemplateBuilder::new(_fbb); + builder.add_unk_4(args.unk_4); + builder.add_unk_3(args.unk_3); + if let Some(x) = args.param_exts { builder.add_param_exts(x); } + if let Some(x) = args.param_6 { builder.add_param_6(x); } + if let Some(x) = args.param_5 { builder.add_param_5(x); } + if let Some(x) = args.param_4 { builder.add_param_4(x); } + if let Some(x) = args.param_3 { builder.add_param_3(x); } + if let Some(x) = args.param_2 { builder.add_param_2(x); } + if let Some(x) = args.param_1 { builder.add_param_1(x); } + builder.add_target_id(args.target_id); + builder.add_icon_texture_sheet_id(args.icon_texture_sheet_id); + builder.add_interact_icon_texture_sheet_id(args.interact_icon_texture_sheet_id); + if let Some(x) = args.pre_icon_res { builder.add_pre_icon_res(x); } + builder.add_can_trigger_times(args.can_trigger_times); + builder.add_type_(args.type_); + if let Some(x) = args.unk_1 { builder.add_unk_1(x); } + if let Some(x) = args.unlock_condition { builder.add_unlock_condition(x); } + builder.add_id(args.id); + builder.finish() + } + + + #[inline] + pub fn id(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowEventTemplate::VT_ID, Some(0)).unwrap()} + } + #[inline] + pub fn unlock_condition(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(HollowEventTemplate::VT_UNLOCK_CONDITION, None)} + } + #[inline] + pub fn unk_1(&self) -> Option>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(HollowEventTemplate::VT_UNK_1, None)} + } + #[inline] + pub fn type_(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowEventTemplate::VT_TYPE_, Some(0)).unwrap()} + } + #[inline] + pub fn can_trigger_times(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowEventTemplate::VT_CAN_TRIGGER_TIMES, Some(0)).unwrap()} + } + #[inline] + pub fn pre_icon_res(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(HollowEventTemplate::VT_PRE_ICON_RES, None)} + } + #[inline] + pub fn interact_icon_texture_sheet_id(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowEventTemplate::VT_INTERACT_ICON_TEXTURE_SHEET_ID, Some(0)).unwrap()} + } + #[inline] + pub fn icon_texture_sheet_id(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowEventTemplate::VT_ICON_TEXTURE_SHEET_ID, Some(0)).unwrap()} + } + #[inline] + pub fn target_id(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowEventTemplate::VT_TARGET_ID, Some(0)).unwrap()} + } + #[inline] + pub fn param_1(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(HollowEventTemplate::VT_PARAM_1, None)} + } + #[inline] + pub fn param_2(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(HollowEventTemplate::VT_PARAM_2, None)} + } + #[inline] + pub fn param_3(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(HollowEventTemplate::VT_PARAM_3, None)} + } + #[inline] + pub fn param_4(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(HollowEventTemplate::VT_PARAM_4, None)} + } + #[inline] + pub fn param_5(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(HollowEventTemplate::VT_PARAM_5, None)} + } + #[inline] + pub fn param_6(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(HollowEventTemplate::VT_PARAM_6, None)} + } + #[inline] + pub fn param_exts(&self) -> Option>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(HollowEventTemplate::VT_PARAM_EXTS, None)} + } + #[inline] + pub fn unk_3(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowEventTemplate::VT_UNK_3, Some(0)).unwrap()} + } + #[inline] + pub fn unk_4(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowEventTemplate::VT_UNK_4, Some(0)).unwrap()} + } +} + +impl flatbuffers::Verifiable for HollowEventTemplate<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::("id", Self::VT_ID, false)? + .visit_field::>("unlock_condition", Self::VT_UNLOCK_CONDITION, false)? + .visit_field::>>>("unk_1", Self::VT_UNK_1, false)? + .visit_field::("type_", Self::VT_TYPE_, false)? + .visit_field::("can_trigger_times", Self::VT_CAN_TRIGGER_TIMES, false)? + .visit_field::>("pre_icon_res", Self::VT_PRE_ICON_RES, false)? + .visit_field::("interact_icon_texture_sheet_id", Self::VT_INTERACT_ICON_TEXTURE_SHEET_ID, false)? + .visit_field::("icon_texture_sheet_id", Self::VT_ICON_TEXTURE_SHEET_ID, false)? + .visit_field::("target_id", Self::VT_TARGET_ID, false)? + .visit_field::>("param_1", Self::VT_PARAM_1, false)? + .visit_field::>("param_2", Self::VT_PARAM_2, false)? + .visit_field::>("param_3", Self::VT_PARAM_3, false)? + .visit_field::>("param_4", Self::VT_PARAM_4, false)? + .visit_field::>("param_5", Self::VT_PARAM_5, false)? + .visit_field::>("param_6", Self::VT_PARAM_6, false)? + .visit_field::>>>("param_exts", Self::VT_PARAM_EXTS, false)? + .visit_field::("unk_3", Self::VT_UNK_3, false)? + .visit_field::("unk_4", Self::VT_UNK_4, false)? + .finish(); + Ok(()) + } +} +pub struct HollowEventTemplateArgs<'a> { + pub id: u32, + pub unlock_condition: Option>, + pub unk_1: Option>>>, + pub type_: u32, + pub can_trigger_times: i32, + pub pre_icon_res: Option>, + pub interact_icon_texture_sheet_id: i32, + pub icon_texture_sheet_id: i32, + pub target_id: u32, + pub param_1: Option>, + pub param_2: Option>, + pub param_3: Option>, + pub param_4: Option>, + pub param_5: Option>, + pub param_6: Option>, + pub param_exts: Option>>>, + pub unk_3: i32, + pub unk_4: i32, +} +impl<'a> Default for HollowEventTemplateArgs<'a> { + #[inline] + fn default() -> Self { + HollowEventTemplateArgs { + id: 0, + unlock_condition: None, + unk_1: None, + type_: 0, + can_trigger_times: 0, + pre_icon_res: None, + interact_icon_texture_sheet_id: 0, + icon_texture_sheet_id: 0, + target_id: 0, + param_1: None, + param_2: None, + param_3: None, + param_4: None, + param_5: None, + param_6: None, + param_exts: None, + unk_3: 0, + unk_4: 0, + } + } +} + +pub struct HollowEventTemplateBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> HollowEventTemplateBuilder<'a, 'b, A> { + #[inline] + pub fn add_id(&mut self, id: u32) { + self.fbb_.push_slot::(HollowEventTemplate::VT_ID, id, 0); + } + #[inline] + pub fn add_unlock_condition(&mut self, unlock_condition: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(HollowEventTemplate::VT_UNLOCK_CONDITION, unlock_condition); + } + #[inline] + pub fn add_unk_1(&mut self, unk_1: flatbuffers::WIPOffset>>) { + self.fbb_.push_slot_always::>(HollowEventTemplate::VT_UNK_1, unk_1); + } + #[inline] + pub fn add_type_(&mut self, type_: u32) { + self.fbb_.push_slot::(HollowEventTemplate::VT_TYPE_, type_, 0); + } + #[inline] + pub fn add_can_trigger_times(&mut self, can_trigger_times: i32) { + self.fbb_.push_slot::(HollowEventTemplate::VT_CAN_TRIGGER_TIMES, can_trigger_times, 0); + } + #[inline] + pub fn add_pre_icon_res(&mut self, pre_icon_res: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(HollowEventTemplate::VT_PRE_ICON_RES, pre_icon_res); + } + #[inline] + pub fn add_interact_icon_texture_sheet_id(&mut self, interact_icon_texture_sheet_id: i32) { + self.fbb_.push_slot::(HollowEventTemplate::VT_INTERACT_ICON_TEXTURE_SHEET_ID, interact_icon_texture_sheet_id, 0); + } + #[inline] + pub fn add_icon_texture_sheet_id(&mut self, icon_texture_sheet_id: i32) { + self.fbb_.push_slot::(HollowEventTemplate::VT_ICON_TEXTURE_SHEET_ID, icon_texture_sheet_id, 0); + } + #[inline] + pub fn add_target_id(&mut self, target_id: u32) { + self.fbb_.push_slot::(HollowEventTemplate::VT_TARGET_ID, target_id, 0); + } + #[inline] + pub fn add_param_1(&mut self, param_1: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(HollowEventTemplate::VT_PARAM_1, param_1); + } + #[inline] + pub fn add_param_2(&mut self, param_2: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(HollowEventTemplate::VT_PARAM_2, param_2); + } + #[inline] + pub fn add_param_3(&mut self, param_3: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(HollowEventTemplate::VT_PARAM_3, param_3); + } + #[inline] + pub fn add_param_4(&mut self, param_4: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(HollowEventTemplate::VT_PARAM_4, param_4); + } + #[inline] + pub fn add_param_5(&mut self, param_5: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(HollowEventTemplate::VT_PARAM_5, param_5); + } + #[inline] + pub fn add_param_6(&mut self, param_6: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(HollowEventTemplate::VT_PARAM_6, param_6); + } + #[inline] + pub fn add_param_exts(&mut self, param_exts: flatbuffers::WIPOffset>>) { + self.fbb_.push_slot_always::>(HollowEventTemplate::VT_PARAM_EXTS, param_exts); + } + #[inline] + pub fn add_unk_3(&mut self, unk_3: i32) { + self.fbb_.push_slot::(HollowEventTemplate::VT_UNK_3, unk_3, 0); + } + #[inline] + pub fn add_unk_4(&mut self, unk_4: i32) { + self.fbb_.push_slot::(HollowEventTemplate::VT_UNK_4, unk_4, 0); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> HollowEventTemplateBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + HollowEventTemplateBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for HollowEventTemplate<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("HollowEventTemplate"); + ds.field("id", &self.id()); + ds.field("unlock_condition", &self.unlock_condition()); + ds.field("unk_1", &self.unk_1()); + ds.field("type_", &self.type_()); + ds.field("can_trigger_times", &self.can_trigger_times()); + ds.field("pre_icon_res", &self.pre_icon_res()); + ds.field("interact_icon_texture_sheet_id", &self.interact_icon_texture_sheet_id()); + ds.field("icon_texture_sheet_id", &self.icon_texture_sheet_id()); + ds.field("target_id", &self.target_id()); + ds.field("param_1", &self.param_1()); + ds.field("param_2", &self.param_2()); + ds.field("param_3", &self.param_3()); + ds.field("param_4", &self.param_4()); + ds.field("param_5", &self.param_5()); + ds.field("param_6", &self.param_6()); + ds.field("param_exts", &self.param_exts()); + ds.field("unk_3", &self.unk_3()); + ds.field("unk_4", &self.unk_4()); + ds.finish() + } +} +pub enum HollowEventTemplateTbOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct HollowEventTemplateTb<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for HollowEventTemplateTb<'a> { + type Inner = HollowEventTemplateTb<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> HollowEventTemplateTb<'a> { + pub const VT_DATA: flatbuffers::VOffsetT = 4; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + HollowEventTemplateTb { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args HollowEventTemplateTbArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = HollowEventTemplateTbBuilder::new(_fbb); + if let Some(x) = args.data { builder.add_data(x); } + builder.finish() + } + + + #[inline] + pub fn data(&self) -> Option>>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(HollowEventTemplateTb::VT_DATA, None)} + } +} + +impl flatbuffers::Verifiable for HollowEventTemplateTb<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::>>>("data", Self::VT_DATA, false)? + .finish(); + Ok(()) + } +} +pub struct HollowEventTemplateTbArgs<'a> { + pub data: Option>>>>, +} +impl<'a> Default for HollowEventTemplateTbArgs<'a> { + #[inline] + fn default() -> Self { + HollowEventTemplateTbArgs { + data: None, + } + } +} + +pub struct HollowEventTemplateTbBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> HollowEventTemplateTbBuilder<'a, 'b, A> { + #[inline] + pub fn add_data(&mut self, data: flatbuffers::WIPOffset>>>) { + self.fbb_.push_slot_always::>(HollowEventTemplateTb::VT_DATA, data); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> HollowEventTemplateTbBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + HollowEventTemplateTbBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for HollowEventTemplateTb<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("HollowEventTemplateTb"); + ds.field("data", &self.data()); + ds.finish() + } +} diff --git a/lib/config/gen_flatbuffers/hollow_quest_template_generated.rs b/lib/config/gen_flatbuffers/hollow_quest_template_generated.rs new file mode 100644 index 0000000..6b4621d --- /dev/null +++ b/lib/config/gen_flatbuffers/hollow_quest_template_generated.rs @@ -0,0 +1,1563 @@ +// automatically generated by the FlatBuffers compiler, do not modify + + +// @generated + +use core::mem; +use core::cmp::Ordering; + +extern crate flatbuffers; +use self::flatbuffers::{EndianScalar, Follow}; + +#[deprecated(since = "2.0.0", note = "Use associated constants instead. This will no longer be generated in 2021.")] +pub const ENUM_MIN_HOLLOW_QUEST_TYPE: i32 = 0; +#[deprecated(since = "2.0.0", note = "Use associated constants instead. This will no longer be generated in 2021.")] +pub const ENUM_MAX_HOLLOW_QUEST_TYPE: i32 = 27; +#[deprecated(since = "2.0.0", note = "Use associated constants instead. This will no longer be generated in 2021.")] +#[allow(non_camel_case_types)] +pub const ENUM_VALUES_HOLLOW_QUEST_TYPE: [HollowQuestType; 27] = [ + HollowQuestType::Common, + HollowQuestType::MainQuest, + HollowQuestType::SideQuest, + HollowQuestType::Urgent, + HollowQuestType::UrgentSupplement, + HollowQuestType::Challenge, + HollowQuestType::ChallengeChaos, + HollowQuestType::AvatarSide, + HollowQuestType::World, + HollowQuestType::NormalBattle, + HollowQuestType::PromoteBattle, + HollowQuestType::DifficutyBattle, + HollowQuestType::RallyBattle, + HollowQuestType::BossRushBattle, + HollowQuestType::NestVeryHard, + HollowQuestType::HackerActivity, + HollowQuestType::Arpeggio, + HollowQuestType::TheGun, + HollowQuestType::AbyssS2_Story, + HollowQuestType::AbyssS2_Period, + HollowQuestType::MainQuestChessboard, + HollowQuestType::AbyssS2_RoleChallenge, + HollowQuestType::DreamNormal, + HollowQuestType::DreamEndLess, + HollowQuestType::AbyssS2_Event, + HollowQuestType::AbyssS2_HobaPrefac, + HollowQuestType::EnumCount, +]; + +#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)] +#[repr(transparent)] +pub struct HollowQuestType(pub i32); +#[allow(non_upper_case_globals)] +impl HollowQuestType { + pub const Common: Self = Self(0); + pub const MainQuest: Self = Self(1); + pub const SideQuest: Self = Self(2); + pub const Urgent: Self = Self(3); + pub const UrgentSupplement: Self = Self(4); + pub const Challenge: Self = Self(5); + pub const ChallengeChaos: Self = Self(6); + pub const AvatarSide: Self = Self(7); + pub const World: Self = Self(8); + pub const NormalBattle: Self = Self(10); + pub const PromoteBattle: Self = Self(11); + pub const DifficutyBattle: Self = Self(12); + pub const RallyBattle: Self = Self(13); + pub const BossRushBattle: Self = Self(14); + pub const NestVeryHard: Self = Self(15); + pub const HackerActivity: Self = Self(16); + pub const Arpeggio: Self = Self(17); + pub const TheGun: Self = Self(18); + pub const AbyssS2_Story: Self = Self(19); + pub const AbyssS2_Period: Self = Self(20); + pub const MainQuestChessboard: Self = Self(21); + pub const AbyssS2_RoleChallenge: Self = Self(22); + pub const DreamNormal: Self = Self(23); + pub const DreamEndLess: Self = Self(24); + pub const AbyssS2_Event: Self = Self(25); + pub const AbyssS2_HobaPrefac: Self = Self(26); + pub const EnumCount: Self = Self(27); + + pub const ENUM_MIN: i32 = 0; + pub const ENUM_MAX: i32 = 27; + pub const ENUM_VALUES: &'static [Self] = &[ + Self::Common, + Self::MainQuest, + Self::SideQuest, + Self::Urgent, + Self::UrgentSupplement, + Self::Challenge, + Self::ChallengeChaos, + Self::AvatarSide, + Self::World, + Self::NormalBattle, + Self::PromoteBattle, + Self::DifficutyBattle, + Self::RallyBattle, + Self::BossRushBattle, + Self::NestVeryHard, + Self::HackerActivity, + Self::Arpeggio, + Self::TheGun, + Self::AbyssS2_Story, + Self::AbyssS2_Period, + Self::MainQuestChessboard, + Self::AbyssS2_RoleChallenge, + Self::DreamNormal, + Self::DreamEndLess, + Self::AbyssS2_Event, + Self::AbyssS2_HobaPrefac, + Self::EnumCount, + ]; + /// Returns the variant's name or "" if unknown. + pub fn variant_name(self) -> Option<&'static str> { + match self { + Self::Common => Some("Common"), + Self::MainQuest => Some("MainQuest"), + Self::SideQuest => Some("SideQuest"), + Self::Urgent => Some("Urgent"), + Self::UrgentSupplement => Some("UrgentSupplement"), + Self::Challenge => Some("Challenge"), + Self::ChallengeChaos => Some("ChallengeChaos"), + Self::AvatarSide => Some("AvatarSide"), + Self::World => Some("World"), + Self::NormalBattle => Some("NormalBattle"), + Self::PromoteBattle => Some("PromoteBattle"), + Self::DifficutyBattle => Some("DifficutyBattle"), + Self::RallyBattle => Some("RallyBattle"), + Self::BossRushBattle => Some("BossRushBattle"), + Self::NestVeryHard => Some("NestVeryHard"), + Self::HackerActivity => Some("HackerActivity"), + Self::Arpeggio => Some("Arpeggio"), + Self::TheGun => Some("TheGun"), + Self::AbyssS2_Story => Some("AbyssS2_Story"), + Self::AbyssS2_Period => Some("AbyssS2_Period"), + Self::MainQuestChessboard => Some("MainQuestChessboard"), + Self::AbyssS2_RoleChallenge => Some("AbyssS2_RoleChallenge"), + Self::DreamNormal => Some("DreamNormal"), + Self::DreamEndLess => Some("DreamEndLess"), + Self::AbyssS2_Event => Some("AbyssS2_Event"), + Self::AbyssS2_HobaPrefac => Some("AbyssS2_HobaPrefac"), + Self::EnumCount => Some("EnumCount"), + _ => None, + } + } +} +impl core::fmt::Debug for HollowQuestType { + fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { + if let Some(name) = self.variant_name() { + f.write_str(name) + } else { + f.write_fmt(format_args!("", self.0)) + } + } +} +impl<'a> flatbuffers::Follow<'a> for HollowQuestType { + type Inner = Self; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + let b = flatbuffers::read_scalar_at::(buf, loc); + Self(b) + } +} + +impl flatbuffers::Push for HollowQuestType { + type Output = HollowQuestType; + #[inline] + unsafe fn push(&self, dst: &mut [u8], _written_len: usize) { + flatbuffers::emplace_scalar::(dst, self.0); + } +} + +impl flatbuffers::EndianScalar for HollowQuestType { + type Scalar = i32; + #[inline] + fn to_little_endian(self) -> i32 { + self.0.to_le() + } + #[inline] + #[allow(clippy::wrong_self_convention)] + fn from_little_endian(v: i32) -> Self { + let b = i32::from_le(v); + Self(b) + } +} + +impl<'a> flatbuffers::Verifiable for HollowQuestType { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + i32::run_verifier(v, pos) + } +} + +impl flatbuffers::SimpleToVerifyInSlice for HollowQuestType {} +pub enum HollowQuestTemplateOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct HollowQuestTemplate<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for HollowQuestTemplate<'a> { + type Inner = HollowQuestTemplate<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> HollowQuestTemplate<'a> { + pub const VT_ID: flatbuffers::VOffsetT = 4; + pub const VT_UNK_1: flatbuffers::VOffsetT = 6; + pub const VT_CHESSBOARD_ID: flatbuffers::VOffsetT = 8; + pub const VT_UNK_2: flatbuffers::VOffsetT = 10; + pub const VT_HOLLOW_ID: flatbuffers::VOffsetT = 12; + pub const VT_HOLLOW_QUEST_TYPE: flatbuffers::VOffsetT = 14; + pub const VT_UNK_3: flatbuffers::VOffsetT = 16; + pub const VT_DURATION: flatbuffers::VOffsetT = 18; + pub const VT_HAS_STAMINA: flatbuffers::VOffsetT = 20; + pub const VT_ENVIRONMENTS: flatbuffers::VOffsetT = 22; + pub const VT_MAIN_DIFFICULTY: flatbuffers::VOffsetT = 24; + pub const VT_DIFFICULTIES: flatbuffers::VOffsetT = 26; + pub const VT_RECOMMENDED_ELEMENTS: flatbuffers::VOffsetT = 28; + pub const VT_CLIENT: flatbuffers::VOffsetT = 30; + pub const VT_UNK_4: flatbuffers::VOffsetT = 32; + pub const VT_UNK_5: flatbuffers::VOffsetT = 34; + pub const VT_UNK_6: flatbuffers::VOffsetT = 36; + pub const VT_SCALE: flatbuffers::VOffsetT = 38; + pub const VT_SHOW_TIP: flatbuffers::VOffsetT = 40; + pub const VT_MONSTER_LEVEL: flatbuffers::VOffsetT = 42; + pub const VT_RECOMMENDED_LEVEL: flatbuffers::VOffsetT = 44; + pub const VT_AVERAGE_LEVEL_TIPS: flatbuffers::VOffsetT = 46; + pub const VT_RECOMMENDED_HIT_TYPES: flatbuffers::VOffsetT = 48; + pub const VT_UNK_7: flatbuffers::VOffsetT = 50; + pub const VT_UNK_8: flatbuffers::VOffsetT = 52; + pub const VT_UNK_9: flatbuffers::VOffsetT = 54; + pub const VT_UNK_10: flatbuffers::VOffsetT = 56; + pub const VT_UNK_11: flatbuffers::VOffsetT = 58; + pub const VT_UNK_12: flatbuffers::VOffsetT = 60; + pub const VT_UNK_13: flatbuffers::VOffsetT = 62; + pub const VT_SLOT_1_AVATAR: flatbuffers::VOffsetT = 64; + pub const VT_SLOT_2_AVATAR: flatbuffers::VOffsetT = 66; + pub const VT_SLOT_3_AVATAR: flatbuffers::VOffsetT = 68; + pub const VT_UNK_14: flatbuffers::VOffsetT = 70; + pub const VT_UNK_15: flatbuffers::VOffsetT = 72; + pub const VT_UNK_16: flatbuffers::VOffsetT = 74; + pub const VT_UNK_17: flatbuffers::VOffsetT = 76; + pub const VT_PREVIEW_RES_GROUP_ID: flatbuffers::VOffsetT = 78; + pub const VT_CHESSBOARD_RES_GROUP_ID: flatbuffers::VOffsetT = 80; + pub const VT_BGM_CHAPTER_STATE: flatbuffers::VOffsetT = 82; + pub const VT_UNK_18: flatbuffers::VOffsetT = 84; + pub const VT_UNK_19: flatbuffers::VOffsetT = 86; + pub const VT_UNK_20: flatbuffers::VOffsetT = 88; + pub const VT_UNK_21: flatbuffers::VOffsetT = 90; + pub const VT_UNK_22: flatbuffers::VOffsetT = 92; + pub const VT_UNK_23: flatbuffers::VOffsetT = 94; + pub const VT_UNK_24: flatbuffers::VOffsetT = 96; + pub const VT_UNK_25: flatbuffers::VOffsetT = 98; + pub const VT_UNK_26: flatbuffers::VOffsetT = 100; + pub const VT_TITLE: flatbuffers::VOffsetT = 102; + pub const VT_DIFFICULTY: flatbuffers::VOffsetT = 104; + pub const VT_TARGET: flatbuffers::VOffsetT = 106; + pub const VT_UNK_27: flatbuffers::VOffsetT = 108; + pub const VT_UNK_28: flatbuffers::VOffsetT = 110; + pub const VT_UNK_29: flatbuffers::VOffsetT = 112; + pub const VT_UNK_30: flatbuffers::VOffsetT = 114; + pub const VT_UNK_31: flatbuffers::VOffsetT = 116; + pub const VT_UNK_32: flatbuffers::VOffsetT = 118; + pub const VT_UNK_33: flatbuffers::VOffsetT = 120; + pub const VT_HOLLOW_ITEM_BAN_LISTS: flatbuffers::VOffsetT = 122; + pub const VT_UNK_34: flatbuffers::VOffsetT = 124; + pub const VT_ENEMY_TYPES: flatbuffers::VOffsetT = 126; + pub const VT_BACKGROUND: flatbuffers::VOffsetT = 128; + pub const VT_UNK_35: flatbuffers::VOffsetT = 130; + pub const VT_UNK_36: flatbuffers::VOffsetT = 132; + pub const VT_UNK_37: flatbuffers::VOffsetT = 134; + pub const VT_UNK_38: flatbuffers::VOffsetT = 136; + pub const VT_UNK_39: flatbuffers::VOffsetT = 138; + pub const VT_UNK_40: flatbuffers::VOffsetT = 140; + pub const VT_UNK_41: flatbuffers::VOffsetT = 142; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + HollowQuestTemplate { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args HollowQuestTemplateArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = HollowQuestTemplateBuilder::new(_fbb); + builder.add_unk_41(args.unk_41); + builder.add_unk_40(args.unk_40); + builder.add_unk_39(args.unk_39); + builder.add_unk_38(args.unk_38); + if let Some(x) = args.unk_37 { builder.add_unk_37(x); } + if let Some(x) = args.unk_36 { builder.add_unk_36(x); } + builder.add_unk_35(args.unk_35); + if let Some(x) = args.background { builder.add_background(x); } + if let Some(x) = args.enemy_types { builder.add_enemy_types(x); } + if let Some(x) = args.hollow_item_ban_lists { builder.add_hollow_item_ban_lists(x); } + builder.add_unk_33(args.unk_33); + builder.add_unk_31(args.unk_31); + builder.add_unk_29(args.unk_29); + builder.add_unk_28(args.unk_28); + if let Some(x) = args.unk_27 { builder.add_unk_27(x); } + if let Some(x) = args.target { builder.add_target(x); } + if let Some(x) = args.difficulty { builder.add_difficulty(x); } + if let Some(x) = args.title { builder.add_title(x); } + builder.add_unk_26(args.unk_26); + builder.add_unk_24(args.unk_24); + builder.add_unk_23(args.unk_23); + builder.add_unk_22(args.unk_22); + if let Some(x) = args.unk_21 { builder.add_unk_21(x); } + builder.add_unk_20(args.unk_20); + if let Some(x) = args.unk_19 { builder.add_unk_19(x); } + builder.add_unk_18(args.unk_18); + if let Some(x) = args.bgm_chapter_state { builder.add_bgm_chapter_state(x); } + builder.add_chessboard_res_group_id(args.chessboard_res_group_id); + builder.add_preview_res_group_id(args.preview_res_group_id); + builder.add_unk_17(args.unk_17); + builder.add_unk_14(args.unk_14); + builder.add_slot_3_avatar(args.slot_3_avatar); + builder.add_slot_2_avatar(args.slot_2_avatar); + builder.add_slot_1_avatar(args.slot_1_avatar); + builder.add_unk_13(args.unk_13); + builder.add_unk_11(args.unk_11); + if let Some(x) = args.unk_10 { builder.add_unk_10(x); } + if let Some(x) = args.unk_7 { builder.add_unk_7(x); } + if let Some(x) = args.recommended_hit_types { builder.add_recommended_hit_types(x); } + builder.add_average_level_tips(args.average_level_tips); + builder.add_recommended_level(args.recommended_level); + builder.add_monster_level(args.monster_level); + builder.add_show_tip(args.show_tip); + builder.add_scale(args.scale); + builder.add_unk_6(args.unk_6); + builder.add_unk_4(args.unk_4); + if let Some(x) = args.client { builder.add_client(x); } + if let Some(x) = args.recommended_elements { builder.add_recommended_elements(x); } + if let Some(x) = args.difficulties { builder.add_difficulties(x); } + if let Some(x) = args.main_difficulty { builder.add_main_difficulty(x); } + if let Some(x) = args.environments { builder.add_environments(x); } + if let Some(x) = args.has_stamina { builder.add_has_stamina(x); } + if let Some(x) = args.duration { builder.add_duration(x); } + builder.add_unk_3(args.unk_3); + builder.add_hollow_quest_type(args.hollow_quest_type); + builder.add_hollow_id(args.hollow_id); + builder.add_unk_2(args.unk_2); + builder.add_chessboard_id(args.chessboard_id); + builder.add_unk_1(args.unk_1); + builder.add_id(args.id); + builder.add_unk_34(args.unk_34); + builder.add_unk_32(args.unk_32); + builder.add_unk_30(args.unk_30); + builder.add_unk_25(args.unk_25); + builder.add_unk_16(args.unk_16); + builder.add_unk_15(args.unk_15); + builder.add_unk_12(args.unk_12); + builder.add_unk_9(args.unk_9); + builder.add_unk_8(args.unk_8); + builder.add_unk_5(args.unk_5); + builder.finish() + } + + + #[inline] + pub fn id(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_ID, Some(0)).unwrap()} + } + #[inline] + pub fn unk_1(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_UNK_1, Some(0)).unwrap()} + } + #[inline] + pub fn chessboard_id(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_CHESSBOARD_ID, Some(0)).unwrap()} + } + #[inline] + pub fn unk_2(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_UNK_2, Some(0)).unwrap()} + } + #[inline] + pub fn hollow_id(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_HOLLOW_ID, Some(0)).unwrap()} + } + #[inline] + pub fn hollow_quest_type(&self) -> HollowQuestType { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_HOLLOW_QUEST_TYPE, Some(HollowQuestType::Common)).unwrap()} + } + #[inline] + pub fn unk_3(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_UNK_3, Some(0)).unwrap()} + } + #[inline] + pub fn duration(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(HollowQuestTemplate::VT_DURATION, None)} + } + #[inline] + pub fn has_stamina(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(HollowQuestTemplate::VT_HAS_STAMINA, None)} + } + #[inline] + pub fn environments(&self) -> Option>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(HollowQuestTemplate::VT_ENVIRONMENTS, None)} + } + #[inline] + pub fn main_difficulty(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(HollowQuestTemplate::VT_MAIN_DIFFICULTY, None)} + } + #[inline] + pub fn difficulties(&self) -> Option>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(HollowQuestTemplate::VT_DIFFICULTIES, None)} + } + #[inline] + pub fn recommended_elements(&self) -> Option>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(HollowQuestTemplate::VT_RECOMMENDED_ELEMENTS, None)} + } + #[inline] + pub fn client(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(HollowQuestTemplate::VT_CLIENT, None)} + } + #[inline] + pub fn unk_4(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_UNK_4, Some(0)).unwrap()} + } + #[inline] + pub fn unk_5(&self) -> bool { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_UNK_5, Some(false)).unwrap()} + } + #[inline] + pub fn unk_6(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_UNK_6, Some(0)).unwrap()} + } + #[inline] + pub fn scale(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_SCALE, Some(0)).unwrap()} + } + #[inline] + pub fn show_tip(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_SHOW_TIP, Some(0)).unwrap()} + } + #[inline] + pub fn monster_level(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_MONSTER_LEVEL, Some(0)).unwrap()} + } + #[inline] + pub fn recommended_level(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_RECOMMENDED_LEVEL, Some(0)).unwrap()} + } + #[inline] + pub fn average_level_tips(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_AVERAGE_LEVEL_TIPS, Some(0)).unwrap()} + } + #[inline] + pub fn recommended_hit_types(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(HollowQuestTemplate::VT_RECOMMENDED_HIT_TYPES, None)} + } + #[inline] + pub fn unk_7(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(HollowQuestTemplate::VT_UNK_7, None)} + } + #[inline] + pub fn unk_8(&self) -> bool { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_UNK_8, Some(false)).unwrap()} + } + #[inline] + pub fn unk_9(&self) -> bool { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_UNK_9, Some(false)).unwrap()} + } + #[inline] + pub fn unk_10(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(HollowQuestTemplate::VT_UNK_10, None)} + } + #[inline] + pub fn unk_11(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_UNK_11, Some(0)).unwrap()} + } + #[inline] + pub fn unk_12(&self) -> bool { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_UNK_12, Some(false)).unwrap()} + } + #[inline] + pub fn unk_13(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_UNK_13, Some(0)).unwrap()} + } + #[inline] + pub fn slot_1_avatar(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_SLOT_1_AVATAR, Some(0)).unwrap()} + } + #[inline] + pub fn slot_2_avatar(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_SLOT_2_AVATAR, Some(0)).unwrap()} + } + #[inline] + pub fn slot_3_avatar(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_SLOT_3_AVATAR, Some(0)).unwrap()} + } + #[inline] + pub fn unk_14(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_UNK_14, Some(0)).unwrap()} + } + #[inline] + pub fn unk_15(&self) -> bool { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_UNK_15, Some(false)).unwrap()} + } + #[inline] + pub fn unk_16(&self) -> bool { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_UNK_16, Some(false)).unwrap()} + } + #[inline] + pub fn unk_17(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_UNK_17, Some(0)).unwrap()} + } + #[inline] + pub fn preview_res_group_id(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_PREVIEW_RES_GROUP_ID, Some(0)).unwrap()} + } + #[inline] + pub fn chessboard_res_group_id(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_CHESSBOARD_RES_GROUP_ID, Some(0)).unwrap()} + } + #[inline] + pub fn bgm_chapter_state(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(HollowQuestTemplate::VT_BGM_CHAPTER_STATE, None)} + } + #[inline] + pub fn unk_18(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_UNK_18, Some(0)).unwrap()} + } + #[inline] + pub fn unk_19(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(HollowQuestTemplate::VT_UNK_19, None)} + } + #[inline] + pub fn unk_20(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_UNK_20, Some(0)).unwrap()} + } + #[inline] + pub fn unk_21(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(HollowQuestTemplate::VT_UNK_21, None)} + } + #[inline] + pub fn unk_22(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_UNK_22, Some(0)).unwrap()} + } + #[inline] + pub fn unk_23(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_UNK_23, Some(0)).unwrap()} + } + #[inline] + pub fn unk_24(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_UNK_24, Some(0)).unwrap()} + } + #[inline] + pub fn unk_25(&self) -> bool { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_UNK_25, Some(false)).unwrap()} + } + #[inline] + pub fn unk_26(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_UNK_26, Some(0)).unwrap()} + } + #[inline] + pub fn title(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(HollowQuestTemplate::VT_TITLE, None)} + } + #[inline] + pub fn difficulty(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(HollowQuestTemplate::VT_DIFFICULTY, None)} + } + #[inline] + pub fn target(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(HollowQuestTemplate::VT_TARGET, None)} + } + #[inline] + pub fn unk_27(&self) -> Option>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(HollowQuestTemplate::VT_UNK_27, None)} + } + #[inline] + pub fn unk_28(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_UNK_28, Some(0)).unwrap()} + } + #[inline] + pub fn unk_29(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_UNK_29, Some(0)).unwrap()} + } + #[inline] + pub fn unk_30(&self) -> bool { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_UNK_30, Some(false)).unwrap()} + } + #[inline] + pub fn unk_31(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_UNK_31, Some(0)).unwrap()} + } + #[inline] + pub fn unk_32(&self) -> bool { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_UNK_32, Some(false)).unwrap()} + } + #[inline] + pub fn unk_33(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_UNK_33, Some(0)).unwrap()} + } + #[inline] + pub fn hollow_item_ban_lists(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(HollowQuestTemplate::VT_HOLLOW_ITEM_BAN_LISTS, None)} + } + #[inline] + pub fn unk_34(&self) -> bool { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_UNK_34, Some(false)).unwrap()} + } + #[inline] + pub fn enemy_types(&self) -> Option>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(HollowQuestTemplate::VT_ENEMY_TYPES, None)} + } + #[inline] + pub fn background(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(HollowQuestTemplate::VT_BACKGROUND, None)} + } + #[inline] + pub fn unk_35(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_UNK_35, Some(0)).unwrap()} + } + #[inline] + pub fn unk_36(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(HollowQuestTemplate::VT_UNK_36, None)} + } + #[inline] + pub fn unk_37(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(HollowQuestTemplate::VT_UNK_37, None)} + } + #[inline] + pub fn unk_38(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_UNK_38, Some(0)).unwrap()} + } + #[inline] + pub fn unk_39(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_UNK_39, Some(0)).unwrap()} + } + #[inline] + pub fn unk_40(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_UNK_40, Some(0)).unwrap()} + } + #[inline] + pub fn unk_41(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(HollowQuestTemplate::VT_UNK_41, Some(0)).unwrap()} + } +} + +impl flatbuffers::Verifiable for HollowQuestTemplate<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::("id", Self::VT_ID, false)? + .visit_field::("unk_1", Self::VT_UNK_1, false)? + .visit_field::("chessboard_id", Self::VT_CHESSBOARD_ID, false)? + .visit_field::("unk_2", Self::VT_UNK_2, false)? + .visit_field::("hollow_id", Self::VT_HOLLOW_ID, false)? + .visit_field::("hollow_quest_type", Self::VT_HOLLOW_QUEST_TYPE, false)? + .visit_field::("unk_3", Self::VT_UNK_3, false)? + .visit_field::>("duration", Self::VT_DURATION, false)? + .visit_field::>("has_stamina", Self::VT_HAS_STAMINA, false)? + .visit_field::>>>("environments", Self::VT_ENVIRONMENTS, false)? + .visit_field::>("main_difficulty", Self::VT_MAIN_DIFFICULTY, false)? + .visit_field::>>>("difficulties", Self::VT_DIFFICULTIES, false)? + .visit_field::>>>("recommended_elements", Self::VT_RECOMMENDED_ELEMENTS, false)? + .visit_field::>("client", Self::VT_CLIENT, false)? + .visit_field::("unk_4", Self::VT_UNK_4, false)? + .visit_field::("unk_5", Self::VT_UNK_5, false)? + .visit_field::("unk_6", Self::VT_UNK_6, false)? + .visit_field::("scale", Self::VT_SCALE, false)? + .visit_field::("show_tip", Self::VT_SHOW_TIP, false)? + .visit_field::("monster_level", Self::VT_MONSTER_LEVEL, false)? + .visit_field::("recommended_level", Self::VT_RECOMMENDED_LEVEL, false)? + .visit_field::("average_level_tips", Self::VT_AVERAGE_LEVEL_TIPS, false)? + .visit_field::>>("recommended_hit_types", Self::VT_RECOMMENDED_HIT_TYPES, false)? + .visit_field::>>("unk_7", Self::VT_UNK_7, false)? + .visit_field::("unk_8", Self::VT_UNK_8, false)? + .visit_field::("unk_9", Self::VT_UNK_9, false)? + .visit_field::>("unk_10", Self::VT_UNK_10, false)? + .visit_field::("unk_11", Self::VT_UNK_11, false)? + .visit_field::("unk_12", Self::VT_UNK_12, false)? + .visit_field::("unk_13", Self::VT_UNK_13, false)? + .visit_field::("slot_1_avatar", Self::VT_SLOT_1_AVATAR, false)? + .visit_field::("slot_2_avatar", Self::VT_SLOT_2_AVATAR, false)? + .visit_field::("slot_3_avatar", Self::VT_SLOT_3_AVATAR, false)? + .visit_field::("unk_14", Self::VT_UNK_14, false)? + .visit_field::("unk_15", Self::VT_UNK_15, false)? + .visit_field::("unk_16", Self::VT_UNK_16, false)? + .visit_field::("unk_17", Self::VT_UNK_17, false)? + .visit_field::("preview_res_group_id", Self::VT_PREVIEW_RES_GROUP_ID, false)? + .visit_field::("chessboard_res_group_id", Self::VT_CHESSBOARD_RES_GROUP_ID, false)? + .visit_field::>("bgm_chapter_state", Self::VT_BGM_CHAPTER_STATE, false)? + .visit_field::("unk_18", Self::VT_UNK_18, false)? + .visit_field::>("unk_19", Self::VT_UNK_19, false)? + .visit_field::("unk_20", Self::VT_UNK_20, false)? + .visit_field::>>("unk_21", Self::VT_UNK_21, false)? + .visit_field::("unk_22", Self::VT_UNK_22, false)? + .visit_field::("unk_23", Self::VT_UNK_23, false)? + .visit_field::("unk_24", Self::VT_UNK_24, false)? + .visit_field::("unk_25", Self::VT_UNK_25, false)? + .visit_field::("unk_26", Self::VT_UNK_26, false)? + .visit_field::>("title", Self::VT_TITLE, false)? + .visit_field::>("difficulty", Self::VT_DIFFICULTY, false)? + .visit_field::>("target", Self::VT_TARGET, false)? + .visit_field::>>>("unk_27", Self::VT_UNK_27, false)? + .visit_field::("unk_28", Self::VT_UNK_28, false)? + .visit_field::("unk_29", Self::VT_UNK_29, false)? + .visit_field::("unk_30", Self::VT_UNK_30, false)? + .visit_field::("unk_31", Self::VT_UNK_31, false)? + .visit_field::("unk_32", Self::VT_UNK_32, false)? + .visit_field::("unk_33", Self::VT_UNK_33, false)? + .visit_field::>>("hollow_item_ban_lists", Self::VT_HOLLOW_ITEM_BAN_LISTS, false)? + .visit_field::("unk_34", Self::VT_UNK_34, false)? + .visit_field::>>>("enemy_types", Self::VT_ENEMY_TYPES, false)? + .visit_field::>("background", Self::VT_BACKGROUND, false)? + .visit_field::("unk_35", Self::VT_UNK_35, false)? + .visit_field::>>("unk_36", Self::VT_UNK_36, false)? + .visit_field::>>("unk_37", Self::VT_UNK_37, false)? + .visit_field::("unk_38", Self::VT_UNK_38, false)? + .visit_field::("unk_39", Self::VT_UNK_39, false)? + .visit_field::("unk_40", Self::VT_UNK_40, false)? + .visit_field::("unk_41", Self::VT_UNK_41, false)? + .finish(); + Ok(()) + } +} +pub struct HollowQuestTemplateArgs<'a> { + pub id: u32, + pub unk_1: i32, + pub chessboard_id: u32, + pub unk_2: i32, + pub hollow_id: u32, + pub hollow_quest_type: HollowQuestType, + pub unk_3: i32, + pub duration: Option>, + pub has_stamina: Option>, + pub environments: Option>>>, + pub main_difficulty: Option>, + pub difficulties: Option>>>, + pub recommended_elements: Option>>>, + pub client: Option>, + pub unk_4: i32, + pub unk_5: bool, + pub unk_6: i32, + pub scale: i32, + pub show_tip: i32, + pub monster_level: i32, + pub recommended_level: i32, + pub average_level_tips: i32, + pub recommended_hit_types: Option>>, + pub unk_7: Option>>, + pub unk_8: bool, + pub unk_9: bool, + pub unk_10: Option>, + pub unk_11: i32, + pub unk_12: bool, + pub unk_13: i32, + pub slot_1_avatar: i32, + pub slot_2_avatar: i32, + pub slot_3_avatar: i32, + pub unk_14: i32, + pub unk_15: bool, + pub unk_16: bool, + pub unk_17: i32, + pub preview_res_group_id: i32, + pub chessboard_res_group_id: i32, + pub bgm_chapter_state: Option>, + pub unk_18: i32, + pub unk_19: Option>, + pub unk_20: i32, + pub unk_21: Option>>, + pub unk_22: i32, + pub unk_23: i32, + pub unk_24: i32, + pub unk_25: bool, + pub unk_26: i32, + pub title: Option>, + pub difficulty: Option>, + pub target: Option>, + pub unk_27: Option>>>, + pub unk_28: i32, + pub unk_29: i32, + pub unk_30: bool, + pub unk_31: i32, + pub unk_32: bool, + pub unk_33: i32, + pub hollow_item_ban_lists: Option>>, + pub unk_34: bool, + pub enemy_types: Option>>>, + pub background: Option>, + pub unk_35: i32, + pub unk_36: Option>>, + pub unk_37: Option>>, + pub unk_38: i32, + pub unk_39: i32, + pub unk_40: i32, + pub unk_41: i32, +} +impl<'a> Default for HollowQuestTemplateArgs<'a> { + #[inline] + fn default() -> Self { + HollowQuestTemplateArgs { + id: 0, + unk_1: 0, + chessboard_id: 0, + unk_2: 0, + hollow_id: 0, + hollow_quest_type: HollowQuestType::Common, + unk_3: 0, + duration: None, + has_stamina: None, + environments: None, + main_difficulty: None, + difficulties: None, + recommended_elements: None, + client: None, + unk_4: 0, + unk_5: false, + unk_6: 0, + scale: 0, + show_tip: 0, + monster_level: 0, + recommended_level: 0, + average_level_tips: 0, + recommended_hit_types: None, + unk_7: None, + unk_8: false, + unk_9: false, + unk_10: None, + unk_11: 0, + unk_12: false, + unk_13: 0, + slot_1_avatar: 0, + slot_2_avatar: 0, + slot_3_avatar: 0, + unk_14: 0, + unk_15: false, + unk_16: false, + unk_17: 0, + preview_res_group_id: 0, + chessboard_res_group_id: 0, + bgm_chapter_state: None, + unk_18: 0, + unk_19: None, + unk_20: 0, + unk_21: None, + unk_22: 0, + unk_23: 0, + unk_24: 0, + unk_25: false, + unk_26: 0, + title: None, + difficulty: None, + target: None, + unk_27: None, + unk_28: 0, + unk_29: 0, + unk_30: false, + unk_31: 0, + unk_32: false, + unk_33: 0, + hollow_item_ban_lists: None, + unk_34: false, + enemy_types: None, + background: None, + unk_35: 0, + unk_36: None, + unk_37: None, + unk_38: 0, + unk_39: 0, + unk_40: 0, + unk_41: 0, + } + } +} + +pub struct HollowQuestTemplateBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> HollowQuestTemplateBuilder<'a, 'b, A> { + #[inline] + pub fn add_id(&mut self, id: u32) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_ID, id, 0); + } + #[inline] + pub fn add_unk_1(&mut self, unk_1: i32) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_UNK_1, unk_1, 0); + } + #[inline] + pub fn add_chessboard_id(&mut self, chessboard_id: u32) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_CHESSBOARD_ID, chessboard_id, 0); + } + #[inline] + pub fn add_unk_2(&mut self, unk_2: i32) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_UNK_2, unk_2, 0); + } + #[inline] + pub fn add_hollow_id(&mut self, hollow_id: u32) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_HOLLOW_ID, hollow_id, 0); + } + #[inline] + pub fn add_hollow_quest_type(&mut self, hollow_quest_type: HollowQuestType) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_HOLLOW_QUEST_TYPE, hollow_quest_type, HollowQuestType::Common); + } + #[inline] + pub fn add_unk_3(&mut self, unk_3: i32) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_UNK_3, unk_3, 0); + } + #[inline] + pub fn add_duration(&mut self, duration: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(HollowQuestTemplate::VT_DURATION, duration); + } + #[inline] + pub fn add_has_stamina(&mut self, has_stamina: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(HollowQuestTemplate::VT_HAS_STAMINA, has_stamina); + } + #[inline] + pub fn add_environments(&mut self, environments: flatbuffers::WIPOffset>>) { + self.fbb_.push_slot_always::>(HollowQuestTemplate::VT_ENVIRONMENTS, environments); + } + #[inline] + pub fn add_main_difficulty(&mut self, main_difficulty: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(HollowQuestTemplate::VT_MAIN_DIFFICULTY, main_difficulty); + } + #[inline] + pub fn add_difficulties(&mut self, difficulties: flatbuffers::WIPOffset>>) { + self.fbb_.push_slot_always::>(HollowQuestTemplate::VT_DIFFICULTIES, difficulties); + } + #[inline] + pub fn add_recommended_elements(&mut self, recommended_elements: flatbuffers::WIPOffset>>) { + self.fbb_.push_slot_always::>(HollowQuestTemplate::VT_RECOMMENDED_ELEMENTS, recommended_elements); + } + #[inline] + pub fn add_client(&mut self, client: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(HollowQuestTemplate::VT_CLIENT, client); + } + #[inline] + pub fn add_unk_4(&mut self, unk_4: i32) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_UNK_4, unk_4, 0); + } + #[inline] + pub fn add_unk_5(&mut self, unk_5: bool) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_UNK_5, unk_5, false); + } + #[inline] + pub fn add_unk_6(&mut self, unk_6: i32) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_UNK_6, unk_6, 0); + } + #[inline] + pub fn add_scale(&mut self, scale: i32) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_SCALE, scale, 0); + } + #[inline] + pub fn add_show_tip(&mut self, show_tip: i32) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_SHOW_TIP, show_tip, 0); + } + #[inline] + pub fn add_monster_level(&mut self, monster_level: i32) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_MONSTER_LEVEL, monster_level, 0); + } + #[inline] + pub fn add_recommended_level(&mut self, recommended_level: i32) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_RECOMMENDED_LEVEL, recommended_level, 0); + } + #[inline] + pub fn add_average_level_tips(&mut self, average_level_tips: i32) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_AVERAGE_LEVEL_TIPS, average_level_tips, 0); + } + #[inline] + pub fn add_recommended_hit_types(&mut self, recommended_hit_types: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(HollowQuestTemplate::VT_RECOMMENDED_HIT_TYPES, recommended_hit_types); + } + #[inline] + pub fn add_unk_7(&mut self, unk_7: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(HollowQuestTemplate::VT_UNK_7, unk_7); + } + #[inline] + pub fn add_unk_8(&mut self, unk_8: bool) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_UNK_8, unk_8, false); + } + #[inline] + pub fn add_unk_9(&mut self, unk_9: bool) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_UNK_9, unk_9, false); + } + #[inline] + pub fn add_unk_10(&mut self, unk_10: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(HollowQuestTemplate::VT_UNK_10, unk_10); + } + #[inline] + pub fn add_unk_11(&mut self, unk_11: i32) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_UNK_11, unk_11, 0); + } + #[inline] + pub fn add_unk_12(&mut self, unk_12: bool) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_UNK_12, unk_12, false); + } + #[inline] + pub fn add_unk_13(&mut self, unk_13: i32) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_UNK_13, unk_13, 0); + } + #[inline] + pub fn add_slot_1_avatar(&mut self, slot_1_avatar: i32) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_SLOT_1_AVATAR, slot_1_avatar, 0); + } + #[inline] + pub fn add_slot_2_avatar(&mut self, slot_2_avatar: i32) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_SLOT_2_AVATAR, slot_2_avatar, 0); + } + #[inline] + pub fn add_slot_3_avatar(&mut self, slot_3_avatar: i32) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_SLOT_3_AVATAR, slot_3_avatar, 0); + } + #[inline] + pub fn add_unk_14(&mut self, unk_14: i32) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_UNK_14, unk_14, 0); + } + #[inline] + pub fn add_unk_15(&mut self, unk_15: bool) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_UNK_15, unk_15, false); + } + #[inline] + pub fn add_unk_16(&mut self, unk_16: bool) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_UNK_16, unk_16, false); + } + #[inline] + pub fn add_unk_17(&mut self, unk_17: i32) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_UNK_17, unk_17, 0); + } + #[inline] + pub fn add_preview_res_group_id(&mut self, preview_res_group_id: i32) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_PREVIEW_RES_GROUP_ID, preview_res_group_id, 0); + } + #[inline] + pub fn add_chessboard_res_group_id(&mut self, chessboard_res_group_id: i32) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_CHESSBOARD_RES_GROUP_ID, chessboard_res_group_id, 0); + } + #[inline] + pub fn add_bgm_chapter_state(&mut self, bgm_chapter_state: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(HollowQuestTemplate::VT_BGM_CHAPTER_STATE, bgm_chapter_state); + } + #[inline] + pub fn add_unk_18(&mut self, unk_18: i32) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_UNK_18, unk_18, 0); + } + #[inline] + pub fn add_unk_19(&mut self, unk_19: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(HollowQuestTemplate::VT_UNK_19, unk_19); + } + #[inline] + pub fn add_unk_20(&mut self, unk_20: i32) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_UNK_20, unk_20, 0); + } + #[inline] + pub fn add_unk_21(&mut self, unk_21: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(HollowQuestTemplate::VT_UNK_21, unk_21); + } + #[inline] + pub fn add_unk_22(&mut self, unk_22: i32) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_UNK_22, unk_22, 0); + } + #[inline] + pub fn add_unk_23(&mut self, unk_23: i32) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_UNK_23, unk_23, 0); + } + #[inline] + pub fn add_unk_24(&mut self, unk_24: i32) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_UNK_24, unk_24, 0); + } + #[inline] + pub fn add_unk_25(&mut self, unk_25: bool) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_UNK_25, unk_25, false); + } + #[inline] + pub fn add_unk_26(&mut self, unk_26: i32) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_UNK_26, unk_26, 0); + } + #[inline] + pub fn add_title(&mut self, title: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(HollowQuestTemplate::VT_TITLE, title); + } + #[inline] + pub fn add_difficulty(&mut self, difficulty: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(HollowQuestTemplate::VT_DIFFICULTY, difficulty); + } + #[inline] + pub fn add_target(&mut self, target: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(HollowQuestTemplate::VT_TARGET, target); + } + #[inline] + pub fn add_unk_27(&mut self, unk_27: flatbuffers::WIPOffset>>) { + self.fbb_.push_slot_always::>(HollowQuestTemplate::VT_UNK_27, unk_27); + } + #[inline] + pub fn add_unk_28(&mut self, unk_28: i32) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_UNK_28, unk_28, 0); + } + #[inline] + pub fn add_unk_29(&mut self, unk_29: i32) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_UNK_29, unk_29, 0); + } + #[inline] + pub fn add_unk_30(&mut self, unk_30: bool) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_UNK_30, unk_30, false); + } + #[inline] + pub fn add_unk_31(&mut self, unk_31: i32) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_UNK_31, unk_31, 0); + } + #[inline] + pub fn add_unk_32(&mut self, unk_32: bool) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_UNK_32, unk_32, false); + } + #[inline] + pub fn add_unk_33(&mut self, unk_33: i32) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_UNK_33, unk_33, 0); + } + #[inline] + pub fn add_hollow_item_ban_lists(&mut self, hollow_item_ban_lists: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(HollowQuestTemplate::VT_HOLLOW_ITEM_BAN_LISTS, hollow_item_ban_lists); + } + #[inline] + pub fn add_unk_34(&mut self, unk_34: bool) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_UNK_34, unk_34, false); + } + #[inline] + pub fn add_enemy_types(&mut self, enemy_types: flatbuffers::WIPOffset>>) { + self.fbb_.push_slot_always::>(HollowQuestTemplate::VT_ENEMY_TYPES, enemy_types); + } + #[inline] + pub fn add_background(&mut self, background: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(HollowQuestTemplate::VT_BACKGROUND, background); + } + #[inline] + pub fn add_unk_35(&mut self, unk_35: i32) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_UNK_35, unk_35, 0); + } + #[inline] + pub fn add_unk_36(&mut self, unk_36: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(HollowQuestTemplate::VT_UNK_36, unk_36); + } + #[inline] + pub fn add_unk_37(&mut self, unk_37: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(HollowQuestTemplate::VT_UNK_37, unk_37); + } + #[inline] + pub fn add_unk_38(&mut self, unk_38: i32) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_UNK_38, unk_38, 0); + } + #[inline] + pub fn add_unk_39(&mut self, unk_39: i32) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_UNK_39, unk_39, 0); + } + #[inline] + pub fn add_unk_40(&mut self, unk_40: i32) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_UNK_40, unk_40, 0); + } + #[inline] + pub fn add_unk_41(&mut self, unk_41: i32) { + self.fbb_.push_slot::(HollowQuestTemplate::VT_UNK_41, unk_41, 0); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> HollowQuestTemplateBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + HollowQuestTemplateBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for HollowQuestTemplate<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("HollowQuestTemplate"); + ds.field("id", &self.id()); + ds.field("unk_1", &self.unk_1()); + ds.field("chessboard_id", &self.chessboard_id()); + ds.field("unk_2", &self.unk_2()); + ds.field("hollow_id", &self.hollow_id()); + ds.field("hollow_quest_type", &self.hollow_quest_type()); + ds.field("unk_3", &self.unk_3()); + ds.field("duration", &self.duration()); + ds.field("has_stamina", &self.has_stamina()); + ds.field("environments", &self.environments()); + ds.field("main_difficulty", &self.main_difficulty()); + ds.field("difficulties", &self.difficulties()); + ds.field("recommended_elements", &self.recommended_elements()); + ds.field("client", &self.client()); + ds.field("unk_4", &self.unk_4()); + ds.field("unk_5", &self.unk_5()); + ds.field("unk_6", &self.unk_6()); + ds.field("scale", &self.scale()); + ds.field("show_tip", &self.show_tip()); + ds.field("monster_level", &self.monster_level()); + ds.field("recommended_level", &self.recommended_level()); + ds.field("average_level_tips", &self.average_level_tips()); + ds.field("recommended_hit_types", &self.recommended_hit_types()); + ds.field("unk_7", &self.unk_7()); + ds.field("unk_8", &self.unk_8()); + ds.field("unk_9", &self.unk_9()); + ds.field("unk_10", &self.unk_10()); + ds.field("unk_11", &self.unk_11()); + ds.field("unk_12", &self.unk_12()); + ds.field("unk_13", &self.unk_13()); + ds.field("slot_1_avatar", &self.slot_1_avatar()); + ds.field("slot_2_avatar", &self.slot_2_avatar()); + ds.field("slot_3_avatar", &self.slot_3_avatar()); + ds.field("unk_14", &self.unk_14()); + ds.field("unk_15", &self.unk_15()); + ds.field("unk_16", &self.unk_16()); + ds.field("unk_17", &self.unk_17()); + ds.field("preview_res_group_id", &self.preview_res_group_id()); + ds.field("chessboard_res_group_id", &self.chessboard_res_group_id()); + ds.field("bgm_chapter_state", &self.bgm_chapter_state()); + ds.field("unk_18", &self.unk_18()); + ds.field("unk_19", &self.unk_19()); + ds.field("unk_20", &self.unk_20()); + ds.field("unk_21", &self.unk_21()); + ds.field("unk_22", &self.unk_22()); + ds.field("unk_23", &self.unk_23()); + ds.field("unk_24", &self.unk_24()); + ds.field("unk_25", &self.unk_25()); + ds.field("unk_26", &self.unk_26()); + ds.field("title", &self.title()); + ds.field("difficulty", &self.difficulty()); + ds.field("target", &self.target()); + ds.field("unk_27", &self.unk_27()); + ds.field("unk_28", &self.unk_28()); + ds.field("unk_29", &self.unk_29()); + ds.field("unk_30", &self.unk_30()); + ds.field("unk_31", &self.unk_31()); + ds.field("unk_32", &self.unk_32()); + ds.field("unk_33", &self.unk_33()); + ds.field("hollow_item_ban_lists", &self.hollow_item_ban_lists()); + ds.field("unk_34", &self.unk_34()); + ds.field("enemy_types", &self.enemy_types()); + ds.field("background", &self.background()); + ds.field("unk_35", &self.unk_35()); + ds.field("unk_36", &self.unk_36()); + ds.field("unk_37", &self.unk_37()); + ds.field("unk_38", &self.unk_38()); + ds.field("unk_39", &self.unk_39()); + ds.field("unk_40", &self.unk_40()); + ds.field("unk_41", &self.unk_41()); + ds.finish() + } +} +pub enum HollowQuestTemplateTbOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct HollowQuestTemplateTb<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for HollowQuestTemplateTb<'a> { + type Inner = HollowQuestTemplateTb<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> HollowQuestTemplateTb<'a> { + pub const VT_DATA: flatbuffers::VOffsetT = 4; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + HollowQuestTemplateTb { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args HollowQuestTemplateTbArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = HollowQuestTemplateTbBuilder::new(_fbb); + if let Some(x) = args.data { builder.add_data(x); } + builder.finish() + } + + + #[inline] + pub fn data(&self) -> Option>>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(HollowQuestTemplateTb::VT_DATA, None)} + } +} + +impl flatbuffers::Verifiable for HollowQuestTemplateTb<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::>>>("data", Self::VT_DATA, false)? + .finish(); + Ok(()) + } +} +pub struct HollowQuestTemplateTbArgs<'a> { + pub data: Option>>>>, +} +impl<'a> Default for HollowQuestTemplateTbArgs<'a> { + #[inline] + fn default() -> Self { + HollowQuestTemplateTbArgs { + data: None, + } + } +} + +pub struct HollowQuestTemplateTbBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> HollowQuestTemplateTbBuilder<'a, 'b, A> { + #[inline] + pub fn add_data(&mut self, data: flatbuffers::WIPOffset>>>) { + self.fbb_.push_slot_always::>(HollowQuestTemplateTb::VT_DATA, data); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> HollowQuestTemplateTbBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + HollowQuestTemplateTbBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for HollowQuestTemplateTb<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("HollowQuestTemplateTb"); + ds.field("data", &self.data()); + ds.finish() + } +} diff --git a/lib/config/gen_flatbuffers/item_template_generated.rs b/lib/config/gen_flatbuffers/item_template_generated.rs new file mode 100644 index 0000000..7a7e2a2 --- /dev/null +++ b/lib/config/gen_flatbuffers/item_template_generated.rs @@ -0,0 +1,902 @@ +// automatically generated by the FlatBuffers compiler, do not modify + + +// @generated + +use core::mem; +use core::cmp::Ordering; + +extern crate flatbuffers; +use self::flatbuffers::{EndianScalar, Follow}; + +pub enum ItemTemplateOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct ItemTemplate<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for ItemTemplate<'a> { + type Inner = ItemTemplate<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> ItemTemplate<'a> { + pub const VT_ID: flatbuffers::VOffsetT = 4; + pub const VT_NAME: flatbuffers::VOffsetT = 6; + pub const VT_RARITY: flatbuffers::VOffsetT = 8; + pub const VT_CLASS: flatbuffers::VOffsetT = 10; + pub const VT_UNK_1: flatbuffers::VOffsetT = 12; + pub const VT_UNK_2: flatbuffers::VOffsetT = 14; + pub const VT_DESC: flatbuffers::VOffsetT = 16; + pub const VT_SHOW_DETAIL: flatbuffers::VOffsetT = 18; + pub const VT_STORY: flatbuffers::VOffsetT = 20; + pub const VT_UNK_101: flatbuffers::VOffsetT = 22; + pub const VT_ICON_PATH: flatbuffers::VOffsetT = 24; + pub const VT_UNK_102: flatbuffers::VOffsetT = 26; + pub const VT_SMALL_ICON_PATH: flatbuffers::VOffsetT = 28; + pub const VT_UNK_103: flatbuffers::VOffsetT = 30; + pub const VT_BIG_ICON: flatbuffers::VOffsetT = 32; + pub const VT_UNK_3: flatbuffers::VOffsetT = 34; + pub const VT_PREFAB_PATH: flatbuffers::VOffsetT = 36; + pub const VT_PACKAGE: flatbuffers::VOffsetT = 38; + pub const VT_UNK_4: flatbuffers::VOffsetT = 40; + pub const VT_KEEP_MAX: flatbuffers::VOffsetT = 42; + pub const VT_VALUE: flatbuffers::VOffsetT = 44; + pub const VT_UNK_5: flatbuffers::VOffsetT = 46; + pub const VT_UNK_6: flatbuffers::VOffsetT = 48; + pub const VT_UNK_7: flatbuffers::VOffsetT = 50; + pub const VT_UNK_8: flatbuffers::VOffsetT = 52; + pub const VT_UNK_9: flatbuffers::VOffsetT = 54; + pub const VT_UNK_10: flatbuffers::VOffsetT = 56; + pub const VT_BORN_EFFECT_PATH: flatbuffers::VOffsetT = 58; + pub const VT_REMAIN_EFFECT_PATH: flatbuffers::VOffsetT = 60; + pub const VT_INTERACTION_EFFECT_PATH: flatbuffers::VOffsetT = 62; + pub const VT_DEAD_EFFECT_PATH: flatbuffers::VOffsetT = 64; + pub const VT_ITEM_DROP_EFFECT_NAME: flatbuffers::VOffsetT = 66; + pub const VT_UNK_11: flatbuffers::VOffsetT = 68; + pub const VT_UNK_12: flatbuffers::VOffsetT = 70; + pub const VT_UNK_13: flatbuffers::VOffsetT = 72; + pub const VT_UNK_14: flatbuffers::VOffsetT = 74; + pub const VT_GROCERY_ICON: flatbuffers::VOffsetT = 76; + pub const VT_UNK_15: flatbuffers::VOffsetT = 78; + pub const VT_UNK_16: flatbuffers::VOffsetT = 80; + pub const VT_UNK_17: flatbuffers::VOffsetT = 82; + pub const VT_UNK_18: flatbuffers::VOffsetT = 84; + pub const VT_PARAMETERS: flatbuffers::VOffsetT = 86; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + ItemTemplate { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args ItemTemplateArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = ItemTemplateBuilder::new(_fbb); + builder.add_unk_17(args.unk_17); + if let Some(x) = args.parameters { builder.add_parameters(x); } + builder.add_unk_18(args.unk_18); + if let Some(x) = args.unk_16 { builder.add_unk_16(x); } + if let Some(x) = args.unk_15 { builder.add_unk_15(x); } + if let Some(x) = args.grocery_icon { builder.add_grocery_icon(x); } + if let Some(x) = args.unk_14 { builder.add_unk_14(x); } + builder.add_unk_13(args.unk_13); + builder.add_unk_12(args.unk_12); + builder.add_unk_11(args.unk_11); + if let Some(x) = args.item_drop_effect_name { builder.add_item_drop_effect_name(x); } + if let Some(x) = args.dead_effect_path { builder.add_dead_effect_path(x); } + if let Some(x) = args.interaction_effect_path { builder.add_interaction_effect_path(x); } + if let Some(x) = args.remain_effect_path { builder.add_remain_effect_path(x); } + if let Some(x) = args.born_effect_path { builder.add_born_effect_path(x); } + builder.add_unk_10(args.unk_10); + builder.add_unk_9(args.unk_9); + builder.add_unk_8(args.unk_8); + builder.add_unk_7(args.unk_7); + if let Some(x) = args.unk_6 { builder.add_unk_6(x); } + builder.add_unk_5(args.unk_5); + builder.add_value(args.value); + builder.add_keep_max(args.keep_max); + builder.add_unk_4(args.unk_4); + builder.add_package(args.package); + if let Some(x) = args.prefab_path { builder.add_prefab_path(x); } + builder.add_unk_3(args.unk_3); + if let Some(x) = args.big_icon { builder.add_big_icon(x); } + builder.add_unk_103(args.unk_103); + if let Some(x) = args.small_icon_path { builder.add_small_icon_path(x); } + builder.add_unk_102(args.unk_102); + if let Some(x) = args.icon_path { builder.add_icon_path(x); } + builder.add_unk_101(args.unk_101); + if let Some(x) = args.story { builder.add_story(x); } + builder.add_show_detail(args.show_detail); + if let Some(x) = args.desc { builder.add_desc(x); } + builder.add_unk_2(args.unk_2); + builder.add_unk_1(args.unk_1); + builder.add_class(args.class); + builder.add_rarity(args.rarity); + if let Some(x) = args.name { builder.add_name(x); } + builder.add_id(args.id); + builder.finish() + } + + + #[inline] + pub fn id(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(ItemTemplate::VT_ID, Some(0)).unwrap()} + } + #[inline] + pub fn name(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(ItemTemplate::VT_NAME, None)} + } + #[inline] + pub fn rarity(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(ItemTemplate::VT_RARITY, Some(0)).unwrap()} + } + #[inline] + pub fn class(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(ItemTemplate::VT_CLASS, Some(0)).unwrap()} + } + #[inline] + pub fn unk_1(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(ItemTemplate::VT_UNK_1, Some(0)).unwrap()} + } + #[inline] + pub fn unk_2(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(ItemTemplate::VT_UNK_2, Some(0)).unwrap()} + } + #[inline] + pub fn desc(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(ItemTemplate::VT_DESC, None)} + } + #[inline] + pub fn show_detail(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(ItemTemplate::VT_SHOW_DETAIL, Some(0)).unwrap()} + } + #[inline] + pub fn story(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(ItemTemplate::VT_STORY, None)} + } + #[inline] + pub fn unk_101(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(ItemTemplate::VT_UNK_101, Some(0)).unwrap()} + } + #[inline] + pub fn icon_path(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(ItemTemplate::VT_ICON_PATH, None)} + } + #[inline] + pub fn unk_102(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(ItemTemplate::VT_UNK_102, Some(0)).unwrap()} + } + #[inline] + pub fn small_icon_path(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(ItemTemplate::VT_SMALL_ICON_PATH, None)} + } + #[inline] + pub fn unk_103(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(ItemTemplate::VT_UNK_103, Some(0)).unwrap()} + } + #[inline] + pub fn big_icon(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(ItemTemplate::VT_BIG_ICON, None)} + } + #[inline] + pub fn unk_3(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(ItemTemplate::VT_UNK_3, Some(0)).unwrap()} + } + #[inline] + pub fn prefab_path(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(ItemTemplate::VT_PREFAB_PATH, None)} + } + #[inline] + pub fn package(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(ItemTemplate::VT_PACKAGE, Some(0)).unwrap()} + } + #[inline] + pub fn unk_4(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(ItemTemplate::VT_UNK_4, Some(0)).unwrap()} + } + #[inline] + pub fn keep_max(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(ItemTemplate::VT_KEEP_MAX, Some(0)).unwrap()} + } + #[inline] + pub fn value(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(ItemTemplate::VT_VALUE, Some(0)).unwrap()} + } + #[inline] + pub fn unk_5(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(ItemTemplate::VT_UNK_5, Some(0)).unwrap()} + } + #[inline] + pub fn unk_6(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(ItemTemplate::VT_UNK_6, None)} + } + #[inline] + pub fn unk_7(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(ItemTemplate::VT_UNK_7, Some(0)).unwrap()} + } + #[inline] + pub fn unk_8(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(ItemTemplate::VT_UNK_8, Some(0)).unwrap()} + } + #[inline] + pub fn unk_9(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(ItemTemplate::VT_UNK_9, Some(0)).unwrap()} + } + #[inline] + pub fn unk_10(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(ItemTemplate::VT_UNK_10, Some(0)).unwrap()} + } + #[inline] + pub fn born_effect_path(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(ItemTemplate::VT_BORN_EFFECT_PATH, None)} + } + #[inline] + pub fn remain_effect_path(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(ItemTemplate::VT_REMAIN_EFFECT_PATH, None)} + } + #[inline] + pub fn interaction_effect_path(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(ItemTemplate::VT_INTERACTION_EFFECT_PATH, None)} + } + #[inline] + pub fn dead_effect_path(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(ItemTemplate::VT_DEAD_EFFECT_PATH, None)} + } + #[inline] + pub fn item_drop_effect_name(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(ItemTemplate::VT_ITEM_DROP_EFFECT_NAME, None)} + } + #[inline] + pub fn unk_11(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(ItemTemplate::VT_UNK_11, Some(0)).unwrap()} + } + #[inline] + pub fn unk_12(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(ItemTemplate::VT_UNK_12, Some(0)).unwrap()} + } + #[inline] + pub fn unk_13(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(ItemTemplate::VT_UNK_13, Some(0)).unwrap()} + } + #[inline] + pub fn unk_14(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(ItemTemplate::VT_UNK_14, None)} + } + #[inline] + pub fn grocery_icon(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(ItemTemplate::VT_GROCERY_ICON, None)} + } + #[inline] + pub fn unk_15(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(ItemTemplate::VT_UNK_15, None)} + } + #[inline] + pub fn unk_16(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(ItemTemplate::VT_UNK_16, None)} + } + #[inline] + pub fn unk_17(&self) -> u64 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(ItemTemplate::VT_UNK_17, Some(0)).unwrap()} + } + #[inline] + pub fn unk_18(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(ItemTemplate::VT_UNK_18, Some(0)).unwrap()} + } + #[inline] + pub fn parameters(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(ItemTemplate::VT_PARAMETERS, None)} + } +} + +impl flatbuffers::Verifiable for ItemTemplate<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::("id", Self::VT_ID, false)? + .visit_field::>("name", Self::VT_NAME, false)? + .visit_field::("rarity", Self::VT_RARITY, false)? + .visit_field::("class", Self::VT_CLASS, false)? + .visit_field::("unk_1", Self::VT_UNK_1, false)? + .visit_field::("unk_2", Self::VT_UNK_2, false)? + .visit_field::>("desc", Self::VT_DESC, false)? + .visit_field::("show_detail", Self::VT_SHOW_DETAIL, false)? + .visit_field::>("story", Self::VT_STORY, false)? + .visit_field::("unk_101", Self::VT_UNK_101, false)? + .visit_field::>("icon_path", Self::VT_ICON_PATH, false)? + .visit_field::("unk_102", Self::VT_UNK_102, false)? + .visit_field::>("small_icon_path", Self::VT_SMALL_ICON_PATH, false)? + .visit_field::("unk_103", Self::VT_UNK_103, false)? + .visit_field::>("big_icon", Self::VT_BIG_ICON, false)? + .visit_field::("unk_3", Self::VT_UNK_3, false)? + .visit_field::>("prefab_path", Self::VT_PREFAB_PATH, false)? + .visit_field::("package", Self::VT_PACKAGE, false)? + .visit_field::("unk_4", Self::VT_UNK_4, false)? + .visit_field::("keep_max", Self::VT_KEEP_MAX, false)? + .visit_field::("value", Self::VT_VALUE, false)? + .visit_field::("unk_5", Self::VT_UNK_5, false)? + .visit_field::>("unk_6", Self::VT_UNK_6, false)? + .visit_field::("unk_7", Self::VT_UNK_7, false)? + .visit_field::("unk_8", Self::VT_UNK_8, false)? + .visit_field::("unk_9", Self::VT_UNK_9, false)? + .visit_field::("unk_10", Self::VT_UNK_10, false)? + .visit_field::>("born_effect_path", Self::VT_BORN_EFFECT_PATH, false)? + .visit_field::>("remain_effect_path", Self::VT_REMAIN_EFFECT_PATH, false)? + .visit_field::>("interaction_effect_path", Self::VT_INTERACTION_EFFECT_PATH, false)? + .visit_field::>("dead_effect_path", Self::VT_DEAD_EFFECT_PATH, false)? + .visit_field::>("item_drop_effect_name", Self::VT_ITEM_DROP_EFFECT_NAME, false)? + .visit_field::("unk_11", Self::VT_UNK_11, false)? + .visit_field::("unk_12", Self::VT_UNK_12, false)? + .visit_field::("unk_13", Self::VT_UNK_13, false)? + .visit_field::>("unk_14", Self::VT_UNK_14, false)? + .visit_field::>("grocery_icon", Self::VT_GROCERY_ICON, false)? + .visit_field::>>("unk_15", Self::VT_UNK_15, false)? + .visit_field::>>("unk_16", Self::VT_UNK_16, false)? + .visit_field::("unk_17", Self::VT_UNK_17, false)? + .visit_field::("unk_18", Self::VT_UNK_18, false)? + .visit_field::>>("parameters", Self::VT_PARAMETERS, false)? + .finish(); + Ok(()) + } +} +pub struct ItemTemplateArgs<'a> { + pub id: u32, + pub name: Option>, + pub rarity: u32, + pub class: u32, + pub unk_1: i32, + pub unk_2: i32, + pub desc: Option>, + pub show_detail: i32, + pub story: Option>, + pub unk_101: i32, + pub icon_path: Option>, + pub unk_102: i32, + pub small_icon_path: Option>, + pub unk_103: i32, + pub big_icon: Option>, + pub unk_3: i32, + pub prefab_path: Option>, + pub package: u32, + pub unk_4: i32, + pub keep_max: u32, + pub value: u32, + pub unk_5: i32, + pub unk_6: Option>, + pub unk_7: i32, + pub unk_8: i32, + pub unk_9: i32, + pub unk_10: i32, + pub born_effect_path: Option>, + pub remain_effect_path: Option>, + pub interaction_effect_path: Option>, + pub dead_effect_path: Option>, + pub item_drop_effect_name: Option>, + pub unk_11: i32, + pub unk_12: i32, + pub unk_13: i32, + pub unk_14: Option>, + pub grocery_icon: Option>, + pub unk_15: Option>>, + pub unk_16: Option>>, + pub unk_17: u64, + pub unk_18: i32, + pub parameters: Option>>, +} +impl<'a> Default for ItemTemplateArgs<'a> { + #[inline] + fn default() -> Self { + ItemTemplateArgs { + id: 0, + name: None, + rarity: 0, + class: 0, + unk_1: 0, + unk_2: 0, + desc: None, + show_detail: 0, + story: None, + unk_101: 0, + icon_path: None, + unk_102: 0, + small_icon_path: None, + unk_103: 0, + big_icon: None, + unk_3: 0, + prefab_path: None, + package: 0, + unk_4: 0, + keep_max: 0, + value: 0, + unk_5: 0, + unk_6: None, + unk_7: 0, + unk_8: 0, + unk_9: 0, + unk_10: 0, + born_effect_path: None, + remain_effect_path: None, + interaction_effect_path: None, + dead_effect_path: None, + item_drop_effect_name: None, + unk_11: 0, + unk_12: 0, + unk_13: 0, + unk_14: None, + grocery_icon: None, + unk_15: None, + unk_16: None, + unk_17: 0, + unk_18: 0, + parameters: None, + } + } +} + +pub struct ItemTemplateBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> ItemTemplateBuilder<'a, 'b, A> { + #[inline] + pub fn add_id(&mut self, id: u32) { + self.fbb_.push_slot::(ItemTemplate::VT_ID, id, 0); + } + #[inline] + pub fn add_name(&mut self, name: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(ItemTemplate::VT_NAME, name); + } + #[inline] + pub fn add_rarity(&mut self, rarity: u32) { + self.fbb_.push_slot::(ItemTemplate::VT_RARITY, rarity, 0); + } + #[inline] + pub fn add_class(&mut self, class: u32) { + self.fbb_.push_slot::(ItemTemplate::VT_CLASS, class, 0); + } + #[inline] + pub fn add_unk_1(&mut self, unk_1: i32) { + self.fbb_.push_slot::(ItemTemplate::VT_UNK_1, unk_1, 0); + } + #[inline] + pub fn add_unk_2(&mut self, unk_2: i32) { + self.fbb_.push_slot::(ItemTemplate::VT_UNK_2, unk_2, 0); + } + #[inline] + pub fn add_desc(&mut self, desc: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(ItemTemplate::VT_DESC, desc); + } + #[inline] + pub fn add_show_detail(&mut self, show_detail: i32) { + self.fbb_.push_slot::(ItemTemplate::VT_SHOW_DETAIL, show_detail, 0); + } + #[inline] + pub fn add_story(&mut self, story: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(ItemTemplate::VT_STORY, story); + } + #[inline] + pub fn add_unk_101(&mut self, unk_101: i32) { + self.fbb_.push_slot::(ItemTemplate::VT_UNK_101, unk_101, 0); + } + #[inline] + pub fn add_icon_path(&mut self, icon_path: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(ItemTemplate::VT_ICON_PATH, icon_path); + } + #[inline] + pub fn add_unk_102(&mut self, unk_102: i32) { + self.fbb_.push_slot::(ItemTemplate::VT_UNK_102, unk_102, 0); + } + #[inline] + pub fn add_small_icon_path(&mut self, small_icon_path: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(ItemTemplate::VT_SMALL_ICON_PATH, small_icon_path); + } + #[inline] + pub fn add_unk_103(&mut self, unk_103: i32) { + self.fbb_.push_slot::(ItemTemplate::VT_UNK_103, unk_103, 0); + } + #[inline] + pub fn add_big_icon(&mut self, big_icon: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(ItemTemplate::VT_BIG_ICON, big_icon); + } + #[inline] + pub fn add_unk_3(&mut self, unk_3: i32) { + self.fbb_.push_slot::(ItemTemplate::VT_UNK_3, unk_3, 0); + } + #[inline] + pub fn add_prefab_path(&mut self, prefab_path: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(ItemTemplate::VT_PREFAB_PATH, prefab_path); + } + #[inline] + pub fn add_package(&mut self, package: u32) { + self.fbb_.push_slot::(ItemTemplate::VT_PACKAGE, package, 0); + } + #[inline] + pub fn add_unk_4(&mut self, unk_4: i32) { + self.fbb_.push_slot::(ItemTemplate::VT_UNK_4, unk_4, 0); + } + #[inline] + pub fn add_keep_max(&mut self, keep_max: u32) { + self.fbb_.push_slot::(ItemTemplate::VT_KEEP_MAX, keep_max, 0); + } + #[inline] + pub fn add_value(&mut self, value: u32) { + self.fbb_.push_slot::(ItemTemplate::VT_VALUE, value, 0); + } + #[inline] + pub fn add_unk_5(&mut self, unk_5: i32) { + self.fbb_.push_slot::(ItemTemplate::VT_UNK_5, unk_5, 0); + } + #[inline] + pub fn add_unk_6(&mut self, unk_6: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(ItemTemplate::VT_UNK_6, unk_6); + } + #[inline] + pub fn add_unk_7(&mut self, unk_7: i32) { + self.fbb_.push_slot::(ItemTemplate::VT_UNK_7, unk_7, 0); + } + #[inline] + pub fn add_unk_8(&mut self, unk_8: i32) { + self.fbb_.push_slot::(ItemTemplate::VT_UNK_8, unk_8, 0); + } + #[inline] + pub fn add_unk_9(&mut self, unk_9: i32) { + self.fbb_.push_slot::(ItemTemplate::VT_UNK_9, unk_9, 0); + } + #[inline] + pub fn add_unk_10(&mut self, unk_10: i32) { + self.fbb_.push_slot::(ItemTemplate::VT_UNK_10, unk_10, 0); + } + #[inline] + pub fn add_born_effect_path(&mut self, born_effect_path: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(ItemTemplate::VT_BORN_EFFECT_PATH, born_effect_path); + } + #[inline] + pub fn add_remain_effect_path(&mut self, remain_effect_path: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(ItemTemplate::VT_REMAIN_EFFECT_PATH, remain_effect_path); + } + #[inline] + pub fn add_interaction_effect_path(&mut self, interaction_effect_path: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(ItemTemplate::VT_INTERACTION_EFFECT_PATH, interaction_effect_path); + } + #[inline] + pub fn add_dead_effect_path(&mut self, dead_effect_path: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(ItemTemplate::VT_DEAD_EFFECT_PATH, dead_effect_path); + } + #[inline] + pub fn add_item_drop_effect_name(&mut self, item_drop_effect_name: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(ItemTemplate::VT_ITEM_DROP_EFFECT_NAME, item_drop_effect_name); + } + #[inline] + pub fn add_unk_11(&mut self, unk_11: i32) { + self.fbb_.push_slot::(ItemTemplate::VT_UNK_11, unk_11, 0); + } + #[inline] + pub fn add_unk_12(&mut self, unk_12: i32) { + self.fbb_.push_slot::(ItemTemplate::VT_UNK_12, unk_12, 0); + } + #[inline] + pub fn add_unk_13(&mut self, unk_13: i32) { + self.fbb_.push_slot::(ItemTemplate::VT_UNK_13, unk_13, 0); + } + #[inline] + pub fn add_unk_14(&mut self, unk_14: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(ItemTemplate::VT_UNK_14, unk_14); + } + #[inline] + pub fn add_grocery_icon(&mut self, grocery_icon: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(ItemTemplate::VT_GROCERY_ICON, grocery_icon); + } + #[inline] + pub fn add_unk_15(&mut self, unk_15: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(ItemTemplate::VT_UNK_15, unk_15); + } + #[inline] + pub fn add_unk_16(&mut self, unk_16: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(ItemTemplate::VT_UNK_16, unk_16); + } + #[inline] + pub fn add_unk_17(&mut self, unk_17: u64) { + self.fbb_.push_slot::(ItemTemplate::VT_UNK_17, unk_17, 0); + } + #[inline] + pub fn add_unk_18(&mut self, unk_18: i32) { + self.fbb_.push_slot::(ItemTemplate::VT_UNK_18, unk_18, 0); + } + #[inline] + pub fn add_parameters(&mut self, parameters: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(ItemTemplate::VT_PARAMETERS, parameters); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> ItemTemplateBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + ItemTemplateBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for ItemTemplate<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("ItemTemplate"); + ds.field("id", &self.id()); + ds.field("name", &self.name()); + ds.field("rarity", &self.rarity()); + ds.field("class", &self.class()); + ds.field("unk_1", &self.unk_1()); + ds.field("unk_2", &self.unk_2()); + ds.field("desc", &self.desc()); + ds.field("show_detail", &self.show_detail()); + ds.field("story", &self.story()); + ds.field("unk_101", &self.unk_101()); + ds.field("icon_path", &self.icon_path()); + ds.field("unk_102", &self.unk_102()); + ds.field("small_icon_path", &self.small_icon_path()); + ds.field("unk_103", &self.unk_103()); + ds.field("big_icon", &self.big_icon()); + ds.field("unk_3", &self.unk_3()); + ds.field("prefab_path", &self.prefab_path()); + ds.field("package", &self.package()); + ds.field("unk_4", &self.unk_4()); + ds.field("keep_max", &self.keep_max()); + ds.field("value", &self.value()); + ds.field("unk_5", &self.unk_5()); + ds.field("unk_6", &self.unk_6()); + ds.field("unk_7", &self.unk_7()); + ds.field("unk_8", &self.unk_8()); + ds.field("unk_9", &self.unk_9()); + ds.field("unk_10", &self.unk_10()); + ds.field("born_effect_path", &self.born_effect_path()); + ds.field("remain_effect_path", &self.remain_effect_path()); + ds.field("interaction_effect_path", &self.interaction_effect_path()); + ds.field("dead_effect_path", &self.dead_effect_path()); + ds.field("item_drop_effect_name", &self.item_drop_effect_name()); + ds.field("unk_11", &self.unk_11()); + ds.field("unk_12", &self.unk_12()); + ds.field("unk_13", &self.unk_13()); + ds.field("unk_14", &self.unk_14()); + ds.field("grocery_icon", &self.grocery_icon()); + ds.field("unk_15", &self.unk_15()); + ds.field("unk_16", &self.unk_16()); + ds.field("unk_17", &self.unk_17()); + ds.field("unk_18", &self.unk_18()); + ds.field("parameters", &self.parameters()); + ds.finish() + } +} +pub enum ItemTemplateTbOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct ItemTemplateTb<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for ItemTemplateTb<'a> { + type Inner = ItemTemplateTb<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> ItemTemplateTb<'a> { + pub const VT_DATA: flatbuffers::VOffsetT = 4; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + ItemTemplateTb { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args ItemTemplateTbArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = ItemTemplateTbBuilder::new(_fbb); + if let Some(x) = args.data { builder.add_data(x); } + builder.finish() + } + + + #[inline] + pub fn data(&self) -> Option>>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(ItemTemplateTb::VT_DATA, None)} + } +} + +impl flatbuffers::Verifiable for ItemTemplateTb<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::>>>("data", Self::VT_DATA, false)? + .finish(); + Ok(()) + } +} +pub struct ItemTemplateTbArgs<'a> { + pub data: Option>>>>, +} +impl<'a> Default for ItemTemplateTbArgs<'a> { + #[inline] + fn default() -> Self { + ItemTemplateTbArgs { + data: None, + } + } +} + +pub struct ItemTemplateTbBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> ItemTemplateTbBuilder<'a, 'b, A> { + #[inline] + pub fn add_data(&mut self, data: flatbuffers::WIPOffset>>>) { + self.fbb_.push_slot_always::>(ItemTemplateTb::VT_DATA, data); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> ItemTemplateTbBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + ItemTemplateTbBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for ItemTemplateTb<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("ItemTemplateTb"); + ds.field("data", &self.data()); + ds.finish() + } +} diff --git a/lib/config/gen_flatbuffers/main_city_object_template_generated.rs b/lib/config/gen_flatbuffers/main_city_object_template_generated.rs new file mode 100644 index 0000000..b4c4d6a --- /dev/null +++ b/lib/config/gen_flatbuffers/main_city_object_template_generated.rs @@ -0,0 +1,902 @@ +// automatically generated by the FlatBuffers compiler, do not modify + + +// @generated + +use core::mem; +use core::cmp::Ordering; + +extern crate flatbuffers; +use self::flatbuffers::{EndianScalar, Follow}; + +pub enum MainCityObjectTemplateOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct MainCityObjectTemplate<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for MainCityObjectTemplate<'a> { + type Inner = MainCityObjectTemplate<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> MainCityObjectTemplate<'a> { + pub const VT_TAG_ID: flatbuffers::VOffsetT = 4; + pub const VT_NPC_ID: flatbuffers::VOffsetT = 6; + pub const VT_CREATE_POSITION: flatbuffers::VOffsetT = 8; + pub const VT_CREATE_TYPE: flatbuffers::VOffsetT = 10; + pub const VT_NPC_NAME: flatbuffers::VOffsetT = 12; + pub const VT_UNK_0: flatbuffers::VOffsetT = 14; + pub const VT_UNK_1: flatbuffers::VOffsetT = 16; + pub const VT_DIALOGUE: flatbuffers::VOffsetT = 18; + pub const VT_INTERACT_NAME: flatbuffers::VOffsetT = 20; + pub const VT_INTERACT_SHAPE: flatbuffers::VOffsetT = 22; + pub const VT_INTERACT_SCALE: flatbuffers::VOffsetT = 24; + pub const VT_SECONDARY_INTERACT_SHAPE: flatbuffers::VOffsetT = 26; + pub const VT_SECONDARY_INTERACT_SCALE: flatbuffers::VOffsetT = 28; + pub const VT_FAN_INTERACT_PARAM: flatbuffers::VOffsetT = 30; + pub const VT_FOCUS_INTERACT_SCALE: flatbuffers::VOffsetT = 32; + pub const VT_UNK_2: flatbuffers::VOffsetT = 34; + pub const VT_UNK_3: flatbuffers::VOffsetT = 36; + pub const VT_UNK_4: flatbuffers::VOffsetT = 38; + pub const VT_UNK_5: flatbuffers::VOffsetT = 40; + pub const VT_UNK_6: flatbuffers::VOffsetT = 42; + pub const VT_UNK_7: flatbuffers::VOffsetT = 44; + pub const VT_UNK_8: flatbuffers::VOffsetT = 46; + pub const VT_UNK_9: flatbuffers::VOffsetT = 48; + pub const VT_UNK_10: flatbuffers::VOffsetT = 50; + pub const VT_UNK_11: flatbuffers::VOffsetT = 52; + pub const VT_UNK_12: flatbuffers::VOffsetT = 54; + pub const VT_UNK_13: flatbuffers::VOffsetT = 56; + pub const VT_UNK_14: flatbuffers::VOffsetT = 58; + pub const VT_UNK_15: flatbuffers::VOffsetT = 60; + pub const VT_UNK_16: flatbuffers::VOffsetT = 62; + pub const VT_UNK_17: flatbuffers::VOffsetT = 64; + pub const VT_UNK_18: flatbuffers::VOffsetT = 66; + pub const VT_UNK_19: flatbuffers::VOffsetT = 68; + pub const VT_UNK_20: flatbuffers::VOffsetT = 70; + pub const VT_UNK_21: flatbuffers::VOffsetT = 72; + pub const VT_UNK_22: flatbuffers::VOffsetT = 74; + pub const VT_UNK_23: flatbuffers::VOffsetT = 76; + pub const VT_UNK_24: flatbuffers::VOffsetT = 78; + pub const VT_UNK_25: flatbuffers::VOffsetT = 80; + pub const VT_UNK_26: flatbuffers::VOffsetT = 82; + pub const VT_UNK_27: flatbuffers::VOffsetT = 84; + pub const VT_DEFAULT_INTERACT_IDS: flatbuffers::VOffsetT = 86; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + MainCityObjectTemplate { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args MainCityObjectTemplateArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = MainCityObjectTemplateBuilder::new(_fbb); + if let Some(x) = args.default_interact_ids { builder.add_default_interact_ids(x); } + builder.add_unk_27(args.unk_27); + builder.add_unk_26(args.unk_26); + builder.add_unk_24(args.unk_24); + builder.add_unk_22(args.unk_22); + builder.add_unk_21(args.unk_21); + builder.add_unk_20(args.unk_20); + builder.add_unk_19(args.unk_19); + builder.add_unk_18(args.unk_18); + builder.add_unk_16(args.unk_16); + builder.add_unk_14(args.unk_14); + builder.add_unk_13(args.unk_13); + builder.add_unk_12(args.unk_12); + builder.add_unk_11(args.unk_11); + builder.add_unk_10(args.unk_10); + builder.add_unk_9(args.unk_9); + builder.add_unk_6(args.unk_6); + builder.add_focus_interact_scale(args.focus_interact_scale); + if let Some(x) = args.fan_interact_param { builder.add_fan_interact_param(x); } + if let Some(x) = args.secondary_interact_scale { builder.add_secondary_interact_scale(x); } + builder.add_secondary_interact_shape(args.secondary_interact_shape); + if let Some(x) = args.interact_scale { builder.add_interact_scale(x); } + builder.add_interact_shape(args.interact_shape); + if let Some(x) = args.interact_name { builder.add_interact_name(x); } + if let Some(x) = args.dialogue { builder.add_dialogue(x); } + builder.add_unk_1(args.unk_1); + builder.add_unk_0(args.unk_0); + if let Some(x) = args.npc_name { builder.add_npc_name(x); } + builder.add_create_type(args.create_type); + if let Some(x) = args.create_position { builder.add_create_position(x); } + builder.add_npc_id(args.npc_id); + builder.add_tag_id(args.tag_id); + builder.add_unk_25(args.unk_25); + builder.add_unk_23(args.unk_23); + builder.add_unk_17(args.unk_17); + builder.add_unk_15(args.unk_15); + builder.add_unk_8(args.unk_8); + builder.add_unk_7(args.unk_7); + builder.add_unk_5(args.unk_5); + builder.add_unk_4(args.unk_4); + builder.add_unk_3(args.unk_3); + builder.add_unk_2(args.unk_2); + builder.finish() + } + + + #[inline] + pub fn tag_id(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityObjectTemplate::VT_TAG_ID, Some(0)).unwrap()} + } + #[inline] + pub fn npc_id(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityObjectTemplate::VT_NPC_ID, Some(0)).unwrap()} + } + #[inline] + pub fn create_position(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(MainCityObjectTemplate::VT_CREATE_POSITION, None)} + } + #[inline] + pub fn create_type(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityObjectTemplate::VT_CREATE_TYPE, Some(0)).unwrap()} + } + #[inline] + pub fn npc_name(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(MainCityObjectTemplate::VT_NPC_NAME, None)} + } + #[inline] + pub fn unk_0(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityObjectTemplate::VT_UNK_0, Some(0)).unwrap()} + } + #[inline] + pub fn unk_1(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityObjectTemplate::VT_UNK_1, Some(0)).unwrap()} + } + #[inline] + pub fn dialogue(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(MainCityObjectTemplate::VT_DIALOGUE, None)} + } + #[inline] + pub fn interact_name(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(MainCityObjectTemplate::VT_INTERACT_NAME, None)} + } + #[inline] + pub fn interact_shape(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityObjectTemplate::VT_INTERACT_SHAPE, Some(0)).unwrap()} + } + #[inline] + pub fn interact_scale(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(MainCityObjectTemplate::VT_INTERACT_SCALE, None)} + } + #[inline] + pub fn secondary_interact_shape(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityObjectTemplate::VT_SECONDARY_INTERACT_SHAPE, Some(0)).unwrap()} + } + #[inline] + pub fn secondary_interact_scale(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(MainCityObjectTemplate::VT_SECONDARY_INTERACT_SCALE, None)} + } + #[inline] + pub fn fan_interact_param(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(MainCityObjectTemplate::VT_FAN_INTERACT_PARAM, None)} + } + #[inline] + pub fn focus_interact_scale(&self) -> f32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityObjectTemplate::VT_FOCUS_INTERACT_SCALE, Some(0.0)).unwrap()} + } + #[inline] + pub fn unk_2(&self) -> bool { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityObjectTemplate::VT_UNK_2, Some(false)).unwrap()} + } + #[inline] + pub fn unk_3(&self) -> bool { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityObjectTemplate::VT_UNK_3, Some(false)).unwrap()} + } + #[inline] + pub fn unk_4(&self) -> bool { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityObjectTemplate::VT_UNK_4, Some(false)).unwrap()} + } + #[inline] + pub fn unk_5(&self) -> bool { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityObjectTemplate::VT_UNK_5, Some(false)).unwrap()} + } + #[inline] + pub fn unk_6(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityObjectTemplate::VT_UNK_6, Some(0)).unwrap()} + } + #[inline] + pub fn unk_7(&self) -> bool { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityObjectTemplate::VT_UNK_7, Some(false)).unwrap()} + } + #[inline] + pub fn unk_8(&self) -> bool { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityObjectTemplate::VT_UNK_8, Some(false)).unwrap()} + } + #[inline] + pub fn unk_9(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityObjectTemplate::VT_UNK_9, Some(0)).unwrap()} + } + #[inline] + pub fn unk_10(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityObjectTemplate::VT_UNK_10, Some(0)).unwrap()} + } + #[inline] + pub fn unk_11(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityObjectTemplate::VT_UNK_11, Some(0)).unwrap()} + } + #[inline] + pub fn unk_12(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityObjectTemplate::VT_UNK_12, Some(0)).unwrap()} + } + #[inline] + pub fn unk_13(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityObjectTemplate::VT_UNK_13, Some(0)).unwrap()} + } + #[inline] + pub fn unk_14(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityObjectTemplate::VT_UNK_14, Some(0)).unwrap()} + } + #[inline] + pub fn unk_15(&self) -> bool { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityObjectTemplate::VT_UNK_15, Some(false)).unwrap()} + } + #[inline] + pub fn unk_16(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityObjectTemplate::VT_UNK_16, Some(0)).unwrap()} + } + #[inline] + pub fn unk_17(&self) -> bool { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityObjectTemplate::VT_UNK_17, Some(false)).unwrap()} + } + #[inline] + pub fn unk_18(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityObjectTemplate::VT_UNK_18, Some(0)).unwrap()} + } + #[inline] + pub fn unk_19(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityObjectTemplate::VT_UNK_19, Some(0)).unwrap()} + } + #[inline] + pub fn unk_20(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityObjectTemplate::VT_UNK_20, Some(0)).unwrap()} + } + #[inline] + pub fn unk_21(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityObjectTemplate::VT_UNK_21, Some(0)).unwrap()} + } + #[inline] + pub fn unk_22(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityObjectTemplate::VT_UNK_22, Some(0)).unwrap()} + } + #[inline] + pub fn unk_23(&self) -> bool { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityObjectTemplate::VT_UNK_23, Some(false)).unwrap()} + } + #[inline] + pub fn unk_24(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityObjectTemplate::VT_UNK_24, Some(0)).unwrap()} + } + #[inline] + pub fn unk_25(&self) -> bool { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityObjectTemplate::VT_UNK_25, Some(false)).unwrap()} + } + #[inline] + pub fn unk_26(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityObjectTemplate::VT_UNK_26, Some(0)).unwrap()} + } + #[inline] + pub fn unk_27(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityObjectTemplate::VT_UNK_27, Some(0)).unwrap()} + } + #[inline] + pub fn default_interact_ids(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(MainCityObjectTemplate::VT_DEFAULT_INTERACT_IDS, None)} + } +} + +impl flatbuffers::Verifiable for MainCityObjectTemplate<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::("tag_id", Self::VT_TAG_ID, false)? + .visit_field::("npc_id", Self::VT_NPC_ID, false)? + .visit_field::>("create_position", Self::VT_CREATE_POSITION, false)? + .visit_field::("create_type", Self::VT_CREATE_TYPE, false)? + .visit_field::>("npc_name", Self::VT_NPC_NAME, false)? + .visit_field::("unk_0", Self::VT_UNK_0, false)? + .visit_field::("unk_1", Self::VT_UNK_1, false)? + .visit_field::>("dialogue", Self::VT_DIALOGUE, false)? + .visit_field::>("interact_name", Self::VT_INTERACT_NAME, false)? + .visit_field::("interact_shape", Self::VT_INTERACT_SHAPE, false)? + .visit_field::>("interact_scale", Self::VT_INTERACT_SCALE, false)? + .visit_field::("secondary_interact_shape", Self::VT_SECONDARY_INTERACT_SHAPE, false)? + .visit_field::>("secondary_interact_scale", Self::VT_SECONDARY_INTERACT_SCALE, false)? + .visit_field::>("fan_interact_param", Self::VT_FAN_INTERACT_PARAM, false)? + .visit_field::("focus_interact_scale", Self::VT_FOCUS_INTERACT_SCALE, false)? + .visit_field::("unk_2", Self::VT_UNK_2, false)? + .visit_field::("unk_3", Self::VT_UNK_3, false)? + .visit_field::("unk_4", Self::VT_UNK_4, false)? + .visit_field::("unk_5", Self::VT_UNK_5, false)? + .visit_field::("unk_6", Self::VT_UNK_6, false)? + .visit_field::("unk_7", Self::VT_UNK_7, false)? + .visit_field::("unk_8", Self::VT_UNK_8, false)? + .visit_field::("unk_9", Self::VT_UNK_9, false)? + .visit_field::("unk_10", Self::VT_UNK_10, false)? + .visit_field::("unk_11", Self::VT_UNK_11, false)? + .visit_field::("unk_12", Self::VT_UNK_12, false)? + .visit_field::("unk_13", Self::VT_UNK_13, false)? + .visit_field::("unk_14", Self::VT_UNK_14, false)? + .visit_field::("unk_15", Self::VT_UNK_15, false)? + .visit_field::("unk_16", Self::VT_UNK_16, false)? + .visit_field::("unk_17", Self::VT_UNK_17, false)? + .visit_field::("unk_18", Self::VT_UNK_18, false)? + .visit_field::("unk_19", Self::VT_UNK_19, false)? + .visit_field::("unk_20", Self::VT_UNK_20, false)? + .visit_field::("unk_21", Self::VT_UNK_21, false)? + .visit_field::("unk_22", Self::VT_UNK_22, false)? + .visit_field::("unk_23", Self::VT_UNK_23, false)? + .visit_field::("unk_24", Self::VT_UNK_24, false)? + .visit_field::("unk_25", Self::VT_UNK_25, false)? + .visit_field::("unk_26", Self::VT_UNK_26, false)? + .visit_field::("unk_27", Self::VT_UNK_27, false)? + .visit_field::>>("default_interact_ids", Self::VT_DEFAULT_INTERACT_IDS, false)? + .finish(); + Ok(()) + } +} +pub struct MainCityObjectTemplateArgs<'a> { + pub tag_id: i32, + pub npc_id: i32, + pub create_position: Option>, + pub create_type: i32, + pub npc_name: Option>, + pub unk_0: i32, + pub unk_1: i32, + pub dialogue: Option>, + pub interact_name: Option>, + pub interact_shape: i32, + pub interact_scale: Option>, + pub secondary_interact_shape: i32, + pub secondary_interact_scale: Option>, + pub fan_interact_param: Option>, + pub focus_interact_scale: f32, + pub unk_2: bool, + pub unk_3: bool, + pub unk_4: bool, + pub unk_5: bool, + pub unk_6: i32, + pub unk_7: bool, + pub unk_8: bool, + pub unk_9: u32, + pub unk_10: u32, + pub unk_11: u32, + pub unk_12: u32, + pub unk_13: u32, + pub unk_14: u32, + pub unk_15: bool, + pub unk_16: u32, + pub unk_17: bool, + pub unk_18: u32, + pub unk_19: u32, + pub unk_20: u32, + pub unk_21: u32, + pub unk_22: u32, + pub unk_23: bool, + pub unk_24: u32, + pub unk_25: bool, + pub unk_26: u32, + pub unk_27: u32, + pub default_interact_ids: Option>>, +} +impl<'a> Default for MainCityObjectTemplateArgs<'a> { + #[inline] + fn default() -> Self { + MainCityObjectTemplateArgs { + tag_id: 0, + npc_id: 0, + create_position: None, + create_type: 0, + npc_name: None, + unk_0: 0, + unk_1: 0, + dialogue: None, + interact_name: None, + interact_shape: 0, + interact_scale: None, + secondary_interact_shape: 0, + secondary_interact_scale: None, + fan_interact_param: None, + focus_interact_scale: 0.0, + unk_2: false, + unk_3: false, + unk_4: false, + unk_5: false, + unk_6: 0, + unk_7: false, + unk_8: false, + unk_9: 0, + unk_10: 0, + unk_11: 0, + unk_12: 0, + unk_13: 0, + unk_14: 0, + unk_15: false, + unk_16: 0, + unk_17: false, + unk_18: 0, + unk_19: 0, + unk_20: 0, + unk_21: 0, + unk_22: 0, + unk_23: false, + unk_24: 0, + unk_25: false, + unk_26: 0, + unk_27: 0, + default_interact_ids: None, + } + } +} + +pub struct MainCityObjectTemplateBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> MainCityObjectTemplateBuilder<'a, 'b, A> { + #[inline] + pub fn add_tag_id(&mut self, tag_id: i32) { + self.fbb_.push_slot::(MainCityObjectTemplate::VT_TAG_ID, tag_id, 0); + } + #[inline] + pub fn add_npc_id(&mut self, npc_id: i32) { + self.fbb_.push_slot::(MainCityObjectTemplate::VT_NPC_ID, npc_id, 0); + } + #[inline] + pub fn add_create_position(&mut self, create_position: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(MainCityObjectTemplate::VT_CREATE_POSITION, create_position); + } + #[inline] + pub fn add_create_type(&mut self, create_type: i32) { + self.fbb_.push_slot::(MainCityObjectTemplate::VT_CREATE_TYPE, create_type, 0); + } + #[inline] + pub fn add_npc_name(&mut self, npc_name: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(MainCityObjectTemplate::VT_NPC_NAME, npc_name); + } + #[inline] + pub fn add_unk_0(&mut self, unk_0: i32) { + self.fbb_.push_slot::(MainCityObjectTemplate::VT_UNK_0, unk_0, 0); + } + #[inline] + pub fn add_unk_1(&mut self, unk_1: i32) { + self.fbb_.push_slot::(MainCityObjectTemplate::VT_UNK_1, unk_1, 0); + } + #[inline] + pub fn add_dialogue(&mut self, dialogue: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(MainCityObjectTemplate::VT_DIALOGUE, dialogue); + } + #[inline] + pub fn add_interact_name(&mut self, interact_name: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(MainCityObjectTemplate::VT_INTERACT_NAME, interact_name); + } + #[inline] + pub fn add_interact_shape(&mut self, interact_shape: i32) { + self.fbb_.push_slot::(MainCityObjectTemplate::VT_INTERACT_SHAPE, interact_shape, 0); + } + #[inline] + pub fn add_interact_scale(&mut self, interact_scale: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(MainCityObjectTemplate::VT_INTERACT_SCALE, interact_scale); + } + #[inline] + pub fn add_secondary_interact_shape(&mut self, secondary_interact_shape: i32) { + self.fbb_.push_slot::(MainCityObjectTemplate::VT_SECONDARY_INTERACT_SHAPE, secondary_interact_shape, 0); + } + #[inline] + pub fn add_secondary_interact_scale(&mut self, secondary_interact_scale: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(MainCityObjectTemplate::VT_SECONDARY_INTERACT_SCALE, secondary_interact_scale); + } + #[inline] + pub fn add_fan_interact_param(&mut self, fan_interact_param: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(MainCityObjectTemplate::VT_FAN_INTERACT_PARAM, fan_interact_param); + } + #[inline] + pub fn add_focus_interact_scale(&mut self, focus_interact_scale: f32) { + self.fbb_.push_slot::(MainCityObjectTemplate::VT_FOCUS_INTERACT_SCALE, focus_interact_scale, 0.0); + } + #[inline] + pub fn add_unk_2(&mut self, unk_2: bool) { + self.fbb_.push_slot::(MainCityObjectTemplate::VT_UNK_2, unk_2, false); + } + #[inline] + pub fn add_unk_3(&mut self, unk_3: bool) { + self.fbb_.push_slot::(MainCityObjectTemplate::VT_UNK_3, unk_3, false); + } + #[inline] + pub fn add_unk_4(&mut self, unk_4: bool) { + self.fbb_.push_slot::(MainCityObjectTemplate::VT_UNK_4, unk_4, false); + } + #[inline] + pub fn add_unk_5(&mut self, unk_5: bool) { + self.fbb_.push_slot::(MainCityObjectTemplate::VT_UNK_5, unk_5, false); + } + #[inline] + pub fn add_unk_6(&mut self, unk_6: i32) { + self.fbb_.push_slot::(MainCityObjectTemplate::VT_UNK_6, unk_6, 0); + } + #[inline] + pub fn add_unk_7(&mut self, unk_7: bool) { + self.fbb_.push_slot::(MainCityObjectTemplate::VT_UNK_7, unk_7, false); + } + #[inline] + pub fn add_unk_8(&mut self, unk_8: bool) { + self.fbb_.push_slot::(MainCityObjectTemplate::VT_UNK_8, unk_8, false); + } + #[inline] + pub fn add_unk_9(&mut self, unk_9: u32) { + self.fbb_.push_slot::(MainCityObjectTemplate::VT_UNK_9, unk_9, 0); + } + #[inline] + pub fn add_unk_10(&mut self, unk_10: u32) { + self.fbb_.push_slot::(MainCityObjectTemplate::VT_UNK_10, unk_10, 0); + } + #[inline] + pub fn add_unk_11(&mut self, unk_11: u32) { + self.fbb_.push_slot::(MainCityObjectTemplate::VT_UNK_11, unk_11, 0); + } + #[inline] + pub fn add_unk_12(&mut self, unk_12: u32) { + self.fbb_.push_slot::(MainCityObjectTemplate::VT_UNK_12, unk_12, 0); + } + #[inline] + pub fn add_unk_13(&mut self, unk_13: u32) { + self.fbb_.push_slot::(MainCityObjectTemplate::VT_UNK_13, unk_13, 0); + } + #[inline] + pub fn add_unk_14(&mut self, unk_14: u32) { + self.fbb_.push_slot::(MainCityObjectTemplate::VT_UNK_14, unk_14, 0); + } + #[inline] + pub fn add_unk_15(&mut self, unk_15: bool) { + self.fbb_.push_slot::(MainCityObjectTemplate::VT_UNK_15, unk_15, false); + } + #[inline] + pub fn add_unk_16(&mut self, unk_16: u32) { + self.fbb_.push_slot::(MainCityObjectTemplate::VT_UNK_16, unk_16, 0); + } + #[inline] + pub fn add_unk_17(&mut self, unk_17: bool) { + self.fbb_.push_slot::(MainCityObjectTemplate::VT_UNK_17, unk_17, false); + } + #[inline] + pub fn add_unk_18(&mut self, unk_18: u32) { + self.fbb_.push_slot::(MainCityObjectTemplate::VT_UNK_18, unk_18, 0); + } + #[inline] + pub fn add_unk_19(&mut self, unk_19: u32) { + self.fbb_.push_slot::(MainCityObjectTemplate::VT_UNK_19, unk_19, 0); + } + #[inline] + pub fn add_unk_20(&mut self, unk_20: u32) { + self.fbb_.push_slot::(MainCityObjectTemplate::VT_UNK_20, unk_20, 0); + } + #[inline] + pub fn add_unk_21(&mut self, unk_21: u32) { + self.fbb_.push_slot::(MainCityObjectTemplate::VT_UNK_21, unk_21, 0); + } + #[inline] + pub fn add_unk_22(&mut self, unk_22: u32) { + self.fbb_.push_slot::(MainCityObjectTemplate::VT_UNK_22, unk_22, 0); + } + #[inline] + pub fn add_unk_23(&mut self, unk_23: bool) { + self.fbb_.push_slot::(MainCityObjectTemplate::VT_UNK_23, unk_23, false); + } + #[inline] + pub fn add_unk_24(&mut self, unk_24: u32) { + self.fbb_.push_slot::(MainCityObjectTemplate::VT_UNK_24, unk_24, 0); + } + #[inline] + pub fn add_unk_25(&mut self, unk_25: bool) { + self.fbb_.push_slot::(MainCityObjectTemplate::VT_UNK_25, unk_25, false); + } + #[inline] + pub fn add_unk_26(&mut self, unk_26: u32) { + self.fbb_.push_slot::(MainCityObjectTemplate::VT_UNK_26, unk_26, 0); + } + #[inline] + pub fn add_unk_27(&mut self, unk_27: u32) { + self.fbb_.push_slot::(MainCityObjectTemplate::VT_UNK_27, unk_27, 0); + } + #[inline] + pub fn add_default_interact_ids(&mut self, default_interact_ids: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(MainCityObjectTemplate::VT_DEFAULT_INTERACT_IDS, default_interact_ids); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> MainCityObjectTemplateBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + MainCityObjectTemplateBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for MainCityObjectTemplate<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("MainCityObjectTemplate"); + ds.field("tag_id", &self.tag_id()); + ds.field("npc_id", &self.npc_id()); + ds.field("create_position", &self.create_position()); + ds.field("create_type", &self.create_type()); + ds.field("npc_name", &self.npc_name()); + ds.field("unk_0", &self.unk_0()); + ds.field("unk_1", &self.unk_1()); + ds.field("dialogue", &self.dialogue()); + ds.field("interact_name", &self.interact_name()); + ds.field("interact_shape", &self.interact_shape()); + ds.field("interact_scale", &self.interact_scale()); + ds.field("secondary_interact_shape", &self.secondary_interact_shape()); + ds.field("secondary_interact_scale", &self.secondary_interact_scale()); + ds.field("fan_interact_param", &self.fan_interact_param()); + ds.field("focus_interact_scale", &self.focus_interact_scale()); + ds.field("unk_2", &self.unk_2()); + ds.field("unk_3", &self.unk_3()); + ds.field("unk_4", &self.unk_4()); + ds.field("unk_5", &self.unk_5()); + ds.field("unk_6", &self.unk_6()); + ds.field("unk_7", &self.unk_7()); + ds.field("unk_8", &self.unk_8()); + ds.field("unk_9", &self.unk_9()); + ds.field("unk_10", &self.unk_10()); + ds.field("unk_11", &self.unk_11()); + ds.field("unk_12", &self.unk_12()); + ds.field("unk_13", &self.unk_13()); + ds.field("unk_14", &self.unk_14()); + ds.field("unk_15", &self.unk_15()); + ds.field("unk_16", &self.unk_16()); + ds.field("unk_17", &self.unk_17()); + ds.field("unk_18", &self.unk_18()); + ds.field("unk_19", &self.unk_19()); + ds.field("unk_20", &self.unk_20()); + ds.field("unk_21", &self.unk_21()); + ds.field("unk_22", &self.unk_22()); + ds.field("unk_23", &self.unk_23()); + ds.field("unk_24", &self.unk_24()); + ds.field("unk_25", &self.unk_25()); + ds.field("unk_26", &self.unk_26()); + ds.field("unk_27", &self.unk_27()); + ds.field("default_interact_ids", &self.default_interact_ids()); + ds.finish() + } +} +pub enum MainCityObjectTemplateTbOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct MainCityObjectTemplateTb<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for MainCityObjectTemplateTb<'a> { + type Inner = MainCityObjectTemplateTb<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> MainCityObjectTemplateTb<'a> { + pub const VT_DATA: flatbuffers::VOffsetT = 4; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + MainCityObjectTemplateTb { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args MainCityObjectTemplateTbArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = MainCityObjectTemplateTbBuilder::new(_fbb); + if let Some(x) = args.data { builder.add_data(x); } + builder.finish() + } + + + #[inline] + pub fn data(&self) -> Option>>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(MainCityObjectTemplateTb::VT_DATA, None)} + } +} + +impl flatbuffers::Verifiable for MainCityObjectTemplateTb<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::>>>("data", Self::VT_DATA, false)? + .finish(); + Ok(()) + } +} +pub struct MainCityObjectTemplateTbArgs<'a> { + pub data: Option>>>>, +} +impl<'a> Default for MainCityObjectTemplateTbArgs<'a> { + #[inline] + fn default() -> Self { + MainCityObjectTemplateTbArgs { + data: None, + } + } +} + +pub struct MainCityObjectTemplateTbBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> MainCityObjectTemplateTbBuilder<'a, 'b, A> { + #[inline] + pub fn add_data(&mut self, data: flatbuffers::WIPOffset>>>) { + self.fbb_.push_slot_always::>(MainCityObjectTemplateTb::VT_DATA, data); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> MainCityObjectTemplateTbBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + MainCityObjectTemplateTbBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for MainCityObjectTemplateTb<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("MainCityObjectTemplateTb"); + ds.field("data", &self.data()); + ds.finish() + } +} diff --git a/lib/config/gen_flatbuffers/main_city_quest_template_generated.rs b/lib/config/gen_flatbuffers/main_city_quest_template_generated.rs new file mode 100644 index 0000000..339de4b --- /dev/null +++ b/lib/config/gen_flatbuffers/main_city_quest_template_generated.rs @@ -0,0 +1,778 @@ +// automatically generated by the FlatBuffers compiler, do not modify + + +// @generated + +use core::mem; +use core::cmp::Ordering; + +extern crate flatbuffers; +use self::flatbuffers::{EndianScalar, Follow}; + +pub enum TimeOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct Time<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for Time<'a> { + type Inner = Time<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> Time<'a> { + pub const VT_HOUR: flatbuffers::VOffsetT = 4; + pub const VT_MINUTE: flatbuffers::VOffsetT = 6; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + Time { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args TimeArgs + ) -> flatbuffers::WIPOffset> { + let mut builder = TimeBuilder::new(_fbb); + builder.add_minute(args.minute); + builder.add_hour(args.hour); + builder.finish() + } + + + #[inline] + pub fn hour(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(Time::VT_HOUR, Some(0)).unwrap()} + } + #[inline] + pub fn minute(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(Time::VT_MINUTE, Some(0)).unwrap()} + } +} + +impl flatbuffers::Verifiable for Time<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::("hour", Self::VT_HOUR, false)? + .visit_field::("minute", Self::VT_MINUTE, false)? + .finish(); + Ok(()) + } +} +pub struct TimeArgs { + pub hour: i32, + pub minute: i32, +} +impl<'a> Default for TimeArgs { + #[inline] + fn default() -> Self { + TimeArgs { + hour: 0, + minute: 0, + } + } +} + +pub struct TimeBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> TimeBuilder<'a, 'b, A> { + #[inline] + pub fn add_hour(&mut self, hour: i32) { + self.fbb_.push_slot::(Time::VT_HOUR, hour, 0); + } + #[inline] + pub fn add_minute(&mut self, minute: i32) { + self.fbb_.push_slot::(Time::VT_MINUTE, minute, 0); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> TimeBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + TimeBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for Time<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("Time"); + ds.field("hour", &self.hour()); + ds.field("minute", &self.minute()); + ds.finish() + } +} +pub enum MainCityQuestTemplateOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct MainCityQuestTemplate<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for MainCityQuestTemplate<'a> { + type Inner = MainCityQuestTemplate<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> MainCityQuestTemplate<'a> { + pub const VT_ID: flatbuffers::VOffsetT = 4; + pub const VT_QUEST_NAME: flatbuffers::VOffsetT = 6; + pub const VT_TYPE_: flatbuffers::VOffsetT = 8; + pub const VT_SHOW_FINISH_TIP: flatbuffers::VOffsetT = 10; + pub const VT_UNK_2: flatbuffers::VOffsetT = 12; + pub const VT_UNK_3: flatbuffers::VOffsetT = 14; + pub const VT_QUEST_DESC: flatbuffers::VOffsetT = 16; + pub const VT_UNK_5: flatbuffers::VOffsetT = 18; + pub const VT_START_TIME: flatbuffers::VOffsetT = 20; + pub const VT_UNK_6: flatbuffers::VOffsetT = 22; + pub const VT_UNK_7: flatbuffers::VOffsetT = 24; + pub const VT_GROUP: flatbuffers::VOffsetT = 26; + pub const VT_PRIORITY: flatbuffers::VOffsetT = 28; + pub const VT_AUTO_DISTRIBUTION: flatbuffers::VOffsetT = 30; + pub const VT_SCRIPT_EXEC_TYPE: flatbuffers::VOffsetT = 32; + pub const VT_UNK_8: flatbuffers::VOffsetT = 34; + pub const VT_QUEST_BEGIN_SCRIPT: flatbuffers::VOffsetT = 36; + pub const VT_QUEST_END_SCRIPT: flatbuffers::VOffsetT = 38; + pub const VT_QUEST_END_ACTION_TYPE: flatbuffers::VOffsetT = 40; + pub const VT_ACTION_ARG_1: flatbuffers::VOffsetT = 42; + pub const VT_ACTION_ARG_2: flatbuffers::VOffsetT = 44; + pub const VT_ACTION_ARG_3: flatbuffers::VOffsetT = 46; + pub const VT_ACTION_ARG_4: flatbuffers::VOffsetT = 48; + pub const VT_UNK_9: flatbuffers::VOffsetT = 50; + pub const VT_UNK_10: flatbuffers::VOffsetT = 52; + pub const VT_NPCS: flatbuffers::VOffsetT = 54; + pub const VT_AREAS: flatbuffers::VOffsetT = 56; + pub const VT_UNK_11: flatbuffers::VOffsetT = 58; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + MainCityQuestTemplate { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args MainCityQuestTemplateArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = MainCityQuestTemplateBuilder::new(_fbb); + if let Some(x) = args.unk_11 { builder.add_unk_11(x); } + if let Some(x) = args.areas { builder.add_areas(x); } + if let Some(x) = args.npcs { builder.add_npcs(x); } + if let Some(x) = args.action_arg_4 { builder.add_action_arg_4(x); } + if let Some(x) = args.action_arg_3 { builder.add_action_arg_3(x); } + if let Some(x) = args.action_arg_2 { builder.add_action_arg_2(x); } + if let Some(x) = args.action_arg_1 { builder.add_action_arg_1(x); } + builder.add_quest_end_action_type(args.quest_end_action_type); + builder.add_quest_end_script(args.quest_end_script); + builder.add_quest_begin_script(args.quest_begin_script); + if let Some(x) = args.unk_8 { builder.add_unk_8(x); } + builder.add_script_exec_type(args.script_exec_type); + builder.add_priority(args.priority); + builder.add_group(args.group); + builder.add_unk_7(args.unk_7); + builder.add_unk_6(args.unk_6); + if let Some(x) = args.start_time { builder.add_start_time(x); } + if let Some(x) = args.unk_5 { builder.add_unk_5(x); } + if let Some(x) = args.quest_desc { builder.add_quest_desc(x); } + if let Some(x) = args.unk_2 { builder.add_unk_2(x); } + builder.add_show_finish_tip(args.show_finish_tip); + builder.add_type_(args.type_); + if let Some(x) = args.quest_name { builder.add_quest_name(x); } + builder.add_id(args.id); + builder.add_unk_10(args.unk_10); + builder.add_unk_9(args.unk_9); + builder.add_auto_distribution(args.auto_distribution); + builder.add_unk_3(args.unk_3); + builder.finish() + } + + + #[inline] + pub fn id(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityQuestTemplate::VT_ID, Some(0)).unwrap()} + } + #[inline] + pub fn quest_name(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(MainCityQuestTemplate::VT_QUEST_NAME, None)} + } + #[inline] + pub fn type_(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityQuestTemplate::VT_TYPE_, Some(0)).unwrap()} + } + #[inline] + pub fn show_finish_tip(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityQuestTemplate::VT_SHOW_FINISH_TIP, Some(0)).unwrap()} + } + #[inline] + pub fn unk_2(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(MainCityQuestTemplate::VT_UNK_2, None)} + } + #[inline] + pub fn unk_3(&self) -> bool { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityQuestTemplate::VT_UNK_3, Some(false)).unwrap()} + } + #[inline] + pub fn quest_desc(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(MainCityQuestTemplate::VT_QUEST_DESC, None)} + } + #[inline] + pub fn unk_5(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(MainCityQuestTemplate::VT_UNK_5, None)} + } + #[inline] + pub fn start_time(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(MainCityQuestTemplate::VT_START_TIME, None)} + } + #[inline] + pub fn unk_6(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityQuestTemplate::VT_UNK_6, Some(0)).unwrap()} + } + #[inline] + pub fn unk_7(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityQuestTemplate::VT_UNK_7, Some(0)).unwrap()} + } + #[inline] + pub fn group(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityQuestTemplate::VT_GROUP, Some(0)).unwrap()} + } + #[inline] + pub fn priority(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityQuestTemplate::VT_PRIORITY, Some(0)).unwrap()} + } + #[inline] + pub fn auto_distribution(&self) -> bool { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityQuestTemplate::VT_AUTO_DISTRIBUTION, Some(false)).unwrap()} + } + #[inline] + pub fn script_exec_type(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityQuestTemplate::VT_SCRIPT_EXEC_TYPE, Some(0)).unwrap()} + } + #[inline] + pub fn unk_8(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(MainCityQuestTemplate::VT_UNK_8, None)} + } + #[inline] + pub fn quest_begin_script(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityQuestTemplate::VT_QUEST_BEGIN_SCRIPT, Some(0)).unwrap()} + } + #[inline] + pub fn quest_end_script(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityQuestTemplate::VT_QUEST_END_SCRIPT, Some(0)).unwrap()} + } + #[inline] + pub fn quest_end_action_type(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityQuestTemplate::VT_QUEST_END_ACTION_TYPE, Some(0)).unwrap()} + } + #[inline] + pub fn action_arg_1(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(MainCityQuestTemplate::VT_ACTION_ARG_1, None)} + } + #[inline] + pub fn action_arg_2(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(MainCityQuestTemplate::VT_ACTION_ARG_2, None)} + } + #[inline] + pub fn action_arg_3(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(MainCityQuestTemplate::VT_ACTION_ARG_3, None)} + } + #[inline] + pub fn action_arg_4(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(MainCityQuestTemplate::VT_ACTION_ARG_4, None)} + } + #[inline] + pub fn unk_9(&self) -> bool { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityQuestTemplate::VT_UNK_9, Some(false)).unwrap()} + } + #[inline] + pub fn unk_10(&self) -> bool { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(MainCityQuestTemplate::VT_UNK_10, Some(false)).unwrap()} + } + #[inline] + pub fn npcs(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(MainCityQuestTemplate::VT_NPCS, None)} + } + #[inline] + pub fn areas(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(MainCityQuestTemplate::VT_AREAS, None)} + } + #[inline] + pub fn unk_11(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(MainCityQuestTemplate::VT_UNK_11, None)} + } +} + +impl flatbuffers::Verifiable for MainCityQuestTemplate<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::("id", Self::VT_ID, false)? + .visit_field::>("quest_name", Self::VT_QUEST_NAME, false)? + .visit_field::("type_", Self::VT_TYPE_, false)? + .visit_field::("show_finish_tip", Self::VT_SHOW_FINISH_TIP, false)? + .visit_field::>("unk_2", Self::VT_UNK_2, false)? + .visit_field::("unk_3", Self::VT_UNK_3, false)? + .visit_field::>("quest_desc", Self::VT_QUEST_DESC, false)? + .visit_field::>("unk_5", Self::VT_UNK_5, false)? + .visit_field::>("start_time", Self::VT_START_TIME, false)? + .visit_field::("unk_6", Self::VT_UNK_6, false)? + .visit_field::("unk_7", Self::VT_UNK_7, false)? + .visit_field::("group", Self::VT_GROUP, false)? + .visit_field::("priority", Self::VT_PRIORITY, false)? + .visit_field::("auto_distribution", Self::VT_AUTO_DISTRIBUTION, false)? + .visit_field::("script_exec_type", Self::VT_SCRIPT_EXEC_TYPE, false)? + .visit_field::>>("unk_8", Self::VT_UNK_8, false)? + .visit_field::("quest_begin_script", Self::VT_QUEST_BEGIN_SCRIPT, false)? + .visit_field::("quest_end_script", Self::VT_QUEST_END_SCRIPT, false)? + .visit_field::("quest_end_action_type", Self::VT_QUEST_END_ACTION_TYPE, false)? + .visit_field::>("action_arg_1", Self::VT_ACTION_ARG_1, false)? + .visit_field::>("action_arg_2", Self::VT_ACTION_ARG_2, false)? + .visit_field::>("action_arg_3", Self::VT_ACTION_ARG_3, false)? + .visit_field::>("action_arg_4", Self::VT_ACTION_ARG_4, false)? + .visit_field::("unk_9", Self::VT_UNK_9, false)? + .visit_field::("unk_10", Self::VT_UNK_10, false)? + .visit_field::>>("npcs", Self::VT_NPCS, false)? + .visit_field::>>("areas", Self::VT_AREAS, false)? + .visit_field::>>("unk_11", Self::VT_UNK_11, false)? + .finish(); + Ok(()) + } +} +pub struct MainCityQuestTemplateArgs<'a> { + pub id: u32, + pub quest_name: Option>, + pub type_: i32, + pub show_finish_tip: i32, + pub unk_2: Option>, + pub unk_3: bool, + pub quest_desc: Option>, + pub unk_5: Option>, + pub start_time: Option>>, + pub unk_6: i32, + pub unk_7: i32, + pub group: i32, + pub priority: i32, + pub auto_distribution: bool, + pub script_exec_type: i32, + pub unk_8: Option>>, + pub quest_begin_script: i32, + pub quest_end_script: i32, + pub quest_end_action_type: i32, + pub action_arg_1: Option>, + pub action_arg_2: Option>, + pub action_arg_3: Option>, + pub action_arg_4: Option>, + pub unk_9: bool, + pub unk_10: bool, + pub npcs: Option>>, + pub areas: Option>>, + pub unk_11: Option>>, +} +impl<'a> Default for MainCityQuestTemplateArgs<'a> { + #[inline] + fn default() -> Self { + MainCityQuestTemplateArgs { + id: 0, + quest_name: None, + type_: 0, + show_finish_tip: 0, + unk_2: None, + unk_3: false, + quest_desc: None, + unk_5: None, + start_time: None, + unk_6: 0, + unk_7: 0, + group: 0, + priority: 0, + auto_distribution: false, + script_exec_type: 0, + unk_8: None, + quest_begin_script: 0, + quest_end_script: 0, + quest_end_action_type: 0, + action_arg_1: None, + action_arg_2: None, + action_arg_3: None, + action_arg_4: None, + unk_9: false, + unk_10: false, + npcs: None, + areas: None, + unk_11: None, + } + } +} + +pub struct MainCityQuestTemplateBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> MainCityQuestTemplateBuilder<'a, 'b, A> { + #[inline] + pub fn add_id(&mut self, id: u32) { + self.fbb_.push_slot::(MainCityQuestTemplate::VT_ID, id, 0); + } + #[inline] + pub fn add_quest_name(&mut self, quest_name: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(MainCityQuestTemplate::VT_QUEST_NAME, quest_name); + } + #[inline] + pub fn add_type_(&mut self, type_: i32) { + self.fbb_.push_slot::(MainCityQuestTemplate::VT_TYPE_, type_, 0); + } + #[inline] + pub fn add_show_finish_tip(&mut self, show_finish_tip: i32) { + self.fbb_.push_slot::(MainCityQuestTemplate::VT_SHOW_FINISH_TIP, show_finish_tip, 0); + } + #[inline] + pub fn add_unk_2(&mut self, unk_2: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(MainCityQuestTemplate::VT_UNK_2, unk_2); + } + #[inline] + pub fn add_unk_3(&mut self, unk_3: bool) { + self.fbb_.push_slot::(MainCityQuestTemplate::VT_UNK_3, unk_3, false); + } + #[inline] + pub fn add_quest_desc(&mut self, quest_desc: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(MainCityQuestTemplate::VT_QUEST_DESC, quest_desc); + } + #[inline] + pub fn add_unk_5(&mut self, unk_5: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(MainCityQuestTemplate::VT_UNK_5, unk_5); + } + #[inline] + pub fn add_start_time(&mut self, start_time: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(MainCityQuestTemplate::VT_START_TIME, start_time); + } + #[inline] + pub fn add_unk_6(&mut self, unk_6: i32) { + self.fbb_.push_slot::(MainCityQuestTemplate::VT_UNK_6, unk_6, 0); + } + #[inline] + pub fn add_unk_7(&mut self, unk_7: i32) { + self.fbb_.push_slot::(MainCityQuestTemplate::VT_UNK_7, unk_7, 0); + } + #[inline] + pub fn add_group(&mut self, group: i32) { + self.fbb_.push_slot::(MainCityQuestTemplate::VT_GROUP, group, 0); + } + #[inline] + pub fn add_priority(&mut self, priority: i32) { + self.fbb_.push_slot::(MainCityQuestTemplate::VT_PRIORITY, priority, 0); + } + #[inline] + pub fn add_auto_distribution(&mut self, auto_distribution: bool) { + self.fbb_.push_slot::(MainCityQuestTemplate::VT_AUTO_DISTRIBUTION, auto_distribution, false); + } + #[inline] + pub fn add_script_exec_type(&mut self, script_exec_type: i32) { + self.fbb_.push_slot::(MainCityQuestTemplate::VT_SCRIPT_EXEC_TYPE, script_exec_type, 0); + } + #[inline] + pub fn add_unk_8(&mut self, unk_8: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(MainCityQuestTemplate::VT_UNK_8, unk_8); + } + #[inline] + pub fn add_quest_begin_script(&mut self, quest_begin_script: i32) { + self.fbb_.push_slot::(MainCityQuestTemplate::VT_QUEST_BEGIN_SCRIPT, quest_begin_script, 0); + } + #[inline] + pub fn add_quest_end_script(&mut self, quest_end_script: i32) { + self.fbb_.push_slot::(MainCityQuestTemplate::VT_QUEST_END_SCRIPT, quest_end_script, 0); + } + #[inline] + pub fn add_quest_end_action_type(&mut self, quest_end_action_type: i32) { + self.fbb_.push_slot::(MainCityQuestTemplate::VT_QUEST_END_ACTION_TYPE, quest_end_action_type, 0); + } + #[inline] + pub fn add_action_arg_1(&mut self, action_arg_1: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(MainCityQuestTemplate::VT_ACTION_ARG_1, action_arg_1); + } + #[inline] + pub fn add_action_arg_2(&mut self, action_arg_2: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(MainCityQuestTemplate::VT_ACTION_ARG_2, action_arg_2); + } + #[inline] + pub fn add_action_arg_3(&mut self, action_arg_3: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(MainCityQuestTemplate::VT_ACTION_ARG_3, action_arg_3); + } + #[inline] + pub fn add_action_arg_4(&mut self, action_arg_4: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(MainCityQuestTemplate::VT_ACTION_ARG_4, action_arg_4); + } + #[inline] + pub fn add_unk_9(&mut self, unk_9: bool) { + self.fbb_.push_slot::(MainCityQuestTemplate::VT_UNK_9, unk_9, false); + } + #[inline] + pub fn add_unk_10(&mut self, unk_10: bool) { + self.fbb_.push_slot::(MainCityQuestTemplate::VT_UNK_10, unk_10, false); + } + #[inline] + pub fn add_npcs(&mut self, npcs: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(MainCityQuestTemplate::VT_NPCS, npcs); + } + #[inline] + pub fn add_areas(&mut self, areas: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(MainCityQuestTemplate::VT_AREAS, areas); + } + #[inline] + pub fn add_unk_11(&mut self, unk_11: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(MainCityQuestTemplate::VT_UNK_11, unk_11); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> MainCityQuestTemplateBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + MainCityQuestTemplateBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for MainCityQuestTemplate<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("MainCityQuestTemplate"); + ds.field("id", &self.id()); + ds.field("quest_name", &self.quest_name()); + ds.field("type_", &self.type_()); + ds.field("show_finish_tip", &self.show_finish_tip()); + ds.field("unk_2", &self.unk_2()); + ds.field("unk_3", &self.unk_3()); + ds.field("quest_desc", &self.quest_desc()); + ds.field("unk_5", &self.unk_5()); + ds.field("start_time", &self.start_time()); + ds.field("unk_6", &self.unk_6()); + ds.field("unk_7", &self.unk_7()); + ds.field("group", &self.group()); + ds.field("priority", &self.priority()); + ds.field("auto_distribution", &self.auto_distribution()); + ds.field("script_exec_type", &self.script_exec_type()); + ds.field("unk_8", &self.unk_8()); + ds.field("quest_begin_script", &self.quest_begin_script()); + ds.field("quest_end_script", &self.quest_end_script()); + ds.field("quest_end_action_type", &self.quest_end_action_type()); + ds.field("action_arg_1", &self.action_arg_1()); + ds.field("action_arg_2", &self.action_arg_2()); + ds.field("action_arg_3", &self.action_arg_3()); + ds.field("action_arg_4", &self.action_arg_4()); + ds.field("unk_9", &self.unk_9()); + ds.field("unk_10", &self.unk_10()); + ds.field("npcs", &self.npcs()); + ds.field("areas", &self.areas()); + ds.field("unk_11", &self.unk_11()); + ds.finish() + } +} +pub enum MainCityQuestTemplateTbOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct MainCityQuestTemplateTb<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for MainCityQuestTemplateTb<'a> { + type Inner = MainCityQuestTemplateTb<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> MainCityQuestTemplateTb<'a> { + pub const VT_DATA: flatbuffers::VOffsetT = 4; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + MainCityQuestTemplateTb { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args MainCityQuestTemplateTbArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = MainCityQuestTemplateTbBuilder::new(_fbb); + if let Some(x) = args.data { builder.add_data(x); } + builder.finish() + } + + + #[inline] + pub fn data(&self) -> Option>>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(MainCityQuestTemplateTb::VT_DATA, None)} + } +} + +impl flatbuffers::Verifiable for MainCityQuestTemplateTb<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::>>>("data", Self::VT_DATA, false)? + .finish(); + Ok(()) + } +} +pub struct MainCityQuestTemplateTbArgs<'a> { + pub data: Option>>>>, +} +impl<'a> Default for MainCityQuestTemplateTbArgs<'a> { + #[inline] + fn default() -> Self { + MainCityQuestTemplateTbArgs { + data: None, + } + } +} + +pub struct MainCityQuestTemplateTbBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> MainCityQuestTemplateTbBuilder<'a, 'b, A> { + #[inline] + pub fn add_data(&mut self, data: flatbuffers::WIPOffset>>>) { + self.fbb_.push_slot_always::>(MainCityQuestTemplateTb::VT_DATA, data); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> MainCityQuestTemplateTbBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + MainCityQuestTemplateTbBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for MainCityQuestTemplateTb<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("MainCityQuestTemplateTb"); + ds.field("data", &self.data()); + ds.finish() + } +} diff --git a/lib/config/gen_flatbuffers/newbie_group_template_generated.rs b/lib/config/gen_flatbuffers/newbie_group_template_generated.rs new file mode 100644 index 0000000..331ae74 --- /dev/null +++ b/lib/config/gen_flatbuffers/newbie_group_template_generated.rs @@ -0,0 +1,239 @@ +// automatically generated by the FlatBuffers compiler, do not modify + + +// @generated + +use core::mem; +use core::cmp::Ordering; + +extern crate flatbuffers; +use self::flatbuffers::{EndianScalar, Follow}; + +pub enum NewbieGroupTemplateOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct NewbieGroupTemplate<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for NewbieGroupTemplate<'a> { + type Inner = NewbieGroupTemplate<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> NewbieGroupTemplate<'a> { + pub const VT_ID: flatbuffers::VOffsetT = 4; + pub const VT_UNK_1: flatbuffers::VOffsetT = 6; + pub const VT_TRIGGER_CONDITION: flatbuffers::VOffsetT = 8; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + NewbieGroupTemplate { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args NewbieGroupTemplateArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = NewbieGroupTemplateBuilder::new(_fbb); + if let Some(x) = args.trigger_condition { builder.add_trigger_condition(x); } + builder.add_unk_1(args.unk_1); + builder.add_id(args.id); + builder.finish() + } + + + #[inline] + pub fn id(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(NewbieGroupTemplate::VT_ID, Some(0)).unwrap()} + } + #[inline] + pub fn unk_1(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(NewbieGroupTemplate::VT_UNK_1, Some(0)).unwrap()} + } + #[inline] + pub fn trigger_condition(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(NewbieGroupTemplate::VT_TRIGGER_CONDITION, None)} + } +} + +impl flatbuffers::Verifiable for NewbieGroupTemplate<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::("id", Self::VT_ID, false)? + .visit_field::("unk_1", Self::VT_UNK_1, false)? + .visit_field::>("trigger_condition", Self::VT_TRIGGER_CONDITION, false)? + .finish(); + Ok(()) + } +} +pub struct NewbieGroupTemplateArgs<'a> { + pub id: i32, + pub unk_1: i32, + pub trigger_condition: Option>, +} +impl<'a> Default for NewbieGroupTemplateArgs<'a> { + #[inline] + fn default() -> Self { + NewbieGroupTemplateArgs { + id: 0, + unk_1: 0, + trigger_condition: None, + } + } +} + +pub struct NewbieGroupTemplateBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> NewbieGroupTemplateBuilder<'a, 'b, A> { + #[inline] + pub fn add_id(&mut self, id: i32) { + self.fbb_.push_slot::(NewbieGroupTemplate::VT_ID, id, 0); + } + #[inline] + pub fn add_unk_1(&mut self, unk_1: i32) { + self.fbb_.push_slot::(NewbieGroupTemplate::VT_UNK_1, unk_1, 0); + } + #[inline] + pub fn add_trigger_condition(&mut self, trigger_condition: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(NewbieGroupTemplate::VT_TRIGGER_CONDITION, trigger_condition); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> NewbieGroupTemplateBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + NewbieGroupTemplateBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for NewbieGroupTemplate<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("NewbieGroupTemplate"); + ds.field("id", &self.id()); + ds.field("unk_1", &self.unk_1()); + ds.field("trigger_condition", &self.trigger_condition()); + ds.finish() + } +} +pub enum NewbieGroupTemplateTbOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct NewbieGroupTemplateTb<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for NewbieGroupTemplateTb<'a> { + type Inner = NewbieGroupTemplateTb<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> NewbieGroupTemplateTb<'a> { + pub const VT_DATA: flatbuffers::VOffsetT = 4; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + NewbieGroupTemplateTb { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args NewbieGroupTemplateTbArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = NewbieGroupTemplateTbBuilder::new(_fbb); + if let Some(x) = args.data { builder.add_data(x); } + builder.finish() + } + + + #[inline] + pub fn data(&self) -> Option>>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(NewbieGroupTemplateTb::VT_DATA, None)} + } +} + +impl flatbuffers::Verifiable for NewbieGroupTemplateTb<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::>>>("data", Self::VT_DATA, false)? + .finish(); + Ok(()) + } +} +pub struct NewbieGroupTemplateTbArgs<'a> { + pub data: Option>>>>, +} +impl<'a> Default for NewbieGroupTemplateTbArgs<'a> { + #[inline] + fn default() -> Self { + NewbieGroupTemplateTbArgs { + data: None, + } + } +} + +pub struct NewbieGroupTemplateTbBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> NewbieGroupTemplateTbBuilder<'a, 'b, A> { + #[inline] + pub fn add_data(&mut self, data: flatbuffers::WIPOffset>>>) { + self.fbb_.push_slot_always::>(NewbieGroupTemplateTb::VT_DATA, data); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> NewbieGroupTemplateTbBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + NewbieGroupTemplateTbBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for NewbieGroupTemplateTb<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("NewbieGroupTemplateTb"); + ds.field("data", &self.data()); + ds.finish() + } +} diff --git a/lib/config/gen_flatbuffers/once_reward_template_generated.rs b/lib/config/gen_flatbuffers/once_reward_template_generated.rs new file mode 100644 index 0000000..10723fe --- /dev/null +++ b/lib/config/gen_flatbuffers/once_reward_template_generated.rs @@ -0,0 +1,450 @@ +// automatically generated by the FlatBuffers compiler, do not modify + + +// @generated + +use core::mem; +use core::cmp::Ordering; + +extern crate flatbuffers; +use self::flatbuffers::{EndianScalar, Follow}; + +// struct RewardConfig, aligned to 4 +#[repr(transparent)] +#[derive(Clone, Copy, PartialEq)] +pub struct RewardConfig(pub [u8; 12]); +impl Default for RewardConfig { + fn default() -> Self { + Self([0; 12]) + } +} +impl core::fmt::Debug for RewardConfig { + fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { + f.debug_struct("RewardConfig") + .field("item_id", &self.item_id()) + .field("amount", &self.amount()) + .field("unk_1", &self.unk_1()) + .finish() + } +} + +impl flatbuffers::SimpleToVerifyInSlice for RewardConfig {} +impl<'a> flatbuffers::Follow<'a> for RewardConfig { + type Inner = &'a RewardConfig; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + <&'a RewardConfig>::follow(buf, loc) + } +} +impl<'a> flatbuffers::Follow<'a> for &'a RewardConfig { + type Inner = &'a RewardConfig; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + flatbuffers::follow_cast_ref::(buf, loc) + } +} +impl<'b> flatbuffers::Push for RewardConfig { + type Output = RewardConfig; + #[inline] + unsafe fn push(&self, dst: &mut [u8], _written_len: usize) { + let src = ::core::slice::from_raw_parts(self as *const RewardConfig as *const u8, ::size()); + dst.copy_from_slice(src); + } + #[inline] + fn alignment() -> flatbuffers::PushAlignment { + flatbuffers::PushAlignment::new(4) + } +} + +impl<'a> flatbuffers::Verifiable for RewardConfig { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.in_buffer::(pos) + } +} + +impl<'a> RewardConfig { + #[allow(clippy::too_many_arguments)] + pub fn new( + item_id: u32, + amount: u32, + unk_1: i32, + ) -> Self { + let mut s = Self([0; 12]); + s.set_item_id(item_id); + s.set_amount(amount); + s.set_unk_1(unk_1); + s + } + + pub fn item_id(&self) -> u32 { + let mut mem = core::mem::MaybeUninit::<::Scalar>::uninit(); + // Safety: + // Created from a valid Table for this object + // Which contains a valid value in this slot + EndianScalar::from_little_endian(unsafe { + core::ptr::copy_nonoverlapping( + self.0[0..].as_ptr(), + mem.as_mut_ptr() as *mut u8, + core::mem::size_of::<::Scalar>(), + ); + mem.assume_init() + }) + } + + pub fn set_item_id(&mut self, x: u32) { + let x_le = x.to_little_endian(); + // Safety: + // Created from a valid Table for this object + // Which contains a valid value in this slot + unsafe { + core::ptr::copy_nonoverlapping( + &x_le as *const _ as *const u8, + self.0[0..].as_mut_ptr(), + core::mem::size_of::<::Scalar>(), + ); + } + } + + pub fn amount(&self) -> u32 { + let mut mem = core::mem::MaybeUninit::<::Scalar>::uninit(); + // Safety: + // Created from a valid Table for this object + // Which contains a valid value in this slot + EndianScalar::from_little_endian(unsafe { + core::ptr::copy_nonoverlapping( + self.0[4..].as_ptr(), + mem.as_mut_ptr() as *mut u8, + core::mem::size_of::<::Scalar>(), + ); + mem.assume_init() + }) + } + + pub fn set_amount(&mut self, x: u32) { + let x_le = x.to_little_endian(); + // Safety: + // Created from a valid Table for this object + // Which contains a valid value in this slot + unsafe { + core::ptr::copy_nonoverlapping( + &x_le as *const _ as *const u8, + self.0[4..].as_mut_ptr(), + core::mem::size_of::<::Scalar>(), + ); + } + } + + pub fn unk_1(&self) -> i32 { + let mut mem = core::mem::MaybeUninit::<::Scalar>::uninit(); + // Safety: + // Created from a valid Table for this object + // Which contains a valid value in this slot + EndianScalar::from_little_endian(unsafe { + core::ptr::copy_nonoverlapping( + self.0[8..].as_ptr(), + mem.as_mut_ptr() as *mut u8, + core::mem::size_of::<::Scalar>(), + ); + mem.assume_init() + }) + } + + pub fn set_unk_1(&mut self, x: i32) { + let x_le = x.to_little_endian(); + // Safety: + // Created from a valid Table for this object + // Which contains a valid value in this slot + unsafe { + core::ptr::copy_nonoverlapping( + &x_le as *const _ as *const u8, + self.0[8..].as_mut_ptr(), + core::mem::size_of::<::Scalar>(), + ); + } + } + +} + +pub enum OnceRewardTemplateOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct OnceRewardTemplate<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for OnceRewardTemplate<'a> { + type Inner = OnceRewardTemplate<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> OnceRewardTemplate<'a> { + pub const VT_REWARD_ID: flatbuffers::VOffsetT = 4; + pub const VT_UNK_1: flatbuffers::VOffsetT = 6; + pub const VT_UNK_2: flatbuffers::VOffsetT = 8; + pub const VT_UNK_3: flatbuffers::VOffsetT = 10; + pub const VT_UNK_4: flatbuffers::VOffsetT = 12; + pub const VT_REWARD_LIST: flatbuffers::VOffsetT = 14; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + OnceRewardTemplate { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args OnceRewardTemplateArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = OnceRewardTemplateBuilder::new(_fbb); + if let Some(x) = args.reward_list { builder.add_reward_list(x); } + if let Some(x) = args.unk_4 { builder.add_unk_4(x); } + if let Some(x) = args.unk_3 { builder.add_unk_3(x); } + builder.add_unk_2(args.unk_2); + builder.add_unk_1(args.unk_1); + builder.add_reward_id(args.reward_id); + builder.finish() + } + + + #[inline] + pub fn reward_id(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(OnceRewardTemplate::VT_REWARD_ID, Some(0)).unwrap()} + } + #[inline] + pub fn unk_1(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(OnceRewardTemplate::VT_UNK_1, Some(0)).unwrap()} + } + #[inline] + pub fn unk_2(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(OnceRewardTemplate::VT_UNK_2, Some(0)).unwrap()} + } + #[inline] + pub fn unk_3(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(OnceRewardTemplate::VT_UNK_3, None)} + } + #[inline] + pub fn unk_4(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(OnceRewardTemplate::VT_UNK_4, None)} + } + #[inline] + pub fn reward_list(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(OnceRewardTemplate::VT_REWARD_LIST, None)} + } +} + +impl flatbuffers::Verifiable for OnceRewardTemplate<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::("reward_id", Self::VT_REWARD_ID, false)? + .visit_field::("unk_1", Self::VT_UNK_1, false)? + .visit_field::("unk_2", Self::VT_UNK_2, false)? + .visit_field::>>("unk_3", Self::VT_UNK_3, false)? + .visit_field::>>("unk_4", Self::VT_UNK_4, false)? + .visit_field::>>("reward_list", Self::VT_REWARD_LIST, false)? + .finish(); + Ok(()) + } +} +pub struct OnceRewardTemplateArgs<'a> { + pub reward_id: u32, + pub unk_1: i32, + pub unk_2: i32, + pub unk_3: Option>>, + pub unk_4: Option>>, + pub reward_list: Option>>, +} +impl<'a> Default for OnceRewardTemplateArgs<'a> { + #[inline] + fn default() -> Self { + OnceRewardTemplateArgs { + reward_id: 0, + unk_1: 0, + unk_2: 0, + unk_3: None, + unk_4: None, + reward_list: None, + } + } +} + +pub struct OnceRewardTemplateBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> OnceRewardTemplateBuilder<'a, 'b, A> { + #[inline] + pub fn add_reward_id(&mut self, reward_id: u32) { + self.fbb_.push_slot::(OnceRewardTemplate::VT_REWARD_ID, reward_id, 0); + } + #[inline] + pub fn add_unk_1(&mut self, unk_1: i32) { + self.fbb_.push_slot::(OnceRewardTemplate::VT_UNK_1, unk_1, 0); + } + #[inline] + pub fn add_unk_2(&mut self, unk_2: i32) { + self.fbb_.push_slot::(OnceRewardTemplate::VT_UNK_2, unk_2, 0); + } + #[inline] + pub fn add_unk_3(&mut self, unk_3: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(OnceRewardTemplate::VT_UNK_3, unk_3); + } + #[inline] + pub fn add_unk_4(&mut self, unk_4: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(OnceRewardTemplate::VT_UNK_4, unk_4); + } + #[inline] + pub fn add_reward_list(&mut self, reward_list: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(OnceRewardTemplate::VT_REWARD_LIST, reward_list); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> OnceRewardTemplateBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + OnceRewardTemplateBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for OnceRewardTemplate<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("OnceRewardTemplate"); + ds.field("reward_id", &self.reward_id()); + ds.field("unk_1", &self.unk_1()); + ds.field("unk_2", &self.unk_2()); + ds.field("unk_3", &self.unk_3()); + ds.field("unk_4", &self.unk_4()); + ds.field("reward_list", &self.reward_list()); + ds.finish() + } +} +pub enum OnceRewardTemplateTbOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct OnceRewardTemplateTb<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for OnceRewardTemplateTb<'a> { + type Inner = OnceRewardTemplateTb<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> OnceRewardTemplateTb<'a> { + pub const VT_DATA: flatbuffers::VOffsetT = 4; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + OnceRewardTemplateTb { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args OnceRewardTemplateTbArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = OnceRewardTemplateTbBuilder::new(_fbb); + if let Some(x) = args.data { builder.add_data(x); } + builder.finish() + } + + + #[inline] + pub fn data(&self) -> Option>>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(OnceRewardTemplateTb::VT_DATA, None)} + } +} + +impl flatbuffers::Verifiable for OnceRewardTemplateTb<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::>>>("data", Self::VT_DATA, false)? + .finish(); + Ok(()) + } +} +pub struct OnceRewardTemplateTbArgs<'a> { + pub data: Option>>>>, +} +impl<'a> Default for OnceRewardTemplateTbArgs<'a> { + #[inline] + fn default() -> Self { + OnceRewardTemplateTbArgs { + data: None, + } + } +} + +pub struct OnceRewardTemplateTbBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> OnceRewardTemplateTbBuilder<'a, 'b, A> { + #[inline] + pub fn add_data(&mut self, data: flatbuffers::WIPOffset>>>) { + self.fbb_.push_slot_always::>(OnceRewardTemplateTb::VT_DATA, data); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> OnceRewardTemplateTbBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + OnceRewardTemplateTbBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for OnceRewardTemplateTb<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("OnceRewardTemplateTb"); + ds.field("data", &self.data()); + ds.finish() + } +} diff --git a/lib/config/gen_flatbuffers/post_girl_config_template_generated.rs b/lib/config/gen_flatbuffers/post_girl_config_template_generated.rs new file mode 100644 index 0000000..1b6ced1 --- /dev/null +++ b/lib/config/gen_flatbuffers/post_girl_config_template_generated.rs @@ -0,0 +1,341 @@ +// automatically generated by the FlatBuffers compiler, do not modify + + +// @generated + +use core::mem; +use core::cmp::Ordering; + +extern crate flatbuffers; +use self::flatbuffers::{EndianScalar, Follow}; + +pub enum PostGirlConfigTemplateOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct PostGirlConfigTemplate<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for PostGirlConfigTemplate<'a> { + type Inner = PostGirlConfigTemplate<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> PostGirlConfigTemplate<'a> { + pub const VT_ID: flatbuffers::VOffsetT = 4; + pub const VT_NAME: flatbuffers::VOffsetT = 6; + pub const VT_TAG: flatbuffers::VOffsetT = 8; + pub const VT_UNK_1: flatbuffers::VOffsetT = 10; + pub const VT_UNK_2: flatbuffers::VOffsetT = 12; + pub const VT_UNK_3: flatbuffers::VOffsetT = 14; + pub const VT_ROLE_ICON_NAME: flatbuffers::VOffsetT = 16; + pub const VT_UNK_4: flatbuffers::VOffsetT = 18; + pub const VT_UNK_5: flatbuffers::VOffsetT = 20; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + PostGirlConfigTemplate { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args PostGirlConfigTemplateArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = PostGirlConfigTemplateBuilder::new(_fbb); + if let Some(x) = args.unk_5 { builder.add_unk_5(x); } + if let Some(x) = args.unk_4 { builder.add_unk_4(x); } + if let Some(x) = args.role_icon_name { builder.add_role_icon_name(x); } + builder.add_unk_3(args.unk_3); + if let Some(x) = args.unk_2 { builder.add_unk_2(x); } + builder.add_unk_1(args.unk_1); + if let Some(x) = args.tag { builder.add_tag(x); } + if let Some(x) = args.name { builder.add_name(x); } + builder.add_id(args.id); + builder.finish() + } + + + #[inline] + pub fn id(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(PostGirlConfigTemplate::VT_ID, Some(0)).unwrap()} + } + #[inline] + pub fn name(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(PostGirlConfigTemplate::VT_NAME, None)} + } + #[inline] + pub fn tag(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(PostGirlConfigTemplate::VT_TAG, None)} + } + #[inline] + pub fn unk_1(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(PostGirlConfigTemplate::VT_UNK_1, Some(0)).unwrap()} + } + #[inline] + pub fn unk_2(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(PostGirlConfigTemplate::VT_UNK_2, None)} + } + #[inline] + pub fn unk_3(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(PostGirlConfigTemplate::VT_UNK_3, Some(0)).unwrap()} + } + #[inline] + pub fn role_icon_name(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(PostGirlConfigTemplate::VT_ROLE_ICON_NAME, None)} + } + #[inline] + pub fn unk_4(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(PostGirlConfigTemplate::VT_UNK_4, None)} + } + #[inline] + pub fn unk_5(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(PostGirlConfigTemplate::VT_UNK_5, None)} + } +} + +impl flatbuffers::Verifiable for PostGirlConfigTemplate<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::("id", Self::VT_ID, false)? + .visit_field::>("name", Self::VT_NAME, false)? + .visit_field::>("tag", Self::VT_TAG, false)? + .visit_field::("unk_1", Self::VT_UNK_1, false)? + .visit_field::>("unk_2", Self::VT_UNK_2, false)? + .visit_field::("unk_3", Self::VT_UNK_3, false)? + .visit_field::>("role_icon_name", Self::VT_ROLE_ICON_NAME, false)? + .visit_field::>("unk_4", Self::VT_UNK_4, false)? + .visit_field::>>("unk_5", Self::VT_UNK_5, false)? + .finish(); + Ok(()) + } +} +pub struct PostGirlConfigTemplateArgs<'a> { + pub id: u32, + pub name: Option>, + pub tag: Option>, + pub unk_1: i32, + pub unk_2: Option>, + pub unk_3: i32, + pub role_icon_name: Option>, + pub unk_4: Option>, + pub unk_5: Option>>, +} +impl<'a> Default for PostGirlConfigTemplateArgs<'a> { + #[inline] + fn default() -> Self { + PostGirlConfigTemplateArgs { + id: 0, + name: None, + tag: None, + unk_1: 0, + unk_2: None, + unk_3: 0, + role_icon_name: None, + unk_4: None, + unk_5: None, + } + } +} + +pub struct PostGirlConfigTemplateBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> PostGirlConfigTemplateBuilder<'a, 'b, A> { + #[inline] + pub fn add_id(&mut self, id: u32) { + self.fbb_.push_slot::(PostGirlConfigTemplate::VT_ID, id, 0); + } + #[inline] + pub fn add_name(&mut self, name: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(PostGirlConfigTemplate::VT_NAME, name); + } + #[inline] + pub fn add_tag(&mut self, tag: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(PostGirlConfigTemplate::VT_TAG, tag); + } + #[inline] + pub fn add_unk_1(&mut self, unk_1: i32) { + self.fbb_.push_slot::(PostGirlConfigTemplate::VT_UNK_1, unk_1, 0); + } + #[inline] + pub fn add_unk_2(&mut self, unk_2: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(PostGirlConfigTemplate::VT_UNK_2, unk_2); + } + #[inline] + pub fn add_unk_3(&mut self, unk_3: i32) { + self.fbb_.push_slot::(PostGirlConfigTemplate::VT_UNK_3, unk_3, 0); + } + #[inline] + pub fn add_role_icon_name(&mut self, role_icon_name: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(PostGirlConfigTemplate::VT_ROLE_ICON_NAME, role_icon_name); + } + #[inline] + pub fn add_unk_4(&mut self, unk_4: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(PostGirlConfigTemplate::VT_UNK_4, unk_4); + } + #[inline] + pub fn add_unk_5(&mut self, unk_5: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(PostGirlConfigTemplate::VT_UNK_5, unk_5); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> PostGirlConfigTemplateBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + PostGirlConfigTemplateBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for PostGirlConfigTemplate<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("PostGirlConfigTemplate"); + ds.field("id", &self.id()); + ds.field("name", &self.name()); + ds.field("tag", &self.tag()); + ds.field("unk_1", &self.unk_1()); + ds.field("unk_2", &self.unk_2()); + ds.field("unk_3", &self.unk_3()); + ds.field("role_icon_name", &self.role_icon_name()); + ds.field("unk_4", &self.unk_4()); + ds.field("unk_5", &self.unk_5()); + ds.finish() + } +} +pub enum PostGirlConfigTemplateTbOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct PostGirlConfigTemplateTb<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for PostGirlConfigTemplateTb<'a> { + type Inner = PostGirlConfigTemplateTb<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> PostGirlConfigTemplateTb<'a> { + pub const VT_DATA: flatbuffers::VOffsetT = 4; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + PostGirlConfigTemplateTb { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args PostGirlConfigTemplateTbArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = PostGirlConfigTemplateTbBuilder::new(_fbb); + if let Some(x) = args.data { builder.add_data(x); } + builder.finish() + } + + + #[inline] + pub fn data(&self) -> Option>>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(PostGirlConfigTemplateTb::VT_DATA, None)} + } +} + +impl flatbuffers::Verifiable for PostGirlConfigTemplateTb<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::>>>("data", Self::VT_DATA, false)? + .finish(); + Ok(()) + } +} +pub struct PostGirlConfigTemplateTbArgs<'a> { + pub data: Option>>>>, +} +impl<'a> Default for PostGirlConfigTemplateTbArgs<'a> { + #[inline] + fn default() -> Self { + PostGirlConfigTemplateTbArgs { + data: None, + } + } +} + +pub struct PostGirlConfigTemplateTbBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> PostGirlConfigTemplateTbBuilder<'a, 'b, A> { + #[inline] + pub fn add_data(&mut self, data: flatbuffers::WIPOffset>>>) { + self.fbb_.push_slot_always::>(PostGirlConfigTemplateTb::VT_DATA, data); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> PostGirlConfigTemplateTbBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + PostGirlConfigTemplateTbBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for PostGirlConfigTemplateTb<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("PostGirlConfigTemplateTb"); + ds.field("data", &self.data()); + ds.finish() + } +} diff --git a/lib/config/gen_flatbuffers/quest_config_template_generated.rs b/lib/config/gen_flatbuffers/quest_config_template_generated.rs new file mode 100644 index 0000000..62cdc7f --- /dev/null +++ b/lib/config/gen_flatbuffers/quest_config_template_generated.rs @@ -0,0 +1,596 @@ +// automatically generated by the FlatBuffers compiler, do not modify + + +// @generated + +use core::mem; +use core::cmp::Ordering; + +extern crate flatbuffers; +use self::flatbuffers::{EndianScalar, Follow}; + +pub enum QuestConfigTemplateOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct QuestConfigTemplate<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for QuestConfigTemplate<'a> { + type Inner = QuestConfigTemplate<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> QuestConfigTemplate<'a> { + pub const VT_QUEST_ID: flatbuffers::VOffsetT = 4; + pub const VT_QUEST_NAME: flatbuffers::VOffsetT = 6; + pub const VT_QUEST_TYPE: flatbuffers::VOffsetT = 8; + pub const VT_DESC: flatbuffers::VOffsetT = 10; + pub const VT_TARGET_DESC: flatbuffers::VOffsetT = 12; + pub const VT_QUEST_DESC: flatbuffers::VOffsetT = 14; + pub const VT_ICON: flatbuffers::VOffsetT = 16; + pub const VT_AUTO_FINISH: flatbuffers::VOffsetT = 18; + pub const VT_SUB_QUESTS: flatbuffers::VOffsetT = 20; + pub const VT_UNK_0: flatbuffers::VOffsetT = 22; + pub const VT_UNK_1: flatbuffers::VOffsetT = 24; + pub const VT_UNLOCK_CONDITION: flatbuffers::VOffsetT = 26; + pub const VT_FINISH_CONDITION: flatbuffers::VOffsetT = 28; + pub const VT_REWARD_ID: flatbuffers::VOffsetT = 30; + pub const VT_UNK_3: flatbuffers::VOffsetT = 32; + pub const VT_UNK_4: flatbuffers::VOffsetT = 34; + pub const VT_UNK_5: flatbuffers::VOffsetT = 36; + pub const VT_UNK_6: flatbuffers::VOffsetT = 38; + pub const VT_UNK_7: flatbuffers::VOffsetT = 40; + pub const VT_UNK_8: flatbuffers::VOffsetT = 42; + pub const VT_UNK_9: flatbuffers::VOffsetT = 44; + pub const VT_UNK_10: flatbuffers::VOffsetT = 46; + pub const VT_UNK_11: flatbuffers::VOffsetT = 48; + pub const VT_PREORDER_QUEST_IDS: flatbuffers::VOffsetT = 50; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + QuestConfigTemplate { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args QuestConfigTemplateArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = QuestConfigTemplateBuilder::new(_fbb); + if let Some(x) = args.preorder_quest_ids { builder.add_preorder_quest_ids(x); } + builder.add_unk_11(args.unk_11); + builder.add_unk_10(args.unk_10); + if let Some(x) = args.unk_9 { builder.add_unk_9(x); } + if let Some(x) = args.unk_8 { builder.add_unk_8(x); } + if let Some(x) = args.unk_7 { builder.add_unk_7(x); } + if let Some(x) = args.unk_6 { builder.add_unk_6(x); } + if let Some(x) = args.unk_5 { builder.add_unk_5(x); } + builder.add_unk_4(args.unk_4); + builder.add_unk_3(args.unk_3); + builder.add_reward_id(args.reward_id); + if let Some(x) = args.finish_condition { builder.add_finish_condition(x); } + if let Some(x) = args.unlock_condition { builder.add_unlock_condition(x); } + builder.add_unk_1(args.unk_1); + if let Some(x) = args.unk_0 { builder.add_unk_0(x); } + if let Some(x) = args.sub_quests { builder.add_sub_quests(x); } + if let Some(x) = args.icon { builder.add_icon(x); } + if let Some(x) = args.quest_desc { builder.add_quest_desc(x); } + if let Some(x) = args.target_desc { builder.add_target_desc(x); } + if let Some(x) = args.desc { builder.add_desc(x); } + builder.add_quest_type(args.quest_type); + if let Some(x) = args.quest_name { builder.add_quest_name(x); } + builder.add_quest_id(args.quest_id); + builder.add_auto_finish(args.auto_finish); + builder.finish() + } + + + #[inline] + pub fn quest_id(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(QuestConfigTemplate::VT_QUEST_ID, Some(0)).unwrap()} + } + #[inline] + pub fn quest_name(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(QuestConfigTemplate::VT_QUEST_NAME, None)} + } + #[inline] + pub fn quest_type(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(QuestConfigTemplate::VT_QUEST_TYPE, Some(0)).unwrap()} + } + #[inline] + pub fn desc(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(QuestConfigTemplate::VT_DESC, None)} + } + #[inline] + pub fn target_desc(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(QuestConfigTemplate::VT_TARGET_DESC, None)} + } + #[inline] + pub fn quest_desc(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(QuestConfigTemplate::VT_QUEST_DESC, None)} + } + #[inline] + pub fn icon(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(QuestConfigTemplate::VT_ICON, None)} + } + #[inline] + pub fn auto_finish(&self) -> bool { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(QuestConfigTemplate::VT_AUTO_FINISH, Some(false)).unwrap()} + } + #[inline] + pub fn sub_quests(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(QuestConfigTemplate::VT_SUB_QUESTS, None)} + } + #[inline] + pub fn unk_0(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(QuestConfigTemplate::VT_UNK_0, None)} + } + #[inline] + pub fn unk_1(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(QuestConfigTemplate::VT_UNK_1, Some(0)).unwrap()} + } + #[inline] + pub fn unlock_condition(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(QuestConfigTemplate::VT_UNLOCK_CONDITION, None)} + } + #[inline] + pub fn finish_condition(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(QuestConfigTemplate::VT_FINISH_CONDITION, None)} + } + #[inline] + pub fn reward_id(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(QuestConfigTemplate::VT_REWARD_ID, Some(0)).unwrap()} + } + #[inline] + pub fn unk_3(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(QuestConfigTemplate::VT_UNK_3, Some(0)).unwrap()} + } + #[inline] + pub fn unk_4(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(QuestConfigTemplate::VT_UNK_4, Some(0)).unwrap()} + } + #[inline] + pub fn unk_5(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(QuestConfigTemplate::VT_UNK_5, None)} + } + #[inline] + pub fn unk_6(&self) -> Option>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(QuestConfigTemplate::VT_UNK_6, None)} + } + #[inline] + pub fn unk_7(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(QuestConfigTemplate::VT_UNK_7, None)} + } + #[inline] + pub fn unk_8(&self) -> Option>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(QuestConfigTemplate::VT_UNK_8, None)} + } + #[inline] + pub fn unk_9(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(QuestConfigTemplate::VT_UNK_9, None)} + } + #[inline] + pub fn unk_10(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(QuestConfigTemplate::VT_UNK_10, Some(0)).unwrap()} + } + #[inline] + pub fn unk_11(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(QuestConfigTemplate::VT_UNK_11, Some(0)).unwrap()} + } + #[inline] + pub fn preorder_quest_ids(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(QuestConfigTemplate::VT_PREORDER_QUEST_IDS, None)} + } +} + +impl flatbuffers::Verifiable for QuestConfigTemplate<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::("quest_id", Self::VT_QUEST_ID, false)? + .visit_field::>("quest_name", Self::VT_QUEST_NAME, false)? + .visit_field::("quest_type", Self::VT_QUEST_TYPE, false)? + .visit_field::>("desc", Self::VT_DESC, false)? + .visit_field::>("target_desc", Self::VT_TARGET_DESC, false)? + .visit_field::>("quest_desc", Self::VT_QUEST_DESC, false)? + .visit_field::>("icon", Self::VT_ICON, false)? + .visit_field::("auto_finish", Self::VT_AUTO_FINISH, false)? + .visit_field::>>("sub_quests", Self::VT_SUB_QUESTS, false)? + .visit_field::>>("unk_0", Self::VT_UNK_0, false)? + .visit_field::("unk_1", Self::VT_UNK_1, false)? + .visit_field::>("unlock_condition", Self::VT_UNLOCK_CONDITION, false)? + .visit_field::>("finish_condition", Self::VT_FINISH_CONDITION, false)? + .visit_field::("reward_id", Self::VT_REWARD_ID, false)? + .visit_field::("unk_3", Self::VT_UNK_3, false)? + .visit_field::("unk_4", Self::VT_UNK_4, false)? + .visit_field::>("unk_5", Self::VT_UNK_5, false)? + .visit_field::>>>("unk_6", Self::VT_UNK_6, false)? + .visit_field::>("unk_7", Self::VT_UNK_7, false)? + .visit_field::>>>("unk_8", Self::VT_UNK_8, false)? + .visit_field::>>("unk_9", Self::VT_UNK_9, false)? + .visit_field::("unk_10", Self::VT_UNK_10, false)? + .visit_field::("unk_11", Self::VT_UNK_11, false)? + .visit_field::>>("preorder_quest_ids", Self::VT_PREORDER_QUEST_IDS, false)? + .finish(); + Ok(()) + } +} +pub struct QuestConfigTemplateArgs<'a> { + pub quest_id: u32, + pub quest_name: Option>, + pub quest_type: i32, + pub desc: Option>, + pub target_desc: Option>, + pub quest_desc: Option>, + pub icon: Option>, + pub auto_finish: bool, + pub sub_quests: Option>>, + pub unk_0: Option>>, + pub unk_1: i32, + pub unlock_condition: Option>, + pub finish_condition: Option>, + pub reward_id: u32, + pub unk_3: i32, + pub unk_4: i32, + pub unk_5: Option>, + pub unk_6: Option>>>, + pub unk_7: Option>, + pub unk_8: Option>>>, + pub unk_9: Option>>, + pub unk_10: i32, + pub unk_11: i32, + pub preorder_quest_ids: Option>>, +} +impl<'a> Default for QuestConfigTemplateArgs<'a> { + #[inline] + fn default() -> Self { + QuestConfigTemplateArgs { + quest_id: 0, + quest_name: None, + quest_type: 0, + desc: None, + target_desc: None, + quest_desc: None, + icon: None, + auto_finish: false, + sub_quests: None, + unk_0: None, + unk_1: 0, + unlock_condition: None, + finish_condition: None, + reward_id: 0, + unk_3: 0, + unk_4: 0, + unk_5: None, + unk_6: None, + unk_7: None, + unk_8: None, + unk_9: None, + unk_10: 0, + unk_11: 0, + preorder_quest_ids: None, + } + } +} + +pub struct QuestConfigTemplateBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> QuestConfigTemplateBuilder<'a, 'b, A> { + #[inline] + pub fn add_quest_id(&mut self, quest_id: u32) { + self.fbb_.push_slot::(QuestConfigTemplate::VT_QUEST_ID, quest_id, 0); + } + #[inline] + pub fn add_quest_name(&mut self, quest_name: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(QuestConfigTemplate::VT_QUEST_NAME, quest_name); + } + #[inline] + pub fn add_quest_type(&mut self, quest_type: i32) { + self.fbb_.push_slot::(QuestConfigTemplate::VT_QUEST_TYPE, quest_type, 0); + } + #[inline] + pub fn add_desc(&mut self, desc: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(QuestConfigTemplate::VT_DESC, desc); + } + #[inline] + pub fn add_target_desc(&mut self, target_desc: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(QuestConfigTemplate::VT_TARGET_DESC, target_desc); + } + #[inline] + pub fn add_quest_desc(&mut self, quest_desc: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(QuestConfigTemplate::VT_QUEST_DESC, quest_desc); + } + #[inline] + pub fn add_icon(&mut self, icon: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(QuestConfigTemplate::VT_ICON, icon); + } + #[inline] + pub fn add_auto_finish(&mut self, auto_finish: bool) { + self.fbb_.push_slot::(QuestConfigTemplate::VT_AUTO_FINISH, auto_finish, false); + } + #[inline] + pub fn add_sub_quests(&mut self, sub_quests: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(QuestConfigTemplate::VT_SUB_QUESTS, sub_quests); + } + #[inline] + pub fn add_unk_0(&mut self, unk_0: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(QuestConfigTemplate::VT_UNK_0, unk_0); + } + #[inline] + pub fn add_unk_1(&mut self, unk_1: i32) { + self.fbb_.push_slot::(QuestConfigTemplate::VT_UNK_1, unk_1, 0); + } + #[inline] + pub fn add_unlock_condition(&mut self, unlock_condition: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(QuestConfigTemplate::VT_UNLOCK_CONDITION, unlock_condition); + } + #[inline] + pub fn add_finish_condition(&mut self, finish_condition: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(QuestConfigTemplate::VT_FINISH_CONDITION, finish_condition); + } + #[inline] + pub fn add_reward_id(&mut self, reward_id: u32) { + self.fbb_.push_slot::(QuestConfigTemplate::VT_REWARD_ID, reward_id, 0); + } + #[inline] + pub fn add_unk_3(&mut self, unk_3: i32) { + self.fbb_.push_slot::(QuestConfigTemplate::VT_UNK_3, unk_3, 0); + } + #[inline] + pub fn add_unk_4(&mut self, unk_4: i32) { + self.fbb_.push_slot::(QuestConfigTemplate::VT_UNK_4, unk_4, 0); + } + #[inline] + pub fn add_unk_5(&mut self, unk_5: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(QuestConfigTemplate::VT_UNK_5, unk_5); + } + #[inline] + pub fn add_unk_6(&mut self, unk_6: flatbuffers::WIPOffset>>) { + self.fbb_.push_slot_always::>(QuestConfigTemplate::VT_UNK_6, unk_6); + } + #[inline] + pub fn add_unk_7(&mut self, unk_7: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(QuestConfigTemplate::VT_UNK_7, unk_7); + } + #[inline] + pub fn add_unk_8(&mut self, unk_8: flatbuffers::WIPOffset>>) { + self.fbb_.push_slot_always::>(QuestConfigTemplate::VT_UNK_8, unk_8); + } + #[inline] + pub fn add_unk_9(&mut self, unk_9: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(QuestConfigTemplate::VT_UNK_9, unk_9); + } + #[inline] + pub fn add_unk_10(&mut self, unk_10: i32) { + self.fbb_.push_slot::(QuestConfigTemplate::VT_UNK_10, unk_10, 0); + } + #[inline] + pub fn add_unk_11(&mut self, unk_11: i32) { + self.fbb_.push_slot::(QuestConfigTemplate::VT_UNK_11, unk_11, 0); + } + #[inline] + pub fn add_preorder_quest_ids(&mut self, preorder_quest_ids: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(QuestConfigTemplate::VT_PREORDER_QUEST_IDS, preorder_quest_ids); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> QuestConfigTemplateBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + QuestConfigTemplateBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for QuestConfigTemplate<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("QuestConfigTemplate"); + ds.field("quest_id", &self.quest_id()); + ds.field("quest_name", &self.quest_name()); + ds.field("quest_type", &self.quest_type()); + ds.field("desc", &self.desc()); + ds.field("target_desc", &self.target_desc()); + ds.field("quest_desc", &self.quest_desc()); + ds.field("icon", &self.icon()); + ds.field("auto_finish", &self.auto_finish()); + ds.field("sub_quests", &self.sub_quests()); + ds.field("unk_0", &self.unk_0()); + ds.field("unk_1", &self.unk_1()); + ds.field("unlock_condition", &self.unlock_condition()); + ds.field("finish_condition", &self.finish_condition()); + ds.field("reward_id", &self.reward_id()); + ds.field("unk_3", &self.unk_3()); + ds.field("unk_4", &self.unk_4()); + ds.field("unk_5", &self.unk_5()); + ds.field("unk_6", &self.unk_6()); + ds.field("unk_7", &self.unk_7()); + ds.field("unk_8", &self.unk_8()); + ds.field("unk_9", &self.unk_9()); + ds.field("unk_10", &self.unk_10()); + ds.field("unk_11", &self.unk_11()); + ds.field("preorder_quest_ids", &self.preorder_quest_ids()); + ds.finish() + } +} +pub enum QuestConfigTemplateTbOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct QuestConfigTemplateTb<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for QuestConfigTemplateTb<'a> { + type Inner = QuestConfigTemplateTb<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> QuestConfigTemplateTb<'a> { + pub const VT_DATA: flatbuffers::VOffsetT = 4; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + QuestConfigTemplateTb { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args QuestConfigTemplateTbArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = QuestConfigTemplateTbBuilder::new(_fbb); + if let Some(x) = args.data { builder.add_data(x); } + builder.finish() + } + + + #[inline] + pub fn data(&self) -> Option>>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(QuestConfigTemplateTb::VT_DATA, None)} + } +} + +impl flatbuffers::Verifiable for QuestConfigTemplateTb<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::>>>("data", Self::VT_DATA, false)? + .finish(); + Ok(()) + } +} +pub struct QuestConfigTemplateTbArgs<'a> { + pub data: Option>>>>, +} +impl<'a> Default for QuestConfigTemplateTbArgs<'a> { + #[inline] + fn default() -> Self { + QuestConfigTemplateTbArgs { + data: None, + } + } +} + +pub struct QuestConfigTemplateTbBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> QuestConfigTemplateTbBuilder<'a, 'b, A> { + #[inline] + pub fn add_data(&mut self, data: flatbuffers::WIPOffset>>>) { + self.fbb_.push_slot_always::>(QuestConfigTemplateTb::VT_DATA, data); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> QuestConfigTemplateTbBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + QuestConfigTemplateTbBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for QuestConfigTemplateTb<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("QuestConfigTemplateTb"); + ds.field("data", &self.data()); + ds.finish() + } +} diff --git a/lib/config/gen_flatbuffers/section_config_template_generated.rs b/lib/config/gen_flatbuffers/section_config_template_generated.rs new file mode 100644 index 0000000..ef0cff8 --- /dev/null +++ b/lib/config/gen_flatbuffers/section_config_template_generated.rs @@ -0,0 +1,307 @@ +// automatically generated by the FlatBuffers compiler, do not modify + + +// @generated + +use core::mem; +use core::cmp::Ordering; + +extern crate flatbuffers; +use self::flatbuffers::{EndianScalar, Follow}; + +pub enum SectionConfigTemplateOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct SectionConfigTemplate<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for SectionConfigTemplate<'a> { + type Inner = SectionConfigTemplate<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> SectionConfigTemplate<'a> { + pub const VT_SECTION_ID: flatbuffers::VOffsetT = 4; + pub const VT_SECTION_PHOTO: flatbuffers::VOffsetT = 6; + pub const VT_NAME: flatbuffers::VOffsetT = 8; + pub const VT_BORN_TRANSFORM: flatbuffers::VOffsetT = 10; + pub const VT_ALTERNATIVE_BORN_TRANSFORM: flatbuffers::VOffsetT = 12; + pub const VT_UNK_3: flatbuffers::VOffsetT = 14; + pub const VT_SECTION_NAME: flatbuffers::VOffsetT = 16; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + SectionConfigTemplate { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args SectionConfigTemplateArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = SectionConfigTemplateBuilder::new(_fbb); + if let Some(x) = args.section_name { builder.add_section_name(x); } + builder.add_unk_3(args.unk_3); + if let Some(x) = args.alternative_born_transform { builder.add_alternative_born_transform(x); } + if let Some(x) = args.born_transform { builder.add_born_transform(x); } + if let Some(x) = args.name { builder.add_name(x); } + if let Some(x) = args.section_photo { builder.add_section_photo(x); } + builder.add_section_id(args.section_id); + builder.finish() + } + + + #[inline] + pub fn section_id(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(SectionConfigTemplate::VT_SECTION_ID, Some(0)).unwrap()} + } + #[inline] + pub fn section_photo(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(SectionConfigTemplate::VT_SECTION_PHOTO, None)} + } + #[inline] + pub fn name(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(SectionConfigTemplate::VT_NAME, None)} + } + #[inline] + pub fn born_transform(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(SectionConfigTemplate::VT_BORN_TRANSFORM, None)} + } + #[inline] + pub fn alternative_born_transform(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(SectionConfigTemplate::VT_ALTERNATIVE_BORN_TRANSFORM, None)} + } + #[inline] + pub fn unk_3(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(SectionConfigTemplate::VT_UNK_3, Some(0)).unwrap()} + } + #[inline] + pub fn section_name(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(SectionConfigTemplate::VT_SECTION_NAME, None)} + } +} + +impl flatbuffers::Verifiable for SectionConfigTemplate<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::("section_id", Self::VT_SECTION_ID, false)? + .visit_field::>("section_photo", Self::VT_SECTION_PHOTO, false)? + .visit_field::>("name", Self::VT_NAME, false)? + .visit_field::>("born_transform", Self::VT_BORN_TRANSFORM, false)? + .visit_field::>("alternative_born_transform", Self::VT_ALTERNATIVE_BORN_TRANSFORM, false)? + .visit_field::("unk_3", Self::VT_UNK_3, false)? + .visit_field::>("section_name", Self::VT_SECTION_NAME, false)? + .finish(); + Ok(()) + } +} +pub struct SectionConfigTemplateArgs<'a> { + pub section_id: u32, + pub section_photo: Option>, + pub name: Option>, + pub born_transform: Option>, + pub alternative_born_transform: Option>, + pub unk_3: i32, + pub section_name: Option>, +} +impl<'a> Default for SectionConfigTemplateArgs<'a> { + #[inline] + fn default() -> Self { + SectionConfigTemplateArgs { + section_id: 0, + section_photo: None, + name: None, + born_transform: None, + alternative_born_transform: None, + unk_3: 0, + section_name: None, + } + } +} + +pub struct SectionConfigTemplateBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> SectionConfigTemplateBuilder<'a, 'b, A> { + #[inline] + pub fn add_section_id(&mut self, section_id: u32) { + self.fbb_.push_slot::(SectionConfigTemplate::VT_SECTION_ID, section_id, 0); + } + #[inline] + pub fn add_section_photo(&mut self, section_photo: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(SectionConfigTemplate::VT_SECTION_PHOTO, section_photo); + } + #[inline] + pub fn add_name(&mut self, name: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(SectionConfigTemplate::VT_NAME, name); + } + #[inline] + pub fn add_born_transform(&mut self, born_transform: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(SectionConfigTemplate::VT_BORN_TRANSFORM, born_transform); + } + #[inline] + pub fn add_alternative_born_transform(&mut self, alternative_born_transform: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(SectionConfigTemplate::VT_ALTERNATIVE_BORN_TRANSFORM, alternative_born_transform); + } + #[inline] + pub fn add_unk_3(&mut self, unk_3: i32) { + self.fbb_.push_slot::(SectionConfigTemplate::VT_UNK_3, unk_3, 0); + } + #[inline] + pub fn add_section_name(&mut self, section_name: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(SectionConfigTemplate::VT_SECTION_NAME, section_name); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> SectionConfigTemplateBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + SectionConfigTemplateBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for SectionConfigTemplate<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("SectionConfigTemplate"); + ds.field("section_id", &self.section_id()); + ds.field("section_photo", &self.section_photo()); + ds.field("name", &self.name()); + ds.field("born_transform", &self.born_transform()); + ds.field("alternative_born_transform", &self.alternative_born_transform()); + ds.field("unk_3", &self.unk_3()); + ds.field("section_name", &self.section_name()); + ds.finish() + } +} +pub enum SectionConfigTemplateTbOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct SectionConfigTemplateTb<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for SectionConfigTemplateTb<'a> { + type Inner = SectionConfigTemplateTb<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> SectionConfigTemplateTb<'a> { + pub const VT_DATA: flatbuffers::VOffsetT = 4; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + SectionConfigTemplateTb { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args SectionConfigTemplateTbArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = SectionConfigTemplateTbBuilder::new(_fbb); + if let Some(x) = args.data { builder.add_data(x); } + builder.finish() + } + + + #[inline] + pub fn data(&self) -> Option>>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(SectionConfigTemplateTb::VT_DATA, None)} + } +} + +impl flatbuffers::Verifiable for SectionConfigTemplateTb<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::>>>("data", Self::VT_DATA, false)? + .finish(); + Ok(()) + } +} +pub struct SectionConfigTemplateTbArgs<'a> { + pub data: Option>>>>, +} +impl<'a> Default for SectionConfigTemplateTbArgs<'a> { + #[inline] + fn default() -> Self { + SectionConfigTemplateTbArgs { + data: None, + } + } +} + +pub struct SectionConfigTemplateTbBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> SectionConfigTemplateTbBuilder<'a, 'b, A> { + #[inline] + pub fn add_data(&mut self, data: flatbuffers::WIPOffset>>>) { + self.fbb_.push_slot_always::>(SectionConfigTemplateTb::VT_DATA, data); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> SectionConfigTemplateTbBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + SectionConfigTemplateTbBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for SectionConfigTemplateTb<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("SectionConfigTemplateTb"); + ds.field("data", &self.data()); + ds.finish() + } +} diff --git a/lib/config/gen_flatbuffers/traning_quest_template_generated.rs b/lib/config/gen_flatbuffers/traning_quest_template_generated.rs new file mode 100644 index 0000000..a17de13 --- /dev/null +++ b/lib/config/gen_flatbuffers/traning_quest_template_generated.rs @@ -0,0 +1,392 @@ +// automatically generated by the FlatBuffers compiler, do not modify + + +// @generated + +use core::mem; +use core::cmp::Ordering; + +extern crate flatbuffers; +use self::flatbuffers::{EndianScalar, Follow}; + +pub enum TraningQuestTemplateOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct TraningQuestTemplate<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for TraningQuestTemplate<'a> { + type Inner = TraningQuestTemplate<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> TraningQuestTemplate<'a> { + pub const VT_ID: flatbuffers::VOffsetT = 4; + pub const VT_TRAINING_TYPE: flatbuffers::VOffsetT = 6; + pub const VT_BATTLE_EVENT_ID: flatbuffers::VOffsetT = 8; + pub const VT_SPECIAL_TRAINING_NAME: flatbuffers::VOffsetT = 10; + pub const VT_SPECIAL_TRAINING_ID: flatbuffers::VOffsetT = 12; + pub const VT_UNK_1: flatbuffers::VOffsetT = 14; + pub const VT_UNK_2: flatbuffers::VOffsetT = 16; + pub const VT_UNK_3: flatbuffers::VOffsetT = 18; + pub const VT_UNK_4: flatbuffers::VOffsetT = 20; + pub const VT_UNK_5: flatbuffers::VOffsetT = 22; + pub const VT_UNK_6: flatbuffers::VOffsetT = 24; + pub const VT_UNK_7: flatbuffers::VOffsetT = 26; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + TraningQuestTemplate { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args TraningQuestTemplateArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = TraningQuestTemplateBuilder::new(_fbb); + if let Some(x) = args.unk_7 { builder.add_unk_7(x); } + if let Some(x) = args.unk_6 { builder.add_unk_6(x); } + builder.add_unk_3(args.unk_3); + builder.add_unk_2(args.unk_2); + builder.add_unk_1(args.unk_1); + builder.add_special_training_id(args.special_training_id); + if let Some(x) = args.special_training_name { builder.add_special_training_name(x); } + builder.add_battle_event_id(args.battle_event_id); + builder.add_training_type(args.training_type); + builder.add_id(args.id); + builder.add_unk_5(args.unk_5); + builder.add_unk_4(args.unk_4); + builder.finish() + } + + + #[inline] + pub fn id(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(TraningQuestTemplate::VT_ID, Some(0)).unwrap()} + } + #[inline] + pub fn training_type(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(TraningQuestTemplate::VT_TRAINING_TYPE, Some(0)).unwrap()} + } + #[inline] + pub fn battle_event_id(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(TraningQuestTemplate::VT_BATTLE_EVENT_ID, Some(0)).unwrap()} + } + #[inline] + pub fn special_training_name(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(TraningQuestTemplate::VT_SPECIAL_TRAINING_NAME, None)} + } + #[inline] + pub fn special_training_id(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(TraningQuestTemplate::VT_SPECIAL_TRAINING_ID, Some(0)).unwrap()} + } + #[inline] + pub fn unk_1(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(TraningQuestTemplate::VT_UNK_1, Some(0)).unwrap()} + } + #[inline] + pub fn unk_2(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(TraningQuestTemplate::VT_UNK_2, Some(0)).unwrap()} + } + #[inline] + pub fn unk_3(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(TraningQuestTemplate::VT_UNK_3, Some(0)).unwrap()} + } + #[inline] + pub fn unk_4(&self) -> bool { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(TraningQuestTemplate::VT_UNK_4, Some(false)).unwrap()} + } + #[inline] + pub fn unk_5(&self) -> bool { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(TraningQuestTemplate::VT_UNK_5, Some(false)).unwrap()} + } + #[inline] + pub fn unk_6(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(TraningQuestTemplate::VT_UNK_6, None)} + } + #[inline] + pub fn unk_7(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(TraningQuestTemplate::VT_UNK_7, None)} + } +} + +impl flatbuffers::Verifiable for TraningQuestTemplate<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::("id", Self::VT_ID, false)? + .visit_field::("training_type", Self::VT_TRAINING_TYPE, false)? + .visit_field::("battle_event_id", Self::VT_BATTLE_EVENT_ID, false)? + .visit_field::>("special_training_name", Self::VT_SPECIAL_TRAINING_NAME, false)? + .visit_field::("special_training_id", Self::VT_SPECIAL_TRAINING_ID, false)? + .visit_field::("unk_1", Self::VT_UNK_1, false)? + .visit_field::("unk_2", Self::VT_UNK_2, false)? + .visit_field::("unk_3", Self::VT_UNK_3, false)? + .visit_field::("unk_4", Self::VT_UNK_4, false)? + .visit_field::("unk_5", Self::VT_UNK_5, false)? + .visit_field::>("unk_6", Self::VT_UNK_6, false)? + .visit_field::>("unk_7", Self::VT_UNK_7, false)? + .finish(); + Ok(()) + } +} +pub struct TraningQuestTemplateArgs<'a> { + pub id: u32, + pub training_type: i32, + pub battle_event_id: u32, + pub special_training_name: Option>, + pub special_training_id: i32, + pub unk_1: i32, + pub unk_2: i32, + pub unk_3: i32, + pub unk_4: bool, + pub unk_5: bool, + pub unk_6: Option>, + pub unk_7: Option>, +} +impl<'a> Default for TraningQuestTemplateArgs<'a> { + #[inline] + fn default() -> Self { + TraningQuestTemplateArgs { + id: 0, + training_type: 0, + battle_event_id: 0, + special_training_name: None, + special_training_id: 0, + unk_1: 0, + unk_2: 0, + unk_3: 0, + unk_4: false, + unk_5: false, + unk_6: None, + unk_7: None, + } + } +} + +pub struct TraningQuestTemplateBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> TraningQuestTemplateBuilder<'a, 'b, A> { + #[inline] + pub fn add_id(&mut self, id: u32) { + self.fbb_.push_slot::(TraningQuestTemplate::VT_ID, id, 0); + } + #[inline] + pub fn add_training_type(&mut self, training_type: i32) { + self.fbb_.push_slot::(TraningQuestTemplate::VT_TRAINING_TYPE, training_type, 0); + } + #[inline] + pub fn add_battle_event_id(&mut self, battle_event_id: u32) { + self.fbb_.push_slot::(TraningQuestTemplate::VT_BATTLE_EVENT_ID, battle_event_id, 0); + } + #[inline] + pub fn add_special_training_name(&mut self, special_training_name: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(TraningQuestTemplate::VT_SPECIAL_TRAINING_NAME, special_training_name); + } + #[inline] + pub fn add_special_training_id(&mut self, special_training_id: i32) { + self.fbb_.push_slot::(TraningQuestTemplate::VT_SPECIAL_TRAINING_ID, special_training_id, 0); + } + #[inline] + pub fn add_unk_1(&mut self, unk_1: i32) { + self.fbb_.push_slot::(TraningQuestTemplate::VT_UNK_1, unk_1, 0); + } + #[inline] + pub fn add_unk_2(&mut self, unk_2: i32) { + self.fbb_.push_slot::(TraningQuestTemplate::VT_UNK_2, unk_2, 0); + } + #[inline] + pub fn add_unk_3(&mut self, unk_3: i32) { + self.fbb_.push_slot::(TraningQuestTemplate::VT_UNK_3, unk_3, 0); + } + #[inline] + pub fn add_unk_4(&mut self, unk_4: bool) { + self.fbb_.push_slot::(TraningQuestTemplate::VT_UNK_4, unk_4, false); + } + #[inline] + pub fn add_unk_5(&mut self, unk_5: bool) { + self.fbb_.push_slot::(TraningQuestTemplate::VT_UNK_5, unk_5, false); + } + #[inline] + pub fn add_unk_6(&mut self, unk_6: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(TraningQuestTemplate::VT_UNK_6, unk_6); + } + #[inline] + pub fn add_unk_7(&mut self, unk_7: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(TraningQuestTemplate::VT_UNK_7, unk_7); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> TraningQuestTemplateBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + TraningQuestTemplateBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for TraningQuestTemplate<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("TraningQuestTemplate"); + ds.field("id", &self.id()); + ds.field("training_type", &self.training_type()); + ds.field("battle_event_id", &self.battle_event_id()); + ds.field("special_training_name", &self.special_training_name()); + ds.field("special_training_id", &self.special_training_id()); + ds.field("unk_1", &self.unk_1()); + ds.field("unk_2", &self.unk_2()); + ds.field("unk_3", &self.unk_3()); + ds.field("unk_4", &self.unk_4()); + ds.field("unk_5", &self.unk_5()); + ds.field("unk_6", &self.unk_6()); + ds.field("unk_7", &self.unk_7()); + ds.finish() + } +} +pub enum TraningQuestTemplateTbOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct TraningQuestTemplateTb<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for TraningQuestTemplateTb<'a> { + type Inner = TraningQuestTemplateTb<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> TraningQuestTemplateTb<'a> { + pub const VT_DATA: flatbuffers::VOffsetT = 4; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + TraningQuestTemplateTb { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args TraningQuestTemplateTbArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = TraningQuestTemplateTbBuilder::new(_fbb); + if let Some(x) = args.data { builder.add_data(x); } + builder.finish() + } + + + #[inline] + pub fn data(&self) -> Option>>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(TraningQuestTemplateTb::VT_DATA, None)} + } +} + +impl flatbuffers::Verifiable for TraningQuestTemplateTb<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::>>>("data", Self::VT_DATA, false)? + .finish(); + Ok(()) + } +} +pub struct TraningQuestTemplateTbArgs<'a> { + pub data: Option>>>>, +} +impl<'a> Default for TraningQuestTemplateTbArgs<'a> { + #[inline] + fn default() -> Self { + TraningQuestTemplateTbArgs { + data: None, + } + } +} + +pub struct TraningQuestTemplateTbBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> TraningQuestTemplateTbBuilder<'a, 'b, A> { + #[inline] + pub fn add_data(&mut self, data: flatbuffers::WIPOffset>>>) { + self.fbb_.push_slot_always::>(TraningQuestTemplateTb::VT_DATA, data); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> TraningQuestTemplateTbBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + TraningQuestTemplateTbBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for TraningQuestTemplateTb<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("TraningQuestTemplateTb"); + ds.field("data", &self.data()); + ds.finish() + } +} diff --git a/lib/config/gen_flatbuffers/unlock_config_template_generated.rs b/lib/config/gen_flatbuffers/unlock_config_template_generated.rs new file mode 100644 index 0000000..fbffe36 --- /dev/null +++ b/lib/config/gen_flatbuffers/unlock_config_template_generated.rs @@ -0,0 +1,613 @@ +// automatically generated by the FlatBuffers compiler, do not modify + + +// @generated + +use core::mem; +use core::cmp::Ordering; + +extern crate flatbuffers; +use self::flatbuffers::{EndianScalar, Follow}; + +pub enum UnlockConfigTemplateOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct UnlockConfigTemplate<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for UnlockConfigTemplate<'a> { + type Inner = UnlockConfigTemplate<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> UnlockConfigTemplate<'a> { + pub const VT_ID: flatbuffers::VOffsetT = 4; + pub const VT_UNK_1: flatbuffers::VOffsetT = 6; + pub const VT_UNK_2: flatbuffers::VOffsetT = 8; + pub const VT_UNK_3: flatbuffers::VOffsetT = 10; + pub const VT_UNK_4: flatbuffers::VOffsetT = 12; + pub const VT_UNK_5: flatbuffers::VOffsetT = 14; + pub const VT_UNK_6: flatbuffers::VOffsetT = 16; + pub const VT_UNK_7: flatbuffers::VOffsetT = 18; + pub const VT_UNK_8: flatbuffers::VOffsetT = 20; + pub const VT_ICON_RES: flatbuffers::VOffsetT = 22; + pub const VT_UNK_9: flatbuffers::VOffsetT = 24; + pub const VT_NAME: flatbuffers::VOffsetT = 26; + pub const VT_UNK_10: flatbuffers::VOffsetT = 28; + pub const VT_UNK_11: flatbuffers::VOffsetT = 30; + pub const VT_UNK_12: flatbuffers::VOffsetT = 32; + pub const VT_UNK_13: flatbuffers::VOffsetT = 34; + pub const VT_UNK_14: flatbuffers::VOffsetT = 36; + pub const VT_UNK_15: flatbuffers::VOffsetT = 38; + pub const VT_UNK_16: flatbuffers::VOffsetT = 40; + pub const VT_UNK_17: flatbuffers::VOffsetT = 42; + pub const VT_UNK_18: flatbuffers::VOffsetT = 44; + pub const VT_UNK_19: flatbuffers::VOffsetT = 46; + pub const VT_UNK_20: flatbuffers::VOffsetT = 48; + pub const VT_UNK_21: flatbuffers::VOffsetT = 50; + pub const VT_UNK_22: flatbuffers::VOffsetT = 52; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + UnlockConfigTemplate { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args UnlockConfigTemplateArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = UnlockConfigTemplateBuilder::new(_fbb); + if let Some(x) = args.unk_22 { builder.add_unk_22(x); } + builder.add_unk_21(args.unk_21); + if let Some(x) = args.unk_20 { builder.add_unk_20(x); } + builder.add_unk_19(args.unk_19); + builder.add_unk_18(args.unk_18); + if let Some(x) = args.unk_17 { builder.add_unk_17(x); } + builder.add_unk_16(args.unk_16); + if let Some(x) = args.unk_15 { builder.add_unk_15(x); } + builder.add_unk_14(args.unk_14); + builder.add_unk_12(args.unk_12); + builder.add_unk_11(args.unk_11); + if let Some(x) = args.unk_10 { builder.add_unk_10(x); } + if let Some(x) = args.name { builder.add_name(x); } + builder.add_unk_9(args.unk_9); + if let Some(x) = args.icon_res { builder.add_icon_res(x); } + if let Some(x) = args.unk_8 { builder.add_unk_8(x); } + builder.add_unk_7(args.unk_7); + if let Some(x) = args.unk_6 { builder.add_unk_6(x); } + builder.add_unk_5(args.unk_5); + builder.add_unk_4(args.unk_4); + builder.add_unk_3(args.unk_3); + if let Some(x) = args.unk_2 { builder.add_unk_2(x); } + if let Some(x) = args.unk_1 { builder.add_unk_1(x); } + builder.add_id(args.id); + builder.add_unk_13(args.unk_13); + builder.finish() + } + + + #[inline] + pub fn id(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(UnlockConfigTemplate::VT_ID, Some(0)).unwrap()} + } + #[inline] + pub fn unk_1(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(UnlockConfigTemplate::VT_UNK_1, None)} + } + #[inline] + pub fn unk_2(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(UnlockConfigTemplate::VT_UNK_2, None)} + } + #[inline] + pub fn unk_3(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(UnlockConfigTemplate::VT_UNK_3, Some(0)).unwrap()} + } + #[inline] + pub fn unk_4(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(UnlockConfigTemplate::VT_UNK_4, Some(0)).unwrap()} + } + #[inline] + pub fn unk_5(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(UnlockConfigTemplate::VT_UNK_5, Some(0)).unwrap()} + } + #[inline] + pub fn unk_6(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(UnlockConfigTemplate::VT_UNK_6, None)} + } + #[inline] + pub fn unk_7(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(UnlockConfigTemplate::VT_UNK_7, Some(0)).unwrap()} + } + #[inline] + pub fn unk_8(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(UnlockConfigTemplate::VT_UNK_8, None)} + } + #[inline] + pub fn icon_res(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(UnlockConfigTemplate::VT_ICON_RES, None)} + } + #[inline] + pub fn unk_9(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(UnlockConfigTemplate::VT_UNK_9, Some(0)).unwrap()} + } + #[inline] + pub fn name(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(UnlockConfigTemplate::VT_NAME, None)} + } + #[inline] + pub fn unk_10(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(UnlockConfigTemplate::VT_UNK_10, None)} + } + #[inline] + pub fn unk_11(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(UnlockConfigTemplate::VT_UNK_11, Some(0)).unwrap()} + } + #[inline] + pub fn unk_12(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(UnlockConfigTemplate::VT_UNK_12, Some(0)).unwrap()} + } + #[inline] + pub fn unk_13(&self) -> bool { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(UnlockConfigTemplate::VT_UNK_13, Some(false)).unwrap()} + } + #[inline] + pub fn unk_14(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(UnlockConfigTemplate::VT_UNK_14, Some(0)).unwrap()} + } + #[inline] + pub fn unk_15(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(UnlockConfigTemplate::VT_UNK_15, None)} + } + #[inline] + pub fn unk_16(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(UnlockConfigTemplate::VT_UNK_16, Some(0)).unwrap()} + } + #[inline] + pub fn unk_17(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(UnlockConfigTemplate::VT_UNK_17, None)} + } + #[inline] + pub fn unk_18(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(UnlockConfigTemplate::VT_UNK_18, Some(0)).unwrap()} + } + #[inline] + pub fn unk_19(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(UnlockConfigTemplate::VT_UNK_19, Some(0)).unwrap()} + } + #[inline] + pub fn unk_20(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(UnlockConfigTemplate::VT_UNK_20, None)} + } + #[inline] + pub fn unk_21(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(UnlockConfigTemplate::VT_UNK_21, Some(0)).unwrap()} + } + #[inline] + pub fn unk_22(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(UnlockConfigTemplate::VT_UNK_22, None)} + } +} + +impl flatbuffers::Verifiable for UnlockConfigTemplate<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::("id", Self::VT_ID, false)? + .visit_field::>("unk_1", Self::VT_UNK_1, false)? + .visit_field::>>("unk_2", Self::VT_UNK_2, false)? + .visit_field::("unk_3", Self::VT_UNK_3, false)? + .visit_field::("unk_4", Self::VT_UNK_4, false)? + .visit_field::("unk_5", Self::VT_UNK_5, false)? + .visit_field::>("unk_6", Self::VT_UNK_6, false)? + .visit_field::("unk_7", Self::VT_UNK_7, false)? + .visit_field::>("unk_8", Self::VT_UNK_8, false)? + .visit_field::>("icon_res", Self::VT_ICON_RES, false)? + .visit_field::("unk_9", Self::VT_UNK_9, false)? + .visit_field::>("name", Self::VT_NAME, false)? + .visit_field::>("unk_10", Self::VT_UNK_10, false)? + .visit_field::("unk_11", Self::VT_UNK_11, false)? + .visit_field::("unk_12", Self::VT_UNK_12, false)? + .visit_field::("unk_13", Self::VT_UNK_13, false)? + .visit_field::("unk_14", Self::VT_UNK_14, false)? + .visit_field::>("unk_15", Self::VT_UNK_15, false)? + .visit_field::("unk_16", Self::VT_UNK_16, false)? + .visit_field::>("unk_17", Self::VT_UNK_17, false)? + .visit_field::("unk_18", Self::VT_UNK_18, false)? + .visit_field::("unk_19", Self::VT_UNK_19, false)? + .visit_field::>("unk_20", Self::VT_UNK_20, false)? + .visit_field::("unk_21", Self::VT_UNK_21, false)? + .visit_field::>("unk_22", Self::VT_UNK_22, false)? + .finish(); + Ok(()) + } +} +pub struct UnlockConfigTemplateArgs<'a> { + pub id: i32, + pub unk_1: Option>, + pub unk_2: Option>>, + pub unk_3: i32, + pub unk_4: i32, + pub unk_5: i32, + pub unk_6: Option>, + pub unk_7: i32, + pub unk_8: Option>, + pub icon_res: Option>, + pub unk_9: i32, + pub name: Option>, + pub unk_10: Option>, + pub unk_11: i32, + pub unk_12: i32, + pub unk_13: bool, + pub unk_14: i32, + pub unk_15: Option>, + pub unk_16: i32, + pub unk_17: Option>, + pub unk_18: i32, + pub unk_19: i32, + pub unk_20: Option>, + pub unk_21: i32, + pub unk_22: Option>, +} +impl<'a> Default for UnlockConfigTemplateArgs<'a> { + #[inline] + fn default() -> Self { + UnlockConfigTemplateArgs { + id: 0, + unk_1: None, + unk_2: None, + unk_3: 0, + unk_4: 0, + unk_5: 0, + unk_6: None, + unk_7: 0, + unk_8: None, + icon_res: None, + unk_9: 0, + name: None, + unk_10: None, + unk_11: 0, + unk_12: 0, + unk_13: false, + unk_14: 0, + unk_15: None, + unk_16: 0, + unk_17: None, + unk_18: 0, + unk_19: 0, + unk_20: None, + unk_21: 0, + unk_22: None, + } + } +} + +pub struct UnlockConfigTemplateBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> UnlockConfigTemplateBuilder<'a, 'b, A> { + #[inline] + pub fn add_id(&mut self, id: i32) { + self.fbb_.push_slot::(UnlockConfigTemplate::VT_ID, id, 0); + } + #[inline] + pub fn add_unk_1(&mut self, unk_1: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(UnlockConfigTemplate::VT_UNK_1, unk_1); + } + #[inline] + pub fn add_unk_2(&mut self, unk_2: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(UnlockConfigTemplate::VT_UNK_2, unk_2); + } + #[inline] + pub fn add_unk_3(&mut self, unk_3: i32) { + self.fbb_.push_slot::(UnlockConfigTemplate::VT_UNK_3, unk_3, 0); + } + #[inline] + pub fn add_unk_4(&mut self, unk_4: i32) { + self.fbb_.push_slot::(UnlockConfigTemplate::VT_UNK_4, unk_4, 0); + } + #[inline] + pub fn add_unk_5(&mut self, unk_5: i32) { + self.fbb_.push_slot::(UnlockConfigTemplate::VT_UNK_5, unk_5, 0); + } + #[inline] + pub fn add_unk_6(&mut self, unk_6: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(UnlockConfigTemplate::VT_UNK_6, unk_6); + } + #[inline] + pub fn add_unk_7(&mut self, unk_7: i32) { + self.fbb_.push_slot::(UnlockConfigTemplate::VT_UNK_7, unk_7, 0); + } + #[inline] + pub fn add_unk_8(&mut self, unk_8: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(UnlockConfigTemplate::VT_UNK_8, unk_8); + } + #[inline] + pub fn add_icon_res(&mut self, icon_res: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(UnlockConfigTemplate::VT_ICON_RES, icon_res); + } + #[inline] + pub fn add_unk_9(&mut self, unk_9: i32) { + self.fbb_.push_slot::(UnlockConfigTemplate::VT_UNK_9, unk_9, 0); + } + #[inline] + pub fn add_name(&mut self, name: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(UnlockConfigTemplate::VT_NAME, name); + } + #[inline] + pub fn add_unk_10(&mut self, unk_10: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(UnlockConfigTemplate::VT_UNK_10, unk_10); + } + #[inline] + pub fn add_unk_11(&mut self, unk_11: i32) { + self.fbb_.push_slot::(UnlockConfigTemplate::VT_UNK_11, unk_11, 0); + } + #[inline] + pub fn add_unk_12(&mut self, unk_12: i32) { + self.fbb_.push_slot::(UnlockConfigTemplate::VT_UNK_12, unk_12, 0); + } + #[inline] + pub fn add_unk_13(&mut self, unk_13: bool) { + self.fbb_.push_slot::(UnlockConfigTemplate::VT_UNK_13, unk_13, false); + } + #[inline] + pub fn add_unk_14(&mut self, unk_14: i32) { + self.fbb_.push_slot::(UnlockConfigTemplate::VT_UNK_14, unk_14, 0); + } + #[inline] + pub fn add_unk_15(&mut self, unk_15: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(UnlockConfigTemplate::VT_UNK_15, unk_15); + } + #[inline] + pub fn add_unk_16(&mut self, unk_16: i32) { + self.fbb_.push_slot::(UnlockConfigTemplate::VT_UNK_16, unk_16, 0); + } + #[inline] + pub fn add_unk_17(&mut self, unk_17: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(UnlockConfigTemplate::VT_UNK_17, unk_17); + } + #[inline] + pub fn add_unk_18(&mut self, unk_18: i32) { + self.fbb_.push_slot::(UnlockConfigTemplate::VT_UNK_18, unk_18, 0); + } + #[inline] + pub fn add_unk_19(&mut self, unk_19: i32) { + self.fbb_.push_slot::(UnlockConfigTemplate::VT_UNK_19, unk_19, 0); + } + #[inline] + pub fn add_unk_20(&mut self, unk_20: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(UnlockConfigTemplate::VT_UNK_20, unk_20); + } + #[inline] + pub fn add_unk_21(&mut self, unk_21: i32) { + self.fbb_.push_slot::(UnlockConfigTemplate::VT_UNK_21, unk_21, 0); + } + #[inline] + pub fn add_unk_22(&mut self, unk_22: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(UnlockConfigTemplate::VT_UNK_22, unk_22); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> UnlockConfigTemplateBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + UnlockConfigTemplateBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for UnlockConfigTemplate<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("UnlockConfigTemplate"); + ds.field("id", &self.id()); + ds.field("unk_1", &self.unk_1()); + ds.field("unk_2", &self.unk_2()); + ds.field("unk_3", &self.unk_3()); + ds.field("unk_4", &self.unk_4()); + ds.field("unk_5", &self.unk_5()); + ds.field("unk_6", &self.unk_6()); + ds.field("unk_7", &self.unk_7()); + ds.field("unk_8", &self.unk_8()); + ds.field("icon_res", &self.icon_res()); + ds.field("unk_9", &self.unk_9()); + ds.field("name", &self.name()); + ds.field("unk_10", &self.unk_10()); + ds.field("unk_11", &self.unk_11()); + ds.field("unk_12", &self.unk_12()); + ds.field("unk_13", &self.unk_13()); + ds.field("unk_14", &self.unk_14()); + ds.field("unk_15", &self.unk_15()); + ds.field("unk_16", &self.unk_16()); + ds.field("unk_17", &self.unk_17()); + ds.field("unk_18", &self.unk_18()); + ds.field("unk_19", &self.unk_19()); + ds.field("unk_20", &self.unk_20()); + ds.field("unk_21", &self.unk_21()); + ds.field("unk_22", &self.unk_22()); + ds.finish() + } +} +pub enum UnlockConfigTemplateTbOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct UnlockConfigTemplateTb<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for UnlockConfigTemplateTb<'a> { + type Inner = UnlockConfigTemplateTb<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> UnlockConfigTemplateTb<'a> { + pub const VT_DATA: flatbuffers::VOffsetT = 4; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + UnlockConfigTemplateTb { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args UnlockConfigTemplateTbArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = UnlockConfigTemplateTbBuilder::new(_fbb); + if let Some(x) = args.data { builder.add_data(x); } + builder.finish() + } + + + #[inline] + pub fn data(&self) -> Option>>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(UnlockConfigTemplateTb::VT_DATA, None)} + } +} + +impl flatbuffers::Verifiable for UnlockConfigTemplateTb<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::>>>("data", Self::VT_DATA, false)? + .finish(); + Ok(()) + } +} +pub struct UnlockConfigTemplateTbArgs<'a> { + pub data: Option>>>>, +} +impl<'a> Default for UnlockConfigTemplateTbArgs<'a> { + #[inline] + fn default() -> Self { + UnlockConfigTemplateTbArgs { + data: None, + } + } +} + +pub struct UnlockConfigTemplateTbBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> UnlockConfigTemplateTbBuilder<'a, 'b, A> { + #[inline] + pub fn add_data(&mut self, data: flatbuffers::WIPOffset>>>) { + self.fbb_.push_slot_always::>(UnlockConfigTemplateTb::VT_DATA, data); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> UnlockConfigTemplateTbBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + UnlockConfigTemplateTbBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for UnlockConfigTemplateTb<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("UnlockConfigTemplateTb"); + ds.field("data", &self.data()); + ds.finish() + } +} diff --git a/lib/config/gen_flatbuffers/weapon_level_template_generated.rs b/lib/config/gen_flatbuffers/weapon_level_template_generated.rs new file mode 100644 index 0000000..b2bf063 --- /dev/null +++ b/lib/config/gen_flatbuffers/weapon_level_template_generated.rs @@ -0,0 +1,256 @@ +// automatically generated by the FlatBuffers compiler, do not modify + + +// @generated + +use core::mem; +use core::cmp::Ordering; + +extern crate flatbuffers; +use self::flatbuffers::{EndianScalar, Follow}; + +pub enum WeaponLevelTemplateOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct WeaponLevelTemplate<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for WeaponLevelTemplate<'a> { + type Inner = WeaponLevelTemplate<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> WeaponLevelTemplate<'a> { + pub const VT_RARITY: flatbuffers::VOffsetT = 4; + pub const VT_LEVEL: flatbuffers::VOffsetT = 6; + pub const VT_RATE: flatbuffers::VOffsetT = 8; + pub const VT_EXP: flatbuffers::VOffsetT = 10; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + WeaponLevelTemplate { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args WeaponLevelTemplateArgs + ) -> flatbuffers::WIPOffset> { + let mut builder = WeaponLevelTemplateBuilder::new(_fbb); + builder.add_exp(args.exp); + builder.add_rate(args.rate); + builder.add_level(args.level); + builder.add_rarity(args.rarity); + builder.finish() + } + + + #[inline] + pub fn rarity(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(WeaponLevelTemplate::VT_RARITY, Some(0)).unwrap()} + } + #[inline] + pub fn level(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(WeaponLevelTemplate::VT_LEVEL, Some(0)).unwrap()} + } + #[inline] + pub fn rate(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(WeaponLevelTemplate::VT_RATE, Some(0)).unwrap()} + } + #[inline] + pub fn exp(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(WeaponLevelTemplate::VT_EXP, Some(0)).unwrap()} + } +} + +impl flatbuffers::Verifiable for WeaponLevelTemplate<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::("rarity", Self::VT_RARITY, false)? + .visit_field::("level", Self::VT_LEVEL, false)? + .visit_field::("rate", Self::VT_RATE, false)? + .visit_field::("exp", Self::VT_EXP, false)? + .finish(); + Ok(()) + } +} +pub struct WeaponLevelTemplateArgs { + pub rarity: u32, + pub level: u32, + pub rate: u32, + pub exp: u32, +} +impl<'a> Default for WeaponLevelTemplateArgs { + #[inline] + fn default() -> Self { + WeaponLevelTemplateArgs { + rarity: 0, + level: 0, + rate: 0, + exp: 0, + } + } +} + +pub struct WeaponLevelTemplateBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> WeaponLevelTemplateBuilder<'a, 'b, A> { + #[inline] + pub fn add_rarity(&mut self, rarity: u32) { + self.fbb_.push_slot::(WeaponLevelTemplate::VT_RARITY, rarity, 0); + } + #[inline] + pub fn add_level(&mut self, level: u32) { + self.fbb_.push_slot::(WeaponLevelTemplate::VT_LEVEL, level, 0); + } + #[inline] + pub fn add_rate(&mut self, rate: u32) { + self.fbb_.push_slot::(WeaponLevelTemplate::VT_RATE, rate, 0); + } + #[inline] + pub fn add_exp(&mut self, exp: u32) { + self.fbb_.push_slot::(WeaponLevelTemplate::VT_EXP, exp, 0); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> WeaponLevelTemplateBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + WeaponLevelTemplateBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for WeaponLevelTemplate<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("WeaponLevelTemplate"); + ds.field("rarity", &self.rarity()); + ds.field("level", &self.level()); + ds.field("rate", &self.rate()); + ds.field("exp", &self.exp()); + ds.finish() + } +} +pub enum WeaponLevelTemplateTbOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct WeaponLevelTemplateTb<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for WeaponLevelTemplateTb<'a> { + type Inner = WeaponLevelTemplateTb<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> WeaponLevelTemplateTb<'a> { + pub const VT_DATA: flatbuffers::VOffsetT = 4; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + WeaponLevelTemplateTb { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args WeaponLevelTemplateTbArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = WeaponLevelTemplateTbBuilder::new(_fbb); + if let Some(x) = args.data { builder.add_data(x); } + builder.finish() + } + + + #[inline] + pub fn data(&self) -> Option>>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(WeaponLevelTemplateTb::VT_DATA, None)} + } +} + +impl flatbuffers::Verifiable for WeaponLevelTemplateTb<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::>>>("data", Self::VT_DATA, false)? + .finish(); + Ok(()) + } +} +pub struct WeaponLevelTemplateTbArgs<'a> { + pub data: Option>>>>, +} +impl<'a> Default for WeaponLevelTemplateTbArgs<'a> { + #[inline] + fn default() -> Self { + WeaponLevelTemplateTbArgs { + data: None, + } + } +} + +pub struct WeaponLevelTemplateTbBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> WeaponLevelTemplateTbBuilder<'a, 'b, A> { + #[inline] + pub fn add_data(&mut self, data: flatbuffers::WIPOffset>>>) { + self.fbb_.push_slot_always::>(WeaponLevelTemplateTb::VT_DATA, data); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> WeaponLevelTemplateTbBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + WeaponLevelTemplateTbBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for WeaponLevelTemplateTb<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("WeaponLevelTemplateTb"); + ds.field("data", &self.data()); + ds.finish() + } +} diff --git a/lib/config/gen_flatbuffers/weapon_star_template_generated.rs b/lib/config/gen_flatbuffers/weapon_star_template_generated.rs new file mode 100644 index 0000000..3e5f129 --- /dev/null +++ b/lib/config/gen_flatbuffers/weapon_star_template_generated.rs @@ -0,0 +1,409 @@ +// automatically generated by the FlatBuffers compiler, do not modify + + +// @generated + +use core::mem; +use core::cmp::Ordering; + +extern crate flatbuffers; +use self::flatbuffers::{EndianScalar, Follow}; + +pub enum WeaponStarTemplateOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct WeaponStarTemplate<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for WeaponStarTemplate<'a> { + type Inner = WeaponStarTemplate<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> WeaponStarTemplate<'a> { + pub const VT_RARITY: flatbuffers::VOffsetT = 4; + pub const VT_STAR: flatbuffers::VOffsetT = 6; + pub const VT_MIN_LEVEL: flatbuffers::VOffsetT = 8; + pub const VT_MAX_LEVEL: flatbuffers::VOffsetT = 10; + pub const VT_STAR_RATE: flatbuffers::VOffsetT = 12; + pub const VT_RAND_RATE: flatbuffers::VOffsetT = 14; + pub const VT_UNK_6: flatbuffers::VOffsetT = 16; + pub const VT_UNK_7: flatbuffers::VOffsetT = 18; + pub const VT_UNK_8: flatbuffers::VOffsetT = 20; + pub const VT_UNK_9: flatbuffers::VOffsetT = 22; + pub const VT_UNK_10: flatbuffers::VOffsetT = 24; + pub const VT_UNK_11: flatbuffers::VOffsetT = 26; + pub const VT_UNK_12: flatbuffers::VOffsetT = 28; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + WeaponStarTemplate { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args WeaponStarTemplateArgs + ) -> flatbuffers::WIPOffset> { + let mut builder = WeaponStarTemplateBuilder::new(_fbb); + builder.add_unk_12(args.unk_12); + builder.add_unk_11(args.unk_11); + builder.add_unk_10(args.unk_10); + builder.add_unk_9(args.unk_9); + builder.add_unk_8(args.unk_8); + builder.add_unk_7(args.unk_7); + builder.add_unk_6(args.unk_6); + builder.add_rand_rate(args.rand_rate); + builder.add_star_rate(args.star_rate); + builder.add_max_level(args.max_level); + builder.add_min_level(args.min_level); + builder.add_star(args.star); + builder.add_rarity(args.rarity); + builder.finish() + } + + + #[inline] + pub fn rarity(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(WeaponStarTemplate::VT_RARITY, Some(0)).unwrap()} + } + #[inline] + pub fn star(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(WeaponStarTemplate::VT_STAR, Some(0)).unwrap()} + } + #[inline] + pub fn min_level(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(WeaponStarTemplate::VT_MIN_LEVEL, Some(0)).unwrap()} + } + #[inline] + pub fn max_level(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(WeaponStarTemplate::VT_MAX_LEVEL, Some(0)).unwrap()} + } + #[inline] + pub fn star_rate(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(WeaponStarTemplate::VT_STAR_RATE, Some(0)).unwrap()} + } + #[inline] + pub fn rand_rate(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(WeaponStarTemplate::VT_RAND_RATE, Some(0)).unwrap()} + } + #[inline] + pub fn unk_6(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(WeaponStarTemplate::VT_UNK_6, Some(0)).unwrap()} + } + #[inline] + pub fn unk_7(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(WeaponStarTemplate::VT_UNK_7, Some(0)).unwrap()} + } + #[inline] + pub fn unk_8(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(WeaponStarTemplate::VT_UNK_8, Some(0)).unwrap()} + } + #[inline] + pub fn unk_9(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(WeaponStarTemplate::VT_UNK_9, Some(0)).unwrap()} + } + #[inline] + pub fn unk_10(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(WeaponStarTemplate::VT_UNK_10, Some(0)).unwrap()} + } + #[inline] + pub fn unk_11(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(WeaponStarTemplate::VT_UNK_11, Some(0)).unwrap()} + } + #[inline] + pub fn unk_12(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(WeaponStarTemplate::VT_UNK_12, Some(0)).unwrap()} + } +} + +impl flatbuffers::Verifiable for WeaponStarTemplate<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::("rarity", Self::VT_RARITY, false)? + .visit_field::("star", Self::VT_STAR, false)? + .visit_field::("min_level", Self::VT_MIN_LEVEL, false)? + .visit_field::("max_level", Self::VT_MAX_LEVEL, false)? + .visit_field::("star_rate", Self::VT_STAR_RATE, false)? + .visit_field::("rand_rate", Self::VT_RAND_RATE, false)? + .visit_field::("unk_6", Self::VT_UNK_6, false)? + .visit_field::("unk_7", Self::VT_UNK_7, false)? + .visit_field::("unk_8", Self::VT_UNK_8, false)? + .visit_field::("unk_9", Self::VT_UNK_9, false)? + .visit_field::("unk_10", Self::VT_UNK_10, false)? + .visit_field::("unk_11", Self::VT_UNK_11, false)? + .visit_field::("unk_12", Self::VT_UNK_12, false)? + .finish(); + Ok(()) + } +} +pub struct WeaponStarTemplateArgs { + pub rarity: u32, + pub star: u32, + pub min_level: u32, + pub max_level: u32, + pub star_rate: u32, + pub rand_rate: u32, + pub unk_6: i32, + pub unk_7: i32, + pub unk_8: i32, + pub unk_9: i32, + pub unk_10: i32, + pub unk_11: i32, + pub unk_12: i32, +} +impl<'a> Default for WeaponStarTemplateArgs { + #[inline] + fn default() -> Self { + WeaponStarTemplateArgs { + rarity: 0, + star: 0, + min_level: 0, + max_level: 0, + star_rate: 0, + rand_rate: 0, + unk_6: 0, + unk_7: 0, + unk_8: 0, + unk_9: 0, + unk_10: 0, + unk_11: 0, + unk_12: 0, + } + } +} + +pub struct WeaponStarTemplateBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> WeaponStarTemplateBuilder<'a, 'b, A> { + #[inline] + pub fn add_rarity(&mut self, rarity: u32) { + self.fbb_.push_slot::(WeaponStarTemplate::VT_RARITY, rarity, 0); + } + #[inline] + pub fn add_star(&mut self, star: u32) { + self.fbb_.push_slot::(WeaponStarTemplate::VT_STAR, star, 0); + } + #[inline] + pub fn add_min_level(&mut self, min_level: u32) { + self.fbb_.push_slot::(WeaponStarTemplate::VT_MIN_LEVEL, min_level, 0); + } + #[inline] + pub fn add_max_level(&mut self, max_level: u32) { + self.fbb_.push_slot::(WeaponStarTemplate::VT_MAX_LEVEL, max_level, 0); + } + #[inline] + pub fn add_star_rate(&mut self, star_rate: u32) { + self.fbb_.push_slot::(WeaponStarTemplate::VT_STAR_RATE, star_rate, 0); + } + #[inline] + pub fn add_rand_rate(&mut self, rand_rate: u32) { + self.fbb_.push_slot::(WeaponStarTemplate::VT_RAND_RATE, rand_rate, 0); + } + #[inline] + pub fn add_unk_6(&mut self, unk_6: i32) { + self.fbb_.push_slot::(WeaponStarTemplate::VT_UNK_6, unk_6, 0); + } + #[inline] + pub fn add_unk_7(&mut self, unk_7: i32) { + self.fbb_.push_slot::(WeaponStarTemplate::VT_UNK_7, unk_7, 0); + } + #[inline] + pub fn add_unk_8(&mut self, unk_8: i32) { + self.fbb_.push_slot::(WeaponStarTemplate::VT_UNK_8, unk_8, 0); + } + #[inline] + pub fn add_unk_9(&mut self, unk_9: i32) { + self.fbb_.push_slot::(WeaponStarTemplate::VT_UNK_9, unk_9, 0); + } + #[inline] + pub fn add_unk_10(&mut self, unk_10: i32) { + self.fbb_.push_slot::(WeaponStarTemplate::VT_UNK_10, unk_10, 0); + } + #[inline] + pub fn add_unk_11(&mut self, unk_11: i32) { + self.fbb_.push_slot::(WeaponStarTemplate::VT_UNK_11, unk_11, 0); + } + #[inline] + pub fn add_unk_12(&mut self, unk_12: i32) { + self.fbb_.push_slot::(WeaponStarTemplate::VT_UNK_12, unk_12, 0); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> WeaponStarTemplateBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + WeaponStarTemplateBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for WeaponStarTemplate<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("WeaponStarTemplate"); + ds.field("rarity", &self.rarity()); + ds.field("star", &self.star()); + ds.field("min_level", &self.min_level()); + ds.field("max_level", &self.max_level()); + ds.field("star_rate", &self.star_rate()); + ds.field("rand_rate", &self.rand_rate()); + ds.field("unk_6", &self.unk_6()); + ds.field("unk_7", &self.unk_7()); + ds.field("unk_8", &self.unk_8()); + ds.field("unk_9", &self.unk_9()); + ds.field("unk_10", &self.unk_10()); + ds.field("unk_11", &self.unk_11()); + ds.field("unk_12", &self.unk_12()); + ds.finish() + } +} +pub enum WeaponStarTemplateTbOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct WeaponStarTemplateTb<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for WeaponStarTemplateTb<'a> { + type Inner = WeaponStarTemplateTb<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> WeaponStarTemplateTb<'a> { + pub const VT_DATA: flatbuffers::VOffsetT = 4; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + WeaponStarTemplateTb { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args WeaponStarTemplateTbArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = WeaponStarTemplateTbBuilder::new(_fbb); + if let Some(x) = args.data { builder.add_data(x); } + builder.finish() + } + + + #[inline] + pub fn data(&self) -> Option>>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(WeaponStarTemplateTb::VT_DATA, None)} + } +} + +impl flatbuffers::Verifiable for WeaponStarTemplateTb<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::>>>("data", Self::VT_DATA, false)? + .finish(); + Ok(()) + } +} +pub struct WeaponStarTemplateTbArgs<'a> { + pub data: Option>>>>, +} +impl<'a> Default for WeaponStarTemplateTbArgs<'a> { + #[inline] + fn default() -> Self { + WeaponStarTemplateTbArgs { + data: None, + } + } +} + +pub struct WeaponStarTemplateTbBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> WeaponStarTemplateTbBuilder<'a, 'b, A> { + #[inline] + pub fn add_data(&mut self, data: flatbuffers::WIPOffset>>>) { + self.fbb_.push_slot_always::>(WeaponStarTemplateTb::VT_DATA, data); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> WeaponStarTemplateTbBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + WeaponStarTemplateTbBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for WeaponStarTemplateTb<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("WeaponStarTemplateTb"); + ds.field("data", &self.data()); + ds.finish() + } +} diff --git a/lib/config/gen_flatbuffers/weapon_template_generated.rs b/lib/config/gen_flatbuffers/weapon_template_generated.rs new file mode 100644 index 0000000..15c12a4 --- /dev/null +++ b/lib/config/gen_flatbuffers/weapon_template_generated.rs @@ -0,0 +1,903 @@ +// automatically generated by the FlatBuffers compiler, do not modify + + +// @generated + +use core::mem; +use core::cmp::Ordering; + +extern crate flatbuffers; +use self::flatbuffers::{EndianScalar, Follow}; + +// struct RefineCost, aligned to 4 +#[repr(transparent)] +#[derive(Clone, Copy, PartialEq)] +pub struct RefineCost(pub [u8; 8]); +impl Default for RefineCost { + fn default() -> Self { + Self([0; 8]) + } +} +impl core::fmt::Debug for RefineCost { + fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { + f.debug_struct("RefineCost") + .field("item_id", &self.item_id()) + .field("number", &self.number()) + .finish() + } +} + +impl flatbuffers::SimpleToVerifyInSlice for RefineCost {} +impl<'a> flatbuffers::Follow<'a> for RefineCost { + type Inner = &'a RefineCost; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + <&'a RefineCost>::follow(buf, loc) + } +} +impl<'a> flatbuffers::Follow<'a> for &'a RefineCost { + type Inner = &'a RefineCost; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + flatbuffers::follow_cast_ref::(buf, loc) + } +} +impl<'b> flatbuffers::Push for RefineCost { + type Output = RefineCost; + #[inline] + unsafe fn push(&self, dst: &mut [u8], _written_len: usize) { + let src = ::core::slice::from_raw_parts(self as *const RefineCost as *const u8, ::size()); + dst.copy_from_slice(src); + } + #[inline] + fn alignment() -> flatbuffers::PushAlignment { + flatbuffers::PushAlignment::new(4) + } +} + +impl<'a> flatbuffers::Verifiable for RefineCost { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.in_buffer::(pos) + } +} + +impl<'a> RefineCost { + #[allow(clippy::too_many_arguments)] + pub fn new( + item_id: u32, + number: i32, + ) -> Self { + let mut s = Self([0; 8]); + s.set_item_id(item_id); + s.set_number(number); + s + } + + pub fn item_id(&self) -> u32 { + let mut mem = core::mem::MaybeUninit::<::Scalar>::uninit(); + // Safety: + // Created from a valid Table for this object + // Which contains a valid value in this slot + EndianScalar::from_little_endian(unsafe { + core::ptr::copy_nonoverlapping( + self.0[0..].as_ptr(), + mem.as_mut_ptr() as *mut u8, + core::mem::size_of::<::Scalar>(), + ); + mem.assume_init() + }) + } + + pub fn set_item_id(&mut self, x: u32) { + let x_le = x.to_little_endian(); + // Safety: + // Created from a valid Table for this object + // Which contains a valid value in this slot + unsafe { + core::ptr::copy_nonoverlapping( + &x_le as *const _ as *const u8, + self.0[0..].as_mut_ptr(), + core::mem::size_of::<::Scalar>(), + ); + } + } + + pub fn number(&self) -> i32 { + let mut mem = core::mem::MaybeUninit::<::Scalar>::uninit(); + // Safety: + // Created from a valid Table for this object + // Which contains a valid value in this slot + EndianScalar::from_little_endian(unsafe { + core::ptr::copy_nonoverlapping( + self.0[4..].as_ptr(), + mem.as_mut_ptr() as *mut u8, + core::mem::size_of::<::Scalar>(), + ); + mem.assume_init() + }) + } + + pub fn set_number(&mut self, x: i32) { + let x_le = x.to_little_endian(); + // Safety: + // Created from a valid Table for this object + // Which contains a valid value in this slot + unsafe { + core::ptr::copy_nonoverlapping( + &x_le as *const _ as *const u8, + self.0[4..].as_mut_ptr(), + core::mem::size_of::<::Scalar>(), + ); + } + } + +} + +// struct Property, aligned to 4 +#[repr(transparent)] +#[derive(Clone, Copy, PartialEq)] +pub struct Property(pub [u8; 8]); +impl Default for Property { + fn default() -> Self { + Self([0; 8]) + } +} +impl core::fmt::Debug for Property { + fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { + f.debug_struct("Property") + .field("property", &self.property()) + .field("value", &self.value()) + .finish() + } +} + +impl flatbuffers::SimpleToVerifyInSlice for Property {} +impl<'a> flatbuffers::Follow<'a> for Property { + type Inner = &'a Property; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + <&'a Property>::follow(buf, loc) + } +} +impl<'a> flatbuffers::Follow<'a> for &'a Property { + type Inner = &'a Property; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + flatbuffers::follow_cast_ref::(buf, loc) + } +} +impl<'b> flatbuffers::Push for Property { + type Output = Property; + #[inline] + unsafe fn push(&self, dst: &mut [u8], _written_len: usize) { + let src = ::core::slice::from_raw_parts(self as *const Property as *const u8, ::size()); + dst.copy_from_slice(src); + } + #[inline] + fn alignment() -> flatbuffers::PushAlignment { + flatbuffers::PushAlignment::new(4) + } +} + +impl<'a> flatbuffers::Verifiable for Property { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.in_buffer::(pos) + } +} + +impl<'a> Property { + #[allow(clippy::too_many_arguments)] + pub fn new( + property: u32, + value: i32, + ) -> Self { + let mut s = Self([0; 8]); + s.set_property(property); + s.set_value(value); + s + } + + pub fn property(&self) -> u32 { + let mut mem = core::mem::MaybeUninit::<::Scalar>::uninit(); + // Safety: + // Created from a valid Table for this object + // Which contains a valid value in this slot + EndianScalar::from_little_endian(unsafe { + core::ptr::copy_nonoverlapping( + self.0[0..].as_ptr(), + mem.as_mut_ptr() as *mut u8, + core::mem::size_of::<::Scalar>(), + ); + mem.assume_init() + }) + } + + pub fn set_property(&mut self, x: u32) { + let x_le = x.to_little_endian(); + // Safety: + // Created from a valid Table for this object + // Which contains a valid value in this slot + unsafe { + core::ptr::copy_nonoverlapping( + &x_le as *const _ as *const u8, + self.0[0..].as_mut_ptr(), + core::mem::size_of::<::Scalar>(), + ); + } + } + + pub fn value(&self) -> i32 { + let mut mem = core::mem::MaybeUninit::<::Scalar>::uninit(); + // Safety: + // Created from a valid Table for this object + // Which contains a valid value in this slot + EndianScalar::from_little_endian(unsafe { + core::ptr::copy_nonoverlapping( + self.0[4..].as_ptr(), + mem.as_mut_ptr() as *mut u8, + core::mem::size_of::<::Scalar>(), + ); + mem.assume_init() + }) + } + + pub fn set_value(&mut self, x: i32) { + let x_le = x.to_little_endian(); + // Safety: + // Created from a valid Table for this object + // Which contains a valid value in this slot + unsafe { + core::ptr::copy_nonoverlapping( + &x_le as *const _ as *const u8, + self.0[4..].as_mut_ptr(), + core::mem::size_of::<::Scalar>(), + ); + } + } + +} + +pub enum WeaponTemplateOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct WeaponTemplate<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for WeaponTemplate<'a> { + type Inner = WeaponTemplate<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> WeaponTemplate<'a> { + pub const VT_ITEM_ID: flatbuffers::VOffsetT = 4; + pub const VT_WEAPON_NAME: flatbuffers::VOffsetT = 6; + pub const VT_UNK_MISSING_FIELD: flatbuffers::VOffsetT = 8; + pub const VT_BASE_PROPERTY: flatbuffers::VOffsetT = 10; + pub const VT_RAND_PROPERTY: flatbuffers::VOffsetT = 12; + pub const VT_STAR_LIMIT: flatbuffers::VOffsetT = 14; + pub const VT_EXP_RECYCLE: flatbuffers::VOffsetT = 16; + pub const VT_WEAPON_SCRIPT_CONFIG: flatbuffers::VOffsetT = 18; + pub const VT_WEAPON_UI_MODEL: flatbuffers::VOffsetT = 20; + pub const VT_UNK_1: flatbuffers::VOffsetT = 22; + pub const VT_UNK_MISSING_FIELD_2: flatbuffers::VOffsetT = 24; + pub const VT_UNK_WEAPON_PATH: flatbuffers::VOffsetT = 26; + pub const VT_UNK_MISSING_FIELD_3: flatbuffers::VOffsetT = 28; + pub const VT_REFINE_INITIAL: flatbuffers::VOffsetT = 30; + pub const VT_REFINE_LIMIT: flatbuffers::VOffsetT = 32; + pub const VT_UNK_MISSING_FIELD_4: flatbuffers::VOffsetT = 34; + pub const VT_UNK_MISSING_FIELD_5: flatbuffers::VOffsetT = 36; + pub const VT_UNK_STRING_WITH_VALUES: flatbuffers::VOffsetT = 38; + pub const VT_UNK_MISSING_FIELD_6: flatbuffers::VOffsetT = 40; + pub const VT_UNK_2: flatbuffers::VOffsetT = 42; + pub const VT_WEAPON_DESC: flatbuffers::VOffsetT = 44; + pub const VT_WEAPON_RELEASE_TAG: flatbuffers::VOffsetT = 46; + pub const VT_UNK_EMPTY_STRING: flatbuffers::VOffsetT = 48; + pub const VT_AVATAR_ID: flatbuffers::VOffsetT = 50; + pub const VT_WEAPON_COMMENT: flatbuffers::VOffsetT = 52; + pub const VT_REFINE_COSTS: flatbuffers::VOffsetT = 54; + pub const VT_UNK_3: flatbuffers::VOffsetT = 56; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + WeaponTemplate { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args WeaponTemplateArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = WeaponTemplateBuilder::new(_fbb); + builder.add_unk_3(args.unk_3); + if let Some(x) = args.refine_costs { builder.add_refine_costs(x); } + if let Some(x) = args.weapon_comment { builder.add_weapon_comment(x); } + builder.add_avatar_id(args.avatar_id); + if let Some(x) = args.unk_empty_string { builder.add_unk_empty_string(x); } + if let Some(x) = args.weapon_release_tag { builder.add_weapon_release_tag(x); } + if let Some(x) = args.weapon_desc { builder.add_weapon_desc(x); } + builder.add_unk_2(args.unk_2); + builder.add_unk_missing_field_6(args.unk_missing_field_6); + if let Some(x) = args.unk_string_with_values { builder.add_unk_string_with_values(x); } + builder.add_unk_missing_field_5(args.unk_missing_field_5); + builder.add_unk_missing_field_4(args.unk_missing_field_4); + builder.add_refine_limit(args.refine_limit); + builder.add_refine_initial(args.refine_initial); + builder.add_unk_missing_field_3(args.unk_missing_field_3); + if let Some(x) = args.unk_weapon_path { builder.add_unk_weapon_path(x); } + builder.add_unk_missing_field_2(args.unk_missing_field_2); + builder.add_unk_1(args.unk_1); + if let Some(x) = args.weapon_ui_model { builder.add_weapon_ui_model(x); } + if let Some(x) = args.weapon_script_config { builder.add_weapon_script_config(x); } + builder.add_exp_recycle(args.exp_recycle); + builder.add_star_limit(args.star_limit); + if let Some(x) = args.rand_property { builder.add_rand_property(x); } + if let Some(x) = args.base_property { builder.add_base_property(x); } + builder.add_unk_missing_field(args.unk_missing_field); + if let Some(x) = args.weapon_name { builder.add_weapon_name(x); } + builder.add_item_id(args.item_id); + builder.finish() + } + + + #[inline] + pub fn item_id(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(WeaponTemplate::VT_ITEM_ID, Some(0)).unwrap()} + } + #[inline] + pub fn weapon_name(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(WeaponTemplate::VT_WEAPON_NAME, None)} + } + #[inline] + pub fn unk_missing_field(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(WeaponTemplate::VT_UNK_MISSING_FIELD, Some(0)).unwrap()} + } + #[inline] + pub fn base_property(&self) -> Option<&'a Property> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(WeaponTemplate::VT_BASE_PROPERTY, None)} + } + #[inline] + pub fn rand_property(&self) -> Option<&'a Property> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(WeaponTemplate::VT_RAND_PROPERTY, None)} + } + #[inline] + pub fn star_limit(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(WeaponTemplate::VT_STAR_LIMIT, Some(0)).unwrap()} + } + #[inline] + pub fn exp_recycle(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(WeaponTemplate::VT_EXP_RECYCLE, Some(0)).unwrap()} + } + #[inline] + pub fn weapon_script_config(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(WeaponTemplate::VT_WEAPON_SCRIPT_CONFIG, None)} + } + #[inline] + pub fn weapon_ui_model(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(WeaponTemplate::VT_WEAPON_UI_MODEL, None)} + } + #[inline] + pub fn unk_1(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(WeaponTemplate::VT_UNK_1, Some(0)).unwrap()} + } + #[inline] + pub fn unk_missing_field_2(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(WeaponTemplate::VT_UNK_MISSING_FIELD_2, Some(0)).unwrap()} + } + #[inline] + pub fn unk_weapon_path(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(WeaponTemplate::VT_UNK_WEAPON_PATH, None)} + } + #[inline] + pub fn unk_missing_field_3(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(WeaponTemplate::VT_UNK_MISSING_FIELD_3, Some(0)).unwrap()} + } + #[inline] + pub fn refine_initial(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(WeaponTemplate::VT_REFINE_INITIAL, Some(0)).unwrap()} + } + #[inline] + pub fn refine_limit(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(WeaponTemplate::VT_REFINE_LIMIT, Some(0)).unwrap()} + } + #[inline] + pub fn unk_missing_field_4(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(WeaponTemplate::VT_UNK_MISSING_FIELD_4, Some(0)).unwrap()} + } + #[inline] + pub fn unk_missing_field_5(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(WeaponTemplate::VT_UNK_MISSING_FIELD_5, Some(0)).unwrap()} + } + #[inline] + pub fn unk_string_with_values(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(WeaponTemplate::VT_UNK_STRING_WITH_VALUES, None)} + } + #[inline] + pub fn unk_missing_field_6(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(WeaponTemplate::VT_UNK_MISSING_FIELD_6, Some(0)).unwrap()} + } + #[inline] + pub fn unk_2(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(WeaponTemplate::VT_UNK_2, Some(0)).unwrap()} + } + #[inline] + pub fn weapon_desc(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(WeaponTemplate::VT_WEAPON_DESC, None)} + } + #[inline] + pub fn weapon_release_tag(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(WeaponTemplate::VT_WEAPON_RELEASE_TAG, None)} + } + #[inline] + pub fn unk_empty_string(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(WeaponTemplate::VT_UNK_EMPTY_STRING, None)} + } + #[inline] + pub fn avatar_id(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(WeaponTemplate::VT_AVATAR_ID, Some(0)).unwrap()} + } + #[inline] + pub fn weapon_comment(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(WeaponTemplate::VT_WEAPON_COMMENT, None)} + } + #[inline] + pub fn refine_costs(&self) -> Option> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>(WeaponTemplate::VT_REFINE_COSTS, None)} + } + #[inline] + pub fn unk_3(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(WeaponTemplate::VT_UNK_3, Some(0)).unwrap()} + } +} + +impl flatbuffers::Verifiable for WeaponTemplate<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::("item_id", Self::VT_ITEM_ID, false)? + .visit_field::>("weapon_name", Self::VT_WEAPON_NAME, false)? + .visit_field::("unk_missing_field", Self::VT_UNK_MISSING_FIELD, false)? + .visit_field::("base_property", Self::VT_BASE_PROPERTY, false)? + .visit_field::("rand_property", Self::VT_RAND_PROPERTY, false)? + .visit_field::("star_limit", Self::VT_STAR_LIMIT, false)? + .visit_field::("exp_recycle", Self::VT_EXP_RECYCLE, false)? + .visit_field::>("weapon_script_config", Self::VT_WEAPON_SCRIPT_CONFIG, false)? + .visit_field::>("weapon_ui_model", Self::VT_WEAPON_UI_MODEL, false)? + .visit_field::("unk_1", Self::VT_UNK_1, false)? + .visit_field::("unk_missing_field_2", Self::VT_UNK_MISSING_FIELD_2, false)? + .visit_field::>("unk_weapon_path", Self::VT_UNK_WEAPON_PATH, false)? + .visit_field::("unk_missing_field_3", Self::VT_UNK_MISSING_FIELD_3, false)? + .visit_field::("refine_initial", Self::VT_REFINE_INITIAL, false)? + .visit_field::("refine_limit", Self::VT_REFINE_LIMIT, false)? + .visit_field::("unk_missing_field_4", Self::VT_UNK_MISSING_FIELD_4, false)? + .visit_field::("unk_missing_field_5", Self::VT_UNK_MISSING_FIELD_5, false)? + .visit_field::>("unk_string_with_values", Self::VT_UNK_STRING_WITH_VALUES, false)? + .visit_field::("unk_missing_field_6", Self::VT_UNK_MISSING_FIELD_6, false)? + .visit_field::("unk_2", Self::VT_UNK_2, false)? + .visit_field::>("weapon_desc", Self::VT_WEAPON_DESC, false)? + .visit_field::>("weapon_release_tag", Self::VT_WEAPON_RELEASE_TAG, false)? + .visit_field::>("unk_empty_string", Self::VT_UNK_EMPTY_STRING, false)? + .visit_field::("avatar_id", Self::VT_AVATAR_ID, false)? + .visit_field::>("weapon_comment", Self::VT_WEAPON_COMMENT, false)? + .visit_field::>>("refine_costs", Self::VT_REFINE_COSTS, false)? + .visit_field::("unk_3", Self::VT_UNK_3, false)? + .finish(); + Ok(()) + } +} +pub struct WeaponTemplateArgs<'a> { + pub item_id: u32, + pub weapon_name: Option>, + pub unk_missing_field: i32, + pub base_property: Option<&'a Property>, + pub rand_property: Option<&'a Property>, + pub star_limit: u32, + pub exp_recycle: i32, + pub weapon_script_config: Option>, + pub weapon_ui_model: Option>, + pub unk_1: i32, + pub unk_missing_field_2: i32, + pub unk_weapon_path: Option>, + pub unk_missing_field_3: i32, + pub refine_initial: u32, + pub refine_limit: u32, + pub unk_missing_field_4: i32, + pub unk_missing_field_5: i32, + pub unk_string_with_values: Option>, + pub unk_missing_field_6: i32, + pub unk_2: i32, + pub weapon_desc: Option>, + pub weapon_release_tag: Option>, + pub unk_empty_string: Option>, + pub avatar_id: u32, + pub weapon_comment: Option>, + pub refine_costs: Option>>, + pub unk_3: i32, +} +impl<'a> Default for WeaponTemplateArgs<'a> { + #[inline] + fn default() -> Self { + WeaponTemplateArgs { + item_id: 0, + weapon_name: None, + unk_missing_field: 0, + base_property: None, + rand_property: None, + star_limit: 0, + exp_recycle: 0, + weapon_script_config: None, + weapon_ui_model: None, + unk_1: 0, + unk_missing_field_2: 0, + unk_weapon_path: None, + unk_missing_field_3: 0, + refine_initial: 0, + refine_limit: 0, + unk_missing_field_4: 0, + unk_missing_field_5: 0, + unk_string_with_values: None, + unk_missing_field_6: 0, + unk_2: 0, + weapon_desc: None, + weapon_release_tag: None, + unk_empty_string: None, + avatar_id: 0, + weapon_comment: None, + refine_costs: None, + unk_3: 0, + } + } +} + +pub struct WeaponTemplateBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> WeaponTemplateBuilder<'a, 'b, A> { + #[inline] + pub fn add_item_id(&mut self, item_id: u32) { + self.fbb_.push_slot::(WeaponTemplate::VT_ITEM_ID, item_id, 0); + } + #[inline] + pub fn add_weapon_name(&mut self, weapon_name: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(WeaponTemplate::VT_WEAPON_NAME, weapon_name); + } + #[inline] + pub fn add_unk_missing_field(&mut self, unk_missing_field: i32) { + self.fbb_.push_slot::(WeaponTemplate::VT_UNK_MISSING_FIELD, unk_missing_field, 0); + } + #[inline] + pub fn add_base_property(&mut self, base_property: &Property) { + self.fbb_.push_slot_always::<&Property>(WeaponTemplate::VT_BASE_PROPERTY, base_property); + } + #[inline] + pub fn add_rand_property(&mut self, rand_property: &Property) { + self.fbb_.push_slot_always::<&Property>(WeaponTemplate::VT_RAND_PROPERTY, rand_property); + } + #[inline] + pub fn add_star_limit(&mut self, star_limit: u32) { + self.fbb_.push_slot::(WeaponTemplate::VT_STAR_LIMIT, star_limit, 0); + } + #[inline] + pub fn add_exp_recycle(&mut self, exp_recycle: i32) { + self.fbb_.push_slot::(WeaponTemplate::VT_EXP_RECYCLE, exp_recycle, 0); + } + #[inline] + pub fn add_weapon_script_config(&mut self, weapon_script_config: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(WeaponTemplate::VT_WEAPON_SCRIPT_CONFIG, weapon_script_config); + } + #[inline] + pub fn add_weapon_ui_model(&mut self, weapon_ui_model: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(WeaponTemplate::VT_WEAPON_UI_MODEL, weapon_ui_model); + } + #[inline] + pub fn add_unk_1(&mut self, unk_1: i32) { + self.fbb_.push_slot::(WeaponTemplate::VT_UNK_1, unk_1, 0); + } + #[inline] + pub fn add_unk_missing_field_2(&mut self, unk_missing_field_2: i32) { + self.fbb_.push_slot::(WeaponTemplate::VT_UNK_MISSING_FIELD_2, unk_missing_field_2, 0); + } + #[inline] + pub fn add_unk_weapon_path(&mut self, unk_weapon_path: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(WeaponTemplate::VT_UNK_WEAPON_PATH, unk_weapon_path); + } + #[inline] + pub fn add_unk_missing_field_3(&mut self, unk_missing_field_3: i32) { + self.fbb_.push_slot::(WeaponTemplate::VT_UNK_MISSING_FIELD_3, unk_missing_field_3, 0); + } + #[inline] + pub fn add_refine_initial(&mut self, refine_initial: u32) { + self.fbb_.push_slot::(WeaponTemplate::VT_REFINE_INITIAL, refine_initial, 0); + } + #[inline] + pub fn add_refine_limit(&mut self, refine_limit: u32) { + self.fbb_.push_slot::(WeaponTemplate::VT_REFINE_LIMIT, refine_limit, 0); + } + #[inline] + pub fn add_unk_missing_field_4(&mut self, unk_missing_field_4: i32) { + self.fbb_.push_slot::(WeaponTemplate::VT_UNK_MISSING_FIELD_4, unk_missing_field_4, 0); + } + #[inline] + pub fn add_unk_missing_field_5(&mut self, unk_missing_field_5: i32) { + self.fbb_.push_slot::(WeaponTemplate::VT_UNK_MISSING_FIELD_5, unk_missing_field_5, 0); + } + #[inline] + pub fn add_unk_string_with_values(&mut self, unk_string_with_values: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(WeaponTemplate::VT_UNK_STRING_WITH_VALUES, unk_string_with_values); + } + #[inline] + pub fn add_unk_missing_field_6(&mut self, unk_missing_field_6: i32) { + self.fbb_.push_slot::(WeaponTemplate::VT_UNK_MISSING_FIELD_6, unk_missing_field_6, 0); + } + #[inline] + pub fn add_unk_2(&mut self, unk_2: i32) { + self.fbb_.push_slot::(WeaponTemplate::VT_UNK_2, unk_2, 0); + } + #[inline] + pub fn add_weapon_desc(&mut self, weapon_desc: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(WeaponTemplate::VT_WEAPON_DESC, weapon_desc); + } + #[inline] + pub fn add_weapon_release_tag(&mut self, weapon_release_tag: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(WeaponTemplate::VT_WEAPON_RELEASE_TAG, weapon_release_tag); + } + #[inline] + pub fn add_unk_empty_string(&mut self, unk_empty_string: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(WeaponTemplate::VT_UNK_EMPTY_STRING, unk_empty_string); + } + #[inline] + pub fn add_avatar_id(&mut self, avatar_id: u32) { + self.fbb_.push_slot::(WeaponTemplate::VT_AVATAR_ID, avatar_id, 0); + } + #[inline] + pub fn add_weapon_comment(&mut self, weapon_comment: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(WeaponTemplate::VT_WEAPON_COMMENT, weapon_comment); + } + #[inline] + pub fn add_refine_costs(&mut self, refine_costs: flatbuffers::WIPOffset>) { + self.fbb_.push_slot_always::>(WeaponTemplate::VT_REFINE_COSTS, refine_costs); + } + #[inline] + pub fn add_unk_3(&mut self, unk_3: i32) { + self.fbb_.push_slot::(WeaponTemplate::VT_UNK_3, unk_3, 0); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> WeaponTemplateBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + WeaponTemplateBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for WeaponTemplate<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("WeaponTemplate"); + ds.field("item_id", &self.item_id()); + ds.field("weapon_name", &self.weapon_name()); + ds.field("unk_missing_field", &self.unk_missing_field()); + ds.field("base_property", &self.base_property()); + ds.field("rand_property", &self.rand_property()); + ds.field("star_limit", &self.star_limit()); + ds.field("exp_recycle", &self.exp_recycle()); + ds.field("weapon_script_config", &self.weapon_script_config()); + ds.field("weapon_ui_model", &self.weapon_ui_model()); + ds.field("unk_1", &self.unk_1()); + ds.field("unk_missing_field_2", &self.unk_missing_field_2()); + ds.field("unk_weapon_path", &self.unk_weapon_path()); + ds.field("unk_missing_field_3", &self.unk_missing_field_3()); + ds.field("refine_initial", &self.refine_initial()); + ds.field("refine_limit", &self.refine_limit()); + ds.field("unk_missing_field_4", &self.unk_missing_field_4()); + ds.field("unk_missing_field_5", &self.unk_missing_field_5()); + ds.field("unk_string_with_values", &self.unk_string_with_values()); + ds.field("unk_missing_field_6", &self.unk_missing_field_6()); + ds.field("unk_2", &self.unk_2()); + ds.field("weapon_desc", &self.weapon_desc()); + ds.field("weapon_release_tag", &self.weapon_release_tag()); + ds.field("unk_empty_string", &self.unk_empty_string()); + ds.field("avatar_id", &self.avatar_id()); + ds.field("weapon_comment", &self.weapon_comment()); + ds.field("refine_costs", &self.refine_costs()); + ds.field("unk_3", &self.unk_3()); + ds.finish() + } +} +pub enum WeaponTemplateTbOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct WeaponTemplateTb<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for WeaponTemplateTb<'a> { + type Inner = WeaponTemplateTb<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> WeaponTemplateTb<'a> { + pub const VT_DATA: flatbuffers::VOffsetT = 4; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + WeaponTemplateTb { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args WeaponTemplateTbArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = WeaponTemplateTbBuilder::new(_fbb); + if let Some(x) = args.data { builder.add_data(x); } + builder.finish() + } + + + #[inline] + pub fn data(&self) -> Option>>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(WeaponTemplateTb::VT_DATA, None)} + } +} + +impl flatbuffers::Verifiable for WeaponTemplateTb<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::>>>("data", Self::VT_DATA, false)? + .finish(); + Ok(()) + } +} +pub struct WeaponTemplateTbArgs<'a> { + pub data: Option>>>>, +} +impl<'a> Default for WeaponTemplateTbArgs<'a> { + #[inline] + fn default() -> Self { + WeaponTemplateTbArgs { + data: None, + } + } +} + +pub struct WeaponTemplateTbBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> WeaponTemplateTbBuilder<'a, 'b, A> { + #[inline] + pub fn add_data(&mut self, data: flatbuffers::WIPOffset>>>) { + self.fbb_.push_slot_always::>(WeaponTemplateTb::VT_DATA, data); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> WeaponTemplateTbBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + WeaponTemplateTbBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for WeaponTemplateTb<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("WeaponTemplateTb"); + ds.field("data", &self.data()); + ds.finish() + } +} diff --git a/lib/config/gen_flatbuffers/yorozuya_level_template_generated.rs b/lib/config/gen_flatbuffers/yorozuya_level_template_generated.rs new file mode 100644 index 0000000..24d5645 --- /dev/null +++ b/lib/config/gen_flatbuffers/yorozuya_level_template_generated.rs @@ -0,0 +1,358 @@ +// automatically generated by the FlatBuffers compiler, do not modify + + +// @generated + +use core::mem; +use core::cmp::Ordering; + +extern crate flatbuffers; +use self::flatbuffers::{EndianScalar, Follow}; + +pub enum YorozuyaLevelTemplateOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct YorozuyaLevelTemplate<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for YorozuyaLevelTemplate<'a> { + type Inner = YorozuyaLevelTemplate<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> YorozuyaLevelTemplate<'a> { + pub const VT_LEVEL: flatbuffers::VOffsetT = 4; + pub const VT_EXPERIENCE: flatbuffers::VOffsetT = 6; + pub const VT_REWARD_ID: flatbuffers::VOffsetT = 8; + pub const VT_UNK_1: flatbuffers::VOffsetT = 10; + pub const VT_UNK_2: flatbuffers::VOffsetT = 12; + pub const VT_UNK_3: flatbuffers::VOffsetT = 14; + pub const VT_UNK_4: flatbuffers::VOffsetT = 16; + pub const VT_UNK_5: flatbuffers::VOffsetT = 18; + pub const VT_UNK_6: flatbuffers::VOffsetT = 20; + pub const VT_UNK_7: flatbuffers::VOffsetT = 22; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + YorozuyaLevelTemplate { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args YorozuyaLevelTemplateArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = YorozuyaLevelTemplateBuilder::new(_fbb); + if let Some(x) = args.unk_7 { builder.add_unk_7(x); } + if let Some(x) = args.unk_6 { builder.add_unk_6(x); } + if let Some(x) = args.unk_5 { builder.add_unk_5(x); } + if let Some(x) = args.unk_4 { builder.add_unk_4(x); } + if let Some(x) = args.unk_3 { builder.add_unk_3(x); } + if let Some(x) = args.unk_2 { builder.add_unk_2(x); } + builder.add_unk_1(args.unk_1); + builder.add_reward_id(args.reward_id); + builder.add_experience(args.experience); + builder.add_level(args.level); + builder.finish() + } + + + #[inline] + pub fn level(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(YorozuyaLevelTemplate::VT_LEVEL, Some(0)).unwrap()} + } + #[inline] + pub fn experience(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(YorozuyaLevelTemplate::VT_EXPERIENCE, Some(0)).unwrap()} + } + #[inline] + pub fn reward_id(&self) -> u32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(YorozuyaLevelTemplate::VT_REWARD_ID, Some(0)).unwrap()} + } + #[inline] + pub fn unk_1(&self) -> i32 { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::(YorozuyaLevelTemplate::VT_UNK_1, Some(0)).unwrap()} + } + #[inline] + pub fn unk_2(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(YorozuyaLevelTemplate::VT_UNK_2, None)} + } + #[inline] + pub fn unk_3(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(YorozuyaLevelTemplate::VT_UNK_3, None)} + } + #[inline] + pub fn unk_4(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(YorozuyaLevelTemplate::VT_UNK_4, None)} + } + #[inline] + pub fn unk_5(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(YorozuyaLevelTemplate::VT_UNK_5, None)} + } + #[inline] + pub fn unk_6(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(YorozuyaLevelTemplate::VT_UNK_6, None)} + } + #[inline] + pub fn unk_7(&self) -> Option<&'a str> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>(YorozuyaLevelTemplate::VT_UNK_7, None)} + } +} + +impl flatbuffers::Verifiable for YorozuyaLevelTemplate<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::("level", Self::VT_LEVEL, false)? + .visit_field::("experience", Self::VT_EXPERIENCE, false)? + .visit_field::("reward_id", Self::VT_REWARD_ID, false)? + .visit_field::("unk_1", Self::VT_UNK_1, false)? + .visit_field::>("unk_2", Self::VT_UNK_2, false)? + .visit_field::>("unk_3", Self::VT_UNK_3, false)? + .visit_field::>("unk_4", Self::VT_UNK_4, false)? + .visit_field::>("unk_5", Self::VT_UNK_5, false)? + .visit_field::>("unk_6", Self::VT_UNK_6, false)? + .visit_field::>("unk_7", Self::VT_UNK_7, false)? + .finish(); + Ok(()) + } +} +pub struct YorozuyaLevelTemplateArgs<'a> { + pub level: u32, + pub experience: u32, + pub reward_id: u32, + pub unk_1: i32, + pub unk_2: Option>, + pub unk_3: Option>, + pub unk_4: Option>, + pub unk_5: Option>, + pub unk_6: Option>, + pub unk_7: Option>, +} +impl<'a> Default for YorozuyaLevelTemplateArgs<'a> { + #[inline] + fn default() -> Self { + YorozuyaLevelTemplateArgs { + level: 0, + experience: 0, + reward_id: 0, + unk_1: 0, + unk_2: None, + unk_3: None, + unk_4: None, + unk_5: None, + unk_6: None, + unk_7: None, + } + } +} + +pub struct YorozuyaLevelTemplateBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> YorozuyaLevelTemplateBuilder<'a, 'b, A> { + #[inline] + pub fn add_level(&mut self, level: u32) { + self.fbb_.push_slot::(YorozuyaLevelTemplate::VT_LEVEL, level, 0); + } + #[inline] + pub fn add_experience(&mut self, experience: u32) { + self.fbb_.push_slot::(YorozuyaLevelTemplate::VT_EXPERIENCE, experience, 0); + } + #[inline] + pub fn add_reward_id(&mut self, reward_id: u32) { + self.fbb_.push_slot::(YorozuyaLevelTemplate::VT_REWARD_ID, reward_id, 0); + } + #[inline] + pub fn add_unk_1(&mut self, unk_1: i32) { + self.fbb_.push_slot::(YorozuyaLevelTemplate::VT_UNK_1, unk_1, 0); + } + #[inline] + pub fn add_unk_2(&mut self, unk_2: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(YorozuyaLevelTemplate::VT_UNK_2, unk_2); + } + #[inline] + pub fn add_unk_3(&mut self, unk_3: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(YorozuyaLevelTemplate::VT_UNK_3, unk_3); + } + #[inline] + pub fn add_unk_4(&mut self, unk_4: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(YorozuyaLevelTemplate::VT_UNK_4, unk_4); + } + #[inline] + pub fn add_unk_5(&mut self, unk_5: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(YorozuyaLevelTemplate::VT_UNK_5, unk_5); + } + #[inline] + pub fn add_unk_6(&mut self, unk_6: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(YorozuyaLevelTemplate::VT_UNK_6, unk_6); + } + #[inline] + pub fn add_unk_7(&mut self, unk_7: flatbuffers::WIPOffset<&'b str>) { + self.fbb_.push_slot_always::>(YorozuyaLevelTemplate::VT_UNK_7, unk_7); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> YorozuyaLevelTemplateBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + YorozuyaLevelTemplateBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for YorozuyaLevelTemplate<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("YorozuyaLevelTemplate"); + ds.field("level", &self.level()); + ds.field("experience", &self.experience()); + ds.field("reward_id", &self.reward_id()); + ds.field("unk_1", &self.unk_1()); + ds.field("unk_2", &self.unk_2()); + ds.field("unk_3", &self.unk_3()); + ds.field("unk_4", &self.unk_4()); + ds.field("unk_5", &self.unk_5()); + ds.field("unk_6", &self.unk_6()); + ds.field("unk_7", &self.unk_7()); + ds.finish() + } +} +pub enum YorozuyaLevelTemplateTbOffset {} +#[derive(Copy, Clone, PartialEq)] + +pub struct YorozuyaLevelTemplateTb<'a> { + pub _tab: flatbuffers::Table<'a>, +} + +impl<'a> flatbuffers::Follow<'a> for YorozuyaLevelTemplateTb<'a> { + type Inner = YorozuyaLevelTemplateTb<'a>; + #[inline] + unsafe fn follow(buf: &'a [u8], loc: usize) -> Self::Inner { + Self { _tab: flatbuffers::Table::new(buf, loc) } + } +} + +impl<'a> YorozuyaLevelTemplateTb<'a> { + pub const VT_DATA: flatbuffers::VOffsetT = 4; + + #[inline] + pub unsafe fn init_from_table(table: flatbuffers::Table<'a>) -> Self { + YorozuyaLevelTemplateTb { _tab: table } + } + #[allow(unused_mut)] + pub fn create<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr, A: flatbuffers::Allocator + 'bldr>( + _fbb: &'mut_bldr mut flatbuffers::FlatBufferBuilder<'bldr, A>, + args: &'args YorozuyaLevelTemplateTbArgs<'args> + ) -> flatbuffers::WIPOffset> { + let mut builder = YorozuyaLevelTemplateTbBuilder::new(_fbb); + if let Some(x) = args.data { builder.add_data(x); } + builder.finish() + } + + + #[inline] + pub fn data(&self) -> Option>>> { + // Safety: + // Created from valid Table for this object + // which contains a valid value in this slot + unsafe { self._tab.get::>>>(YorozuyaLevelTemplateTb::VT_DATA, None)} + } +} + +impl flatbuffers::Verifiable for YorozuyaLevelTemplateTb<'_> { + #[inline] + fn run_verifier( + v: &mut flatbuffers::Verifier, pos: usize + ) -> Result<(), flatbuffers::InvalidFlatbuffer> { + use self::flatbuffers::Verifiable; + v.visit_table(pos)? + .visit_field::>>>("data", Self::VT_DATA, false)? + .finish(); + Ok(()) + } +} +pub struct YorozuyaLevelTemplateTbArgs<'a> { + pub data: Option>>>>, +} +impl<'a> Default for YorozuyaLevelTemplateTbArgs<'a> { + #[inline] + fn default() -> Self { + YorozuyaLevelTemplateTbArgs { + data: None, + } + } +} + +pub struct YorozuyaLevelTemplateTbBuilder<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> { + fbb_: &'b mut flatbuffers::FlatBufferBuilder<'a, A>, + start_: flatbuffers::WIPOffset, +} +impl<'a: 'b, 'b, A: flatbuffers::Allocator + 'a> YorozuyaLevelTemplateTbBuilder<'a, 'b, A> { + #[inline] + pub fn add_data(&mut self, data: flatbuffers::WIPOffset>>>) { + self.fbb_.push_slot_always::>(YorozuyaLevelTemplateTb::VT_DATA, data); + } + #[inline] + pub fn new(_fbb: &'b mut flatbuffers::FlatBufferBuilder<'a, A>) -> YorozuyaLevelTemplateTbBuilder<'a, 'b, A> { + let start = _fbb.start_table(); + YorozuyaLevelTemplateTbBuilder { + fbb_: _fbb, + start_: start, + } + } + #[inline] + pub fn finish(self) -> flatbuffers::WIPOffset> { + let o = self.fbb_.end_table(self.start_); + flatbuffers::WIPOffset::new(o.value()) + } +} + +impl core::fmt::Debug for YorozuyaLevelTemplateTb<'_> { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut ds = f.debug_struct("YorozuyaLevelTemplateTb"); + ds.field("data", &self.data()); + ds.finish() + } +} diff --git a/lib/config/src/condition.rs b/lib/config/src/condition.rs new file mode 100644 index 0000000..7658b16 --- /dev/null +++ b/lib/config/src/condition.rs @@ -0,0 +1,163 @@ +use std::{collections::HashMap, str::FromStr}; + +use num_enum::TryFromPrimitive; + +use crate::{ConditionConfigTemplate, EQuestState}; + +#[derive(Debug)] +pub enum Condition { + HasExecutedHollowEvent { + event_ids: Vec, + target_num: u32, + }, + QuestState { + id: u32, + state: EQuestState, + }, + ClientSystemOpen { + id: u32, + }, + FinishNewbie { + group_id: u32, + }, + SignedNewsStandToday, +} + +#[derive(Debug, PartialEq, Eq, TryFromPrimitive)] +#[repr(u32)] +pub enum ConditionType { + HasExecutedHollowEvent = 3003, + QuestStateGreaterOrEqual = 3010, + ClientSystemOpen = 3012, + QuestStateEqual = 3014, + FinishNewbie = 3080, + SignedNewsStandToday = 3114, +} + +#[derive(thiserror::Error, Debug)] +pub enum ConditionParseError { + #[error("unknown condition type: {0}")] + UnknownType(u32), + #[error("missing condition argument: {0}")] + MissingArgument(&'static str), + #[error("invalid condition argument format: {0}")] + InvalidArgumentFormat(&'static str), +} + +impl Condition { + pub fn parse_from_template( + tmpl: &ConditionConfigTemplate, + ) -> Result { + type Error = ConditionParseError; + + let args = Self::parse_args_string(tmpl.args().unwrap_or_default()); + + Ok( + match ConditionType::try_from(tmpl.statis_type()) + .map_err(|_| Error::UnknownType(tmpl.statis_type()))? + { + ConditionType::HasExecutedHollowEvent => Condition::HasExecutedHollowEvent { + event_ids: (0..Self::named_arg_count(&args, "EventID")?) + .map(|i| Self::get_argument(&args, "EventID", i)) + .collect::>()?, + target_num: tmpl.target_num(), + }, + ConditionType::QuestStateEqual | ConditionType::QuestStateGreaterOrEqual => { + Condition::QuestState { + id: Self::get_argument(&args, "ID", 0)?, + state: EQuestState::try_from(Self::get_argument::(&args, "State", 0)?) + .unwrap(), + } + } + ConditionType::ClientSystemOpen => Condition::ClientSystemOpen { + id: Self::get_argument(&args, "ID", 0)?, + }, + ConditionType::FinishNewbie => Condition::FinishNewbie { + group_id: Self::get_argument(&args, "GroupID", 0)?, + }, + ConditionType::SignedNewsStandToday => Condition::SignedNewsStandToday, + }, + ) + } + + fn get_argument( + args: &HashMap<&str, Vec<&str>>, + name: &'static str, + i: usize, + ) -> Result { + args.get(name) + .ok_or(ConditionParseError::MissingArgument(name))? + .get(i) + .unwrap() + .parse::() + .map_err(|_| ConditionParseError::InvalidArgumentFormat(name)) + } + + fn named_arg_count( + args: &HashMap<&str, Vec<&str>>, + name: &'static str, + ) -> Result { + Ok(args + .get(name) + .ok_or(ConditionParseError::MissingArgument(name))? + .len()) + } + + fn parse_args_string(args: &str) -> HashMap<&str, Vec<&str>> { + let mut map = HashMap::new(); + + for entry in args.split('|') { + if let [name, value] = entry.split(':').collect::>().as_slice() { + map.entry(*name).or_insert_with(Vec::new).push(*value); + } + } + + map + } +} + +pub enum BoundConditions { + None, + One(i32), + All(Vec), + Oneof(Vec), +} + +impl BoundConditions { + pub fn parse(s: &str) -> Self { + if s.is_empty() { + return Self::None; + } + + if s.contains('|') { + Self::Oneof(s.split('|').map(|s| s.parse().unwrap()).collect()) + } else if s.contains('&') { + Self::All(s.split('&').map(|s| s.parse().unwrap()).collect()) + } else { + Self::One(s.parse().unwrap()) + } + } +} + +#[derive(thiserror::Error, Debug)] +#[error("failed to load condition {0}, cause: {1}")] +pub struct LoadConditionsError(i32, ConditionParseError); + +pub fn load_all_conditions<'tb>( + table: impl Iterator>, +) -> Result, LoadConditionsError> { + let mut map = HashMap::new(); + + for tmpl in table { + match Condition::parse_from_template(&tmpl) { + Ok(condition) => { + map.insert(tmpl.condition_id(), condition); + } + Err(ConditionParseError::UnknownType(_)) => (), + Err(ConditionParseError::MissingArgument(_)) => (), + Err(err) => return Err(LoadConditionsError(tmpl.condition_id(), err)), + } + } + + Ok(map) +} diff --git a/lib/config/src/enums.rs b/lib/config/src/enums.rs new file mode 100644 index 0000000..9ac7260 --- /dev/null +++ b/lib/config/src/enums.rs @@ -0,0 +1,25 @@ +use num_enum::{IntoPrimitive, TryFromPrimitive}; +use serde::Deserialize; + +#[derive( + Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Deserialize, TryFromPrimitive, IntoPrimitive, +)] +#[repr(i32)] +pub enum EQuestState { + Unlocked = 0, + InProgress = 1, + ToFinish = 2, + Finished = 3, +} + +#[derive( + Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Deserialize, TryFromPrimitive, IntoPrimitive, +)] +#[repr(u32)] +pub enum ETimePeriodType { + Morning = 1, + Afternoon = 2, + Evening = 3, + Night = 4, + Now = 99, +} diff --git a/lib/config/src/level_process/action.rs b/lib/config/src/level_process/action.rs new file mode 100644 index 0000000..6331990 --- /dev/null +++ b/lib/config/src/level_process/action.rs @@ -0,0 +1,441 @@ +use std::collections::{HashMap, HashSet}; + +use num_enum::IntoPrimitive; +use serde::Deserialize; +use vivian_codegen::action; + +use crate::{EQuestState, ETimePeriodType, util::nap_expr_parser::NapExpr}; + +use super::{ConfigNodeState, ConfigNodeVisible, ConfigPredicate}; + +#[action] +pub struct ActionOpenUI { + #[serde(rename = "UI")] + pub ui: String, + #[serde(default)] + pub args: i32, + #[serde(default)] + #[serde(rename = "StoreTemplateID")] + pub store_template_id: i32, +} + +#[action] +pub struct ActionSwitchSection { + #[serde(rename = "SectionID")] + pub section_id: u32, + pub transform: String, + pub camera_y: u32, + pub camera_x: u32, +} + +#[action] +pub struct ActionResetEvent {} + +#[action] +pub struct ActionCreateNpc { + #[serde(rename = "TagID")] + #[serde(default)] + pub tag_id: u32, + #[serde(rename = "TagIDs")] + #[serde(default)] + pub tag_ids: Vec, +} + +#[derive(Deserialize, Debug)] +#[serde(rename_all = "PascalCase")] +pub struct ConfigInteractScale { + pub x: f64, + pub y: f64, + pub z: f64, + #[serde(default)] + pub w: f64, + #[serde(default)] + pub r: f64, +} + +#[action] +pub struct ActionChangeInteract { + #[serde(rename = "InteractID")] + pub interact_id: u32, + #[serde(rename = "TagIDs")] + pub tag_ids: Vec, + #[serde(deserialize_with = "deserialize_participators")] + pub participators: HashMap, + pub interact_shape: String, + pub interact_scale: ConfigInteractScale, +} + +#[action] +pub struct ActionSetMainCityObjectState { + #[serde(deserialize_with = "deserialize_map_int_int")] + pub object_state: HashMap, +} + +#[action] +pub struct ActionForceRefresh {} + +#[action] +pub struct ActionShowTeleportUi { + pub black_mask: bool, +} + +#[action] +pub struct ActionPerform { + #[serde(rename = "PerformID")] + #[serde(default)] + pub perform_id: u32, + #[serde(rename = "PerformID2")] + #[serde(default)] + pub perform_id_2: u32, + #[serde(rename = "PerformID3")] + #[serde(default)] + pub perform_id_3: u32, + #[serde(default)] + pub black_mask: bool, + #[serde(default)] + pub black_mask_fade_out: bool, + #[serde(default)] + pub black_mask_fade_out_2: bool, + #[serde(default)] + #[serde(rename = "AvatarID")] + pub avatar_id: u32, + #[serde(default)] + #[serde(rename = "NpcID")] + pub npc_id: u32, + #[serde(default)] + #[serde(deserialize_with = "deserialize_participators")] + pub participators: HashMap, +} + +#[action] +pub struct ActionShowTip { + #[serde(rename = "TipID")] + pub tip_id: u32, +} + +#[action] +pub struct ConfigShowTip { + #[serde(rename = "TipID")] + pub tip_id: u32, +} + +#[action] +pub struct ActionSetQuestPhase { + pub target_phase: EQuestState, + #[serde(rename = "QuestID")] + pub quest_id: u32, +} + +#[action] +pub struct ActionChangeBackSceneInfo { + #[serde(rename = "SectionID")] + pub section_id: u32, + pub transform: String, +} + +#[action] +pub struct ActionTriggerInteract { + #[serde(rename = "TagID")] + pub tag_id: u32, + #[serde(rename = "InteractID")] + pub interact_id: u32, +} + +#[action] +pub struct ActionDownloadFullResource {} + +#[action] +pub struct ActionRemoveMainCityQuestInteract {} + +#[action] +pub struct ActionRemoveMainCityQuestNpc {} + +#[action] +pub struct ConfigUnlockHollowQuest { + #[serde(rename = "QuestID")] + pub quest_id: u32, +} + +#[derive(Deserialize, Debug, Default)] +#[serde(rename_all = "PascalCase")] +pub struct OpenDialogParam { + pub unk_open_dialog_flag_1: bool, + pub start_texture_sheet: String, + pub unk_open_dialog_flag_2: bool, + pub loop_texture_sheet: String, + pub end_texture_sheet: String, + pub unk_open_dialog_flag_3: bool, +} + +#[action] +pub struct ConfigOpenDialog { + pub open_event: bool, + pub camera_move: bool, + #[serde(default)] + pub unk_open_dialog: bool, + #[serde(default)] + pub open_param: OpenDialogParam, +} + +#[action] +pub struct ConfigLogText { + pub messages: Vec, + pub log_title: String, + pub voicelines: Vec, +} + +#[action] +pub struct ConfigCloseDialog { + pub camera_move: bool, + pub need_reset_center: bool, +} + +#[derive(Debug, Clone, Copy, Deserialize, IntoPrimitive)] +#[repr(i32)] +pub enum CameraMove { + TriggerPosition = 0, + Player = 1, + Center = 2, + CustomBound = 3, + Back = 4, +} + +#[derive(Debug, Clone, Copy, Deserialize, IntoPrimitive)] +#[repr(i32)] +pub enum HollowPositionOffsetType { + Relative = 0, + EventPos = 1, + Absolute = 2, + HollowNpcPos = 3, +} + +#[derive(Debug, Clone, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct ConfigVector2Int { + pub x: i32, + pub y: i32, +} + +#[action] +pub struct ConfigCameraMoveV2 { + pub stretch_key: String, + pub r#type: CameraMove, + pub position_offset_type: HollowPositionOffsetType, + #[serde(default)] + pub position_offset_x: String, + #[serde(default)] + pub position_offset_y: String, + #[serde(default)] + pub radius_x: String, + #[serde(default)] + pub radius_y: String, + #[serde(default)] + pub bound_index_x: Option, + #[serde(default)] + pub bound_index_y: Option, + #[serde(default)] + pub freeze_z: bool, + #[serde(default)] + pub parallel: bool, +} + +#[action] +pub struct ConfigWaitSeconds { + pub wait_time: f32, +} + +#[action] +pub struct ConfigShowPopWindow { + #[serde(rename = "PopID")] + pub pop_id: i32, + pub show_directly: bool, +} + +#[action] +pub struct ConfigCameraStretch { + #[serde(default)] + pub stretch_key: String, + #[serde(default)] + pub shake_key: String, + pub r#type: CameraMove, + #[serde(default)] + pub parallel: bool, +} + +#[action] +pub struct ConfigPlayAnim { + #[serde(rename = "AnimID")] + pub anim_id: u32, + pub indexes: Vec, + #[serde(default)] + pub looping: bool, +} + +#[action] +pub struct ConfigStopAnim { + pub indexes: Vec, +} + +#[action] +pub struct ConfigEventModification { + pub x: i32, + pub y: i32, + pub position: HollowPositionOffsetType, + pub radius: i32, + pub modification_num: i32, + pub modification_type: i32, + #[serde(rename = "TargetEventID")] + #[serde(default)] + pub target_event_id: Vec, + #[serde(default)] + pub target_event_type: u32, + #[serde(rename = "EventID")] + pub event_id: Vec, + pub event_state: ConfigNodeState, + pub visible_state: ConfigNodeVisible, +} + +#[action] +pub struct ConfigPushWithDirection { + pub direction: DynamicInteger, +} + +#[action] +pub struct ConfigWaitTipsEnd { + #[serde(rename = "TipsID")] + pub tips_id: Vec, +} + +#[action] +pub struct ConfigSetMapState { + pub x: i32, + pub y: i32, + pub position: HollowPositionOffsetType, + pub radius: i32, + pub count: i32, + #[serde(default)] + pub from_visible_state: HashSet, + #[serde(default)] + pub to_visible_state: Vec, + #[serde(default)] + pub from_state: HashSet, + #[serde(default)] + pub to_state: Vec, +} + +#[action] +pub struct ConfigReward { + #[serde(rename = "OnceRewardID")] + pub once_reward_id: DynamicInteger, +} + +#[action] +pub struct ConfigAddItem { + #[serde(rename = "ItemID")] + pub item_id: u32, + pub count: DynamicInteger, +} + +#[derive(Deserialize, Debug)] +#[serde(untagged)] +pub enum DynamicInteger { + Static(i32), + Dynamic(#[serde(deserialize_with = "deserialize_expr")] NapExpr), +} + +#[action] +pub struct ConfigBreakDialogAnim {} + +#[derive(Deserialize, Debug)] +#[serde(rename_all = "PascalCase")] +pub struct ConfigDialogChoiceDetail { + pub option_text: String, + #[serde(rename = "OptionID")] + pub option_id: String, + pub option_text_2: String, + #[serde(rename = "ChoiceID")] + pub choice_id: u32, + #[serde(rename = "UID")] + pub uid: u32, +} + +#[action] +pub struct ConfigMakeDialogChoice { + pub title: String, + pub description: String, + pub question_description: String, + pub choice_details: Vec, +} + +#[action] +pub struct ConfigSetHollowVariable { + pub key: String, + pub value: i32, +} + +#[action] +pub struct ConfigFinishHollow {} + +#[action] +pub struct ActionSetBGM { + #[serde(rename = "MainCityMusicID")] + pub main_city_music_id: u32, +} + +#[action] +pub struct ActionSetMainCityTime { + pub time_period: ETimePeriodType, +} + +#[action] +pub struct ActionEnterHollowQuest { + #[serde(rename = "HollowID")] + pub hollow_id: u32, +} + +fn deserialize_participators<'de, D>(deserializer: D) -> Result, D::Error> +where + D: serde::de::Deserializer<'de>, +{ + use serde::de; + let str_map = HashMap::::deserialize(deserializer)?; + + str_map + .into_iter() + .map(|(str_key, value)| match str_key.parse() { + Ok(int_key) => Ok((int_key, value)), + Err(_) => Err(de::Error::invalid_value( + de::Unexpected::Str(&str_key), + &"u32", + )), + }) + .collect::, _>>() +} + +fn deserialize_map_int_int<'de, D>(deserializer: D) -> Result, D::Error> +where + D: serde::de::Deserializer<'de>, +{ + use serde::de; + let str_map = HashMap::::deserialize(deserializer)?; + + str_map + .into_iter() + .map(|(str_key, value)| match str_key.parse() { + Ok(int_key) => Ok((int_key, value)), + Err(_) => Err(de::Error::invalid_value( + de::Unexpected::Str(&str_key), + &"i32", + )), + }) + .collect::, _>>() +} + +fn deserialize_expr<'de, D>(deserializer: D) -> Result +where + D: serde::de::Deserializer<'de>, +{ + let str_map = String::deserialize(deserializer)?; + + NapExpr::parse(&str_map).map_err(serde::de::Error::custom) +} diff --git a/lib/config/src/level_process/chessboard.rs b/lib/config/src/level_process/chessboard.rs new file mode 100644 index 0000000..c122e6d --- /dev/null +++ b/lib/config/src/level_process/chessboard.rs @@ -0,0 +1,130 @@ +use num_enum::{IntoPrimitive, TryFromPrimitive}; +use serde::Deserialize; + +use super::ConfigVector2Int; + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct HollowChessboardConfig { + #[serde(rename = "ID")] + pub id: u32, + pub default_player_pos: ConfigVector2Int, + pub default_section_index: usize, + pub sections: Vec, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct HollowSectionConfig { + pub grids: Vec, + pub events: Vec, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct HollowGridConfig { + pub position: ConfigVector2Int, + pub node_state: ConfigNodeState, + pub node_visible: ConfigNodeVisible, + pub grid_links: Vec, + pub grid_flags: Vec, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct HollowEventConfig { + pub owned_by: ConfigEventOwner, + #[serde(rename = "EventID")] + pub event_id: u32, + pub priority: i32, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "PascalCase")] +#[serde(tag = "$type")] +pub enum ConfigEventOwner { + #[serde(rename = "Share.CEventOwnerGlobal")] + Global, + #[serde(rename = "Share.CEventOwnerGrid")] + #[serde(rename_all = "PascalCase")] + Grid { position: ConfigVector2Int }, +} + +#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy, Deserialize, IntoPrimitive)] +#[repr(i32)] +pub enum ConfigNodeState { + All = 0, + Locked = 1, + Unlocked = 2, + Finished = 3, + ShowEvent = 4, + Door = 5, + Brighten = 6, + Guide = 7, + Target = 8, + BrightenOnlyVisible = 9, + Unstable = 10, + Empty = 11, + LockedWithStamina = 14, + UnEmpty = 15, +} + +#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy, Deserialize, IntoPrimitive)] +#[repr(i32)] +pub enum ConfigNodeVisible { + All = 0, + Visible = 1, + VisibleAtGridAround = 2, + VisibleByTriggerEvent = 3, + TemporaryVisibleAtAround = 4, + Blocked = 5, +} + +#[derive(Debug, PartialEq, Eq, Clone, Copy, Deserialize, IntoPrimitive)] +#[repr(i32)] +pub enum ConfigGridLink { + Up = 1, + Down = 2, + Right = 4, + Left = 8, +} + +#[derive(Debug, PartialEq, Eq, Clone, Copy, Deserialize, IntoPrimitive, TryFromPrimitive)] +#[repr(i32)] +pub enum ConfigGridDir { + Down = 1, + Left = 2, + Right = 3, + Up = 4, +} + +#[derive(Debug, PartialEq, Eq, Clone, Copy, Deserialize, IntoPrimitive)] +#[repr(i32)] +pub enum ConfigGridFlag { + Core = 1, + CanMove = 2, + Travelled = 4, + ShowEventType = 8, + ShowEventId = 16, + CanTriggerEvent = 32, + Visible = 64, + VisibleAtGridAround = 128, + VisibleByTriggerEvent = 256, + SyncToClient = 512, + Door = 1024, + CanTriggerMultiTimes = 2048, + TemporaryVisibleAtAround = 4096, + Unlocked = 8192, + Brighten = 16384, + Guide = 32768, + Target = 65536, + BrightenOnlyVisible = 131072, + Unstable = 262144, + Empty = 524288, + Blocked = 1048576, + Gdhpcijjoah = 2097152, + Blblfbdlbbo = 4194304, + Nihgbijfiae = 8388608, + Ebjcidkjnki = 16777216, + Jgjdbhllmai = 33554432, +} diff --git a/lib/config/src/level_process/mod.rs b/lib/config/src/level_process/mod.rs new file mode 100644 index 0000000..07804af --- /dev/null +++ b/lib/config/src/level_process/mod.rs @@ -0,0 +1,317 @@ +use std::{collections::HashMap, fmt, fs::File, str::FromStr}; + +use serde::{Deserialize, Deserializer, de::DeserializeOwned}; + +mod action; +mod chessboard; +mod predicate; + +pub use action::*; +pub use chessboard::*; +pub use predicate::*; + +#[derive(Deserialize, Debug, Clone, PartialEq, Eq, Hash)] +pub enum SectionEvent { + OnAdd, + OnBeforeEnter, + OnEnter, + OnInteract, + OnStart, + #[serde(untagged)] + Custom(String), +} + +impl fmt::Display for SectionEvent { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::Custom(name) => write!(f, "{name}"), + other => fmt::Debug::fmt(other, f), + } + } +} + +impl FromStr for SectionEvent { + type Err = (); + + fn from_str(s: &str) -> Result { + Ok(match s { + "OnAdd" => Self::OnAdd, + "OnBeforeEnter" => Self::OnBeforeEnter, + "OnEnter" => Self::OnEnter, + "OnInteract" => Self::OnInteract, + "OnStart" => Self::OnStart, + custom => Self::Custom(custom.to_string()), + }) + } +} + +#[derive(Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct MainCitySectionConfig { + #[serde(default)] + pub unity_scene_path: String, + #[serde(default)] + pub born_transform: String, + pub section_progress: SectionEventGraphConfig, +} + +#[derive(Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct MainCityConfig { + #[serde(rename = "ID")] + pub id: u32, + #[serde(rename = "DefaultSectionID")] + #[serde(default)] + pub default_section_id: u32, + #[serde(deserialize_with = "deserialize_section_map")] + pub sections: HashMap, +} + +#[derive(Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct SectionEventGraphConfig { + #[serde(rename = "ID")] + pub id: u32, + #[serde(default)] + pub specials: HashMap, + #[serde(default)] + pub on_add: Vec, + #[serde(default)] + pub on_before_enter: Vec, + #[serde(default)] + pub on_enter: Vec, + #[serde(default)] + pub on_exit: Vec, + #[serde(default)] + pub events: HashMap, +} + +#[derive(Deserialize)] +#[serde(rename_all = "PascalCase")] +pub struct ConfigEvent { + #[serde(rename = "ID")] + #[serde(default)] + pub id: u32, + pub actions: Vec, +} + +trait ConfigID { + fn config_id(&self) -> u32; +} + +impl ConfigID for SectionEventGraphConfig { + fn config_id(&self) -> u32 { + self.id + } +} + +impl ConfigID for MainCityConfig { + fn config_id(&self) -> u32 { + self.id + } +} + +macro_rules! actions { + ($($name:ident: $tag:literal),*) => { + #[derive(Deserialize)] + #[serde(tag = "$type")] + pub enum ConfigEventAction { + $(#[serde(rename = $tag)] + $name($name),)* + } + + impl ConfigEventAction { + pub fn id(&self) -> u32 { + match self { + $(Self::$name(cfg) => cfg.id),* + } + } + + pub fn predicates(&self) -> &[ConfigPredicate] { + match self { + $(Self::$name(cfg) => &cfg.predicates),* + } + } + } + }; +} + +actions! { + ActionResetEvent: "Share.CActionResetEventCfg", + ActionOpenUI: "Share.CActionOpenUI", + ActionSwitchSection: "Share.CActionSwitchSection", + ActionCreateNpc: "Share.CActionCreateNPCCfg", + ActionChangeInteract: "Share.CActionChangeInteractCfg", + ActionSetMainCityObjectState: "Share.CActionSetMainCityObjectState", + ActionForceRefresh: "Share.CActionForceRefreshCfg", + ActionPerform: "Share.CActionPerformCfg", + ActionShowTip: "Share.CActionShowTip", + ActionSetQuestPhase: "Share.CActionSetQuestPhaseCfg", + ActionRemoveMainCityQuestInteract: "Share.CActionRemoveMainCityQuestInteractCfg", + ActionRemoveMainCityQuestNpc: "Share.CActionRemoveMainCityQuestNpcCfg", + ActionChangeBackSceneInfo: "Share.CActionChangeBackSceneInfoCfg", + ActionTriggerInteract: "Share.CActionTriggerInteractCfg", + ActionDownloadFullResource: "Share.CActionDownloadFullResourceCfg", + ActionShowTeleportUi: "Share.CActionShowTeleportUI", + ActionSetBGM: "Share.CActionSetBGM", + ActionSetMainCityTime: "Share.CActionSetMainCityTime", + ActionEnterHollowQuest: "Share.CActionEnterHollowQuest", + ConfigUnlockHollowQuest: "Share.CConfigUnlockHollowQuest", + // Hollow + ConfigWaitSeconds: "Share.CConfigWaitSeconds", + ConfigOpenDialog: "Share.CConfigOpenDialog", + ConfigLogText: "Share.CConfigLogText", + ConfigCloseDialog: "Share.CConfigCloseDialog", + ConfigCameraMoveV2: "Share.CConfigCameraMoveV2", + ConfigShowTip: "Share.CConfigShowTip", + ConfigShowPopWindow: "Share.CConfigShowPopWindow", + ConfigCameraStretch: "Share.CConfigCameraStretch", + ConfigPlayAnim: "Share.CConfigPlayAnim", + ConfigStopAnim: "Share.CConfigStopAnim", + ConfigEventModification: "Share.CConfigEventModification", + ConfigPushWithDirection: "Share.CConfigPushWithDirection", + ConfigWaitTipsEnd: "Share.CConfigWaitTipsEnd", + ConfigSetMapState: "Share.CConfigSetMapState", + ConfigReward: "Share.CConfigReward", + ConfigAddItem: "Share.CConfigAddItem", + ConfigBreakDialogAnim: "Share.CConfigBreakDialogAnim", + ConfigMakeDialogChoice: "Share.CConfigMakeDialogChoice", + ConfigSetHollowVariable: "Share.CConfigSetHollowVariable", + ConfigFinishHollow: "Share.CConfigFinishHollow" +} + +pub struct EventGraphCollection { + pub main_city_config: MainCityConfig, + pub main_city_interacts: HashMap, + pub quest_events: HashMap, + pub hollow_events: HashMap, +} + +#[derive(thiserror::Error, Debug)] +pub enum EventGraphCollectionLoadError { + #[error("failed to open directory {0}, cause: {1}")] + DirOpen(String, std::io::Error), + #[error("failed to read asset file at {0}, cause: {1}")] + Read(String, std::io::Error), + #[error("JSON config at {0} is invalid, cause: {1}")] + InvalidConfig(String, serde_json5::Error), + #[error("duplicate event graph config id: {0}")] + DuplicateGraphID(u32), +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub enum GraphReference { + MainCitySection(u32), + Interact(u32), + Quest(u32), + HollowEvent(u32), +} + +impl GraphReference { + pub fn id(&self) -> u32 { + match self { + GraphReference::MainCitySection(id) => *id, + GraphReference::Interact(id) => *id, + GraphReference::Quest(id) => *id, + GraphReference::HollowEvent(id) => *id, + } + } +} + +impl EventGraphCollection { + pub fn load(level_process_path: &str) -> Result { + type Error = EventGraphCollectionLoadError; + + let main_city_interacts = + Self::load_events_from_dir(&format!("{level_process_path}/MainCity/Interact"))?; + + let quest_events = + Self::load_events_from_dir(&format!("{level_process_path}/MainCity/Quest"))?; + + let hollow_events = + Self::load_events_from_dir(&format!("{level_process_path}/Hollow/Event"))?; + + let main_city_config_path = format!("{level_process_path}/MainCity/MainCity_1.json"); + let mut main_city_config = match File::open(&main_city_config_path) { + Ok(file) => file, + Err(err) => return Err(Error::Read(main_city_config_path, err)), + }; + + let main_city_config = serde_json5::from_reader(&mut main_city_config) + .map_err(|err| Error::InvalidConfig(main_city_config_path, err))?; + + Ok(Self { + main_city_config, + main_city_interacts, + quest_events, + hollow_events, + }) + } + + fn load_events_from_dir( + path: &str, + ) -> Result, EventGraphCollectionLoadError> { + type Error = EventGraphCollectionLoadError; + + let dir = std::fs::read_dir(path).map_err(|err| Error::DirOpen(path.to_string(), err))?; + let mut map = HashMap::new(); + + for entry in dir.flatten() { + let mut file = File::open(entry.path()) + .map_err(|err| Error::Read(entry.path().to_string_lossy().to_string(), err))?; + + let config = serde_json5::from_reader::<_, T>(&mut file).map_err(|err| { + Error::InvalidConfig(entry.path().to_string_lossy().to_string(), err) + })?; + + let config_id = config.config_id(); + if map.insert(config_id, config).is_some() { + return Err(Error::DuplicateGraphID(config_id)); + } + } + + Ok(map) + } + + pub fn get( + &self, + graph_ref: GraphReference, + cur_section_id: u32, + ) -> Option<&SectionEventGraphConfig> { + use GraphReference::*; + + match graph_ref { + MainCitySection(id) => self + .main_city_config + .sections + .get(&id) + .map(|section| §ion.section_progress), + Interact(id) => self.main_city_interacts.get(&id), + Quest(id) => self.quest_events.get(&id).and_then(|cfg| { + cfg.sections + .get(&cur_section_id) + .map(|cfg| &cfg.section_progress) + }), + HollowEvent(id) => self.hollow_events.get(&id), + } + } +} + +fn deserialize_section_map<'de, D>(d: D) -> Result, D::Error> +where + D: Deserializer<'de>, +{ + use serde::de; + let str_map = HashMap::::deserialize(d)?; + + str_map + .into_iter() + .map(|(str_key, value)| match str_key.parse() { + Ok(int_key) => Ok((int_key, value)), + Err(_) => Err(de::Error::invalid_value( + de::Unexpected::Str(&str_key), + &"u32", + )), + }) + .collect::, _>>() +} diff --git a/lib/config/src/level_process/predicate.rs b/lib/config/src/level_process/predicate.rs new file mode 100644 index 0000000..5fa2bbd --- /dev/null +++ b/lib/config/src/level_process/predicate.rs @@ -0,0 +1,46 @@ +use serde::Deserialize; + +#[derive(Deserialize, Debug)] +#[serde(tag = "$type")] +pub enum ConfigPredicate { + #[serde(rename = "Share.CConfigEventByMainCharacter")] + ConfigEventByMainCharacter(ConfigEventByMainCharacter), + #[serde(rename = "Share.CConfigEventByHollowVariable")] + ConfigEventByHollowVariable(ConfigEventByHollowVariable), + #[serde(rename = "Share.CConfigEventByChoiceServer")] + ConfigEventByChoiceServer(ConfigEventByChoiceServer), +} + +#[derive(Deserialize, Debug)] +#[serde(rename_all = "PascalCase")] +pub struct ConfigEventByMainCharacter { + pub compare_type: ECompareFunction, + #[serde(rename = "AvatarID")] + pub avatar_id: u32, +} + +#[derive(Deserialize, Debug)] +#[serde(rename_all = "PascalCase")] +pub struct ConfigEventByHollowVariable { + pub key: String, + pub compare_type: ECompareFunction, + pub count: i32, +} + +#[derive(Deserialize, Debug)] +#[serde(rename_all = "PascalCase")] +pub struct ConfigEventByChoiceServer { + #[serde(rename = "UID")] + pub uid: u32, + pub compare_type: ECompareFunction, +} + +#[derive(Deserialize, Debug, Clone, Copy)] +pub enum ECompareFunction { + Greater, + GreaterEqual, + Equal, + Less, + LessEqual, + NotEqual, +} diff --git a/lib/config/src/lib.rs b/lib/config/src/lib.rs new file mode 100644 index 0000000..9c3e2a7 --- /dev/null +++ b/lib/config/src/lib.rs @@ -0,0 +1,11 @@ +mod condition; +mod enums; +mod level_process; +mod template_tb; +mod util; + +pub use condition::*; +pub use enums::*; +pub use level_process::*; +pub use template_tb::*; +pub use util::nap_expr_parser::{NapArithmeticOp, NapExpr}; diff --git a/lib/config/src/template_tb.rs b/lib/config/src/template_tb.rs new file mode 100644 index 0000000..7e88a6f --- /dev/null +++ b/lib/config/src/template_tb.rs @@ -0,0 +1,100 @@ +#[derive(thiserror::Error, Debug)] +pub enum TemplateCollectionError { + #[error("failed to read asset file at {0}, cause: {1}")] + Read(String, std::io::Error), + #[error("TemplateTb at {0} is invalid, cause: {1}")] + InvalidFlatbuffer(String, flatbuffers::InvalidFlatbuffer), +} + +file_cfg! { + AvatarBaseTemplate; + AvatarBattleTemplate; + AvatarLevelTemplate; + AvatarLevelAdvanceTemplate; + AvatarPassiveSkillTemplate; + AvatarSkinBaseTemplate; + ItemTemplate; + WeaponTemplate; + WeaponLevelTemplate; + WeaponStarTemplate; + EquipmentTemplate; + EquipmentSuitTemplate; + EquipmentLevelTemplate; + UnlockConfigTemplate; + SectionConfigTemplate; + HollowConfigTemplate; + MainCityObjectTemplate; + QuestConfigTemplate; + MainCityQuestTemplate; + HollowQuestTemplate; + TraningQuestTemplate; + BattleGroupConfigTemplate; + OnceRewardTemplate; + ConditionConfigTemplate; + NewbieGroupTemplate; + YorozuyaLevelTemplate; + PostGirlConfigTemplate; + HollowEventTemplate; + HollowChallengeTemplate; +} + +macro_rules! file_cfg { + ($($name:ident;)*) => { + ::paste::paste!($( + #[allow(dead_code, unused_imports, unsafe_op_in_unsafe_fn, non_snake_case)] + mod [<$name:snake>] { + include!(concat!( + "../gen_flatbuffers/", + stringify!([<$name:snake _generated>]), + ".rs" + )); + } + + #[allow(ambiguous_glob_reexports)] + pub use [<$name:snake>]::*; + )*); + + ::paste::paste!{ + pub struct TemplateCollection { + $([<$name:snake _data>]: Vec,)* + }} + + impl TemplateCollection { + ::paste::paste!{ + pub fn load(filecfg_path: &str) -> Result { + use ::flatbuffers::Verifiable; + + let verifier_options = ::flatbuffers::VerifierOptions::default(); + Ok(Self { + $( + [<$name:snake _data>]: { + let filename_hash = ::xxhash_rust::const_xxh64::xxh64(stringify!([<$name:lower tb>]).as_bytes(), 0); + let file_path = format!("{filecfg_path}/{filename_hash}"); + + let data = match std::fs::read(&file_path) { + Ok(data) => data, + Err(err) => return Err(TemplateCollectionError::Read(file_path, err)), + }; + + let mut verifier = ::flatbuffers::Verifier::new(&verifier_options, &data); + match ::flatbuffers::ForwardsUOffset::<[<$name Tb>]>::run_verifier(&mut verifier, 0) { + Ok(()) => data, + Err(err) => return Err(TemplateCollectionError::InvalidFlatbuffer(file_path, err)), + } + }, + )* + }) + } + + $( + pub fn [<$name:snake _tb>](&self) -> impl Iterator> { + // SAFETY: flatbuffer integrity is already verified + unsafe { ::flatbuffers::root_unchecked::<[<$name Tb>]>(&self.[<$name:snake _data>]).data().unwrap().iter() } + } + )* + } + } + }; +} + +use file_cfg; diff --git a/lib/config/src/util/mod.rs b/lib/config/src/util/mod.rs new file mode 100644 index 0000000..cb191c2 --- /dev/null +++ b/lib/config/src/util/mod.rs @@ -0,0 +1 @@ +pub mod nap_expr_parser; diff --git a/lib/config/src/util/nap_expr_parser.rs b/lib/config/src/util/nap_expr_parser.rs new file mode 100644 index 0000000..154253a --- /dev/null +++ b/lib/config/src/util/nap_expr_parser.rs @@ -0,0 +1,251 @@ +use std::{collections::VecDeque, iter::Peekable, str::Chars}; + +use itertools::Itertools; + +#[derive(Debug, Clone, PartialEq)] +pub enum NapToken { + Word(String), + Number(f64), + Arithmetic(NapArithmeticOp), + OpenParen, + CloseParen, + Comma, +} + +#[derive(Debug, Clone, PartialEq)] +pub enum NapArithmeticOp { + Add, + Sub, + Mul, + Div, +} + +#[derive(thiserror::Error, Debug)] +pub enum TokenTreeParseError { + #[error("failed to parse expression \"{1}\", cause: {0}")] + Lexer(LexError, String), +} + +#[derive(Debug)] +pub enum NapExpr { + Call(String, Vec), + UnaryOp(NapArithmeticOp, Box), + BinOp(NapArithmeticOp, Box, Box), + Identifier(String), + Number(f64), +} + +#[derive(PartialEq, Eq)] +pub enum ExprEndType { + None, + CloseParen, + Comma, +} + +impl NapExpr { + pub fn parse(expression: &str) -> Result { + let mut tokens = VecDeque::new(); + let mut lexer = NapLexer::new(expression); + + while let Some(token) = lexer + .next() + .map_err(|err| TokenTreeParseError::Lexer(err, expression.to_string()))? + { + tokens.push_back(token); + } + + Ok(Self::parse_inner(&mut tokens, false).0) + } + + fn parse_inner(tokens: &mut VecDeque, short_operand: bool) -> (Self, ExprEndType) { + let mut collected = VecDeque::new(); + let mut expr_stack = Vec::new(); + + while let Some(token) = tokens.pop_front() { + match token { + NapToken::Arithmetic(op) => { + if short_operand && (!collected.is_empty() || !expr_stack.is_empty()) { + match expr_stack.pop() { + None if collected.is_empty() => (), + Some(prev_expr) => { + tokens.push_front(NapToken::Arithmetic(op)); + return (prev_expr, ExprEndType::None); + } + None => { + tokens.push_front(NapToken::Arithmetic(op)); + return NapExpr::parse_inner(&mut collected, false); + } + } + } + + let lhs = match expr_stack.pop() { + Some(prev_expr) => Some(prev_expr), + None if collected.is_empty() => None, + None => Some(NapExpr::parse_inner(&mut collected, false).0), + }; + + match lhs { + Some(lhs) => expr_stack.push(NapExpr::BinOp( + op.clone(), + Box::new(lhs), + Box::new( + NapExpr::parse_inner( + tokens, + matches!(op, NapArithmeticOp::Mul | NapArithmeticOp::Div), + ) + .0, + ), + )), + None => { + assert!(matches!(op, NapArithmeticOp::Add | NapArithmeticOp::Sub)); + + expr_stack.push(NapExpr::UnaryOp( + op, + Box::new(NapExpr::parse_inner(tokens, true).0), + )) + } + } + } + NapToken::OpenParen => { + let (mut inner, mut end) = NapExpr::parse_inner(tokens, false); + if let Some(NapToken::Word(name)) = collected.pop_back() { + let mut args = Vec::new(); + + loop { + args.push(inner); + if end != ExprEndType::Comma { + if let Some(t) = tokens.pop_front() { + if t != NapToken::Comma { + tokens.push_front(t); + break; + } + } else { + break; + } + } + + (inner, end) = NapExpr::parse_inner(tokens, false); + } + + expr_stack.push(NapExpr::Call(name.clone(), args)); + } else { + expr_stack.push(inner); + } + } + NapToken::Comma => { + return ( + match expr_stack.pop() { + Some(prev_expr) => prev_expr, + None => NapExpr::parse_inner(&mut collected, false).0, + }, + ExprEndType::Comma, + ); + } + NapToken::CloseParen => { + return ( + match expr_stack.pop() { + Some(prev_expr) => prev_expr, + None => NapExpr::parse_inner(&mut collected, false).0, + }, + ExprEndType::CloseParen, + ); + } + _ => collected.push_back(token), + } + } + + ( + if let Some(prev_expr) = expr_stack.pop() { + prev_expr + } else if collected.len() == 1 { + match collected.remove(0).unwrap() { + NapToken::Word(word) => Self::Identifier(word), + NapToken::Number(num) => Self::Number(num), + _ => unreachable!(), + } + } else { + panic!("{collected:?}"); + }, + ExprEndType::None, + ) + } +} + +struct NapLexer<'c> { + chars: Peekable>, +} + +enum LexerState { + Word, + Number, +} + +#[derive(thiserror::Error, Debug)] +pub enum LexError { + #[error("unexpected character at the beginning of token: {0}")] + UnexpectedChar(char), +} + +impl<'c> NapLexer<'c> { + pub fn new(expression: &'c str) -> Self { + Self { + chars: expression.chars().peekable(), + } + } + + pub fn next(&mut self) -> Result, LexError> { + let Some(next_char) = self.chars.peek() else { + return Ok(None); + }; + + let state = match next_char { + 'A'..='Z' | 'a'..='z' | '_' => LexerState::Word, + '0'..='9' => LexerState::Number, + '+' | '-' | '*' | '/' => { + return Ok(Some(NapToken::Arithmetic(NapArithmeticOp::new( + self.chars.next().unwrap(), + )))); + } + '(' => { + self.chars.next(); + return Ok(Some(NapToken::OpenParen)); + } + ')' => { + self.chars.next(); + return Ok(Some(NapToken::CloseParen)); + } + ',' => { + self.chars.next(); + return Ok(Some(NapToken::Comma)); + } + unexpected => return Err(LexError::UnexpectedChar(*unexpected)), + }; + + Ok(Some(match state { + LexerState::Word => NapToken::Word( + self.chars + .take_while_ref(|c| matches!(c, 'A'..='Z' | 'a'..='z' | '_' | '0'..='9')) + .collect(), + ), + LexerState::Number => NapToken::Number( + self.chars + .take_while_ref(|c| matches!(c, '0'..='9' | '.')) + .collect::() + .parse() + .unwrap(), + ), + })) + } +} + +impl NapArithmeticOp { + fn new(c: char) -> Self { + match c { + '+' => Self::Add, + '-' => Self::Sub, + '*' => Self::Mul, + '/' => Self::Div, + _ => unreachable!(), + } + } +} diff --git a/lib/encryption/Cargo.toml b/lib/encryption/Cargo.toml new file mode 100644 index 0000000..c051928 --- /dev/null +++ b/lib/encryption/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "vivian-encryption" +edition = "2024" +version.workspace = true + +[dependencies] +rsa.workspace = true +rand.workspace = true +rand_mt.workspace = true + +serde.workspace = true +base64-simd.workspace = true + +thiserror.workspace = true diff --git a/lib/encryption/src/config.rs b/lib/encryption/src/config.rs new file mode 100644 index 0000000..6898d86 --- /dev/null +++ b/lib/encryption/src/config.rs @@ -0,0 +1,45 @@ +use serde::{Deserialize, Deserializer}; + +use crate::{ec::MiHoYoEC, mersenne_twister}; + +#[derive(Deserialize)] +pub struct RsaVersion { + #[serde(deserialize_with = "from_base64")] + pub client_public_key: Vec, + #[serde(deserialize_with = "from_base64")] + pub server_private_key: Vec, +} + +pub struct ScrambledKey { + pub seed: String, + pub xorpad: [u8; 4096], +} + +pub fn from_base64<'de, D>(deserializer: D) -> Result, D::Error> +where + D: Deserializer<'de>, +{ + let s = ::deserialize(deserializer)?; + base64_simd::STANDARD + .decode_to_vec(s) + .map_err(serde::de::Error::custom) +} + +impl<'de> Deserialize<'de> for ScrambledKey { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let seed = ::deserialize(deserializer)?; + let seed_buf = base64_simd::STANDARD + .decode_to_vec(&seed) + .map_err(serde::de::Error::custom)?; + + let scrambler = MiHoYoEC::try_from(seed_buf.as_ref()).map_err(serde::de::Error::custom)?; + + Ok(Self { + seed, + xorpad: mersenne_twister::generate_xorpad(scrambler.scramble(), false), + }) + } +} diff --git a/lib/encryption/src/ec/aes_custom.rs b/lib/encryption/src/ec/aes_custom.rs new file mode 100644 index 0000000..894dea4 --- /dev/null +++ b/lib/encryption/src/ec/aes_custom.rs @@ -0,0 +1,178 @@ +#![allow(unused)] + +use super::tables::{ + LOOKUP_G2, LOOKUP_G3, LOOKUP_G9, LOOKUP_G11, LOOKUP_G13, LOOKUP_G14, LOOKUP_RCON, LOOKUP_SBOX, + LOOKUP_SBOX_INV, SHIFT_ROWS_TABLE, SHIFT_ROWS_TABLE_INV, +}; + +fn xorr(a: &mut [u8], b: &[u8], n: usize) { + (0..n).for_each(|i| a[i] ^= b[i]); +} + +fn xor_round_key(state: &mut [u8], keys: &[u8], round: usize) { + xorr(state, &keys[round * 16..], 16); +} + +fn sub_bytes(a: &mut [u8], n: usize) { + (0..n).for_each(|i| a[i] = LOOKUP_SBOX[a[i] as usize]); +} + +fn sub_bytes_inv(a: &mut [u8], n: usize) { + (0..n).for_each(|i| a[i] = LOOKUP_SBOX_INV[a[i] as usize]); +} + +fn key_schedule_core(a: &mut [u8], i: usize) { + let temp = a[0]; + a[0] = a[1]; + a[1] = a[2]; + a[2] = a[3]; + a[3] = temp; + sub_bytes(a, 4); + a[0] ^= LOOKUP_RCON[i]; +} + +fn oqs_aes128_load_schedule_c(key: &[u8]) -> [u8; 176] { + let mut schedule = [0u8; 176]; + + let mut bytes = 16; + let mut i = 1; + let mut t = [0u8; 4]; + + schedule[0..16].copy_from_slice(key); + + while bytes < 176 { + t.copy_from_slice(&schedule[bytes - 4..]); + key_schedule_core(&mut t, i); + i += 1; + xorr(&mut schedule[bytes..], &t, 4); + schedule[bytes..].copy_from_slice(&t); + bytes += 4; + + for _ in 0..3 { + t.copy_from_slice(&schedule[bytes - 4..]); + xorr(&mut t, &schedule[bytes - 16..], 4); + schedule[bytes..].copy_from_slice(&t); + bytes += 4; + } + } + + schedule +} + +fn shift_rows(state: &mut [u8]) { + let temp = state.to_vec(); + (0..16).for_each(|i| state[i] = temp[SHIFT_ROWS_TABLE[i] as usize]); +} + +fn shift_rows_inv(state: &mut [u8]) { + let temp = state.to_vec(); + (0..16).for_each(|i| state[i] = temp[SHIFT_ROWS_TABLE_INV[i] as usize]); +} + +fn mix_col(state: &mut [u8]) { + let (a0, a1, a2, a3) = (state[0], state[1], state[2], state[3]); + + state[0] = LOOKUP_G2[a0 as usize] ^ LOOKUP_G3[a1 as usize] ^ a2 ^ a3; + state[1] = LOOKUP_G2[a1 as usize] ^ LOOKUP_G3[a2 as usize] ^ a3 ^ a0; + state[2] = LOOKUP_G2[a2 as usize] ^ LOOKUP_G3[a3 as usize] ^ a0 ^ a1; + state[3] = LOOKUP_G2[a3 as usize] ^ LOOKUP_G3[a0 as usize] ^ a1 ^ a2; +} + +fn mix_cols(state: &mut [u8]) { + mix_col(&mut state[0..4]); + mix_col(&mut state[4..8]); + mix_col(&mut state[8..12]); + mix_col(&mut state[12..16]); +} + +fn mix_col_inv(state: &mut [u8]) { + let (a0, a1, a2, a3) = (state[0], state[1], state[2], state[3]); + + state[0] = LOOKUP_G14[a0 as usize] + ^ LOOKUP_G9[a3 as usize] + ^ LOOKUP_G13[a2 as usize] + ^ LOOKUP_G11[a1 as usize]; + state[1] = LOOKUP_G14[a1 as usize] + ^ LOOKUP_G9[a0 as usize] + ^ LOOKUP_G13[a3 as usize] + ^ LOOKUP_G11[a2 as usize]; + state[2] = LOOKUP_G14[a2 as usize] + ^ LOOKUP_G9[a1 as usize] + ^ LOOKUP_G13[a0 as usize] + ^ LOOKUP_G11[a3 as usize]; + state[3] = LOOKUP_G14[a3 as usize] + ^ LOOKUP_G9[a2 as usize] + ^ LOOKUP_G13[a1 as usize] + ^ LOOKUP_G11[a0 as usize]; +} + +fn mix_cols_inv(state: &mut [u8]) { + mix_col_inv(&mut state[0..4]); + mix_col_inv(&mut state[4..8]); + mix_col_inv(&mut state[8..12]); + mix_col_inv(&mut state[12..16]); +} + +fn oqs_aes128_enc_c(plaintext: &[u8], schedule: &[u8], ciphertext: &mut [u8]) { + ciphertext.copy_from_slice(&plaintext[..16]); + xor_round_key(ciphertext, schedule, 0); + + for i in 1..10 { + sub_bytes(ciphertext, 16); + shift_rows(ciphertext); + mix_cols(ciphertext); + xor_round_key(ciphertext, schedule, i); + } + + sub_bytes(ciphertext, 16); + shift_rows(ciphertext); + xor_round_key(ciphertext, schedule, 10); +} + +pub fn oqs_mhy128_enc_c(plaintext: &[u8], schedule: &[u8], ciphertext: &mut [u8]) { + ciphertext.copy_from_slice(&plaintext[..16]); + xor_round_key(ciphertext, schedule, 0); + + for i in 1..10 { + sub_bytes_inv(ciphertext, 16); + shift_rows_inv(ciphertext); + mix_cols_inv(ciphertext); + xor_round_key(ciphertext, schedule, i); + } + + sub_bytes_inv(ciphertext, 16); + shift_rows_inv(ciphertext); + xor_round_key(ciphertext, schedule, 10); +} + +fn oqs_aes128_dec_c(ciphertext: &[u8], schedule: &[u8], plaintext: &mut [u8]) { + plaintext.copy_from_slice(&ciphertext[..16]); + xor_round_key(plaintext, schedule, 10); + shift_rows_inv(plaintext); + sub_bytes_inv(plaintext, 16); + + for i in 0..9 { + xor_round_key(plaintext, schedule, 9 - i); + mix_cols_inv(plaintext); + shift_rows_inv(plaintext); + sub_bytes_inv(plaintext, 16); + } + + xor_round_key(plaintext, schedule, 0); +} + +fn oqs_mhy128_dec_c(ciphertext: &[u8], schedule: &[u8], plaintext: &mut [u8]) { + plaintext.copy_from_slice(&ciphertext[..16]); + xor_round_key(plaintext, schedule, 10); + shift_rows(plaintext); + sub_bytes(plaintext, 16); + + for i in 0..9 { + xor_round_key(plaintext, schedule, 9 - i); + mix_cols(plaintext); + shift_rows(plaintext); + sub_bytes(plaintext, 16); + } + + xor_round_key(plaintext, schedule, 0); +} diff --git a/lib/encryption/src/ec/mod.rs b/lib/encryption/src/ec/mod.rs new file mode 100644 index 0000000..307670a --- /dev/null +++ b/lib/encryption/src/ec/mod.rs @@ -0,0 +1,104 @@ +use tables::AES_XORPAD_TABLE; + +mod aes_custom; +mod tables; + +pub struct MiHoYoEC { + key: [u8; Self::AES_KEY_SIZE], + scrambler_seed: [u8; Self::SCRAMBLER_SEED_SIZE], +} + +impl MiHoYoEC { + pub const AES_KEY_SIZE: usize = 16; + pub const SCRAMBLER_SEED_SIZE: usize = 2048; + pub const MAGIC: u32 = 0x45633262; // "Ec2b" + + pub fn scramble(&self) -> u64 { + const FINAL_XOR: u64 = 0xCEAC3B5A867837AC; + + let scrambled = self + .scrambler_seed + .chunks_exact(8) + .map(|chunk| u64::from_le_bytes(chunk.try_into().unwrap())) + .fold(0xFFFFFFFFFFFFFFFF, |val, i| val ^ i); + + let key_qword_0 = u64::from_le_bytes(self.key[0..8].try_into().unwrap()); + let key_qword_1 = u64::from_le_bytes(self.key[8..16].try_into().unwrap()); + + scrambled ^ key_qword_0 ^ key_qword_1 ^ FINAL_XOR + } +} + +#[derive(thiserror::Error, Debug)] +pub enum FromBytesError { + #[error("unexpected magic number at the start: {0:X}")] + MagicMismatch(u32), + #[error("out of bounds ({0}/{1})")] + OutOfBounds(usize, usize), + #[error("unexpected AES key size: {0}")] + AesKeySizeMismatch(usize), + #[error("unexpected scrambler seed payload size: {0}")] + ScramblerSeedPayloadSizeMismatch(usize), +} + +impl TryFrom<&[u8]> for MiHoYoEC { + type Error = FromBytesError; + + fn try_from(value: &[u8]) -> Result { + const MINIMAL_SIZE: usize = 12; // magic, key size, data size (u32s) + + assert_bounds(MINIMAL_SIZE, value.len())?; + + let magic = u32::from_be_bytes(value[0..4].try_into().unwrap()); + if magic != Self::MAGIC { + return Err(FromBytesError::MagicMismatch(magic)); + } + + let key_size = u32::from_le_bytes(value[4..8].try_into().unwrap()) as usize; + assert_bounds(MINIMAL_SIZE + key_size, value.len())?; + + let payload_size = + u32::from_le_bytes(value[8 + key_size..8 + key_size + 4].try_into().unwrap()) as usize; + assert_bounds(MINIMAL_SIZE + key_size + payload_size, value.len())?; + + let mut key = scramble_aes_key( + value[8..8 + key_size] + .try_into() + .map_err(|_| FromBytesError::AesKeySizeMismatch(key_size))?, + ); + + key.iter_mut() + .zip(tables::KEY_XORPAD_TABLE.iter()) + .for_each(|(a, b)| *a ^= b); + + Ok(Self { + key, + scrambler_seed: value[12 + key_size..12 + key_size + payload_size] + .try_into() + .map_err(|_| FromBytesError::ScramblerSeedPayloadSizeMismatch(payload_size))?, + }) + } +} + +fn scramble_aes_key(key: [u8; MiHoYoEC::AES_KEY_SIZE]) -> [u8; MiHoYoEC::AES_KEY_SIZE] { + let mut round_keys = [0u8; 176]; + for round in 0..11 { + for i in 0..16 { + for j in 0..16 { + let idx = (round << 8) + (i * 16) + j; + round_keys[round * 16 + i] ^= AES_XORPAD_TABLE[1][idx] ^ AES_XORPAD_TABLE[0][idx]; + } + } + } + + let mut chip = [0u8; 16]; + aes_custom::oqs_mhy128_enc_c(&key, &round_keys, &mut chip); + chip +} + +#[inline(always)] +fn assert_bounds(required: usize, actual: usize) -> Result<(), FromBytesError> { + (required <= actual) + .then_some(()) + .ok_or(FromBytesError::OutOfBounds(required, actual)) +} diff --git a/lib/encryption/src/ec/tables.rs b/lib/encryption/src/ec/tables.rs new file mode 100644 index 0000000..477632a --- /dev/null +++ b/lib/encryption/src/ec/tables.rs @@ -0,0 +1,536 @@ +#![allow(unused)] + +pub const SHIFT_ROWS_TABLE: [u8; 16] = [0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, 1, 6, 11]; +pub const SHIFT_ROWS_TABLE_INV: [u8; 16] = [0, 13, 10, 7, 4, 1, 14, 11, 8, 5, 2, 15, 12, 9, 6, 3]; +pub const LOOKUP_RCON: [u8; 16] = [ + 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, +]; +pub const LOOKUP_SBOX: [u8; 256] = [ + 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, + 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, + 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, + 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, + 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, + 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, + 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, + 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, + 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, + 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, + 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, + 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, + 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, + 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, + 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, + 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16, +]; +pub const LOOKUP_SBOX_INV: [u8; 256] = [ + 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, + 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, + 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, + 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, + 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, + 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, + 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, + 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, + 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, + 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, + 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, + 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, + 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, + 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, + 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, + 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d, +]; +pub const LOOKUP_G2: [u8; 256] = [ + 0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0e, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e, + 0x20, 0x22, 0x24, 0x26, 0x28, 0x2a, 0x2c, 0x2e, 0x30, 0x32, 0x34, 0x36, 0x38, 0x3a, 0x3c, 0x3e, + 0x40, 0x42, 0x44, 0x46, 0x48, 0x4a, 0x4c, 0x4e, 0x50, 0x52, 0x54, 0x56, 0x58, 0x5a, 0x5c, 0x5e, + 0x60, 0x62, 0x64, 0x66, 0x68, 0x6a, 0x6c, 0x6e, 0x70, 0x72, 0x74, 0x76, 0x78, 0x7a, 0x7c, 0x7e, + 0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c, 0x8e, 0x90, 0x92, 0x94, 0x96, 0x98, 0x9a, 0x9c, 0x9e, + 0xa0, 0xa2, 0xa4, 0xa6, 0xa8, 0xaa, 0xac, 0xae, 0xb0, 0xb2, 0xb4, 0xb6, 0xb8, 0xba, 0xbc, 0xbe, + 0xc0, 0xc2, 0xc4, 0xc6, 0xc8, 0xca, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde, + 0xe0, 0xe2, 0xe4, 0xe6, 0xe8, 0xea, 0xec, 0xee, 0xf0, 0xf2, 0xf4, 0xf6, 0xf8, 0xfa, 0xfc, 0xfe, + 0x1b, 0x19, 0x1f, 0x1d, 0x13, 0x11, 0x17, 0x15, 0x0b, 0x09, 0x0f, 0x0d, 0x03, 0x01, 0x07, 0x05, + 0x3b, 0x39, 0x3f, 0x3d, 0x33, 0x31, 0x37, 0x35, 0x2b, 0x29, 0x2f, 0x2d, 0x23, 0x21, 0x27, 0x25, + 0x5b, 0x59, 0x5f, 0x5d, 0x53, 0x51, 0x57, 0x55, 0x4b, 0x49, 0x4f, 0x4d, 0x43, 0x41, 0x47, 0x45, + 0x7b, 0x79, 0x7f, 0x7d, 0x73, 0x71, 0x77, 0x75, 0x6b, 0x69, 0x6f, 0x6d, 0x63, 0x61, 0x67, 0x65, + 0x9b, 0x99, 0x9f, 0x9d, 0x93, 0x91, 0x97, 0x95, 0x8b, 0x89, 0x8f, 0x8d, 0x83, 0x81, 0x87, 0x85, + 0xbb, 0xb9, 0xbf, 0xbd, 0xb3, 0xb1, 0xb7, 0xb5, 0xab, 0xa9, 0xaf, 0xad, 0xa3, 0xa1, 0xa7, 0xa5, + 0xdb, 0xd9, 0xdf, 0xdd, 0xd3, 0xd1, 0xd7, 0xd5, 0xcb, 0xc9, 0xcf, 0xcd, 0xc3, 0xc1, 0xc7, 0xc5, + 0xfb, 0xf9, 0xff, 0xfd, 0xf3, 0xf1, 0xf7, 0xf5, 0xeb, 0xe9, 0xef, 0xed, 0xe3, 0xe1, 0xe7, 0xe5, +]; +pub const LOOKUP_G3: [u8; 256] = [ + 0x00, 0x03, 0x06, 0x05, 0x0c, 0x0f, 0x0a, 0x09, 0x18, 0x1b, 0x1e, 0x1d, 0x14, 0x17, 0x12, 0x11, + 0x30, 0x33, 0x36, 0x35, 0x3c, 0x3f, 0x3a, 0x39, 0x28, 0x2b, 0x2e, 0x2d, 0x24, 0x27, 0x22, 0x21, + 0x60, 0x63, 0x66, 0x65, 0x6c, 0x6f, 0x6a, 0x69, 0x78, 0x7b, 0x7e, 0x7d, 0x74, 0x77, 0x72, 0x71, + 0x50, 0x53, 0x56, 0x55, 0x5c, 0x5f, 0x5a, 0x59, 0x48, 0x4b, 0x4e, 0x4d, 0x44, 0x47, 0x42, 0x41, + 0xc0, 0xc3, 0xc6, 0xc5, 0xcc, 0xcf, 0xca, 0xc9, 0xd8, 0xdb, 0xde, 0xdd, 0xd4, 0xd7, 0xd2, 0xd1, + 0xf0, 0xf3, 0xf6, 0xf5, 0xfc, 0xff, 0xfa, 0xf9, 0xe8, 0xeb, 0xee, 0xed, 0xe4, 0xe7, 0xe2, 0xe1, + 0xa0, 0xa3, 0xa6, 0xa5, 0xac, 0xaf, 0xaa, 0xa9, 0xb8, 0xbb, 0xbe, 0xbd, 0xb4, 0xb7, 0xb2, 0xb1, + 0x90, 0x93, 0x96, 0x95, 0x9c, 0x9f, 0x9a, 0x99, 0x88, 0x8b, 0x8e, 0x8d, 0x84, 0x87, 0x82, 0x81, + 0x9b, 0x98, 0x9d, 0x9e, 0x97, 0x94, 0x91, 0x92, 0x83, 0x80, 0x85, 0x86, 0x8f, 0x8c, 0x89, 0x8a, + 0xab, 0xa8, 0xad, 0xae, 0xa7, 0xa4, 0xa1, 0xa2, 0xb3, 0xb0, 0xb5, 0xb6, 0xbf, 0xbc, 0xb9, 0xba, + 0xfb, 0xf8, 0xfd, 0xfe, 0xf7, 0xf4, 0xf1, 0xf2, 0xe3, 0xe0, 0xe5, 0xe6, 0xef, 0xec, 0xe9, 0xea, + 0xcb, 0xc8, 0xcd, 0xce, 0xc7, 0xc4, 0xc1, 0xc2, 0xd3, 0xd0, 0xd5, 0xd6, 0xdf, 0xdc, 0xd9, 0xda, + 0x5b, 0x58, 0x5d, 0x5e, 0x57, 0x54, 0x51, 0x52, 0x43, 0x40, 0x45, 0x46, 0x4f, 0x4c, 0x49, 0x4a, + 0x6b, 0x68, 0x6d, 0x6e, 0x67, 0x64, 0x61, 0x62, 0x73, 0x70, 0x75, 0x76, 0x7f, 0x7c, 0x79, 0x7a, + 0x3b, 0x38, 0x3d, 0x3e, 0x37, 0x34, 0x31, 0x32, 0x23, 0x20, 0x25, 0x26, 0x2f, 0x2c, 0x29, 0x2a, + 0x0b, 0x08, 0x0d, 0x0e, 0x07, 0x04, 0x01, 0x02, 0x13, 0x10, 0x15, 0x16, 0x1f, 0x1c, 0x19, 0x1a, +]; +pub const LOOKUP_G9: [u8; 256] = [ + 0x00, 0x09, 0x12, 0x1b, 0x24, 0x2d, 0x36, 0x3f, 0x48, 0x41, 0x5a, 0x53, 0x6c, 0x65, 0x7e, 0x77, + 0x90, 0x99, 0x82, 0x8b, 0xb4, 0xbd, 0xa6, 0xaf, 0xd8, 0xd1, 0xca, 0xc3, 0xfc, 0xf5, 0xee, 0xe7, + 0x3b, 0x32, 0x29, 0x20, 0x1f, 0x16, 0x0d, 0x04, 0x73, 0x7a, 0x61, 0x68, 0x57, 0x5e, 0x45, 0x4c, + 0xab, 0xa2, 0xb9, 0xb0, 0x8f, 0x86, 0x9d, 0x94, 0xe3, 0xea, 0xf1, 0xf8, 0xc7, 0xce, 0xd5, 0xdc, + 0x76, 0x7f, 0x64, 0x6d, 0x52, 0x5b, 0x40, 0x49, 0x3e, 0x37, 0x2c, 0x25, 0x1a, 0x13, 0x08, 0x01, + 0xe6, 0xef, 0xf4, 0xfd, 0xc2, 0xcb, 0xd0, 0xd9, 0xae, 0xa7, 0xbc, 0xb5, 0x8a, 0x83, 0x98, 0x91, + 0x4d, 0x44, 0x5f, 0x56, 0x69, 0x60, 0x7b, 0x72, 0x05, 0x0c, 0x17, 0x1e, 0x21, 0x28, 0x33, 0x3a, + 0xdd, 0xd4, 0xcf, 0xc6, 0xf9, 0xf0, 0xeb, 0xe2, 0x95, 0x9c, 0x87, 0x8e, 0xb1, 0xb8, 0xa3, 0xaa, + 0xec, 0xe5, 0xfe, 0xf7, 0xc8, 0xc1, 0xda, 0xd3, 0xa4, 0xad, 0xb6, 0xbf, 0x80, 0x89, 0x92, 0x9b, + 0x7c, 0x75, 0x6e, 0x67, 0x58, 0x51, 0x4a, 0x43, 0x34, 0x3d, 0x26, 0x2f, 0x10, 0x19, 0x02, 0x0b, + 0xd7, 0xde, 0xc5, 0xcc, 0xf3, 0xfa, 0xe1, 0xe8, 0x9f, 0x96, 0x8d, 0x84, 0xbb, 0xb2, 0xa9, 0xa0, + 0x47, 0x4e, 0x55, 0x5c, 0x63, 0x6a, 0x71, 0x78, 0x0f, 0x06, 0x1d, 0x14, 0x2b, 0x22, 0x39, 0x30, + 0x9a, 0x93, 0x88, 0x81, 0xbe, 0xb7, 0xac, 0xa5, 0xd2, 0xdb, 0xc0, 0xc9, 0xf6, 0xff, 0xe4, 0xed, + 0x0a, 0x03, 0x18, 0x11, 0x2e, 0x27, 0x3c, 0x35, 0x42, 0x4b, 0x50, 0x59, 0x66, 0x6f, 0x74, 0x7d, + 0xa1, 0xa8, 0xb3, 0xba, 0x85, 0x8c, 0x97, 0x9e, 0xe9, 0xe0, 0xfb, 0xf2, 0xcd, 0xc4, 0xdf, 0xd6, + 0x31, 0x38, 0x23, 0x2a, 0x15, 0x1c, 0x07, 0x0e, 0x79, 0x70, 0x6b, 0x62, 0x5d, 0x54, 0x4f, 0x46, +]; +pub const LOOKUP_G11: [u8; 256] = [ + 0x00, 0x0b, 0x16, 0x1d, 0x2c, 0x27, 0x3a, 0x31, 0x58, 0x53, 0x4e, 0x45, 0x74, 0x7f, 0x62, 0x69, + 0xb0, 0xbb, 0xa6, 0xad, 0x9c, 0x97, 0x8a, 0x81, 0xe8, 0xe3, 0xfe, 0xf5, 0xc4, 0xcf, 0xd2, 0xd9, + 0x7b, 0x70, 0x6d, 0x66, 0x57, 0x5c, 0x41, 0x4a, 0x23, 0x28, 0x35, 0x3e, 0x0f, 0x04, 0x19, 0x12, + 0xcb, 0xc0, 0xdd, 0xd6, 0xe7, 0xec, 0xf1, 0xfa, 0x93, 0x98, 0x85, 0x8e, 0xbf, 0xb4, 0xa9, 0xa2, + 0xf6, 0xfd, 0xe0, 0xeb, 0xda, 0xd1, 0xcc, 0xc7, 0xae, 0xa5, 0xb8, 0xb3, 0x82, 0x89, 0x94, 0x9f, + 0x46, 0x4d, 0x50, 0x5b, 0x6a, 0x61, 0x7c, 0x77, 0x1e, 0x15, 0x08, 0x03, 0x32, 0x39, 0x24, 0x2f, + 0x8d, 0x86, 0x9b, 0x90, 0xa1, 0xaa, 0xb7, 0xbc, 0xd5, 0xde, 0xc3, 0xc8, 0xf9, 0xf2, 0xef, 0xe4, + 0x3d, 0x36, 0x2b, 0x20, 0x11, 0x1a, 0x07, 0x0c, 0x65, 0x6e, 0x73, 0x78, 0x49, 0x42, 0x5f, 0x54, + 0xf7, 0xfc, 0xe1, 0xea, 0xdb, 0xd0, 0xcd, 0xc6, 0xaf, 0xa4, 0xb9, 0xb2, 0x83, 0x88, 0x95, 0x9e, + 0x47, 0x4c, 0x51, 0x5a, 0x6b, 0x60, 0x7d, 0x76, 0x1f, 0x14, 0x09, 0x02, 0x33, 0x38, 0x25, 0x2e, + 0x8c, 0x87, 0x9a, 0x91, 0xa0, 0xab, 0xb6, 0xbd, 0xd4, 0xdf, 0xc2, 0xc9, 0xf8, 0xf3, 0xee, 0xe5, + 0x3c, 0x37, 0x2a, 0x21, 0x10, 0x1b, 0x06, 0x0d, 0x64, 0x6f, 0x72, 0x79, 0x48, 0x43, 0x5e, 0x55, + 0x01, 0x0a, 0x17, 0x1c, 0x2d, 0x26, 0x3b, 0x30, 0x59, 0x52, 0x4f, 0x44, 0x75, 0x7e, 0x63, 0x68, + 0xb1, 0xba, 0xa7, 0xac, 0x9d, 0x96, 0x8b, 0x80, 0xe9, 0xe2, 0xff, 0xf4, 0xc5, 0xce, 0xd3, 0xd8, + 0x7a, 0x71, 0x6c, 0x67, 0x56, 0x5d, 0x40, 0x4b, 0x22, 0x29, 0x34, 0x3f, 0x0e, 0x05, 0x18, 0x13, + 0xca, 0xc1, 0xdc, 0xd7, 0xe6, 0xed, 0xf0, 0xfb, 0x92, 0x99, 0x84, 0x8f, 0xbe, 0xb5, 0xa8, 0xa3, +]; +pub const LOOKUP_G13: [u8; 256] = [ + 0x00, 0x0d, 0x1a, 0x17, 0x34, 0x39, 0x2e, 0x23, 0x68, 0x65, 0x72, 0x7f, 0x5c, 0x51, 0x46, 0x4b, + 0xd0, 0xdd, 0xca, 0xc7, 0xe4, 0xe9, 0xfe, 0xf3, 0xb8, 0xb5, 0xa2, 0xaf, 0x8c, 0x81, 0x96, 0x9b, + 0xbb, 0xb6, 0xa1, 0xac, 0x8f, 0x82, 0x95, 0x98, 0xd3, 0xde, 0xc9, 0xc4, 0xe7, 0xea, 0xfd, 0xf0, + 0x6b, 0x66, 0x71, 0x7c, 0x5f, 0x52, 0x45, 0x48, 0x03, 0x0e, 0x19, 0x14, 0x37, 0x3a, 0x2d, 0x20, + 0x6d, 0x60, 0x77, 0x7a, 0x59, 0x54, 0x43, 0x4e, 0x05, 0x08, 0x1f, 0x12, 0x31, 0x3c, 0x2b, 0x26, + 0xbd, 0xb0, 0xa7, 0xaa, 0x89, 0x84, 0x93, 0x9e, 0xd5, 0xd8, 0xcf, 0xc2, 0xe1, 0xec, 0xfb, 0xf6, + 0xd6, 0xdb, 0xcc, 0xc1, 0xe2, 0xef, 0xf8, 0xf5, 0xbe, 0xb3, 0xa4, 0xa9, 0x8a, 0x87, 0x90, 0x9d, + 0x06, 0x0b, 0x1c, 0x11, 0x32, 0x3f, 0x28, 0x25, 0x6e, 0x63, 0x74, 0x79, 0x5a, 0x57, 0x40, 0x4d, + 0xda, 0xd7, 0xc0, 0xcd, 0xee, 0xe3, 0xf4, 0xf9, 0xb2, 0xbf, 0xa8, 0xa5, 0x86, 0x8b, 0x9c, 0x91, + 0x0a, 0x07, 0x10, 0x1d, 0x3e, 0x33, 0x24, 0x29, 0x62, 0x6f, 0x78, 0x75, 0x56, 0x5b, 0x4c, 0x41, + 0x61, 0x6c, 0x7b, 0x76, 0x55, 0x58, 0x4f, 0x42, 0x09, 0x04, 0x13, 0x1e, 0x3d, 0x30, 0x27, 0x2a, + 0xb1, 0xbc, 0xab, 0xa6, 0x85, 0x88, 0x9f, 0x92, 0xd9, 0xd4, 0xc3, 0xce, 0xed, 0xe0, 0xf7, 0xfa, + 0xb7, 0xba, 0xad, 0xa0, 0x83, 0x8e, 0x99, 0x94, 0xdf, 0xd2, 0xc5, 0xc8, 0xeb, 0xe6, 0xf1, 0xfc, + 0x67, 0x6a, 0x7d, 0x70, 0x53, 0x5e, 0x49, 0x44, 0x0f, 0x02, 0x15, 0x18, 0x3b, 0x36, 0x21, 0x2c, + 0x0c, 0x01, 0x16, 0x1b, 0x38, 0x35, 0x22, 0x2f, 0x64, 0x69, 0x7e, 0x73, 0x50, 0x5d, 0x4a, 0x47, + 0xdc, 0xd1, 0xc6, 0xcb, 0xe8, 0xe5, 0xf2, 0xff, 0xb4, 0xb9, 0xae, 0xa3, 0x80, 0x8d, 0x9a, 0x97, +]; +pub const LOOKUP_G14: [u8; 256] = [ + 0x00, 0x0e, 0x1c, 0x12, 0x38, 0x36, 0x24, 0x2a, 0x70, 0x7e, 0x6c, 0x62, 0x48, 0x46, 0x54, 0x5a, + 0xe0, 0xee, 0xfc, 0xf2, 0xd8, 0xd6, 0xc4, 0xca, 0x90, 0x9e, 0x8c, 0x82, 0xa8, 0xa6, 0xb4, 0xba, + 0xdb, 0xd5, 0xc7, 0xc9, 0xe3, 0xed, 0xff, 0xf1, 0xab, 0xa5, 0xb7, 0xb9, 0x93, 0x9d, 0x8f, 0x81, + 0x3b, 0x35, 0x27, 0x29, 0x03, 0x0d, 0x1f, 0x11, 0x4b, 0x45, 0x57, 0x59, 0x73, 0x7d, 0x6f, 0x61, + 0xad, 0xa3, 0xb1, 0xbf, 0x95, 0x9b, 0x89, 0x87, 0xdd, 0xd3, 0xc1, 0xcf, 0xe5, 0xeb, 0xf9, 0xf7, + 0x4d, 0x43, 0x51, 0x5f, 0x75, 0x7b, 0x69, 0x67, 0x3d, 0x33, 0x21, 0x2f, 0x05, 0x0b, 0x19, 0x17, + 0x76, 0x78, 0x6a, 0x64, 0x4e, 0x40, 0x52, 0x5c, 0x06, 0x08, 0x1a, 0x14, 0x3e, 0x30, 0x22, 0x2c, + 0x96, 0x98, 0x8a, 0x84, 0xae, 0xa0, 0xb2, 0xbc, 0xe6, 0xe8, 0xfa, 0xf4, 0xde, 0xd0, 0xc2, 0xcc, + 0x41, 0x4f, 0x5d, 0x53, 0x79, 0x77, 0x65, 0x6b, 0x31, 0x3f, 0x2d, 0x23, 0x09, 0x07, 0x15, 0x1b, + 0xa1, 0xaf, 0xbd, 0xb3, 0x99, 0x97, 0x85, 0x8b, 0xd1, 0xdf, 0xcd, 0xc3, 0xe9, 0xe7, 0xf5, 0xfb, + 0x9a, 0x94, 0x86, 0x88, 0xa2, 0xac, 0xbe, 0xb0, 0xea, 0xe4, 0xf6, 0xf8, 0xd2, 0xdc, 0xce, 0xc0, + 0x7a, 0x74, 0x66, 0x68, 0x42, 0x4c, 0x5e, 0x50, 0x0a, 0x04, 0x16, 0x18, 0x32, 0x3c, 0x2e, 0x20, + 0xec, 0xe2, 0xf0, 0xfe, 0xd4, 0xda, 0xc8, 0xc6, 0x9c, 0x92, 0x80, 0x8e, 0xa4, 0xaa, 0xb8, 0xb6, + 0x0c, 0x02, 0x10, 0x1e, 0x34, 0x3a, 0x28, 0x26, 0x7c, 0x72, 0x60, 0x6e, 0x44, 0x4a, 0x58, 0x56, + 0x37, 0x39, 0x2b, 0x25, 0x0f, 0x01, 0x13, 0x1d, 0x47, 0x49, 0x5b, 0x55, 0x7f, 0x71, 0x63, 0x6d, + 0xd7, 0xd9, 0xcb, 0xc5, 0xef, 0xe1, 0xf3, 0xfd, 0xa7, 0xa9, 0xbb, 0xb5, 0x9f, 0x91, 0x83, 0x8d, +]; +pub const KEY_XORPAD_TABLE: [u8; 16] = [ + 0xA2, 0x25, 0x25, 0x99, 0xB7, 0x62, 0xF4, 0x39, 0x28, 0xE1, 0xB7, 0x73, 0x91, 0x05, 0x25, 0x87, +]; +pub const AES_XORPAD_TABLE: [[u8; 2816]; 2] = [ + [ + 0xDE, 0xAD, 0xCA, 0xFE, 0xFA, 0xCE, 0xB0, 0x0C, 0xDE, 0xAD, 0xCA, 0xFE, 0xFA, 0xCE, 0xB0, + 0x0C, 0x3A, 0xE6, 0xDE, 0x9C, 0x81, 0xBA, 0x7C, 0xC6, 0x12, 0x1B, 0xAF, 0xD2, 0x8A, 0xBA, + 0xF5, 0xE6, 0x41, 0xDF, 0x71, 0xBA, 0x37, 0x11, 0x50, 0xF3, 0xF3, 0x62, 0x6E, 0x04, 0xF1, + 0x14, 0xFC, 0xBD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0x7B, 0x52, 0x7C, + 0x19, 0x98, 0x35, 0x96, 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, + 0xAC, 0x9E, 0x71, 0x37, 0x3C, 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, + 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, + 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, + 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, + 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, + 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, + 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, 0xA2, 0xF7, 0xB3, 0xF1, + 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, 0x1F, 0x8E, 0xFA, + 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, 0x48, 0xDE, + 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, 0xE0, + 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, + 0x56, 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, + 0x37, 0x3C, 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, + 0x8A, 0xF2, 0x33, 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, + 0xCA, 0x4E, 0x78, 0x4B, 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, + 0xF9, 0xDF, 0x3B, 0xEC, 0x56, 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, + 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, + 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, + 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, + 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, + 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, 0x48, 0xDE, 0xDC, 0xA2, 0xE8, + 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, 0xE0, 0xD6, 0xBE, 0xF0, + 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, 0xA2, 0xF7, 0xB3, + 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, 0x1F, 0x8E, + 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, 0x48, + 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, + 0x4B, 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, + 0xEC, 0x56, 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, + 0x71, 0x37, 0x3C, 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, + 0x25, 0x8A, 0xF2, 0x33, 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, + 0x7E, 0xCA, 0x4E, 0x78, 0x4B, 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, + 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, + 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, + 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, + 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, + 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, 0x1F, 0x8E, 0xFA, 0x3C, 0x73, + 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, 0x48, 0xDE, 0xDC, 0xA2, + 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, 0xE0, 0xD6, 0xBE, + 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, 0xA2, 0xF7, + 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, 0x1F, + 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, + 0x33, 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, + 0x78, 0x4B, 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, + 0x3B, 0xEC, 0x56, 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, + 0x9E, 0x71, 0x37, 0x3C, 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, + 0x71, 0x25, 0x8A, 0xF2, 0x33, 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, + 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, + 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, + 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, + 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, + 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, 0xA2, 0xF7, 0xB3, 0xF1, 0x67, + 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, 0x1F, 0x8E, 0xFA, 0x3C, + 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, 0x48, 0xDE, 0xDC, + 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, 0xE0, 0xD6, + 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, 0xA2, + 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, + 0x3C, 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, + 0xF2, 0x33, 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, + 0x4E, 0x78, 0x4B, 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, + 0xDF, 0x3B, 0xEC, 0x56, 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, + 0xAC, 0x9E, 0x71, 0x37, 0x3C, 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, + 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, + 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, + 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, + 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, + 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, + 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, 0xA2, 0xF7, 0xB3, 0xF1, + 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, 0x1F, 0x8E, 0xFA, + 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, 0x48, 0xDE, + 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, 0xE0, + 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, + 0x56, 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, + 0x37, 0x3C, 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, + 0x8A, 0xF2, 0x33, 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, + 0xCA, 0x4E, 0x78, 0x4B, 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, + 0xF9, 0xDF, 0x3B, 0xEC, 0x56, 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, + 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, + 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, + 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, + 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, + 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, 0x48, 0xDE, 0xDC, 0xA2, 0xE8, + 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, 0xE0, 0xD6, 0xBE, 0xF0, + 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, 0xA2, 0xF7, 0xB3, + 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, 0x1F, 0x8E, + 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, 0x48, + 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, + 0x4B, 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, + 0xEC, 0x56, 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, + 0x71, 0x37, 0x3C, 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, + 0x25, 0x8A, 0xF2, 0x33, 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, + 0x7E, 0xCA, 0x4E, 0x78, 0x4B, 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, + 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, + 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, + 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, + 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, + 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, 0x1F, 0x8E, 0xFA, 0x3C, 0x73, + 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, 0x48, 0xDE, 0xDC, 0xA2, + 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, 0xE0, 0xD6, 0xBE, + 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, 0xA2, 0xF7, + 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, 0x1F, + 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, + 0x33, 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, + 0x78, 0x4B, 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, + 0x3B, 0xEC, 0x56, 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, + 0x9E, 0x71, 0x37, 0x3C, 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, + 0x71, 0x25, 0x8A, 0xF2, 0x33, 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, + 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, + 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, + 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, + 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, + 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, 0xA2, 0xF7, 0xB3, 0xF1, 0x67, + 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, 0x1F, 0x8E, 0xFA, 0x3C, + 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, 0x48, 0xDE, 0xDC, + 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, 0xE0, 0xD6, + 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, 0xA2, + 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, + 0x3C, 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, + 0xF2, 0x33, 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, + 0x4E, 0x78, 0x4B, 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, + 0xDF, 0x3B, 0xEC, 0x56, 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, + 0xAC, 0x9E, 0x71, 0x37, 0x3C, 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, + 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, + 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, + 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, + 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, + 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, + 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, 0xA2, 0xF7, 0xB3, 0xF1, + 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, 0x1F, 0x8E, 0xFA, + 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, 0x48, 0xDE, + 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, 0xE0, + 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, + 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, + 0x56, 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, + 0x37, 0x3C, 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, + 0x8A, 0xF2, 0x33, 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, + 0xCA, 0x4E, 0x78, 0x4B, 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, + 0xF9, 0xDF, 0x3B, 0xEC, 0x56, 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, + 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, + 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, + 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, + 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, + 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, 0x48, 0xDE, 0xDC, 0xA2, 0xE8, + 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, 0xE0, 0xD6, 0xBE, 0xF0, + 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, 0xA2, 0xF7, 0xB3, + 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, 0x1F, 0x8E, + 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, 0x48, + 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, + 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, + 0x4B, 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, + 0xEC, 0x56, 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, + 0x71, 0x37, 0x3C, 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, + 0x25, 0x8A, 0xF2, 0x33, 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, + 0x7E, 0xCA, 0x4E, 0x78, 0x4B, 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, + 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, + 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, + 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, + 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, + 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, 0x1F, 0x8E, 0xFA, 0x3C, 0x73, + 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, 0x48, 0xDE, 0xDC, 0xA2, + 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, 0xE0, 0xD6, 0xBE, + 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, 0xA2, 0xF7, + 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, 0x1F, + 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, + 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, + 0x33, 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, + 0x78, 0x4B, 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, + 0x3B, 0xEC, 0x56, 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, 0x18, 0x18, 0xE0, 0xAC, + 0x9E, 0x71, 0x37, 0x3C, 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, 0xB5, 0x0E, 0xB6, 0x3E, + 0x71, 0x25, 0x8A, 0xF2, 0x33, 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, 0xD0, 0x69, 0x81, 0x00, + 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, 0xA2, 0xF7, 0xB3, 0xF1, 0x67, 0x82, 0x47, 0x6A, 0xB8, + 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, 0x1F, 0x8E, 0xFA, 0x3C, 0x73, 0x62, 0x6A, 0x92, + 0x18, 0x18, 0xE0, 0xAC, 0x9E, 0x71, 0x37, 0x3C, 0x48, 0xDE, 0xDC, 0xA2, 0xE8, 0xBB, 0x35, + 0xB5, 0x0E, 0xB6, 0x3E, 0x71, 0x25, 0x8A, 0xF2, 0x33, 0xE0, 0xD6, 0xBE, 0xF0, 0x3A, 0x93, + 0xD0, 0x69, 0x81, 0x00, 0x53, 0x7E, 0xCA, 0x4E, 0x78, 0x4B, 0xA2, 0xF7, 0xB3, 0xF1, 0x67, + 0x82, 0x47, 0x6A, 0xB8, 0xAA, 0x76, 0xF9, 0xDF, 0x3B, 0xEC, 0x56, + ], + [ + 0xC3, 0x20, 0x20, 0xB4, 0xAF, 0x0E, 0x82, 0x2E, 0xEF, 0x29, 0xFE, 0x75, 0x1D, 0xDB, 0x4B, + 0x86, 0x86, 0x23, 0x28, 0x72, 0xA3, 0xF4, 0x1B, 0x4F, 0x5F, 0x0E, 0x02, 0xB1, 0xAC, 0x0D, + 0xE6, 0x4F, 0x8B, 0x0B, 0x3F, 0xF3, 0x5F, 0xB5, 0x09, 0x7E, 0x3B, 0xE9, 0x93, 0x29, 0x55, + 0xE1, 0xB4, 0x9B, 0xCC, 0xCE, 0x37, 0xFC, 0xAB, 0x6B, 0xA4, 0x05, 0xE6, 0xC7, 0x45, 0x34, + 0xC0, 0xFF, 0x7C, 0x24, 0x89, 0x36, 0xBF, 0x17, 0xAB, 0x91, 0xCA, 0x49, 0xF2, 0x74, 0x80, + 0xB6, 0x90, 0x60, 0xFF, 0xD2, 0xA9, 0xE5, 0xC9, 0x64, 0xBC, 0x38, 0x40, 0x98, 0xB3, 0xBA, + 0x8F, 0x8B, 0xBA, 0x9D, 0xF3, 0xCF, 0x57, 0xBA, 0xAC, 0x18, 0xE7, 0xD3, 0x03, 0x01, 0x48, + 0x29, 0x41, 0xF6, 0x2F, 0x89, 0xD4, 0x9F, 0xD7, 0xD3, 0x05, 0x71, 0x63, 0x30, 0x4E, 0xBB, + 0xF7, 0xB0, 0x99, 0xFF, 0x43, 0xDA, 0x87, 0xCA, 0xA7, 0x48, 0x92, 0x9E, 0x76, 0xA6, 0xEE, + 0x48, 0x1C, 0x96, 0x28, 0x8E, 0x54, 0x30, 0xD6, 0xA5, 0xD3, 0x22, 0xA2, 0x30, 0xCB, 0x6A, + 0x85, 0x26, 0x69, 0xE1, 0x7C, 0xEC, 0xDC, 0xD4, 0x89, 0x2A, 0xB8, 0xAE, 0xDF, 0x12, 0x6E, + 0x39, 0x8A, 0x9B, 0x48, 0x61, 0xF9, 0x4B, 0x34, 0xD0, 0xF1, 0x60, 0x87, 0xBA, 0x88, 0x86, + 0x68, 0x8C, 0xBE, 0xC1, 0x9C, 0xAE, 0x30, 0xBC, 0xE6, 0x62, 0xFF, 0xEB, 0xBB, 0x88, 0x7C, + 0xD2, 0xBB, 0x57, 0xB4, 0x02, 0x82, 0x06, 0x72, 0xD2, 0x94, 0x60, 0x86, 0x4A, 0x29, 0xF0, + 0xEA, 0xD3, 0x88, 0x92, 0xF1, 0x22, 0xD1, 0x5C, 0x88, 0x65, 0xE6, 0xFB, 0xEE, 0x28, 0x79, + 0x86, 0x68, 0x7D, 0xA6, 0x5A, 0xBF, 0xBD, 0x7D, 0x15, 0xEF, 0x05, 0xF6, 0xF9, 0xE0, 0x11, + 0xD6, 0x30, 0x94, 0xF2, 0x6C, 0x3D, 0x0A, 0xDB, 0xC5, 0x0E, 0xDC, 0xF2, 0xFD, 0x1F, 0x61, + 0x91, 0x5D, 0x80, 0x69, 0xA3, 0xDB, 0x35, 0x98, 0x4E, 0x4A, 0xC1, 0x49, 0x76, 0xAB, 0xC0, + 0x67, 0x36, 0x3F, 0xA4, 0xC6, 0xE8, 0xCA, 0x25, 0x44, 0x63, 0x23, 0xB5, 0xC8, 0xBB, 0x3A, + 0xAC, 0xA1, 0x09, 0xC3, 0x10, 0x57, 0xA5, 0x5B, 0x3B, 0x33, 0x21, 0xCD, 0x3C, 0x88, 0xAE, + 0x1E, 0x8F, 0xC1, 0xD6, 0xFB, 0x94, 0x61, 0x38, 0xAB, 0xF1, 0x9C, 0x06, 0xCB, 0x89, 0x58, + 0x9A, 0xF4, 0xF4, 0x33, 0x80, 0x66, 0x13, 0xC0, 0xFD, 0xE2, 0x16, 0xE0, 0x89, 0x65, 0xE2, + 0xC1, 0xA6, 0xE3, 0x74, 0xD2, 0x5F, 0xA0, 0x76, 0xAD, 0xF5, 0x6B, 0x4F, 0xE0, 0xF7, 0x52, + 0xB0, 0xB1, 0x48, 0xDD, 0xEE, 0xB6, 0x01, 0x9A, 0x90, 0x91, 0x18, 0xEC, 0xCB, 0xCB, 0xAD, + 0x04, 0xB6, 0x73, 0xCF, 0x7F, 0xF3, 0xAC, 0xBE, 0xEC, 0x91, 0x44, 0x56, 0x81, 0xB8, 0x74, + 0xAE, 0x28, 0x5D, 0xC7, 0x5C, 0xAB, 0x8B, 0x56, 0x21, 0x32, 0x91, 0xB9, 0x9E, 0x70, 0xF6, + 0x9B, 0xAC, 0x50, 0x0B, 0x2E, 0x4B, 0x8B, 0xA2, 0xA5, 0x24, 0x5B, 0x91, 0xDF, 0x24, 0xA7, + 0xB0, 0x79, 0xA7, 0x16, 0x54, 0x44, 0x2E, 0xBC, 0x48, 0xCD, 0x87, 0xBA, 0xAF, 0xD4, 0xB9, + 0x1C, 0x0F, 0xAA, 0xFA, 0x3A, 0x3F, 0x3A, 0x3D, 0x68, 0x5A, 0xAE, 0xAC, 0xBA, 0xBE, 0xA3, + 0x92, 0x6E, 0x38, 0x8E, 0x33, 0x3E, 0x0A, 0xCC, 0xF6, 0xE3, 0x26, 0x57, 0xEC, 0x8E, 0x63, + 0x31, 0x27, 0xBA, 0x20, 0x4E, 0x7F, 0x34, 0xE5, 0x19, 0xFE, 0x7F, 0xA6, 0x97, 0x90, 0xD6, + 0x29, 0x1C, 0x3F, 0x8C, 0x3F, 0x81, 0x62, 0x3D, 0xF5, 0x00, 0xD4, 0xC5, 0xE2, 0xE1, 0x42, + 0x42, 0x8C, 0x65, 0x8F, 0x5A, 0x66, 0x59, 0xE1, 0xDD, 0xEC, 0xDC, 0x1B, 0x4E, 0x63, 0x82, + 0xFF, 0x02, 0x9D, 0x53, 0xDE, 0xBD, 0xB4, 0x80, 0xCF, 0x2B, 0xB7, 0xDE, 0x69, 0x5D, 0x1B, + 0xCA, 0xFB, 0xB3, 0xF9, 0xBE, 0xD0, 0xF5, 0x79, 0x86, 0x2F, 0x0E, 0xB6, 0xA9, 0x87, 0xF4, + 0x68, 0xC1, 0xBF, 0x4F, 0xB8, 0xA6, 0x2D, 0x03, 0xA9, 0x72, 0x04, 0xCA, 0x37, 0x6D, 0x1B, + 0x90, 0xDD, 0xBC, 0x52, 0xAE, 0xF3, 0xFF, 0x08, 0xDD, 0x4B, 0x46, 0xD0, 0xCD, 0xB1, 0x8A, + 0x35, 0x9A, 0x02, 0x64, 0x64, 0x2F, 0x57, 0xA5, 0x7B, 0x9A, 0x0D, 0x2B, 0x55, 0x11, 0x3C, + 0xC0, 0x35, 0x74, 0x69, 0xD9, 0x7B, 0x43, 0x1D, 0xAC, 0xB2, 0xC2, 0x8A, 0xBE, 0x22, 0x45, + 0x46, 0x76, 0xA9, 0x8A, 0x49, 0xB2, 0x5F, 0xC0, 0xB8, 0xBC, 0xCD, 0x27, 0xF8, 0x14, 0xB2, + 0xA9, 0x6D, 0x5A, 0x1F, 0xA4, 0x43, 0x1E, 0x0F, 0xDB, 0xA4, 0x9E, 0x2B, 0xCA, 0xFC, 0x98, + 0x7F, 0xF1, 0x18, 0x87, 0x5B, 0x11, 0x2D, 0xC5, 0xE4, 0x91, 0x20, 0xA9, 0x6A, 0x2D, 0xAC, + 0xA8, 0xFA, 0x94, 0x57, 0x7F, 0x30, 0x73, 0x08, 0xE8, 0x49, 0xF0, 0xC8, 0x63, 0xDA, 0x83, + 0x87, 0x2A, 0xC3, 0x31, 0x1A, 0xFC, 0xB7, 0x57, 0xB2, 0x40, 0x46, 0x09, 0x6D, 0x84, 0xB4, + 0x66, 0xF1, 0x13, 0x16, 0x3A, 0x3A, 0xFB, 0xC6, 0x6E, 0xB0, 0x71, 0xB8, 0x23, 0x74, 0x22, + 0x89, 0xFC, 0xBE, 0x34, 0xB3, 0x17, 0xB6, 0xC9, 0x68, 0x53, 0x64, 0x47, 0xAF, 0xCA, 0x1D, + 0x5F, 0xB4, 0x74, 0xA3, 0x77, 0xB5, 0xFB, 0x77, 0xD9, 0x69, 0x2B, 0x3A, 0xAA, 0xAE, 0xE4, + 0x03, 0x81, 0x6B, 0x3A, 0x35, 0x9C, 0x45, 0x50, 0x9C, 0x76, 0xCE, 0xE3, 0x7F, 0x64, 0x4B, + 0x9F, 0x83, 0x7B, 0x72, 0xBC, 0x02, 0x1E, 0x94, 0x99, 0xC1, 0x1C, 0x45, 0x19, 0x1D, 0x56, + 0x74, 0x73, 0xE7, 0xFC, 0x58, 0x72, 0x2D, 0xE3, 0x50, 0xA4, 0x21, 0xBE, 0x81, 0xDF, 0x80, + 0xDA, 0x40, 0xDB, 0x79, 0x67, 0x0E, 0x94, 0xA3, 0x05, 0xDD, 0xF7, 0x14, 0x28, 0xD6, 0xC4, + 0x2B, 0xF3, 0xCF, 0x36, 0x08, 0x84, 0xF3, 0xC8, 0x8C, 0xAD, 0xCE, 0x7F, 0x7C, 0x0F, 0xC6, + 0xFE, 0x05, 0x54, 0x4B, 0x17, 0xA1, 0x83, 0x65, 0x97, 0x29, 0x01, 0x70, 0xC1, 0x16, 0xAE, + 0x69, 0xA4, 0x90, 0xB9, 0xBE, 0x17, 0x05, 0x50, 0xF1, 0x65, 0x07, 0x23, 0x76, 0x64, 0x84, + 0x2D, 0x40, 0x34, 0xFD, 0xDF, 0x62, 0x7E, 0x4C, 0x85, 0xD2, 0x6D, 0x17, 0xE1, 0x41, 0x12, + 0xC6, 0x3E, 0xD6, 0x14, 0xB8, 0x5F, 0x8F, 0x39, 0x65, 0xC2, 0x62, 0x21, 0x06, 0x5C, 0xC9, + 0xB8, 0x99, 0xA5, 0x00, 0xE3, 0x9C, 0x73, 0xAB, 0xB9, 0x76, 0x12, 0xD2, 0xFA, 0x7F, 0x7D, + 0x64, 0x63, 0x9E, 0x26, 0xAA, 0x89, 0x85, 0x3A, 0xC9, 0x94, 0x04, 0x97, 0xEC, 0xFD, 0xC5, + 0xA3, 0xB1, 0x7D, 0xD6, 0x07, 0x9C, 0x47, 0x30, 0x9C, 0x64, 0x97, 0x0E, 0xC6, 0xFC, 0x0B, + 0xFF, 0xA7, 0xF9, 0x46, 0x5B, 0x2B, 0xDB, 0x9E, 0x1C, 0x85, 0x3A, 0x75, 0xD6, 0xEB, 0x9B, + 0x15, 0x36, 0xD7, 0x1A, 0x3D, 0xFC, 0x0B, 0x75, 0x08, 0x5E, 0x32, 0x23, 0xE0, 0xA5, 0xAD, + 0x0F, 0x45, 0xB3, 0x78, 0x20, 0x22, 0x24, 0x64, 0x0C, 0xCF, 0xD6, 0x3C, 0xA4, 0x48, 0xC7, + 0xB3, 0x6E, 0x02, 0xE2, 0x0A, 0xAB, 0x92, 0xFC, 0x40, 0x7D, 0xF5, 0x02, 0x61, 0x56, 0xAB, + 0xC5, 0x68, 0x38, 0xE0, 0x01, 0xF1, 0x94, 0x73, 0xC6, 0xFE, 0xC2, 0x34, 0x67, 0x8E, 0xB1, + 0x73, 0x72, 0xD4, 0x3B, 0xFD, 0x1F, 0xE2, 0xA8, 0xED, 0x20, 0x14, 0x0A, 0x60, 0x6D, 0xD1, + 0x85, 0x14, 0x05, 0x54, 0x96, 0xC6, 0x3D, 0xB5, 0x1B, 0x37, 0x56, 0x24, 0xF7, 0x7C, 0x0F, + 0x55, 0xC6, 0xAA, 0x7E, 0x33, 0x2D, 0xE1, 0x97, 0x74, 0xA8, 0xDC, 0xC5, 0xA1, 0xEC, 0x8C, + 0xEF, 0x28, 0x3B, 0x49, 0x8B, 0x00, 0xED, 0x8B, 0xD9, 0xE9, 0x65, 0xD5, 0x05, 0x7B, 0x6D, + 0x20, 0xCA, 0x8F, 0x93, 0xB4, 0xCA, 0x36, 0x34, 0x8E, 0x16, 0x46, 0xCE, 0x02, 0x23, 0x43, + 0x22, 0xF6, 0xBD, 0x10, 0xCC, 0xD0, 0xA3, 0xB0, 0x42, 0xA5, 0xAF, 0x59, 0x72, 0x97, 0x0B, + 0xAE, 0x80, 0x8D, 0x19, 0xD0, 0x1D, 0x7D, 0x30, 0x4E, 0x5B, 0x46, 0xC0, 0xC2, 0x5C, 0x40, + 0xFC, 0xF3, 0xEF, 0x05, 0x84, 0xE8, 0x0C, 0x80, 0xD7, 0x37, 0xA1, 0x6F, 0xC1, 0x8C, 0xE0, + 0xBA, 0xA1, 0x88, 0x7B, 0xE7, 0x20, 0xBF, 0x18, 0x02, 0x40, 0x9F, 0x6F, 0x23, 0x11, 0x78, + 0x07, 0xD0, 0x92, 0x87, 0x2D, 0xB5, 0xE0, 0xE9, 0xE9, 0xAA, 0x32, 0x88, 0x57, 0xF8, 0x9B, + 0x01, 0x93, 0x2D, 0x07, 0x77, 0x68, 0x86, 0xAD, 0x06, 0xDE, 0x57, 0xA9, 0xA4, 0x96, 0x33, + 0x42, 0xF8, 0xFB, 0x23, 0x1F, 0x99, 0xB6, 0x62, 0x93, 0x6B, 0x12, 0xBE, 0x72, 0x9F, 0x96, + 0x1A, 0xDA, 0x05, 0x60, 0xF1, 0xD5, 0x40, 0x9F, 0x75, 0xF3, 0x1D, 0xBE, 0xD7, 0x87, 0x5D, + 0x3A, 0x55, 0xF0, 0x9B, 0xBF, 0xE8, 0xB9, 0x72, 0xC2, 0xDD, 0x4D, 0x27, 0xF6, 0xA9, 0x37, + 0x96, 0x7E, 0x6E, 0x6E, 0x64, 0x37, 0x4E, 0x2E, 0x3F, 0xFD, 0x3C, 0xF4, 0xA6, 0xF5, 0x22, + 0xA8, 0x43, 0xF4, 0x13, 0x21, 0xB5, 0x4E, 0xA8, 0x6D, 0x50, 0x0A, 0xB3, 0xFE, 0x9F, 0x5C, + 0xE7, 0x1A, 0xCF, 0x36, 0x42, 0x30, 0x1C, 0x88, 0x7F, 0x29, 0xE9, 0xCD, 0x96, 0xF2, 0x6A, + 0x52, 0xB2, 0x25, 0x87, 0x63, 0xDC, 0xFC, 0x72, 0xE4, 0xF8, 0x5E, 0xB1, 0x97, 0xB4, 0x1E, + 0x08, 0x90, 0x68, 0x10, 0x73, 0x7F, 0x94, 0x61, 0x48, 0x49, 0x36, 0x9B, 0x7D, 0xBD, 0xDF, + 0xCD, 0xB1, 0xA3, 0x7D, 0xFB, 0xDD, 0x97, 0x8A, 0x0D, 0xFC, 0x9A, 0xB8, 0xA9, 0x33, 0xB5, + 0x4E, 0x50, 0x3D, 0x60, 0x90, 0xEB, 0xAB, 0xB8, 0xCB, 0x6E, 0x32, 0xE4, 0x6B, 0xB0, 0x3F, + 0x57, 0xB8, 0xA4, 0x6A, 0x7C, 0x00, 0x66, 0x39, 0xB1, 0x22, 0xE2, 0x04, 0x26, 0xA1, 0x5A, + 0x17, 0xAA, 0x80, 0xB6, 0xC0, 0xF6, 0xCF, 0x7A, 0xF8, 0x60, 0xE9, 0x52, 0xB8, 0x0E, 0x08, + 0xC0, 0xD5, 0x1F, 0xAB, 0x61, 0x62, 0x1A, 0x83, 0xD1, 0x92, 0xE1, 0x4D, 0x6D, 0xDF, 0x27, + 0x0E, 0xFF, 0xF9, 0xA3, 0x36, 0xFF, 0x73, 0xEF, 0x1D, 0xAB, 0xAC, 0xBF, 0xA7, 0xB3, 0x29, + 0xD2, 0xB2, 0x37, 0xAB, 0x08, 0x7D, 0xB6, 0x7E, 0x0D, 0x25, 0xAA, 0x49, 0x29, 0x9F, 0x61, + 0x52, 0x44, 0x19, 0x1C, 0x51, 0x95, 0x74, 0xB9, 0x3D, 0xDD, 0x95, 0x2C, 0x4F, 0x30, 0x56, + 0xC9, 0xEF, 0x3D, 0x87, 0x90, 0x1E, 0xF8, 0x69, 0xFF, 0x37, 0x06, 0x27, 0xDB, 0x72, 0x82, + 0x2C, 0xDE, 0xB8, 0x39, 0x0B, 0x78, 0xB1, 0x1F, 0x37, 0x54, 0xBF, 0x21, 0x32, 0x87, 0xB4, + 0xD9, 0x49, 0x2D, 0x29, 0x19, 0x43, 0x01, 0xD4, 0xC0, 0xA3, 0xFF, 0x09, 0x6F, 0x69, 0xC8, + 0x5D, 0x35, 0x1D, 0x10, 0x09, 0x91, 0xB6, 0x12, 0xEC, 0x04, 0xA6, 0x61, 0xEF, 0x73, 0xC7, + 0x4C, 0x04, 0x8E, 0x3E, 0xAE, 0xD7, 0xC2, 0x84, 0x48, 0xAB, 0x99, 0x96, 0x75, 0xD8, 0xAD, + 0xA7, 0x5B, 0xDE, 0x72, 0x44, 0x96, 0xC5, 0xB3, 0xEB, 0x8E, 0xED, 0xD6, 0x69, 0x81, 0xE6, + 0x07, 0x3A, 0x15, 0x0D, 0x66, 0x5F, 0x36, 0xA9, 0xAB, 0x53, 0x82, 0x47, 0x98, 0x27, 0xF2, + 0x16, 0x95, 0x05, 0x0B, 0xAE, 0xF1, 0x04, 0x92, 0x80, 0x20, 0xA4, 0x9B, 0x43, 0x66, 0x70, + 0x7F, 0x45, 0x0B, 0x4B, 0x85, 0x95, 0x10, 0x09, 0xC8, 0xD9, 0xF9, 0x5D, 0x40, 0x6D, 0x07, + 0x69, 0x18, 0xF3, 0xD6, 0x98, 0x61, 0x25, 0x8E, 0xA1, 0xE2, 0x24, 0xBD, 0xF0, 0xFA, 0x89, + 0xD8, 0x68, 0xB2, 0x03, 0x81, 0x63, 0xF9, 0x42, 0xD4, 0x1A, 0xD9, 0x4D, 0xCD, 0x30, 0x36, + 0x2D, 0xB1, 0x63, 0xFC, 0xA3, 0x2B, 0xA7, 0x07, 0x50, 0xBC, 0x67, 0xAB, 0x7D, 0x33, 0x1D, + 0xEC, 0x62, 0xFE, 0xD2, 0x65, 0xAA, 0xBA, 0x37, 0xC9, 0x7F, 0x67, 0x26, 0x9D, 0x8A, 0x8B, + 0x63, 0x0B, 0xE0, 0x30, 0x65, 0x07, 0x8C, 0xF3, 0xD1, 0xCF, 0x0D, 0xB4, 0x1E, 0xF3, 0x29, + 0xBE, 0x43, 0x1F, 0x34, 0x1E, 0x52, 0x02, 0xA7, 0x8D, 0x30, 0x2E, 0x3E, 0x39, 0x00, 0xB6, + 0x7B, 0x5C, 0x29, 0x39, 0xC0, 0x0D, 0xAB, 0xA0, 0x6D, 0x77, 0x3C, 0xB2, 0x18, 0x42, 0x57, + 0x63, 0xDA, 0x9E, 0xF5, 0xE0, 0x42, 0x43, 0xF6, 0x50, 0xFD, 0x71, 0x9B, 0x30, 0xE0, 0x92, + 0x8B, 0xD1, 0xE1, 0xC4, 0x96, 0xC9, 0xF5, 0x14, 0xB6, 0xF7, 0xA5, 0x10, 0x77, 0xF4, 0xF9, + 0xAC, 0xDC, 0x45, 0xE1, 0x3C, 0xD6, 0x0B, 0xA5, 0xE2, 0x58, 0x01, 0x19, 0x39, 0x14, 0x68, + 0x96, 0xC0, 0xCE, 0xA9, 0xDE, 0x84, 0x22, 0x59, 0x87, 0x70, 0xFD, 0x8A, 0x71, 0x64, 0x79, + 0x16, 0x37, 0x80, 0x83, 0xFD, 0x9C, 0x73, 0xE6, 0x9C, 0x8B, 0xCD, 0xC0, 0x69, 0x66, 0x90, + 0x45, 0x0A, 0xC9, 0x81, 0x4A, 0xDA, 0x26, 0xDA, 0xA1, 0x70, 0x03, 0x6C, 0x36, 0x9D, 0xAD, + 0xD7, 0xE2, 0x1F, 0x27, 0xBE, 0xBB, 0xEC, 0x63, 0xD9, 0xC2, 0x2A, 0x56, 0x4D, 0x63, 0xCD, + 0x92, 0xEE, 0xAF, 0xCA, 0xD0, 0x11, 0x35, 0x2F, 0x1D, 0xF1, 0x96, 0xD1, 0xAA, 0xDC, 0xF6, + 0x14, 0x3F, 0xA0, 0xEE, 0x90, 0x83, 0x9F, 0x42, 0x40, 0xE6, 0x2C, 0x10, 0x23, 0x00, 0x23, + 0x18, 0x8C, 0xA1, 0x26, 0x4B, 0x22, 0xE1, 0x36, 0x07, 0x55, 0xCB, 0xC3, 0xD2, 0xDD, 0x12, + 0x58, 0x19, 0x75, 0x03, 0xC6, 0xD8, 0x2E, 0xCE, 0x87, 0x1C, 0xC3, 0x15, 0x44, 0x2A, 0x30, + 0x00, 0x52, 0x39, 0x31, 0x13, 0xF4, 0x25, 0x75, 0x74, 0x15, 0x6C, 0xC5, 0xC1, 0xD2, 0x33, + 0x75, 0xC2, 0x41, 0x22, 0x28, 0x95, 0xDF, 0x97, 0x6C, 0x31, 0xF8, 0x35, 0xA6, 0x54, 0x29, + 0x5C, 0xF4, 0x20, 0x97, 0x69, 0xE5, 0x46, 0xFF, 0x34, 0x24, 0x73, 0x12, 0xB8, 0x61, 0x25, + 0x46, 0xB3, 0x8F, 0xBA, 0x3C, 0xFA, 0x06, 0xFF, 0x3F, 0x66, 0x9D, 0x22, 0x55, 0x46, 0x2F, + 0xFF, 0x44, 0xDB, 0x25, 0x29, 0xE0, 0x16, 0x6E, 0xEC, 0x87, 0x97, 0x92, 0x37, 0x23, 0x0E, + 0x52, 0x4E, 0xBB, 0x10, 0xBB, 0x1C, 0x73, 0x75, 0xD1, 0x31, 0xC3, 0xAD, 0xFE, 0xB8, 0x12, + 0x50, 0xA0, 0x69, 0x91, 0x36, 0xEA, 0x5F, 0x0D, 0xEC, 0x1A, 0x23, 0x4A, 0x7D, 0x94, 0x84, + 0xC8, 0x4A, 0x58, 0x6A, 0xA1, 0xA3, 0x75, 0xCA, 0x85, 0xE7, 0x96, 0x91, 0x07, 0x05, 0x3A, + 0x57, 0x61, 0x6A, 0x6F, 0xF1, 0xEF, 0xF7, 0xB3, 0xB1, 0x09, 0xB8, 0x91, 0xA8, 0xF9, 0x57, + 0xB8, 0x63, 0x95, 0xFF, 0xB4, 0x1C, 0x96, 0xE7, 0xE5, 0xEC, 0x06, 0x3A, 0x11, 0xE6, 0x81, + 0xAB, 0x23, 0xE4, 0x5E, 0x5A, 0xB6, 0x6B, 0x69, 0x62, 0x6F, 0x9D, 0xC4, 0x08, 0x6F, 0xA6, + 0xBE, 0x4D, 0x09, 0x12, 0x77, 0xCA, 0xDD, 0xB5, 0x2D, 0x66, 0xCB, 0x4F, 0x4F, 0x11, 0xF2, + 0x3A, 0x1A, 0x97, 0x1F, 0xFE, 0x50, 0x2F, 0x19, 0x32, 0x05, 0x45, 0xA0, 0x50, 0x60, 0x58, + 0x40, 0x40, 0x3D, 0xF6, 0xC3, 0x6F, 0x07, 0xC8, 0x26, 0x26, 0x0E, 0x42, 0x22, 0x96, 0x6D, + 0xFE, 0x95, 0x53, 0x70, 0xDC, 0x92, 0x12, 0x63, 0xFD, 0xA3, 0x7D, 0x6E, 0x44, 0xCD, 0x11, + 0x2C, 0x51, 0x6F, 0xBC, 0x50, 0xFC, 0x1C, 0xC8, 0x3A, 0x28, 0xF5, 0x39, 0xF8, 0x8C, 0x60, + 0x5D, 0xA5, 0x4A, 0xFA, 0xAB, 0x04, 0x7F, 0x34, 0x91, 0x53, 0xE7, 0x6C, 0x56, 0xC6, 0x14, + 0xE4, 0xCC, 0xE4, 0xBB, 0x6E, 0x47, 0x7A, 0x46, 0x6B, 0xE2, 0x88, 0xA0, 0xBD, 0xBD, 0xCC, + 0x51, 0xF3, 0x37, 0x4B, 0xB3, 0xA0, 0x19, 0x92, 0x48, 0x35, 0xBB, 0xBC, 0x79, 0x78, 0xFF, + 0x49, 0xC1, 0x2B, 0x93, 0xDF, 0x75, 0xA7, 0xFB, 0x94, 0x89, 0xAF, 0x50, 0x5E, 0x2D, 0xE1, + 0x78, 0x60, 0x0C, 0xDF, 0xF8, 0x7C, 0xFD, 0xCD, 0x2D, 0xE2, 0xFF, 0xD3, 0xA3, 0x4A, 0x48, + 0x0D, 0x40, 0x8F, 0x03, 0x4F, 0x2C, 0xBD, 0xFA, 0x2E, 0x16, 0xC3, 0xD4, 0xFD, 0x0B, 0xB3, + 0xBD, 0x4F, 0x30, 0xAD, 0xD0, 0xAE, 0xCA, 0x77, 0x9D, 0xDD, 0x3D, 0xA3, 0x66, 0xD0, 0xC1, + 0x6D, 0xCC, 0x3B, 0x56, 0x81, 0x5D, 0x80, 0x07, 0xD8, 0x84, 0x46, 0x71, 0x40, 0x57, 0xB3, + 0x44, 0x85, 0x63, 0x4E, 0x17, 0x2C, 0xB0, 0x21, 0x98, 0x43, 0x42, 0x04, 0x18, 0x84, 0xFA, + 0xB1, 0xD7, 0xC5, 0x5C, 0xCA, 0x25, 0x8B, 0x1A, 0x7A, 0x50, 0x60, 0x68, 0x4A, 0x30, 0xEA, + 0xE6, 0xDE, 0x19, 0xBB, 0x9F, 0x47, 0xEF, 0xDB, 0xC5, 0x81, 0x72, 0xF0, 0x8D, 0xBA, 0x74, + 0x3A, 0xD1, 0xD5, 0xC6, 0xD1, 0xE0, 0xAE, 0x28, 0x2A, 0x65, 0xE5, 0x0B, 0x09, 0xFA, 0xEA, + 0x5B, 0xA6, 0xDB, 0x38, 0xD8, 0x67, 0xC0, 0xBE, 0xA1, 0x12, 0x1C, 0x03, 0xB1, 0x81, 0xB8, + 0x95, 0xDD, 0x78, 0xF8, 0x16, 0x6E, 0xAB, 0xBB, 0xAA, 0x33, 0x54, 0x0E, 0x39, 0x83, 0x24, + 0x17, 0xB3, 0x0B, 0x3C, 0xA1, 0x62, 0x21, 0xB2, 0xA0, 0xF8, 0x49, 0xAB, 0x8B, 0x80, 0xC6, + 0x3D, 0xF1, 0x2E, 0x18, 0x44, 0x74, 0x5F, 0x98, 0x92, 0x33, 0xFB, 0xB2, 0x52, 0x6B, 0x97, + 0xE9, 0x48, 0x12, 0x91, 0x32, 0x50, 0x21, 0x75, 0x74, 0x69, 0x88, 0x54, 0xC6, 0xF3, 0xC9, + 0x37, 0x3C, 0xB3, 0x89, 0xAB, 0x33, 0x1F, 0x79, 0x57, 0xF7, 0xE4, 0xB5, 0x87, 0x0C, 0xA4, + 0x99, 0x48, 0x89, 0x63, 0x5F, 0x72, 0xA1, 0xBC, 0xFF, 0xFE, 0xF8, 0xB3, 0xF1, 0x00, 0xE4, + 0xD4, 0x01, 0x9B, 0xB7, 0x2E, 0x4F, 0xA0, 0x90, 0xE4, 0x9B, 0x6A, 0xA8, 0xBA, 0xE1, 0xD3, + 0xD5, 0xBC, 0xEB, 0xC5, 0xB2, 0x89, 0xB4, 0xE9, 0x4D, 0x3F, 0x4C, 0xFA, 0x8C, 0xCB, 0xCD, + 0x22, 0x08, 0xB8, 0xC7, 0xB3, 0xA3, 0xED, 0x6B, 0xAC, 0xF3, 0x2D, 0x98, 0x70, 0x41, 0x47, + 0x85, 0xE8, 0x6E, 0x31, 0x0A, 0xC2, 0x3E, 0x51, 0x39, 0x55, 0xF8, 0x4A, 0xE9, 0x48, 0x64, + 0x01, 0xDB, 0x8D, 0xE3, 0xAF, 0xA4, 0xB9, 0xD8, 0x19, 0xCA, 0x86, 0xCA, 0xA1, 0x6C, 0x1C, + 0x12, 0x3D, 0xA1, 0x02, 0x23, 0x1D, 0x29, 0x5D, 0x94, 0x04, 0xC6, 0x51, 0x01, 0x40, 0x0B, + 0xB3, 0x69, 0x25, 0x45, 0xEF, 0x43, 0x81, 0x4F, 0x97, 0x57, 0x0D, 0xA1, 0xA5, 0xC9, 0x9D, + 0xE6, 0x56, 0xB9, 0x38, 0x93, 0xA1, 0x78, 0xC5, 0xBF, 0x75, 0xFE, 0x81, 0x6A, 0x35, 0x64, + 0x89, 0x64, 0x43, 0x75, 0xFD, 0x29, 0x63, 0xD1, 0x15, 0xAB, 0x43, 0x60, 0x65, 0xDC, 0x98, + 0xD5, 0xC7, 0x6E, 0xF9, 0xB2, 0x38, 0xFB, 0x6E, 0xB0, 0x34, 0x9C, 0xA3, 0x73, 0x61, 0xF5, + 0x51, 0xFF, 0x1F, 0xCE, 0xB0, 0x08, 0x83, 0x29, 0xB3, 0x82, 0x07, 0xFA, 0xC4, 0xE5, 0x21, + 0xD3, 0xA0, 0xD4, 0xC0, 0xF8, 0x1A, 0x65, 0x9B, 0x35, 0x7A, 0xE3, 0x32, 0xA5, 0x4D, 0x77, + 0x1F, 0x23, 0x19, 0xCC, 0xE1, 0xB3, 0x50, 0x0D, 0xE8, 0x2F, 0x8B, 0x18, 0x89, 0x61, 0xCB, + 0x22, 0xBA, 0xE0, 0x4A, 0xA2, 0x7F, 0xA5, 0x1B, 0x45, 0x59, 0x33, 0xC4, 0x73, 0xDF, 0x42, + 0xC6, 0x00, 0x11, 0x37, 0xF2, 0x3C, 0x1B, 0xF4, 0x26, 0xD1, 0x6D, 0x93, 0xC1, 0x94, 0xD2, + 0x60, 0xE5, 0xF3, 0x91, 0x66, 0x92, 0x3C, 0x65, 0x27, 0xC1, 0x83, 0x13, 0x76, 0x5A, 0x88, + 0xEC, 0xB2, 0x59, 0x95, 0x18, 0x81, 0x2E, 0x94, 0x96, 0x53, 0x17, 0xB6, 0xFD, 0x8C, 0xCC, + 0xBE, 0x8D, 0x36, 0xB3, 0xC8, 0xF2, 0xB2, 0xBE, 0x0F, 0x12, 0x99, 0xFF, 0xFA, 0xF9, 0x18, + 0xAB, 0x30, 0xFA, 0xB1, 0x5B, 0xF2, 0xEE, 0xCA, 0x6E, 0xA1, 0xD9, 0xCE, 0xCC, 0x60, 0xA0, + 0x4D, 0xFD, 0x7C, 0xAD, 0x4D, 0x50, 0xB6, 0x88, 0x0D, 0x88, 0x3B, 0x28, 0x7F, 0xA1, 0x28, + 0x41, 0x0A, 0x43, 0xAD, 0xCC, 0x08, 0x14, 0xF3, 0xF2, 0x43, 0xE7, 0xCF, 0x6A, 0x5C, 0x11, + 0xD0, 0x6D, 0x99, 0xC8, 0x4F, 0xB1, 0x14, 0x06, 0xBC, 0x68, 0x6D, 0xBE, 0xCD, 0xD7, 0x58, + 0xA2, 0x17, 0xF5, 0x9E, 0xFD, 0xDA, 0xFA, 0xBF, 0x73, 0x57, 0x4A, 0xF8, 0xF3, 0xA9, 0x94, + 0xB3, 0x01, 0xE9, 0xA3, 0xDA, 0xEA, 0xC1, 0x40, 0x33, 0xAA, 0x3F, 0xE6, 0x0D, 0x6A, 0xE2, + 0xF3, 0x74, 0xE8, 0x1B, 0x3C, 0x2B, 0x25, 0x44, 0x8E, 0x1C, 0x36, 0xBE, 0xA9, 0x27, 0x6E, + 0x6A, 0x48, 0x8E, 0x2F, 0x2C, 0x9D, 0x71, 0x66, 0x23, 0x7C, 0x7A, 0x74, 0x93, 0x46, 0x2D, + 0xCA, 0x6B, 0xC6, 0x33, 0xDA, 0x1E, 0x1E, 0x44, 0x07, 0xFD, 0x89, 0x5D, 0x30, 0x02, 0x4C, + 0xB1, 0x73, 0xC0, 0x91, 0xEB, 0xA5, 0x61, 0x89, 0xA4, 0x04, 0xFD, 0xD5, 0x5F, 0x54, 0x59, + 0x81, 0xC3, 0x2A, 0x13, 0x89, 0xDA, 0x68, 0xB6, 0x3A, 0x9C, 0x70, 0x6F, 0x48, 0xB4, 0x3C, + 0xF8, 0x9B, 0xF8, 0xF2, 0x59, 0xBF, 0xF4, 0x8D, 0x06, 0x58, 0xEA, 0xA2, 0xA6, 0xB4, 0x70, + 0x08, 0x80, 0x2B, 0x50, 0x13, 0x36, 0x79, 0x17, 0x0B, 0x94, 0x0E, 0x4D, 0xF5, 0xC8, 0x14, + 0xB9, 0x02, 0x7D, 0xEE, 0x6B, 0xBD, 0x10, 0xB4, 0x85, 0x74, 0xA1, 0xB9, 0x84, 0x67, 0xC6, + 0x2C, 0xDB, 0xDA, 0x55, 0x54, 0x16, 0xDA, 0x02, 0xB6, 0xDA, 0x2A, 0x9B, 0x51, 0xD6, 0xDC, + 0x87, 0x80, 0xC1, 0xB8, 0x6F, 0x0C, 0xEF, 0x4B, 0xD1, 0x1A, 0x9F, 0x36, 0x2E, 0x9C, 0x7E, + 0x5F, 0x17, 0xE2, 0xC1, 0x82, 0x0C, 0x42, 0x0D, 0x15, 0x18, 0xCA, + ], +]; diff --git a/lib/encryption/src/lib.rs b/lib/encryption/src/lib.rs new file mode 100644 index 0000000..427c66c --- /dev/null +++ b/lib/encryption/src/lib.rs @@ -0,0 +1,5 @@ +pub mod config; +pub mod mersenne_twister; +pub mod rsa; + +mod ec; diff --git a/lib/encryption/src/mersenne_twister.rs b/lib/encryption/src/mersenne_twister.rs new file mode 100644 index 0000000..164e604 --- /dev/null +++ b/lib/encryption/src/mersenne_twister.rs @@ -0,0 +1,16 @@ +use rand_mt::Mt64; + +pub fn generate_xorpad(seed: u64, big_endian: bool) -> [u8; 4096] { + let mut buf = [0u8; 4096]; + let mut rng = Mt64::new(seed); + + if big_endian { + (0..512) + .for_each(|i| buf[i * 8..(i + 1) * 8].copy_from_slice(&rng.next_u64().to_be_bytes())); + } else { + (0..512) + .for_each(|i| buf[i * 8..(i + 1) * 8].copy_from_slice(&rng.next_u64().to_le_bytes())); + } + + buf +} diff --git a/lib/encryption/src/rsa.rs b/lib/encryption/src/rsa.rs new file mode 100644 index 0000000..24c4f5d --- /dev/null +++ b/lib/encryption/src/rsa.rs @@ -0,0 +1,41 @@ +use rsa::{ + Pkcs1v15Encrypt, RsaPrivateKey, RsaPublicKey, pkcs1v15::SigningKey, sha2::Sha256, + signature::RandomizedSigner, +}; + +const RSA_CHUNK_SIZE: usize = 117; + +pub fn encrypt(public_key: &[u8], data: &[u8]) -> String { + let public_key: RsaPublicKey = rsa::pkcs8::DecodePublicKey::from_public_key_der(public_key) + .expect("Failed to read public key from der"); + let mut rng = rand::thread_rng(); + + let mut result: Vec = Vec::new(); + for chunk in data.chunks(RSA_CHUNK_SIZE) { + let encrypted_chunk = public_key + .encrypt(&mut rng, Pkcs1v15Encrypt, chunk) + .expect("Encryption failed"); + + result.extend(encrypted_chunk); + } + + base64_simd::STANDARD.encode_to_string(result) +} + +pub fn sign(private_key: &[u8], data: &[u8]) -> String { + let private_key = rsa::pkcs8::DecodePrivateKey::from_pkcs8_der(private_key) + .expect("Failed to read pkcs8 private key"); + let signing_key = SigningKey::::new(private_key); + + base64_simd::STANDARD.encode_to_string(Box::<[u8]>::from( + signing_key.sign_with_rng(&mut rand::thread_rng(), data), + )) +} + +pub fn decrypt(private_key: &[u8], cipher: &str) -> Option> { + let private_key: RsaPrivateKey = rsa::pkcs8::DecodePrivateKey::from_pkcs8_der(private_key) + .expect("Failed to read pkcs8 private key"); + + let cipher = base64_simd::STANDARD.decode_to_vec(cipher).ok()?; + private_key.decrypt(Pkcs1v15Encrypt, &cipher).ok() +} diff --git a/lib/logic/Cargo.toml b/lib/logic/Cargo.toml new file mode 100644 index 0000000..0a22f60 --- /dev/null +++ b/lib/logic/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "vivian-logic" +edition = "2024" +version.workspace = true + +[dependencies] +tracing.workspace = true +num_enum.workspace = true +paste.workspace = true +thiserror.workspace = true + +vivian-proto.workspace = true +common.workspace = true +config.workspace = true + +# Should only be used for testing +hex = "0.4" diff --git a/lib/logic/src/dungeon/avatar_unit.rs b/lib/logic/src/dungeon/avatar_unit.rs new file mode 100644 index 0000000..20598ce --- /dev/null +++ b/lib/logic/src/dungeon/avatar_unit.rs @@ -0,0 +1,439 @@ +use std::{collections::HashMap, sync::LazyLock}; + +use config::TemplateCollection; + +use crate::item::{EAvatarSkillType, EquipItem}; + +use super::{DungeonEquipment, property::EPropertyType}; + +#[derive(Debug, Clone)] +pub struct AvatarUnit { + pub avatar_id: u32, + pub properties: HashMap, +} + +impl AvatarUnit { + pub fn new( + avatar_id: u32, + templates: &TemplateCollection, + equipment: &DungeonEquipment, + ) -> Self { + let mut unit = AvatarUnit { + avatar_id, + properties: HashMap::new(), + }; + + let Some(avatar_item) = equipment.avatars.get(&avatar_id) else { + return unit; + }; + + unit.init_default_properties(templates); + unit.init_level_advance_properties(avatar_item.rank, templates); + unit.apply_property_growth_by_level(avatar_item.level); + unit.apply_core_skill_properties( + avatar_item.get_skill_level(EAvatarSkillType::CoreSkill), + templates, + ); + + if let Some(weapon) = equipment.get_avatar_weapon(avatar_id) { + unit.init_weapon_properties(weapon.id, weapon.level, weapon.star, templates); + } + + if let Some(equips) = equipment.get_avatar_equips(avatar_id) { + unit.init_equip_properties(&equips, templates); + unit.init_equip_suit_properties(&equips, templates); + } + + unit.set_dynamic_properties(); + unit.apply_core_skill_bonus(avatar_item.get_skill_level(EAvatarSkillType::CoreSkill)); + unit.clear_custom_properties(); + unit.set_battle_properties(); + + unit + } + + fn set_battle_properties(&mut self) { + macro_rules! assign { + ($($name:ident),*) => { + ::paste::paste!($(self.properties.insert(EPropertyType::[<$name Battle>], self.get_property(EPropertyType::$name));)*); + }; + } + + assign!( + HpMax, + Atk, + Def, + BreakStun, + Crit, + CritDmg, + SpRecover, + ElementMystery, + ElementAbnormalPower, + AddedDamageRatioPhysics, + AddedDamageRatioFire, + AddedDamageRatioIce, + AddedDamageRatioElec, + AddedDamageRatioEther + ); + + self.add_property(EPropertyType::Hp, self.get_property(EPropertyType::HpMax)); + self.add_property( + EPropertyType::PenRatioBattle, + self.get_property(EPropertyType::Pen), + ); + self.add_property( + EPropertyType::PenDeltaBattle, + self.get_property(EPropertyType::PenValue), + ); + } + + fn clear_custom_properties(&mut self) { + self.properties.remove(&EPropertyType::HpMaxGrowth); + self.properties.remove(&EPropertyType::AtkGrowth); + self.properties.remove(&EPropertyType::DefGrowth); + self.properties.remove(&EPropertyType::HpMaxAdvance); + self.properties.remove(&EPropertyType::AtkAdvance); + self.properties.remove(&EPropertyType::DefAdvance); + } + + fn apply_core_skill_bonus(&mut self, core_skill_level: u32) { + // TODO: find out where this is actually configured + + type PropertyBonusConfig = (EPropertyType, EPropertyType, [i32; 7]); + static CORE_SKILL_SPECIALS: LazyLock> = + LazyLock::new(|| { + HashMap::from([( + 1121, + ( + EPropertyType::Atk, + EPropertyType::Def, + [40, 46, 52, 60, 66, 72, 80], + ), + )]) + }); + + if let Some((bonus_property, scale_property, percentage_per_level)) = + CORE_SKILL_SPECIALS.get(&self.avatar_id) + { + if (1..=7).contains(&core_skill_level) { + let bonus_value = self.get_property(*scale_property) + * percentage_per_level[(core_skill_level - 1) as usize] + / 100; + + self.add_property(*bonus_property, bonus_value); + } + } + } + + fn set_dynamic_properties(&mut self) { + use EPropertyType::*; + + self.set_dynamic_property(HpMax, HpMaxBase, HpMaxRatio, HpMaxDelta); + self.set_dynamic_property(Atk, AtkBase, AtkRatio, AtkDelta); + self.set_dynamic_property(Def, DefBase, DefRatio, DefDelta); + self.set_dynamic_property(BreakStun, BreakStunBase, BreakStunRatio, BreakStunDelta); + self.set_dynamic_property(Def, DefBase, DefRatio, DefDelta); + self.set_dynamic_property(Crit, CritBase, None, CritDelta); + self.set_dynamic_property(CritDmg, CritDmgBase, None, CritDmgDelta); + self.set_dynamic_property(Pen, PenBase, None, PenDelta); + self.set_dynamic_property(PenValue, PenValueBase, None, PenValueDelta); + self.set_dynamic_property(SpRecover, SpRecoverBase, SpRecoverRatio, SpRecoverDelta); + self.set_dynamic_property( + ElementMystery, + ElementMysteryBase, + None, + ElementMysteryDelta, + ); + self.set_dynamic_property( + ElementAbnormalPower, + ElementAbnormalPowerBase, + ElementAbnormalPowerRatio, + ElementAbnormalPowerDelta, + ); + self.set_dynamic_property( + AddedDamageRatioPhysics, + AddedDamageRatioPhysics1, + None, + AddedDamageRatioPhysics3, + ); + self.set_dynamic_property( + AddedDamageRatioFire, + AddedDamageRatioFire1, + None, + AddedDamageRatioFire3, + ); + self.set_dynamic_property( + AddedDamageRatioIce, + AddedDamageRatioIce1, + None, + AddedDamageRatioIce3, + ); + self.set_dynamic_property( + AddedDamageRatioElec, + AddedDamageRatioElec1, + None, + AddedDamageRatioElec3, + ); + self.set_dynamic_property( + AddedDamageRatioEther, + AddedDamageRatioEther1, + None, + AddedDamageRatioEther3, + ); + } + + fn set_dynamic_property( + &mut self, + ty: EPropertyType, + base: EPropertyType, + ratio: EPropertyType, + delta: EPropertyType, + ) { + const DIVISOR: f32 = 10_000.0; + + let base = self.get_property(base); + let ratio = self.get_property(ratio); + let delta = self.get_property(delta); + + if ty == EPropertyType::HpMax { + // Only HP has ceil() + self.properties.insert( + ty, + base + (base as f32 * ratio as f32 / DIVISOR).ceil() as i32 + delta, + ); + } else { + self.properties.insert( + ty, + base + (base as f32 * ratio as f32 / DIVISOR) as i32 + delta, + ); + } + } + + fn init_equip_suit_properties( + &mut self, + equips: &[&EquipItem], + templates: &TemplateCollection, + ) { + let mut equip_suit_counts = HashMap::::new(); + + equips.iter().for_each(|equip| { + let suit = equip.id / 100 * 100; + *equip_suit_counts.entry(suit).or_default() += 1; + }); + + equip_suit_counts.iter().for_each(|(&suit, &count)| { + if let Some(equipment_suit_template) = templates + .equipment_suit_template_tb() + .find(|tmpl| tmpl.id() == suit) + { + if equipment_suit_template.primary_condition() <= count { + equipment_suit_template + .primary_suit_propertys() + .unwrap() + .iter() + .for_each(|prop| { + self.add_property( + EPropertyType::try_from(prop.property()).unwrap(), + prop.value(), + ); + }); + } + } + }); + } + + fn init_equip_properties(&mut self, equips: &[&EquipItem], templates: &TemplateCollection) { + const DIVISOR: f32 = 10_000.0; + + equips.iter().for_each(|equip| { + let rarity = (equip.id / 10) % 10; + let property_rate = templates + .equipment_level_template_tb() + .find(|tmpl| tmpl.rarity() == rarity && tmpl.level() == equip.level) + .map(|tmpl| tmpl.property_rate()) + .unwrap_or(1); + + equip.properties.iter().for_each(|(&key, &(base, _))| { + self.add_property( + EPropertyType::try_from(key).unwrap(), + base as i32 + (base as f32 * property_rate as f32 / DIVISOR) as i32, + ); + }); + + equip + .sub_properties + .iter() + .for_each(|(&key, &(base, add))| { + self.add_property( + EPropertyType::try_from(key).unwrap(), + (base as f32 * add as f32) as i32, + ); + }); + }); + } + + fn init_weapon_properties( + &mut self, + weapon_id: u32, + level: u32, + star: u32, + templates: &TemplateCollection, + ) { + const DIVISOR: f32 = 10_000.0; + + let weapon_template = templates + .weapon_template_tb() + .find(|tmpl| tmpl.item_id() == weapon_id) + .unwrap(); + + let weapon_level_template = templates + .weapon_level_template_tb() + .find(|tmpl| tmpl.level() == level) + .unwrap(); + + let weapon_star_template = templates + .weapon_star_template_tb() + .find(|tmpl| tmpl.star() == star) + .unwrap(); + + let base_property = weapon_template.base_property().unwrap(); + let base_property_value = base_property.value(); + let base_property_value = base_property_value + + (base_property_value as f32 * weapon_level_template.rate() as f32 / DIVISOR) as i32 + + (base_property_value as f32 * weapon_star_template.star_rate() as f32 / DIVISOR) + as i32; + + self.add_property( + EPropertyType::try_from(base_property.property()).unwrap(), + base_property_value, + ); + + let rand_property = weapon_template.rand_property().unwrap(); + let rand_property_value = rand_property.value(); + let rand_property_value = rand_property_value + + (rand_property_value as f32 * weapon_star_template.rand_rate() as f32 / DIVISOR) + as i32; + + self.add_property( + EPropertyType::try_from(rand_property.property()).unwrap(), + rand_property_value, + ); + } + + fn apply_core_skill_properties( + &mut self, + core_skill_level: u32, + templates: &TemplateCollection, + ) { + if let Some(passive_skill_template) = + templates.avatar_passive_skill_template_tb().find(|tmpl| { + tmpl.avatar_id() == self.avatar_id + && tmpl.unlock_passive_skill_level() == core_skill_level + }) + { + passive_skill_template + .propertys() + .unwrap() + .iter() + .for_each(|prop| { + let ty = EPropertyType::try_from(prop.property()).unwrap(); + self.properties + .insert(ty, self.properties.get(&ty).copied().unwrap_or_default()); + }); + } + } + + fn apply_property_growth_by_level(&mut self, level: u32) { + self.grow_property_by_level( + level, + EPropertyType::HpMaxBase, + EPropertyType::HpMaxGrowth, + EPropertyType::HpMaxAdvance, + ); + + self.grow_property_by_level( + level, + EPropertyType::AtkBase, + EPropertyType::AtkGrowth, + EPropertyType::AtkAdvance, + ); + + self.grow_property_by_level( + level, + EPropertyType::DefBase, + EPropertyType::DefGrowth, + EPropertyType::DefAdvance, + ); + } + + fn grow_property_by_level( + &mut self, + level: u32, + base: EPropertyType, + growth: EPropertyType, + advance: EPropertyType, + ) { + const DIVISOR: f32 = 10_000.0; + + let base_value = *self.properties.get(&base).unwrap(); + let growth = *self.properties.get(&growth).unwrap(); + let advance = *self.properties.get(&advance).unwrap(); + + self.properties.insert( + base, + base_value + (((level - 1) as f32 * growth as f32) / DIVISOR) as i32 + advance, + ); + } + + fn init_level_advance_properties(&mut self, rank: u32, templates: &TemplateCollection) { + let (hp_max, attack, defence) = match templates + .avatar_level_advance_template_tb() + .find(|tmpl| tmpl.avatar_id() == self.avatar_id && tmpl.id() == rank) + { + Some(tmpl) => (tmpl.hp_max(), tmpl.attack(), tmpl.defence()), + None => (0, 0, 0), + }; + + self.properties.insert(EPropertyType::HpMaxAdvance, hp_max); + self.properties.insert(EPropertyType::AtkAdvance, attack); + self.properties.insert(EPropertyType::DefAdvance, defence); + } + + fn init_default_properties(&mut self, templates: &TemplateCollection) { + macro_rules! assign { + ($unit:ident, $config:ident, $($property:ident: $config_field:ident),*) => { + $($unit.properties.insert(EPropertyType::$property, $config.$config_field());)* + }; + } + + let battle_template = templates + .avatar_battle_template_tb() + .find(|tmpl| tmpl.id() == self.avatar_id) + .unwrap(); + + assign!(self, battle_template, + HpMaxBase: hp_max, + HpMaxGrowth: health_growth, + AtkBase: attack, + AtkGrowth: attack_growth, + BreakStunBase: break_stun, + DefBase: defence, + DefGrowth: defence_growth, + CritBase: crit, + CritDmgBase: crit_damage, + PenBase: pen_rate, + PenValueBase: pen_delta, + SpRecoverBase: sp_recover, + ElementMysteryBase: element_mystery, + ElementAbnormalPowerBase: element_abnormal_power + ); + } + + fn add_property(&mut self, ty: EPropertyType, value: i32) { + *self.properties.entry(ty).or_default() += value; + } + + fn get_property(&self, ty: EPropertyType) -> i32 { + self.properties.get(&ty).copied().unwrap_or(0) + } +} diff --git a/lib/logic/src/dungeon/enums.rs b/lib/logic/src/dungeon/enums.rs new file mode 100644 index 0000000..21b6a9f --- /dev/null +++ b/lib/logic/src/dungeon/enums.rs @@ -0,0 +1,31 @@ +use num_enum::{IntoPrimitive, TryFromPrimitive}; + +#[derive(Debug, PartialEq, Eq, Hash, IntoPrimitive)] +#[repr(u32)] +pub enum EQuestStatisticsType { + EventCount = 2, + CostTime = 3, + KilledEnemyCount = 4, + ArcanaCount = 5, + TarotCardCount = 6, + StaminaOverLevelTimes = 7, + RebornTimes = 8, + FinishedEventTypeCount = 9, + FinishedEventIDCount = 10, + TotalCoinUse = 14, + BangBooDreamLayer = 99, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, IntoPrimitive, TryFromPrimitive)] +#[repr(u32)] +pub enum EQuestType { + ArchiveFile = 1, + DungeonInner = 2, + Hollow = 3, + Manual = 4, + MainCity = 5, + HollowChallenge = 6, + ArchiveBattle = 7, + Knowledge = 8, + Daily = 9, +} diff --git a/lib/logic/src/dungeon/mod.rs b/lib/logic/src/dungeon/mod.rs new file mode 100644 index 0000000..7fe35b1 --- /dev/null +++ b/lib/logic/src/dungeon/mod.rs @@ -0,0 +1,167 @@ +use std::collections::HashMap; + +use crate::{ + item::{AvatarItem, EquipItem, WeaponItem}, + listener::{NotifyListener, NotifyListenerExt}, +}; + +mod avatar_unit; +mod enums; +mod property; + +pub use avatar_unit::AvatarUnit; +use common::time_util; +use config::TemplateCollection; +pub use enums::*; +use vivian_proto::{DungeonQuestFinishedScNotify, common::LogBattleStatistics}; + +#[derive(Clone)] +pub struct Dungeon { + pub quest_id: u32, + pub quest_type: u32, + pub begin_time: i64, + pub equipment: DungeonEquipment, + pub avatar_units: Vec, + pub inner_quest_id_list: Vec, + pub avatar_contribution: HashMap, + pub battle_statistic: LogBattleStatistics, + pub pending_quest_finish_notifies: HashMap, +} + +#[derive(Default, Clone)] +pub struct DungeonEquipment { + pub avatars: HashMap, + pub weapons: HashMap, + pub equips: HashMap, +} + +impl Dungeon { + pub fn new(quest_id: u32, quest_type: u32) -> Self { + Self { + quest_id, + quest_type, + begin_time: time_util::unix_timestamp_seconds(), + equipment: DungeonEquipment::default(), + avatar_units: Vec::new(), + inner_quest_id_list: Vec::new(), + avatar_contribution: HashMap::new(), + battle_statistic: LogBattleStatistics::default(), + pending_quest_finish_notifies: HashMap::new(), + } + } + + pub fn finish_main_dungeon_quest(&mut self, result: i32) { + self.pending_quest_finish_notifies.insert( + self.quest_id, + DungeonQuestFinishedScNotify { + quest_id: self.quest_id, + result: if result == 1 { 1 } else { 0 }, + rank: if result == 1 { 4 } else { 0 }, + statistics: HashMap::from([( + EQuestStatisticsType::CostTime.into(), + (time_util::unix_timestamp_seconds() - self.begin_time) as u64, + )]), + avatar_contribution_list: self + .avatar_contribution + .iter() + .map( + |(&avatar_id, &contribution)| vivian_proto::AvatarContributionInfo { + avatar_id, + contribution, + }, + ) + .collect(), + ..Default::default() + }, + ); + } + + pub fn flush_dungeon_quest_notifies(&mut self, listener: &mut dyn NotifyListener) { + std::mem::take(&mut self.pending_quest_finish_notifies) + .into_iter() + .for_each(|(_, notify)| listener.add(notify)); + } + + pub fn update_statistic(&mut self, statistic: LogBattleStatistics) { + statistic.avatar_list.iter().for_each(|avatar| { + *self + .avatar_contribution + .entry(avatar.avatar_id as u32) + .or_default() = avatar.damage as u32; // TODO: calculate contribution points properly + }); + + self.battle_statistic = statistic; + } + + pub fn add_avatar(&mut self, avatar_id: u32, templates: &TemplateCollection) { + self.avatar_units + .push(AvatarUnit::new(avatar_id, templates, &self.equipment)); + } + + pub fn as_client_proto(&self) -> vivian_proto::DungeonInfo { + vivian_proto::DungeonInfo { + quest_id: self.quest_id, + quest_type: self.quest_type, + dungeon_equip_info: Some(vivian_proto::DungeonEquipInfo { + avatar_list: self + .equipment + .avatars + .values() + .map(AvatarItem::as_client_proto) + .collect(), + weapon_list: self + .equipment + .weapons + .iter() + .map(|(&uid, weapon)| weapon.as_client_proto(uid)) + .collect(), + equip_list: self + .equipment + .equips + .iter() + .map(|(&uid, equip)| equip.as_client_proto(uid)) + .collect(), + buddy: Some(vivian_proto::BuddyInfo::default()), + ..Default::default() + }), + avatar_list: self + .avatar_units + .iter() + .map(|unit| vivian_proto::AvatarUnitInfo { + avatar_id: unit.avatar_id, + properties: unit + .properties + .iter() + .map(|(&ty, &value)| (ty.into(), value)) + .collect(), + }) + .collect(), + dungeon_quest_info: Some(vivian_proto::DungeonQuestInfo { + inner_quest_id_list: self.inner_quest_id_list.clone(), + }), + dungeon_statistics: Some(vivian_proto::DungeonStatistics::default()), + begin_time: self.begin_time, + } + } +} + +impl DungeonEquipment { + pub fn get_avatar_weapon(&self, avatar_id: u32) -> Option<&WeaponItem> { + self.avatars + .get(&avatar_id) + .and_then(|avatar| { + (avatar.weapon_uid != 0).then(|| self.weapons.get(&avatar.weapon_uid)) + }) + .flatten() + } + + pub fn get_avatar_equips(&self, avatar_id: u32) -> Option> { + self.avatars.get(&avatar_id).map(|avatar| { + self.equips + .iter() + .filter(|(uid, _)| avatar.dressed_equip_map.contains_key(uid)) + .map(|(_, equip)| equip) + .collect() + }) + } +} diff --git a/lib/logic/src/dungeon/property.rs b/lib/logic/src/dungeon/property.rs new file mode 100644 index 0000000..fc63d07 --- /dev/null +++ b/lib/logic/src/dungeon/property.rs @@ -0,0 +1,92 @@ +use num_enum::{IntoPrimitive, TryFromPrimitive}; + +#[repr(u32)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, IntoPrimitive, TryFromPrimitive)] +pub enum EPropertyType { + None = 0, + Hp = 1, + HpMax = 111, + Atk = 121, + BreakStun = 122, + Def = 131, + Crit = 201, + CritDmg = 211, + Pen = 231, + PenValue = 232, + SpRecover = 305, + ElementMystery = 312, + ElementAbnormalPower = 314, + AddedDamageRatioPhysics = 315, + AddedDamageRatioFire = 316, + AddedDamageRatioIce = 317, + AddedDamageRatioElec = 318, + AddedDamageRatioEther = 319, + // battle + HpMaxBattle = 1111, + AtkBattle = 1121, + BreakStunBattle = 1122, + DefBattle = 1131, + CritBattle = 1201, + CritDmgBattle = 1211, + PenRatioBattle = 1231, + PenDeltaBattle = 1232, + SpRecoverBattle = 1305, + ElementMysteryBattle = 1312, + ElementAbnormalPowerBattle = 1314, + AddedDamageRatioPhysicsBattle = 1315, + AddedDamageRatioFireBattle = 1316, + AddedDamageRatioIceBattle = 1317, + AddedDamageRatioElecBattle = 1318, + AddedDamageRatioEtherBattle = 1319, + // base + HpMaxBase = 11101, + AtkBase = 12101, + BreakStunBase = 12201, + DefBase = 13101, + CritBase = 20101, + CritDmgBase = 21101, + PenBase = 23101, + PenValueBase = 23201, + SpRecoverBase = 30501, + ElementMysteryBase = 31201, + ElementAbnormalPowerBase = 31401, + // ratio + HpMaxRatio = 11102, + AtkRatio = 12102, + BreakStunRatio = 12202, + DefRatio = 13102, + SpRecoverRatio = 30502, + ElementAbnormalPowerRatio = 31402, + // delta + HpMaxDelta = 11103, + AtkDelta = 12103, + BreakStunDelta = 12203, + DefDelta = 13103, + CritDelta = 20103, + CritDmgDelta = 21103, + PenDelta = 23103, + PenValueDelta = 23203, + SpRecoverDelta = 30503, + ElementMysteryDelta = 31203, + ElementAbnormalPowerDelta = 31403, + // damage ratios 1/3 + AddedDamageRatioPhysics1 = 31501, + AddedDamageRatioPhysics3 = 31503, + AddedDamageRatioFire1 = 31601, + AddedDamageRatioFire3 = 31603, + AddedDamageRatioIce1 = 31701, + AddedDamageRatioIce3 = 31703, + AddedDamageRatioElec1 = 31801, + AddedDamageRatioElec3 = 31803, + AddedDamageRatioEther1 = 31901, + AddedDamageRatioEther3 = 31903, + // --- custom + // growth + HpMaxGrowth = 99991110, + AtkGrowth = 99991210, + DefGrowth = 99991310, + // advance + HpMaxAdvance = 99991111, + AtkAdvance = 99991211, + DefAdvance = 99991311, +} diff --git a/lib/logic/src/event/action.rs b/lib/logic/src/event/action.rs new file mode 100644 index 0000000..cf5818a --- /dev/null +++ b/lib/logic/src/event/action.rs @@ -0,0 +1,399 @@ +use config::{ + ActionDownloadFullResource, ActionEnterHollowQuest, ActionOpenUI, ActionPerform, + ActionShowTeleportUi, ActionShowTip, ActionSwitchSection, ActionTriggerInteract, + ConfigBreakDialogAnim, ConfigCameraMoveV2, ConfigCameraStretch, ConfigCloseDialog, + ConfigEventAction, ConfigLogText, ConfigMakeDialogChoice, ConfigOpenDialog, ConfigPlayAnim, + ConfigShowPopWindow, ConfigShowTip, ConfigStopAnim, ConfigWaitSeconds, ConfigWaitTipsEnd, +}; +use vivian_proto::{ActionType, Message}; + +pub trait ActionBase { + fn to_proto(&self) -> Option; +} + +impl ActionBase for ActionOpenUI { + fn to_proto(&self) -> Option { + Some(vivian_proto::ActionInfo { + action_id: self.id, + action_type: ActionType::OpenUi.into(), + body: vivian_proto::action::ActionOpenUi { + ui: self.ui.clone(), + args: self.args, + store_template_id: self.store_template_id, + npc_id: 0, + } + .encode_to_vec(), + }) + } +} + +impl ActionBase for ActionSwitchSection { + fn to_proto(&self) -> Option { + Some(vivian_proto::ActionInfo { + action_id: self.id, + action_type: ActionType::SwitchSection.into(), + body: vivian_proto::action::ActionSwitchSection { + section: self.section_id, + transform_id: self.transform.clone(), + camera_x: self.camera_x, + camera_y: self.camera_y, + } + .encode_to_vec(), + }) + } +} + +impl ActionBase for ActionPerform { + fn to_proto(&self) -> Option { + Some(vivian_proto::ActionInfo { + action_id: self.id, + action_type: ActionType::Perform.into(), + body: + vivian_proto::action::ActionPerform { + perform_id: self.perform_id, + perform_id_2: self.perform_id_2, + perform_id_3: self.perform_id_3, + black_mask: self.black_mask, + black_mask_fade_out: self.black_mask_fade_out, + black_mask_fade_out_2: self.black_mask_fade_out_2, + avatar_id: self.avatar_id, + npc_id: self.npc_id, + unk_perform_field: Some( + vivian_proto::action::action_perform::UnkPerform::default(), + ), + participators: self.participators.clone(), + ..Default::default() + } + .encode_to_vec(), + }) + } +} + +impl ActionBase for ActionShowTip { + fn to_proto(&self) -> Option { + Some(vivian_proto::ActionInfo { + action_id: self.id, + action_type: ActionType::ShowTip.into(), + body: vivian_proto::action::ActionShowTip { + tip_id: self.tip_id, + } + .encode_to_vec(), + }) + } +} + +impl ActionBase for ActionTriggerInteract { + fn to_proto(&self) -> Option { + Some(vivian_proto::ActionInfo { + action_id: self.id, + action_type: ActionType::TriggerInteract.into(), + body: vivian_proto::action::ActionTriggerInteract { + tag_id: self.tag_id, + interact_id: self.interact_id, + } + .encode_to_vec(), + }) + } +} + +impl ActionBase for ActionDownloadFullResource { + fn to_proto(&self) -> Option { + Some(vivian_proto::ActionInfo { + action_id: self.id, + action_type: ActionType::DownloadFullResource.into(), + body: vivian_proto::action::ActionDownloadFullResource {}.encode_to_vec(), + }) + } +} + +impl ActionBase for ActionShowTeleportUi { + fn to_proto(&self) -> Option { + Some(vivian_proto::ActionInfo { + action_id: self.id, + action_type: ActionType::ShowTeleportUi.into(), + body: vivian_proto::action::ActionShowTeleportUi { + black_mask: self.black_mask, + } + .encode_to_vec(), + }) + } +} + +impl ActionBase for ConfigOpenDialog { + fn to_proto(&self) -> Option { + Some(vivian_proto::ActionInfo { + action_id: self.id, + action_type: ActionType::OpenDialogHollow.into(), + body: vivian_proto::action::ConfigOpenDialog { + open_event: self.open_event, + camera_move: self.camera_move, + unk_open_dialog: self.unk_open_dialog, + open_param: Some(vivian_proto::action::OpenDialogParam { + unk_open_dialog_flag_1: self.open_param.unk_open_dialog_flag_1, + unk_open_dialog_flag_2: self.open_param.unk_open_dialog_flag_2, + unk_open_dialog_flag_3: self.open_param.unk_open_dialog_flag_3, + start_texture_sheet: self.open_param.start_texture_sheet.clone(), + loop_texture_sheet: self.open_param.loop_texture_sheet.clone(), + end_texture_sheet: self.open_param.end_texture_sheet.clone(), + }), + } + .encode_to_vec(), + }) + } +} + +impl ActionBase for ConfigLogText { + fn to_proto(&self) -> Option { + Some(vivian_proto::ActionInfo { + action_id: self.id, + action_type: ActionType::LogText.into(), + body: vivian_proto::action::ConfigLogText { + messages: self.messages.clone(), + log_title: self.log_title.clone(), + voicelines: self.voicelines.clone(), + } + .encode_to_vec(), + }) + } +} + +impl ActionBase for ConfigCloseDialog { + fn to_proto(&self) -> Option { + Some(vivian_proto::ActionInfo { + action_id: self.id, + action_type: ActionType::CloseDialogHollow.into(), + body: vivian_proto::action::ConfigCloseDialog { + camera_move: self.camera_move, + need_reset_center: self.need_reset_center, + } + .encode_to_vec(), + }) + } +} + +impl ActionBase for ConfigCameraMoveV2 { + fn to_proto(&self) -> Option { + Some(vivian_proto::ActionInfo { + action_id: self.id, + action_type: ActionType::CameraMoveV2.into(), + body: vivian_proto::action::ConfigCameraMoveV2 { + stretch_key: self.stretch_key.clone(), + r#type: self.r#type.into(), + position_offset_type: self.position_offset_type.into(), + position_offset_x: self.position_offset_x.clone(), + position_offset_y: self.position_offset_y.clone(), + radius_x: self.radius_x.clone(), + radius_y: self.radius_y.clone(), + bound_index_x: self + .bound_index_x + .as_ref() + .map(|v| vivian_proto::action::ConfigVector2Int { x: v.x, y: v.y }), + bound_index_y: self + .bound_index_y + .as_ref() + .map(|v| vivian_proto::action::ConfigVector2Int { x: v.x, y: v.y }), + freeze_z: self.freeze_z, + parallel: self.parallel, + } + .encode_to_vec(), + }) + } +} + +impl ActionBase for ConfigWaitSeconds { + fn to_proto(&self) -> Option { + Some(vivian_proto::ActionInfo { + action_id: self.id, + action_type: ActionType::WaitSeconds.into(), + body: vivian_proto::action::ConfigWaitSeconds { + wait_time: self.wait_time, + } + .encode_to_vec(), + }) + } +} + +impl ActionBase for ConfigShowTip { + fn to_proto(&self) -> Option { + Some(vivian_proto::ActionInfo { + action_id: self.id, + action_type: ActionType::ShowTipHollow.into(), + body: vivian_proto::action::ConfigShowTip { + tip_id: self.tip_id, + } + .encode_to_vec(), + }) + } +} + +impl ActionBase for ConfigShowPopWindow { + fn to_proto(&self) -> Option { + Some(vivian_proto::ActionInfo { + action_id: self.id, + action_type: ActionType::ShowPopWindowHollow.into(), + body: vivian_proto::action::ConfigShowPopWindow { + pop_id: self.pop_id, + show_directly: self.show_directly, + } + .encode_to_vec(), + }) + } +} + +impl ActionBase for ConfigCameraStretch { + fn to_proto(&self) -> Option { + Some(vivian_proto::ActionInfo { + action_id: self.id, + action_type: ActionType::CameraStretch.into(), + body: vivian_proto::action::ConfigCameraStretch { + stretch_key: self.stretch_key.clone(), + shake_key: self.shake_key.clone(), + r#type: self.r#type.into(), + parallel: self.parallel, + } + .encode_to_vec(), + }) + } +} + +impl ActionBase for ConfigPlayAnim { + fn to_proto(&self) -> Option { + Some(vivian_proto::ActionInfo { + action_id: self.id, + action_type: ActionType::PlayAnimHollow.into(), + body: vivian_proto::action::ConfigPlayAnim { + anim_id: self.anim_id, + indexes: self + .indexes + .iter() + .map(|i| vivian_proto::action::ConfigVector2Int { x: i.x, y: i.y }) + .collect(), + looping: self.looping, + } + .encode_to_vec(), + }) + } +} + +impl ActionBase for ConfigStopAnim { + fn to_proto(&self) -> Option { + Some(vivian_proto::ActionInfo { + action_id: self.id, + action_type: ActionType::StopAnim.into(), + body: vivian_proto::action::ConfigStopAnim { + indexes: self + .indexes + .iter() + .map(|i| vivian_proto::action::ConfigVector2Int { x: i.x, y: i.y }) + .collect(), + } + .encode_to_vec(), + }) + } +} + +impl ActionBase for ConfigWaitTipsEnd { + fn to_proto(&self) -> Option { + Some(vivian_proto::ActionInfo { + action_id: self.id, + action_type: ActionType::WaitTipsEnd.into(), + body: vivian_proto::action::ConfigWaitTipsEnd { + tips_id: self.tips_id.clone(), + } + .encode_to_vec(), + }) + } +} + +impl ActionBase for ConfigBreakDialogAnim { + fn to_proto(&self) -> Option { + Some(vivian_proto::ActionInfo { + action_id: self.id, + action_type: ActionType::BreakDialogAnim.into(), + body: vivian_proto::action::ConfigBreakDialogAnim {}.encode_to_vec(), + }) + } +} + +impl ActionBase for ConfigMakeDialogChoice { + fn to_proto(&self) -> Option { + Some(vivian_proto::ActionInfo { + action_id: self.id, + action_type: ActionType::MakeDialogChoice.into(), + body: vivian_proto::action::ConfigMakeDialogChoice { + title: self.title.clone(), + description: self.description.clone(), + question_description: self.question_description.clone(), + choices: self + .choice_details + .iter() + .map(|detail| vivian_proto::action::ConfigDialogChoiceDetail { + option_text: detail.option_text.clone(), + option_id: detail.option_id.clone(), + option_text_2: detail.option_text_2.clone(), + choice_id: detail.choice_id, + uid: detail.uid, + }) + .collect(), + } + .encode_to_vec(), + }) + } +} + +impl ActionBase for ActionEnterHollowQuest { + fn to_proto(&self) -> Option { + Some(vivian_proto::ActionInfo { + action_id: self.id, + action_type: ActionType::EnterHollowQuest.into(), + body: vivian_proto::action::ActionEnterHollowQuest { + hollow_id: self.hollow_id as i32, + r#type: 1, + close_black_mask: true, + } + .encode_to_vec(), + }) + } +} + +macro_rules! client_actions { + ($($name:ident),*) => { + pub fn action_to_proto(config: &ConfigEventAction) -> Option { + match config { + $(ConfigEventAction::$name(cfg) => cfg.to_proto(),)* + _ => None, + } + } + }; +} + +client_actions! { + ActionOpenUI, + ActionSwitchSection, + ActionPerform, + ActionShowTip, + ActionTriggerInteract, + ActionDownloadFullResource, + ActionShowTeleportUi, + ConfigOpenDialog, + ConfigLogText, + ConfigCloseDialog, + ConfigCameraMoveV2, + ConfigWaitSeconds, + ConfigShowTip, + ConfigShowPopWindow, + ConfigCameraStretch, + ConfigPlayAnim, + ConfigStopAnim, + ConfigWaitTipsEnd, + ConfigBreakDialogAnim, + ConfigMakeDialogChoice, + ActionEnterHollowQuest +} + +pub fn requires_client_input(config: &ConfigEventAction) -> bool { + matches!( + config, + ConfigEventAction::ConfigLogText(_) | ConfigEventAction::ConfigMakeDialogChoice(_) + ) +} diff --git a/lib/logic/src/event/event_util.rs b/lib/logic/src/event/event_util.rs new file mode 100644 index 0000000..e574af1 --- /dev/null +++ b/lib/logic/src/event/event_util.rs @@ -0,0 +1,13 @@ +use config::GraphReference; +use vivian_proto::EventGraphOwnerType; + +pub fn graph_reference_to_owner_type(graph_ref: GraphReference) -> EventGraphOwnerType { + use GraphReference::*; + + match graph_ref { + MainCitySection(_) => EventGraphOwnerType::Section, + Interact(_) => EventGraphOwnerType::SceneUnit, + Quest(_) => EventGraphOwnerType::Scene, + HollowEvent(_) => EventGraphOwnerType::Hollow, + } +} diff --git a/lib/logic/src/event/mod.rs b/lib/logic/src/event/mod.rs new file mode 100644 index 0000000..305dde2 --- /dev/null +++ b/lib/logic/src/event/mod.rs @@ -0,0 +1,134 @@ +mod action; +pub(crate) mod event_util; +mod uid; + +use std::collections::HashMap; + +pub use action::ActionBase; +use num_enum::{IntoPrimitive, TryFromPrimitive}; +use tracing::error; +pub use uid::EventUID; + +use config::{ConfigEvent, ConfigEventAction, GraphReference, SectionEvent}; +use vivian_proto::ActionInfo; + +use crate::listener::LogicEventListener; + +#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, IntoPrimitive, TryFromPrimitive)] +#[repr(u32)] +pub enum EventState { + Initing, + Running, + Pause, + WaitingMsg, + WaitingClient, + Finished, + Error, +} + +pub struct Event { + pub ty: SectionEvent, + pub graph: GraphReference, + pub tag: u32, + pub config: &'static ConfigEvent, + pub cur_action_index: isize, + pub state: EventState, + pub specials: HashMap, +} + +impl Event { + pub fn new( + ty: SectionEvent, + tag: u32, + graph: GraphReference, + config: &'static ConfigEvent, + ) -> Self { + Self { + ty, + graph, + tag, + config, + cur_action_index: -1, + state: EventState::Initing, + specials: HashMap::new(), // TODO: take initial ones from graph config + } + } + + pub fn add_parameter(&mut self, param_config_str: Option<&str>) { + let Some((key, value)) = param_config_str.and_then(|p| { + let mut p = p.split(':'); + Some((p.next()?, p.next()?)) + }) else { + return; + }; + + let Ok(value) = value.parse::() else { + error!("failed to parse parameter string, key: {key}, value: {value}"); + return; + }; + + self.specials.insert(key.to_string(), value); + } + + pub fn wakeup( + &mut self, + own_uid: EventUID, + action_listener: &mut dyn ActionListener, + logic_listener: &mut dyn LogicEventListener, + ) { + self.state = EventState::Running; + + for (index, action) in self + .config + .actions + .iter() + .enumerate() + .skip((self.cur_action_index + 1) as usize) + { + self.cur_action_index = index as isize; + + let uid = ((self.graph.id() as u64) << 32) | own_uid.event_id() as u64; + if action_listener.should_execute_action(uid, action, logic_listener, &self.specials) { + action_listener.execute_action(uid, action, logic_listener, &self.specials); + + if let Some(client_action_info) = action::action_to_proto(action) { + action_listener.enqueue_client_action((own_uid, self), client_action_info); + + if action_listener.is_immediate_mode() || action::requires_client_input(action) + { + self.state = EventState::WaitingClient; + return; + } + } + } + } + + self.state = EventState::Finished; + } + + pub fn is_finished(&self) -> bool { + self.state >= EventState::Finished + } +} + +pub trait ActionListener { + fn should_execute_action( + &mut self, + event_uid: u64, + action: &ConfigEventAction, + listener: &mut dyn LogicEventListener, + specials: &HashMap, + ) -> bool; + + fn execute_action( + &mut self, + event_uid: u64, + action: &ConfigEventAction, + listener: &mut dyn LogicEventListener, + specials: &HashMap, + ); + + fn enqueue_client_action(&mut self, by_event: (EventUID, &Event), info: ActionInfo); + + fn is_immediate_mode(&self) -> bool; +} diff --git a/lib/logic/src/event/uid.rs b/lib/logic/src/event/uid.rs new file mode 100644 index 0000000..fc118a8 --- /dev/null +++ b/lib/logic/src/event/uid.rs @@ -0,0 +1,35 @@ +use std::ops::Deref; + +use vivian_proto::EventGraphOwnerType; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub struct EventUID(u64); + +impl EventUID { + pub fn new(owner_type: EventGraphOwnerType, event_id: u32) -> Self { + let owner_type = i32::from(owner_type) as u64; + Self((owner_type << 32) | event_id as u64) + } + + pub fn owner_type(&self) -> EventGraphOwnerType { + EventGraphOwnerType::try_from((self.0 >> 32) as i32).unwrap() + } + + pub fn event_id(&self) -> u32 { + (self.0 & 0xFFFFFFFF) as u32 + } +} + +impl Deref for EventUID { + type Target = u64; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl From for EventUID { + fn from(value: u64) -> Self { + Self(value) + } +} diff --git a/lib/logic/src/fight/mod.rs b/lib/logic/src/fight/mod.rs new file mode 100644 index 0000000..da47e6f --- /dev/null +++ b/lib/logic/src/fight/mod.rs @@ -0,0 +1,91 @@ +use tracing::info; +use vivian_proto::{EnterSceneScNotify, common::LogBattleStatistics}; + +use crate::{ + LogicResources, + dungeon::Dungeon, + listener::{LogicEventListener, NotifyListener, NotifyListenerExt}, + scene::{ELocalPlayType, SceneType}, +}; + +pub struct GameFightState { + pub resources: LogicResources, + pub dungeon: Dungeon, + pub scene_id: u32, + pub play_type: ELocalPlayType, + pub time_period: String, + pub weather: String, + has_sent_initial_scene_notify: bool, +} + +impl GameFightState { + pub fn new( + scene_id: u32, + play_type: ELocalPlayType, + resources: LogicResources, + dungeon: Dungeon, + ) -> Self { + Self { + scene_id, + play_type, + resources, + dungeon, + time_period: String::from("Morning"), + weather: String::from("SunShine"), + has_sent_initial_scene_notify: false, + } + } + + pub fn end_battle( + &mut self, + result: i32, + statistic: LogBattleStatistics, + listener: &mut dyn LogicEventListener, + ) { + info!( + "battle at {scene_id} is over, result: {result}", + scene_id = self.scene_id + ); + + self.dungeon.update_statistic(statistic); + + if self.dungeon.quest_type == 10 { + self.dungeon.finish_main_dungeon_quest(result); + + if result == 1 { + listener.hollow_quest_finished(self.dungeon.quest_id); + } + } + } + + pub fn scene_type(&self) -> SceneType { + SceneType::Fight + } + + pub fn flush_notifies(&mut self, listener: &mut dyn NotifyListener) { + if !self.has_sent_initial_scene_notify { + self.has_sent_initial_scene_notify = true; + + listener.add(EnterSceneScNotify { + scene: Some(self.client_scene_data_proto()), + dungeon: Some(self.dungeon.as_client_proto()), + }); + } + } + + pub fn client_scene_data_proto(&self) -> vivian_proto::SceneData { + vivian_proto::SceneData { + scene_id: self.scene_id, + play_type: self.play_type.into(), + scene_type: self.scene_type().into(), + fight_scene_data: Some(vivian_proto::FightSceneData { + scene_reward: Some(vivian_proto::SceneRewardInfo::default()), + scene_perform: Some(vivian_proto::ScenePerformInfo { + time: self.time_period.clone(), + weather: self.weather.clone(), + }), + }), + ..Default::default() + } + } +} diff --git a/lib/logic/src/hall/action_executor.rs b/lib/logic/src/hall/action_executor.rs new file mode 100644 index 0000000..990279b --- /dev/null +++ b/lib/logic/src/hall/action_executor.rs @@ -0,0 +1,147 @@ +actions! { + ActionCreateNpc; + ActionChangeInteract; + ActionSetMainCityObjectState; + ActionForceRefresh; + ActionResetEvent; + ActionSetQuestPhase; + ActionRemoveMainCityQuestInteract; + ActionRemoveMainCityQuestNpc; + ActionChangeBackSceneInfo; + ActionSetBGM; + ActionSetMainCityTime; + ConfigUnlockHollowQuest; +} + +fn execute_action_create_npc(context: &mut EventGraphContext<'_>, cfg: &ActionCreateNpc) { + if cfg.tag_id != 0 { + context.hall.create_npc(cfg.tag_id); + } + + cfg.tag_ids + .iter() + .for_each(|&tag_id| context.hall.create_npc(tag_id)); +} + +fn execute_action_change_interact(context: &mut EventGraphContext<'_>, cfg: &ActionChangeInteract) { + context.hall.change_interact( + cfg.interact_id as i32, + &cfg.tag_ids, + &Scale::new_by_config_struct(&cfg.interact_scale), + cfg.participators.clone(), + false, + ); +} + +fn execute_action_set_main_city_object_state( + context: &mut EventGraphContext<'_>, + cfg: &ActionSetMainCityObjectState, +) { + cfg.object_state.iter().for_each(|(&tag, &state)| { + context.hall.main_city_objects_state.insert(tag, state); + }); +} + +fn execute_action_force_refresh(context: &mut EventGraphContext<'_>, _: &ActionForceRefresh) { + context.hall.force_refresh(); +} + +fn execute_action_reset_event(context: &mut EventGraphContext<'_>, _: &ActionResetEvent) { + context + .hall + .already_executed_events + .remove(&context.event_uid); +} + +fn execute_action_change_back_scene_info( + context: &mut EventGraphContext<'_>, + cfg: &ActionChangeBackSceneInfo, +) { + context + .listener + .change_back_scene_info(cfg.section_id, cfg.transform.clone()); +} + +fn execute_action_set_quest_phase( + context: &mut EventGraphContext<'_>, + action: &ActionSetQuestPhase, +) { + if let Some(phase) = context.hall.main_city_quests.get_mut(&action.quest_id) { + if *phase != action.target_phase { + *phase = action.target_phase; + + if action.target_phase == EQuestState::Finished { + context.hall.attach_graph( + GraphReference::Quest(action.quest_id * 10 + 1), + context.listener, + ); + + for added_quest_id in context.listener.main_city_quest_finished(action.quest_id) { + context + .hall + .main_city_quests + .insert(added_quest_id, EQuestState::InProgress); + + context + .hall + .attach_graph(GraphReference::Quest(added_quest_id), context.listener); + } + } + } + } +} + +fn execute_config_unlock_hollow_quest( + context: &mut EventGraphContext<'_>, + action: &ConfigUnlockHollowQuest, +) { + context.listener.unlock_hollow_quest(action.quest_id); +} + +fn execute_action_remove_main_city_quest_interact( + context: &mut EventGraphContext<'_>, + _: &ActionRemoveMainCityQuestInteract, +) { + context.hall.reset_interacts(); +} + +fn execute_action_remove_main_city_quest_npc( + context: &mut EventGraphContext<'_>, + _: &ActionRemoveMainCityQuestNpc, +) { + context.hall.remove_quest_npc(); +} + +fn execute_action_set_b_g_m(context: &mut EventGraphContext<'_>, cfg: &ActionSetBGM) { + context.hall.bgm_id = cfg.main_city_music_id; +} + +fn execute_action_set_main_city_time( + context: &mut EventGraphContext<'_>, + cfg: &ActionSetMainCityTime, +) { + context.hall.set_time_period(cfg.time_period); +} + +macro_rules! actions { + ($($cfg:ident;)*) => { + pub fn execute(context: &mut EventGraphContext<'_>, cfg: &::config::ConfigEventAction) { + ::paste::paste!(match cfg { + $(::config::ConfigEventAction::$cfg(cfg) => [](context, cfg),)* + _ => (), + }); + } + }; +} + +use actions; +use config::{ + ActionChangeBackSceneInfo, ActionChangeInteract, ActionCreateNpc, ActionForceRefresh, + ActionRemoveMainCityQuestInteract, ActionRemoveMainCityQuestNpc, ActionResetEvent, + ActionSetBGM, ActionSetMainCityObjectState, ActionSetMainCityTime, ActionSetQuestPhase, + ConfigUnlockHollowQuest, EQuestState, GraphReference, +}; + +use crate::math::Scale; + +use super::EventGraphContext; diff --git a/lib/logic/src/hall/mod.rs b/lib/logic/src/hall/mod.rs new file mode 100644 index 0000000..4ac4d6e --- /dev/null +++ b/lib/logic/src/hall/mod.rs @@ -0,0 +1,672 @@ +use std::collections::{HashMap, HashSet}; + +use config::{ + ConfigEvent, ConfigEventAction, EQuestState, ETimePeriodType, GraphReference, SectionEvent, +}; +use npc::{Interact, InteractTarget, SceneUnit}; +use tracing::{error, warn}; +use vivian_proto::{ + EnterSceneScNotify, EventGraphOwnerType, FinishEventGraphScNotify, SectionEventScNotify, + common::TimePeriodType, +}; + +use crate::{ + LogicResources, + event::{ActionListener, Event, EventState, EventUID, event_util}, + listener::{LogicEventListener, NotifyListener}, + math::{Scale, Transform}, + scene::SceneType, +}; + +pub mod npc; + +mod action_executor; +mod predicate_executor; +mod time_period_util; + +pub struct GameHallState { + pub resources: LogicResources, + pub section_id: u32, + pub position: HallPosition, + pub bgm_id: u32, + pub day_of_week: u32, + pub time_of_day: u32, + pub time_period: TimePeriodType, + pub player_avatar_id: u32, + pub control_guise_avatar_id: u32, + pub scene_units: HashMap, + pub running_events: HashMap, + pub already_executed_events: HashSet, + pub attached_graphs: HashSet, + pub main_city_quests: HashMap, + pub main_city_objects_state: HashMap, + pending_event_notifies: Vec, + has_sent_initial_scene_notify: bool, + refresh_required: bool, + enter_finished: bool, +} + +pub enum HallPosition { + Id(String), + Transform(Transform), +} + +pub struct HallGameParameters { + pub player_avatar_id: u32, + pub control_guise_avatar_id: u32, + pub bgm_id: u32, + pub day_of_week: u32, + pub time_of_day: u32, + pub time_period: i32, +} + +pub struct EventGraphContext<'logic> { + pub hall: &'logic mut GameHallState, + pub listener: &'logic mut dyn LogicEventListener, + pub event_uid: u64, +} + +impl GameHallState { + pub fn new( + resources: LogicResources, + section_id: u32, + position: Option, + parameters: HallGameParameters, + ) -> Self { + let section = resources + .template_collection + .section_config_template_tb() + .find(|tmpl| tmpl.section_id() == section_id) + .unwrap(); + + let position = position + .unwrap_or_else(|| HallPosition::Id(section.born_transform().unwrap().to_string())); + + Self { + resources, + position, + section_id, + bgm_id: parameters.bgm_id, + day_of_week: parameters.day_of_week, + time_of_day: parameters.time_of_day, + time_period: TimePeriodType::try_from(parameters.time_period).unwrap_or_default(), + player_avatar_id: parameters.player_avatar_id, + control_guise_avatar_id: parameters.control_guise_avatar_id, + scene_units: HashMap::new(), + running_events: HashMap::new(), + already_executed_events: HashSet::new(), + attached_graphs: HashSet::new(), + main_city_quests: HashMap::new(), + main_city_objects_state: HashMap::new(), + pending_event_notifies: Vec::new(), + has_sent_initial_scene_notify: false, + refresh_required: false, + enter_finished: false, + } + } + + pub fn enter_section_finished(&mut self) { + self.enter_finished = true; + } + + pub fn attach_graph( + &mut self, + graph_ref: GraphReference, + listener: &mut dyn LogicEventListener, + ) { + let Some(event_graph) = self.resources.event_graphs.get(graph_ref, self.section_id) else { + error!("tried to attach graph, config is missing {graph_ref:?}"); + return; + }; + + if self.attached_graphs.insert(graph_ref) { + // Execute all on_add events + for event_name in event_graph.on_add.iter() { + let event_type = SectionEvent::Custom(event_name.clone()); + if let Some(event_config) = event_graph.events.get(&event_type) { + self.initiate_event( + graph_ref, + event_type, + event_util::graph_reference_to_owner_type(graph_ref), + 0, + event_config, + listener, + ); + } + } + } + } + + pub fn clear_attached_graphs(&mut self, active_main_city_quests: &[u32]) { + self.attached_graphs.retain(|graph| { + if let GraphReference::Quest(id) = graph { + active_main_city_quests.contains(id) + } else { + true + } + }); + } + + pub fn remove_finished_quests(&mut self) -> Vec { + let finished_quest_id_list = self + .main_city_quests + .iter() + .filter(|(_, state)| **state == EQuestState::Finished) + .map(|(&id, _)| id) + .collect::>(); + + self.main_city_quests + .retain(|_, state| *state != EQuestState::Finished); + + finished_quest_id_list + } + + pub fn create_npc(&mut self, tag_id: u32) { + let Some(main_city_object) = self + .resources + .template_collection + .main_city_object_template_tb() + .find(|tmpl| tmpl.tag_id() == tag_id as i32) + else { + error!("MainCityObjectTemplate with tag_id {tag_id} doesn't exist",); + return; + }; + + self.refresh_required = true; + self.scene_units.insert( + tag_id, + SceneUnit { + npc_id: tag_id, + interacts: main_city_object + .default_interact_ids() + .unwrap_or_default() + .iter() + .map(|interact_id| { + ( + interact_id as u32, + Interact { + id: interact_id as u32, + tag_id: tag_id as i32, + name: main_city_object + .interact_name() + .map(|name| name.to_string()) + .unwrap_or_default(), + participators: HashMap::from([(tag_id, String::from("A"))]), + targets: HashSet::from([InteractTarget::Npc]), + scale: Scale::new_by_config_str( + main_city_object.interact_scale().unwrap(), + ), + }, + ) + }) + .collect(), + }, + ); + } + + pub fn change_interact( + &mut self, + interact_id: i32, + tag_ids: &[u32], + scale: &Scale, + participators: HashMap, + is_additional: bool, + ) { + for (_, unit) in self + .scene_units + .iter_mut() + .filter(|(_, unit)| tag_ids.contains(&unit.npc_id)) + { + self.refresh_required = true; + + if !is_additional { + unit.interacts.clear(); + } + + let main_city_object = self + .resources + .template_collection + .main_city_object_template_tb() + .find(|tmpl| tmpl.tag_id() == unit.npc_id as i32) + .unwrap(); + + unit.interacts.insert( + interact_id as u32, + Interact { + id: interact_id as u32, + tag_id: unit.npc_id as i32, + name: main_city_object + .interact_name() + .map(|name| name.to_string()) + .unwrap_or_default(), + participators: participators.clone(), + targets: HashSet::from([InteractTarget::Npc]), + scale: scale.clone(), + }, + ); + } + } + + pub fn remove_quest_npc(&mut self) { + self.refresh_required = true; + + self.scene_units.retain(|_, unit| { + self.resources + .template_collection + .main_city_object_template_tb() + .find(|tmpl| tmpl.tag_id() == unit.npc_id as i32) + .map(|tmpl| tmpl.create_type() != 1) + .unwrap_or(false) + }); + } + + pub fn reset_interacts(&mut self) { + self.refresh_required = true; + + for (_, unit) in self.scene_units.iter_mut() { + let Some(main_city_object) = self + .resources + .template_collection + .main_city_object_template_tb() + .find(|tmpl| tmpl.tag_id() == unit.npc_id as i32) + else { + error!( + "MainCityObjectTemplate with tag_id {} doesn't exist", + unit.npc_id + ); + return; + }; + + unit.interacts = main_city_object + .default_interact_ids() + .unwrap_or_default() + .iter() + .map(|interact_id| { + ( + interact_id as u32, + Interact { + id: interact_id as u32, + tag_id: unit.npc_id as i32, + name: main_city_object + .interact_name() + .map(|name| name.to_string()) + .unwrap_or_default(), + participators: HashMap::from([(unit.npc_id, String::from("A"))]), + targets: HashSet::from([InteractTarget::Npc]), + scale: Scale::new_by_config_str( + main_city_object.interact_scale().unwrap(), + ), + }, + ) + }) + .collect(); + } + } + + pub fn set_time_period(&mut self, time_period: ETimePeriodType) { + self.time_period = time_period_util::logic_to_proto(time_period); + + if let Some(time_of_day) = time_period_util::get_time_of_day(time_period) { + if time_of_day <= self.time_of_day { + self.day_of_week = (self.day_of_week + 1) % 7; + } + + self.time_of_day = time_of_day; + } + } + + fn remove_pending_refresh(&mut self) -> Option { + self.refresh_required.then(|| { + self.refresh_required = false; + + vivian_proto::HallRefreshScNotify { + force_refresh: true, + section_id: self.section_id, + bgm_id: self.bgm_id, + day_of_week: self.day_of_week, + time_of_day: self.time_of_day, + player_avatar_id: self.player_avatar_id, + control_guise_avatar_id: self.control_guise_avatar_id, + transform_id: match &self.position { + HallPosition::Id(id) => id.clone(), + HallPosition::Transform(_) => String::new(), + }, + position: match &self.position { + HallPosition::Transform(transform) => Some(transform.to_proto()), + HallPosition::Id(_) => None, + }, + scene_unit_list: self + .scene_units + .values() + .map(|unit| unit.to_client_proto()) + .collect(), + main_city_objects_state: self.main_city_objects_state.clone(), + hall_unknown_map_string_int: HashMap::new(), + hall_unknown_map_uint_uint: HashMap::new(), + main_city_quest_id_list: self.main_city_quests.keys().copied().collect(), + time_period: i32::from(self.time_period) as u32, + } + }) + } + + pub fn force_refresh(&mut self) { + self.refresh_required = true; + } + + pub fn reset_refresh_state(&mut self) { + self.refresh_required = false; + } + + fn initiate_event( + &mut self, + graph: GraphReference, + event_type: SectionEvent, + owner_type: EventGraphOwnerType, + tag: u32, + config: &'static ConfigEvent, + listener: &mut dyn LogicEventListener, + ) { + let event_uid = EventUID::new(owner_type, config.id); + + if self + .already_executed_events + .insert(((graph.id() as u64) << 32) | config.id as u64) + { + let mut event = Event::new(event_type, tag, graph, config); + event.wakeup(event_uid, self, listener); + + if !event.is_finished() { + self.running_events.insert(event_uid, event); + } + } + } + + pub fn on_before_enter(&mut self, listener: &mut dyn LogicEventListener) { + for graph_ref in self.attached_graphs.clone() { + if let Some(graph) = self.resources.event_graphs.get(graph_ref, self.section_id) { + for event_name in graph.on_before_enter.iter() { + let event_type = SectionEvent::Custom(event_name.clone()); + if let Some(event_config) = graph.events.get(&event_type) { + self.initiate_event( + graph_ref, + event_type, + event_util::graph_reference_to_owner_type(graph_ref), + 0, + event_config, + listener, + ); + } + } + } + } + + for (uid, mut event) in std::mem::take(&mut self.running_events).into_iter() { + // Re-execute last action to rebuild pending client action on re-enter. + if event.state == EventState::WaitingClient { + event.state = EventState::Running; + event.cur_action_index -= 1; + event.wakeup(uid, self, listener); + } + + self.running_events.insert(uid, event); + } + } + + pub fn on_enter(&mut self, listener: &mut dyn LogicEventListener) { + for graph_ref in self.attached_graphs.clone() { + if let Some(graph) = self.resources.event_graphs.get(graph_ref, self.section_id) { + for event_name in graph.on_enter.iter() { + let event_type = SectionEvent::Custom(event_name.clone()); + if let Some(event_config) = graph.events.get(&event_type) { + self.initiate_event( + graph_ref, + event_type, + event_util::graph_reference_to_owner_type(graph_ref), + 0, + event_config, + listener, + ); + } + } + } + } + } + + pub fn on_exit(&mut self, listener: &mut dyn LogicEventListener) { + for graph_ref in self.attached_graphs.clone() { + if let Some(graph) = self.resources.event_graphs.get(graph_ref, self.section_id) { + for event_name in graph.on_exit.iter() { + let event_type = SectionEvent::Custom(event_name.clone()); + if let Some(event_config) = graph.events.get(&event_type) { + self.initiate_event( + graph_ref, + event_type, + event_util::graph_reference_to_owner_type(graph_ref), + 0, + event_config, + listener, + ); + } + } + } + } + } + + pub fn interact_with_unit( + &mut self, + npc_tag_id: u32, + interact_id: u32, + listener: &mut dyn LogicEventListener, + ) -> bool { + let event_type = SectionEvent::OnInteract; + let owner_type = EventGraphOwnerType::SceneUnit; + let graph = GraphReference::Interact(interact_id); + + let event_graph_uid = EventUID::new(owner_type, interact_id); + + if self.running_events.contains_key(&event_graph_uid) { + warn!("tried to interact, but event is already running (interact_id: {interact_id})"); + return false; + } + + // Check if npc_tag_id/interact_id pair is valid + if !self + .scene_units + .get(&npc_tag_id) + .map(|unit| unit.interacts.contains_key(&interact_id)) + .unwrap_or(false) + { + error!("[tag:{npc_tag_id}|interact:{interact_id}] pair is invalid"); + return false; + } + + let Some(config) = self.resources.event_graphs.get(graph, self.section_id) else { + error!("event config for interact id {interact_id} not found!",); + return false; + }; + + let Some(event) = config.events.get(&event_type) else { + error!("interact graph {interact_id} doesn't have event {event_type}"); + return false; + }; + + self.initiate_event(graph, event_type, owner_type, npc_tag_id, event, listener); + true + } + + pub fn run_event_graph( + &mut self, + owner_type: EventGraphOwnerType, + event_id: u32, + listener: &mut dyn LogicEventListener, + ) -> bool { + let event_graph_uid = EventUID::new(owner_type, event_id); + + let Some(mut event) = self.running_events.remove(&event_graph_uid) else { + error!("event {owner_type:?}:{event_id} is not running"); + return false; + }; + + if event.state != EventState::WaitingClient { + error!( + "event {owner_type:?}:{event_id} can't be resumed by client, current state: {:?}", + event.state + ); + return false; + } + + event.wakeup(event_graph_uid, self, listener); + self.running_events.insert(event_graph_uid, event); + + true + } + + pub fn remove_if_finished( + &mut self, + owner_type: EventGraphOwnerType, + event_id: u32, + ) -> Option { + let event_graph_uid = EventUID::new(owner_type, event_id); + + if let Some(event) = self.running_events.remove(&event_graph_uid) { + if event.state == EventState::Finished { + return Some(FinishEventGraphScNotify { + tag: event.tag, + owner_type: owner_type.into(), + event_name: event.ty.to_string(), + section_event_unk_2: 0, + ..Default::default() + }); + } + + if !event.is_finished() { + self.running_events.insert(event_graph_uid, event); + } + } + + None + } + + // Common + + pub fn scene_type(&self) -> SceneType { + SceneType::Hall + } + + pub fn flush_notifies(&mut self, listener: &mut dyn NotifyListener) { + use crate::listener::NotifyListenerExt; + + if !self.has_sent_initial_scene_notify { + self.has_sent_initial_scene_notify = true; + + listener.add(EnterSceneScNotify { + scene: Some(self.client_scene_data_proto()), + dungeon: None, + }); + } + + if self.enter_finished { + if let Some(hall_refresh_notify) = self.remove_pending_refresh() { + listener.add(hall_refresh_notify); + } + + std::mem::take(&mut self.pending_event_notifies) + .into_iter() + .for_each(|section_event_notify| listener.add(section_event_notify)); + } + } + + pub fn client_scene_data_proto(&self) -> vivian_proto::SceneData { + vivian_proto::SceneData { + scene_type: self.scene_type().into(), + hall_scene_data: Some(vivian_proto::HallSceneData { + section_id: self.section_id, + bgm_id: self.bgm_id, + day_of_week: self.day_of_week, + time_of_day: self.time_of_day, + player_avatar_id: self.player_avatar_id, + control_guise_avatar_id: self.control_guise_avatar_id, + transform_id: match &self.position { + HallPosition::Id(id) => id.clone(), + HallPosition::Transform(_) => String::new(), + }, + position: match &self.position { + HallPosition::Transform(transform) => Some(transform.to_proto()), + HallPosition::Id(_) => None, + }, + scene_unit_list: self + .scene_units + .values() + .map(|unit| unit.to_client_proto()) + .collect(), + main_city_objects_state: self.main_city_objects_state.clone(), + hall_unknown_map_string_int: HashMap::new(), + hall_unknown_map_uint_uint: HashMap::new(), + main_city_quest_id_list: self.main_city_quests.keys().copied().collect(), + time_period: i32::from(self.time_period) as u32, + }), + ..Default::default() + } + } +} + +impl ActionListener for GameHallState { + fn should_execute_action( + &mut self, + event_uid: u64, + action: &ConfigEventAction, + listener: &mut dyn LogicEventListener, + _specials: &HashMap, + ) -> bool { + let mut context = EventGraphContext { + hall: self, + event_uid, + listener, + }; + + for predicate in action.predicates() { + if !predicate_executor::execute(&mut context, predicate) { + return false; + } + } + + true + } + + fn execute_action( + &mut self, + event_uid: u64, + action: &ConfigEventAction, + listener: &mut dyn LogicEventListener, + _specials: &HashMap, + ) { + action_executor::execute( + &mut EventGraphContext { + hall: self, + event_uid, + listener, + }, + action, + ); + } + + fn enqueue_client_action( + &mut self, + (event_uid, event): (EventUID, &Event), + info: vivian_proto::ActionInfo, + ) { + self.pending_event_notifies.push(SectionEventScNotify { + event_id: event_uid.event_id(), + tag: event.tag, + section_id: self.section_id, + owner_type: event_uid.owner_type().into(), + event_name: event.ty.to_string(), + action_list: vec![info], + ..Default::default() + }); + } + + fn is_immediate_mode(&self) -> bool { + true + } +} diff --git a/lib/logic/src/hall/npc.rs b/lib/logic/src/hall/npc.rs new file mode 100644 index 0000000..fa75591 --- /dev/null +++ b/lib/logic/src/hall/npc.rs @@ -0,0 +1,67 @@ +use std::collections::{HashMap, HashSet}; + +use num_enum::{IntoPrimitive, TryFromPrimitive}; + +use crate::math::Scale; + +#[derive(Debug)] +pub struct SceneUnit { + pub npc_id: u32, + pub interacts: HashMap, +} + +#[derive(Debug)] +pub struct Interact { + pub id: u32, + pub tag_id: i32, + pub name: String, + pub scale: Scale, + pub targets: HashSet, + pub participators: HashMap, +} + +#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy, TryFromPrimitive, IntoPrimitive)] +#[repr(i32)] +pub enum InteractTarget { + TriggerBox = 1, + Npc = 2, +} + +impl SceneUnit { + pub fn to_client_proto(&self) -> vivian_proto::SceneUnitProtocolInfo { + vivian_proto::SceneUnitProtocolInfo { + npc_id: self.npc_id, + is_interactable: true, + interacts_info: self + .interacts + .iter() + .map(|(&id, interact)| { + ( + id, + vivian_proto::InteractInfo { + tag_id: interact.tag_id, + name: interact.name.clone(), + scale_x: interact.scale.0, + scale_y: interact.scale.1, + scale_z: interact.scale.2, + scale_w: interact.scale.3, + scale_r: interact.scale.4, + interact_target_list: interact + .targets + .iter() + .map(|target| match target { + InteractTarget::Npc => vivian_proto::InteractTarget::Npc.into(), + InteractTarget::TriggerBox => { + vivian_proto::InteractTarget::TriggerBox.into() + } + }) + .collect(), + participators: interact.participators.clone(), + unk_interact_info_bool: true, + }, + ) + }) + .collect(), + } + } +} diff --git a/lib/logic/src/hall/predicate_executor.rs b/lib/logic/src/hall/predicate_executor.rs new file mode 100644 index 0000000..55165bc --- /dev/null +++ b/lib/logic/src/hall/predicate_executor.rs @@ -0,0 +1,32 @@ +predicates! { + ConfigEventByMainCharacter; +} + +fn execute_config_event_by_main_character( + context: &mut EventGraphContext<'_>, + predicate: &ConfigEventByMainCharacter, +) -> bool { + predicate_util::run_compare_function( + predicate.compare_type, + context.hall.player_avatar_id, + predicate.avatar_id, + ) +} + +macro_rules! predicates { + ($($cfg:ident;)*) => { + pub fn execute(context: &mut EventGraphContext<'_>, cfg: &::config::ConfigPredicate) -> bool { + ::paste::paste!(match cfg { + $(::config::ConfigPredicate::$cfg(cfg) => [](context, cfg),)* + _ => false, + }) + } + }; +} + +use config::ConfigEventByMainCharacter; +use predicates; + +use crate::predicate_util; + +use super::EventGraphContext; diff --git a/lib/logic/src/hall/time_period_util.rs b/lib/logic/src/hall/time_period_util.rs new file mode 100644 index 0000000..7f43a7c --- /dev/null +++ b/lib/logic/src/hall/time_period_util.rs @@ -0,0 +1,34 @@ +use config::ETimePeriodType; +use vivian_proto::common::TimePeriodType; + +pub fn logic_to_proto(value: ETimePeriodType) -> TimePeriodType { + match value { + ETimePeriodType::Morning => TimePeriodType::Morning, + ETimePeriodType::Afternoon => TimePeriodType::Afternoon, + ETimePeriodType::Evening => TimePeriodType::Evening, + ETimePeriodType::Night => TimePeriodType::Night, + ETimePeriodType::Now => TimePeriodType::Now, + } +} + +#[expect(dead_code)] +pub fn proto_to_logic(value: TimePeriodType) -> ETimePeriodType { + match value { + TimePeriodType::Morning => ETimePeriodType::Morning, + TimePeriodType::Afternoon => ETimePeriodType::Afternoon, + TimePeriodType::Evening => ETimePeriodType::Evening, + TimePeriodType::Night => ETimePeriodType::Night, + TimePeriodType::Now => ETimePeriodType::Now, + TimePeriodType::None => ETimePeriodType::Now, + } +} + +pub fn get_time_of_day(period: ETimePeriodType) -> Option { + Some(match period { + ETimePeriodType::Morning => 6 * 60, + ETimePeriodType::Afternoon => 12 * 60, + ETimePeriodType::Evening => 18 * 60, + ETimePeriodType::Night => 21 * 60, + ETimePeriodType::Now => return None, + }) +} diff --git a/lib/logic/src/hollow/action_executor.rs b/lib/logic/src/hollow/action_executor.rs new file mode 100644 index 0000000..6037b1e --- /dev/null +++ b/lib/logic/src/hollow/action_executor.rs @@ -0,0 +1,172 @@ +use super::{ + chessboard::{EventGraphContext, GridReference}, + expression_util, +}; + +actions! { + ConfigEventModification; + ConfigPushWithDirection; + ConfigSetMapState; + ConfigReward; + ConfigAddItem; + ConfigSetHollowVariable; + ConfigFinishHollow; +} + +pub fn execute_config_event_modification( + ctx: &mut EventGraphContext, + cfg: &ConfigEventModification, +) { + let grid_pos = match cfg.position { + HollowPositionOffsetType::Absolute => GridReference::Absolute(cfg.x, cfg.y), + HollowPositionOffsetType::Relative => GridReference::Relative(cfg.x, cfg.y), + other => return warn!("ConfigEventModification offset {other:?} is not implemented yet"), + }; + + if cfg.target_event_id.is_empty() { + if let Some(&set_event_id) = cfg.event_id.first() { + ctx.chessboard.modify_grid_event( + grid_pos, + 0, + set_event_id, + NodeState::try_from(i32::from(cfg.event_state)).unwrap(), + NodeVisible::try_from(i32::from(cfg.visible_state)).unwrap(), + ); + } + } else { + for (&target_event_id, &set_event_id) in cfg.target_event_id.iter().zip(cfg.event_id.iter()) + { + if ctx.chessboard.modify_grid_event( + grid_pos, + target_event_id, + set_event_id, + NodeState::try_from(i32::from(cfg.event_state)).unwrap(), + NodeVisible::try_from(i32::from(cfg.visible_state)).unwrap(), + ) { + break; + } + } + } +} + +pub fn execute_config_set_map_state(ctx: &mut EventGraphContext, cfg: &ConfigSetMapState) { + let grid_pos = match cfg.position { + HollowPositionOffsetType::Absolute => GridReference::Absolute(cfg.x, cfg.y), + HollowPositionOffsetType::Relative => GridReference::Relative(cfg.x, cfg.y), + other => return warn!("ConfigSetMapState offset {other:?} is not implemented yet"), + }; + + let mut visible_state_changes = cfg + .from_visible_state + .iter() + .copied() + .zip(cfg.to_visible_state.iter().copied()) + .peekable(); + + let mut state_changes = cfg + .from_state + .iter() + .copied() + .zip(cfg.to_state.iter().copied()) + .peekable(); + + while visible_state_changes.peek().is_some() || state_changes.peek().is_some() { + if ctx.chessboard.set_map_state( + grid_pos, + visible_state_changes + .next() + .map(|(from_visible, to_visible)| { + ( + NodeVisible::try_from(i32::from(from_visible)).unwrap(), + NodeVisible::try_from(i32::from(to_visible)).unwrap(), + ) + }), + state_changes.next().map(|(from_state, to_state)| { + ( + NodeState::try_from(i32::from(from_state)).unwrap(), + NodeState::try_from(i32::from(to_state)).unwrap(), + ) + }), + ) { + break; + } + } +} + +pub fn execute_config_push_with_direction( + ctx: &mut EventGraphContext, + cfg: &ConfigPushWithDirection, +) { + let pos = ctx.chessboard.cur_player_pos(); + let Ok(dir) = + ConfigGridDir::try_from(expression_util::get_dynamic_integer(&cfg.direction, ctx)) + else { + return; + }; + + let pos = match dir { + ConfigGridDir::Left => Vector2Int { + x: pos.x - 1, + ..pos + }, + ConfigGridDir::Right => Vector2Int { + x: pos.x + 1, + ..pos + }, + ConfigGridDir::Up => Vector2Int { + y: pos.y - 1, + ..pos + }, + ConfigGridDir::Down => Vector2Int { + y: pos.y + 1, + ..pos + }, + }; + + ctx.chessboard.player_move(pos, ctx.listener, true); +} + +pub fn execute_config_reward(ctx: &mut EventGraphContext, cfg: &ConfigReward) { + let once_reward_id = expression_util::get_dynamic_integer(&cfg.once_reward_id, ctx); + if once_reward_id != 0 { + ctx.listener.give_once_reward(once_reward_id as u32); + } +} + +pub fn execute_config_add_item(ctx: &mut EventGraphContext, cfg: &ConfigAddItem) { + let count = expression_util::get_dynamic_integer(&cfg.count, ctx); + ctx.listener.add_item(cfg.item_id, count as u32); +} + +pub fn execute_config_set_hollow_variable( + ctx: &mut EventGraphContext, + cfg: &ConfigSetHollowVariable, +) { + ctx.chessboard + .hollow_variables + .insert(cfg.key.clone(), cfg.value); +} + +pub fn execute_config_finish_hollow(ctx: &mut EventGraphContext, _: &ConfigFinishHollow) { + ctx.chessboard.finished = true; +} + +macro_rules! actions { + ($($cfg:ident;)*) => { + pub fn execute(context: &mut EventGraphContext<'_>, cfg: &::config::ConfigEventAction) { + ::paste::paste!(match cfg { + $(::config::ConfigEventAction::$cfg(cfg) => [](context, cfg),)* + _ => (), + }); + } + }; +} + +use actions; +use config::{ + ConfigAddItem, ConfigEventModification, ConfigFinishHollow, ConfigGridDir, + ConfigPushWithDirection, ConfigReward, ConfigSetHollowVariable, ConfigSetMapState, + HollowPositionOffsetType, +}; +use tracing::warn; +use vivian_proto::common::{NodeState, NodeVisible, Vector2Int}; diff --git a/lib/logic/src/hollow/chessboard.rs b/lib/logic/src/hollow/chessboard.rs new file mode 100644 index 0000000..5c27c72 --- /dev/null +++ b/lib/logic/src/hollow/chessboard.rs @@ -0,0 +1,844 @@ +use std::collections::HashMap; + +use config::{GraphReference, HollowChessboardConfig, HollowSectionConfig, SectionEvent}; +use tracing::{error, warn}; +use vivian_proto::{ + EventGraphOwnerType, FinishEventGraphScNotify, GridLink, GridType, HenshinType, + HollowEntityType, HollowGridMapType, HollowPushReason, HollowPushScNotify, + SectionEventScNotify, + common::{HollowGridFlag, NodeState, NodeVisible, Vector2Int}, +}; + +use crate::{ + LogicResources, + event::{ActionListener, Event, EventState, EventUID}, + listener::LogicEventListener, +}; + +use super::{ + action_executor, + component::{ + BehaviorComponent, CategoryComponent, EntityPriorityComponent, GridStateComponent, + HollowComponentManager, HollowEventComponent, HollowGridComponent, IdComponent, + OwnerComponent, PosComponent, + }, + entity::{HollowEntity, HollowEntityManager}, + entity_util, + net_helper::HollowGlobalEventHelper, + predicate_executor, +}; + +pub struct Chessboard { + pub running_events: HashMap, + pub global_event_helper: HollowGlobalEventHelper, + pub hollow_quest_id: u32, + pub hollow_variables: HashMap, + pub player_avatar_id: u32, + pub event_choice_uid: u32, + pub finished: bool, + resources: LogicResources, + henshin: HenshinType, + entity_manager: HollowEntityManager, + component_manager: HollowComponentManager, + cur_section: HollowEntity, + player: HollowEntity, + sections: Vec, +} + +#[derive(Debug, Clone, Copy)] +pub enum GridReference { + Absolute(i32, i32), + Relative(i32, i32), +} + +impl Chessboard { + pub fn new( + quest_id: u32, + player_avatar_id: u32, + config: &HollowChessboardConfig, + res: LogicResources, + ) -> Self { + let mut entity_manager = HollowEntityManager::default(); + let mut component_manager = HollowComponentManager::default(); + + entity_manager.create(HollowEntityType::Global); + + let sections = config + .sections + .iter() + .map(|config| { + Self::create_hollow_section( + config, + &res, + &mut entity_manager, + &mut component_manager, + ) + }) + .collect::>(); + + let cur_section = *sections.get(config.default_section_index).unwrap(); + let player = entity_manager.create(HollowEntityType::Player); + + component_manager.insert_pos_component( + player, + PosComponent { + pos: (config.default_player_pos.x, config.default_player_pos.y), + section: cur_section, + }, + ); + + Self { + hollow_quest_id: quest_id, + player_avatar_id, + event_choice_uid: 0, + finished: false, + resources: res, + henshin: HenshinType::DefaultPlayer, + entity_manager, + component_manager, + cur_section, + player, + sections, + running_events: HashMap::new(), + hollow_variables: HashMap::new(), + global_event_helper: HollowGlobalEventHelper::default(), + } + } + + pub fn player_move( + &mut self, + pos: Vector2Int, + listener: &mut dyn LogicEventListener, + by_server: bool, + ) { + let player_pos = self + .component_manager + .get_pos_component(self.player) + .unwrap(); + + if player_pos.pos.0 == pos.x && player_pos.pos.1 == pos.y { + return; + } + + if ((pos.x - player_pos.pos.0).abs() + (pos.y - player_pos.pos.1).abs()) > 1 { + error!( + "Chessboard::player_move: destination is too far! player_pos: {:?}, destination: {:?}", + player_pos.pos, + (pos.x, pos.y) + ); + return; + } + + if entity_util::get_grid_at( + (pos.x, pos.y), + self.cur_section, + &self.entity_manager, + &self.component_manager, + ) + .is_none() + { + error!( + "Chessboard::player_move: target_grid is None! Requested position: ({}, {})", + pos.x, pos.y + ); + return; + }; + + // TODO: check GridLinks + + self.component_manager.insert_pos_component( + self.player, + PosComponent { + pos: (pos.x, pos.y), + ..player_pos + }, + ); + + if by_server { + self.global_event_helper.add(HollowPushScNotify { + cur_section_id: self.cur_section.as_raw_u32(), + prev_position: Some(Vector2Int { + x: player_pos.pos.0, + y: player_pos.pos.1, + }), + cur_position: Some(Vector2Int { x: pos.x, y: pos.y }), + reason: HollowPushReason::ConveyorBelt.into(), // TODO? + entity_type: HollowEntityType::Player.into(), + }); + } + + self.on_player_pos_update(listener); + } + + pub fn retrigger_cur_event(&mut self, logic_listener: &mut dyn LogicEventListener) { + self.on_player_pos_update(logic_listener); + } + + pub fn execute_first_turn(&mut self, logic_listener: &mut dyn LogicEventListener) { + self.on_player_pos_update(logic_listener); + + // EnterSceneScNotify will contain latest data anyway + self.component_manager.reset_change_state(); + } + + pub fn resume_event_logic( + &mut self, + owner: EventGraphOwnerType, + id: u32, + logic_listener: &mut dyn LogicEventListener, + ) -> bool { + let event_graph_uid = EventUID::new(owner, id); + + let Some(mut event) = self.running_events.remove(&event_graph_uid) else { + error!("event {owner:?}:{id} is not running"); + return false; + }; + + if event.state != EventState::WaitingClient { + error!( + "event {owner:?}:{id} can't be resumed by client, current state: {:?}", + event.state + ); + return false; + } + + event.wakeup(event_graph_uid, self, logic_listener); + + if event.is_finished() { + self.notify_finish_event_graph(event_graph_uid, &event); + self.on_event_finish(event.tag); + self.sync_hollow_grid(); + } else { + self.running_events.insert(event_graph_uid, event); + } + + true + } + + fn on_event_finish(&mut self, tag: u32) { + let Some(event_entity) = self.entity_manager.uid_exists(tag) else { + error!( + "Chessboard::on_event_finish: entity with uid of event tag ({tag}) doesn't exist" + ); + return; + }; + + let Some(IdComponent(event_id)) = self.component_manager.get_id_component(event_entity) + else { + error!("Chessboard::on_event_finish: event doesn't have an ID (tag: {tag})"); + return; + }; + + let Some(OwnerComponent(owner_entity)) = + self.component_manager.get_owner_component(event_entity) + else { + error!("Chessboard::on_event_finish: event doesn't have an owner (tag: {tag})"); + return; + }; + + if owner_entity.entity_type() == HollowEntityType::Grid { + let Some(grid_state) = self + .component_manager + .get_grid_state_component(owner_entity) + else { + error!( + "Chessboard::on_event_finish: owner grid doesn't have a GridStateComponent!" + ); + return; + }; + + let template = self + .resources + .template_collection + .hollow_event_template_tb() + .find(|tmpl| tmpl.id() == event_id) + .unwrap(); + + if template.can_trigger_times() == -1 { + self.component_manager.insert_grid_state_component( + owner_entity, + GridStateComponent { + node_state: NodeState::ShowEvent, + ..grid_state.enable(HollowGridFlag::CanTriggerEvent) + }, + ); + } else { + self.component_manager.insert_grid_state_component( + owner_entity, + GridStateComponent { + node_state: NodeState::Finished, + ..grid_state.disable(HollowGridFlag::CanTriggerEvent) + }, + ); + } + } + } + + fn notify_finish_event_graph(&mut self, uid: EventUID, event: &Event) { + self.global_event_helper.add(FinishEventGraphScNotify { + tag: event.tag, + owner_type: EventGraphOwnerType::Hollow.into(), + event_name: event.ty.to_string(), + section_event_unk_2: 1, + finish_event_unk_1: 1, + event_uid: uid.event_id(), + }); + } + + fn on_player_pos_update(&mut self, logic_listener: &mut dyn LogicEventListener) { + let player_pos = self + .component_manager + .get_pos_component(self.player) + .unwrap(); + + let Some(cur_grid) = entity_util::get_grid_at( + player_pos.pos, + player_pos.section, + &self.entity_manager, + &self.component_manager, + ) else { + error!("Chessboard::on_player_pos_update: cur_grid is None, position: {player_pos}"); + return; + }; + + let Some(state_comp) = self.component_manager.get_grid_state_component(cur_grid) else { + error!( + "Chessboard::on_player_pos_update: cur_grid is missing a GridStateComponent, position: {player_pos}" + ); + return; + }; + + if state_comp.node_state != NodeState::Finished + && state_comp.is_enabled(HollowGridFlag::CanTriggerEvent) + { + let state_comp = state_comp + .enable(HollowGridFlag::Travelled) + .enable(HollowGridFlag::ShowEventId) + .enable(HollowGridFlag::ShowEventType) + .disable(HollowGridFlag::Guide) + .disable(HollowGridFlag::CanTriggerEvent); + + if let Some(cur_event) = + entity_util::get_grid_event(cur_grid, &self.entity_manager, &self.component_manager) + { + self.component_manager + .insert_grid_state_component(cur_grid, state_comp); + + self.trigger_event(cur_event, SectionEvent::OnStart, logic_listener); + } else { + self.component_manager.insert_grid_state_component( + cur_grid, + GridStateComponent { + node_state: NodeState::Finished, + ..state_comp + }, + ); + } + } + + self.sync_hollow_grid(); + } + + fn trigger_event( + &mut self, + event_entity: HollowEntity, + ty: SectionEvent, + logic_listener: &mut dyn LogicEventListener, + ) { + let Some(IdComponent(event_id)) = self.component_manager.get_id_component(event_entity) + else { + error!("Chessboard::trigger_event: event entity doesn't have IdComponent!"); + return; + }; + + let template = self + .resources + .template_collection + .hollow_event_template_tb() + .find(|tmpl| tmpl.id() == event_id) + .unwrap(); + + let target_template = match template.target_id() { + 0 => template, + other if template.id() == other => template, + other => self + .resources + .template_collection + .hollow_event_template_tb() + .find(|tmpl| tmpl.id() == other) + .unwrap(), + }; + + let owner_type = EventGraphOwnerType::Hollow; + let event_uid = EventUID::new(owner_type, event_id); + let graph = GraphReference::HollowEvent(target_template.id()); + + if let Some(config) = self + .resources + .event_graphs + .get(graph, 0) + .and_then(|graph| graph.events.get(&ty)) + { + logic_listener.hollow_event_executed(event_id); + + let mut event = Event::new( + SectionEvent::OnStart, + event_entity.as_raw_u32(), + GraphReference::HollowEvent(target_template.id()), + config, + ); + + event.add_parameter(template.param_1()); + event.add_parameter(template.param_2()); + event.add_parameter(template.param_3()); + event.add_parameter(template.param_4()); + event.add_parameter(template.param_5()); + event.add_parameter(template.param_6()); + + event.wakeup(event_uid, self, logic_listener); + + if event.is_finished() { + self.notify_finish_event_graph(event_uid, &event); + self.on_event_finish(event.tag); + self.sync_hollow_grid(); + } else { + self.running_events.insert(event_uid, event); + } + } else { + error!( + "No config for hollow event with id {}", + target_template.id() + ); + } + } + + pub fn set_map_state( + &mut self, + grid_pos: GridReference, + visible_state_change: Option<(NodeVisible, NodeVisible)>, + event_state_change: Option<(NodeState, NodeState)>, + ) -> bool { + let grid = match grid_pos { + GridReference::Absolute(x, y) => entity_util::get_grid_at( + (x, y), + self.cur_section, + &self.entity_manager, + &self.component_manager, + ), + GridReference::Relative(x, y) => { + let pos = self.cur_player_pos(); + entity_util::get_grid_at( + (pos.x + x, pos.y + y), + self.cur_section, + &self.entity_manager, + &self.component_manager, + ) + } + }; + + let Some(grid) = grid else { + warn!("Chessboard::set_map_state: no grid at {grid_pos:?}"); + return true; + }; + + let Some(mut grid_state) = self.component_manager.get_grid_state_component(grid) else { + error!("Chessboard::set_map_state: missing GridStateComponent at {grid_pos:?}"); + return true; + }; + + let mut did_change = false; + + if let Some((from_visible, to_visible)) = visible_state_change { + if grid_state.node_visible == from_visible { + grid_state.node_visible = to_visible; + + grid_state = match to_visible { + NodeVisible::Visible => grid_state + .enable(HollowGridFlag::CanMove) + .enable(HollowGridFlag::Visible) + .disable(HollowGridFlag::VisibleByTriggerEvent) + .disable(HollowGridFlag::VisibleAtGridAround), + NodeVisible::VisibleByTriggerEvent => grid_state + .disable(HollowGridFlag::CanMove) + .disable(HollowGridFlag::Visible) + .enable(HollowGridFlag::VisibleByTriggerEvent) + .disable(HollowGridFlag::VisibleAtGridAround), + NodeVisible::VisibleAtGridAround => grid_state + .enable(HollowGridFlag::CanMove) + .disable(HollowGridFlag::Visible) + .disable(HollowGridFlag::VisibleByTriggerEvent) + .enable(HollowGridFlag::VisibleAtGridAround), + _ => grid_state, + }; + + did_change = true; + } + } + + if let Some((from_state, to_state)) = event_state_change { + if grid_state.node_state == from_state { + grid_state.node_state = to_state; + did_change |= true; + } + } + + if did_change { + self.component_manager + .insert_grid_state_component(grid, grid_state); + } + + did_change + } + + pub fn modify_grid_event( + &mut self, + grid_pos: GridReference, + target_event_id: u32, + set_event_id: u32, + set_state: NodeState, + set_visible: NodeVisible, + ) -> bool { + let Some(template) = self + .resources + .template_collection + .hollow_event_template_tb() + .find(|tmpl| tmpl.id() == set_event_id) + else { + error!("Chessboard::modify_grid_event: event with id {set_event_id} doesn't exist!"); + return true; + }; + + let grid = match grid_pos { + GridReference::Absolute(x, y) => entity_util::get_grid_at( + (x, y), + self.cur_section, + &self.entity_manager, + &self.component_manager, + ), + GridReference::Relative(x, y) => { + let pos = self.cur_player_pos(); + entity_util::get_grid_at( + (pos.x + x, pos.y + y), + self.cur_section, + &self.entity_manager, + &self.component_manager, + ) + } + }; + + let Some(grid) = grid else { + warn!("Chessboard::modify_grid_event: no grid at {grid_pos:?}"); + return true; + }; + + let Some(grid_state) = self.component_manager.get_grid_state_component(grid) else { + error!("Chessboard::modify_grid_event: missing GridStateComponent at {grid_pos:?}"); + return true; + }; + + self.component_manager.insert_grid_state_component( + grid, + GridStateComponent { + node_state: set_state, + node_visible: set_visible, + ..grid_state.enable(HollowGridFlag::CanTriggerEvent) + }, + ); + + let Some(event) = + entity_util::get_grid_event(grid, &self.entity_manager, &self.component_manager) + else { + error!("Chessboard::modify_grid_event: no event entity for grid at {grid_pos:?}"); + return true; + }; + + let Some(IdComponent(cur_event_id)) = self.component_manager.get_id_component(event) else { + error!("Chessboard::modify_grid_event: no ID on event entity for grid at {grid_pos:?}"); + return true; + }; + + if target_event_id == 0 || cur_event_id == target_event_id { + self.component_manager + .insert_id_component(event, IdComponent(set_event_id)); + + self.component_manager.insert_hollow_event_component( + event, + HollowEventComponent { + icon_texture_sheet_id: template.icon_texture_sheet_id(), + interact_texture_sheet_id: template.interact_icon_texture_sheet_id(), + }, + ); + + true + } else { + false + } + } + + fn create_hollow_section( + config: &HollowSectionConfig, + res: &LogicResources, + em: &mut HollowEntityManager, + cm: &mut HollowComponentManager, + ) -> HollowEntity { + let section = em.create(HollowEntityType::Section); + + config.grids.iter().for_each(|config| { + let grid = em.create(HollowEntityType::Grid); + + cm.insert_pos_component( + grid, + PosComponent { + pos: (config.position.x, config.position.y), + section, + }, + ); + + cm.insert_hollow_grid_component( + grid, + config + .grid_links + .iter() + .map(|&config_link| GridLink::try_from(i32::from(config_link)).unwrap()) + .fold( + HollowGridComponent::new(GridType::CommonGrid), + |comp, link| comp.link(link), + ), + ); + + cm.insert_grid_state_component( + grid, + config + .grid_flags + .iter() + .map(|&config_flag| HollowGridFlag::try_from(i32::from(config_flag)).unwrap()) + .fold( + GridStateComponent::new( + NodeState::try_from(i32::from(config.node_state)).unwrap(), + NodeVisible::try_from(i32::from(config.node_visible)).unwrap(), + ), + |comp, flag| comp.enable(flag), + ), + ); + }); + + config.events.iter().for_each(|config| { + let event = em.create(HollowEntityType::Event); + + let Some(owner) = entity_util::get_owner_by_config(&config.owned_by, section, em, cm) + else { + error!("failed to find the configured owner for hollow event: {config:?}"); + return; + }; + + cm.insert_id_component(event, IdComponent(config.event_id)); + cm.insert_owner_component(event, OwnerComponent(owner)); + cm.insert_behavior_component(event, BehaviorComponent::default()); + cm.insert_category_component(event, CategoryComponent::default()); + + let template = res + .template_collection + .hollow_event_template_tb() + .find(|tmpl| tmpl.id() == config.event_id) + .unwrap_or_else(|| { + panic!("HollowEventTemplate with id {} not found", config.event_id) + }); + + cm.insert_hollow_event_component( + event, + HollowEventComponent { + icon_texture_sheet_id: template.icon_texture_sheet_id(), + interact_texture_sheet_id: template.interact_icon_texture_sheet_id(), + }, + ); + + if config.priority != 0 { + cm.insert_entity_priority_component( + event, + EntityPriorityComponent { + priority: config.priority, + secondary_priority: em.next_secondary_priority(config.priority), + }, + ); + } + }); + + section + } + + fn global_event(&self) -> Option { + self.entity_manager + .iter() + .filter(|e| e.entity_type() == HollowEntityType::Event) + .find(|&e| { + self.component_manager + .get_owner_component(e) + .map(|owner| owner.0.entity_type() == HollowEntityType::Global) + .unwrap_or(false) + }) + } + + pub fn cur_section_id(&self) -> u32 { + self.cur_section.as_raw_u32() + } + + pub fn cur_player_pos(&self) -> Vector2Int { + if let Some(pos_comp) = self.component_manager.get_pos_component(self.player) { + Vector2Int { + x: pos_comp.pos.0, + y: pos_comp.pos.1, + } + } else { + Vector2Int { + x: -32768, + y: -32768, + } + } + } + + pub fn sync_hollow_grid(&mut self) { + if !self.component_manager.is_synchronized() { + self.global_event_helper + .add(vivian_proto::SyncHollowGridMapsScNotify { + modify_entity_list: self + .component_manager + .get_changed_entities() + .iter() + .map(|&entity| { + self.entity_manager + .serialize_entity(entity, &self.component_manager) + }) + .collect(), + }); + + self.component_manager.reset_change_state(); + } + } + + pub fn as_client_proto(&self) -> vivian_proto::HollowScene { + let player_pos = self + .component_manager + .get_pos_component(self.player) + .map(|comp| Vector2Int { + x: comp.pos.0, + y: comp.pos.1, + }); + + vivian_proto::HollowScene { + henshin_type: self.henshin.into(), + cur_event_entity_info: self.global_event().map(|e| { + self.entity_manager + .serialize_entity(e, &self.component_manager) + }), + hollow_grid_maps: Some(vivian_proto::HollowGridMapsInfo { + hollow_grid_map_type: HollowGridMapType::Unknown1.into(), + cur_section_id: self.cur_section.as_raw_u32(), + cur_hollow_position: player_pos, + hollow_section_list: self + .sections + .iter() + .map(|§ion| vivian_proto::HollowSectionInfo { + section_id: section.as_raw_u32(), + time: String::from("Afternoon"), + weather: String::from("SunShine"), + hollow_vector_zero_1: Some(Vector2Int::default()), + hollow_vector_zero_2: Some(Vector2Int::default()), + hollow_vector_negative_1: Some(Vector2Int { + x: -32768, + y: -32768, + }), + hollow_vector_negative_2: Some(Vector2Int { + x: -32768, + y: -32768, + }), + hollow_objective_id: 1000204, + section_grid_map: Some(vivian_proto::HollowSectionGridMapInfo { + cur_grid_position: player_pos, // idk? + hollow_grid_map: Some(vivian_proto::HollowGridMap { + hollow_grid_list: self + .entity_manager + .serialize_entities(section, &self.component_manager), + }), + }), + }) + .collect(), + }), + } + } +} + +pub struct EventGraphContext<'logic> { + pub chessboard: &'logic mut Chessboard, + pub listener: &'logic mut dyn LogicEventListener, + pub event_specials: &'logic HashMap, + #[expect(dead_code)] + pub event_uid: u64, +} + +impl ActionListener for Chessboard { + fn should_execute_action( + &mut self, + event_uid: u64, + action: &config::ConfigEventAction, + listener: &mut dyn LogicEventListener, + specials: &HashMap, + ) -> bool { + let mut context = EventGraphContext { + chessboard: self, + listener, + event_uid, + event_specials: specials, + }; + + for predicate in action.predicates() { + if !predicate_executor::execute(&mut context, predicate) { + return false; + } + } + + true + } + + fn execute_action( + &mut self, + event_uid: u64, + action: &config::ConfigEventAction, + listener: &mut dyn LogicEventListener, + specials: &HashMap, + ) { + action_executor::execute( + &mut EventGraphContext { + chessboard: self, + listener, + event_uid, + event_specials: specials, + }, + action, + ); + + self.sync_hollow_grid(); + } + + fn enqueue_client_action( + &mut self, + (event_uid, event): (EventUID, &Event), + info: vivian_proto::ActionInfo, + ) { + self.global_event_helper.add(SectionEventScNotify { + event_id: event_uid.event_id(), + hollow_event_id: event_uid.event_id(), + tag: event.tag, + section_id: self.cur_section.as_raw_u32(), + owner_type: event_uid.owner_type().into(), + event_name: event.ty.to_string(), + action_list: vec![info], + section_event_unk_1: 1, + section_event_unk_2: event_uid.event_id(), + ..Default::default() + }); + } + + fn is_immediate_mode(&self) -> bool { + false + } +} diff --git a/lib/logic/src/hollow/component/behavior.rs b/lib/logic/src/hollow/component/behavior.rs new file mode 100644 index 0000000..9f0d109 --- /dev/null +++ b/lib/logic/src/hollow/component/behavior.rs @@ -0,0 +1,23 @@ +use std::collections::HashMap; + +use super::SerializableComponent; + +#[derive(Debug, Default, PartialEq, Eq, Clone)] +pub struct BehaviorComponent { + pub int_specials: HashMap, + pub str_specials: HashMap, +} + +impl SerializableComponent for BehaviorComponent { + fn component_type(&self) -> vivian_proto::HollowComponentType { + vivian_proto::HollowComponentType::BehaviorComponent + } + + fn component_info(&self) -> vivian_proto::BehaviorComponent { + vivian_proto::BehaviorComponent { + unk_behavior_state: false, + int_specials: self.int_specials.clone(), + str_specials: self.str_specials.clone(), + } + } +} diff --git a/lib/logic/src/hollow/component/category.rs b/lib/logic/src/hollow/component/category.rs new file mode 100644 index 0000000..845bb21 --- /dev/null +++ b/lib/logic/src/hollow/component/category.rs @@ -0,0 +1,20 @@ +use std::collections::HashSet; + +use super::SerializableComponent; + +#[derive(Debug, Default, PartialEq, Eq, Clone)] +pub struct CategoryComponent { + pub category_list: HashSet, +} + +impl SerializableComponent for CategoryComponent { + fn component_type(&self) -> vivian_proto::HollowComponentType { + vivian_proto::HollowComponentType::CategoryComponent + } + + fn component_info(&self) -> vivian_proto::CategoryComponent { + vivian_proto::CategoryComponent { + category_list: self.category_list.iter().cloned().collect(), + } + } +} diff --git a/lib/logic/src/hollow/component/entity_priority.rs b/lib/logic/src/hollow/component/entity_priority.rs new file mode 100644 index 0000000..e0ccef6 --- /dev/null +++ b/lib/logic/src/hollow/component/entity_priority.rs @@ -0,0 +1,20 @@ +use super::SerializableComponent; + +#[derive(Debug, PartialEq, Eq, Clone)] +pub struct EntityPriorityComponent { + pub priority: i32, + pub secondary_priority: i32, +} + +impl SerializableComponent for EntityPriorityComponent { + fn component_type(&self) -> vivian_proto::HollowComponentType { + vivian_proto::HollowComponentType::EntityPriorityComponent + } + + fn component_info(&self) -> vivian_proto::EntityPriorityComponent { + vivian_proto::EntityPriorityComponent { + priority: self.priority, + secondary_priority: self.secondary_priority, + } + } +} diff --git a/lib/logic/src/hollow/component/grid.rs b/lib/logic/src/hollow/component/grid.rs new file mode 100644 index 0000000..2361080 --- /dev/null +++ b/lib/logic/src/hollow/component/grid.rs @@ -0,0 +1,68 @@ +use std::fmt; + +use vivian_proto::{GridLink, GridType, GridUnkEnum}; + +use super::*; + +#[derive(PartialEq, Eq, Clone)] +pub struct HollowGridComponent { + pub grid_type: GridType, + grid_link: i32, +} + +impl HollowGridComponent { + pub fn new(grid_type: GridType) -> Self { + Self { + grid_type, + grid_link: GridLink::None.into(), + } + } + + pub fn link(self, against: GridLink) -> Self { + Self { + grid_link: self.grid_link | i32::from(against), + ..self + } + } + + pub fn is_linked(&self, against: GridLink) -> bool { + (self.grid_link & i32::from(against)) != 0 + } +} + +impl SerializableComponent for HollowGridComponent { + fn component_type(&self) -> HollowComponentType { + HollowComponentType::HollowGridComponent + } + + fn component_info(&self) -> vivian_proto::HollowGridComponent { + vivian_proto::HollowGridComponent { + grid_type: self.grid_type.into(), + grid_link: self.grid_link, + grid_unk_enum: GridUnkEnum::Unk1.into(), + + // these fields are abandoned and moved to GridState + cur_grid_state: None, + prev_grid_state: None, + } + } +} + +impl fmt::Debug for HollowGridComponent { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + const GRID_LINKS: [GridLink; 4] = [ + GridLink::Up, + GridLink::Down, + GridLink::Right, + GridLink::Left, + ]; + + f.debug_struct("HollowGridComponent") + .field("grid_type", &self.grid_type) + .field( + "grid_link", + &GRID_LINKS.iter().filter(|&&link| self.is_linked(link)), + ) + .finish() + } +} diff --git a/lib/logic/src/hollow/component/grid_state.rs b/lib/logic/src/hollow/component/grid_state.rs new file mode 100644 index 0000000..0168ce5 --- /dev/null +++ b/lib/logic/src/hollow/component/grid_state.rs @@ -0,0 +1,104 @@ +use std::fmt; + +use vivian_proto::common::{HollowGridFlag, HollowGridState, NodeState, NodeSubState, NodeVisible}; + +use super::*; + +#[derive(PartialEq, Eq, Clone)] +pub struct GridStateComponent { + pub node_state: NodeState, + pub node_visible: NodeVisible, + pub node_sub_state: NodeSubState, + pub flag: i32, +} + +impl GridStateComponent { + pub fn new(state: NodeState, visible: NodeVisible) -> Self { + Self { + node_state: state, + node_visible: visible, + node_sub_state: NodeSubState::EmptySub, + flag: 0, + } + } + + pub fn enable(self, flag: HollowGridFlag) -> Self { + Self { + flag: self.flag | i32::from(flag), + ..self + } + } + + pub fn disable(self, flag: HollowGridFlag) -> Self { + Self { + flag: self.flag & !i32::from(flag), + ..self + } + } + + pub fn is_enabled(&self, flag: HollowGridFlag) -> bool { + (self.flag & i32::from(flag)) != 0 + } +} + +impl SerializableComponent for GridStateComponent { + fn component_type(&self) -> HollowComponentType { + HollowComponentType::GridStateComponent + } + + fn component_info(&self) -> vivian_proto::GridStateComponent { + vivian_proto::GridStateComponent { + cur_grid_state: Some(HollowGridState { + node_state: self.node_state.into(), + node_visible: self.node_visible.into(), + sub_state: self.node_sub_state.into(), + flag: self.flag, + }), + prev_grid_state: None, + grid_state_component_unknown: 3, // ? + } + } +} + +impl fmt::Debug for GridStateComponent { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + const GRID_FLAGS: [HollowGridFlag; 26] = [ + HollowGridFlag::Core, + HollowGridFlag::CanMove, + HollowGridFlag::Travelled, + HollowGridFlag::ShowEventType, + HollowGridFlag::ShowEventId, + HollowGridFlag::CanTriggerEvent, + HollowGridFlag::Visible, + HollowGridFlag::VisibleAtGridAround, + HollowGridFlag::VisibleByTriggerEvent, + HollowGridFlag::SyncToClient, + HollowGridFlag::Door, + HollowGridFlag::CanTriggerMultiTimes, + HollowGridFlag::TemporaryVisibleAtAround, + HollowGridFlag::Unlocked, + HollowGridFlag::Brighten, + HollowGridFlag::Guide, + HollowGridFlag::Target, + HollowGridFlag::BrightenOnlyVisible, + HollowGridFlag::Unstable, + HollowGridFlag::Empty, + HollowGridFlag::Blocked, + HollowGridFlag::Gdhpcijjoah, + HollowGridFlag::Blblfbdlbbo, + HollowGridFlag::Nihgbijfiae, + HollowGridFlag::Ebjcidkjnki, + HollowGridFlag::Jgjdbhllmai, + ]; + + f.debug_struct("GridStateComponent") + .field("node_state", &self.node_state) + .field("node_visible", &self.node_visible) + .field("node_sub_state", &self.node_sub_state) + .field( + "flag", + &GRID_FLAGS.iter().filter(|&&flag| self.is_enabled(flag)), + ) + .finish() + } +} diff --git a/lib/logic/src/hollow/component/hollow_event.rs b/lib/logic/src/hollow/component/hollow_event.rs new file mode 100644 index 0000000..0f9ff40 --- /dev/null +++ b/lib/logic/src/hollow/component/hollow_event.rs @@ -0,0 +1,20 @@ +use super::SerializableComponent; + +#[derive(Debug, PartialEq, Eq, Clone)] +pub struct HollowEventComponent { + pub icon_texture_sheet_id: i32, + pub interact_texture_sheet_id: i32, +} + +impl SerializableComponent for HollowEventComponent { + fn component_type(&self) -> vivian_proto::HollowComponentType { + vivian_proto::HollowComponentType::HollowEventComponent + } + + fn component_info(&self) -> vivian_proto::HollowEventComponent { + vivian_proto::HollowEventComponent { + icon_texture_sheet_id: self.icon_texture_sheet_id, + interact_texture_sheet_id: self.interact_texture_sheet_id, + } + } +} diff --git a/lib/logic/src/hollow/component/id.rs b/lib/logic/src/hollow/component/id.rs new file mode 100644 index 0000000..d0cbe60 --- /dev/null +++ b/lib/logic/src/hollow/component/id.rs @@ -0,0 +1,14 @@ +use super::SerializableComponent; + +#[derive(Debug, PartialEq, Eq, Clone)] +pub struct IdComponent(pub u32); + +impl SerializableComponent for IdComponent { + fn component_type(&self) -> vivian_proto::HollowComponentType { + vivian_proto::HollowComponentType::IdComponent + } + + fn component_info(&self) -> vivian_proto::IdComponent { + vivian_proto::IdComponent { id: self.0 } + } +} diff --git a/lib/logic/src/hollow/component/mod.rs b/lib/logic/src/hollow/component/mod.rs new file mode 100644 index 0000000..afa5656 --- /dev/null +++ b/lib/logic/src/hollow/component/mod.rs @@ -0,0 +1,92 @@ +use super::entity::HollowEntity; +use std::collections::{HashMap, HashSet}; +use vivian_proto::{HollowComponentType, HollowPosComponent, Message, common::Vector2Int}; + +mod behavior; +mod category; +mod entity_priority; +mod grid; +mod grid_state; +mod hollow_event; +mod id; +mod owner; +mod pos; + +pub use behavior::*; +pub use category::*; +pub use entity_priority::*; +pub use grid::*; +pub use grid_state::*; +pub use hollow_event::*; +pub use id::*; +pub use owner::*; +pub use pos::*; + +pub trait SerializableComponent { + fn component_type(&self) -> HollowComponentType; + fn component_info(&self) -> Proto; +} + +macro_rules! component_mgr { + ($($name:ident;)*) => { + ::paste::paste!( + #[derive(Default)] + pub struct HollowComponentManager { + $([<$name:snake _map>]: HashMap,)* + changed_entities: HashSet, + } + ); + + ::paste::paste!( + #[allow(dead_code)] + impl HollowComponentManager { + $( + pub fn [](&mut self, entity: HollowEntity, component: $name) { + self.changed_entities.insert(entity); + self.[<$name:snake _map>].insert(entity, component); + } + + pub fn [](&self, entity: HollowEntity) -> Option<$name> { + self.[<$name:snake _map>].get(&entity).cloned() + } + )* + pub fn serialize_components(&self, entity: HollowEntity) -> Vec { + let mut components = Vec::new(); + + $(if let Some(component) = self.[<$name:snake _map>].get(&entity) { + components.push(vivian_proto::HollowEntityComponentInfo { + r#type: i32::from(component.component_type()) as u32, + component_info: component.component_info().encode_to_vec(), + }); + })* + + components + } + + pub fn is_synchronized(&self) -> bool { + self.changed_entities.is_empty() + } + + pub fn get_changed_entities(&self) -> &HashSet { + &self.changed_entities + } + + pub fn reset_change_state(&mut self) { + self.changed_entities.clear(); + } + } + ); + }; +} + +component_mgr! { + IdComponent; + PosComponent; + HollowGridComponent; + HollowEventComponent; + CategoryComponent; + BehaviorComponent; + OwnerComponent; + EntityPriorityComponent; + GridStateComponent; +} diff --git a/lib/logic/src/hollow/component/owner.rs b/lib/logic/src/hollow/component/owner.rs new file mode 100644 index 0000000..cf46e3c --- /dev/null +++ b/lib/logic/src/hollow/component/owner.rs @@ -0,0 +1,18 @@ +use crate::hollow::entity::HollowEntity; + +use super::SerializableComponent; + +#[derive(Debug, PartialEq, Eq, Clone)] +pub struct OwnerComponent(pub HollowEntity); + +impl SerializableComponent for OwnerComponent { + fn component_type(&self) -> vivian_proto::HollowComponentType { + vivian_proto::HollowComponentType::OwnerComponent + } + + fn component_info(&self) -> vivian_proto::OwnerComponent { + vivian_proto::OwnerComponent { + owner_entity_uid: self.0.as_raw_u32(), + } + } +} diff --git a/lib/logic/src/hollow/component/pos.rs b/lib/logic/src/hollow/component/pos.rs new file mode 100644 index 0000000..d21f103 --- /dev/null +++ b/lib/logic/src/hollow/component/pos.rs @@ -0,0 +1,37 @@ +use std::fmt; + +use super::*; + +#[derive(Debug, PartialEq, Eq, Clone)] +pub struct PosComponent { + pub pos: (i32, i32), + pub section: HollowEntity, +} + +impl SerializableComponent for PosComponent { + fn component_type(&self) -> HollowComponentType { + HollowComponentType::PosComponent + } + + fn component_info(&self) -> HollowPosComponent { + HollowPosComponent { + pos: Some(Vector2Int { + x: self.pos.0, + y: self.pos.1, + }), + section_id: self.section.as_raw_u32(), + } + } +} + +impl fmt::Display for PosComponent { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!( + f, + "[x:{}, y:{}, section:{}]", + self.pos.0, + self.pos.1, + self.section.as_raw_u32() + ) + } +} diff --git a/lib/logic/src/hollow/entity.rs b/lib/logic/src/hollow/entity.rs new file mode 100644 index 0000000..0185180 --- /dev/null +++ b/lib/logic/src/hollow/entity.rs @@ -0,0 +1,107 @@ +use std::collections::{HashMap, HashSet}; + +use vivian_proto::HollowEntityType; + +use super::{component::HollowComponentManager, entity_util}; + +#[derive(Default)] +pub struct HollowEntityManager { + uid_counter: HashMap, + running_entities: HashSet, + priorities: HashMap, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub struct HollowEntity(u32); + +impl HollowEntityManager { + pub fn create(&mut self, ty: HollowEntityType) -> HollowEntity { + let entity = HollowEntity( + (i32::from(ty) as u32) * 1_000_000 + + *self + .uid_counter + .entry(ty) + .and_modify(|uid| *uid += 1) + .or_insert(1), + ); + + self.running_entities.insert(entity); + entity + } + + pub fn serialize_entity( + &self, + entity @ HollowEntity(uid): HollowEntity, + hcm: &HollowComponentManager, + ) -> vivian_proto::HollowEntityInfo { + vivian_proto::HollowEntityInfo { + uid, + entity_type: uid / 1_000_000, + entity_component_list: hcm.serialize_components(entity), + } + } + + pub fn serialize_entities( + &self, + section: HollowEntity, + hcm: &HollowComponentManager, + ) -> Vec { + let mut entities = self + .running_entities + .iter() + .filter(|&&entity| entity_util::belongs_to_section(entity, section, hcm)) + .map( + |&entity @ HollowEntity(uid)| vivian_proto::HollowEntityInfo { + uid, + entity_type: uid / 1_000_000, + entity_component_list: hcm.serialize_components(entity), + }, + ) + .collect::>(); + + entities.sort_by_key(|entity| entity.uid); + entities + } + + pub fn next_secondary_priority(&mut self, priority_tag: i32) -> i32 { + *self + .priorities + .entry(priority_tag) + .and_modify(|p| *p += 1) + .or_default() + } + + pub fn iter(&self) -> impl Iterator { + self.running_entities.iter().copied() + } + + pub fn single(&self, ty: HollowEntityType) -> HollowEntity { + let entities = self + .running_entities + .iter() + .filter(|entity| entity.entity_type() == ty) + .copied() + .collect::>(); + + match entities[..] { + [entity] => entity, + _ => panic!("HollowEntityManager::single({ty:?}) failed"), + } + } + + pub fn uid_exists(&self, uid: u32) -> Option { + self.running_entities + .contains(&HollowEntity(uid)) + .then_some(HollowEntity(uid)) + } +} + +impl HollowEntity { + pub fn entity_type(&self) -> HollowEntityType { + HollowEntityType::try_from((self.0 / 1_000_000) as i32).unwrap() + } + + pub fn as_raw_u32(&self) -> u32 { + self.0 + } +} diff --git a/lib/logic/src/hollow/entity_util.rs b/lib/logic/src/hollow/entity_util.rs new file mode 100644 index 0000000..ce0680c --- /dev/null +++ b/lib/logic/src/hollow/entity_util.rs @@ -0,0 +1,62 @@ +use config::ConfigEventOwner; +use vivian_proto::HollowEntityType; + +use super::{ + component::HollowComponentManager, + entity::{HollowEntity, HollowEntityManager}, +}; + +pub fn belongs_to_section( + entity: HollowEntity, + section: HollowEntity, + cm: &HollowComponentManager, +) -> bool { + match (cm.get_pos_component(entity), cm.get_owner_component(entity)) { + (Some(pos), _) => pos.section == section, + (None, Some(owner)) => belongs_to_section(owner.0, section, cm), + (None, None) => false, + } +} + +pub fn get_grid_at( + pos: (i32, i32), + section: HollowEntity, + em: &HollowEntityManager, + cm: &HollowComponentManager, +) -> Option { + em.iter() + .filter(|entity| entity.entity_type() == HollowEntityType::Grid) + .find(|&entity| { + cm.get_pos_component(entity) + .map(|comp| comp.pos == pos && comp.section == section) + .unwrap_or(false) + }) +} + +pub fn get_grid_event( + grid: HollowEntity, + em: &HollowEntityManager, + cm: &HollowComponentManager, +) -> Option { + em.iter().find(|&entity| { + entity.entity_type() == HollowEntityType::Event + && cm + .get_owner_component(entity) + .map(|owner| owner.0 == grid) + .unwrap_or(false) + }) +} + +pub fn get_owner_by_config( + config: &ConfigEventOwner, + section: HollowEntity, + em: &HollowEntityManager, + cm: &HollowComponentManager, +) -> Option { + match config { + ConfigEventOwner::Global => Some(em.single(HollowEntityType::Global)), + ConfigEventOwner::Grid { position } => { + get_grid_at((position.x, position.y), section, em, cm) + } + } +} diff --git a/lib/logic/src/hollow/expression_util.rs b/lib/logic/src/hollow/expression_util.rs new file mode 100644 index 0000000..1c27af0 --- /dev/null +++ b/lib/logic/src/hollow/expression_util.rs @@ -0,0 +1,80 @@ +use std::{collections::HashMap, sync::LazyLock}; + +use config::{DynamicInteger, NapArithmeticOp, NapExpr}; +use tracing::error; + +use super::chessboard::EventGraphContext; + +pub fn get_dynamic_integer(config: &DynamicInteger, context: &EventGraphContext<'_>) -> i32 { + match config { + DynamicInteger::Static(value) => *value, + DynamicInteger::Dynamic(expression) => execute_expression(expression, context) as i32, + } +} + +fn execute_expression(exp: &NapExpr, context: &EventGraphContext<'_>) -> f64 { + match exp { + NapExpr::Call(name, args) => exp_call(name, args, context) as f64, + NapExpr::Number(num) => *num, + NapExpr::Identifier(_) => 0.0, + NapExpr::UnaryOp(op, value) => exp_unary_op(op, execute_expression(value, context)), + NapExpr::BinOp(op, lhs, rhs) => exp_bin_op( + op, + execute_expression(lhs, context), + execute_expression(rhs, context), + ), + } +} + +fn exp_unary_op(op: &NapArithmeticOp, value: f64) -> f64 { + match op { + NapArithmeticOp::Add => value, + NapArithmeticOp::Sub => -value, + _ => unreachable!(), + } +} + +fn exp_bin_op(op: &NapArithmeticOp, lhs: f64, rhs: f64) -> f64 { + match op { + NapArithmeticOp::Add => lhs + rhs, + NapArithmeticOp::Sub => lhs - rhs, + NapArithmeticOp::Mul => lhs * rhs, + NapArithmeticOp::Div => lhs / rhs, + } +} + +type DynamicFunction = fn(&[NapExpr], &EventGraphContext<'_>) -> i32; + +fn exp_call(name: &str, args: &[NapExpr], context: &EventGraphContext<'_>) -> i32 { + static CALL_TABLE: LazyLock> = + LazyLock::new(|| HashMap::from([("specials", specials as _)])); + + if let Some(func) = CALL_TABLE.get(name) { + func(args, context) + } else { + error!("exp_call: function '{name}' doesn't exist"); + 0 + } +} + +fn specials(args: &[NapExpr], context: &EventGraphContext<'_>) -> i32 { + if args.len() != 1 { + error!("specials: unexpected number of arguments ({})", args.len()); + return 0; + } + + let arg_0 = args.first().unwrap(); + if let NapExpr::Identifier(ident) = arg_0 { + context + .event_specials + .get(ident) + .copied() + .unwrap_or_else(|| { + error!("specials: no key {ident}"); + 0 + }) + } else { + error!("specials: unexpected argument type, expected: Identifier, got: {arg_0:?}"); + 0 + } +} diff --git a/lib/logic/src/hollow/mod.rs b/lib/logic/src/hollow/mod.rs new file mode 100644 index 0000000..e5849c3 --- /dev/null +++ b/lib/logic/src/hollow/mod.rs @@ -0,0 +1,130 @@ +use chessboard::Chessboard; +use common::time_util; +use config::HollowChessboardConfig; +use vivian_proto::{ + EnterSceneScNotify, EventGraphOwnerType, Message, action::MakeChoiceOfEvent, common::Vector2Int, +}; + +mod action_executor; +mod chessboard; +mod component; +mod entity; +mod entity_util; +mod expression_util; +mod net_helper; +mod predicate_executor; + +use crate::{ + LogicResources, + dungeon::Dungeon, + listener::{LogicEventListener, NotifyListener}, + scene::SceneType, +}; + +pub struct GameHollowState { + pub dungeon: Dungeon, + pub scene_id: u32, + pub chessboard: Chessboard, + #[expect(dead_code)] + resources: LogicResources, + chessboard_finish_acknowledged: bool, +} + +impl GameHollowState { + pub fn new( + chessboard: &'static HollowChessboardConfig, + resources: LogicResources, + scene_id: u32, + dungeon: Dungeon, + player_avatar_id: u32, + ) -> Self { + Self { + chessboard: Chessboard::new(dungeon.quest_id, player_avatar_id, chessboard, resources), + dungeon, + scene_id, + resources, + chessboard_finish_acknowledged: false, + } + } + + pub fn on_enter(&mut self, listener: &mut dyn LogicEventListener) { + self.dungeon.begin_time = time_util::unix_timestamp_seconds(); + self.chessboard.execute_first_turn(listener); + + self.chessboard + .global_event_helper + .set_enter_notify(EnterSceneScNotify { + scene: Some(self.client_scene_data_proto()), + dungeon: Some(self.dungeon.as_client_proto()), + }); + } + + pub fn run_event_graph( + &mut self, + owner_type: EventGraphOwnerType, + event_id: u32, + listener: &mut dyn LogicEventListener, + client_input: &[u8], + ) -> bool { + if !client_input.is_empty() { + if let Ok(choice) = MakeChoiceOfEvent::decode(client_input) { + self.chessboard.event_choice_uid = choice.uid; + } + } + + let resume_result = self + .chessboard + .resume_event_logic(owner_type, event_id, listener); + + self.update_hollow_quest_state(listener); + resume_result + } + + pub fn handle_player_move( + &mut self, + move_path: Vec, + logic_listener: &mut dyn LogicEventListener, + ) -> (Vector2Int, u32) { + for point in move_path { + self.chessboard.player_move(point, logic_listener, false); + } + + self.update_hollow_quest_state(logic_listener); + + ( + self.chessboard.cur_player_pos(), + self.chessboard.cur_section_id(), + ) + } + + pub fn update_hollow_quest_state(&mut self, listener: &mut dyn LogicEventListener) { + if self.chessboard.finished && !self.chessboard_finish_acknowledged { + self.chessboard_finish_acknowledged = true; + self.dungeon.finish_main_dungeon_quest(1); + listener.hollow_quest_finished(self.dungeon.quest_id); + } + } + + // Common + + pub fn scene_type(&self) -> SceneType { + SceneType::Hollow + } + + pub fn flush_notifies(&mut self, listener: &mut dyn NotifyListener) { + self.chessboard.global_event_helper.flush(listener); + self.dungeon.flush_dungeon_quest_notifies(listener); + } + + pub fn client_scene_data_proto(&self) -> vivian_proto::SceneData { + vivian_proto::SceneData { + scene_id: self.scene_id, + play_type: 0, + scene_type: self.scene_type().into(), + hollow_scene_data: Some(vivian_proto::HollowSceneData { + hollow_scene: Some(self.chessboard.as_client_proto()), + }), + ..Default::default() + } + } +} diff --git a/lib/logic/src/hollow/net_helper.rs b/lib/logic/src/hollow/net_helper.rs new file mode 100644 index 0000000..a3e5522 --- /dev/null +++ b/lib/logic/src/hollow/net_helper.rs @@ -0,0 +1,40 @@ +use vivian_proto::{EnterSceneScNotify, HollowPerformScNotify, Message, NetCmd, ServerPerformMsg}; + +use crate::listener::{NotifyListener, NotifyListenerExt}; + +#[derive(Default)] +pub struct HollowGlobalEventHelper { + enter_notify: Option, + perform_msg_queue: Vec, +} + +impl HollowGlobalEventHelper { + pub fn set_enter_notify(&mut self, notify: EnterSceneScNotify) { + self.enter_notify = Some(HollowPerformScNotify { + msg_list: vec![Self::make_perform_msg(notify)], + }); + } + + pub fn add(&mut self, notify: Notify) { + self.perform_msg_queue.push(Self::make_perform_msg(notify)); + } + + pub fn flush(&mut self, notify_listener: &mut dyn NotifyListener) { + if let Some(enter_notify) = self.enter_notify.take() { + notify_listener.add(enter_notify); + } + + if !self.perform_msg_queue.is_empty() { + notify_listener.add(HollowPerformScNotify { + msg_list: std::mem::take(&mut self.perform_msg_queue), + }); + } + } + + fn make_perform_msg(notify: Notify) -> ServerPerformMsg { + ServerPerformMsg { + cmd_id: notify.get_cmd_id() as u32, + content: notify.encode_to_vec(), + } + } +} diff --git a/lib/logic/src/hollow/predicate_executor.rs b/lib/logic/src/hollow/predicate_executor.rs new file mode 100644 index 0000000..f25e5ed --- /dev/null +++ b/lib/logic/src/hollow/predicate_executor.rs @@ -0,0 +1,60 @@ +use crate::predicate_util; + +use super::chessboard::EventGraphContext; + +predicates! { + ConfigEventByMainCharacter; + ConfigEventByHollowVariable; + ConfigEventByChoiceServer; +} + +fn execute_config_event_by_main_character( + context: &mut EventGraphContext<'_>, + predicate: &ConfigEventByMainCharacter, +) -> bool { + predicate_util::run_compare_function( + predicate.compare_type, + context.chessboard.player_avatar_id, + predicate.avatar_id, + ) +} + +fn execute_config_event_by_hollow_variable( + context: &mut EventGraphContext<'_>, + predicate: &ConfigEventByHollowVariable, +) -> bool { + predicate_util::run_compare_function( + predicate.compare_type, + context + .chessboard + .hollow_variables + .get(&predicate.key) + .copied() + .unwrap_or_default(), + predicate.count, + ) +} + +fn execute_config_event_by_choice_server( + context: &mut EventGraphContext<'_>, + predicate: &ConfigEventByChoiceServer, +) -> bool { + predicate_util::run_compare_function( + predicate.compare_type, + context.chessboard.event_choice_uid, + predicate.uid, + ) +} + +macro_rules! predicates { + ($($cfg:ident;)*) => { + pub fn execute(context: &mut EventGraphContext<'_>, cfg: &::config::ConfigPredicate) -> bool { + ::paste::paste!(match cfg { + $(::config::ConfigPredicate::$cfg(cfg) => [](context, cfg),)* + }) + } + }; +} + +use config::{ConfigEventByChoiceServer, ConfigEventByHollowVariable, ConfigEventByMainCharacter}; +use predicates; diff --git a/lib/logic/src/item/avatar.rs b/lib/logic/src/item/avatar.rs new file mode 100644 index 0000000..204e613 --- /dev/null +++ b/lib/logic/src/item/avatar.rs @@ -0,0 +1,73 @@ +use std::collections::HashMap; + +use num_enum::{IntoPrimitive, TryFromPrimitive}; + +#[derive(Debug, Clone)] +pub struct AvatarItem { + pub id: u32, + pub level: u32, + pub exp: u32, + pub rank: u32, + pub unlocked_talent_num: u32, + pub talent_switch: [bool; 6], + pub passive_skill_level: u32, + pub skill_level_map: HashMap, + pub weapon_uid: u32, + pub dressed_equip_map: HashMap, + pub first_get_time: i64, + pub taken_rank_up_reward_list: Vec, + pub avatar_skin_id: u32, + pub is_favorite: bool, +} + +#[derive( + Debug, PartialEq, Eq, Hash, Clone, Copy, PartialOrd, Ord, IntoPrimitive, TryFromPrimitive, +)] +#[repr(u32)] +pub enum EAvatarSkillType { + SpecialAttack = 1, + UniqueSkill = 4, + CommonAttack = 0, + CooperateSkill = 3, + AssistSkill = 6, + Evade = 2, + CoreSkill = 5, + EnumCount = 7, +} + +impl AvatarItem { + pub fn get_skill_level(&self, ty: EAvatarSkillType) -> u32 { + self.skill_level_map.get(&ty).copied().unwrap_or(0) + } + + pub fn as_client_proto(&self) -> vivian_proto::AvatarInfo { + vivian_proto::AvatarInfo { + id: self.id, + level: self.level, + exp: self.exp, + rank: self.rank, + unlocked_talent_num: self.unlocked_talent_num, + cur_weapon_uid: self.weapon_uid, + show_weapon_type: vivian_proto::AvatarShowWeaponType::ShowWeaponLock.into(), + passive_skill_level: self.passive_skill_level, + skill_type_level: self + .skill_level_map + .iter() + .map(|(&skill_type, &level)| vivian_proto::AvatarSkillLevel { + skill_type: skill_type.into(), + level, + }) + .collect(), + dressed_equip_list: self + .dressed_equip_map + .iter() + .map(|(&index, &equip_uid)| vivian_proto::DressedEquip { index, equip_uid }) + .collect(), + avatar_skin_id: self.avatar_skin_id, + first_get_time: self.first_get_time, + talent_switch_list: self.talent_switch.to_vec(), + taken_rank_up_reward_list: self.taken_rank_up_reward_list.clone(), + is_favorite: self.is_favorite, + } + } +} diff --git a/lib/logic/src/item/equip.rs b/lib/logic/src/item/equip.rs new file mode 100644 index 0000000..bf40dd7 --- /dev/null +++ b/lib/logic/src/item/equip.rs @@ -0,0 +1,47 @@ +use std::collections::HashMap; + +#[derive(Debug, Clone)] +pub struct EquipItem { + pub id: u32, + pub level: u32, + pub exp: u32, + pub star: u32, + pub lock: bool, + pub properties: HashMap, + pub sub_properties: HashMap, +} + +impl EquipItem { + pub fn as_client_proto(&self, uid: u32) -> vivian_proto::EquipInfo { + vivian_proto::EquipInfo { + uid, + id: self.id, + level: self.level, + exp: self.exp, + star: self.star, + lock: self.lock, + propertys: self + .properties + .iter() + .map( + |(&key, &(base_value, add_value))| vivian_proto::EquipProperty { + key, + base_value, + add_value, + }, + ) + .collect(), + sub_propertys: self + .sub_properties + .iter() + .map( + |(&key, &(base_value, add_value))| vivian_proto::EquipProperty { + key, + base_value, + add_value, + }, + ) + .collect(), + } + } +} diff --git a/lib/logic/src/item/mod.rs b/lib/logic/src/item/mod.rs new file mode 100644 index 0000000..f322fc4 --- /dev/null +++ b/lib/logic/src/item/mod.rs @@ -0,0 +1,30 @@ +mod avatar; +mod equip; +mod weapon; + +pub use avatar::{AvatarItem, EAvatarSkillType}; +pub use equip::EquipItem; +use num_enum::{IntoPrimitive, TryFromPrimitive}; +pub use weapon::WeaponItem; + +#[derive(Debug, PartialEq, Eq, TryFromPrimitive, IntoPrimitive)] +#[repr(u32)] +pub enum EItemType { + Currency = 1, + Resource = 2, + Avatar = 3, + AvatarPiece = 4, + Weapon = 5, + Equip = 7, + Buddy = 8, + AvatarLevelUpMaterial = 12, +} + +#[derive(Debug, PartialEq, Eq, TryFromPrimitive, IntoPrimitive)] +#[repr(u32)] +pub enum EItemRarity { + N = 1, + R = 2, + SR = 3, + SSR = 4, +} diff --git a/lib/logic/src/item/weapon.rs b/lib/logic/src/item/weapon.rs new file mode 100644 index 0000000..2db7a05 --- /dev/null +++ b/lib/logic/src/item/weapon.rs @@ -0,0 +1,23 @@ +#[derive(Debug, Clone)] +pub struct WeaponItem { + pub id: u32, + pub level: u32, + pub exp: u32, + pub star: u32, + pub refine_level: u32, + pub lock: bool, +} + +impl WeaponItem { + pub fn as_client_proto(&self, uid: u32) -> vivian_proto::WeaponInfo { + vivian_proto::WeaponInfo { + uid, + id: self.id, + level: self.level, + exp: self.exp, + star: self.star, + refine_level: self.refine_level, + lock: self.lock, + } + } +} diff --git a/lib/logic/src/lib.rs b/lib/logic/src/lib.rs new file mode 100644 index 0000000..515b9c1 --- /dev/null +++ b/lib/logic/src/lib.rs @@ -0,0 +1,62 @@ +use config::{EventGraphCollection, TemplateCollection}; +use fight::GameFightState; +use hall::GameHallState; +use hollow::GameHollowState; +use listener::NotifyListener; +use long_fight::GameLongFightState; +use scene::SceneType; + +pub mod dungeon; +pub mod event; +pub mod fight; +pub mod hall; +pub mod hollow; +pub mod item; +pub mod listener; +pub mod long_fight; +pub mod math; +mod predicate_util; +pub mod scene; +pub mod system; + +// NOTE: box them if needed. +macro_rules! game_state { + ($($state:ident;)*) => { + ::paste::paste!(pub enum GameState { + $($state(Box<[]>),)* + }); + + impl GameState { + pub fn scene_type(&self) -> SceneType { + match self { + $(Self::$state(state) => state.scene_type(),)* + } + } + + pub fn flush_notifies(&mut self, listener: &mut dyn NotifyListener) { + match self { + $(Self::$state(state) => state.flush_notifies(listener),)* + } + } + } + + ::paste::paste!($(impl From<[]> for GameState { + fn from(value: []) -> Self { + Self::$state(Box::new(value)) + } + })*); + }; +} + +game_state! { + Hall; + Hollow; + Fight; + LongFight; +} + +#[derive(Clone, Copy)] +pub struct LogicResources { + pub template_collection: &'static TemplateCollection, + pub event_graphs: &'static EventGraphCollection, +} diff --git a/lib/logic/src/listener.rs b/lib/logic/src/listener.rs new file mode 100644 index 0000000..3b5fbae --- /dev/null +++ b/lib/logic/src/listener.rs @@ -0,0 +1,25 @@ +use vivian_proto::{Message, NetCmd}; + +pub trait NotifyListener { + fn push(&mut self, cmd_id: u16, body: Vec); +} + +pub trait NotifyListenerExt { + fn add(&mut self, notify: Notify); +} + +pub trait LogicEventListener { + fn main_city_quest_finished(&mut self, quest_id: u32) -> Vec; + fn hollow_quest_finished(&mut self, quest_id: u32); + fn change_back_scene_info(&mut self, section_id: u32, transform: String); + fn unlock_hollow_quest(&mut self, quest_id: u32); + fn give_once_reward(&mut self, once_reward_id: u32); + fn hollow_event_executed(&mut self, hollow_event_id: u32); + fn add_item(&mut self, id: u32, count: u32); +} + +impl NotifyListenerExt for T { + fn add(&mut self, notify: Notify) { + self.push(notify.get_cmd_id(), notify.encode_to_vec()); + } +} diff --git a/lib/logic/src/long_fight/mod.rs b/lib/logic/src/long_fight/mod.rs new file mode 100644 index 0000000..ae3666b --- /dev/null +++ b/lib/logic/src/long_fight/mod.rs @@ -0,0 +1,96 @@ +use tracing::info; +use vivian_proto::{EnterSceneScNotify, common::LogBattleStatistics}; + +use crate::{ + LogicResources, + dungeon::Dungeon, + listener::{LogicEventListener, NotifyListener, NotifyListenerExt}, + scene::{ELocalPlayType, SceneType}, +}; + +pub struct GameLongFightState { + pub resources: LogicResources, + pub dungeon: Dungeon, + pub scene_id: u32, + pub play_type: ELocalPlayType, + pub time_period: String, + pub weather: String, + has_sent_initial_scene_notify: bool, +} + +impl GameLongFightState { + pub fn new( + scene_id: u32, + play_type: ELocalPlayType, + resources: LogicResources, + dungeon: Dungeon, + ) -> Self { + Self { + scene_id, + play_type, + resources, + dungeon, + time_period: String::from("Morning"), + weather: String::from("SunShine"), + has_sent_initial_scene_notify: false, + } + } + + pub fn end_battle( + &mut self, + result: i32, + statistic: LogBattleStatistics, + listener: &mut dyn LogicEventListener, + ) { + info!( + "battle at {scene_id} is over, result: {result}", + scene_id = self.scene_id + ); + + self.dungeon.update_statistic(statistic); + self.dungeon.finish_main_dungeon_quest(result); + + if result == 1 && self.dungeon.quest_type == 3 { + listener.hollow_quest_finished(self.dungeon.quest_id); + } + } + + // Common + + pub fn scene_type(&self) -> SceneType { + SceneType::LongFight + } + + pub fn flush_notifies(&mut self, listener: &mut dyn NotifyListener) { + if !self.has_sent_initial_scene_notify { + self.has_sent_initial_scene_notify = true; + + listener.add(EnterSceneScNotify { + scene: Some(self.client_scene_data_proto()), + dungeon: Some(self.dungeon.as_client_proto()), + }); + } + + self.dungeon.flush_dungeon_quest_notifies(listener); + } + + pub fn client_scene_data_proto(&self) -> vivian_proto::SceneData { + vivian_proto::SceneData { + scene_id: self.scene_id, + play_type: self.play_type.into(), + scene_type: self.scene_type().into(), + long_fight_scene_data: Some(vivian_proto::LongFightSceneData { + scene_reward: Some(vivian_proto::SceneRewardInfo::default()), + scene_perform: Some(vivian_proto::ScenePerformInfo { + time: self.time_period.clone(), + weather: self.weather.clone(), + }), + scene_progress: Some(vivian_proto::LongFightProgressInfo { + quest_cond_progress: Some(vivian_proto::QuestCondProgress::default()), + quest_variables_info: Some(vivian_proto::QuestVariablesInfo::default()), + }), + }), + ..Default::default() + } + } +} diff --git a/lib/logic/src/math/mod.rs b/lib/logic/src/math/mod.rs new file mode 100644 index 0000000..ab22e77 --- /dev/null +++ b/lib/logic/src/math/mod.rs @@ -0,0 +1,24 @@ +mod transform; + +use config::ConfigInteractScale; +pub use transform::{Transform, Vector3}; + +#[derive(Debug, Default, Clone)] +pub struct Scale(pub f64, pub f64, pub f64, pub f64, pub f64); + +impl Scale { + pub fn new_by_config_str(scale_str: &str) -> Self { + let mut s = scale_str.split(','); + Self( + s.next().and_then(|s| s.parse().ok()).unwrap_or_default(), + s.next().and_then(|s| s.parse().ok()).unwrap_or_default(), + s.next().and_then(|s| s.parse().ok()).unwrap_or_default(), + s.next().and_then(|s| s.parse().ok()).unwrap_or_default(), + s.next().and_then(|s| s.parse().ok()).unwrap_or_default(), + ) + } + + pub fn new_by_config_struct(scale: &ConfigInteractScale) -> Self { + Self(scale.x, scale.y, scale.z, scale.w, scale.r) + } +} diff --git a/lib/logic/src/math/transform.rs b/lib/logic/src/math/transform.rs new file mode 100644 index 0000000..dfeed3f --- /dev/null +++ b/lib/logic/src/math/transform.rs @@ -0,0 +1,33 @@ +#[derive(Debug, Default, Clone)] +pub struct Transform { + pub position: Vector3, + pub rotation: Vector3, +} + +#[derive(Debug, Default, Clone)] +pub struct Vector3(pub f64, pub f64, pub f64); + +impl Transform { + pub fn from_proto(pb: &vivian_proto::common::Transform) -> Self { + #[allow(clippy::get_first)] + Self { + position: Vector3( + pb.position.get(0).copied().unwrap_or_default(), + pb.position.get(1).copied().unwrap_or_default(), + pb.position.get(2).copied().unwrap_or_default(), + ), + rotation: Vector3( + pb.rotation.get(0).copied().unwrap_or_default(), + pb.rotation.get(1).copied().unwrap_or_default(), + pb.rotation.get(2).copied().unwrap_or_default(), + ), + } + } + + pub fn to_proto(&self) -> vivian_proto::common::Transform { + vivian_proto::common::Transform { + position: vec![self.position.0, self.position.1, self.position.2], + rotation: vec![self.rotation.0, self.rotation.1, self.rotation.2], + } + } +} diff --git a/lib/logic/src/predicate_util.rs b/lib/logic/src/predicate_util.rs new file mode 100644 index 0000000..6cf530f --- /dev/null +++ b/lib/logic/src/predicate_util.rs @@ -0,0 +1,14 @@ +use config::ECompareFunction; + +pub fn run_compare_function(func: ECompareFunction, actual: T, condition: T) -> bool { + use ECompareFunction::*; + + match func { + Greater => actual > condition, + GreaterEqual => actual >= condition, + Equal => actual == condition, + Less => actual < condition, + LessEqual => actual <= condition, + NotEqual => actual != condition, + } +} diff --git a/lib/logic/src/scene.rs b/lib/logic/src/scene.rs new file mode 100644 index 0000000..3a34c5f --- /dev/null +++ b/lib/logic/src/scene.rs @@ -0,0 +1,58 @@ +use num_enum::{FromPrimitive, IntoPrimitive}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, IntoPrimitive)] +#[repr(u32)] +pub enum SceneType { + Hall = 1, + Hollow = 2, + Fight = 3, + LongFight = 7, +} + +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, IntoPrimitive, FromPrimitive)] +#[repr(u32)] +pub enum ELocalPlayType { + #[default] + Unknown = 0, + BigBossBattleLongfight = 217, + ActivityCombatPause = 230, + ChessBoardBattle = 202, + CoinBrushingBattle = 231, + MiniScapeShortBattle = 229, + MapChallengeBattle = 291, + MiniScapeBattle = 228, + TargetShootingBattle = 294, + RallyLongFight = 207, + HadalZoneAlivecount = 222, + OperationBetaDemo = 216, + S2RogueBattle = 226, + BossRushBattle = 218, + PureHollowBattle = 280, + ChessBoardLongfihgtBattle = 204, + TrainingRoom = 290, + BangbooRoyale = 240, + PureHollowBattleLonghfight = 281, + BangbooAutobattle = 295, + DualElite = 208, + BossBattle = 210, + HadalZone = 209, + BigBossBattle = 211, + BossNestHardBattle = 220, + LevelZero = 205, + HadalZoneBosschallenge = 224, + PureHollowBattleHardmode = 282, + ArchiveLongFight = 212, + GuideSpecial = 203, + ArchiveBattle = 201, + BabelTower = 223, + MpBigBossBattle = 214, + AvatarDemoTrial = 213, + BuddyTowerdefenseBattle = 227, + MechbooBattle = 296, + DailyChallenge = 206, + BangbooDreamRogueBattle = 293, + OperationTeamCoop = 219, + BossLittleBattleLongfight = 215, + SideScrollingThegunBattle = 221, + TrainingRootTactics = 292, +} diff --git a/lib/logic/src/system.rs b/lib/logic/src/system.rs new file mode 100644 index 0000000..1d09ca5 --- /dev/null +++ b/lib/logic/src/system.rs @@ -0,0 +1,75 @@ +use num_enum::{IntoPrimitive, TryFromPrimitive}; + +#[derive(Debug, PartialEq, Eq, Clone, Copy, TryFromPrimitive, IntoPrimitive)] +#[repr(u32)] +pub enum EOperator { + Enter = 0, + Log = 1, + Leave = 2, +} + +#[derive(Debug, PartialEq, Eq, Clone, Copy, TryFromPrimitive, IntoPrimitive)] +#[repr(u32)] +pub enum ClientSystemType { + None = 4294967295, + HollowQuest = 0, + VHS = 1, + Role = 2, + Smithy = 3, + Package = 4, + Teleport = 5, + Interknot = 6, + VhsStore = 7, + RamenStore = 8, + Workbench = 9, + Grocery = 10, + ViedoShop = 11, + StoryModeSwitch = 12, + QteSwitch = 13, + LineupSelect = 14, + UseStoryMode = 15, + UseManualQteMode = 16, + Newsstand = 17, + Toy = 18, + Arcade = 19, + TartarusHounds = 20, + Gacha = 21, + Cafe = 22, + Trash = 23, + BattleDaily = 24, + Buddy = 25, + BuddyInstall = 26, + Activity = 27, + Abyss = 28, + AbyssHeat = 29, + ArcadeRoom = 30, + ArcadeGame = 31, + Train = 32, + AvatarBase = 33, + AvatarEquip = 34, + LandRevive = 35, + DoubleElite = 36, + BossSmall = 37, + BossBig = 38, + HIA = 39, + MonsterCard = 40, + DailyQuest = 41, + Rally = 42, + Hadal = 43, + Photowall = 44, + AbyssCollect = 45, + AbyssShop01 = 46, + HadalShop = 47, + ActivityPv = 48, + PhotoActivity = 49, + OverlordFeastStore = 50, + OverlordFeastSettlement = 51, + SetTime = 52, + ActivityBattleArpg = 53, + ActivityBattleAct = 54, + WeeklyBingo = 55, + ThreeZ = 56, + CollectionCabinet = 57, + FoodTruck = 58, + FlowerShop = 59, +} diff --git a/lib/proto-derive/Cargo.toml b/lib/proto-derive/Cargo.toml new file mode 100644 index 0000000..9a366ee --- /dev/null +++ b/lib/proto-derive/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "proto-derive" +description = "Forked prost-derive but with sane maintainers (reversedrooms)" +version.workspace = true +edition = "2024" + +[lib] +proc-macro = true + +[dependencies] +anyhow = "1.0.1" +itertools = ">=0.10.1, <=0.14" +proc-macro2 = "1.0.60" +quote = "1" +syn = { version = "2", features = ["extra-traits"] } diff --git a/lib/proto-derive/src/field/group.rs b/lib/proto-derive/src/field/group.rs new file mode 100644 index 0000000..485ecfc --- /dev/null +++ b/lib/proto-derive/src/field/group.rs @@ -0,0 +1,135 @@ +use anyhow::{bail, Error}; +use proc_macro2::TokenStream; +use quote::{quote, ToTokens}; +use syn::Meta; + +use crate::field::{set_bool, set_option, tag_attr, word_attr, Label}; + +#[derive(Clone)] +pub struct Field { + pub label: Label, + pub tag: u32, +} + +impl Field { + pub fn new(attrs: &[Meta], inferred_tag: Option) -> Result, Error> { + let mut group = false; + let mut label = None; + let mut tag = None; + let mut boxed = false; + + let mut unknown_attrs = Vec::new(); + + for attr in attrs { + if word_attr("group", attr) { + set_bool(&mut group, "duplicate group attributes")?; + } else if word_attr("boxed", attr) { + set_bool(&mut boxed, "duplicate boxed attributes")?; + } else if let Some(t) = tag_attr(attr)? { + set_option(&mut tag, t, "duplicate tag attributes")?; + } else if let Some(l) = Label::from_attr(attr) { + set_option(&mut label, l, "duplicate label attributes")?; + } else { + unknown_attrs.push(attr); + } + } + + if !group { + return Ok(None); + } + + if !unknown_attrs.is_empty() { + bail!( + "unknown attribute(s) for group field: #[prost({})]", + quote!(#(#unknown_attrs),*) + ); + } + + let tag = match tag.or(inferred_tag) { + Some(tag) => tag, + None => bail!("group field is missing a tag attribute"), + }; + + Ok(Some(Field { + label: label.unwrap_or(Label::Optional), + tag, + })) + } + + pub fn new_oneof(attrs: &[Meta]) -> Result, Error> { + if let Some(mut field) = Field::new(attrs, None)? { + if let Some(attr) = attrs.iter().find(|attr| Label::from_attr(attr).is_some()) { + bail!( + "invalid attribute for oneof field: {}", + attr.path().into_token_stream() + ); + } + field.label = Label::Required; + Ok(Some(field)) + } else { + Ok(None) + } + } + + pub fn encode(&self, ident: TokenStream) -> TokenStream { + let tag = self.tag; + match self.label { + Label::Optional => quote! { + if let Some(ref msg) = #ident { + ::prost::encoding::group::encode(#tag, msg, buf); + } + }, + Label::Required => quote! { + ::prost::encoding::group::encode(#tag, &#ident, buf); + }, + Label::Repeated => quote! { + for msg in &#ident { + ::prost::encoding::group::encode(#tag, msg, buf); + } + }, + } + } + + pub fn merge(&self, ident: TokenStream) -> TokenStream { + match self.label { + Label::Optional => quote! { + ::prost::encoding::group::merge( + tag, + wire_type, + #ident.get_or_insert_with(::core::default::Default::default), + buf, + ctx, + ) + }, + Label::Required => quote! { + ::prost::encoding::group::merge(tag, wire_type, #ident, buf, ctx) + }, + Label::Repeated => quote! { + ::prost::encoding::group::merge_repeated(tag, wire_type, #ident, buf, ctx) + }, + } + } + + pub fn encoded_len(&self, ident: TokenStream) -> TokenStream { + let tag = self.tag; + match self.label { + Label::Optional => quote! { + #ident.as_ref().map_or(0, |msg| ::prost::encoding::group::encoded_len(#tag, msg)) + }, + Label::Required => quote! { + ::prost::encoding::group::encoded_len(#tag, &#ident) + }, + Label::Repeated => quote! { + ::prost::encoding::group::encoded_len_repeated(#tag, &#ident) + }, + } + } + + pub fn clear(&self, ident: TokenStream) -> TokenStream { + match self.label { + Label::Optional => quote!(#ident = ::core::option::Option::None), + Label::Required => quote!(#ident.clear()), + Label::Repeated => quote!(#ident.clear()), + } + } +} diff --git a/lib/proto-derive/src/field/map.rs b/lib/proto-derive/src/field/map.rs new file mode 100644 index 0000000..0bf50f3 --- /dev/null +++ b/lib/proto-derive/src/field/map.rs @@ -0,0 +1,408 @@ +use anyhow::{Error, bail}; +use proc_macro2::{Span, TokenStream}; +use quote::quote; +use syn::punctuated::Punctuated; +use syn::{Expr, ExprLit, Ident, Lit, Meta, MetaNameValue, Token}; + +use crate::field::{scalar, set_option, tag_attr}; + +#[derive(Clone, Debug)] +pub enum MapTy { + HashMap, + BTreeMap, +} + +impl MapTy { + fn from_str(s: &str) -> Option { + match s { + "map" | "hash_map" => Some(MapTy::HashMap), + "btree_map" => Some(MapTy::BTreeMap), + _ => None, + } + } + + fn module(&self) -> Ident { + match *self { + MapTy::HashMap => Ident::new("hash_map", Span::call_site()), + MapTy::BTreeMap => Ident::new("btree_map", Span::call_site()), + } + } + + fn lib(&self) -> TokenStream { + match self { + MapTy::HashMap => quote! { std }, + MapTy::BTreeMap => quote! { prost::alloc }, + } + } +} + +fn fake_scalar(ty: scalar::Ty) -> scalar::Field { + let kind = scalar::Kind::Plain(scalar::DefaultValue::new(&ty)); + scalar::Field { + ty, + kind, + tag: 0, // Not used here + xor: 0, // Not used here + } +} + +#[derive(Clone)] +pub struct Field { + pub map_ty: MapTy, + pub key_ty: scalar::Ty, + pub value_ty: ValueTy, + pub tag: u32, +} + +impl Field { + pub fn new(attrs: &[Meta], inferred_tag: Option) -> Result, Error> { + let mut types = None; + let mut tag = None; + + for attr in attrs { + if let Some(t) = tag_attr(attr)? { + set_option(&mut tag, t, "duplicate tag attributes")?; + } else if let Some(map_ty) = attr + .path() + .get_ident() + .and_then(|i| MapTy::from_str(&i.to_string())) + { + let (k, v): (String, String) = match attr { + Meta::NameValue(MetaNameValue { + value: + Expr::Lit(ExprLit { + lit: Lit::Str(lit), .. + }), + .. + }) => { + let items = lit.value(); + let mut items = items.split(',').map(ToString::to_string); + let k = items.next().unwrap(); + let v = match items.next() { + Some(k) => k, + None => bail!("invalid map attribute: must have key and value types"), + }; + if items.next().is_some() { + bail!("invalid map attribute: {:?}", attr); + } + (k, v) + } + Meta::List(meta_list) => { + let nested = meta_list + .parse_args_with(Punctuated::::parse_terminated)? + .into_iter() + .collect::>(); + if nested.len() != 2 { + bail!("invalid map attribute: must contain key and value types"); + } + (nested[0].to_string(), nested[1].to_string()) + } + _ => return Ok(None), + }; + set_option( + &mut types, + (map_ty, key_ty_from_str(&k)?, ValueTy::from_str(&v)?), + "duplicate map type attribute", + )?; + } else { + return Ok(None); + } + } + + Ok(match (types, tag.or(inferred_tag)) { + (Some((map_ty, key_ty, value_ty)), Some(tag)) => Some(Field { + map_ty, + key_ty, + value_ty, + tag, + }), + _ => None, + }) + } + + pub fn new_oneof(attrs: &[Meta]) -> Result, Error> { + Field::new(attrs, None) + } + + /// Returns a statement which encodes the map field. + pub fn encode(&self, ident: TokenStream) -> TokenStream { + let tag = self.tag; + let key_mod = self.key_ty.module(); + let ke = quote!(::prost::encoding::#key_mod::encode); + let kl = quote!(::prost::encoding::#key_mod::encoded_len); + let module = self.map_ty.module(); + match &self.value_ty { + ValueTy::Scalar(scalar::Ty::Enumeration(ty)) => { + let default = quote!(#ty::default() as i32); + quote! { + ::prost::encoding::#module::encode_with_default( + #ke, + #kl, + ::prost::encoding::int32::encode, + ::prost::encoding::int32::encoded_len, + &(#default), + #tag, + &#ident, + buf, + ); + } + } + ValueTy::Scalar(value_ty) => { + let val_mod = value_ty.module(); + let ve = quote!(::prost::encoding::#val_mod::encode); + let vl = quote!(::prost::encoding::#val_mod::encoded_len); + quote! { + ::prost::encoding::#module::encode( + #ke, + #kl, + #ve, + #vl, + #tag, + &#ident, + buf, + ); + } + } + ValueTy::Message => quote! { + ::prost::encoding::#module::encode( + #ke, + #kl, + ::prost::encoding::message::encode, + ::prost::encoding::message::encoded_len, + #tag, + &#ident, + buf, + ); + }, + } + } + + /// Returns an expression which evaluates to the result of merging a decoded key value pair + /// into the map. + pub fn merge(&self, ident: TokenStream) -> TokenStream { + let key_mod = self.key_ty.module(); + let km = quote!(::prost::encoding::#key_mod::merge); + let module = self.map_ty.module(); + match &self.value_ty { + ValueTy::Scalar(scalar::Ty::Enumeration(ty)) => { + let default = quote!(#ty::default() as i32); + quote! { + ::prost::encoding::#module::merge_with_default( + #km, + ::prost::encoding::int32::merge, + #default, + &mut #ident, + buf, + ctx, + ) + } + } + ValueTy::Scalar(value_ty) => { + let val_mod = value_ty.module(); + let vm = quote!(::prost::encoding::#val_mod::merge); + quote!(::prost::encoding::#module::merge(#km, #vm, &mut #ident, buf, ctx)) + } + ValueTy::Message => quote! { + ::prost::encoding::#module::merge( + #km, + ::prost::encoding::message::merge, + &mut #ident, + buf, + ctx, + ) + }, + } + } + + /// Returns an expression which evaluates to the encoded length of the map. + pub fn encoded_len(&self, ident: TokenStream) -> TokenStream { + let tag = self.tag; + let key_mod = self.key_ty.module(); + let kl = quote!(::prost::encoding::#key_mod::encoded_len); + let module = self.map_ty.module(); + match &self.value_ty { + ValueTy::Scalar(scalar::Ty::Enumeration(ty)) => { + let default = quote!(#ty::default() as i32); + quote! { + ::prost::encoding::#module::encoded_len_with_default( + #kl, + ::prost::encoding::int32::encoded_len, + &(#default), + #tag, + &#ident, + ) + } + } + ValueTy::Scalar(value_ty) => { + let val_mod = value_ty.module(); + let vl = quote!(::prost::encoding::#val_mod::encoded_len); + quote!(::prost::encoding::#module::encoded_len(#kl, #vl, #tag, &#ident)) + } + ValueTy::Message => quote! { + ::prost::encoding::#module::encoded_len( + #kl, + ::prost::encoding::message::encoded_len, + #tag, + &#ident, + ) + }, + } + } + + pub fn clear(&self, ident: TokenStream) -> TokenStream { + quote!(#ident.clear()) + } + + /// Returns methods to embed in the message. + pub fn methods(&self, ident: &TokenStream) -> Option { + if let ValueTy::Scalar(scalar::Ty::Enumeration(ty)) = &self.value_ty { + let key_ty = self.key_ty.rust_type(); + let key_ref_ty = self.key_ty.rust_ref_type(); + + let get = Ident::new(&format!("get_{}", ident), Span::call_site()); + let insert = Ident::new(&format!("insert_{}", ident), Span::call_site()); + let take_ref = if self.key_ty.is_numeric() { + quote!(&) + } else { + quote!() + }; + + let get_doc = format!( + "Returns the enum value for the corresponding key in `{}`, \ + or `None` if the entry does not exist or it is not a valid enum value.", + ident, + ); + let insert_doc = format!("Inserts a key value pair into `{}`.", ident); + Some(quote! { + #[doc=#get_doc] + pub fn #get(&self, key: #key_ref_ty) -> ::core::option::Option<#ty> { + self.#ident.get(#take_ref key).cloned().and_then(|x| { + let result: ::core::result::Result<#ty, _> = ::core::convert::TryFrom::try_from(x); + result.ok() + }) + } + #[doc=#insert_doc] + pub fn #insert(&mut self, key: #key_ty, value: #ty) -> ::core::option::Option<#ty> { + self.#ident.insert(key, value as i32).and_then(|x| { + let result: ::core::result::Result<#ty, _> = ::core::convert::TryFrom::try_from(x); + result.ok() + }) + } + }) + } else { + None + } + } + + /// Returns a newtype wrapper around the map, implementing nicer Debug + /// + /// The Debug tries to convert any enumerations met into the variants if possible, instead of + /// outputting the raw numbers. + pub fn debug(&self, wrapper_name: TokenStream) -> TokenStream { + let type_name = match self.map_ty { + MapTy::HashMap => Ident::new("HashMap", Span::call_site()), + MapTy::BTreeMap => Ident::new("BTreeMap", Span::call_site()), + }; + + // A fake field for generating the debug wrapper + let key_wrapper = fake_scalar(self.key_ty.clone()).debug(quote!(KeyWrapper)); + let key = self.key_ty.rust_type(); + let value_wrapper = self.value_ty.debug(); + let libname = self.map_ty.lib(); + let fmt = quote! { + fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { + #key_wrapper + #value_wrapper + let mut builder = f.debug_map(); + for (k, v) in self.0 { + builder.entry(&KeyWrapper(k), &ValueWrapper(v)); + } + builder.finish() + } + }; + match &self.value_ty { + ValueTy::Scalar(ty) => { + if let scalar::Ty::Bytes(_) = *ty { + return quote! { + struct #wrapper_name<'a>(&'a dyn ::core::fmt::Debug); + impl<'a> ::core::fmt::Debug for #wrapper_name<'a> { + fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { + self.0.fmt(f) + } + } + }; + } + + let value = ty.rust_type(); + quote! { + struct #wrapper_name<'a>(&'a ::#libname::collections::#type_name<#key, #value>); + impl<'a> ::core::fmt::Debug for #wrapper_name<'a> { + #fmt + } + } + } + ValueTy::Message => quote! { + struct #wrapper_name<'a, V: 'a>(&'a ::#libname::collections::#type_name<#key, V>); + impl<'a, V> ::core::fmt::Debug for #wrapper_name<'a, V> + where + V: ::core::fmt::Debug + 'a, + { + #fmt + } + }, + } + } +} + +fn key_ty_from_str(s: &str) -> Result { + let ty = scalar::Ty::from_str(s)?; + match ty { + scalar::Ty::Int32 + | scalar::Ty::Int64 + | scalar::Ty::Uint32 + | scalar::Ty::Uint64 + | scalar::Ty::Sint32 + | scalar::Ty::Sint64 + | scalar::Ty::Fixed32 + | scalar::Ty::Fixed64 + | scalar::Ty::Sfixed32 + | scalar::Ty::Sfixed64 + | scalar::Ty::Bool + | scalar::Ty::String => Ok(ty), + _ => bail!("invalid map key type: {}", s), + } +} + +/// A map value type. +#[derive(Clone, Debug, PartialEq, Eq)] +pub enum ValueTy { + Scalar(scalar::Ty), + Message, +} + +impl ValueTy { + fn from_str(s: &str) -> Result { + if let Ok(ty) = scalar::Ty::from_str(s) { + Ok(ValueTy::Scalar(ty)) + } else if s.trim() == "message" { + Ok(ValueTy::Message) + } else { + bail!("invalid map value type: {}", s); + } + } + + /// Returns a newtype wrapper around the ValueTy for nicer debug. + /// + /// If the contained value is enumeration, it tries to convert it to the variant. If not, it + /// just forwards the implementation. + fn debug(&self) -> TokenStream { + match self { + ValueTy::Scalar(ty) => fake_scalar(ty.clone()).debug(quote!(ValueWrapper)), + ValueTy::Message => quote!( + fn ValueWrapper(v: T) -> T { + v + } + ), + } + } +} diff --git a/lib/proto-derive/src/field/message.rs b/lib/proto-derive/src/field/message.rs new file mode 100644 index 0000000..de05591 --- /dev/null +++ b/lib/proto-derive/src/field/message.rs @@ -0,0 +1,132 @@ +use anyhow::{Error, bail}; +use proc_macro2::TokenStream; +use quote::{ToTokens, quote}; +use syn::Meta; + +use crate::field::{Label, set_bool, set_option, tag_attr, word_attr}; + +#[derive(Clone)] +pub struct Field { + pub label: Label, + pub tag: u32, +} + +impl Field { + pub fn new(attrs: &[Meta], inferred_tag: Option) -> Result, Error> { + let mut message = false; + let mut label = None; + let mut tag = None; + let mut boxed = false; + + let mut unknown_attrs = Vec::new(); + + for attr in attrs { + if word_attr("message", attr) { + set_bool(&mut message, "duplicate message attribute")?; + } else if word_attr("boxed", attr) { + set_bool(&mut boxed, "duplicate boxed attribute")?; + } else if let Some(t) = tag_attr(attr)? { + set_option(&mut tag, t, "duplicate tag attributes")?; + } else if let Some(l) = Label::from_attr(attr) { + set_option(&mut label, l, "duplicate label attributes")?; + } else { + unknown_attrs.push(attr); + } + } + + if !message { + return Ok(None); + } + + if !unknown_attrs.is_empty() { + bail!( + "unknown attribute(s) for message field: #[prost({})]", + quote!(#(#unknown_attrs),*) + ); + } + + let tag = match tag.or(inferred_tag) { + Some(tag) => tag, + None => bail!("message field is missing a tag attribute"), + }; + + Ok(Some(Field { + label: label.unwrap_or(Label::Optional), + tag, + })) + } + + pub fn new_oneof(attrs: &[Meta]) -> Result, Error> { + if let Some(mut field) = Field::new(attrs, None)? { + if let Some(attr) = attrs.iter().find(|attr| Label::from_attr(attr).is_some()) { + bail!( + "invalid attribute for oneof field: {}", + attr.path().into_token_stream() + ); + } + field.label = Label::Required; + Ok(Some(field)) + } else { + Ok(None) + } + } + + pub fn encode(&self, ident: TokenStream) -> TokenStream { + let tag = self.tag; + match self.label { + Label::Optional => quote! { + if let Some(ref msg) = #ident { + ::prost::encoding::message::encode(#tag, msg, buf); + } + }, + Label::Required => quote! { + ::prost::encoding::message::encode(#tag, &#ident, buf); + }, + Label::Repeated => quote! { + for msg in &#ident { + ::prost::encoding::message::encode(#tag, msg, buf); + } + }, + } + } + + pub fn merge(&self, ident: TokenStream) -> TokenStream { + match self.label { + Label::Optional => quote! { + ::prost::encoding::message::merge(wire_type, + #ident.get_or_insert_with(::core::default::Default::default), + buf, + ctx) + }, + Label::Required => quote! { + ::prost::encoding::message::merge(wire_type, #ident, buf, ctx) + }, + Label::Repeated => quote! { + ::prost::encoding::message::merge_repeated(wire_type, #ident, buf, ctx) + }, + } + } + + pub fn encoded_len(&self, ident: TokenStream) -> TokenStream { + let tag = self.tag; + match self.label { + Label::Optional => quote! { + #ident.as_ref().map_or(0, |msg| ::prost::encoding::message::encoded_len(#tag, msg)) + }, + Label::Required => quote! { + ::prost::encoding::message::encoded_len(#tag, &#ident) + }, + Label::Repeated => quote! { + ::prost::encoding::message::encoded_len_repeated(#tag, &#ident) + }, + } + } + + pub fn clear(&self, ident: TokenStream) -> TokenStream { + match self.label { + Label::Optional => quote!(#ident = ::core::option::Option::None), + Label::Required => quote!(#ident.clear()), + Label::Repeated => quote!(#ident.clear()), + } + } +} diff --git a/lib/proto-derive/src/field/mod.rs b/lib/proto-derive/src/field/mod.rs new file mode 100644 index 0000000..bafdff3 --- /dev/null +++ b/lib/proto-derive/src/field/mod.rs @@ -0,0 +1,384 @@ +mod group; +mod map; +mod message; +mod oneof; +mod scalar; + +use std::fmt; +use std::slice; + +use anyhow::{Error, bail}; +use proc_macro2::TokenStream; +use quote::quote; +use syn::punctuated::Punctuated; +use syn::{Attribute, Expr, ExprLit, Lit, LitBool, LitInt, Meta, MetaNameValue, Token}; + +#[derive(Clone)] +pub enum Field { + /// A scalar field. + Scalar(scalar::Field), + /// A message field. + Message(message::Field), + /// A map field. + Map(map::Field), + /// A oneof field. + Oneof(oneof::Field), + /// A group field. + Group(group::Field), + /// An ignored field. + Ignored, +} + +impl Field { + /// Creates a new `Field` from an iterator of field attributes. + /// + /// If the meta items are invalid, an error will be returned. + /// If the field should be ignored, `None` is returned. + pub fn new(attrs: Vec, inferred_tag: Option) -> Result, Error> { + let attrs = prost_attrs(attrs)?; + + // TODO: check for ignore attribute. + + let field = if let Some(field) = scalar::Field::new(&attrs, inferred_tag)? { + Field::Scalar(field) + } else if let Some(field) = message::Field::new(&attrs, inferred_tag)? { + Field::Message(field) + } else if let Some(field) = map::Field::new(&attrs, inferred_tag)? { + Field::Map(field) + } else if let Some(field) = oneof::Field::new(&attrs)? { + Field::Oneof(field) + } else if let Some(field) = group::Field::new(&attrs, inferred_tag)? { + Field::Group(field) + } else { + Field::Ignored // Fuck off and ignore a field if it doesn't have attr + }; + + Ok(Some(field)) + } + + /// Creates a new oneof `Field` from an iterator of field attributes. + /// + /// If the meta items are invalid, an error will be returned. + /// If the field should be ignored, `None` is returned. + pub fn new_oneof(attrs: Vec) -> Result, Error> { + let attrs = prost_attrs(attrs)?; + + // TODO: check for ignore attribute. + + let field = if let Some(field) = scalar::Field::new_oneof(&attrs)? { + Field::Scalar(field) + } else if let Some(field) = message::Field::new_oneof(&attrs)? { + Field::Message(field) + } else if let Some(field) = map::Field::new_oneof(&attrs)? { + Field::Map(field) + } else if let Some(field) = group::Field::new_oneof(&attrs)? { + Field::Group(field) + } else { + Field::Ignored // Fuck off and ignore a field if it doesn't have attr + }; + + Ok(Some(field)) + } + + pub fn tags(&self) -> Vec { + match *self { + Field::Scalar(ref scalar) => vec![scalar.tag], + Field::Message(ref message) => vec![message.tag], + Field::Map(ref map) => vec![map.tag], + Field::Oneof(ref oneof) => oneof.tags.clone(), + Field::Group(ref group) => vec![group.tag], + Field::Ignored => Vec::new(), + } + } + + /// Returns a statement which encodes the field. + pub fn encode(&self, ident: TokenStream) -> TokenStream { + match *self { + Field::Scalar(ref scalar) => scalar.encode(ident), + Field::Message(ref message) => message.encode(ident), + Field::Map(ref map) => map.encode(ident), + Field::Oneof(ref oneof) => oneof.encode(ident), + Field::Group(ref group) => group.encode(ident), + Field::Ignored => quote! { () }, + } + } + + /// Returns an expression which evaluates to the result of merging a decoded + /// value into the field. + pub fn merge(&self, ident: TokenStream) -> TokenStream { + match *self { + Field::Scalar(ref scalar) => scalar.merge(ident), + Field::Message(ref message) => message.merge(ident), + Field::Map(ref map) => map.merge(ident), + Field::Oneof(ref oneof) => oneof.merge(ident), + Field::Group(ref group) => group.merge(ident), + Field::Ignored => quote! { () }, + } + } + + /// Returns an expression which evaluates to the encoded length of the field. + pub fn encoded_len(&self, ident: TokenStream) -> TokenStream { + match *self { + Field::Scalar(ref scalar) => scalar.encoded_len(ident), + Field::Map(ref map) => map.encoded_len(ident), + Field::Message(ref msg) => msg.encoded_len(ident), + Field::Oneof(ref oneof) => oneof.encoded_len(ident), + Field::Group(ref group) => group.encoded_len(ident), + Field::Ignored => quote! { 0 }, + } + } + + /// Returns a statement which clears the field. + pub fn clear(&self, ident: TokenStream) -> TokenStream { + match *self { + Field::Scalar(ref scalar) => scalar.clear(ident), + Field::Message(ref message) => message.clear(ident), + Field::Map(ref map) => map.clear(ident), + Field::Oneof(ref oneof) => oneof.clear(ident), + Field::Group(ref group) => group.clear(ident), + Field::Ignored => quote! { () }, + } + } + + pub fn default(&self) -> TokenStream { + match *self { + Field::Scalar(ref scalar) => scalar.default(), + _ => quote!(::core::default::Default::default()), + } + } + + /// Produces the fragment implementing debug for the given field. + pub fn debug(&self, ident: TokenStream) -> TokenStream { + match *self { + Field::Scalar(ref scalar) => { + let wrapper = scalar.debug(quote!(ScalarWrapper)); + quote! { + { + #wrapper + ScalarWrapper(&#ident) + } + } + } + Field::Map(ref map) => { + let wrapper = map.debug(quote!(MapWrapper)); + quote! { + { + #wrapper + MapWrapper(&#ident) + } + } + } + _ => quote!(&#ident), + } + } + + pub fn methods(&self, ident: &TokenStream) -> Option { + match *self { + Field::Scalar(ref scalar) => scalar.methods(ident), + Field::Map(ref map) => map.methods(ident), + _ => None, + } + } +} + +#[derive(Clone, Copy, PartialEq, Eq)] +pub enum Label { + /// An optional field. + Optional, + /// A required field. + Required, + /// A repeated field. + Repeated, +} + +impl Label { + fn as_str(self) -> &'static str { + match self { + Label::Optional => "optional", + Label::Required => "required", + Label::Repeated => "repeated", + } + } + + fn variants() -> slice::Iter<'static, Label> { + const VARIANTS: &[Label] = &[Label::Optional, Label::Required, Label::Repeated]; + VARIANTS.iter() + } + + /// Parses a string into a field label. + /// If the string doesn't match a field label, `None` is returned. + fn from_attr(attr: &Meta) -> Option