From 0fddeb9e39a14406ab8ab247f0f0971b0aed303b Mon Sep 17 00:00:00 2001 From: clayamore Date: Thu, 8 Aug 2024 00:35:34 +0200 Subject: [PATCH 01/12] WIP! New release. Major rewrite --- Cargo.lock | 1714 +- Cargo.toml | 12 +- src/api/github.rs | 20 + src/api/mod.rs | 2 + src/api/models/mod.rs | 1 + src/api/models/releases.rs | 154 + src/db/bosses.rs | 1304 +- src/db/classes.rs | 215 +- src/db/colosseums.rs | 39 +- src/db/cookbooks.rs | 304 +- src/db/graces.rs | 792 +- src/db/item_name.rs | 3620 ++- src/db/map_name.rs | 179 +- src/db/maps.rs | 171 +- src/db/mod.rs | 34 +- src/db/regions.rs | 1552 +- src/db/stats.rs | 4773 ++-- src/db/summoning_pools.rs | 676 +- src/db/whetblades.rs | 82 +- src/main.rs | 437 +- src/read/mod.rs | 1 - src/read/read.rs | 6 - src/save/common/mod.rs | 3 - src/save/common/save_slot.rs | 1810 -- src/save/common/user_data_10.rs | 326 - src/save/common/user_data_11.rs | 41 - src/save/mod.rs | 4 - src/save/pc/mod.rs | 5 - src/save/pc/pc_save.rs | 54 - src/save/pc/save_header.rs | 29 - src/save/pc/save_slot.rs | 50 - src/save/pc/user_data_10.rs | 164 - src/save/pc/user_data_11.rs | 49 - src/save/playstation/mod.rs | 3 - src/save/playstation/ps_save.rs | 55 - src/save/playstation/save_header.rs | 29 - src/save/playstation/user_data_10.rs | 105 - src/save/save.rs | 838 - src/ui/character_list.rs | 38 + src/ui/custom/checkbox.rs | 102 +- src/ui/custom/mod.rs | 3 +- src/ui/custom/selectable.rs | 66 + src/ui/events.rs | 328 +- src/ui/file_drop.rs | 62 + src/ui/general.rs | 49 +- src/ui/importer.rs | 97 +- src/ui/information.rs | 43 + src/ui/{inventory => inventory.old}/add.rs | 0 src/ui/inventory.old/mod.rs | 3 + src/ui/inventory/add/add.rs | 520 + src/ui/inventory/add/mod.rs | 2 + src/ui/inventory/add/single.rs | 201 + src/ui/inventory/browse.rs | 296 +- src/ui/inventory/inventory.rs | 106 +- src/ui/inventory/mod.rs | 6 +- src/ui/menu.rs | 112 +- src/ui/mod.rs | 24 +- src/ui/none.rs | 16 +- src/ui/notifications.rs | 78 + src/ui/regions.rs | 279 +- src/ui/settings.rs | 54 + src/ui/stats.rs | 196 +- src/ui/toolbar.rs | 112 + src/updater/mod.rs | 1 + src/updater/updater.rs | 57 + src/util/bit.rs | 22 - src/util/bnd4.rs | 436 - src/util/br_ext.rs | 191 - src/util/mod.rs | 7 - src/util/param_structs.rs | 18629 ---------------- src/util/params.rs | 601 - src/util/regulation.rs | 163 - src/util/validator.rs | 239 - src/vm/character.rs | 36 + src/vm/events.rs | 224 +- src/vm/general.rs | 50 +- src/vm/importer.rs | 133 +- src/vm/inventory/add/add.rs | 261 + src/vm/inventory/add/filter.rs | 24 + src/vm/inventory/add/item_param.rs | 21 + src/vm/inventory/add/mod.rs | 4 + src/vm/inventory/add/weapon_type.rs | 212 + src/vm/inventory/browse.rs | 86 + src/vm/inventory/inventory.rs | 105 + src/vm/inventory/mod.rs | 560 +- .../{inventory => inventory_old}/add_bulk.rs | 0 .../add_single.rs | 0 src/vm/inventory_old/mod.rs | 886 + src/vm/mod.rs | 15 +- src/vm/notifications.rs | 55 + src/vm/profile_summary.rs | 2 +- src/vm/regions.rs | 82 +- src/vm/regulation.rs | 1074 +- src/vm/slot.rs | 38 - src/vm/stats.rs | 107 +- src/vm/vm.rs | 908 +- src/write/mod.rs | 1 - src/write/write.rs | 5 - 98 files changed, 13989 insertions(+), 33692 deletions(-) create mode 100644 src/api/github.rs create mode 100644 src/api/mod.rs create mode 100644 src/api/models/mod.rs create mode 100644 src/api/models/releases.rs delete mode 100644 src/read/mod.rs delete mode 100644 src/read/read.rs delete mode 100644 src/save/common/mod.rs delete mode 100644 src/save/common/save_slot.rs delete mode 100644 src/save/common/user_data_10.rs delete mode 100644 src/save/common/user_data_11.rs delete mode 100644 src/save/mod.rs delete mode 100644 src/save/pc/mod.rs delete mode 100644 src/save/pc/pc_save.rs delete mode 100644 src/save/pc/save_header.rs delete mode 100644 src/save/pc/save_slot.rs delete mode 100644 src/save/pc/user_data_10.rs delete mode 100644 src/save/pc/user_data_11.rs delete mode 100644 src/save/playstation/mod.rs delete mode 100644 src/save/playstation/ps_save.rs delete mode 100644 src/save/playstation/save_header.rs delete mode 100644 src/save/playstation/user_data_10.rs delete mode 100644 src/save/save.rs create mode 100644 src/ui/character_list.rs create mode 100644 src/ui/custom/selectable.rs create mode 100644 src/ui/file_drop.rs create mode 100644 src/ui/information.rs rename src/ui/{inventory => inventory.old}/add.rs (100%) create mode 100644 src/ui/inventory.old/mod.rs create mode 100644 src/ui/inventory/add/add.rs create mode 100644 src/ui/inventory/add/mod.rs create mode 100644 src/ui/inventory/add/single.rs create mode 100644 src/ui/notifications.rs create mode 100644 src/ui/settings.rs create mode 100644 src/ui/toolbar.rs create mode 100644 src/updater/mod.rs create mode 100644 src/updater/updater.rs delete mode 100644 src/util/bit.rs delete mode 100644 src/util/bnd4.rs delete mode 100644 src/util/br_ext.rs delete mode 100644 src/util/mod.rs delete mode 100644 src/util/param_structs.rs delete mode 100644 src/util/params.rs delete mode 100644 src/util/regulation.rs delete mode 100644 src/util/validator.rs create mode 100644 src/vm/character.rs create mode 100644 src/vm/inventory/add/add.rs create mode 100644 src/vm/inventory/add/filter.rs create mode 100644 src/vm/inventory/add/item_param.rs create mode 100644 src/vm/inventory/add/mod.rs create mode 100644 src/vm/inventory/add/weapon_type.rs create mode 100644 src/vm/inventory/browse.rs create mode 100644 src/vm/inventory/inventory.rs rename src/vm/{inventory => inventory_old}/add_bulk.rs (100%) rename src/vm/{inventory => inventory_old}/add_single.rs (100%) create mode 100644 src/vm/inventory_old/mod.rs create mode 100644 src/vm/notifications.rs delete mode 100644 src/vm/slot.rs delete mode 100644 src/write/mod.rs delete mode 100644 src/write/write.rs diff --git a/Cargo.lock b/Cargo.lock index 078b671..2437624 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "ab_glyph" -version = "0.2.23" +version = "0.2.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80179d7dd5d7e8c285d67c4a1e652972a92de7475beddfb92028c76463b13225" +checksum = "79faae4620f45232f599d9bc7b290f88247a0834162c4495ab2f02d60004adfb" dependencies = [ "ab_glyph_rasterizer", "owned_ttf_parser", @@ -20,9 +20,9 @@ checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" [[package]] name = "accesskit" -version = "0.12.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cb10ed32c63247e4e39a8f42e8e30fb9442fbf7878c8e4a9849e7e381619bea" +checksum = "74a4b14f3d99c1255dcba8f45621ab1a2e7540a0009652d33989005a4d0bfc6b" dependencies = [ "enumn", "serde", @@ -95,9 +95,9 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" dependencies = [ "gimli", ] @@ -121,23 +121,23 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.8" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42cd52102d3df161c77a887b608d7a4897d7cc112886a9537b738a887a03aaff" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", "getrandom", "once_cell", "serde", "version_check", - "zerocopy", + "zerocopy 0.7.35", ] [[package]] name = "aho-corasick" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] @@ -150,9 +150,9 @@ checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" [[package]] name = "allocator-api2" -version = "0.2.16" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" [[package]] name = "android-activity" @@ -161,7 +161,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee91c0c2905bae44f84bfa4e044536541df26b7703fd0888deeb9060fcc44289" dependencies = [ "android-properties", - "bitflags 2.4.2", + "bitflags 2.6.0", "cc", "cesu8", "jni", @@ -181,6 +181,12 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + [[package]] name = "android_system_properties" version = "0.1.5" @@ -192,47 +198,48 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.11" +version = "0.6.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5" +checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", + "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.6" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" +checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" [[package]] name = "anstyle-parse" -version = "0.2.3" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.2" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" dependencies = [ "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.2" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" dependencies = [ "anstyle", "windows-sys 0.52.0", @@ -240,9 +247,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.81" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0952808a6c2afd1aa8947271f3a60f1a6763c7b912d210184c5149b5cf147247" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" [[package]] name = "arbitrary" @@ -252,17 +259,16 @@ checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" [[package]] name = "arboard" -version = "3.3.1" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1faa3c733d9a3dd6fbaf85da5d162a2e03b2e0033a90dceb0e2a90fdd1e5380a" +checksum = "9fb4009533e8ff8f1450a5bcbc30f4242a1d34442221f72314bea1f5dc9c7f89" dependencies = [ "clipboard-win", "log", - "objc", - "objc-foundation", - "objc_id", + "objc2 0.5.2", + "objc2-app-kit", + "objc2-foundation", "parking_lot", - "thiserror", "x11rb", ] @@ -274,14 +280,14 @@ checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.72", ] [[package]] name = "arrayref" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" +checksum = "9d151e35f61089500b617991b791fc8bfd237ae50cd5950803758a179b41e67a" [[package]] name = "arrayvec" @@ -316,28 +322,26 @@ dependencies = [ [[package]] name = "async-channel" -version = "2.2.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28243a43d821d11341ab73c80bed182dc015c514b951616cf79bd4af39af0c3" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" dependencies = [ "concurrent-queue", - "event-listener 5.0.0", - "event-listener-strategy 0.5.0", + "event-listener-strategy", "futures-core", "pin-project-lite", ] [[package]] name = "async-executor" -version = "1.8.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ae5ebefcc48e7452b4987947920dac9450be1110cadf34d1b8c116bdbaf97c" +checksum = "d7ebdfa2ebdab6b1760375fa7d6f382b9f486eac35fc994625a00e89280bdbb7" dependencies = [ - "async-lock 3.3.0", "async-task", "concurrent-queue", - "fastrand 2.0.1", - "futures-lite 2.2.0", + "fastrand 2.1.0", + "futures-lite 2.3.0", "slab", ] @@ -375,18 +379,18 @@ dependencies = [ [[package]] name = "async-io" -version = "2.3.1" +version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f97ab0c5b00a7cdbe5a371b9a782ee7be1316095885c8a4ea1daf490eb0ef65" +checksum = "0d6baa8f0178795da0e71bc42c9e5d13261aac7ee549853162e66a241ba17964" dependencies = [ - "async-lock 3.3.0", + "async-lock 3.4.0", "cfg-if", "concurrent-queue", "futures-io", - "futures-lite 2.2.0", + "futures-lite 2.3.0", "parking", - "polling 3.4.0", - "rustix 0.38.31", + "polling 3.7.2", + "rustix 0.38.34", "slab", "tracing", "windows-sys 0.52.0", @@ -403,12 +407,12 @@ dependencies = [ [[package]] name = "async-lock" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" dependencies = [ - "event-listener 4.0.3", - "event-listener-strategy 0.4.0", + "event-listener 5.3.1", + "event-listener-strategy", "pin-project-lite", ] @@ -431,54 +435,54 @@ dependencies = [ "cfg-if", "event-listener 3.1.0", "futures-lite 1.13.0", - "rustix 0.38.31", + "rustix 0.38.34", "windows-sys 0.48.0", ] [[package]] name = "async-recursion" -version = "1.0.5" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd55a5ba1179988837d24ab4c7cc8ed6efdeff578ede0416b4225a5fca35bd0" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.72", ] [[package]] name = "async-signal" -version = "0.2.5" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e47d90f65a225c4527103a8d747001fc56e375203592b25ad103e1ca13124c5" +checksum = "dfb3634b73397aa844481f814fad23bbf07fdb0eabec10f2eb95e58944b1ec32" dependencies = [ - "async-io 2.3.1", - "async-lock 2.8.0", + "async-io 2.3.3", + "async-lock 3.4.0", "atomic-waker", "cfg-if", "futures-core", "futures-io", - "rustix 0.38.31", + "rustix 0.38.34", "signal-hook-registry", "slab", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "async-task" -version = "4.7.0" +version = "4.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbb36e985947064623dbd357f727af08ffd077f93d696782f3c56365fa2e2799" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.77" +version = "0.1.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" +checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.72", ] [[package]] @@ -549,9 +553,9 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.1.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "av1-grain" @@ -578,9 +582,9 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.71" +version = "0.3.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" dependencies = [ "addr2line", "cc", @@ -593,18 +597,9 @@ dependencies = [ [[package]] name = "base64" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9475866fec1451be56a3c2400fd081ff546538961565ccb5b7142cbd22bc7a51" - -[[package]] -name = "binary-reader" -version = "0.4.5" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d173c51941d642588ed6a13d464617e3a9176b8fe00dc2de182434c36812a5e" -dependencies = [ - "byteorder", -] +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bit-set" @@ -635,15 +630,27 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.2" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" [[package]] name = "bitstream-io" -version = "2.2.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06c9989a51171e2e81038ab168b6ae22886fe9ded214430dbb4f41c28cf176da" +checksum = "3dcde5f311c85b8ca30c2e4198d4326bc342c76541590106f5fa4a50946ea499" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] [[package]] name = "block" @@ -684,7 +691,7 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae85a0696e7ea3b835a453750bf002770776609115e6d25c6d2ff28a8200f7e7" dependencies = [ - "objc-sys 0.3.2", + "objc-sys 0.3.5", ] [[package]] @@ -707,52 +714,58 @@ dependencies = [ "objc2 0.4.1", ] +[[package]] +name = "block2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" +dependencies = [ + "objc2 0.5.2", +] + [[package]] name = "blocking" -version = "1.5.1" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" dependencies = [ "async-channel", - "async-lock 3.3.0", "async-task", - "fastrand 2.0.1", "futures-io", - "futures-lite 2.2.0", + "futures-lite 2.3.0", "piper", - "tracing", ] [[package]] name = "built" -version = "0.7.1" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d17f4d6e4dc36d1a02fbedc2753a096848e7c1b0772f7654eab8e2c927dd53" +checksum = "236e6289eda5a812bc6b53c3b024039382a2895fbbeef2d748b2931546d392c4" [[package]] name = "bumpalo" -version = "3.15.0" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d32a994c2b3ca201d9b263612a374263f05e7adde37c4707f693dcd375076d1f" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.14.3" +version = "1.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2ef034f05691a48569bd920a96c81b9d91bbad1ab5ac7c4616c1f6ef36cb79f" +checksum = "102087e286b4677862ea56cf8fc58bb2cdfa8725c40ffb80fe3a008eb7f2fc83" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.5.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "965ab7eb5f8f97d2a083c799f3a1b994fc397b2fe2da5d1da1626ce15a39f2b1" +checksum = "1ee891b04274a59bd38b412188e24b849617b2e45a0fd8d057deb63e7403761b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.72", ] [[package]] @@ -761,11 +774,17 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + [[package]] name = "bytes" -version = "1.5.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" [[package]] name = "cairo-sys-rs" @@ -783,10 +802,24 @@ version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fba7adb4dd5aa98e5553510223000e7148f621165ec5f9acd7113f6ca4995298" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.6.0", + "log", + "polling 3.7.2", + "rustix 0.38.34", + "slab", + "thiserror", +] + +[[package]] +name = "calloop" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" +dependencies = [ + "bitflags 2.6.0", "log", - "polling 3.4.0", - "rustix 0.38.31", + "polling 3.7.2", + "rustix 0.38.34", "slab", "thiserror", ] @@ -797,8 +830,20 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f0ea9b9476c7fad82841a8dbb380e2eae480c21910feba80725b46931ed8f02" dependencies = [ - "calloop", - "rustix 0.38.31", + "calloop 0.12.4", + "rustix 0.38.34", + "wayland-backend", + "wayland-client", +] + +[[package]] +name = "calloop-wayland-source" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" +dependencies = [ + "calloop 0.13.0", + "rustix 0.38.34", "wayland-backend", "wayland-client", ] @@ -814,9 +859,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.94" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f6e324229dc011159fcc089755d1e2e216a90d43a7dea6853ca740b84f35e7" +checksum = "26a5c3fd7bfa1ce3897a3a3501d362b2d87b7f2583ebcb4a949ec25911025cbc" dependencies = [ "jobserver", "libc", @@ -830,9 +875,9 @@ checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" [[package]] name = "cfg-expr" -version = "0.15.7" +version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa50868b64a9a6fda9d593ce778849ea8715cd2a3d2cc17ffdb4a2f2f2f1961d" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" dependencies = [ "smallvec", "target-lexicon", @@ -859,6 +904,20 @@ dependencies = [ "libc", ] +[[package]] +name = "chrono" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-targets 0.52.6", +] + [[package]] name = "cipher" version = "0.4.4" @@ -871,9 +930,9 @@ dependencies = [ [[package]] name = "clipboard-win" -version = "5.1.0" +version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ec832972fefb8cf9313b45a0d1945e29c9c251f1d4c6eafc5fe2124c02d2e81" +checksum = "15efe7a882b08f34e38556b14f2fb3daa98769d06c7f0c1b076dfd0d983bc892" dependencies = [ "error-code", ] @@ -926,9 +985,9 @@ checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" [[package]] name = "colorchoice" -version = "1.0.0" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" [[package]] name = "com" @@ -963,9 +1022,9 @@ dependencies = [ [[package]] name = "combine" -version = "4.6.6" +version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" dependencies = [ "bytes", "memchr", @@ -973,9 +1032,9 @@ dependencies = [ [[package]] name = "concurrent-queue" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" dependencies = [ "crossbeam-utils", ] @@ -998,9 +1057,9 @@ checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "core-graphics" -version = "0.23.1" +version = "0.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "970a29baf4110c26fedbc7f82107d42c23f7e88e404c4577ed73fe99ff85a212" +checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" dependencies = [ "bitflags 1.3.2", "core-foundation", @@ -1031,9 +1090,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.4.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if", ] @@ -1059,9 +1118,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.19" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] name = "crunchy" @@ -1085,6 +1144,66 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" +[[package]] +name = "darling" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.72", +] + +[[package]] +name = "darling_macro" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.72", +] + +[[package]] +name = "deku" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709ade444d53896e60f6265660eb50480dd08b77bfc822e5dcc233b88b0b2fba" +dependencies = [ + "bitvec", + "deku_derive", + "no_std_io", + "rustversion", +] + +[[package]] +name = "deku_derive" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7534973f93f9de83203e41c8ddd32d230599fa73fa889f3deb1580ccd186913" +dependencies = [ + "darling", + "proc-macro-crate 3.1.0", + "proc-macro2", + "quote", + "syn 2.0.72", +] + [[package]] name = "derivative" version = "2.2.0" @@ -1118,23 +1237,23 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" dependencies = [ - "libloading 0.8.1", + "libloading 0.8.5", ] [[package]] name = "document-features" -version = "0.2.8" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef5282ad69563b5fc40319526ba27e0e7363d552a896f0297d54f767717f9b95" +checksum = "cb6969eaabd2421f8a2775cfd2471a2b634372b4a25d41e3bd647b79912850a0" dependencies = [ "litrs", ] [[package]] name = "downcast-rs" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" [[package]] name = "ecolor" @@ -1162,14 +1281,14 @@ dependencies = [ "glow", "glutin", "glutin-winit", - "image 0.24.8", + "image 0.24.9", "js-sys", "log", "objc", "parking_lot", "percent-encoding", "raw-window-handle 0.5.2", - "raw-window-handle 0.6.0", + "raw-window-handle 0.6.2", "static_assertions", "thiserror", "wasm-bindgen", @@ -1231,7 +1350,7 @@ dependencies = [ "arboard", "egui", "log", - "raw-window-handle 0.6.0", + "raw-window-handle 0.6.2", "smithay-clipboard", "web-time", "webbrowser", @@ -1261,7 +1380,7 @@ dependencies = [ "egui", "glow", "log", - "memoffset 0.9.0", + "memoffset 0.9.1", "wasm-bindgen", "web-sys", "winit", @@ -1269,9 +1388,9 @@ dependencies = [ [[package]] name = "either" -version = "1.10.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "emath" @@ -1285,9 +1404,9 @@ dependencies = [ [[package]] name = "encoding_rs" -version = "0.8.33" +version = "0.8.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" dependencies = [ "cfg-if", ] @@ -1310,14 +1429,14 @@ checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.72", ] [[package]] name = "enumflags2" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3278c9d5fb675e0a51dabcf4c0d355f692b064171535ba72361be1528a9d8e8d" +checksum = "d232db7f5956f3f14313dc2f87985c58bd2c695ce124c8cdd984e08e15ac133d" dependencies = [ "enumflags2_derive", "serde", @@ -1325,31 +1444,31 @@ dependencies = [ [[package]] name = "enumflags2_derive" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c785274071b1b420972453b306eeca06acf4633829db4223b58a2a8c5953bc4" +checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.72", ] [[package]] name = "enumn" -version = "0.1.13" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fd000fd6988e73bbe993ea3db9b1aa64906ab88766d654973924340c8cddb42" +checksum = "2f9ed6b3789237c8a0c1c505af1c7eb2c560df6186f01b098c3a1064ea532f38" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.72", ] [[package]] name = "env_filter" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a009aa4810eb158359dda09d0c87378e4bbb89b5a801f016885a4707ba24f7ea" +checksum = "4f2c92ceda6ceec50f43169f9ee8424fe2db276791afde7b2cd8bc084cb376ab" dependencies = [ "log", "regex", @@ -1357,9 +1476,9 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.11.2" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c012a26a7f605efc424dd53697843a72be7dc86ad2d01f7814337794a12231d" +checksum = "e13fa619b91fb2381732789fc5de83b45675e882f66623b7d8cb4f643017018d" dependencies = [ "anstream", "anstyle", @@ -1393,20 +1512,15 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "er-save-editor" -version = "0.0.22" +version = "0.1.0" dependencies = [ - "aes", - "binary-reader", - "bitflags 2.4.2", - "cbc", + "chrono", "eframe", "egui-phosphor", "egui_extras", - "encoding_rs", "env_logger", - "image 0.25.0", - "md5", - "once_cell", + "er-save-lib", + "image 0.25.2", "regex", "reqwest", "rfd", @@ -1415,14 +1529,26 @@ dependencies = [ "serde_json", "strsim", "winres", +] + +[[package]] +name = "er-save-lib" +version = "0.1.0" +dependencies = [ + "aes", + "cbc", + "deku", + "encoding_rs", + "md5", + "thiserror", "zstd", ] [[package]] name = "errno" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" dependencies = [ "libc", "windows-sys 0.52.0", @@ -1430,9 +1556,9 @@ dependencies = [ [[package]] name = "error-code" -version = "3.0.0" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "281e452d3bad4005426416cdba5ccfd4f5c1280e10099e21db27f7c1c28347fc" +checksum = "a0474425d51df81997e2f90a21591180b38eccf27292d755f3e30750225c175b" [[package]] name = "event-listener" @@ -1453,20 +1579,9 @@ dependencies = [ [[package]] name = "event-listener" -version = "4.0.3" +version = "5.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener" -version = "5.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b72557800024fabbaa2449dd4bf24e37b93702d457a4d4f2b0dd1f0f039f20c1" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" dependencies = [ "concurrent-queue", "parking", @@ -1475,21 +1590,11 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" -dependencies = [ - "event-listener 4.0.3", - "pin-project-lite", -] - -[[package]] -name = "event-listener-strategy" -version = "0.5.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "feedafcaa9b749175d5ac357452a9d41ea2911da598fde46ce1fe02c37751291" +checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" dependencies = [ - "event-listener 5.0.0", + "event-listener 5.3.1", "pin-project-lite", ] @@ -1520,9 +1625,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.0.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" [[package]] name = "fdeflate" @@ -1535,9 +1640,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.28" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" dependencies = [ "crc32fast", "miniz_oxide", @@ -1585,7 +1690,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.72", ] [[package]] @@ -1609,6 +1714,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "futures-channel" version = "0.3.30" @@ -1648,11 +1759,11 @@ dependencies = [ [[package]] name = "futures-lite" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445ba825b27408685aaecefd65178908c36c6e96aaf6d8599419d46e624192ba" +checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" dependencies = [ - "fastrand 2.0.1", + "fastrand 2.1.0", "futures-core", "futures-io", "parking", @@ -1739,9 +1850,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.12" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", @@ -1760,9 +1871,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.1" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" [[package]] name = "gio-sys" @@ -1816,7 +1927,7 @@ version = "0.31.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "18fcd4ae4e86d991ad1300b8f57166e5be0c95ef1f63f3f5b827f8a164548746" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.6.0", "cfg_aliases", "cgl", "core-foundation", @@ -1825,7 +1936,7 @@ dependencies = [ "glutin_glx_sys", "glutin_wgl_sys", "icrate", - "libloading 0.8.1", + "libloading 0.8.5", "objc2 0.4.1", "once_cell", "raw-window-handle 0.5.2", @@ -1892,7 +2003,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.6.0", "gpu-alloc-types", ] @@ -1902,7 +2013,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.6.0", ] [[package]] @@ -1924,7 +2035,7 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc11df1ace8e7e564511f53af41f3e42ddc95b56fd07b3f4445d2a6048bc682c" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.6.0", "gpu-descriptor-types", "hashbrown", ] @@ -1935,7 +2046,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6bf0b36e6f090b7e1d8a4b49c0cb81c1f8376f72198c65dd3ad9ff3556b8b78c" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.6.0", ] [[package]] @@ -1958,15 +2069,15 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "816ec7294445779408f36fe57bc5b7fc1cf59664059096c65f905c1c61f58069" +checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab" dependencies = [ + "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "futures-util", "http", "indexmap", "slab", @@ -1977,9 +2088,9 @@ dependencies = [ [[package]] name = "half" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5eceaaeec696539ddaf7b333340f1af35a5aa87ae3e4f3ead0532f72affab2e" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" dependencies = [ "cfg-if", "crunchy", @@ -1987,9 +2098,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.3" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ "ahash", "allocator-api2", @@ -2001,10 +2112,10 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af2a7e73e1f34c48da31fb668a907f250794837e08faa144fd24f0b8b741e890" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.6.0", "com", "libc", - "libloading 0.8.1", + "libloading 0.8.5", "thiserror", "widestring", "winapi", @@ -2012,15 +2123,21 @@ dependencies = [ [[package]] name = "heck" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" -version = "0.3.6" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd5256b483761cd23699d0da46cc6fd2ee3be420bbe6d020ae4a091e70b7e9fd" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" [[package]] name = "hex" @@ -2056,9 +2173,9 @@ dependencies = [ [[package]] name = "http-body" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", "http", @@ -2066,12 +2183,12 @@ dependencies = [ [[package]] name = "http-body-util" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ "bytes", - "futures-core", + "futures-util", "http", "http-body", "pin-project-lite", @@ -2079,9 +2196,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.8.0" +version = "1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" [[package]] name = "humantime" @@ -2091,9 +2208,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "1.3.1" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" +checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" dependencies = [ "bytes", "futures-channel", @@ -2109,6 +2226,23 @@ dependencies = [ "want", ] +[[package]] +name = "hyper-rustls" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155" +dependencies = [ + "futures-util", + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", +] + [[package]] name = "hyper-tls" version = "0.6.0" @@ -2127,9 +2261,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.3" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" +checksum = "3ab92f4f49ee4fb4f997c784b7a2e0fa70050211e0b6a287f898c3c9785ca956" dependencies = [ "bytes", "futures-channel", @@ -2138,13 +2272,36 @@ dependencies = [ "http-body", "hyper", "pin-project-lite", - "socket2 0.5.6", + "socket2 0.5.7", "tokio", "tower", "tower-service", "tracing", ] +[[package]] +name = "iana-time-zone" +version = "0.1.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "icrate" version = "0.0.4" @@ -2156,6 +2313,12 @@ dependencies = [ "objc2 0.4.1", ] +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "idna" version = "0.5.0" @@ -2168,9 +2331,9 @@ dependencies = [ [[package]] name = "image" -version = "0.24.8" +version = "0.24.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "034bbe799d1909622a74d1193aa50147769440040ff36cb2baa947609b0a4e23" +checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" dependencies = [ "bytemuck", "byteorder", @@ -2181,12 +2344,12 @@ dependencies = [ [[package]] name = "image" -version = "0.25.0" +version = "0.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9b4f005360d32e9325029b38ba47ebd7a56f3316df09249368939562d518645" +checksum = "99314c8a2152b8ddb211f924cdae532d8c5e4c8bb54728e12fff1b0cd5963a10" dependencies = [ "bytemuck", - "byteorder", + "byteorder-lite", "color_quant", "exr", "gif", @@ -2204,12 +2367,12 @@ dependencies = [ [[package]] name = "image-webp" -version = "0.1.1" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a84a25dcae3ac487bc24ef280f9e20c79c9b1a3e5e32cbed3041d1c514aa87c" +checksum = "f79afb8cbee2ef20f59ccd477a218c12a93943d075b492015ecb1bb81f8ee904" dependencies = [ - "byteorder", - "thiserror", + "byteorder-lite", + "quick-error", ] [[package]] @@ -2220,9 +2383,9 @@ checksum = "44feda355f4159a7c757171a77de25daf6411e217b4cabd03bd6650690468126" [[package]] name = "indexmap" -version = "2.2.3" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" +checksum = "de3fc2e30ba82dd1b3911c8de1ffc143c74a914a14e99514d7637e3099df5ea0" dependencies = [ "equivalent", "hashbrown", @@ -2240,9 +2403,9 @@ dependencies = [ [[package]] name = "instant" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ "cfg-if", ] @@ -2255,7 +2418,7 @@ checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.72", ] [[package]] @@ -2264,7 +2427,7 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ - "hermit-abi", + "hermit-abi 0.3.9", "libc", "windows-sys 0.48.0", ] @@ -2275,6 +2438,12 @@ version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + [[package]] name = "itertools" version = "0.12.1" @@ -2314,9 +2483,9 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] name = "jobserver" -version = "0.1.28" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab46a6e9526ddef3ae7f787c06f0f2600639ba80ea3eade3d8e670a2230f51d6" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" dependencies = [ "libc", ] @@ -2329,9 +2498,9 @@ checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" [[package]] name = "js-sys" -version = "0.3.68" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "406cda4b368d531c842222cf9d2600a9a4acce8d29423695379c6868a143a9ee" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" dependencies = [ "wasm-bindgen", ] @@ -2343,7 +2512,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" dependencies = [ "libc", - "libloading 0.8.1", + "libloading 0.8.5", "pkg-config", ] @@ -2353,12 +2522,6 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - [[package]] name = "lebe" version = "0.5.2" @@ -2367,9 +2530,9 @@ checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" [[package]] name = "libc" -version = "0.2.153" +version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "libfuzzer-sys" @@ -2394,12 +2557,12 @@ dependencies = [ [[package]] name = "libloading" -version = "0.8.1" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c571b676ddfc9a8c12f1f3d3085a7b163966a8fd8098a90640953ce5f6170161" +checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-sys 0.48.0", + "windows-targets 0.52.6", ] [[package]] @@ -2408,7 +2571,7 @@ version = "0.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3af92c55d7d839293953fcd0fda5ecfe93297cfde6ffbdec13b41d99c0ba6607" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.6.0", "libc", "redox_syscall 0.4.1", ] @@ -2421,9 +2584,9 @@ checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" [[package]] name = "linux-raw-sys" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "litrs" @@ -2433,9 +2596,9 @@ checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", @@ -2443,9 +2606,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.20" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "loop9" @@ -2472,7 +2635,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" dependencies = [ "cfg-if", - "rayon", ] [[package]] @@ -2483,9 +2645,9 @@ checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771" [[package]] name = "memchr" -version = "2.7.1" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memmap2" @@ -2507,9 +2669,9 @@ dependencies = [ [[package]] name = "memoffset" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" dependencies = [ "autocfg", ] @@ -2520,7 +2682,7 @@ version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c43f73953f8cbe511f021b58f18c3ce1c3d1ae13fe953293e13345bf83217f25" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.6.0", "block", "core-graphics-types", "foreign-types 0.5.0", @@ -2553,9 +2715,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" dependencies = [ "adler", "simd-adler32", @@ -2563,23 +2725,24 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.11" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +checksum = "4569e456d394deccd22ce1c1913e6ea0e54519f577285001215d33557431afe4" dependencies = [ + "hermit-abi 0.3.9", "libc", "wasi", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "naga" -version = "0.19.0" +version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8878eb410fc90853da3908aebfe61d73d26d4437ef850b70050461f939509899" +checksum = "50e3524642f53d9af419ab5e8dd29d3ba155708267667c2f3f06c88c9e130843" dependencies = [ "bit-set", - "bitflags 2.4.2", + "bitflags 2.6.0", "codespan-reporting", "hexf-parse", "indexmap", @@ -2594,11 +2757,10 @@ dependencies = [ [[package]] name = "native-tls" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" dependencies = [ - "lazy_static", "libc", "log", "openssl", @@ -2616,13 +2778,13 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2076a31b7010b17a38c01907c45b945e8f11495ee4dd588309718901b1f7a5b7" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.6.0", "jni-sys", "log", "ndk-sys", "num_enum", "raw-window-handle 0.5.2", - "raw-window-handle 0.6.0", + "raw-window-handle 0.6.2", "thiserror", ] @@ -2659,6 +2821,15 @@ dependencies = [ "memoffset 0.7.1", ] +[[package]] +name = "no_std_io" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fa5f306a6f2c01b4fd172f29bb46195b1764061bf926c75e96ff55df3178208" +dependencies = [ + "memchr", +] + [[package]] name = "nohash-hasher" version = "0.2.0" @@ -2683,11 +2854,10 @@ checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" [[package]] name = "num-bigint" -version = "0.4.4" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ - "autocfg", "num-integer", "num-traits", ] @@ -2700,7 +2870,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.72", ] [[package]] @@ -2714,11 +2884,10 @@ dependencies = [ [[package]] name = "num-rational" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" dependencies = [ - "autocfg", "num-bigint", "num-integer", "num-traits", @@ -2726,42 +2895,32 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - [[package]] name = "num_enum" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" dependencies = [ "num_enum_derive", ] [[package]] name = "num_enum_derive" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.72", ] [[package]] @@ -2793,29 +2952,79 @@ checksum = "df3b9834c1e95694a05a828b59f55fa2afec6288359cda67146126b3f90a55d7" [[package]] name = "objc-sys" -version = "0.3.2" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" + +[[package]] +name = "objc2" +version = "0.3.0-beta.3.patch-leaks.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e01640f9f2cb1220bbe80325e179e532cb3379ebcd1bf2279d703c19fe3a468" +dependencies = [ + "block2 0.2.0-alpha.6", + "objc-sys 0.2.0-beta.2", + "objc2-encode 2.0.0-pre.2", +] + +[[package]] +name = "objc2" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "559c5a40fdd30eb5e344fbceacf7595a81e242529fb4e21cf5f43fb4f11ff98d" +dependencies = [ + "objc-sys 0.3.5", + "objc2-encode 3.0.0", +] + +[[package]] +name = "objc2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" +dependencies = [ + "objc-sys 0.3.5", + "objc2-encode 4.0.3", +] + +[[package]] +name = "objc2-app-kit" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7c71324e4180d0899963fc83d9d241ac39e699609fc1025a850aadac8257459" +checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" +dependencies = [ + "bitflags 2.6.0", + "block2 0.5.1", + "libc", + "objc2 0.5.2", + "objc2-core-data", + "objc2-core-image", + "objc2-foundation", + "objc2-quartz-core", +] [[package]] -name = "objc2" -version = "0.3.0-beta.3.patch-leaks.3" +name = "objc2-core-data" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e01640f9f2cb1220bbe80325e179e532cb3379ebcd1bf2279d703c19fe3a468" +checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" dependencies = [ - "block2 0.2.0-alpha.6", - "objc-sys 0.2.0-beta.2", - "objc2-encode 2.0.0-pre.2", + "bitflags 2.6.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation", ] [[package]] -name = "objc2" -version = "0.4.1" +name = "objc2-core-image" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "559c5a40fdd30eb5e344fbceacf7595a81e242529fb4e21cf5f43fb4f11ff98d" +checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" dependencies = [ - "objc-sys 0.3.2", - "objc2-encode 3.0.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation", + "objc2-metal", ] [[package]] @@ -2833,6 +3042,49 @@ version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d079845b37af429bfe5dfa76e6d087d788031045b25cfc6fd898486fd9847666" +[[package]] +name = "objc2-encode" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7891e71393cd1f227313c9379a26a584ff3d7e6e7159e988851f0934c993f0f8" + +[[package]] +name = "objc2-foundation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +dependencies = [ + "bitflags 2.6.0", + "block2 0.5.1", + "libc", + "objc2 0.5.2", +] + +[[package]] +name = "objc2-metal" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +dependencies = [ + "bitflags 2.6.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" +dependencies = [ + "bitflags 2.6.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation", + "objc2-metal", +] + [[package]] name = "objc_exception" version = "0.1.2" @@ -2853,9 +3105,9 @@ dependencies = [ [[package]] name = "object" -version = "0.32.2" +version = "0.36.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +checksum = "3f203fa8daa7bb185f760ae12bd8e097f63d17041dcdcaf675ac54cdf863170e" dependencies = [ "memchr", ] @@ -2868,11 +3120,11 @@ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "openssl" -version = "0.10.64" +version = "0.10.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" +checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.6.0", "cfg-if", "foreign-types 0.3.2", "libc", @@ -2889,7 +3141,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.72", ] [[package]] @@ -2900,9 +3152,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.102" +version = "0.9.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" +checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" dependencies = [ "cc", "libc", @@ -2931,9 +3183,9 @@ dependencies = [ [[package]] name = "owned_ttf_parser" -version = "0.20.0" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4586edfe4c648c71797a74c84bacb32b52b212eff5dfe2bb9f2c599844023e7" +checksum = "490d3a563d3122bf7c911a59b0add9389e5ec0f5f0c3ac6b91ff235a0e6a7f90" dependencies = [ "ttf-parser", ] @@ -2958,9 +3210,9 @@ checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", "parking_lot_core", @@ -2968,22 +3220,22 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.4.1", + "redox_syscall 0.5.3", "smallvec", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] name = "paste" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "percent-encoding" @@ -3008,14 +3260,14 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.72", ] [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] name = "pin-utils" @@ -3025,12 +3277,12 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "piper" -version = "0.2.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" +checksum = "ae1d5c74c9876f070d3e8fd503d748c7d974c3e48da8f41350fa5222ef9b4391" dependencies = [ "atomic-waker", - "fastrand 2.0.1", + "fastrand 2.1.0", "futures-io", ] @@ -3042,9 +3294,9 @@ checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "png" -version = "0.17.12" +version = "0.17.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c2378060fb13acff3ba0325b83442c1d2c44fbb76df481160ddc1687cce160" +checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1" dependencies = [ "bitflags 1.3.2", "crc32fast", @@ -3071,23 +3323,27 @@ dependencies = [ [[package]] name = "polling" -version = "3.4.0" +version = "3.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30054e72317ab98eddd8561db0f6524df3367636884b7b21b703e4b280a84a14" +checksum = "a3ed00ed3fbf728b5816498ecd316d1716eecaced9c0c8d2c5a6740ca214985b" dependencies = [ "cfg-if", "concurrent-queue", + "hermit-abi 0.4.0", "pin-project-lite", - "rustix 0.38.31", + "rustix 0.38.34", "tracing", "windows-sys 0.52.0", ] [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "dee4364d9f3b902ef14fab8a1ddffb783a1cb6b4bba3bfc1fa3922732c7de97f" +dependencies = [ + "zerocopy 0.6.6", +] [[package]] name = "presser" @@ -3116,18 +3372,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.78" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] [[package]] name = "profiling" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f0f7f43585c34e4fdd7497d746bc32e14458cf11c69341cc0587b1d825dde42" +checksum = "43d84d1d7a6ac92673717f9f6d1518374ef257669c24ebc5ac25d5033828be58" dependencies = [ "profiling-procmacros", ] @@ -3139,7 +3395,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8021cf59c8ec9c432cfc2526ac6b8aa508ecaf29cd415f271b8406c1b851c3fd" dependencies = [ "quote", - "syn 2.0.49", + "syn 2.0.72", ] [[package]] @@ -3159,22 +3415,28 @@ checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" [[package]] name = "quick-xml" -version = "0.31.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1004a344b30a54e2ee58d66a71b32d2db2feb0a31f9a2d302bf0536f15de2a33" +checksum = "6f24d770aeca0eacb81ac29dfbc55ebcc09312fdd1f8bbecdc7e4a84e000e3b4" dependencies = [ "memchr", ] [[package]] name = "quote" -version = "1.0.35" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + [[package]] name = "rand" version = "0.8.5" @@ -3242,16 +3504,15 @@ dependencies = [ [[package]] name = "ravif" -version = "0.11.5" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc13288f5ab39e6d7c9d501759712e6969fcc9734220846fc9ed26cae2cc4234" +checksum = "5797d09f9bd33604689e87e8380df4951d4912f01b63f71205e2abd4ae25e6b6" dependencies = [ "avif-serialize", "imgref", "loop9", "quick-error", "rav1e", - "rayon", "rgb", ] @@ -3263,15 +3524,15 @@ checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" [[package]] name = "raw-window-handle" -version = "0.6.0" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42a9830a0e1b9fb145ebb365b8bc4ccd75f290f98c0247deafbbe2c75cefb544" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" [[package]] name = "rayon" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4963ed1bc86e4f3ee217022bd855b297cef07fb9eac5dfa1f788b220b49b3bd" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" dependencies = [ "either", "rayon-core", @@ -3305,11 +3566,20 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "redox_syscall" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" +dependencies = [ + "bitflags 2.6.0", +] + [[package]] name = "regex" -version = "1.10.4" +version = "1.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" +checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" dependencies = [ "aho-corasick", "memchr", @@ -3319,9 +3589,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.5" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", @@ -3330,21 +3600,21 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.2" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "renderdoc-sys" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "216080ab382b992234dda86873c18d4c48358f5cfcb70fd693d7f6f2131b628b" +checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" [[package]] name = "reqwest" -version = "0.12.3" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e6cc1e89e689536eb5aeede61520e874df5a4707df811cd5da4aa5fbb2aae19" +checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37" dependencies = [ "base64", "bytes", @@ -3357,6 +3627,7 @@ dependencies = [ "http-body", "http-body-util", "hyper", + "hyper-rustls", "hyper-tls", "hyper-util", "ipnet", @@ -3408,18 +3679,33 @@ dependencies = [ [[package]] name = "rgb" -version = "0.8.37" +version = "0.8.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05aaa8004b64fd573fc9d002f4e632d51ad4f026c2b5ba95fcb6c2f32c2c47d8" +checksum = "ade4539f42266ded9e755c605bdddf546242b2c961b03b06a7375260788a0523" dependencies = [ "bytemuck", ] +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom", + "libc", + "spin", + "untrusted", + "windows-sys 0.52.0", +] + [[package]] name = "rust-embed" -version = "8.3.0" +version = "8.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb78f46d0066053d16d4ca7b898e9343bc3530f71c61d5ad84cd404ada068745" +checksum = "fa66af4a4fdd5e7ebc276f115e895611a34739a9c1c01028383d612d550953c0" dependencies = [ "rust-embed-impl", "rust-embed-utils", @@ -3428,22 +3714,22 @@ dependencies = [ [[package]] name = "rust-embed-impl" -version = "8.3.0" +version = "8.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91ac2a3c6c0520a3fb3dd89321177c3c692937c4eb21893378219da10c44fc8" +checksum = "6125dbc8867951125eec87294137f4e9c2c96566e61bf72c45095a7c77761478" dependencies = [ "proc-macro2", "quote", "rust-embed-utils", - "syn 2.0.49", + "syn 2.0.72", "walkdir", ] [[package]] name = "rust-embed-utils" -version = "8.3.0" +version = "8.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86f69089032567ffff4eada41c573fc43ff466c7db7c5688b2e7969584345581" +checksum = "2e5347777e9aacb56039b0e1f28785929a8a3b709e87482e7442c72e7c12529d" dependencies = [ "sha2", "walkdir", @@ -3451,9 +3737,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc-hash" @@ -3477,17 +3763,30 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.31" +version = "0.38.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.6.0", "errno", "libc", - "linux-raw-sys 0.4.13", + "linux-raw-sys 0.4.14", "windows-sys 0.52.0", ] +[[package]] +name = "rustls" +version = "0.23.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c58f8c84392efc0a126acce10fa59ff7b3d2ac06ab451a33f2741989b806b044" +dependencies = [ + "once_cell", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + [[package]] name = "rustls-pemfile" version = "2.1.2" @@ -3500,15 +3799,32 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.4.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecd36cc4259e3e4514335c4a138c6b43171a8d61d8f5c9348f9fc7529416f247" +checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" [[package]] -name = "ryu" +name = "rustls-webpki" +version = "0.102.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e6b52d4fda176fd835fdc55a835d4a89b8499cad995885a21149d5ad62f852e" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "same-file" @@ -3542,24 +3858,24 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "sctk-adwaita" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b2eaf3a5b264a521b988b2e73042e742df700c4f962cde845d1541adb46550" +checksum = "70b31447ca297092c5a9916fc3b955203157b37c19ca8edde4f52e9843e602c7" dependencies = [ "ab_glyph", "log", "memmap2", - "smithay-client-toolkit", + "smithay-client-toolkit 0.18.1", "tiny-skia", ] [[package]] name = "security-framework" -version = "2.10.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "770452e37cad93e0a50d5abc3990d2bc351c36d0328f86cefec2f2fb206eaef6" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "core-foundation", "core-foundation-sys", "libc", @@ -3568,9 +3884,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.10.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41f3cc463c0ef97e11c3461a9d3787412d30e8e7eb907c79180c4a57bf7c04ef" +checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" dependencies = [ "core-foundation-sys", "libc", @@ -3578,51 +3894,52 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.198" +version = "1.0.204" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9846a40c979031340571da2545a4e5b7c4163bdae79b301d5f86d03979451fcc" +checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.198" +version = "1.0.204" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88edab869b01783ba905e7d0153f9fc1a6505a96e4ad3018011eedb838566d9" +checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.72", ] [[package]] name = "serde_json" -version = "1.0.116" +version = "1.0.122" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" +checksum = "784b6203951c57ff748476b126ccb5e8e2959a5c19e5c617ab1956be3dbc68da" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] [[package]] name = "serde_repr" -version = "0.1.18" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b2e6b945e9d3df726b65d6ee24060aff8e3533d431f677a9695db04eff9dfdb" +checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.72", ] [[package]] name = "serde_spanned" -version = "0.6.5" +version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" dependencies = [ "serde", ] @@ -3663,9 +3980,9 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" dependencies = [ "libc", ] @@ -3705,9 +4022,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "smithay-client-toolkit" @@ -3715,41 +4032,66 @@ version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "922fd3eeab3bd820d76537ce8f582b1cf951eceb5475c28500c7457d9d17f53a" dependencies = [ - "bitflags 2.4.2", - "calloop", - "calloop-wayland-source", + "bitflags 2.6.0", + "calloop 0.12.4", + "calloop-wayland-source 0.2.0", + "cursor-icon", + "libc", + "log", + "memmap2", + "rustix 0.38.34", + "thiserror", + "wayland-backend", + "wayland-client", + "wayland-csd-frame", + "wayland-cursor", + "wayland-protocols 0.31.2", + "wayland-protocols-wlr 0.2.0", + "wayland-scanner", + "xkeysym", +] + +[[package]] +name = "smithay-client-toolkit" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" +dependencies = [ + "bitflags 2.6.0", + "calloop 0.13.0", + "calloop-wayland-source 0.3.0", "cursor-icon", "libc", "log", "memmap2", - "rustix 0.38.31", + "rustix 0.38.34", "thiserror", "wayland-backend", "wayland-client", "wayland-csd-frame", "wayland-cursor", - "wayland-protocols", - "wayland-protocols-wlr", + "wayland-protocols 0.32.3", + "wayland-protocols-wlr 0.3.3", "wayland-scanner", "xkeysym", ] [[package]] name = "smithay-clipboard" -version = "0.7.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb62b280ce5a5cba847669933a0948d00904cf83845c944eae96a4738cea1a6" +checksum = "cc8216eec463674a0e90f29e0ae41a4db573ec5b56b1c6c1c71615d249b6d846" dependencies = [ "libc", - "smithay-client-toolkit", + "smithay-client-toolkit 0.19.2", "wayland-backend", ] [[package]] name = "smol_str" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6845563ada680337a52d43bb0b29f396f2d911616f6573012645b9e3d048a49" +checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" dependencies = [ "serde", ] @@ -3766,9 +4108,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.6" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" dependencies = [ "libc", "windows-sys 0.52.0", @@ -3789,7 +4131,7 @@ version = "0.3.0+sdk-1.3.268.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.6.0", ] [[package]] @@ -3806,9 +4148,15 @@ checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" [[package]] name = "strsim" -version = "0.11.0" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "subtle" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" @@ -3823,9 +4171,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.49" +version = "2.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915aea9e586f80826ee59f8453c1101f9d1c4b3964cd2460185ee8e299ada496" +checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af" dependencies = [ "proc-macro2", "quote", @@ -3834,9 +4182,9 @@ dependencies = [ [[package]] name = "sync_wrapper" -version = "0.1.2" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" [[package]] name = "system-configuration" @@ -3861,32 +4209,38 @@ dependencies = [ [[package]] name = "system-deps" -version = "6.2.0" +version = "6.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2d580ff6a20c55dfb86be5f9c238f67835d0e81cbdea8bf5680e0897320331" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" dependencies = [ "cfg-expr", "heck", "pkg-config", - "toml 0.8.10", + "toml 0.8.19", "version-compare", ] +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "target-lexicon" -version = "0.12.13" +version = "0.12.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69758bda2e78f098e4ccb393021a0963bb3442eac05f135c30f61b7370bbafae" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tempfile" -version = "3.10.0" +version = "3.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a365e8cd18e44762ef95d87f284f4b5cd04107fec2ff3052bd6a3e6069669e67" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" dependencies = [ "cfg-if", - "fastrand 2.0.1", - "rustix 0.38.31", + "fastrand 2.1.0", + "rustix 0.38.34", "windows-sys 0.52.0", ] @@ -3901,22 +4255,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.57" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" +checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.57" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" +checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.72", ] [[package]] @@ -3957,9 +4311,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" dependencies = [ "tinyvec_macros", ] @@ -3972,18 +4326,17 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.37.0" +version = "1.39.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" +checksum = "daa4fb1bc778bd6f04cbfc4bb2d06a7396a8f299dc33ea1900cedaa316f467b1" dependencies = [ "backtrace", "bytes", "libc", "mio", - "num_cpus", "pin-project-lite", - "socket2 0.5.6", - "windows-sys 0.48.0", + "socket2 0.5.7", + "windows-sys 0.52.0", ] [[package]] @@ -3996,18 +4349,28 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-rustls" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +dependencies = [ + "rustls", + "rustls-pki-types", + "tokio", +] + [[package]] name = "tokio-util" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" dependencies = [ "bytes", "futures-core", "futures-sink", "pin-project-lite", "tokio", - "tracing", ] [[package]] @@ -4021,21 +4384,21 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.10" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a9aad4a3066010876e8dcf5a8a06e70a558751117a145c6ce2b82c2e2054290" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.6", + "toml_edit 0.22.20", ] [[package]] name = "toml_datetime" -version = "0.6.5" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" dependencies = [ "serde", ] @@ -4064,15 +4427,15 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.6" +version = "0.22.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c1b5fd4128cc8d3e0cb74d4ed9a9cc7c7284becd4df68f5f940e1ad123606f6" +checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" dependencies = [ "indexmap", "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.1", + "winnow 0.6.18", ] [[package]] @@ -4088,7 +4451,6 @@ dependencies = [ "tokio", "tower-layer", "tower-service", - "tracing", ] [[package]] @@ -4109,7 +4471,6 @@ version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -4123,7 +4484,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.72", ] [[package]] @@ -4143,9 +4504,9 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "ttf-parser" -version = "0.20.0" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6d21d96b4" +checksum = "8686b91785aff82828ed725225925b33b4fde44c4bb15876e5f7c832724c420a" [[package]] name = "type-map" @@ -4168,7 +4529,7 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" dependencies = [ - "memoffset 0.9.0", + "memoffset 0.9.1", "tempfile", "winapi", ] @@ -4196,9 +4557,9 @@ checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" dependencies = [ "tinyvec", ] @@ -4211,9 +4572,9 @@ checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" [[package]] name = "unicode-width" -version = "0.1.11" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" +checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" [[package]] name = "unicode-xid" @@ -4221,11 +4582,17 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + [[package]] name = "url" -version = "2.5.0" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" dependencies = [ "form_urlencoded", "idna", @@ -4234,9 +4601,9 @@ dependencies = [ [[package]] name = "utf8parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "v_frame" @@ -4257,27 +4624,27 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "version-compare" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "579a42fc0b8e0c63b76519a339be31bed574929511fa53c1a3acae26eb258f29" +checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "waker-fn" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690" +checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" [[package]] name = "walkdir" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" dependencies = [ "same-file", "winapi-util", @@ -4300,9 +4667,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1e124130aee3fb58c5bdd6b639a0509486b0338acaaae0c84a5124b0f588b7f" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -4310,24 +4677,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e7e1900c352b609c8488ad12639a311045f40a35491fb69ba8c12f758af70b" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.72", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.41" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877b9c3f61ceea0e56331985743b13f3d25c406a7098d45180fb5f09bc19ed97" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" dependencies = [ "cfg-if", "js-sys", @@ -4337,9 +4704,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b30af9e2d358182b5c7449424f017eba305ed32a7010509ede96cdc4696c46ed" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4347,32 +4714,32 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.72", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f186bd2dcf04330886ce82d6f33dd75a7bfcf69ecf5763b89fcde53b6ac9838" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" [[package]] name = "wayland-backend" -version = "0.3.3" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d50fa61ce90d76474c87f5fc002828d81b32677340112b4ef08079a9d459a40" +checksum = "f90e11ce2ca99c97b940ee83edbae9da2d56a08f9ea8158550fd77fa31722993" dependencies = [ "cc", "downcast-rs", - "rustix 0.38.31", + "rustix 0.38.34", "scoped-tls", "smallvec", "wayland-sys", @@ -4380,12 +4747,12 @@ dependencies = [ [[package]] name = "wayland-client" -version = "0.31.2" +version = "0.31.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82fb96ee935c2cea6668ccb470fb7771f6215d1691746c2d896b447a00ad3f1f" +checksum = "7e321577a0a165911bdcfb39cf029302479d7527b517ee58ab0f6ad09edf0943" dependencies = [ - "bitflags 2.4.2", - "rustix 0.38.31", + "bitflags 2.6.0", + "rustix 0.38.34", "wayland-backend", "wayland-scanner", ] @@ -4396,18 +4763,18 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.6.0", "cursor-icon", "wayland-backend", ] [[package]] name = "wayland-cursor" -version = "0.31.1" +version = "0.31.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71ce5fa868dd13d11a0d04c5e2e65726d0897be8de247c0c5a65886e283231ba" +checksum = "6ef9489a8df197ebf3a8ce8a7a7f0a2320035c3743f3c1bd0bdbccf07ce64f95" dependencies = [ - "rustix 0.38.31", + "rustix 0.38.34", "wayland-client", "xcursor", ] @@ -4418,7 +4785,19 @@ version = "0.31.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f81f365b8b4a97f422ac0e8737c438024b5951734506b0e1d775c73030561f4" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.6.0", + "wayland-backend", + "wayland-client", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62989625a776e827cc0f15d41444a3cea5205b963c3a25be48ae1b52d6b4daaa" +dependencies = [ + "bitflags 2.6.0", "wayland-backend", "wayland-client", "wayland-scanner", @@ -4430,10 +4809,10 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23803551115ff9ea9bce586860c5c5a971e360825a0309264102a9495a5ff479" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.6.0", "wayland-backend", "wayland-client", - "wayland-protocols", + "wayland-protocols 0.31.2", "wayland-scanner", ] @@ -4443,18 +4822,31 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad1f61b76b6c2d8742e10f9ba5c3737f6530b4c243132c2a2ccc8aa96fe25cd6" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.6.0", + "wayland-backend", + "wayland-client", + "wayland-protocols 0.31.2", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-wlr" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd993de54a40a40fbe5601d9f1fbcaef0aebcc5fda447d7dc8f6dcbaae4f8953" +dependencies = [ + "bitflags 2.6.0", "wayland-backend", "wayland-client", - "wayland-protocols", + "wayland-protocols 0.32.3", "wayland-scanner", ] [[package]] name = "wayland-scanner" -version = "0.31.1" +version = "0.31.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63b3a62929287001986fb58c789dce9b67604a397c15c611ad9f747300b6c283" +checksum = "d7b56f89937f1cf2ee1f1259cf2936a17a1f45d8f0aa1019fae6d470d304cfa6" dependencies = [ "proc-macro2", "quick-xml", @@ -4463,9 +4855,9 @@ dependencies = [ [[package]] name = "wayland-sys" -version = "0.31.1" +version = "0.31.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15a0c8eaff5216d07f226cb7a549159267f3467b289d9a2e52fd3ef5aae2b7af" +checksum = "43676fe2daf68754ecf1d72026e4e6c15483198b5d24e888b74d3f22f887a148" dependencies = [ "dlib", "log", @@ -4475,9 +4867,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.68" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96565907687f7aceb35bc5fc03770a8a0471d82e479f25832f54a0e3f4b28446" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" dependencies = [ "js-sys", "wasm-bindgen", @@ -4495,9 +4887,9 @@ dependencies = [ [[package]] name = "webbrowser" -version = "0.8.12" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b2391658b02c27719fc5a0a73d6e696285138e8b12fba9d4baa70451023c71" +checksum = "db67ae75a9405634f5882791678772c94ff5f16a66535aae186e26aa0841fc8b" dependencies = [ "core-foundation", "home", @@ -4518,9 +4910,9 @@ checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" [[package]] name = "wgpu" -version = "0.19.1" +version = "0.19.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bfe9a310dcf2e6b85f00c46059aaeaf4184caa8e29a1ecd4b7a704c3482332d" +checksum = "cbd7311dbd2abcfebaabf1841a2824ed7c8be443a0f29166e5d3c6a53a762c01" dependencies = [ "arrayvec", "cfg-if", @@ -4529,7 +4921,7 @@ dependencies = [ "log", "parking_lot", "profiling", - "raw-window-handle 0.6.0", + "raw-window-handle 0.6.2", "smallvec", "static_assertions", "wasm-bindgen", @@ -4542,13 +4934,13 @@ dependencies = [ [[package]] name = "wgpu-core" -version = "0.19.0" +version = "0.19.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b15e451d4060ada0d99a64df44e4d590213496da7c4f245572d51071e8e30ed" +checksum = "28b94525fc99ba9e5c9a9e24764f2bc29bad0911a7446c12f446a8277369bf3a" dependencies = [ "arrayvec", "bit-vec", - "bitflags 2.4.2", + "bitflags 2.6.0", "cfg_aliases", "codespan-reporting", "indexmap", @@ -4557,7 +4949,7 @@ dependencies = [ "once_cell", "parking_lot", "profiling", - "raw-window-handle 0.6.0", + "raw-window-handle 0.6.2", "rustc-hash", "smallvec", "thiserror", @@ -4568,14 +4960,14 @@ dependencies = [ [[package]] name = "wgpu-hal" -version = "0.19.1" +version = "0.19.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bb47856236bfafc0bc591a925eb036ac19cd987624a447ff353e7a7e7e6f72" +checksum = "bfabcfc55fd86611a855816326b2d54c3b2fd7972c27ce414291562650552703" dependencies = [ "android_system_properties", "arrayvec", "ash", - "bitflags 2.4.2", + "bitflags 2.6.0", "cfg_aliases", "core-graphics-types", "glow", @@ -4587,15 +4979,16 @@ dependencies = [ "js-sys", "khronos-egl", "libc", - "libloading 0.8.1", + "libloading 0.8.5", "log", "metal", "naga", + "ndk-sys", "objc", "once_cell", "parking_lot", "profiling", - "raw-window-handle 0.6.0", + "raw-window-handle 0.6.2", "renderdoc-sys", "rustc-hash", "smallvec", @@ -4608,20 +5001,20 @@ dependencies = [ [[package]] name = "wgpu-types" -version = "0.19.0" +version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "895fcbeb772bfb049eb80b2d6e47f6c9af235284e9703c96fc0218a42ffd5af2" +checksum = "b671ff9fb03f78b46ff176494ee1ebe7d603393f42664be55b64dc8d53969805" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.6.0", "js-sys", "web-sys", ] [[package]] name = "widestring" -version = "1.0.2" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "653f141f39ec16bba3c5abe400a0c60da7468261cc2cbf36805022876bc721a8" +checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" [[package]] name = "winapi" @@ -4641,11 +5034,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" dependencies = [ - "winapi", + "windows-sys 0.52.0", ] [[package]] @@ -4672,7 +5065,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" dependencies = [ "windows-core", - "windows-targets 0.52.0", + "windows-targets 0.52.6", ] [[package]] @@ -4681,7 +5074,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.6", ] [[package]] @@ -4730,7 +5123,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.6", ] [[package]] @@ -4765,17 +5158,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.0", - "windows_aarch64_msvc 0.52.0", - "windows_i686_gnu 0.52.0", - "windows_i686_msvc 0.52.0", - "windows_x86_64_gnu 0.52.0", - "windows_x86_64_gnullvm 0.52.0", - "windows_x86_64_msvc 0.52.0", + "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]] @@ -4792,9 +5186,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" @@ -4810,9 +5204,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" @@ -4828,9 +5222,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" +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" @@ -4846,9 +5246,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" @@ -4864,9 +5264,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" @@ -4882,9 +5282,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" @@ -4900,22 +5300,22 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winit" -version = "0.29.10" +version = "0.29.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c824f11941eeae66ec71111cc2674373c772f482b58939bb4066b642aa2ffcf" +checksum = "0d59ad965a635657faf09c8f062badd885748428933dad8e8bdd64064d92e5ca" dependencies = [ "ahash", "android-activity", "atomic-waker", - "bitflags 2.4.2", + "bitflags 2.6.0", "bytemuck", - "calloop", + "calloop 0.12.4", "cfg_aliases", "core-foundation", "core-graphics", @@ -4932,18 +5332,18 @@ dependencies = [ "orbclient", "percent-encoding", "raw-window-handle 0.5.2", - "raw-window-handle 0.6.0", + "raw-window-handle 0.6.2", "redox_syscall 0.3.5", - "rustix 0.38.31", + "rustix 0.38.34", "sctk-adwaita", - "smithay-client-toolkit", + "smithay-client-toolkit 0.18.1", "smol_str", "unicode-segmentation", "wasm-bindgen", "wasm-bindgen-futures", "wayland-backend", "wayland-client", - "wayland-protocols", + "wayland-protocols 0.31.2", "wayland-protocols-plasma", "web-sys", "web-time", @@ -4964,9 +5364,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.6.1" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d90f4e0f530c4c69f62b80d839e9ef3855edc9cba471a160c4d692deed62b401" +checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" dependencies = [ "memchr", ] @@ -4990,6 +5390,15 @@ dependencies = [ "toml 0.5.11", ] +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + [[package]] name = "x11-dl" version = "2.21.0" @@ -5003,39 +5412,39 @@ dependencies = [ [[package]] name = "x11rb" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8f25ead8c7e4cba123243a6367da5d3990e0d3affa708ea19dce96356bd9f1a" +checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" dependencies = [ "as-raw-xcb-connection", "gethostname", "libc", - "libloading 0.8.1", + "libloading 0.8.5", "once_cell", - "rustix 0.38.31", + "rustix 0.38.34", "x11rb-protocol", ] [[package]] name = "x11rb-protocol" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e63e71c4b8bd9ffec2c963173a4dc4cbde9ee96961d4fcb4429db9929b606c34" +checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" [[package]] name = "xcursor" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a0ccd7b4a5345edfcd0c3535718a4e9ff7798ffc536bb5b5a0e26ff84732911" +checksum = "d491ee231a51ae64a5b762114c3ac2104b967aadba1de45c86ca42cf051513b7" [[package]] name = "xdg-home" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21e5a325c3cb8398ad6cf859c1135b25dd29e186679cf2da7581d9679f63b38e" +checksum = "ca91dcf8f93db085f3a0a29358cd0b9d670915468f4290e8b85d118a34211ab8" dependencies = [ "libc", - "winapi", + "windows-sys 0.52.0", ] [[package]] @@ -5044,7 +5453,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.6.0", "dlib", "log", "once_cell", @@ -5053,21 +5462,21 @@ dependencies = [ [[package]] name = "xkeysym" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "054a8e68b76250b253f671d1268cb7f1ae089ec35e195b2efb2a4e9a836d0621" +checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" [[package]] name = "xml-rs" -version = "0.8.19" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcb9cbac069e033553e8bb871be2fbdffcab578eb25bd0f7c508cedc6dcd75a" +checksum = "791978798f0597cfc70478424c2b4fdc2b7a8024aaff78497ef00f24ef674193" [[package]] name = "zbus" -version = "3.15.0" +version = "3.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c45d06ae3b0f9ba1fb2671268b975557d8f5a84bb5ec6e43964f87e763d8bca8" +checksum = "675d170b632a6ad49804c8cf2105d7c31eddd3312555cffd4b740e08e97c25e6" dependencies = [ "async-broadcast", "async-executor", @@ -5106,9 +5515,9 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "3.15.0" +version = "3.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4a1ba45ed0ad344b85a2bb5a1fe9830aed23d67812ea39a586e7d0136439c7d" +checksum = "7131497b0f887e8061b430c530240063d33bf9455fa34438f388a245da69e0a5" dependencies = [ "proc-macro-crate 1.3.1", "proc-macro2", @@ -5120,9 +5529,9 @@ dependencies = [ [[package]] name = "zbus_names" -version = "2.6.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb80bb776dbda6e23d705cf0123c3b95df99c4ebeaec6c2599d4a5419902b4a9" +checksum = "437d738d3750bed6ca9b8d423ccc7a8eb284f6b1d6d4e225a0e4e6258d864c8d" dependencies = [ "serde", "static_assertions", @@ -5131,47 +5540,74 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.32" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "854e949ac82d619ee9a14c66a1b674ac730422372ccb759ce0c39cabcf2bf8e6" +dependencies = [ + "byteorder", + "zerocopy-derive 0.6.6", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "zerocopy-derive 0.7.35", +] + +[[package]] +name = "zerocopy-derive" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +checksum = "125139de3f6b9d625c39e2efdd73d41bdac468ccd556556440e322be0e1bbd91" dependencies = [ - "zerocopy-derive", + "proc-macro2", + "quote", + "syn 2.0.72", ] [[package]] name = "zerocopy-derive" -version = "0.7.32" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.49", + "syn 2.0.72", ] +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + [[package]] name = "zstd" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d789b1514203a1120ad2429eae43a7bd32b90976a7bb8a05f7ec02fa88cc23a" +checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" -version = "7.1.0" +version = "7.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd99b45c6bc03a018c8b8a86025678c87e55526064e38f9df301989dce7ec0a" +checksum = "fa556e971e7b568dc775c136fc9de8c779b1c2fc3a63defaafadffdbd3181afa" dependencies = [ "zstd-sys", ] [[package]] name = "zstd-sys" -version = "2.0.11+zstd.1.5.6" +version = "2.0.12+zstd.1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75652c55c0b6f3e6f12eb786fe1bc960396bf05a1eb3bf1f3691c3610ac2e6d4" +checksum = "0a4e40c320c3cb459d9a9ff6de98cff88f4751ee9275d140e2be94a2b74e4c13" dependencies = [ "cc", "pkg-config", @@ -5194,18 +5630,18 @@ dependencies = [ [[package]] name = "zune-jpeg" -version = "0.4.11" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec866b44a2a1fd6133d363f073ca1b179f438f99e7e5bfb1e33f7181facfe448" +checksum = "16099418600b4d8f028622f73ff6e3deaabdff330fb9a2a131dea781ee8b0768" dependencies = [ "zune-core", ] [[package]] name = "zvariant" -version = "3.15.0" +version = "3.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44b291bee0d960c53170780af148dca5fa260a63cdd24f1962fa82e03e53338c" +checksum = "4eef2be88ba09b358d3b58aca6e41cd853631d44787f319a1383ca83424fb2db" dependencies = [ "byteorder", "enumflags2", @@ -5217,9 +5653,9 @@ dependencies = [ [[package]] name = "zvariant_derive" -version = "3.15.0" +version = "3.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "934d7a7dfc310d6ee06c87ffe88ef4eca7d3e37bb251dece2ef93da8f17d8ecd" +checksum = "37c24dc0bed72f5f90d1f8bb5b07228cbf63b3c6e9f82d82559d4bae666e7ed9" dependencies = [ "proc-macro-crate 1.3.1", "proc-macro2", diff --git a/Cargo.toml b/Cargo.toml index 065755b..616e1d0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,21 +1,14 @@ [package] name = "er-save-editor" -version = "0.0.22" +version = "0.1.0" edition = "2021" [dependencies] -aes = "0.8.4" -binary-reader = "0.4.5" -bitflags = "2.4.2" -cbc = "0.1.2" eframe = "0.26.2" egui-phosphor = { version = "0.4.0", features = ["regular", "fill"] } egui_extras = "0.26.2" -encoding_rs = "0.8.33" env_logger = "0.11.2" image = "0.25.0" -md5 = "0.7.0" -once_cell = "1.19.0" regex = "1.10.4" reqwest = { version = "0.12.3", features = ["json", "blocking"] } rfd = "0.13.0" @@ -23,7 +16,8 @@ rust-embed = "8.3.0" serde = { version = "1.0.198", features = ["derive"] } serde_json = "1.0.116" strsim = "0.11.0" -zstd = "0.13.1" +er-save-lib = {path = "../er-save-lib"} +chrono = "0.4.38" [build-dependencies] winres = "0.1.12" diff --git a/src/api/github.rs b/src/api/github.rs new file mode 100644 index 0000000..b301bd9 --- /dev/null +++ b/src/api/github.rs @@ -0,0 +1,20 @@ +use reqwest::blocking::Client; +use super::models::releases::Release; + + +pub struct GithubApi; + +impl GithubApi { + /// Fetch latest release data using github api + pub fn fetch_latest_release(user: &str, repo: &str) -> Result { + let url = &format!("https://api.github.com/repos/{user}/{repo}/releases/latest"); + let client = Client::new(); + let release = client + .get(url) + .header("User-Agent", "request") + .send()? + .json::()?; + + Ok(release) + } +} \ No newline at end of file diff --git a/src/api/mod.rs b/src/api/mod.rs new file mode 100644 index 0000000..123c56c --- /dev/null +++ b/src/api/mod.rs @@ -0,0 +1,2 @@ +pub mod github; +pub mod models; diff --git a/src/api/models/mod.rs b/src/api/models/mod.rs new file mode 100644 index 0000000..f13d911 --- /dev/null +++ b/src/api/models/mod.rs @@ -0,0 +1 @@ +pub mod releases; \ No newline at end of file diff --git a/src/api/models/releases.rs b/src/api/models/releases.rs new file mode 100644 index 0000000..37247d2 --- /dev/null +++ b/src/api/models/releases.rs @@ -0,0 +1,154 @@ +use serde::{Deserialize, Serialize}; +use serde_json::Value; + +#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct Release { + pub url: String, + #[serde(rename = "assets_url")] + pub assets_url: String, + #[serde(rename = "upload_url")] + pub upload_url: String, + #[serde(rename = "html_url")] + pub html_url: String, + pub id: i64, + pub author: Author, + #[serde(rename = "node_id")] + pub node_id: String, + #[serde(rename = "tag_name")] + pub tag_name: String, + #[serde(rename = "target_commitish")] + pub target_commitish: String, + pub name: String, + pub draft: bool, + pub prerelease: bool, + #[serde(rename = "created_at")] + pub created_at: String, + #[serde(rename = "published_at")] + pub published_at: String, + pub assets: Vec, + #[serde(rename = "tarball_url")] + pub tarball_url: String, + #[serde(rename = "zipball_url")] + pub zipball_url: String, + pub body: String, + pub reactions: Reactions, +} + +#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct Author { + pub login: String, + pub id: i64, + #[serde(rename = "node_id")] + pub node_id: String, + #[serde(rename = "avatar_url")] + pub avatar_url: String, + #[serde(rename = "gravatar_id")] + pub gravatar_id: String, + pub url: String, + #[serde(rename = "html_url")] + pub html_url: String, + #[serde(rename = "followers_url")] + pub followers_url: String, + #[serde(rename = "following_url")] + pub following_url: String, + #[serde(rename = "gists_url")] + pub gists_url: String, + #[serde(rename = "starred_url")] + pub starred_url: String, + #[serde(rename = "subscriptions_url")] + pub subscriptions_url: String, + #[serde(rename = "organizations_url")] + pub organizations_url: String, + #[serde(rename = "repos_url")] + pub repos_url: String, + #[serde(rename = "events_url")] + pub events_url: String, + #[serde(rename = "received_events_url")] + pub received_events_url: String, + #[serde(rename = "type")] + pub type_field: String, + #[serde(rename = "site_admin")] + pub site_admin: bool, +} + +#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct Asset { + pub url: String, + pub id: i64, + #[serde(rename = "node_id")] + pub node_id: String, + pub name: String, + pub label: Value, + pub uploader: Uploader, + #[serde(rename = "content_type")] + pub content_type: String, + pub state: String, + pub size: i64, + #[serde(rename = "download_count")] + pub download_count: i64, + #[serde(rename = "created_at")] + pub created_at: String, + #[serde(rename = "updated_at")] + pub updated_at: String, + #[serde(rename = "browser_download_url")] + pub browser_download_url: String, +} + +#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct Uploader { + pub login: String, + pub id: i64, + #[serde(rename = "node_id")] + pub node_id: String, + #[serde(rename = "avatar_url")] + pub avatar_url: String, + #[serde(rename = "gravatar_id")] + pub gravatar_id: String, + pub url: String, + #[serde(rename = "html_url")] + pub html_url: String, + #[serde(rename = "followers_url")] + pub followers_url: String, + #[serde(rename = "following_url")] + pub following_url: String, + #[serde(rename = "gists_url")] + pub gists_url: String, + #[serde(rename = "starred_url")] + pub starred_url: String, + #[serde(rename = "subscriptions_url")] + pub subscriptions_url: String, + #[serde(rename = "organizations_url")] + pub organizations_url: String, + #[serde(rename = "repos_url")] + pub repos_url: String, + #[serde(rename = "events_url")] + pub events_url: String, + #[serde(rename = "received_events_url")] + pub received_events_url: String, + #[serde(rename = "type")] + pub type_field: String, + #[serde(rename = "site_admin")] + pub site_admin: bool, +} + +#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct Reactions { + pub url: String, + #[serde(rename = "total_count")] + pub total_count: i64, + #[serde(rename = "+1")] + pub n1: i64, + #[serde(rename = "-1")] + pub n12: i64, + pub laugh: i64, + pub hooray: i64, + pub confused: i64, + pub heart: i64, + pub rocket: i64, + pub eyes: i64, +} diff --git a/src/db/bosses.rs b/src/db/bosses.rs index b5a4075..8992dde 100644 --- a/src/db/bosses.rs +++ b/src/db/bosses.rs @@ -1,413 +1,893 @@ -pub mod bosses { - use std::{collections::HashMap, sync::Mutex}; - use once_cell::sync::Lazy; - - #[derive(PartialEq, Eq, Hash, Clone, Copy, PartialOrd, Ord)] - pub enum Boss { - // Limgrave, - AlabasterLordEvergaol, - BeastmanofFaramAzulaGrovesideCave, - BellBearingHunterWarmastersShack, - BlackKnifeAssassinDeathtouchedCatacombs, - BloodhoundKnightDarriwilForlornHoundEvergaol, - CrucibleKnightStormhillEvergaol, - DeathbirdLimgrave, - DemiHumanChiefsCoastalCave, - ErdtreeBurialWatchdogStormfrontCatacombs, - FlyingDragonAgheelLimgrave, - GodricktheGrafted, - GraftedScionChapelofAnticipation, - GraveWardenDuelistMurkwaterCatacombs, - GuardianGolemHighroadCave, - MadPumpkinHeadWaypointRuins, - MargittheFellOmen, - NightsCavalryLimgrave, - PatchesMurkwaterCave, - SoldierofGodrick, - StonediggerTrollLimgraveTunnels, - TibiaMarinerSummonwaterVillage, - TreeSentinelLimgrave, - - // Weeping Weeping Peninsula - AncientHeroofZamorWeepingEvergaol, - CemeteryShadeTombswardCatacombs, - DeathbirdWeepingPeninsula, - EdtreeBurialWatchdogImpalersCatacombs, - ErdtreeAvatar, - LeonineMisbegottenMorneMoangrave, - MirandatheBlightedBloomTombswardCave, - NightsCavalryWeepingPeninsula, - RunebearEarthboreCave, - - // Liurnia of the Lakes - AdanThiefofFireMalefactorsEvergaol, - AlectoBlackKnifeRingleaderRingleadersEvergaol, - BellBearingHunterChurchofVows, - BlackKnifeAssassinBlackKnifeCatacombs, - BloodhoundKnightLakesideCrystalCave, - BolsCarianKnightCuckoosEvergaol, - CemeteryShadeBlackKnifeCatacombs, - RennalaQueenoftheFullMoon, - - // Caelid - CleanrotKnightStillwaterCave, - CommanderONeilSwampofAeonia, - CrucibleKnightMisbegottenWarriorRedmaneCastle, - CrystalianRayaLucariaCrystalTunnel, - CrystalianSpearCrystalianStaffAcademyCrystalCave, - DeathbirdLiurniaSouth, - DeathRiteBirdCaelid, - DeathRiteBirdLiurniaNorth, - DecayingEkzykesCaelid, - ElderDragonGreyollcanapparentlyspawninvisible, - ErdtreeAvatarLiurniaNortheast, - ErdtreeAvatarLiurniaSouthwest, - ErdtreeBurialWatchdogCliffbottomCatacombs, - ErdtreeBurialWatchdogsMinorErdtreeCatacombs, - FallingstarBeastSelliaCrystalTunnel, - FrenziedDuelistGaolCave, - GlintstoneDragonAdulaMoonlightAltar, - GlintstoneDragonSmaragLiurnia, - MadPumpkinHeadsCaelemRuins, - MagmaWyrmGaelTunnel, - MagmaWyrmMakarRuinStrewnPrecipice, - NightsCavalryCaelid, - NightsCavalryLiurniaNorth, - NightsCavalryLiurniaSouth, - NoxSwordstressandNoxPriestSelliaTownofSorcery, - OmenkillerVillageoftheAlbinaurics, - OnyxLordRoyalGraveEvergaol, - PutridAvatarCaelid, - RedWolfofRadagonRayaLucaria, - RoyalKnightLorettaCariaManor, - RoyalRevenantKingsrealmRuins, - SpiritcallerSnailRoadsEndCatacombs, - - // Dragonbarrow - _CleanrotKnightsStillwaterCave, // TODO:: Why is this not used? - BattlemageHuguesSelliaEvergaol, - BeastmenofFaramAzulaDragonbarrowCave, - BellBearingHunterIsolatedMerchantsShack, - BlackBladeKindredBestialSanctum, - FlyingDragonGreyllGreyollsDragonbarrow, - GodskinApostleDivineTowerofCaelid, - NightsCavalryDragonbarrow, - PutridAvatarDragonbarrow, - PutridCrystaliansSelliaHideaway, - - // Altus Plateau - AncientDragonLansseaxAltusPlateau, - AncientHeroofZamorSaintedHerosGrave, - BlackKnifeAssassinSagesCave, - BlackKnifeAssassinSaintedHerosGrave, - CrystalianSpearandCrystalianRingbladeAltusTunnel, - DemiHumanQueenGilikaLuxRuins, - ElemeroftheBriarTheShadedCastle, - ErdtreeBurialWatchdogWyndhamCatacombs, - FallingstarBeastAltusPlateau, - GodefroytheGraftedGoldenLineageEvergaol, - GodskinApostleDominulaWindmillVillage, - NecromancerGarrisSagesCave, - NightsCavalryAltusPlateau, - OmenkillerandMirandatheBlightedBloomPerfumersGrotto, - PerfumerTriciaandMisbegottenWarriorUnsightlyCatacombs, - SanguineNobleWrithebloodRuins, - StonediggerTrollOldAltusTunnel, - TibiaMarinerWyndhamRuins, - TreeSentinelsAltusPlateau, - - // Capital Outskirts - BellBearingHunterHermitMerchantsShack, - CrucibleKnightCrucibleKnightOrdovisAurizaHeroGrave, - DeathbirdWarmastersShack, - DraconicTreeSentinelCapitalOutskirts, - FellTwinsDivineTowerofEastAltus, - GraveWardenDuelistAurizaSideTomb, - - // Leyendell, Royal Capital - GodfreyFirstEldenLordGoldenShade, - MohgtheOmenCathedraloftheForsaken, - MorgotttheOmenKing, - - // Mt. Gelmir - AbductorVirginsMtGelmir, - DemiHumanQueenMaggieHermitVillage, - DemiHumanQueenMargotVolanoCave, - FullGrownFallingstarBeastNinthMtGelmirCampsite, - GodDevouringSerpentRykardLordofBlasphemy, - GodskinNobleTempleofEiglay, - KindredofRotSeethewaterCave, - MagmaWyrmMtGelmir, - RedWolfoftheChampionGelmirHerosGrave, - UlceratedTreeSpiritMtGelmir, - - // Mountaintops of the Giants - AncientHeroofZamorGiantConquringHerosGrave, - BorealistheFreezingFogFreezingLake, - CommanderNiallCastleSol, - DeathRiteBirdMountaintopsoftheGiants, - ErdtreeAvatarMountaintopsoftheGiants, - FireGiant, - GodskinApostleandGodskinNobleSpiritcallerCaveSpiritcallerSnail, - UlceratedTreeSpiritGiantsMountaintopCatacombs, - VykeKnightoftheRoundtableLordContendersEvergaol, - - // Crumbling Farum Azula - DragonlordPlacidusax, - GodskinDuo, - MalekiththeBlackBlade, - - // Forbidden Lands - BlackBladeKindredForbiddenLands, - NightsCavalryForbiddenLands, - StrayMimicTearHiddenPathtotheHaligtree, - - // Consecrated Snowfields - AstelStarsofDarknessYeloughAnixTunnel, - DeathRiteBirdConsecratedSnowfield, - GreatWyrmTheodorixConsecratedSnowfield, - MisbegottenCrusaderCaveoftheForlorn, - NightsCavalryDuoConsecratedSnowfield, - PutridAvatar, - PutridGraveWardenDuelistConsecratedSnowfieldCatacombs, - - // Miquella's Haligtree - LorettaKnightoftheHaligtree, - MaleniaGoddessofRot, - - // Siofra River - AncestorSpiritSiofraRiverBank, - DragonkinSoldierSiofraRiverBank, - MohgLordofBlood, - - // Ainsel River - DragonkinSoldierofNokstellaAinselRiver, - - // Nokron Eternal City - MimicTearNokronEternalCity, - RegalAncestorSpiritAncestralWoods, - ValiantGargoylesSiofraAqueduct, - - // Deeproot Depths - CrucibleKnightSiluria, - FiasChampions, - LichdragonFortissax, - - // Lake of Rot - AstelNaturalbornoftheVoid, - DragonkinSoldierLakeofRot, - - // Leyendell, Ashen Capital - GodfreyFirstEldenLordHoarahLoux, - SirGideonOfnirtheAllKnowing, - - // Elden Throne - RadagonoftheGoldenOrderEldenBeast, +use std::{collections::HashMap, sync::OnceLock}; + +#[derive(PartialEq, Eq, Hash, Clone, Copy, PartialOrd, Ord)] +pub enum Boss { + // Limgrave + AlabasterLordEvergaol, + BeastmanofFaramAzulaGrovesideCave, + BellBearingHunterWarmastersShack, + BlackKnifeAssassinDeathtouchedCatacombs, + BloodhoundKnightDarriwilForlornHoundEvergaol, + CrucibleKnightStormhillEvergaol, + DeathbirdLimgrave, + DemiHumanChiefsCoastalCave, + ErdtreeBurialWatchdogStormfrontCatacombs, + FlyingDragonAgheelLimgrave, + GodricktheGrafted, + GraftedScionChapelofAnticipation, + GraveWardenDuelistMurkwaterCatacombs, + GuardianGolemHighroadCave, + MadPumpkinHeadWaypointRuins, + MargittheFellOmen, + NightsCavalryLimgrave, + PatchesMurkwaterCave, + SoldierofGodrick, + StonediggerTrollLimgraveTunnels, + TibiaMarinerSummonwaterVillage, + TreeSentinelLimgrave, + + // Weeping Weeping Peninsula + AncientHeroofZamorWeepingEvergaol, + CemeteryShadeTombswardCatacombs, + DeathbirdWeepingPeninsula, + EdtreeBurialWatchdogImpalersCatacombs, + ErdtreeAvatar, + LeonineMisbegottenMorneMoangrave, + MirandatheBlightedBloomTombswardCave, + NightsCavalryWeepingPeninsula, + RunebearEarthboreCave, + + // Liurnia of the Lakes + AdanThiefofFireMalefactorsEvergaol, + AlectoBlackKnifeRingleaderRingleadersEvergaol, + BellBearingHunterChurchofVows, + BlackKnifeAssassinBlackKnifeCatacombs, + BloodhoundKnightLakesideCrystalCave, + BolsCarianKnightCuckoosEvergaol, + CemeteryShadeBlackKnifeCatacombs, + RennalaQueenoftheFullMoon, + + // Caelid + CleanrotKnightStillwaterCave, + CommanderONeilSwampofAeonia, + CrucibleKnightMisbegottenWarriorRedmaneCastle, + CrystalianRayaLucariaCrystalTunnel, + CrystalianSpearCrystalianStaffAcademyCrystalCave, + DeathbirdLiurniaSouth, + DeathRiteBirdCaelid, + DeathRiteBirdLiurniaNorth, + DecayingEkzykesCaelid, + ElderDragonGreyollcanapparentlyspawninvisible, + ErdtreeAvatarLiurniaNortheast, + ErdtreeAvatarLiurniaSouthwest, + ErdtreeBurialWatchdogCliffbottomCatacombs, + ErdtreeBurialWatchdogsMinorErdtreeCatacombs, + FallingstarBeastSelliaCrystalTunnel, + FrenziedDuelistGaolCave, + GlintstoneDragonAdulaMoonlightAltar, + GlintstoneDragonSmaragLiurnia, + MadPumpkinHeadsCaelemRuins, + MagmaWyrmGaelTunnel, + MagmaWyrmMakarRuinStrewnPrecipice, + NightsCavalryCaelid, + NightsCavalryLiurniaNorth, + NightsCavalryLiurniaSouth, + NoxSwordstressandNoxPriestSelliaTownofSorcery, + OmenkillerVillageoftheAlbinaurics, + OnyxLordRoyalGraveEvergaol, + PutridAvatarCaelid, + RedWolfofRadagonRayaLucaria, + RoyalKnightLorettaCariaManor, + RoyalRevenantKingsrealmRuins, + SpiritcallerSnailRoadsEndCatacombs, + + // Dragonbarrow + _CleanrotKnightsStillwaterCave, // TODO:: Why is this not used? + BattlemageHuguesSelliaEvergaol, + BeastmenofFaramAzulaDragonbarrowCave, + BellBearingHunterIsolatedMerchantsShack, + BlackBladeKindredBestialSanctum, + FlyingDragonGreyllGreyollsDragonbarrow, + GodskinApostleDivineTowerofCaelid, + NightsCavalryDragonbarrow, + PutridAvatarDragonbarrow, + PutridCrystaliansSelliaHideaway, + + // Altus Plateau + AncientDragonLansseaxAltusPlateau, + AncientHeroofZamorSaintedHerosGrave, + BlackKnifeAssassinSagesCave, + BlackKnifeAssassinSaintedHerosGrave, + CrystalianSpearandCrystalianRingbladeAltusTunnel, + DemiHumanQueenGilikaLuxRuins, + ElemeroftheBriarTheShadedCastle, + ErdtreeBurialWatchdogWyndhamCatacombs, + FallingstarBeastAltusPlateau, + GodefroytheGraftedGoldenLineageEvergaol, + GodskinApostleDominulaWindmillVillage, + NecromancerGarrisSagesCave, + NightsCavalryAltusPlateau, + OmenkillerandMirandatheBlightedBloomPerfumersGrotto, + PerfumerTriciaandMisbegottenWarriorUnsightlyCatacombs, + SanguineNobleWrithebloodRuins, + StonediggerTrollOldAltusTunnel, + TibiaMarinerWyndhamRuins, + TreeSentinelsAltusPlateau, + + // Capital Outskirts + BellBearingHunterHermitMerchantsShack, + CrucibleKnightCrucibleKnightOrdovisAurizaHeroGrave, + DeathbirdWarmastersShack, + DraconicTreeSentinelCapitalOutskirts, + FellTwinsDivineTowerofEastAltus, + GraveWardenDuelistAurizaSideTomb, + + // Leyendell Royal Capital + GodfreyFirstEldenLordGoldenShade, + MohgtheOmenCathedraloftheForsaken, + MorgotttheOmenKing, + + // Mt. Gelmir + AbductorVirginsMtGelmir, + DemiHumanQueenMaggieHermitVillage, + DemiHumanQueenMargotVolanoCave, + FullGrownFallingstarBeastNinthMtGelmirCampsite, + GodDevouringSerpentRykardLordofBlasphemy, + GodskinNobleTempleofEiglay, + KindredofRotSeethewaterCave, + MagmaWyrmMtGelmir, + RedWolfoftheChampionGelmirHerosGrave, + UlceratedTreeSpiritMtGelmir, + + // Mountaintops of the Giants + AncientHeroofZamorGiantConquringHerosGrave, + BorealistheFreezingFogFreezingLake, + CommanderNiallCastleSol, + DeathRiteBirdMountaintopsoftheGiants, + ErdtreeAvatarMountaintopsoftheGiants, + FireGiant, + GodskinApostleandGodskinNobleSpiritcallerCaveSpiritcallerSnail, + UlceratedTreeSpiritGiantsMountaintopCatacombs, + VykeKnightoftheRoundtableLordContendersEvergaol, + + // Crumbling Farum Azula + DragonlordPlacidusax, + GodskinDuo, + MalekiththeBlackBlade, + + // Forbidden Lands + BlackBladeKindredForbiddenLands, + NightsCavalryForbiddenLands, + StrayMimicTearHiddenPathtotheHaligtree, + + // Consecrated Snowfields + AstelStarsofDarknessYeloughAnixTunnel, + DeathRiteBirdConsecratedSnowfield, + GreatWyrmTheodorixConsecratedSnowfield, + MisbegottenCrusaderCaveoftheForlorn, + NightsCavalryDuoConsecratedSnowfield, + PutridAvatar, + PutridGraveWardenDuelistConsecratedSnowfieldCatacombs, + + // Miquella's Haligtree + LorettaKnightoftheHaligtree, + MaleniaGoddessofRot, + + // Siofra River + AncestorSpiritSiofraRiverBank, + DragonkinSoldierSiofraRiverBank, + MohgLordofBlood, + + // Ainsel River + DragonkinSoldierofNokstellaAinselRiver, + + // Nokron Eternal City + MimicTearNokronEternalCity, + RegalAncestorSpiritAncestralWoods, + ValiantGargoylesSiofraAqueduct, + + // Deeproot Depths + CrucibleKnightSiluria, + FiasChampions, + LichdragonFortissax, + + // Lake of Rot + AstelNaturalbornoftheVoid, + DragonkinSoldierLakeofRot, + + // Leyendell Ashen Capital + GodfreyFirstEldenLordHoarahLoux, + SirGideonOfnirtheAllKnowing, + + // Elden Throne + RadagonoftheGoldenOrderEldenBeast, +} + +impl Boss { + pub fn bosses() -> &'static HashMap { + static BOSSES: OnceLock> = OnceLock::new(); + + BOSSES.get_or_init(|| { + HashMap::from([ + // Limgrave + ( + Boss::AlabasterLordEvergaol, + (1036500800, "Alabaster Lord (Evergaol)"), + ), + ( + Boss::BeastmanofFaramAzulaGrovesideCave, + (31030800, "Beastman of Faram Azula (Groveside Cave)"), + ), + ( + Boss::BellBearingHunterWarmastersShack, + (1042380850, "Bell Bearing Hunter (Warmaster's Shack)"), + ), + ( + Boss::BlackKnifeAssassinDeathtouchedCatacombs, + (30110800, "Black Knife Assassin (Deathtouched Catacombs)"), + ), + ( + Boss::BloodhoundKnightDarriwilForlornHoundEvergaol, + ( + 1044350800, + "Bloodhound Knight Darriwil (Forlorn Hound Evergaol)", + ), + ), + ( + Boss::CrucibleKnightStormhillEvergaol, + (1042370800, "Crucible Knight (Stormhill Evergaol)"), + ), + ( + Boss::DeathbirdLimgrave, + (1042380800, "Deathbird (Limgrave)"), + ), + ( + Boss::DemiHumanChiefsCoastalCave, + (31150800, "Demi-Human Chiefs (Coastal Cave)"), + ), + ( + Boss::ErdtreeBurialWatchdogStormfrontCatacombs, + (30020800, "Erdtree Burial Watchdog (Stormfront Catacombs)"), + ), + ( + Boss::FlyingDragonAgheelLimgrave, + (1043360800, "Flying Dragon Agheel (Limgrave)"), + ), + (Boss::GodricktheGrafted, (10000800, "Godrick the Grafted")), + ( + Boss::GraftedScionChapelofAnticipation, + (10010800, "Grafted Scion (Chapel of Anticipation)"), + ), + ( + Boss::GraveWardenDuelistMurkwaterCatacombs, + (30040800, "Grave Warden Duelist (Murkwater Catacombs)"), + ), + ( + Boss::GuardianGolemHighroadCave, + (31170800, "Guardian Golem (Highroad Cave)"), + ), + ( + Boss::MadPumpkinHeadWaypointRuins, + (1044360800, "Mad Pumpkin Head (Waypoint Ruins)"), + ), + (Boss::MargittheFellOmen, (10000850, "Margit the Fell Omen")), + ( + Boss::NightsCavalryLimgrave, + (1043370800, "Night's Cavalry (Limgrave)"), + ), + ( + Boss::PatchesMurkwaterCave, + (31000800, "Patches (Murkwater Cave)"), + ), + (Boss::SoldierofGodrick, (18000850, "Soldier of Godrick")), + ( + Boss::StonediggerTrollLimgraveTunnels, + (32010800, "Stonedigger Troll (Limgrave Tunnels)"), + ), + ( + Boss::TibiaMarinerSummonwaterVillage, + (1045390800, "Tibia Mariner (Summonwater Village)"), + ), + ( + Boss::TreeSentinelLimgrave, + (1042360800, "Tree Sentinel (Limgrave)"), + ), + // Weeping Weeping Peninsula + ( + Boss::AncientHeroofZamorWeepingEvergaol, + (1042330800, "Ancient Hero of Zamor (Weeping Evergaol)"), + ), + ( + Boss::CemeteryShadeTombswardCatacombs, + (30000800, "Cemetery Shade (Tombsward Catacombs)"), + ), + ( + Boss::DeathbirdWeepingPeninsula, + (1044320800, "Deathbird (Weeping Peninsula)"), + ), + ( + Boss::EdtreeBurialWatchdogImpalersCatacombs, + (30010800, "Edtree Burial Watchdog (Impaler's Catacombs)"), + ), + (Boss::ErdtreeAvatar, (1043330800, "Erdtree Avatar")), + ( + Boss::LeonineMisbegottenMorneMoangrave, + (1043300800, "Leonine Misbegotten (Morne Moangrave)"), + ), + ( + Boss::MirandatheBlightedBloomTombswardCave, + (31020800, "Miranda the Blighted Bloom (Tombsward Cave)"), + ), + ( + Boss::NightsCavalryWeepingPeninsula, + (1044320850, "Night's Cavalry (Weeping Peninsula)"), + ), + ( + Boss::RunebearEarthboreCave, + (31010800, "Runebear (Earthbore Cave)"), + ), + // Liurnia of the Lakes + ( + Boss::AdanThiefofFireMalefactorsEvergaol, + (1038410800, "Adan, Thief of Fire (Malefactor's Evergaol)"), + ), + ( + Boss::AlectoBlackKnifeRingleaderRingleadersEvergaol, + ( + 1033420800, + "Alecto, Black Knife Ringleader (Ringleader's Evergaol)", + ), + ), + ( + Boss::BellBearingHunterChurchofVows, + (1037460800, "Bell Bearing Hunter (Church of Vows)"), + ), + ( + Boss::BlackKnifeAssassinBlackKnifeCatacombs, + (30050850, "Black Knife Assassin (Black Knife Catacombs)"), + ), + ( + Boss::BloodhoundKnightLakesideCrystalCave, + (31050800, "Bloodhound Knight (Lakeside Crystal Cave)"), + ), + ( + Boss::BolsCarianKnightCuckoosEvergaol, + (1033450800, "Bols, Carian Knight (Cuckoo's Evergaol)"), + ), + ( + Boss::CemeteryShadeBlackKnifeCatacombs, + (30050800, "Cemetery Shade (Black Knife Catacombs)"), + ), + ( + Boss::CleanrotKnightStillwaterCave, + (31040800, "Cleanrot Knight (Stillwater Cave)"), + ), + ( + Boss::CrystalianRayaLucariaCrystalTunnel, + (32020800, "Crystalian (Raya Lucaria Crystal Tunnel)"), + ), + ( + Boss::CrystalianSpearCrystalianStaffAcademyCrystalCave, + ( + 31060800, + "Crystalian Spear Crystalian Staff (Academy Crystal Cave)", + ), + ), + ( + Boss::DeathbirdLiurniaSouth, + (1037420800, "Deathbird (Liurnia South)"), + ), + ( + Boss::DeathRiteBirdLiurniaNorth, + (1036450800, "Death Rite Bird (Liurnia North)"), + ), + ( + Boss::ErdtreeAvatarLiurniaNortheast, + (1038480800, "Erdtree Avatar (Liurnia Northeast)"), + ), + ( + Boss::ErdtreeAvatarLiurniaSouthwest, + (1033430800, "Erdtree Avatar (Liurnia Southwest)"), + ), + ( + Boss::ErdtreeBurialWatchdogCliffbottomCatacombs, + (30060800, "Erdtree Burial Watchdog (Cliffbottom Catacombs)"), + ), + ( + Boss::GlintstoneDragonAdulaMoonlightAltar, + (1034500800, "Glintstone Dragon Adula (Moonlight Altar)"), + ), + ( + Boss::GlintstoneDragonSmaragLiurnia, + (1034450800, "Glintstone Dragon Smarag (Liurnia)"), + ), + ( + Boss::NightsCavalryLiurniaNorth, + (1036480800, "Night's Cavalry (Liurnia North)"), + ), + ( + Boss::NightsCavalryLiurniaSouth, + (1039430800, "Night's Cavalry (Liurnia South)"), + ), + ( + Boss::OmenkillerVillageoftheAlbinaurics, + (1035420800, "Omenkiller (Village of the Albinaurics)"), + ), + ( + Boss::OnyxLordRoyalGraveEvergaol, + (1036500800, "Onyx Lord (Royal Grave Evergaol)"), + ), + ( + Boss::RoyalKnightLorettaCariaManor, + (1035500800, "Royal Knight Loretta (Caria Manor)"), + ), + ( + Boss::RoyalRevenantKingsrealmRuins, + (1034480800, "Royal Revenant (Kingsrealm Ruins)"), + ), + ( + Boss::SpiritcallerSnailRoadsEndCatacombs, + (30030800, "Spiritcaller Snail (Road's End Catacombs)"), + ), + // Academya of Raya Lucaria + ( + Boss::RennalaQueenoftheFullMoon, + (14000800, "Rennala, Queen of the Full Moon"), + ), + ( + Boss::RedWolfofRadagonRayaLucaria, + (14000850, "Red Wolf of Radagon (Raya Lucaria)"), + ), + // Ruin-Strewn Precipice + ( + Boss::MagmaWyrmMakarRuinStrewnPrecipice, + (39200800, "Magma Wyrm Makar (Ruin-Strewn Precipice)"), + ), + // Caelid + ( + Boss::CommanderONeilSwampofAeonia, + (1049380800, "Commander O'Neil (Swamp of Aeonia)"), + ), + ( + Boss::CrucibleKnightMisbegottenWarriorRedmaneCastle, + ( + 1051360800, + "Crucible Knight. Misbegotten Warrior (Redmane Castle) ", + ), + ), + ( + Boss::DeathRiteBirdCaelid, + (1049370850, "Death Rite Bird (Caelid)"), + ), + ( + Boss::DecayingEkzykesCaelid, + (1048370800, "Decaying Ekzykes (Caelid)"), + ), + ( + Boss::ElderDragonGreyollcanapparentlyspawninvisible, + (1050400800, "Elder Dragon Greyoll"), + ), + ( + Boss::ErdtreeBurialWatchdogsMinorErdtreeCatacombs, + ( + 30140800, + "Erdtree Burial Watchdogs (Minor Erdtree Catacombs)", + ), + ), + ( + Boss::FallingstarBeastSelliaCrystalTunnel, + (32080800, "Fallingstar Beast (Sellia Crystal Tunnel)"), + ), + ( + Boss::FrenziedDuelistGaolCave, + (31210800, "Frenzied Duelist (Gaol Cave)"), + ), + ( + Boss::MadPumpkinHeadsCaelemRuins, + (1048400800, "Mad Pumpkin Heads (Caelem Ruins)"), + ), + ( + Boss::MagmaWyrmGaelTunnel, + (32070800, "Magma Wyrm (Gael Tunnel)"), + ), + ( + Boss::NightsCavalryCaelid, + (1049370800, "Night's Cavalry (Caelid)"), + ), + ( + Boss::NoxSwordstressandNoxPriestSelliaTownofSorcery, + ( + 1049390800, + "Nox Swordstress and Nox Priest (Sellia, Town of Sorcery)", + ), + ), + ( + Boss::PutridAvatarCaelid, + (1047400800, "Putrid Avatar (Caelid)"), + ), + // Dragonbarrow + ( + Boss::BattlemageHuguesSelliaEvergaol, + (1049390850, "Battlemage Hugues (Sellia Evergaol)"), + ), + ( + Boss::BeastmenofFaramAzulaDragonbarrowCave, + (31100800, "Beastmen of Faram Azula (Dragonbarrow Cave)"), + ), + ( + Boss::BellBearingHunterIsolatedMerchantsShack, + ( + 1048410800, + "Bell Bearing Hunter (Isolated Merchant's Shack)", + ), + ), + ( + Boss::BlackBladeKindredBestialSanctum, + (1051430800, "Black Blade Kindred (Bestial Sanctum)"), + ), + ( + Boss::FlyingDragonGreyllGreyollsDragonbarrow, + (1052410800, "Flying Dragon Greyll (Greyoll's Dragonbarrow)"), + ), + ( + Boss::GodskinApostleDivineTowerofCaelid, + (34130800, "Godskin Apostle (Divine Tower of Caelid)"), + ), + ( + Boss::NightsCavalryDragonbarrow, + (1052410850, "Night's Cavalry (Dragonbarrow)"), + ), + ( + Boss::PutridAvatarDragonbarrow, + (1052560800, "Putrid Avatar (Dragonbarrow)"), + ), + ( + Boss::PutridCrystaliansSelliaHideaway, + (31110800, "Putrid Crystalians (Sellia Hideaway)"), + ), + // Altus Plateau + ( + Boss::AncientDragonLansseaxAltusPlateau, + (1041520800, "Ancient Dragon Lansseax (Altus Plateau)"), + ), + ( + Boss::AncientHeroofZamorSaintedHerosGrave, + (30080800, "Ancient Hero of Zamor (Sainted Hero's Grave)"), + ), + ( + Boss::BlackKnifeAssassinSagesCave, + (31190800, "Black Knife Assassin (Sage's Cave)"), + ), + ( + Boss::BlackKnifeAssassinSaintedHerosGrave, + (1040520800, "Black Knife Assassin (Sainted Hero's Grave)"), + ), + ( + Boss::CrystalianSpearandCrystalianRingbladeAltusTunnel, + ( + 32050800, + "Crystalian Spear and Crystalian Ringblade (Altus Tunnel)", + ), + ), + ( + Boss::DemiHumanQueenGilikaLuxRuins, + (1038510800, "Demi-Human Queen Gilika (Lux Ruins)"), + ), + ( + Boss::ElemeroftheBriarTheShadedCastle, + (1039540800, "Elemer of the Briar (The Shaded Castle)"), + ), + ( + Boss::ErdtreeBurialWatchdogWyndhamCatacombs, + (30070800, "Erdtree Burial Watchdog (Wyndham Catacombs)"), + ), + ( + Boss::FallingstarBeastAltusPlateau, + (1041500800, "Fallingstar Beast (Altus Plateau)"), + ), + ( + Boss::GodefroytheGraftedGoldenLineageEvergaol, + (1039500800, "Godefroy the Grafted (Golden Lineage Evergaol)"), + ), + ( + Boss::GodskinApostleDominulaWindmillVillage, + (1042550800, "Godskin Apostle (Dominula, Windmill Village)"), + ), + ( + Boss::NecromancerGarrisSagesCave, + (31190850, "Necromancer Garris (Sage's Cave)"), + ), + ( + Boss::NightsCavalryAltusPlateau, + (1039510800, "Night's Cavalry (Altus Plateau)"), + ), + ( + Boss::OmenkillerandMirandatheBlightedBloomPerfumersGrotto, + ( + 31180800, + "Omenkiller and Miranda the Blighted Bloom (Perfumer's Grotto)", + ), + ), + ( + Boss::PerfumerTriciaandMisbegottenWarriorUnsightlyCatacombs, + ( + 30120800, + "Perfumer Tricia and Misbegotten Warrior (Unsightly Catacombs)", + ), + ), + ( + Boss::SanguineNobleWrithebloodRuins, + (1040530800, "Sanguine Noble (Writheblood Ruins)"), + ), + ( + Boss::StonediggerTrollOldAltusTunnel, + (32040800, "Stonedigger Troll (Old Altus Tunnel)"), + ), + ( + Boss::TibiaMarinerWyndhamRuins, + (1038520800, "Tibia Mariner (Wyndham Ruins)"), + ), + ( + Boss::TreeSentinelsAltusPlateau, + (1041510800, "Tree Sentinels (Altus Plateau)"), + ), + // Capital Outskirts + ( + Boss::BellBearingHunterHermitMerchantsShack, + (1043530800, "Bell Bearing Hunter (Hermit Merchant's Shack)"), + ), + ( + Boss::CrucibleKnightCrucibleKnightOrdovisAurizaHeroGrave, + ( + 30100800, + "Crucible Knight, Crucible Knight Ordovis (Auriza Hero Grave)", + ), + ), + ( + Boss::DeathbirdWarmastersShack, + (1042380850, "Deathbird (Warmaster's Shack)"), + ), + ( + Boss::DraconicTreeSentinelCapitalOutskirts, + (1045520800, "Draconic Tree Sentinel (Capital Outskirts)"), + ), + ( + Boss::FellTwinsDivineTowerofEastAltus, + (34140850, "Fell Twins (Divine Tower of East Altus)"), + ), + ( + Boss::GraveWardenDuelistAurizaSideTomb, + (30130800, "Grave Warden Duelist (Auriza Side Tomb)"), + ), + // Leyendell, Royal Capital + ( + Boss::GodfreyFirstEldenLordGoldenShade, + (11000850, "Godfrey, First Elden Lord (Golden Shade)"), + ), + ( + Boss::MohgtheOmenCathedraloftheForsaken, + (35000800, "Mohg, the Omen (Cathedral of the Forsaken)"), + ), + ( + Boss::MorgotttheOmenKing, + (11000800, "Morgott, the Omen King"), + ), + // Mt. Gelmir + ( + Boss::AbductorVirginsMtGelmir, + (16000860, "Abductor Virgins (Mt. Gelmir)"), + ), + ( + Boss::DemiHumanQueenMaggieHermitVillage, + (1037530800, "Demi-Human Queen Maggie (Hermit Village)"), + ), + ( + Boss::DemiHumanQueenMargotVolanoCave, + (31090800, "Demi-Human Queen Margot (Volano Cave)"), + ), + ( + Boss::FullGrownFallingstarBeastNinthMtGelmirCampsite, + ( + 1036540800, + "Full-Grown Fallingstar Beast (Ninth Mt. Gelmir Campsite)", + ), + ), + ( + Boss::GodDevouringSerpentRykardLordofBlasphemy, + ( + 16000800, + "God-Devouring Serpent / Rykard, Lord of Blasphemy", + ), + ), + ( + Boss::GodskinNobleTempleofEiglay, + (16000850, "Godskin Noble (Temple of Eiglay)"), + ), + ( + Boss::KindredofRotSeethewaterCave, + (31070800, "Kindred of Rot (Seethewater Cave)"), + ), + ( + Boss::MagmaWyrmMtGelmir, + (1035530800, "Magma Wyrm (Mt. Gelmir)"), + ), + ( + Boss::RedWolfoftheChampionGelmirHerosGrave, + (30090800, "Red Wolf of the Champion (Gelmir Hero's Grave)"), + ), + ( + Boss::UlceratedTreeSpiritMtGelmir, + (1037540810, "Ulcerated Tree Spirit (Mt. Gelmir)"), + ), + //Mountaintops of the Giants + ( + Boss::AncientHeroofZamorGiantConquringHerosGrave, + ( + 30170800, + "Ancient Hero of Zamor (Giant-Conquring Hero's Grave)", + ), + ), + ( + Boss::BorealistheFreezingFogFreezingLake, + (1054560800, "Borealis the Freezing Fog (Freezing Lake)"), + ), + ( + Boss::CommanderNiallCastleSol, + (1051570800, "Commander Niall (Castle Sol)"), + ), + ( + Boss::DeathRiteBirdMountaintopsoftheGiants, + (1050570800, "Death Rite Bird (Mountaintops of the Giants)"), + ), + ( + Boss::ErdtreeAvatarMountaintopsoftheGiants, + (1050570800, "Erdtree Avatar (Mountaintops of the Giants)"), + ), + (Boss::FireGiant, (1052520800, "Fire Giant")), + ( + Boss::GodskinApostleandGodskinNobleSpiritcallerCaveSpiritcallerSnail, + ( + 31220800, + "Godskin Apostle and Godskin Noble (Spiritcaller Cave) Spiritcaller Snail", + ), + ), + ( + Boss::UlceratedTreeSpiritGiantsMountaintopCatacombs, + ( + 30180800, + "Ulcerated Tree Spirit (Giants' Mountaintop Catacombs)", + ), + ), + ( + Boss::VykeKnightoftheRoundtableLordContendersEvergaol, + ( + 1053560800, + "Vyke, Knight of the Roundtable (Lord Contender's Evergaol)", + ), + ), + // Crumbling Farum Azula + ( + Boss::DragonlordPlacidusax, + (13000830, "Dragonlord Placidusax"), + ), + (Boss::GodskinDuo, (13000850, "Godskin Duo")), + ( + Boss::MalekiththeBlackBlade, + (13000800, "Malekith, the Black Blade"), + ), + //Forbidden Lands + ( + Boss::BlackBladeKindredForbiddenLands, + (1049520800, "Black Blade Kindred (Forbidden Lands)"), + ), + ( + Boss::NightsCavalryForbiddenLands, + (1048510800, "Night's Cavalry (Forbidden Lands)"), + ), + ( + Boss::StrayMimicTearHiddenPathtotheHaligtree, + (30200800, "Stray Mimic Tear (Hidden Path to the Haligtree)"), + ), + // Consecrated Snowfields + ( + Boss::AstelStarsofDarknessYeloughAnixTunnel, + (32110800, "Astel, Stars of Darkness (Yelough Anix Tunnel)"), + ), + ( + Boss::DeathRiteBirdConsecratedSnowfield, + (1048570800, "Death Rite Bird (Consecrated Snowfield)"), + ), + ( + Boss::GreatWyrmTheodorixConsecratedSnowfield, + (1050560800, "Great Wyrm Theodorix (Consecrated Snowfield)"), + ), + ( + Boss::MisbegottenCrusaderCaveoftheForlorn, + (31120800, "Misbegotten Crusader (Cave of the Forlorn)"), + ), + ( + Boss::NightsCavalryDuoConsecratedSnowfield, + (1248550800, "Night's Cavalry Duo (Consecrated Snowfield)"), + ), + (Boss::PutridAvatar, (1050570850, "Putrid Avatar")), + ( + Boss::PutridGraveWardenDuelistConsecratedSnowfieldCatacombs, + ( + 30190800, + "Putrid Grave Warden Duelist (Consecrated Snowfield Catacombs)", + ), + ), + // Miquella's Haligtree + ( + Boss::LorettaKnightoftheHaligtree, + (15000850, "Loretta, Knight of the Haligtree"), + ), + ( + Boss::MaleniaGoddessofRot, + (15000800, "Malenia, Goddess of Rot"), + ), + // Siofra River + ( + Boss::AncestorSpiritSiofraRiverBank, + (12080800, "Ancestor Spirit (Siofra River Bank)"), + ), + ( + Boss::DragonkinSoldierSiofraRiverBank, + (12020830, "Dragonkin Soldier (Siofra River Bank)"), + ), + (Boss::MohgLordofBlood, (12050800, "Mohg, Lord of Blood")), + // Ainsel River + ( + Boss::DragonkinSoldierofNokstellaAinselRiver, + (12010800, "Dragonkin Soldier of Nokstella (Ainsel River)"), + ), + // Nokron Eternal City + ( + Boss::MimicTearNokronEternalCity, + (12020850, "Mimic Tear (Nokron, Eternal City)"), + ), + ( + Boss::RegalAncestorSpiritAncestralWoods, + (12090800, "Regal Ancestor Spirit (Ancestral Woods)"), + ), + ( + Boss::ValiantGargoylesSiofraAqueduct, + (12020800, "Valiant Gargoyles (Siofra Aqueduct)"), + ), + // Deeproot Depths + ( + Boss::CrucibleKnightSiluria, + (12030390, "Crucible Knight Siluria"), + ), + (Boss::FiasChampions, (12030800, "Fia's Champions")), + ( + Boss::LichdragonFortissax, + (12030850, "Lichdragon Fortissax"), + ), + // Lake of Rot + ( + Boss::AstelNaturalbornoftheVoid, + (12040800, "Astel, Naturalborn of the Void"), + ), + ( + Boss::DragonkinSoldierLakeofRot, + (12010850, "Dragonkin Soldier (Lake of Rot)"), + ), + // Leyendell, Ashen Capital + ( + Boss::GodfreyFirstEldenLordHoarahLoux, + (11050800, "Godfrey, First Elden Lord (Hoarah Loux)"), + ), + ( + Boss::SirGideonOfnirtheAllKnowing, + (11050850, "Sir Gideon Ofnir, the All-Knowing"), + ), + // Elden Throne + ( + Boss::RadagonoftheGoldenOrderEldenBeast, + (19000810, "Radagon of the Golden Order / Elden Beast"), + ), + ]) + }) } - pub static BOSSES: Lazy>> = Lazy::new(|| { - Mutex::new(HashMap::from([ - // Limgrave - (Boss::AlabasterLordEvergaol, (1036500800,"Alabaster Lord (Evergaol)")), - (Boss::BeastmanofFaramAzulaGrovesideCave, (31030800,"Beastman of Faram Azula (Groveside Cave)")), - (Boss::BellBearingHunterWarmastersShack, (1042380850,"Bell Bearing Hunter (Warmaster's Shack)")), - (Boss::BlackKnifeAssassinDeathtouchedCatacombs, (30110800,"Black Knife Assassin (Deathtouched Catacombs)")), - (Boss::BloodhoundKnightDarriwilForlornHoundEvergaol, (1044350800,"Bloodhound Knight Darriwil (Forlorn Hound Evergaol)")), - (Boss::CrucibleKnightStormhillEvergaol, (1042370800,"Crucible Knight (Stormhill Evergaol)")), - (Boss::DeathbirdLimgrave, (1042380800,"Deathbird (Limgrave)")), - (Boss::DemiHumanChiefsCoastalCave, (31150800,"Demi-Human Chiefs (Coastal Cave)")), - (Boss::ErdtreeBurialWatchdogStormfrontCatacombs, (30020800,"Erdtree Burial Watchdog (Stormfront Catacombs)")), - (Boss::FlyingDragonAgheelLimgrave, (1043360800,"Flying Dragon Agheel (Limgrave)")), - (Boss::GodricktheGrafted, (10000800,"Godrick the Grafted")), - (Boss::GraftedScionChapelofAnticipation, (10010800,"Grafted Scion (Chapel of Anticipation)")), - (Boss::GraveWardenDuelistMurkwaterCatacombs, (30040800,"Grave Warden Duelist (Murkwater Catacombs)")), - (Boss::GuardianGolemHighroadCave, (31170800,"Guardian Golem (Highroad Cave)")), - (Boss::MadPumpkinHeadWaypointRuins, (1044360800,"Mad Pumpkin Head (Waypoint Ruins)")), - (Boss::MargittheFellOmen, (10000850,"Margit the Fell Omen")), - (Boss::NightsCavalryLimgrave, (1043370800,"Night's Cavalry (Limgrave)")), - (Boss::PatchesMurkwaterCave, (31000800,"Patches (Murkwater Cave)")), - (Boss::SoldierofGodrick, (18000850,"Soldier of Godrick")), - (Boss::StonediggerTrollLimgraveTunnels, (32010800,"Stonedigger Troll (Limgrave Tunnels)")), - (Boss::TibiaMarinerSummonwaterVillage, (1045390800,"Tibia Mariner (Summonwater Village)")), - (Boss::TreeSentinelLimgrave, (1042360800,"Tree Sentinel (Limgrave)")), - - // Weeping Weeping Peninsula - (Boss::AncientHeroofZamorWeepingEvergaol, (1042330800,"Ancient Hero of Zamor (Weeping Evergaol)")), - (Boss::CemeteryShadeTombswardCatacombs, (30000800,"Cemetery Shade (Tombsward Catacombs)")), - (Boss::DeathbirdWeepingPeninsula, (1044320800,"Deathbird (Weeping Peninsula)")), - (Boss::EdtreeBurialWatchdogImpalersCatacombs, (30010800,"Edtree Burial Watchdog (Impaler's Catacombs)")), - (Boss::ErdtreeAvatar, (1043330800,"Erdtree Avatar")), - (Boss::LeonineMisbegottenMorneMoangrave, (1043300800,"Leonine Misbegotten (Morne Moangrave)")), - (Boss::MirandatheBlightedBloomTombswardCave, (31020800,"Miranda the Blighted Bloom (Tombsward Cave)")), - (Boss::NightsCavalryWeepingPeninsula, (1044320850,"Night's Cavalry (Weeping Peninsula)")), - (Boss::RunebearEarthboreCave, (31010800,"Runebear (Earthbore Cave)")), - - // Liurnia of the Lakes - (Boss::AdanThiefofFireMalefactorsEvergaol, (1038410800, "Adan, Thief of Fire (Malefactor's Evergaol)")), - (Boss::AlectoBlackKnifeRingleaderRingleadersEvergaol, (1033420800, "Alecto, Black Knife Ringleader (Ringleader's Evergaol)")), - (Boss::BellBearingHunterChurchofVows, (1037460800, "Bell Bearing Hunter (Church of Vows)")), - (Boss::BlackKnifeAssassinBlackKnifeCatacombs, (30050850, "Black Knife Assassin (Black Knife Catacombs)")), - (Boss::BloodhoundKnightLakesideCrystalCave, (31050800, "Bloodhound Knight (Lakeside Crystal Cave)")), - (Boss::BolsCarianKnightCuckoosEvergaol, (1033450800, "Bols, Carian Knight (Cuckoo's Evergaol)")), - (Boss::CemeteryShadeBlackKnifeCatacombs, (30050800,"Cemetery Shade (Black Knife Catacombs)")), - (Boss::CleanrotKnightStillwaterCave, (31040800,"Cleanrot Knight (Stillwater Cave)")), - (Boss::CrystalianRayaLucariaCrystalTunnel, (32020800,"Crystalian (Raya Lucaria Crystal Tunnel)")), - (Boss::CrystalianSpearCrystalianStaffAcademyCrystalCave, (31060800,"Crystalian Spear Crystalian Staff (Academy Crystal Cave)")), - (Boss::DeathbirdLiurniaSouth, (1037420800,"Deathbird (Liurnia South)")), - (Boss::DeathRiteBirdLiurniaNorth, (1036450800,"Death Rite Bird (Liurnia North)")), - (Boss::ErdtreeAvatarLiurniaNortheast, (1038480800,"Erdtree Avatar (Liurnia Northeast)")), - (Boss::ErdtreeAvatarLiurniaSouthwest, (1033430800,"Erdtree Avatar (Liurnia Southwest)")), - (Boss::ErdtreeBurialWatchdogCliffbottomCatacombs, (30060800,"Erdtree Burial Watchdog (Cliffbottom Catacombs)")), - (Boss::GlintstoneDragonAdulaMoonlightAltar, (1034500800,"Glintstone Dragon Adula (Moonlight Altar)")), - (Boss::GlintstoneDragonSmaragLiurnia, (1034450800,"Glintstone Dragon Smarag (Liurnia)")), - (Boss::NightsCavalryLiurniaNorth, (1036480800,"Night's Cavalry (Liurnia North)")), - (Boss::NightsCavalryLiurniaSouth, (1039430800,"Night's Cavalry (Liurnia South)")), - (Boss::OmenkillerVillageoftheAlbinaurics, (1035420800,"Omenkiller (Village of the Albinaurics)")), - (Boss::OnyxLordRoyalGraveEvergaol, (1036500800,"Onyx Lord (Royal Grave Evergaol)")), - (Boss::RoyalKnightLorettaCariaManor, (1035500800,"Royal Knight Loretta (Caria Manor)")), - (Boss::RoyalRevenantKingsrealmRuins, (1034480800,"Royal Revenant (Kingsrealm Ruins)")), - (Boss::SpiritcallerSnailRoadsEndCatacombs, (30030800,"Spiritcaller Snail (Road's End Catacombs)")), - - // Academya of Raya Lucaria - (Boss::RennalaQueenoftheFullMoon, (14000800,"Rennala, Queen of the Full Moon")), - (Boss::RedWolfofRadagonRayaLucaria, (14000850,"Red Wolf of Radagon (Raya Lucaria)")), - - // Ruin-Strewn Precipice - (Boss::MagmaWyrmMakarRuinStrewnPrecipice, (39200800,"Magma Wyrm Makar (Ruin-Strewn Precipice)")), - - // Caelid - (Boss::CommanderONeilSwampofAeonia, (1049380800,"Commander O'Neil (Swamp of Aeonia)")), - (Boss::CrucibleKnightMisbegottenWarriorRedmaneCastle, (1051360800,"Crucible Knight. Misbegotten Warrior (Redmane Castle) ")), - (Boss::DeathRiteBirdCaelid, (1049370850,"Death Rite Bird (Caelid)")), - (Boss::DecayingEkzykesCaelid, (1048370800,"Decaying Ekzykes (Caelid)")), - (Boss::ElderDragonGreyollcanapparentlyspawninvisible, (1050400800,"Elder Dragon Greyoll")), - (Boss::ErdtreeBurialWatchdogsMinorErdtreeCatacombs, (30140800,"Erdtree Burial Watchdogs (Minor Erdtree Catacombs)")), - (Boss::FallingstarBeastSelliaCrystalTunnel, (32080800,"Fallingstar Beast (Sellia Crystal Tunnel)")), - (Boss::FrenziedDuelistGaolCave, (31210800,"Frenzied Duelist (Gaol Cave)")), - (Boss::MadPumpkinHeadsCaelemRuins, (1048400800,"Mad Pumpkin Heads (Caelem Ruins)")), - (Boss::MagmaWyrmGaelTunnel, (32070800,"Magma Wyrm (Gael Tunnel)")), - (Boss::NightsCavalryCaelid, (1049370800,"Night's Cavalry (Caelid)")), - (Boss::NoxSwordstressandNoxPriestSelliaTownofSorcery, (1049390800,"Nox Swordstress and Nox Priest (Sellia, Town of Sorcery)")), - (Boss::PutridAvatarCaelid, (1047400800,"Putrid Avatar (Caelid)")), - - // Dragonbarrow - (Boss::BattlemageHuguesSelliaEvergaol, (1049390850, "Battlemage Hugues (Sellia Evergaol)")), - (Boss::BeastmenofFaramAzulaDragonbarrowCave, (31100800, "Beastmen of Faram Azula (Dragonbarrow Cave)")), - (Boss::BellBearingHunterIsolatedMerchantsShack, (1048410800, "Bell Bearing Hunter (Isolated Merchant's Shack)")), - (Boss::BlackBladeKindredBestialSanctum, (1051430800, "Black Blade Kindred (Bestial Sanctum)")), - (Boss::FlyingDragonGreyllGreyollsDragonbarrow, (1052410800, "Flying Dragon Greyll (Greyoll's Dragonbarrow)")), - (Boss::GodskinApostleDivineTowerofCaelid, (34130800, "Godskin Apostle (Divine Tower of Caelid)")), - (Boss::NightsCavalryDragonbarrow, (1052410850, "Night's Cavalry (Dragonbarrow)")), - (Boss::PutridAvatarDragonbarrow, (1052560800, "Putrid Avatar (Dragonbarrow)")), - (Boss::PutridCrystaliansSelliaHideaway, (31110800, "Putrid Crystalians (Sellia Hideaway)")), - - // Altus Plateau - (Boss::AncientDragonLansseaxAltusPlateau, (1041520800,"Ancient Dragon Lansseax (Altus Plateau)")), - (Boss::AncientHeroofZamorSaintedHerosGrave, (30080800,"Ancient Hero of Zamor (Sainted Hero's Grave)")), - (Boss::BlackKnifeAssassinSagesCave, (31190800,"Black Knife Assassin (Sage's Cave)")), - (Boss::BlackKnifeAssassinSaintedHerosGrave, (1040520800,"Black Knife Assassin (Sainted Hero's Grave)")), - (Boss::CrystalianSpearandCrystalianRingbladeAltusTunnel, (32050800,"Crystalian Spear and Crystalian Ringblade (Altus Tunnel)")), - (Boss::DemiHumanQueenGilikaLuxRuins, (1038510800,"Demi-Human Queen Gilika (Lux Ruins)")), - (Boss::ElemeroftheBriarTheShadedCastle, (1039540800,"Elemer of the Briar (The Shaded Castle)")), - (Boss::ErdtreeBurialWatchdogWyndhamCatacombs, (30070800,"Erdtree Burial Watchdog (Wyndham Catacombs)")), - (Boss::FallingstarBeastAltusPlateau, (1041500800,"Fallingstar Beast (Altus Plateau)")), - (Boss::GodefroytheGraftedGoldenLineageEvergaol, (1039500800,"Godefroy the Grafted (Golden Lineage Evergaol)")), - (Boss::GodskinApostleDominulaWindmillVillage, (1042550800,"Godskin Apostle (Dominula, Windmill Village)")), - (Boss::NecromancerGarrisSagesCave, (31190850,"Necromancer Garris (Sage's Cave)")), - (Boss::NightsCavalryAltusPlateau, (1039510800,"Night's Cavalry (Altus Plateau)")), - (Boss::OmenkillerandMirandatheBlightedBloomPerfumersGrotto, (31180800,"Omenkiller and Miranda the Blighted Bloom (Perfumer's Grotto)")), - (Boss::PerfumerTriciaandMisbegottenWarriorUnsightlyCatacombs, (30120800,"Perfumer Tricia and Misbegotten Warrior (Unsightly Catacombs)")), - (Boss::SanguineNobleWrithebloodRuins, (1040530800,"Sanguine Noble (Writheblood Ruins)")), - (Boss::StonediggerTrollOldAltusTunnel, (32040800,"Stonedigger Troll (Old Altus Tunnel)")), - (Boss::TibiaMarinerWyndhamRuins, (1038520800,"Tibia Mariner (Wyndham Ruins)")), - (Boss::TreeSentinelsAltusPlateau, (1041510800,"Tree Sentinels (Altus Plateau)")), - - // Capital Outskirts - (Boss::BellBearingHunterHermitMerchantsShack, (1043530800,"Bell Bearing Hunter (Hermit Merchant's Shack)")), - (Boss::CrucibleKnightCrucibleKnightOrdovisAurizaHeroGrave, (30100800,"Crucible Knight, Crucible Knight Ordovis (Auriza Hero Grave)")), - (Boss::DeathbirdWarmastersShack, (1042380850,"Deathbird (Warmaster's Shack)")), - (Boss::DraconicTreeSentinelCapitalOutskirts, (1045520800,"Draconic Tree Sentinel (Capital Outskirts)")), - (Boss::FellTwinsDivineTowerofEastAltus, (34140850,"Fell Twins (Divine Tower of East Altus)")), - (Boss::GraveWardenDuelistAurizaSideTomb, (30130800,"Grave Warden Duelist (Auriza Side Tomb)")), - - // Leyendell, Royal Capital - (Boss::GodfreyFirstEldenLordGoldenShade, (11000850,"Godfrey, First Elden Lord (Golden Shade)")), - (Boss::MohgtheOmenCathedraloftheForsaken, (35000800,"Mohg, the Omen (Cathedral of the Forsaken)")), - (Boss::MorgotttheOmenKing, (11000800,"Morgott, the Omen King")), - - // Mt. Gelmir - (Boss::AbductorVirginsMtGelmir, (16000860,"Abductor Virgins (Mt. Gelmir)")), - (Boss::DemiHumanQueenMaggieHermitVillage, (1037530800,"Demi-Human Queen Maggie (Hermit Village)")), - (Boss::DemiHumanQueenMargotVolanoCave, (31090800,"Demi-Human Queen Margot (Volano Cave)")), - (Boss::FullGrownFallingstarBeastNinthMtGelmirCampsite, (1036540800,"Full-Grown Fallingstar Beast (Ninth Mt. Gelmir Campsite)")), - (Boss::GodDevouringSerpentRykardLordofBlasphemy, (16000800,"God-Devouring Serpent / Rykard, Lord of Blasphemy")), - (Boss::GodskinNobleTempleofEiglay, (16000850,"Godskin Noble (Temple of Eiglay)")), - (Boss::KindredofRotSeethewaterCave, (31070800,"Kindred of Rot (Seethewater Cave)")), - (Boss::MagmaWyrmMtGelmir, (1035530800,"Magma Wyrm (Mt. Gelmir)")), - (Boss::RedWolfoftheChampionGelmirHerosGrave, (30090800,"Red Wolf of the Champion (Gelmir Hero's Grave)")), - (Boss::UlceratedTreeSpiritMtGelmir, (1037540810,"Ulcerated Tree Spirit (Mt. Gelmir)")), - - //Mountaintops of the Giants - (Boss::AncientHeroofZamorGiantConquringHerosGrave, (30170800,"Ancient Hero of Zamor (Giant-Conquring Hero's Grave)")), - (Boss::BorealistheFreezingFogFreezingLake, (1054560800,"Borealis the Freezing Fog (Freezing Lake)")), - (Boss::CommanderNiallCastleSol, (1051570800,"Commander Niall (Castle Sol)")), - (Boss::DeathRiteBirdMountaintopsoftheGiants, (1050570800,"Death Rite Bird (Mountaintops of the Giants)")), - (Boss::ErdtreeAvatarMountaintopsoftheGiants, (1050570800,"Erdtree Avatar (Mountaintops of the Giants)")), - (Boss::FireGiant, (1052520800,"Fire Giant")), - (Boss::GodskinApostleandGodskinNobleSpiritcallerCaveSpiritcallerSnail, (31220800,"Godskin Apostle and Godskin Noble (Spiritcaller Cave) Spiritcaller Snail")), - (Boss::UlceratedTreeSpiritGiantsMountaintopCatacombs, (30180800,"Ulcerated Tree Spirit (Giants' Mountaintop Catacombs)")), - (Boss::VykeKnightoftheRoundtableLordContendersEvergaol, (1053560800,"Vyke, Knight of the Roundtable (Lord Contender's Evergaol)")), - - // Crumbling Farum Azula - (Boss::DragonlordPlacidusax, (13000830,"Dragonlord Placidusax")), - (Boss::GodskinDuo, (13000850,"Godskin Duo")), - (Boss::MalekiththeBlackBlade, (13000800,"Malekith, the Black Blade")), - - //Forbidden Lands - (Boss::BlackBladeKindredForbiddenLands, (1049520800,"Black Blade Kindred (Forbidden Lands)")), - (Boss::NightsCavalryForbiddenLands, (1048510800,"Night's Cavalry (Forbidden Lands)")), - (Boss::StrayMimicTearHiddenPathtotheHaligtree, (30200800,"Stray Mimic Tear (Hidden Path to the Haligtree)")), - - // Consecrated Snowfields - (Boss::AstelStarsofDarknessYeloughAnixTunnel, (32110800,"Astel, Stars of Darkness (Yelough Anix Tunnel)")), - (Boss::DeathRiteBirdConsecratedSnowfield, (1048570800,"Death Rite Bird (Consecrated Snowfield)")), - (Boss::GreatWyrmTheodorixConsecratedSnowfield, (1050560800,"Great Wyrm Theodorix (Consecrated Snowfield)")), - (Boss::MisbegottenCrusaderCaveoftheForlorn, (31120800,"Misbegotten Crusader (Cave of the Forlorn)")), - (Boss::NightsCavalryDuoConsecratedSnowfield, (1248550800,"Night's Cavalry Duo (Consecrated Snowfield)")), - (Boss::PutridAvatar, (1050570850,"Putrid Avatar")), - (Boss::PutridGraveWardenDuelistConsecratedSnowfieldCatacombs, (30190800,"Putrid Grave Warden Duelist (Consecrated Snowfield Catacombs)")), - - // Miquella's Haligtree - (Boss::LorettaKnightoftheHaligtree, (15000850,"Loretta, Knight of the Haligtree")), - (Boss::MaleniaGoddessofRot, (15000800,"Malenia, Goddess of Rot")), - - // Siofra River - (Boss::AncestorSpiritSiofraRiverBank, (12080800,"Ancestor Spirit (Siofra River Bank)")), - (Boss::DragonkinSoldierSiofraRiverBank, (12020830,"Dragonkin Soldier (Siofra River Bank)")), - (Boss::MohgLordofBlood, (12050800,"Mohg, Lord of Blood")), - - // Ainsel River - (Boss::DragonkinSoldierofNokstellaAinselRiver, (12010800,"Dragonkin Soldier of Nokstella (Ainsel River)")), - - // Nokron Eternal City - (Boss::MimicTearNokronEternalCity, (12020850,"Mimic Tear (Nokron, Eternal City)")), - (Boss::RegalAncestorSpiritAncestralWoods, (12090800,"Regal Ancestor Spirit (Ancestral Woods)")), - (Boss::ValiantGargoylesSiofraAqueduct, (12020800,"Valiant Gargoyles (Siofra Aqueduct)")), - - // Deeproot Depths - (Boss::CrucibleKnightSiluria, (12030390,"Crucible Knight Siluria")), - (Boss::FiasChampions, (12030800,"Fia's Champions")), - (Boss::LichdragonFortissax, (12030850,"Lichdragon Fortissax")), - - // Lake of Rot - (Boss::AstelNaturalbornoftheVoid, (12040800,"Astel, Naturalborn of the Void")), - (Boss::DragonkinSoldierLakeofRot, (12010850,"Dragonkin Soldier (Lake of Rot)")), - - // Leyendell, Ashen Capital - (Boss::GodfreyFirstEldenLordHoarahLoux, (11050800,"Godfrey, First Elden Lord (Hoarah Loux)")), - (Boss::SirGideonOfnirtheAllKnowing, (11050850,"Sir Gideon Ofnir, the All-Knowing")), - - // Elden Throne - (Boss::RadagonoftheGoldenOrderEldenBeast, (19000810,"Radagon of the Golden Order / Elden Beast")), - ])) - }); -} \ No newline at end of file +} diff --git a/src/db/classes.rs b/src/db/classes.rs index 1307301..28c4688 100644 --- a/src/db/classes.rs +++ b/src/db/classes.rs @@ -1,77 +1,73 @@ -pub mod classes { - use std::{collections::HashMap, sync::Mutex}; - use once_cell::sync::Lazy; +use std::{collections::HashMap, sync::LazyLock}; - #[derive(PartialEq, Eq, Hash, Clone, Copy, PartialOrd, Ord)] - pub enum ArcheType { - Unknown = -1, - Vagabond = 0, - Warrior = 1, - Hero = 2, - Bandit = 3, - Astrologer = 4, - Prophet = 5, - Samurai = 7, - Prisoner = 8, - Confessor = 6, - Wretch = 9, - } +#[derive(PartialEq, Eq, Hash, Clone, Copy, PartialOrd, Ord, Default)] +pub enum ArcheType { + #[default] + Unknown = -1, + Vagabond = 0, + Warrior = 1, + Hero = 2, + Bandit = 3, + Astrologer = 4, + Prophet = 5, + Samurai = 7, + Prisoner = 8, + Confessor = 6, + Wretch = 9, +} - impl TryFrom for ArcheType { - type Error = (); - fn try_from(v: u8) -> Result { - match v { - x if x == ArcheType::Vagabond as u8 => Ok(ArcheType::Vagabond), - x if x == ArcheType::Warrior as u8 => Ok(ArcheType::Warrior), - x if x == ArcheType::Hero as u8 => Ok(ArcheType::Hero), - x if x == ArcheType::Bandit as u8 => Ok(ArcheType::Bandit), - x if x == ArcheType::Astrologer as u8 => Ok(ArcheType::Astrologer), - x if x == ArcheType::Prophet as u8 => Ok(ArcheType::Prophet), - x if x == ArcheType::Samurai as u8 => Ok(ArcheType::Samurai), - x if x == ArcheType::Prisoner as u8 => Ok(ArcheType::Prisoner), - x if x == ArcheType::Confessor as u8 => Ok(ArcheType::Confessor), - x if x == ArcheType::Wretch as u8 => Ok(ArcheType::Wretch), - _ => Err(()), - } +impl From for ArcheType { + fn from(value: u8) -> Self { + match value { + x if x == ArcheType::Vagabond as u8 => ArcheType::Vagabond, + x if x == ArcheType::Warrior as u8 => ArcheType::Warrior, + x if x == ArcheType::Hero as u8 => ArcheType::Hero, + x if x == ArcheType::Bandit as u8 => ArcheType::Bandit, + x if x == ArcheType::Astrologer as u8 => ArcheType::Astrologer, + x if x == ArcheType::Prophet as u8 => ArcheType::Prophet, + x if x == ArcheType::Samurai as u8 => ArcheType::Samurai, + x if x == ArcheType::Prisoner as u8 => ArcheType::Prisoner, + x if x == ArcheType::Confessor as u8 => ArcheType::Confessor, + x if x == ArcheType::Wretch as u8 => ArcheType::Wretch, + _ => ArcheType::Unknown, } } +} - impl ToString for ArcheType { - fn to_string(&self) -> String { - match self { - ArcheType::Unknown => "Unknown".to_string(), - ArcheType::Vagabond => "Vagabond".to_string(), - ArcheType::Warrior => "Warrior".to_string(), - ArcheType::Hero => "Hero".to_string(), - ArcheType::Bandit => "Bandit".to_string(), - ArcheType::Astrologer => "Astrologer".to_string(), - ArcheType::Prophet => "Prophet".to_string(), - ArcheType::Samurai => "Samurai".to_string(), - ArcheType::Prisoner => "Prisoner".to_string(), - ArcheType::Confessor => "Confessor".to_string(), - ArcheType::Wretch => "Wretch".to_string(), - } +impl ToString for ArcheType { + fn to_string(&self) -> String { + match self { + ArcheType::Unknown => "Unknown".to_string(), + ArcheType::Vagabond => "Vagabond".to_string(), + ArcheType::Warrior => "Warrior".to_string(), + ArcheType::Hero => "Hero".to_string(), + ArcheType::Bandit => "Bandit".to_string(), + ArcheType::Astrologer => "Astrologer".to_string(), + ArcheType::Prophet => "Prophet".to_string(), + ArcheType::Samurai => "Samurai".to_string(), + ArcheType::Prisoner => "Prisoner".to_string(), + ArcheType::Confessor => "Confessor".to_string(), + ArcheType::Wretch => "Wretch".to_string(), } } +} - pub struct Stats { - pub level: u32, - pub vigor: u32, - pub mind: u32, - pub endurance: u32, - pub strength: u32, - pub dexterity: u32, - pub intelligence: u32, - pub faith: u32, - pub arcane: u32, - } - +pub struct Stats { + pub vigor: u32, + pub mind: u32, + pub endurance: u32, + pub strength: u32, + pub dexterity: u32, + pub intelligence: u32, + pub faith: u32, + pub arcane: u32, +} - - pub static STARTER_CLASSES: Lazy>> = Lazy::new(|| { - Mutex::new(HashMap::from([ - (ArcheType::Vagabond, Stats{ - level: 9, +pub static STARTER_CLASSES: LazyLock> = LazyLock::new(|| { + HashMap::from([ + ( + ArcheType::Vagabond, + Stats { vigor: 15, mind: 10, endurance: 11, @@ -80,10 +76,11 @@ pub mod classes { intelligence: 9, faith: 9, arcane: 7, - }), - - (ArcheType::Warrior, Stats{ - level: 8, + }, + ), + ( + ArcheType::Warrior, + Stats { vigor: 11, mind: 12, endurance: 11, @@ -92,9 +89,11 @@ pub mod classes { intelligence: 10, faith: 8, arcane: 9, - }), - - (ArcheType::Hero, Stats{ + }, + ), + ( + ArcheType::Hero, + Stats { vigor: 14, mind: 9, endurance: 12, @@ -103,11 +102,11 @@ pub mod classes { intelligence: 7, faith: 8, arcane: 11, - level: 7, - }), - - (ArcheType::Bandit, Stats{ - level: 5, + }, + ), + ( + ArcheType::Bandit, + Stats { vigor: 10, mind: 11, endurance: 10, @@ -116,10 +115,11 @@ pub mod classes { intelligence: 9, faith: 8, arcane: 14, - }), - - (ArcheType::Astrologer, Stats{ - level: 6, + }, + ), + ( + ArcheType::Astrologer, + Stats { vigor: 9, mind: 15, endurance: 9, @@ -128,10 +128,11 @@ pub mod classes { intelligence: 16, faith: 7, arcane: 9, - }), - - (ArcheType::Prophet, Stats{ - level: 7, + }, + ), + ( + ArcheType::Prophet, + Stats { vigor: 10, mind: 14, endurance: 8, @@ -140,10 +141,11 @@ pub mod classes { intelligence: 7, faith: 16, arcane: 10, - }), - - (ArcheType::Samurai, Stats{ - level: 9, + }, + ), + ( + ArcheType::Samurai, + Stats { vigor: 12, mind: 11, endurance: 13, @@ -152,10 +154,11 @@ pub mod classes { intelligence: 9, faith: 8, arcane: 8, - }), - - (ArcheType::Prisoner, Stats{ - level: 9, + }, + ), + ( + ArcheType::Prisoner, + Stats { vigor: 11, mind: 12, endurance: 11, @@ -164,10 +167,11 @@ pub mod classes { intelligence: 14, faith: 6, arcane: 9, - }), - - (ArcheType::Confessor, Stats{ - level: 10, + }, + ), + ( + ArcheType::Confessor, + Stats { vigor: 10, mind: 13, endurance: 10, @@ -176,10 +180,11 @@ pub mod classes { intelligence: 9, faith: 14, arcane: 9, - }), - - (ArcheType::Wretch, Stats{ - level: 1, + }, + ), + ( + ArcheType::Wretch, + Stats { vigor: 10, mind: 10, endurance: 10, @@ -188,7 +193,7 @@ pub mod classes { intelligence: 10, faith: 10, arcane: 10, - }), - ])) - }); -} \ No newline at end of file + }, + ), + ]) +}); diff --git a/src/db/colosseums.rs b/src/db/colosseums.rs index 1c84e50..1520f10 100644 --- a/src/db/colosseums.rs +++ b/src/db/colosseums.rs @@ -1,18 +1,23 @@ -pub mod colosseums { - use std::{collections::HashMap, sync::Mutex}; - use once_cell::sync::Lazy; - - #[derive(PartialEq, Eq, Hash, Clone, Copy, PartialOrd, Ord)] - pub enum Colosseum { - Royal, - Caelid, - Limgrave +use std::{collections::HashMap, sync::OnceLock}; + +#[derive(PartialEq, Eq, Hash, Clone, Copy, PartialOrd, Ord)] +pub enum Colosseum { + Royal, + Caelid, + Limgrave, +} + +impl Colosseum { + #[rustfmt::skip] + pub fn colusseums() -> &'static HashMap { + static COLUSSEUMS: OnceLock> = OnceLock::new(); + + COLUSSEUMS.get_or_init(|| + HashMap::from([ + (Colosseum::Royal,(60370,"Royal Colosseum")), + (Colosseum::Caelid,(60350,"Caelid Colosseum")), + (Colosseum::Limgrave,(60360,"Limgrave Colosseum")), + ]) + ) } - pub static COLOSSEUMS: Lazy>> = Lazy::new(|| { - Mutex::new(HashMap::from([ - (Colosseum::Royal,(60370,"Royal Colosseum")), - (Colosseum::Caelid,(60350,"Caelid Colosseum")), - (Colosseum::Limgrave,(60360,"Limgrave Colosseum")), - ])) - }); -} \ No newline at end of file +} diff --git a/src/db/cookbooks.rs b/src/db/cookbooks.rs index 6da86bd..fc2f4a0 100644 --- a/src/db/cookbooks.rs +++ b/src/db/cookbooks.rs @@ -1,161 +1,165 @@ -pub mod books { - use std::{collections::HashMap, sync::Mutex}; - use once_cell::sync::Lazy; - - #[derive(PartialEq, Eq, Hash, Clone, Copy, PartialOrd, Ord)] - pub enum Cookbook { - // Missionary's Cookbook - MissionarysCookbook1, - MissionarysCookbook2, - MissionarysCookbook3, - MissionarysCookbook4, - MissionarysCookbook5, - MissionarysCookbook6, - MissionarysCookbook7, - - // Nomadic warrior's Cookbook - NomadicwarriorsCookbook1, - NomadicwarriorsCookbook2, - NomadicwarriorsCookbook3, - NomadicwarriorsCookbook4, - NomadicwarriorsCookbook5, - NomadicwarriorsCookbook6, - NomadicwarriorsCookbook7, - NomadicwarriorsCookbook8, - NomadicwarriorsCookbook9, - NomadicwarriorsCookbook10, - NomadicwarriorsCookbook11, - NomadicwarriorsCookbook12, - NomadicwarriorsCookbook13, - NomadicwarriorsCookbook14, - NomadicwarriorsCookbook15, - NomadicwarriorsCookbook16, - NomadicwarriorsCookbook17, - NomadicwarriorsCookbook18, - NomadicwarriorsCookbook19, - NomadicwarriorsCookbook20, - NomadicwarriorsCookbook21, - NomadicwarriorsCookbook22, - NomadicwarriorsCookbook23, - NomadicwarriorsCookbook24, - - // Armorer's Cookbook - ArmorersCookbook1, - ArmorersCookbook2, - ArmorersCookbook3, - ArmorersCookbook4, - ArmorersCookbook5, - ArmorersCookbook6, - ArmorersCookbook7, - - // Ancient Dragon Apostle's Cookbook - AncientDragonApostlesCookbook1, - AncientDragonApostlesCookbook2, - AncientDragonApostlesCookbook3, - AncientDragonApostlesCookbook4, +use std::{collections::HashMap, sync::OnceLock}; - // Fevor's Cookbook - FevorsCookbook1, - FevorsCookbook2, - FevorsCookbook3, +#[derive(PartialEq, Eq, Hash, Clone, Copy, PartialOrd, Ord)] +pub enum Cookbook { + // Missionary's Cookbook + MissionarysCookbook1, + MissionarysCookbook2, + MissionarysCookbook3, + MissionarysCookbook4, + MissionarysCookbook5, + MissionarysCookbook6, + MissionarysCookbook7, - // Perfumer's Cookbook - PerfumersCookbook1, - PerfumersCookbook2, - PerfumersCookbook3, - PerfumersCookbook4, + // Nomadic warrior's Cookbook + NomadicwarriorsCookbook1, + NomadicwarriorsCookbook2, + NomadicwarriorsCookbook3, + NomadicwarriorsCookbook4, + NomadicwarriorsCookbook5, + NomadicwarriorsCookbook6, + NomadicwarriorsCookbook7, + NomadicwarriorsCookbook8, + NomadicwarriorsCookbook9, + NomadicwarriorsCookbook10, + NomadicwarriorsCookbook11, + NomadicwarriorsCookbook12, + NomadicwarriorsCookbook13, + NomadicwarriorsCookbook14, + NomadicwarriorsCookbook15, + NomadicwarriorsCookbook16, + NomadicwarriorsCookbook17, + NomadicwarriorsCookbook18, + NomadicwarriorsCookbook19, + NomadicwarriorsCookbook20, + NomadicwarriorsCookbook21, + NomadicwarriorsCookbook22, + NomadicwarriorsCookbook23, + NomadicwarriorsCookbook24, - // Glintstone Craftman's Cookbook - GlintstoneCraftmansCookbook1, - GlintstoneCraftmansCookbook2, - GlintstoneCraftmansCookbook3, - GlintstoneCraftmansCookbook4, - GlintstoneCraftmansCookbook5, - GlintstoneCraftmansCookbook6, - GlintstoneCraftmansCookbook7, - GlintstoneCraftmansCookbook8, + // Armorer's Cookbook + ArmorersCookbook1, + ArmorersCookbook2, + ArmorersCookbook3, + ArmorersCookbook4, + ArmorersCookbook5, + ArmorersCookbook6, + ArmorersCookbook7, - // Frenzied's Cookbook - FrenziedsCookbook1, - FrenziedsCookbook2, - } - - pub static COOKBOKS: Lazy>> = Lazy::new(|| { - Mutex::new(HashMap::from([ - // Missionary's Cookbook - (Cookbook::MissionarysCookbook1,(67610,"Missionary's Cookbook[1]")), - (Cookbook::MissionarysCookbook2,(67600,"Missionary's Cookbook[2]")), - (Cookbook::MissionarysCookbook3,(67650,"Missionary's Cookbook[3]")), - (Cookbook::MissionarysCookbook4,(67640,"Missionary's Cookbook[4]")), - (Cookbook::MissionarysCookbook5,(67630,"Missionary's Cookbook[5]")), - (Cookbook::MissionarysCookbook6,(67130,"Missionary's Cookbook[6]")), - (Cookbook::MissionarysCookbook7,(68230,"Missionary's Cookbook[7]")), + // Ancient Dragon Apostle's Cookbook + AncientDragonApostlesCookbook1, + AncientDragonApostlesCookbook2, + AncientDragonApostlesCookbook3, + AncientDragonApostlesCookbook4, - // Nomadic warrior's Cookbook - (Cookbook::NomadicwarriorsCookbook1,(67000,"Nomadic warrior's Cookbook[1]")), - (Cookbook::NomadicwarriorsCookbook2,(67110,"Nomadic warrior's Cookbook[2]")), - (Cookbook::NomadicwarriorsCookbook3,(67010,"Nomadic warrior's Cookbook[3]")), - (Cookbook::NomadicwarriorsCookbook4,(67800,"Nomadic warrior's Cookbook[4]")), - (Cookbook::NomadicwarriorsCookbook5,(67830,"Nomadic warrior's Cookbook[5]")), - (Cookbook::NomadicwarriorsCookbook6,(67020,"Nomadic warrior's Cookbook[6]")), - (Cookbook::NomadicwarriorsCookbook7,(67050,"Nomadic warrior's Cookbook[7]")), - (Cookbook::NomadicwarriorsCookbook8,(67880,"Nomadic warrior's Cookbook[8]")), - (Cookbook::NomadicwarriorsCookbook9,(67430,"Nomadic warrior's Cookbook[9]")), - (Cookbook::NomadicwarriorsCookbook10,(67030,"Nomadic warrior's Cookbook1[0]")), - (Cookbook::NomadicwarriorsCookbook11,(67220,"Nomadic warrior's Cookbook1[1]")), - (Cookbook::NomadicwarriorsCookbook12,(67060,"Nomadic warrior's Cookbook1[2]")), - (Cookbook::NomadicwarriorsCookbook13,(67080,"Nomadic warrior's Cookbook1[3]")), - (Cookbook::NomadicwarriorsCookbook14,(67870,"Nomadic warrior's Cookbook1[4]")), - (Cookbook::NomadicwarriorsCookbook15,(67900,"Nomadic warrior's Cookbook1[5]")), - (Cookbook::NomadicwarriorsCookbook16,(67290,"Nomadic warrior's Cookbook1[6]")), - (Cookbook::NomadicwarriorsCookbook17,(67100,"Nomadic warrior's Cookbook1[7]")), - (Cookbook::NomadicwarriorsCookbook18,(67270,"Nomadic warrior's Cookbook1[8]")), - (Cookbook::NomadicwarriorsCookbook19,(67070,"Nomadic warrior's Cookbook1[9]")), - (Cookbook::NomadicwarriorsCookbook20,(67230,"Nomadic warrior's Cookbook2[0]")), - (Cookbook::NomadicwarriorsCookbook21,(67120,"Nomadic warrior's Cookbook2[1]")), - (Cookbook::NomadicwarriorsCookbook22,(67890,"Nomadic warrior's Cookbook2[2]")), - (Cookbook::NomadicwarriorsCookbook23,(67090,"Nomadic warrior's Cookbook2[3]")), - (Cookbook::NomadicwarriorsCookbook24,(67910,"Nomadic warrior's Cookbook2[4]")), + // Fevor's Cookbook + FevorsCookbook1, + FevorsCookbook2, + FevorsCookbook3, - // Armorer's Cookbook - (Cookbook::ArmorersCookbook1,(67200,"Armorer's Cookbook[1]")), - (Cookbook::ArmorersCookbook2,(67210,"Armorer's Cookbook[2]")), - (Cookbook::ArmorersCookbook3,(67280,"Armorer's Cookbook[3]")), - (Cookbook::ArmorersCookbook4,(67260,"Armorer's Cookbook[4]")), - (Cookbook::ArmorersCookbook5,(67310,"Armorer's Cookbook[5]")), - (Cookbook::ArmorersCookbook6,(67300,"Armorer's Cookbook[6]")), - (Cookbook::ArmorersCookbook7,(67250,"Armorer's Cookbook[7]")), + // Perfumer's Cookbook + PerfumersCookbook1, + PerfumersCookbook2, + PerfumersCookbook3, + PerfumersCookbook4, - // Ancient Dragon Apostle's Cookbook - (Cookbook::AncientDragonApostlesCookbook1,(68000,"Ancient Dragon Apostle's Cookbook[1]")), - (Cookbook::AncientDragonApostlesCookbook2,(68010,"Ancient Dragon Apostle's Cookbook[2]")), - (Cookbook::AncientDragonApostlesCookbook3,(68030,"Ancient Dragon Apostle's Cookbook[3]")), - (Cookbook::AncientDragonApostlesCookbook4,(68020,"Ancient Dragon Apostle's Cookbook[4]")), + // Glintstone Craftman's Cookbook + GlintstoneCraftmansCookbook1, + GlintstoneCraftmansCookbook2, + GlintstoneCraftmansCookbook3, + GlintstoneCraftmansCookbook4, + GlintstoneCraftmansCookbook5, + GlintstoneCraftmansCookbook6, + GlintstoneCraftmansCookbook7, + GlintstoneCraftmansCookbook8, - // Fevor's Cookbook - (Cookbook::FevorsCookbook1,(68200,"Fevors Cookbook[1]")), - (Cookbook::FevorsCookbook2,(68220,"Fevors Cookbook[2]")), - (Cookbook::FevorsCookbook3,(68210,"Fevors Cookbook[3]")), + // Frenzied's Cookbook + FrenziedsCookbook1, + FrenziedsCookbook2, +} - // Perfumer's Cookbook - (Cookbook::PerfumersCookbook1,(67840,"Perfumer's Cookbook[1]")), - (Cookbook::PerfumersCookbook2,(67850,"Perfumer's Cookbook[2]")), - (Cookbook::PerfumersCookbook3,(67860,"Perfumer's Cookbook[3]")), - (Cookbook::PerfumersCookbook4,(67920,"Perfumer's Cookbook[4]")), +impl Cookbook { + #[rustfmt::skip] + pub fn cookbooks() -> &'static HashMap { + static COOKBOOKS: OnceLock> = OnceLock::new(); - // Glintstone Craftman's Cookbook - (Cookbook::GlintstoneCraftmansCookbook1,(67410,"Glintstone Craftman's Cookbook[1]")), - (Cookbook::GlintstoneCraftmansCookbook2,(67450,"Glintstone Craftman's Cookbook[2]")), - (Cookbook::GlintstoneCraftmansCookbook3,(67480,"Glintstone Craftman's Cookbook[3]")), - (Cookbook::GlintstoneCraftmansCookbook4,(67400,"Glintstone Craftman's Cookbook[4]")), - (Cookbook::GlintstoneCraftmansCookbook5,(67420,"Glintstone Craftman's Cookbook[5]")), - (Cookbook::GlintstoneCraftmansCookbook6,(67460,"Glintstone Craftman's Cookbook[6]")), - (Cookbook::GlintstoneCraftmansCookbook7,(67470,"Glintstone Craftman's Cookbook[7]")), - (Cookbook::GlintstoneCraftmansCookbook8,(67440,"Glintstone Craftman's Cookbook[8]")), - - // Frenzied's Cookbook - (Cookbook::FrenziedsCookbook1,(68400,"Frenzied's Cookbook[1]")), - (Cookbook::FrenziedsCookbook2,(68410,"Frenzied's Cookbook[2]")), - ])) - }); + COOKBOOKS.get_or_init(|| { + HashMap::from([ + // Missionary's Cookbook + (Cookbook::MissionarysCookbook1,(67610,"Missionary's Cookbook[1]")), + (Cookbook::MissionarysCookbook2,(67600,"Missionary's Cookbook[2]")), + (Cookbook::MissionarysCookbook3,(67650,"Missionary's Cookbook[3]")), + (Cookbook::MissionarysCookbook4,(67640,"Missionary's Cookbook[4]")), + (Cookbook::MissionarysCookbook5,(67630,"Missionary's Cookbook[5]")), + (Cookbook::MissionarysCookbook6,(67130,"Missionary's Cookbook[6]")), + (Cookbook::MissionarysCookbook7,(68230,"Missionary's Cookbook[7]")), + + // Nomadic warrior's Cookbook + (Cookbook::NomadicwarriorsCookbook1,(67000,"Nomadic warrior's Cookbook[1]")), + (Cookbook::NomadicwarriorsCookbook2,(67110,"Nomadic warrior's Cookbook[2]")), + (Cookbook::NomadicwarriorsCookbook3,(67010,"Nomadic warrior's Cookbook[3]")), + (Cookbook::NomadicwarriorsCookbook4,(67800,"Nomadic warrior's Cookbook[4]")), + (Cookbook::NomadicwarriorsCookbook5,(67830,"Nomadic warrior's Cookbook[5]")), + (Cookbook::NomadicwarriorsCookbook6,(67020,"Nomadic warrior's Cookbook[6]")), + (Cookbook::NomadicwarriorsCookbook7,(67050,"Nomadic warrior's Cookbook[7]")), + (Cookbook::NomadicwarriorsCookbook8,(67880,"Nomadic warrior's Cookbook[8]")), + (Cookbook::NomadicwarriorsCookbook9,(67430,"Nomadic warrior's Cookbook[9]")), + (Cookbook::NomadicwarriorsCookbook10,(67030,"Nomadic warrior's Cookbook1[0]")), + (Cookbook::NomadicwarriorsCookbook11,(67220,"Nomadic warrior's Cookbook1[1]")), + (Cookbook::NomadicwarriorsCookbook12,(67060,"Nomadic warrior's Cookbook1[2]")), + (Cookbook::NomadicwarriorsCookbook13,(67080,"Nomadic warrior's Cookbook1[3]")), + (Cookbook::NomadicwarriorsCookbook14,(67870,"Nomadic warrior's Cookbook1[4]")), + (Cookbook::NomadicwarriorsCookbook15,(67900,"Nomadic warrior's Cookbook1[5]")), + (Cookbook::NomadicwarriorsCookbook16,(67290,"Nomadic warrior's Cookbook1[6]")), + (Cookbook::NomadicwarriorsCookbook17,(67100,"Nomadic warrior's Cookbook1[7]")), + (Cookbook::NomadicwarriorsCookbook18,(67270,"Nomadic warrior's Cookbook1[8]")), + (Cookbook::NomadicwarriorsCookbook19,(67070,"Nomadic warrior's Cookbook1[9]")), + (Cookbook::NomadicwarriorsCookbook20,(67230,"Nomadic warrior's Cookbook2[0]")), + (Cookbook::NomadicwarriorsCookbook21,(67120,"Nomadic warrior's Cookbook2[1]")), + (Cookbook::NomadicwarriorsCookbook22,(67890,"Nomadic warrior's Cookbook2[2]")), + (Cookbook::NomadicwarriorsCookbook23,(67090,"Nomadic warrior's Cookbook2[3]")), + (Cookbook::NomadicwarriorsCookbook24,(67910,"Nomadic warrior's Cookbook2[4]")), + + // Armorer's Cookbook + (Cookbook::ArmorersCookbook1,(67200,"Armorer's Cookbook[1]")), + (Cookbook::ArmorersCookbook2,(67210,"Armorer's Cookbook[2]")), + (Cookbook::ArmorersCookbook3,(67280,"Armorer's Cookbook[3]")), + (Cookbook::ArmorersCookbook4,(67260,"Armorer's Cookbook[4]")), + (Cookbook::ArmorersCookbook5,(67310,"Armorer's Cookbook[5]")), + (Cookbook::ArmorersCookbook6,(67300,"Armorer's Cookbook[6]")), + (Cookbook::ArmorersCookbook7,(67250,"Armorer's Cookbook[7]")), + + // Ancient Dragon Apostle's Cookbook + (Cookbook::AncientDragonApostlesCookbook1,(68000,"Ancient Dragon Apostle's Cookbook[1]")), + (Cookbook::AncientDragonApostlesCookbook2,(68010,"Ancient Dragon Apostle's Cookbook[2]")), + (Cookbook::AncientDragonApostlesCookbook3,(68030,"Ancient Dragon Apostle's Cookbook[3]")), + (Cookbook::AncientDragonApostlesCookbook4,(68020,"Ancient Dragon Apostle's Cookbook[4]")), + + // Fevor's Cookbook + (Cookbook::FevorsCookbook1,(68200,"Fevors Cookbook[1]")), + (Cookbook::FevorsCookbook2,(68220,"Fevors Cookbook[2]")), + (Cookbook::FevorsCookbook3,(68210,"Fevors Cookbook[3]")), + + // Perfumer's Cookbook + (Cookbook::PerfumersCookbook1,(67840,"Perfumer's Cookbook[1]")), + (Cookbook::PerfumersCookbook2,(67850,"Perfumer's Cookbook[2]")), + (Cookbook::PerfumersCookbook3,(67860,"Perfumer's Cookbook[3]")), + (Cookbook::PerfumersCookbook4,(67920,"Perfumer's Cookbook[4]")), + + // Glintstone Craftman's Cookbook + (Cookbook::GlintstoneCraftmansCookbook1,(67410,"Glintstone Craftman's Cookbook[1]")), + (Cookbook::GlintstoneCraftmansCookbook2,(67450,"Glintstone Craftman's Cookbook[2]")), + (Cookbook::GlintstoneCraftmansCookbook3,(67480,"Glintstone Craftman's Cookbook[3]")), + (Cookbook::GlintstoneCraftmansCookbook4,(67400,"Glintstone Craftman's Cookbook[4]")), + (Cookbook::GlintstoneCraftmansCookbook5,(67420,"Glintstone Craftman's Cookbook[5]")), + (Cookbook::GlintstoneCraftmansCookbook6,(67460,"Glintstone Craftman's Cookbook[6]")), + (Cookbook::GlintstoneCraftmansCookbook7,(67470,"Glintstone Craftman's Cookbook[7]")), + (Cookbook::GlintstoneCraftmansCookbook8,(67440,"Glintstone Craftman's Cookbook[8]")), + + // Frenzied's Cookbook + (Cookbook::FrenziedsCookbook1,(68400,"Frenzied's Cookbook[1]")), + (Cookbook::FrenziedsCookbook2,(68410,"Frenzied's Cookbook[2]")), + ]) + }) + } } \ No newline at end of file diff --git a/src/db/graces.rs b/src/db/graces.rs index 01ad74e..7bb8ffe 100644 --- a/src/db/graces.rs +++ b/src/db/graces.rs @@ -1,7 +1,6 @@ pub mod maps { - use std::{collections::HashMap, sync::Mutex}; - use once_cell::sync::Lazy; - use crate::db::map_name::map_name::MapName; + use std::{collections::HashMap, sync::OnceLock}; + use crate::db::map_name::MapName; #[derive(PartialEq, Eq, Hash, Clone, Copy, PartialOrd, Ord)] pub enum Grace { @@ -391,394 +390,401 @@ pub mod maps { RootFacingCliffs, TheNamelessEternalCity, } - - pub static GRACES: Lazy>> = Lazy::new(|| { - Mutex::new(HashMap::from([ - // Table of Lost Grace / Roundtable Hold - (Grace::RoundtableHold, (MapName::RoundtableHold, 71190,"Table of Lost Grace / Roundtable Hold")), - - // Limgrave - (Grace::AgheelLakeNorth, (MapName::Limgrave, 76108,"Agheel Lake North")), - (Grace::AgheelLakeSouth, (MapName::Limgrave, 76106,"Agheel Lake South")), - (Grace::ChurchofDragonCommunion, (MapName::Limgrave, 76110,"Church of Dragon Communion")), - (Grace::ChurchofElleh, (MapName::Limgrave, 76100,"Church of Elleh")), - (Grace::CoastalCave, (MapName::Limgrave, 73115,"Coastal Cave")), - (Grace::FortHaightWest, (MapName::Limgrave, 76105,"Fort Haight West")), - (Grace::Gatefront, (MapName::Limgrave, 76111,"Gatefront")), - (Grace::GrovesideCave, (MapName::Limgrave, 73103,"Groveside Cave")), - (Grace::HighroadCave, (MapName::Limgrave, 73117,"Highroad Cave")), - (Grace::LimgraveArtistShack, (MapName::Limgrave, 76103,"Artist's Shack (Limgrave)")), - (Grace::LimgraveTunnels, (MapName::Limgrave, 73201,"Limgrave Tunnels")), - (Grace::MistwoodOutskirts, (MapName::Limgrave, 76114,"Mistwood Outskirts")), - (Grace::MurkwaterCatacombs, (MapName::Limgrave, 73004,"Murkwater Catacombs")), - (Grace::MurkwaterCave, (MapName::Limgrave, 73100,"Murkwater Cave")), - (Grace::MurkwaterCoast, (MapName::Limgrave, 76116,"Murkwater Coast")), - (Grace::SeasideRuins, (MapName::Limgrave, 76113,"Seaside Ruins")), - (Grace::StormfootCatacombs, (MapName::Limgrave, 73002,"Stormfoot Catacombs")), - (Grace::SummonwaterVillageOutskirts, (MapName::Limgrave, 76119,"Summonwater Village Outskirts")), - (Grace::TheFirstStep, (MapName::Limgrave, 76101,"The First Step")), - (Grace::ThirdChurchofMarika, (MapName::Limgrave, 76104,"Third Church of Marika")), - (Grace::WaypointRuinsCellar, (MapName::Limgrave, 76120,"Waypoint Ruins Cellar")), - - // Stranded Graveyard - (Grace::CaveofKnowledge, (MapName::StrandedGraveyard, 71800,"Cave of Knowledge")), - (Grace::StrandedGraveyard, (MapName::StrandedGraveyard, 71801,"Stranded Graveyard")), - - // Stormhill - (Grace::CastlewardTunnel, (MapName::Stormhill, 71002,"Castleward Tunnel")), - (Grace::DeathtouchedCatacombs, (MapName::Stormhill, 73011,"Deathtouched Catacombs")), - (Grace::DivineTowerofLimgrave, (MapName::Stormhill, 73412,"Divine Tower of Limgrave")), - (Grace::LimgraveTowerBridge, (MapName::Stormhill, 73410,"Limgrave Tower Bridge")), - (Grace::MargittheFellOmen, (MapName::Stormhill, 71001,"Margit, the Fell Omen")), - (Grace::Saintsbridge, (MapName::Stormhill, 76117,"Saintsbridge")), - (Grace::StormhillShack, (MapName::Stormhill, 76102,"Stormhill Shack")), - (Grace::WarmastersShack, (MapName::Stormhill, 76118,"Warmaster's Shack")), - - // Weeping Peninsula - (Grace::AilingVillageOutskirts, (MapName::WeepingPeninsula, 76154,"Ailing Village Outskirts")), - (Grace::BehindTheCastle, (MapName::WeepingPeninsula, 76159,"Behind The Castle")), - (Grace::BesidetheCraterPockedGlade, (MapName::WeepingPeninsula, 76155,"Beside the Crater-Pocked Glade")), - (Grace::BesidetheRampartGaol, (MapName::WeepingPeninsula, 76160,"Beside the Rampart Gaol")), - (Grace::BridgeofSacrifice, (MapName::WeepingPeninsula, 76157,"Bridge of Sacrifice")), - (Grace::CastleMorneLift, (MapName::WeepingPeninsula, 76158,"Castle Morne Lift")), - (Grace::CastleMorneRampart, (MapName::WeepingPeninsula, 76151,"Castle Morne Rampart")), - (Grace::ChurchofPilgrimage, (MapName::WeepingPeninsula, 76150,"Church of Pilgrimage")), - (Grace::EarthboreCave, (MapName::WeepingPeninsula, 73101,"Earthbore Cave")), - (Grace::FourthChurchofMarika, (MapName::WeepingPeninsula, 76162,"Fourth Church of Marika")), - (Grace::ImpalersCatacombs, (MapName::WeepingPeninsula, 73001,"Impaler's Catacombs")), - (Grace::LimgraveIsolatedMerchantsShack, (MapName::WeepingPeninsula, 76156,"Isolated Merchant's Shack (Limgrave)")), - (Grace::MorneMoangrave, (MapName::WeepingPeninsula, 76161,"Morne Moangrave")), - (Grace::MorneTunnel, (MapName::WeepingPeninsula, 73200,"Morne Tunnel")), - (Grace::SouthoftheLookoutTower, (MapName::WeepingPeninsula, 76153,"South of the Lookout Tower")), - (Grace::Tombsward, (MapName::WeepingPeninsula, 76152,"Tombsward")), - (Grace::TombswardCatacombs, (MapName::WeepingPeninsula, 73000,"Tombsward Catacombs")), - (Grace::TombswardCave, (MapName::WeepingPeninsula, 73102,"Tombsward Cave")), - - // Stormveil Castle - (Grace::GatesideChamber, (MapName::StormveilCastle, 71003,"Gateside Chamber")), - (Grace::GodricktheGrafted, (MapName::StormveilCastle, 71000,"Godrick the Grafted")), - (Grace::LiftsideChamber, (MapName::StormveilCastle, 71006,"Liftside Chamber")), - (Grace::RampartTower, (MapName::StormveilCastle, 71005,"Rampart Tower")), - (Grace::SecludedCell, (MapName::StormveilCastle, 71007,"Secluded Cell")), - (Grace::StormveilCliffside, (MapName::StormveilCastle, 71004,"Stormveil Cliffside")), - (Grace::StormveilMainGate, (MapName::StormveilCastle, 71008,"Stormveil Main Gate")), - - // Liurnia of the Lakes - (Grace::AcademyCrystalCave, (MapName::LiurniaOfTheLakes, 73106,"Academy Crystal Cave")), - (Grace::AcademyGateTown, (MapName::LiurniaOfTheLakes, 76204,"Academy Gate Town")), - (Grace::BehindCariaManor, (MapName::LiurniaOfTheLakes, 76238,"Behind Caria Manor")), - (Grace::BlackKnifeCatacombs, (MapName::LiurniaOfTheLakes, 73005,"Black Knife Catacombs")), - (Grace::BoilprawnShack, (MapName::LiurniaOfTheLakes, 76216,"Boilprawn Shack")), - (Grace::ChurchofVows, (MapName::LiurniaOfTheLakes, 76224,"Church of Vows")), - (Grace::CliffbottomCatacombs, (MapName::LiurniaOfTheLakes, 73006,"Cliffbottom Catacombs")), - (Grace::ConvertedTower, (MapName::LiurniaOfTheLakes, 76237,"Converted Tower")), - (Grace::CrystallineWoods, (MapName::LiurniaOfTheLakes, 76243,"Crystalline Woods")), - (Grace::DivineTowerofLiurnia, (MapName::LiurniaOfTheLakes, 73422,"Divine Tower of Liurnia")), - (Grace::EasternLiurniaLakeShore, (MapName::LiurniaOfTheLakes, 76223,"Eastern Liurnia Lake Shore")), - (Grace::EasternTableland, (MapName::LiurniaOfTheLakes, 76234,"Eastern Tableland")), - (Grace::EastGateBridgeTrestle, (MapName::LiurniaOfTheLakes, 76242,"East Gate Bridge Trestle")), - (Grace::FallenRuinsoftheLake, (MapName::LiurniaOfTheLakes, 76236,"Fallen Ruins of the Lake")), - (Grace::FollyontheLake, (MapName::LiurniaOfTheLakes, 76219,"Folly on the Lake")), - (Grace::FootoftheFourBelfries, (MapName::LiurniaOfTheLakes, 76210,"Foot of the Four Belfries")), - (Grace::GateTownBridge, (MapName::LiurniaOfTheLakes, 76222,"Gate Town Bridge")), - (Grace::GateTownNorth, (MapName::LiurniaOfTheLakes, 76233,"Gate Town North")), - (Grace::Jarburg, (MapName::LiurniaOfTheLakes, 76245,"Jarburg")), - (Grace::LakeFacingCliffs, (MapName::LiurniaOfTheLakes, 76200,"Lake-Facing Cliffs")), - (Grace::LakesideCrystalCave, (MapName::LiurniaOfTheLakes, 73105,"Lakeside Crystal Cave")), - (Grace::LaskyarRuins, (MapName::LiurniaOfTheLakes, 76202,"Laskyar Ruins")), - (Grace::LiurniaHighwayNorth, (MapName::LiurniaOfTheLakes, 76221,"Liurnia Highway North")), - (Grace::LiurniaHighwaySouth, (MapName::LiurniaOfTheLakes, 76244,"Liurnia Highway South")), - (Grace::LiurniaLakeShore, (MapName::LiurniaOfTheLakes, 76201,"Liurnia Lake Shore")), - (Grace::LiurniaoftheLakesArtistsShack, (MapName::LiurniaOfTheLakes, 76217,"Artist's Shack (Liurnia of the Lakes)")), - (Grace::LiurniaTowerBridge, (MapName::LiurniaOfTheLakes, 73421,"Liurnia Tower Bridge")), - (Grace::MainAcademyGate, (MapName::LiurniaOfTheLakes, 76206,"Main Academy Gate")), - (Grace::MainCariaManorGate, (MapName::LiurniaOfTheLakes, 76214,"Main Caria Manor Gate")), - (Grace::ManorLowerLevel, (MapName::LiurniaOfTheLakes, 76231,"Manor Lower Level")), - (Grace::ManorUpperLevel, (MapName::LiurniaOfTheLakes, 76230,"Manor Upper Level")), - (Grace::MausoleumCompound, (MapName::LiurniaOfTheLakes, 76226,"Mausoleum Compound")), - (Grace::NorthernLiurniaLakeShore, (MapName::LiurniaOfTheLakes, 76212,"Northern Liurnia Lake Shore")), - (Grace::RannisChamber, (MapName::LiurniaOfTheLakes, 76247,"Ranni's Chamber")), - (Grace::RannisRise, (MapName::LiurniaOfTheLakes, 76228,"Ranni's Rise")), - (Grace::RavineVeiledVillage, (MapName::LiurniaOfTheLakes, 76229,"Ravine-Veiled Village")), - (Grace::RayaLucariaCrystalTunnel, (MapName::LiurniaOfTheLakes, 73202,"Raya Lucaria Crystal Tunnel")), - (Grace::RevengersShack, (MapName::LiurniaOfTheLakes, 76218,"Revenger's Shack")), - (Grace::RoadsEndCatacombs, (MapName::LiurniaOfTheLakes, 73003,"Road's End Catacombs")), - (Grace::RoadtotheManor, (MapName::LiurniaOfTheLakes, 76213,"Road to the Manor")), - (Grace::RoyalMoongazingGrounds, (MapName::LiurniaOfTheLakes, 76232,"Royal Moongazing Grounds")), - (Grace::RuinedLabyrinth, (MapName::LiurniaOfTheLakes, 76225,"Ruined Labyrinth")), - (Grace::ScenicIsle, (MapName::LiurniaOfTheLakes, 76203,"Scenic Isle")), - (Grace::SlumberingWolfsShack, (MapName::LiurniaOfTheLakes, 76215,"Slumbering Wolf's Shack")), - (Grace::SorcerersIsle, (MapName::LiurniaOfTheLakes, 76211,"Sorcerer's Isle")), - (Grace::SouthRayaLucariaGate, (MapName::LiurniaOfTheLakes, 76205,"South Raya Lucaria Gate")), - (Grace::StillwaterCave, (MapName::LiurniaOfTheLakes, 73104,"Stillwater Cave")), - (Grace::StudyHallEntrance, (MapName::LiurniaOfTheLakes, 73420,"Study Hall Entrance")), - (Grace::TempleQuarter, (MapName::LiurniaOfTheLakes, 76241,"Temple Quarter")), - (Grace::TheFourBelfries, (MapName::LiurniaOfTheLakes, 76227,"The Four Belfries")), - (Grace::TheRavine, (MapName::LiurniaOfTheLakes, 76235,"The Ravine")), - (Grace::VillageoftheAlbinaurics, (MapName::LiurniaOfTheLakes, 76220,"Village of the Albinaurics")), - - // Bellum Highway - (Grace::BellumChurch, (MapName::BellumHighway, 76208, "Bellum Church")), - (Grace::ChurchofInhibition, (MapName::BellumHighway, 76240, "Church of Inhibition")), - (Grace::EastRayaLucariaGate, (MapName::BellumHighway, 76207, "East Raya Lucaria Gate")), - (Grace::FrenziedFlameVillageOutskirts, (MapName::BellumHighway, 76239, "Frenzied Flame Village Outskirts")), - (Grace::GrandLiftofDectus, (MapName::BellumHighway, 76209, "Grand Lift of Dectus")), - - // Ruin-Strewn Precipice - (Grace::MagmaWyrm, (MapName::RuinStrewnPrecipice, 73900, "Magma Wyrm")), - (Grace::RuinStrewnPrecipice, (MapName::RuinStrewnPrecipice, 73901, "Ruin-Strewn Precipice")), - (Grace::RuinStrewnPrecipiceOverlook, (MapName::RuinStrewnPrecipice, 73902, "Ruin-Strewn Precipice Overlook")), - - // Moonlight Altar - (Grace::AltarSouth, (MapName::MoonlightAltar, 76252, "Altar South")), - (Grace::CathedralofManusCeles, (MapName::MoonlightAltar, 76251, "Cathedral of Manus Celes")), - (Grace::MoonlightAltar, (MapName::MoonlightAltar, 76250, "Moonlight Altar")), - - // Academy of Raya Lucaria - (Grace::ChurchoftheCuckoo, (MapName::AcademyOfRayaLucaria, 71402, "Church of the Cuckoo")), - (Grace::DebateParlour, (MapName::AcademyOfRayaLucaria, 71401, "Debate Parlour")), - (Grace::RayaLucariaGrandLibrary, (MapName::AcademyOfRayaLucaria, 71400, "Raya Lucaria Grand Library")), - (Grace::SchoolhouseClassroom, (MapName::AcademyOfRayaLucaria, 71403, "Schoolhouse Classroom")), - - // Altus Plateau - (Grace::AbandonedCoffin, (MapName::AltusPlateau, 76300, "Abandoned Coffin")), - (Grace::AltusHighwayJunction, (MapName::AltusPlateau, 76303, "Altus Highway Junction")), - (Grace::AltusPlateau, (MapName::AltusPlateau, 76301, "Altus Plateau")), - (Grace::AltusTunnel, (MapName::AltusPlateau, 73205, "Altus Tunnel")), - (Grace::BowerofBounty, (MapName::AltusPlateau, 76306, "Bower of Bounty")), - (Grace::CastellansHall, (MapName::AltusPlateau, 76322, "Castellan's Hall")), - (Grace::ErdtreeGazingHill, (MapName::AltusPlateau, 76302, "Erdtree-Gazing Hill")), - (Grace::ForestSpanningGreatbridge, (MapName::AltusPlateau, 76304, "Forest-Spanning Greatbridge")), - (Grace::OldAltusTunnel, (MapName::AltusPlateau, 73204, "Old Altus Tunnel")), - (Grace::PerfumersGrotto, (MapName::AltusPlateau, 73118, "Perfumer's Grotto")), - (Grace::RampartsidePath, (MapName::AltusPlateau, 76305, "Rampartside Path")), - (Grace::RoadofIniquitySidePath, (MapName::AltusPlateau, 76307, "Road of Iniquity Side Path")), - (Grace::SagesCave, (MapName::AltusPlateau, 73119, "Sage's Cave")), - (Grace::SaintedHerosGrave, (MapName::AltusPlateau, 73008, "Sainted Hero's Grave")), - (Grace::ShadedCastleInnerGate, (MapName::AltusPlateau, 76321, "Shaded Castle Inner Gate")), - (Grace::ShadedCastleRamparts, (MapName::AltusPlateau, 76320, "Shaded Castle Ramparts")), - (Grace::UnsightlyCatacombs, (MapName::AltusPlateau, 73012, "Unsightly Catacombs")), - (Grace::WindmillHeights, (MapName::AltusPlateau, 76313, "Windmill Heights")), - (Grace::WindmillVillage, (MapName::AltusPlateau, 76308, "Windmill Village")), - - // Mt. Gelmir - (Grace::BridgeofIniquity, (MapName::MtGelmir, 76350, "Bridge of Iniquity")), - (Grace::CraftsmansShack, (MapName::MtGelmir, 76356, "Craftsman's Shack")), - (Grace::FirstMtGelmirCampsite, (MapName::MtGelmir, 76351, "First Mt. Gelmir Campsite")), - (Grace::GelmirHerosGrave, (MapName::MtGelmir, 73009, "Gelmir Hero's Grave")), - (Grace::NinthMtGelmirCampsite, (MapName::MtGelmir, 76352, "Ninth Mt. Gelmir Campsite")), - (Grace::PrimevalSorcererAzur, (MapName::MtGelmir, 76357, "Primeval Sorcerer Azur")), - (Grace::RoadofIniquity, (MapName::MtGelmir, 76353, "Road of Iniquity")), - (Grace::SeethewaterCave, (MapName::MtGelmir, 73107, "Seethewater Cave")), - (Grace::SeethewaterRiver, (MapName::MtGelmir, 76354, "Seethewater River")), - (Grace::SeethewaterTerminus, (MapName::MtGelmir, 76355, "Seethewater Terminus")), - (Grace::VolcanoCave, (MapName::MtGelmir, 73109, "Volcano Cave")), - (Grace::WyndhamCatacombs, (MapName::MtGelmir, 73007, "Wyndham Catacombs")), - - // Capital Outskirts - (Grace::AurizaSideTomb, (MapName::CapitalOutskirts, 73013, "Auriza Side Tomb")), - (Grace::AuziraHerosGrave, (MapName::CapitalOutskirts, 73010, "Auzira Hero's Grave")), - (Grace::CapitalRampart, (MapName::CapitalOutskirts, 76314, "Capital Rampart")), - (Grace::DivineTowerofWestAltus, (MapName::CapitalOutskirts, 73430, "Divine Tower of West Altus")), - (Grace::DivineTowerofWestAltusGate, (MapName::CapitalOutskirts, 73432, "Divine Tower of West Altus: Gate")), - (Grace::HermitMerchantsShack, (MapName::CapitalOutskirts, 76311, "Hermit Merchant's Shack")), - (Grace::MinorEerdtreeChurch, (MapName::CapitalOutskirts, 76310, "Minor Eerdtree Church")), - (Grace::OuterWallBattleground, (MapName::CapitalOutskirts, 76312, "Outer Wall Battleground")), - (Grace::OuterWallPhantomTree, (MapName::CapitalOutskirts, 76309, "Outer Wall Phantom Tree")), - (Grace::SealedTunnel, (MapName::CapitalOutskirts, 73431, "Sealed Tunnel")), - - // Volcano Manor - (Grace::AbductorVirgin, (MapName::VolcanoManor, 71606, "Abductor Virgin")), - (Grace::AudiencePathway, (MapName::VolcanoManor, 71605, "Audience Pathway")), - (Grace::GuestHall, (MapName::VolcanoManor, 71604, "Guest Hall")), - (Grace::PrisonTownChurch, (MapName::VolcanoManor, 71603, "Prison Town Church")), - (Grace::RykardLordofBlasphemy, (MapName::VolcanoManor, 71600, "Rykard, Lord of Blasphemy")), - (Grace::SubterraneanInquisitionChamber, (MapName::VolcanoManor, 71607, "Subterranean Inquisition Chamber")), - (Grace::TempleofEiglay, (MapName::VolcanoManor, 71601, "Temple of Eiglay")), - (Grace::VolcanoManor, (MapName::VolcanoManor, 71602, "Volcano Manor")), - - // Leyndell, Royal Capital - (Grace::AvenueBalcony, (MapName::LeyndellRoyalCapital, 71104, "Avenue Balcony")), - (Grace::DivineBridge, (MapName::LeyndellRoyalCapital, 71109, "Divine Bridge")), - (Grace::EastCapitalRampart, (MapName::LeyndellRoyalCapital, 71102, "East Capital Rampart")), - (Grace::EldenThrone, (MapName::LeyndellRoyalCapital, 71100, "Elden Throne")), - (Grace::ErdtreeSanctuary, (MapName::LeyndellRoyalCapital, 71101, "Erdtree Sanctuary")), - (Grace::FortifiedManorFirstFloor, (MapName::LeyndellRoyalCapital, 71108, "Fortified Manor, First Floor")), - (Grace::LowerCapitalChurch, (MapName::LeyndellRoyalCapital, 71103, "Lower Capital Church")), - (Grace::QueensBedchamber, (MapName::LeyndellRoyalCapital, 71107, "Queen's Bedchamber")), - (Grace::WestCapitalRampart, (MapName::LeyndellRoyalCapital, 71105, "West Capital Rampart")), - - // Subterranean Shunning-Grounds - (Grace::CathedraloftheForsaken, (MapName::SubterraneanShunningGrounds, 73500, "Cathedral of the Forsaken")), - (Grace::ForsakenDepths, (MapName::SubterraneanShunningGrounds, 73502, "Forsaken Depths")), - (Grace::FrenziedFlameProscription, (MapName::SubterraneanShunningGrounds, 73504, "Frenzied Flame Proscription")), - (Grace::LeyndellCatacombs, (MapName::SubterraneanShunningGrounds, 73503, "Leyndell Catacombs")), - (Grace::UndergroundRoadside, (MapName::SubterraneanShunningGrounds, 73501, "Underground Roadside")), - - // Leyndell, Ashen Capital - (Grace::LeyendellCapitalofAsh, (MapName::LeyndellAshenCapital, 71123, "Leyendell, Capital of Ash")), - (Grace::LeyndellAshenCapitalDivineBridge, (MapName::LeyndellAshenCapital, 71125, "Divine Bridge")), - (Grace::LeyndellAshenCapitalEastCapitalRampart, (MapName::LeyndellAshenCapital, 71122, "East Capital Rampart")), - (Grace::LeyndellAshenCapitalEldenThrone, (MapName::LeyndellAshenCapital, 71120, "Elden Throne")), - (Grace::LeyndellAshenCapitalErdtreeSanctuary, (MapName::LeyndellAshenCapital, 71121, "Erdtree Sanctuary")), - (Grace::LeyndellAshenCapitalQueensBedchamber, (MapName::LeyndellAshenCapital, 71124, "Queen's Bedchamber")), - - // Stone Platfrom - (Grace::FracturedMarika, (MapName::StonePlatform, 71900, "Fractured Marika")), - - // Caelid - (Grace::AbandonedCave, (MapName::Caelid, 73120, "Abandoned Cave")), - (Grace::CaelemRuins, (MapName::Caelid, 76403, "Caelem Ruins")), - (Grace::CaelidCatacombs, (MapName::Caelid, 73015, "Caelid Catacombs")), - (Grace::CaelidHighwaySouth, (MapName::Caelid, 76405, "Caelid Highway South")), - (Grace::CathedralofDragonCommunion, (MapName::Caelid, 76404, "Cathedral of Dragon Communion")), - (Grace::ChairCryptofSellia, (MapName::Caelid, 76415, "Chair-Crypt of Sellia")), - (Grace::ChamberOutsidethePlaza, (MapName::Caelid, 76420, "Chamber Outside the Plaza")), - (Grace::ChurchofthePlague, (MapName::Caelid, 76418, "Church of the Plague")), - (Grace::DeepSiofraWell, (MapName::Caelid, 76410, "Deep Siofra Well")), - (Grace::FortGaelNorth, (MapName::Caelid, 76402, "Fort Gael North")), - (Grace::GaelTunnel, (MapName::Caelid, 73207, "Gael Tunnel")), - (Grace::GaolCave, (MapName::Caelid, 73121, "Gaol Cave")), - (Grace::ImpassableGreatbridge, (MapName::Caelid, 76417, "Impassable Greatbridge")), - (Grace::MinorEerdtreeCatacombs, (MapName::Caelid, 73014, "Minor Eerdtree Catacombs")), - (Grace::RearGaelTunnelEntrance, (MapName::Caelid, 73257, "Rear Gael Tunnel Entrance")), - (Grace::RedmaneCastlePlaza, (MapName::Caelid, 76419, "Redmane Castle Plaza")), - (Grace::RotviewBalcony, (MapName::Caelid, 76401, "Rotview Balcony")), - (Grace::SelliaBackstreets, (MapName::Caelid, 76414, "Sellia Backstreets")), - (Grace::SelliaCrystalTunnel, (MapName::Caelid, 73208, "Sellia Crystal Tunnel")), - (Grace::SelliaUnderStair, (MapName::Caelid, 76416, "Sellia Under-Stair")), - (Grace::SmolderingChurch, (MapName::Caelid, 76400, "Smoldering Church")), - (Grace::SmolderingWall, (MapName::Caelid, 76409, "Smoldering Wall")), - (Grace::SouthernAeoniaSwampBank, (MapName::Caelid, 76411, "Southern Aeonia Swamp Bank")), - (Grace::StarscourgeRadahn, (MapName::Caelid, 76422, "Starscourge Radahn")), - (Grace::WarDeadCatacombs, (MapName::Caelid, 73016, "War-Dead Catacombs")), - - // Swamp of Aeonia - (Grace::AeoniaSwampShore, (MapName::SwampOfAeonia, 76406, "Aeonia Swamp Shore")), - (Grace::AstrayfromCaelidHighwayNorth, (MapName::SwampOfAeonia, 76407, "Astray from Caelid Highway North")), - (Grace::HeartofAeonia, (MapName::SwampOfAeonia, 76412, "Heart of Aeonia")), - (Grace::InnerAeonia, (MapName::SwampOfAeonia, 76413, "Inner Aeonia")), - - // Greyoll's Dragonbarrow - (Grace::BestialSanctum, (MapName::GreyollsDragonbarrow, 76454, "Bestial Sanctum")), - (Grace::DivineTowerofCaelidBasement, (MapName::GreyollsDragonbarrow, 73440, "Divine Tower of Caelid: Basement")), - (Grace::DivineTowerofCaelidCenter, (MapName::GreyollsDragonbarrow, 73441, "Divine Tower of Caelid: Center")), - (Grace::DragonbarrowCave, (MapName::GreyollsDragonbarrow, 73110, "Dragonbarrow Cave")), - (Grace::DragonbarrowFork, (MapName::GreyollsDragonbarrow, 76452, "Dragonbarrow Fork")), - (Grace::DragonbarrowWest, (MapName::GreyollsDragonbarrow, 76450, "Dragonbarrow West")), - (Grace::FarumGreatbridge, (MapName::GreyollsDragonbarrow, 76456, "Farum Greatbridge")), - (Grace::FortFaroth, (MapName::GreyollsDragonbarrow, 76453, "Fort Faroth")), - (Grace::GreyollsDragonbarrowIsolatedMerchantsShack, (MapName::GreyollsDragonbarrow, 76451, "Isolated Merchant's Shack (Greyoll's Dragonbarrow)")), - (Grace::IsolatedDivineTower, (MapName::GreyollsDragonbarrow, 73460, "Isolated Divine Tower")), - (Grace::LennesRise, (MapName::GreyollsDragonbarrow, 76455, "Lenne's Rise")), - (Grace::SelliaHideaway, (MapName::GreyollsDragonbarrow, 73111, "Sellia Hideaway")), - - // Forbiden Lands - (Grace::DivineToweroftheEastAltus, (MapName::ForbiddenLands, 73451, "Divine Tower of the East Altus")), - (Grace::DivineToweroftheEastAltusGate, (MapName::ForbiddenLands, 73450, "Divine Tower of the East Altus: Gate")), - (Grace::ForbiddenLands, (MapName::ForbiddenLands, 76500, "Forbidden Lands")), - (Grace::GrandLiftofRold, (MapName::ForbiddenLands, 76502, "Grand Lift of Rold")), - (Grace::HiddenPathtotheHaligtree, (MapName::ForbiddenLands, 73020, "Hidden Path to the Haligtree")), - - // Mountaintops of the Giants - (Grace::AncientSnowValleyRuins, (MapName::MountaintopsOfTheGiants, 76503, "Ancient Snow Valley Ruins")), - (Grace::CastleSolMainGate, (MapName::MountaintopsOfTheGiants, 76522, "Castle Sol Main Gate")), - (Grace::CastleSolRooftop, (MapName::MountaintopsOfTheGiants, 76524, "Castle Sol Rooftop")), - (Grace::ChurchoftheEclipse, (MapName::MountaintopsOfTheGiants, 76523, "Church of the Eclipse")), - (Grace::FirstChurchofMarika, (MapName::MountaintopsOfTheGiants, 76505, "First Church of Marika")), - (Grace::FreezingLake, (MapName::MountaintopsOfTheGiants, 76504, "Freezing Lake")), - (Grace::SnowValleyRuinsOverlook, (MapName::MountaintopsOfTheGiants, 76521, "Snow Valley Ruins Overlook")), - (Grace::SpiritcallersCave, (MapName::MountaintopsOfTheGiants, 73122, "Spiritcaller's Cave")), - (Grace::WhiteridgeRoad, (MapName::MountaintopsOfTheGiants, 76520, "Whiteridge Road")), - (Grace::ZamorRuins, (MapName::MountaintopsOfTheGiants, 76501, "Zamor Ruins")), - - // Flame Peak - (Grace::ChurchofRepose, (MapName::FlamePeak, 76507, "Church of Repose")), - (Grace::FireGiant, (MapName::FlamePeak, 76509, "Fire Giant")), - (Grace::FootoftheForge, (MapName::FlamePeak, 76508, "Foot of the Forge")), - (Grace::ForgeoftheGiants, (MapName::FlamePeak, 76510, "Forge of the Giants")), - (Grace::GiantConqueringHerosGrave, (MapName::FlamePeak, 73017, "Giant-Conquering Hero's Grave")), - (Grace::GiantsGravepost, (MapName::FlamePeak, 76506, "Giant's Gravepost")), - (Grace::GiantsMountaintopCatacombs, (MapName::FlamePeak, 73018, "Giant's Mountaintop Catacombs")), - - // Consecrated Snowfield - (Grace::ApostateDerelict, (MapName::ConsecratedSnowfield, 76653, "Apostate Derelict")), - (Grace::CaveoftheForlorn, (MapName::ConsecratedSnowfield, 73112, "Cave of the Forlorn")), - (Grace::ConsecratedSnowfield, (MapName::ConsecratedSnowfield, 76550, "Consecrated Snowfield")), - (Grace::ConsecratedSnowfieldCatacombs, (MapName::ConsecratedSnowfield, 73019, "Consecrated Snowfield Catacombs")), - (Grace::InnerConsecratedSnowfield, (MapName::ConsecratedSnowfield, 76551, "Inner Consecrated Snowfield")), - (Grace::OrdinaLiturgicalTown, (MapName::ConsecratedSnowfield, 76652, "Ordina, Liturgical Town")), - (Grace::YeloughAnixTunnel, (MapName::ConsecratedSnowfield, 73211, "Yelough Anix Tunnel")), - - // Miquella's Haligtree - (Grace::HaligtreeCanopy, (MapName::MiquellasHaligtree, 71506, "Haligtree Canopy")), - (Grace::HaligtreePromenade, (MapName::MiquellasHaligtree, 71505, "Haligtree Promenade")), - (Grace::HaligtreeTown, (MapName::MiquellasHaligtree, 71507, "Haligtree Town")), - (Grace::HaligtreeTownPlaza, (MapName::MiquellasHaligtree, 71508, "Haligtree Town Plaza")), - - // Elphael, Brace of the Haligtree - (Grace::DrainageChannel, (MapName::ElphaelBraceOfTheHaligtree, 71503, "Drainage Channel")), - (Grace::ElphaelInnerWall, (MapName::ElphaelBraceOfTheHaligtree, 71502, "Elphael Inner Wall")), - (Grace::HaligtreeRoots, (MapName::ElphaelBraceOfTheHaligtree, 71504, "Haligtree Roots")), - (Grace::MaleniaGodessofRot, (MapName::ElphaelBraceOfTheHaligtree, 71500, "Malenia, Godess of Rot")), - (Grace::PrayerRoom, (MapName::ElphaelBraceOfTheHaligtree, 71501, "Prayer Room")), - - // Crumbling Farum Azula - (Grace::BesidethegreatBridge, (MapName::CrumblingFarumAzula, 71310, "Beside the great Bridge")), - (Grace::CrumblingBeastGrave, (MapName::CrumblingFarumAzula, 71303, "Crumbling Beast Grave")), - (Grace::CrumblingBeastGraveDepths, (MapName::CrumblingFarumAzula, 71304, "Crumbling Beast Grave Depths")), - (Grace::DragonlordPlacidusax, (MapName::CrumblingFarumAzula, 71301, "Dragonlord Placidusax")), - (Grace::DragonTemple, (MapName::CrumblingFarumAzula, 71306, "Dragon Temple")), - (Grace::DragonTempleAltar, (MapName::CrumblingFarumAzula, 71302, "Dragon Temple Altar")), - (Grace::DragonTempleLift, (MapName::CrumblingFarumAzula, 71308, "Dragon Temple Lift")), - (Grace::DragonTempleRooftop, (MapName::CrumblingFarumAzula, 71309, "Dragon Temple Rooftop")), - (Grace::DragonTempleTransept, (MapName::CrumblingFarumAzula, 71307, "Dragon Temple Transept")), - (Grace::MalikeththeBlackBlade, (MapName::CrumblingFarumAzula, 71300, "Maliketh, the Black Blade")), - (Grace::TempestFacingBalcony, (MapName::CrumblingFarumAzula, 71305, "Tempest-Facing Balcony")), - - // Ainsel River - (Grace::AinselRiverDownstream, (MapName::AinselRiver, 71213, "Ainsel River Downstream")), - (Grace::AinselRiverSluiceGate, (MapName::AinselRiver, 71212, "Ainsel River Sluice Gate")), - (Grace::AinselRiverWellDepths, (MapName::AinselRiver, 71211, "Ainsel River Well Depths")), - (Grace::AstelNaturalbornoftheVoid, (MapName::AinselRiver, 71240, "Astel, Naturalborn of the Void")), - (Grace::DragonkinSoldierofNokstella, (MapName::AinselRiver, 71210, "Dragonkin Soldier of Nokstella")), - - // Ainsel River Main - (Grace::AinselRiverMain, (MapName::AinselRiverMain, 71214, "Ainsel River Main")), - (Grace::NokstellaEternalCity, (MapName::AinselRiverMain, 71215, "Nokstella, Eternal City")), - (Grace::NokstellaWaterfallBasin, (MapName::AinselRiverMain, 71219, "Nokstella Waterfall Basin")), - - // Lake Of Rot - (Grace::GrandCloister, (MapName::LakeOfRot, 71218, "Grand Cloister")), - (Grace::LakeofRotShoreside, (MapName::LakeOfRot, 71216, "Lake of Rot Shoreside")), - - // Nokron, Eternal City - (Grace::AncestralWoods, (MapName::NokronEternalCity, 71224, "Ancestral Woods")), - (Grace::AqueductFacingCliffs, (MapName::NokronEternalCity, 71225, "Aqueduct-Facing Cliffs")), - (Grace::GreatWaterfallBasin, (MapName::NokronEternalCity, 71220, "Great Waterfall Basin")), - (Grace::MimicTear, (MapName::NokronEternalCity, 71221, "Mimic Tear")), - (Grace::NightsSacredGround, (MapName::NokronEternalCity, 71226, "Night's Sacred Ground")), - (Grace::NokronEternalCity, (MapName::NokronEternalCity, 71271, "Nokron, Eternal City")), - - // Siofra River - (Grace::BelowtheWell, (MapName::SiofraRiver, 71227, "Below the Well")), - (Grace::SiofraRiverBank, (MapName::SiofraRiver, 71222, "Siofra River Bank")), - (Grace::SiofraRiverWellDepths, (MapName::SiofraRiver, 71270, "Siofra River Well Depths")), - (Grace::WorshippersWoods, (MapName::SiofraRiver, 71223, "Worshippers' Woods")), - - // Mohgwyn Palace - (Grace::CocoonoftheEmpyrean, (MapName::MohgwynPalace, 71250, "Cocoon of the Empyrean")), - (Grace::DynastyMausoleumEntrance, (MapName::MohgwynPalace, 71252, "Dynasty Mausoleum Entrance")), - (Grace::DynastyMausoleumMidpoint, (MapName::MohgwynPalace, 71253, "Dynasty Mausoleum Midpoint")), - (Grace::PalaceApproachLedgeRoad, (MapName::MohgwynPalace, 71251, "Palace Approach Ledge-Road")), - - // Deeproot Depths - (Grace::AcrosstheRoots, (MapName::DeeprootDepths, 71235, "Across the Roots")), - (Grace::DeeprootDepths, (MapName::DeeprootDepths, 71233, "Deeproot Depths")), - (Grace::GreatWaterfallCrest, (MapName::DeeprootDepths, 71232, "Great Waterfall Crest")), - (Grace::PrinceofDeathsThrone, (MapName::DeeprootDepths, 71230, "Prince of Death's Throne")), - (Grace::RootFacingCliffs, (MapName::DeeprootDepths, 71231, "Root-Facing Cliffs")), - (Grace::TheNamelessEternalCity, (MapName::DeeprootDepths, 71234, "The Nameless Eternal City")), - ])) - }); + + impl Grace { + #[rustfmt::skip] + pub fn graces() -> &'static HashMap { + static GRACES: OnceLock> = OnceLock::new(); + + GRACES.get_or_init(|| { + HashMap::from([ + // Table of Lost Grace / Roundtable Hold + (Grace::RoundtableHold, (MapName::RoundtableHold, 71190,"Table of Lost Grace / Roundtable Hold")), + + // Limgrave + (Grace::AgheelLakeNorth, (MapName::Limgrave, 76108,"Agheel Lake North")), + (Grace::AgheelLakeSouth, (MapName::Limgrave, 76106,"Agheel Lake South")), + (Grace::ChurchofDragonCommunion, (MapName::Limgrave, 76110,"Church of Dragon Communion")), + (Grace::ChurchofElleh, (MapName::Limgrave, 76100,"Church of Elleh")), + (Grace::CoastalCave, (MapName::Limgrave, 73115,"Coastal Cave")), + (Grace::FortHaightWest, (MapName::Limgrave, 76105,"Fort Haight West")), + (Grace::Gatefront, (MapName::Limgrave, 76111,"Gatefront")), + (Grace::GrovesideCave, (MapName::Limgrave, 73103,"Groveside Cave")), + (Grace::HighroadCave, (MapName::Limgrave, 73117,"Highroad Cave")), + (Grace::LimgraveArtistShack, (MapName::Limgrave, 76103,"Artist's Shack (Limgrave)")), + (Grace::LimgraveTunnels, (MapName::Limgrave, 73201,"Limgrave Tunnels")), + (Grace::MistwoodOutskirts, (MapName::Limgrave, 76114,"Mistwood Outskirts")), + (Grace::MurkwaterCatacombs, (MapName::Limgrave, 73004,"Murkwater Catacombs")), + (Grace::MurkwaterCave, (MapName::Limgrave, 73100,"Murkwater Cave")), + (Grace::MurkwaterCoast, (MapName::Limgrave, 76116,"Murkwater Coast")), + (Grace::SeasideRuins, (MapName::Limgrave, 76113,"Seaside Ruins")), + (Grace::StormfootCatacombs, (MapName::Limgrave, 73002,"Stormfoot Catacombs")), + (Grace::SummonwaterVillageOutskirts, (MapName::Limgrave, 76119,"Summonwater Village Outskirts")), + (Grace::TheFirstStep, (MapName::Limgrave, 76101,"The First Step")), + (Grace::ThirdChurchofMarika, (MapName::Limgrave, 76104,"Third Church of Marika")), + (Grace::WaypointRuinsCellar, (MapName::Limgrave, 76120,"Waypoint Ruins Cellar")), + + // Stranded Graveyard + (Grace::CaveofKnowledge, (MapName::StrandedGraveyard, 71800,"Cave of Knowledge")), + (Grace::StrandedGraveyard, (MapName::StrandedGraveyard, 71801,"Stranded Graveyard")), + + // Stormhill + (Grace::CastlewardTunnel, (MapName::Stormhill, 71002,"Castleward Tunnel")), + (Grace::DeathtouchedCatacombs, (MapName::Stormhill, 73011,"Deathtouched Catacombs")), + (Grace::DivineTowerofLimgrave, (MapName::Stormhill, 73412,"Divine Tower of Limgrave")), + (Grace::LimgraveTowerBridge, (MapName::Stormhill, 73410,"Limgrave Tower Bridge")), + (Grace::MargittheFellOmen, (MapName::Stormhill, 71001,"Margit, the Fell Omen")), + (Grace::Saintsbridge, (MapName::Stormhill, 76117,"Saintsbridge")), + (Grace::StormhillShack, (MapName::Stormhill, 76102,"Stormhill Shack")), + (Grace::WarmastersShack, (MapName::Stormhill, 76118,"Warmaster's Shack")), + + // Weeping Peninsula + (Grace::AilingVillageOutskirts, (MapName::WeepingPeninsula, 76154,"Ailing Village Outskirts")), + (Grace::BehindTheCastle, (MapName::WeepingPeninsula, 76159,"Behind The Castle")), + (Grace::BesidetheCraterPockedGlade, (MapName::WeepingPeninsula, 76155,"Beside the Crater-Pocked Glade")), + (Grace::BesidetheRampartGaol, (MapName::WeepingPeninsula, 76160,"Beside the Rampart Gaol")), + (Grace::BridgeofSacrifice, (MapName::WeepingPeninsula, 76157,"Bridge of Sacrifice")), + (Grace::CastleMorneLift, (MapName::WeepingPeninsula, 76158,"Castle Morne Lift")), + (Grace::CastleMorneRampart, (MapName::WeepingPeninsula, 76151,"Castle Morne Rampart")), + (Grace::ChurchofPilgrimage, (MapName::WeepingPeninsula, 76150,"Church of Pilgrimage")), + (Grace::EarthboreCave, (MapName::WeepingPeninsula, 73101,"Earthbore Cave")), + (Grace::FourthChurchofMarika, (MapName::WeepingPeninsula, 76162,"Fourth Church of Marika")), + (Grace::ImpalersCatacombs, (MapName::WeepingPeninsula, 73001,"Impaler's Catacombs")), + (Grace::LimgraveIsolatedMerchantsShack, (MapName::WeepingPeninsula, 76156,"Isolated Merchant's Shack (Limgrave)")), + (Grace::MorneMoangrave, (MapName::WeepingPeninsula, 76161,"Morne Moangrave")), + (Grace::MorneTunnel, (MapName::WeepingPeninsula, 73200,"Morne Tunnel")), + (Grace::SouthoftheLookoutTower, (MapName::WeepingPeninsula, 76153,"South of the Lookout Tower")), + (Grace::Tombsward, (MapName::WeepingPeninsula, 76152,"Tombsward")), + (Grace::TombswardCatacombs, (MapName::WeepingPeninsula, 73000,"Tombsward Catacombs")), + (Grace::TombswardCave, (MapName::WeepingPeninsula, 73102,"Tombsward Cave")), + + // Stormveil Castle + (Grace::GatesideChamber, (MapName::StormveilCastle, 71003,"Gateside Chamber")), + (Grace::GodricktheGrafted, (MapName::StormveilCastle, 71000,"Godrick the Grafted")), + (Grace::LiftsideChamber, (MapName::StormveilCastle, 71006,"Liftside Chamber")), + (Grace::RampartTower, (MapName::StormveilCastle, 71005,"Rampart Tower")), + (Grace::SecludedCell, (MapName::StormveilCastle, 71007,"Secluded Cell")), + (Grace::StormveilCliffside, (MapName::StormveilCastle, 71004,"Stormveil Cliffside")), + (Grace::StormveilMainGate, (MapName::StormveilCastle, 71008,"Stormveil Main Gate")), + + // Liurnia of the Lakes + (Grace::AcademyCrystalCave, (MapName::LiurniaOfTheLakes, 73106,"Academy Crystal Cave")), + (Grace::AcademyGateTown, (MapName::LiurniaOfTheLakes, 76204,"Academy Gate Town")), + (Grace::BehindCariaManor, (MapName::LiurniaOfTheLakes, 76238,"Behind Caria Manor")), + (Grace::BlackKnifeCatacombs, (MapName::LiurniaOfTheLakes, 73005,"Black Knife Catacombs")), + (Grace::BoilprawnShack, (MapName::LiurniaOfTheLakes, 76216,"Boilprawn Shack")), + (Grace::ChurchofVows, (MapName::LiurniaOfTheLakes, 76224,"Church of Vows")), + (Grace::CliffbottomCatacombs, (MapName::LiurniaOfTheLakes, 73006,"Cliffbottom Catacombs")), + (Grace::ConvertedTower, (MapName::LiurniaOfTheLakes, 76237,"Converted Tower")), + (Grace::CrystallineWoods, (MapName::LiurniaOfTheLakes, 76243,"Crystalline Woods")), + (Grace::DivineTowerofLiurnia, (MapName::LiurniaOfTheLakes, 73422,"Divine Tower of Liurnia")), + (Grace::EasternLiurniaLakeShore, (MapName::LiurniaOfTheLakes, 76223,"Eastern Liurnia Lake Shore")), + (Grace::EasternTableland, (MapName::LiurniaOfTheLakes, 76234,"Eastern Tableland")), + (Grace::EastGateBridgeTrestle, (MapName::LiurniaOfTheLakes, 76242,"East Gate Bridge Trestle")), + (Grace::FallenRuinsoftheLake, (MapName::LiurniaOfTheLakes, 76236,"Fallen Ruins of the Lake")), + (Grace::FollyontheLake, (MapName::LiurniaOfTheLakes, 76219,"Folly on the Lake")), + (Grace::FootoftheFourBelfries, (MapName::LiurniaOfTheLakes, 76210,"Foot of the Four Belfries")), + (Grace::GateTownBridge, (MapName::LiurniaOfTheLakes, 76222,"Gate Town Bridge")), + (Grace::GateTownNorth, (MapName::LiurniaOfTheLakes, 76233,"Gate Town North")), + (Grace::Jarburg, (MapName::LiurniaOfTheLakes, 76245,"Jarburg")), + (Grace::LakeFacingCliffs, (MapName::LiurniaOfTheLakes, 76200,"Lake-Facing Cliffs")), + (Grace::LakesideCrystalCave, (MapName::LiurniaOfTheLakes, 73105,"Lakeside Crystal Cave")), + (Grace::LaskyarRuins, (MapName::LiurniaOfTheLakes, 76202,"Laskyar Ruins")), + (Grace::LiurniaHighwayNorth, (MapName::LiurniaOfTheLakes, 76221,"Liurnia Highway North")), + (Grace::LiurniaHighwaySouth, (MapName::LiurniaOfTheLakes, 76244,"Liurnia Highway South")), + (Grace::LiurniaLakeShore, (MapName::LiurniaOfTheLakes, 76201,"Liurnia Lake Shore")), + (Grace::LiurniaoftheLakesArtistsShack, (MapName::LiurniaOfTheLakes, 76217,"Artist's Shack (Liurnia of the Lakes)")), + (Grace::LiurniaTowerBridge, (MapName::LiurniaOfTheLakes, 73421,"Liurnia Tower Bridge")), + (Grace::MainAcademyGate, (MapName::LiurniaOfTheLakes, 76206,"Main Academy Gate")), + (Grace::MainCariaManorGate, (MapName::LiurniaOfTheLakes, 76214,"Main Caria Manor Gate")), + (Grace::ManorLowerLevel, (MapName::LiurniaOfTheLakes, 76231,"Manor Lower Level")), + (Grace::ManorUpperLevel, (MapName::LiurniaOfTheLakes, 76230,"Manor Upper Level")), + (Grace::MausoleumCompound, (MapName::LiurniaOfTheLakes, 76226,"Mausoleum Compound")), + (Grace::NorthernLiurniaLakeShore, (MapName::LiurniaOfTheLakes, 76212,"Northern Liurnia Lake Shore")), + (Grace::RannisChamber, (MapName::LiurniaOfTheLakes, 76247,"Ranni's Chamber")), + (Grace::RannisRise, (MapName::LiurniaOfTheLakes, 76228,"Ranni's Rise")), + (Grace::RavineVeiledVillage, (MapName::LiurniaOfTheLakes, 76229,"Ravine-Veiled Village")), + (Grace::RayaLucariaCrystalTunnel, (MapName::LiurniaOfTheLakes, 73202,"Raya Lucaria Crystal Tunnel")), + (Grace::RevengersShack, (MapName::LiurniaOfTheLakes, 76218,"Revenger's Shack")), + (Grace::RoadsEndCatacombs, (MapName::LiurniaOfTheLakes, 73003,"Road's End Catacombs")), + (Grace::RoadtotheManor, (MapName::LiurniaOfTheLakes, 76213,"Road to the Manor")), + (Grace::RoyalMoongazingGrounds, (MapName::LiurniaOfTheLakes, 76232,"Royal Moongazing Grounds")), + (Grace::RuinedLabyrinth, (MapName::LiurniaOfTheLakes, 76225,"Ruined Labyrinth")), + (Grace::ScenicIsle, (MapName::LiurniaOfTheLakes, 76203,"Scenic Isle")), + (Grace::SlumberingWolfsShack, (MapName::LiurniaOfTheLakes, 76215,"Slumbering Wolf's Shack")), + (Grace::SorcerersIsle, (MapName::LiurniaOfTheLakes, 76211,"Sorcerer's Isle")), + (Grace::SouthRayaLucariaGate, (MapName::LiurniaOfTheLakes, 76205,"South Raya Lucaria Gate")), + (Grace::StillwaterCave, (MapName::LiurniaOfTheLakes, 73104,"Stillwater Cave")), + (Grace::StudyHallEntrance, (MapName::LiurniaOfTheLakes, 73420,"Study Hall Entrance")), + (Grace::TempleQuarter, (MapName::LiurniaOfTheLakes, 76241,"Temple Quarter")), + (Grace::TheFourBelfries, (MapName::LiurniaOfTheLakes, 76227,"The Four Belfries")), + (Grace::TheRavine, (MapName::LiurniaOfTheLakes, 76235,"The Ravine")), + (Grace::VillageoftheAlbinaurics, (MapName::LiurniaOfTheLakes, 76220,"Village of the Albinaurics")), + + // Bellum Highway + (Grace::BellumChurch, (MapName::BellumHighway, 76208, "Bellum Church")), + (Grace::ChurchofInhibition, (MapName::BellumHighway, 76240, "Church of Inhibition")), + (Grace::EastRayaLucariaGate, (MapName::BellumHighway, 76207, "East Raya Lucaria Gate")), + (Grace::FrenziedFlameVillageOutskirts, (MapName::BellumHighway, 76239, "Frenzied Flame Village Outskirts")), + (Grace::GrandLiftofDectus, (MapName::BellumHighway, 76209, "Grand Lift of Dectus")), + + // Ruin-Strewn Precipice + (Grace::MagmaWyrm, (MapName::RuinStrewnPrecipice, 73900, "Magma Wyrm")), + (Grace::RuinStrewnPrecipice, (MapName::RuinStrewnPrecipice, 73901, "Ruin-Strewn Precipice")), + (Grace::RuinStrewnPrecipiceOverlook, (MapName::RuinStrewnPrecipice, 73902, "Ruin-Strewn Precipice Overlook")), + + // Moonlight Altar + (Grace::AltarSouth, (MapName::MoonlightAltar, 76252, "Altar South")), + (Grace::CathedralofManusCeles, (MapName::MoonlightAltar, 76251, "Cathedral of Manus Celes")), + (Grace::MoonlightAltar, (MapName::MoonlightAltar, 76250, "Moonlight Altar")), + + // Academy of Raya Lucaria + (Grace::ChurchoftheCuckoo, (MapName::AcademyOfRayaLucaria, 71402, "Church of the Cuckoo")), + (Grace::DebateParlour, (MapName::AcademyOfRayaLucaria, 71401, "Debate Parlour")), + (Grace::RayaLucariaGrandLibrary, (MapName::AcademyOfRayaLucaria, 71400, "Raya Lucaria Grand Library")), + (Grace::SchoolhouseClassroom, (MapName::AcademyOfRayaLucaria, 71403, "Schoolhouse Classroom")), + + // Altus Plateau + (Grace::AbandonedCoffin, (MapName::AltusPlateau, 76300, "Abandoned Coffin")), + (Grace::AltusHighwayJunction, (MapName::AltusPlateau, 76303, "Altus Highway Junction")), + (Grace::AltusPlateau, (MapName::AltusPlateau, 76301, "Altus Plateau")), + (Grace::AltusTunnel, (MapName::AltusPlateau, 73205, "Altus Tunnel")), + (Grace::BowerofBounty, (MapName::AltusPlateau, 76306, "Bower of Bounty")), + (Grace::CastellansHall, (MapName::AltusPlateau, 76322, "Castellan's Hall")), + (Grace::ErdtreeGazingHill, (MapName::AltusPlateau, 76302, "Erdtree-Gazing Hill")), + (Grace::ForestSpanningGreatbridge, (MapName::AltusPlateau, 76304, "Forest-Spanning Greatbridge")), + (Grace::OldAltusTunnel, (MapName::AltusPlateau, 73204, "Old Altus Tunnel")), + (Grace::PerfumersGrotto, (MapName::AltusPlateau, 73118, "Perfumer's Grotto")), + (Grace::RampartsidePath, (MapName::AltusPlateau, 76305, "Rampartside Path")), + (Grace::RoadofIniquitySidePath, (MapName::AltusPlateau, 76307, "Road of Iniquity Side Path")), + (Grace::SagesCave, (MapName::AltusPlateau, 73119, "Sage's Cave")), + (Grace::SaintedHerosGrave, (MapName::AltusPlateau, 73008, "Sainted Hero's Grave")), + (Grace::ShadedCastleInnerGate, (MapName::AltusPlateau, 76321, "Shaded Castle Inner Gate")), + (Grace::ShadedCastleRamparts, (MapName::AltusPlateau, 76320, "Shaded Castle Ramparts")), + (Grace::UnsightlyCatacombs, (MapName::AltusPlateau, 73012, "Unsightly Catacombs")), + (Grace::WindmillHeights, (MapName::AltusPlateau, 76313, "Windmill Heights")), + (Grace::WindmillVillage, (MapName::AltusPlateau, 76308, "Windmill Village")), + + // Mt. Gelmir + (Grace::BridgeofIniquity, (MapName::MtGelmir, 76350, "Bridge of Iniquity")), + (Grace::CraftsmansShack, (MapName::MtGelmir, 76356, "Craftsman's Shack")), + (Grace::FirstMtGelmirCampsite, (MapName::MtGelmir, 76351, "First Mt. Gelmir Campsite")), + (Grace::GelmirHerosGrave, (MapName::MtGelmir, 73009, "Gelmir Hero's Grave")), + (Grace::NinthMtGelmirCampsite, (MapName::MtGelmir, 76352, "Ninth Mt. Gelmir Campsite")), + (Grace::PrimevalSorcererAzur, (MapName::MtGelmir, 76357, "Primeval Sorcerer Azur")), + (Grace::RoadofIniquity, (MapName::MtGelmir, 76353, "Road of Iniquity")), + (Grace::SeethewaterCave, (MapName::MtGelmir, 73107, "Seethewater Cave")), + (Grace::SeethewaterRiver, (MapName::MtGelmir, 76354, "Seethewater River")), + (Grace::SeethewaterTerminus, (MapName::MtGelmir, 76355, "Seethewater Terminus")), + (Grace::VolcanoCave, (MapName::MtGelmir, 73109, "Volcano Cave")), + (Grace::WyndhamCatacombs, (MapName::MtGelmir, 73007, "Wyndham Catacombs")), + + // Capital Outskirts + (Grace::AurizaSideTomb, (MapName::CapitalOutskirts, 73013, "Auriza Side Tomb")), + (Grace::AuziraHerosGrave, (MapName::CapitalOutskirts, 73010, "Auzira Hero's Grave")), + (Grace::CapitalRampart, (MapName::CapitalOutskirts, 76314, "Capital Rampart")), + (Grace::DivineTowerofWestAltus, (MapName::CapitalOutskirts, 73430, "Divine Tower of West Altus")), + (Grace::DivineTowerofWestAltusGate, (MapName::CapitalOutskirts, 73432, "Divine Tower of West Altus: Gate")), + (Grace::HermitMerchantsShack, (MapName::CapitalOutskirts, 76311, "Hermit Merchant's Shack")), + (Grace::MinorEerdtreeChurch, (MapName::CapitalOutskirts, 76310, "Minor Eerdtree Church")), + (Grace::OuterWallBattleground, (MapName::CapitalOutskirts, 76312, "Outer Wall Battleground")), + (Grace::OuterWallPhantomTree, (MapName::CapitalOutskirts, 76309, "Outer Wall Phantom Tree")), + (Grace::SealedTunnel, (MapName::CapitalOutskirts, 73431, "Sealed Tunnel")), + + // Volcano Manor + (Grace::AbductorVirgin, (MapName::VolcanoManor, 71606, "Abductor Virgin")), + (Grace::AudiencePathway, (MapName::VolcanoManor, 71605, "Audience Pathway")), + (Grace::GuestHall, (MapName::VolcanoManor, 71604, "Guest Hall")), + (Grace::PrisonTownChurch, (MapName::VolcanoManor, 71603, "Prison Town Church")), + (Grace::RykardLordofBlasphemy, (MapName::VolcanoManor, 71600, "Rykard, Lord of Blasphemy")), + (Grace::SubterraneanInquisitionChamber, (MapName::VolcanoManor, 71607, "Subterranean Inquisition Chamber")), + (Grace::TempleofEiglay, (MapName::VolcanoManor, 71601, "Temple of Eiglay")), + (Grace::VolcanoManor, (MapName::VolcanoManor, 71602, "Volcano Manor")), + + // Leyndell, Royal Capital + (Grace::AvenueBalcony, (MapName::LeyndellRoyalCapital, 71104, "Avenue Balcony")), + (Grace::DivineBridge, (MapName::LeyndellRoyalCapital, 71109, "Divine Bridge")), + (Grace::EastCapitalRampart, (MapName::LeyndellRoyalCapital, 71102, "East Capital Rampart")), + (Grace::EldenThrone, (MapName::LeyndellRoyalCapital, 71100, "Elden Throne")), + (Grace::ErdtreeSanctuary, (MapName::LeyndellRoyalCapital, 71101, "Erdtree Sanctuary")), + (Grace::FortifiedManorFirstFloor, (MapName::LeyndellRoyalCapital, 71108, "Fortified Manor, First Floor")), + (Grace::LowerCapitalChurch, (MapName::LeyndellRoyalCapital, 71103, "Lower Capital Church")), + (Grace::QueensBedchamber, (MapName::LeyndellRoyalCapital, 71107, "Queen's Bedchamber")), + (Grace::WestCapitalRampart, (MapName::LeyndellRoyalCapital, 71105, "West Capital Rampart")), + + // Subterranean Shunning-Grounds + (Grace::CathedraloftheForsaken, (MapName::SubterraneanShunningGrounds, 73500, "Cathedral of the Forsaken")), + (Grace::ForsakenDepths, (MapName::SubterraneanShunningGrounds, 73502, "Forsaken Depths")), + (Grace::FrenziedFlameProscription, (MapName::SubterraneanShunningGrounds, 73504, "Frenzied Flame Proscription")), + (Grace::LeyndellCatacombs, (MapName::SubterraneanShunningGrounds, 73503, "Leyndell Catacombs")), + (Grace::UndergroundRoadside, (MapName::SubterraneanShunningGrounds, 73501, "Underground Roadside")), + + // Leyndell, Ashen Capital + (Grace::LeyendellCapitalofAsh, (MapName::LeyndellAshenCapital, 71123, "Leyendell, Capital of Ash")), + (Grace::LeyndellAshenCapitalDivineBridge, (MapName::LeyndellAshenCapital, 71125, "Divine Bridge")), + (Grace::LeyndellAshenCapitalEastCapitalRampart, (MapName::LeyndellAshenCapital, 71122, "East Capital Rampart")), + (Grace::LeyndellAshenCapitalEldenThrone, (MapName::LeyndellAshenCapital, 71120, "Elden Throne")), + (Grace::LeyndellAshenCapitalErdtreeSanctuary, (MapName::LeyndellAshenCapital, 71121, "Erdtree Sanctuary")), + (Grace::LeyndellAshenCapitalQueensBedchamber, (MapName::LeyndellAshenCapital, 71124, "Queen's Bedchamber")), + + // Stone Platfrom + (Grace::FracturedMarika, (MapName::StonePlatform, 71900, "Fractured Marika")), + + // Caelid + (Grace::AbandonedCave, (MapName::Caelid, 73120, "Abandoned Cave")), + (Grace::CaelemRuins, (MapName::Caelid, 76403, "Caelem Ruins")), + (Grace::CaelidCatacombs, (MapName::Caelid, 73015, "Caelid Catacombs")), + (Grace::CaelidHighwaySouth, (MapName::Caelid, 76405, "Caelid Highway South")), + (Grace::CathedralofDragonCommunion, (MapName::Caelid, 76404, "Cathedral of Dragon Communion")), + (Grace::ChairCryptofSellia, (MapName::Caelid, 76415, "Chair-Crypt of Sellia")), + (Grace::ChamberOutsidethePlaza, (MapName::Caelid, 76420, "Chamber Outside the Plaza")), + (Grace::ChurchofthePlague, (MapName::Caelid, 76418, "Church of the Plague")), + (Grace::DeepSiofraWell, (MapName::Caelid, 76410, "Deep Siofra Well")), + (Grace::FortGaelNorth, (MapName::Caelid, 76402, "Fort Gael North")), + (Grace::GaelTunnel, (MapName::Caelid, 73207, "Gael Tunnel")), + (Grace::GaolCave, (MapName::Caelid, 73121, "Gaol Cave")), + (Grace::ImpassableGreatbridge, (MapName::Caelid, 76417, "Impassable Greatbridge")), + (Grace::MinorEerdtreeCatacombs, (MapName::Caelid, 73014, "Minor Eerdtree Catacombs")), + (Grace::RearGaelTunnelEntrance, (MapName::Caelid, 73257, "Rear Gael Tunnel Entrance")), + (Grace::RedmaneCastlePlaza, (MapName::Caelid, 76419, "Redmane Castle Plaza")), + (Grace::RotviewBalcony, (MapName::Caelid, 76401, "Rotview Balcony")), + (Grace::SelliaBackstreets, (MapName::Caelid, 76414, "Sellia Backstreets")), + (Grace::SelliaCrystalTunnel, (MapName::Caelid, 73208, "Sellia Crystal Tunnel")), + (Grace::SelliaUnderStair, (MapName::Caelid, 76416, "Sellia Under-Stair")), + (Grace::SmolderingChurch, (MapName::Caelid, 76400, "Smoldering Church")), + (Grace::SmolderingWall, (MapName::Caelid, 76409, "Smoldering Wall")), + (Grace::SouthernAeoniaSwampBank, (MapName::Caelid, 76411, "Southern Aeonia Swamp Bank")), + (Grace::StarscourgeRadahn, (MapName::Caelid, 76422, "Starscourge Radahn")), + (Grace::WarDeadCatacombs, (MapName::Caelid, 73016, "War-Dead Catacombs")), + + // Swamp of Aeonia + (Grace::AeoniaSwampShore, (MapName::SwampOfAeonia, 76406, "Aeonia Swamp Shore")), + (Grace::AstrayfromCaelidHighwayNorth, (MapName::SwampOfAeonia, 76407, "Astray from Caelid Highway North")), + (Grace::HeartofAeonia, (MapName::SwampOfAeonia, 76412, "Heart of Aeonia")), + (Grace::InnerAeonia, (MapName::SwampOfAeonia, 76413, "Inner Aeonia")), + + // Greyoll's Dragonbarrow + (Grace::BestialSanctum, (MapName::GreyollsDragonbarrow, 76454, "Bestial Sanctum")), + (Grace::DivineTowerofCaelidBasement, (MapName::GreyollsDragonbarrow, 73440, "Divine Tower of Caelid: Basement")), + (Grace::DivineTowerofCaelidCenter, (MapName::GreyollsDragonbarrow, 73441, "Divine Tower of Caelid: Center")), + (Grace::DragonbarrowCave, (MapName::GreyollsDragonbarrow, 73110, "Dragonbarrow Cave")), + (Grace::DragonbarrowFork, (MapName::GreyollsDragonbarrow, 76452, "Dragonbarrow Fork")), + (Grace::DragonbarrowWest, (MapName::GreyollsDragonbarrow, 76450, "Dragonbarrow West")), + (Grace::FarumGreatbridge, (MapName::GreyollsDragonbarrow, 76456, "Farum Greatbridge")), + (Grace::FortFaroth, (MapName::GreyollsDragonbarrow, 76453, "Fort Faroth")), + (Grace::GreyollsDragonbarrowIsolatedMerchantsShack, (MapName::GreyollsDragonbarrow, 76451, "Isolated Merchant's Shack (Greyoll's Dragonbarrow)")), + (Grace::IsolatedDivineTower, (MapName::GreyollsDragonbarrow, 73460, "Isolated Divine Tower")), + (Grace::LennesRise, (MapName::GreyollsDragonbarrow, 76455, "Lenne's Rise")), + (Grace::SelliaHideaway, (MapName::GreyollsDragonbarrow, 73111, "Sellia Hideaway")), + + // Forbiden Lands + (Grace::DivineToweroftheEastAltus, (MapName::ForbiddenLands, 73451, "Divine Tower of the East Altus")), + (Grace::DivineToweroftheEastAltusGate, (MapName::ForbiddenLands, 73450, "Divine Tower of the East Altus: Gate")), + (Grace::ForbiddenLands, (MapName::ForbiddenLands, 76500, "Forbidden Lands")), + (Grace::GrandLiftofRold, (MapName::ForbiddenLands, 76502, "Grand Lift of Rold")), + (Grace::HiddenPathtotheHaligtree, (MapName::ForbiddenLands, 73020, "Hidden Path to the Haligtree")), + + // Mountaintops of the Giants + (Grace::AncientSnowValleyRuins, (MapName::MountaintopsOfTheGiants, 76503, "Ancient Snow Valley Ruins")), + (Grace::CastleSolMainGate, (MapName::MountaintopsOfTheGiants, 76522, "Castle Sol Main Gate")), + (Grace::CastleSolRooftop, (MapName::MountaintopsOfTheGiants, 76524, "Castle Sol Rooftop")), + (Grace::ChurchoftheEclipse, (MapName::MountaintopsOfTheGiants, 76523, "Church of the Eclipse")), + (Grace::FirstChurchofMarika, (MapName::MountaintopsOfTheGiants, 76505, "First Church of Marika")), + (Grace::FreezingLake, (MapName::MountaintopsOfTheGiants, 76504, "Freezing Lake")), + (Grace::SnowValleyRuinsOverlook, (MapName::MountaintopsOfTheGiants, 76521, "Snow Valley Ruins Overlook")), + (Grace::SpiritcallersCave, (MapName::MountaintopsOfTheGiants, 73122, "Spiritcaller's Cave")), + (Grace::WhiteridgeRoad, (MapName::MountaintopsOfTheGiants, 76520, "Whiteridge Road")), + (Grace::ZamorRuins, (MapName::MountaintopsOfTheGiants, 76501, "Zamor Ruins")), + + // Flame Peak + (Grace::ChurchofRepose, (MapName::FlamePeak, 76507, "Church of Repose")), + (Grace::FireGiant, (MapName::FlamePeak, 76509, "Fire Giant")), + (Grace::FootoftheForge, (MapName::FlamePeak, 76508, "Foot of the Forge")), + (Grace::ForgeoftheGiants, (MapName::FlamePeak, 76510, "Forge of the Giants")), + (Grace::GiantConqueringHerosGrave, (MapName::FlamePeak, 73017, "Giant-Conquering Hero's Grave")), + (Grace::GiantsGravepost, (MapName::FlamePeak, 76506, "Giant's Gravepost")), + (Grace::GiantsMountaintopCatacombs, (MapName::FlamePeak, 73018, "Giant's Mountaintop Catacombs")), + + // Consecrated Snowfield + (Grace::ApostateDerelict, (MapName::ConsecratedSnowfield, 76653, "Apostate Derelict")), + (Grace::CaveoftheForlorn, (MapName::ConsecratedSnowfield, 73112, "Cave of the Forlorn")), + (Grace::ConsecratedSnowfield, (MapName::ConsecratedSnowfield, 76550, "Consecrated Snowfield")), + (Grace::ConsecratedSnowfieldCatacombs, (MapName::ConsecratedSnowfield, 73019, "Consecrated Snowfield Catacombs")), + (Grace::InnerConsecratedSnowfield, (MapName::ConsecratedSnowfield, 76551, "Inner Consecrated Snowfield")), + (Grace::OrdinaLiturgicalTown, (MapName::ConsecratedSnowfield, 76652, "Ordina, Liturgical Town")), + (Grace::YeloughAnixTunnel, (MapName::ConsecratedSnowfield, 73211, "Yelough Anix Tunnel")), + + // Miquella's Haligtree + (Grace::HaligtreeCanopy, (MapName::MiquellasHaligtree, 71506, "Haligtree Canopy")), + (Grace::HaligtreePromenade, (MapName::MiquellasHaligtree, 71505, "Haligtree Promenade")), + (Grace::HaligtreeTown, (MapName::MiquellasHaligtree, 71507, "Haligtree Town")), + (Grace::HaligtreeTownPlaza, (MapName::MiquellasHaligtree, 71508, "Haligtree Town Plaza")), + + // Elphael, Brace of the Haligtree + (Grace::DrainageChannel, (MapName::ElphaelBraceOfTheHaligtree, 71503, "Drainage Channel")), + (Grace::ElphaelInnerWall, (MapName::ElphaelBraceOfTheHaligtree, 71502, "Elphael Inner Wall")), + (Grace::HaligtreeRoots, (MapName::ElphaelBraceOfTheHaligtree, 71504, "Haligtree Roots")), + (Grace::MaleniaGodessofRot, (MapName::ElphaelBraceOfTheHaligtree, 71500, "Malenia, Godess of Rot")), + (Grace::PrayerRoom, (MapName::ElphaelBraceOfTheHaligtree, 71501, "Prayer Room")), + + // Crumbling Farum Azula + (Grace::BesidethegreatBridge, (MapName::CrumblingFarumAzula, 71310, "Beside the great Bridge")), + (Grace::CrumblingBeastGrave, (MapName::CrumblingFarumAzula, 71303, "Crumbling Beast Grave")), + (Grace::CrumblingBeastGraveDepths, (MapName::CrumblingFarumAzula, 71304, "Crumbling Beast Grave Depths")), + (Grace::DragonlordPlacidusax, (MapName::CrumblingFarumAzula, 71301, "Dragonlord Placidusax")), + (Grace::DragonTemple, (MapName::CrumblingFarumAzula, 71306, "Dragon Temple")), + (Grace::DragonTempleAltar, (MapName::CrumblingFarumAzula, 71302, "Dragon Temple Altar")), + (Grace::DragonTempleLift, (MapName::CrumblingFarumAzula, 71308, "Dragon Temple Lift")), + (Grace::DragonTempleRooftop, (MapName::CrumblingFarumAzula, 71309, "Dragon Temple Rooftop")), + (Grace::DragonTempleTransept, (MapName::CrumblingFarumAzula, 71307, "Dragon Temple Transept")), + (Grace::MalikeththeBlackBlade, (MapName::CrumblingFarumAzula, 71300, "Maliketh, the Black Blade")), + (Grace::TempestFacingBalcony, (MapName::CrumblingFarumAzula, 71305, "Tempest-Facing Balcony")), + + // Ainsel River + (Grace::AinselRiverDownstream, (MapName::AinselRiver, 71213, "Ainsel River Downstream")), + (Grace::AinselRiverSluiceGate, (MapName::AinselRiver, 71212, "Ainsel River Sluice Gate")), + (Grace::AinselRiverWellDepths, (MapName::AinselRiver, 71211, "Ainsel River Well Depths")), + (Grace::AstelNaturalbornoftheVoid, (MapName::AinselRiver, 71240, "Astel, Naturalborn of the Void")), + (Grace::DragonkinSoldierofNokstella, (MapName::AinselRiver, 71210, "Dragonkin Soldier of Nokstella")), + + // Ainsel River Main + (Grace::AinselRiverMain, (MapName::AinselRiverMain, 71214, "Ainsel River Main")), + (Grace::NokstellaEternalCity, (MapName::AinselRiverMain, 71215, "Nokstella, Eternal City")), + (Grace::NokstellaWaterfallBasin, (MapName::AinselRiverMain, 71219, "Nokstella Waterfall Basin")), + + // Lake Of Rot + (Grace::GrandCloister, (MapName::LakeOfRot, 71218, "Grand Cloister")), + (Grace::LakeofRotShoreside, (MapName::LakeOfRot, 71216, "Lake of Rot Shoreside")), + + // Nokron, Eternal City + (Grace::AncestralWoods, (MapName::NokronEternalCity, 71224, "Ancestral Woods")), + (Grace::AqueductFacingCliffs, (MapName::NokronEternalCity, 71225, "Aqueduct-Facing Cliffs")), + (Grace::GreatWaterfallBasin, (MapName::NokronEternalCity, 71220, "Great Waterfall Basin")), + (Grace::MimicTear, (MapName::NokronEternalCity, 71221, "Mimic Tear")), + (Grace::NightsSacredGround, (MapName::NokronEternalCity, 71226, "Night's Sacred Ground")), + (Grace::NokronEternalCity, (MapName::NokronEternalCity, 71271, "Nokron, Eternal City")), + + // Siofra River + (Grace::BelowtheWell, (MapName::SiofraRiver, 71227, "Below the Well")), + (Grace::SiofraRiverBank, (MapName::SiofraRiver, 71222, "Siofra River Bank")), + (Grace::SiofraRiverWellDepths, (MapName::SiofraRiver, 71270, "Siofra River Well Depths")), + (Grace::WorshippersWoods, (MapName::SiofraRiver, 71223, "Worshippers' Woods")), + + // Mohgwyn Palace + (Grace::CocoonoftheEmpyrean, (MapName::MohgwynPalace, 71250, "Cocoon of the Empyrean")), + (Grace::DynastyMausoleumEntrance, (MapName::MohgwynPalace, 71252, "Dynasty Mausoleum Entrance")), + (Grace::DynastyMausoleumMidpoint, (MapName::MohgwynPalace, 71253, "Dynasty Mausoleum Midpoint")), + (Grace::PalaceApproachLedgeRoad, (MapName::MohgwynPalace, 71251, "Palace Approach Ledge-Road")), + + // Deeproot Depths + (Grace::AcrosstheRoots, (MapName::DeeprootDepths, 71235, "Across the Roots")), + (Grace::DeeprootDepths, (MapName::DeeprootDepths, 71233, "Deeproot Depths")), + (Grace::GreatWaterfallCrest, (MapName::DeeprootDepths, 71232, "Great Waterfall Crest")), + (Grace::PrinceofDeathsThrone, (MapName::DeeprootDepths, 71230, "Prince of Death's Throne")), + (Grace::RootFacingCliffs, (MapName::DeeprootDepths, 71231, "Root-Facing Cliffs")), + (Grace::TheNamelessEternalCity, (MapName::DeeprootDepths, 71234, "The Nameless Eternal City")), + ]) + }) + } + } } \ No newline at end of file diff --git a/src/db/item_name.rs b/src/db/item_name.rs index d8a42e2..f454907 100644 --- a/src/db/item_name.rs +++ b/src/db/item_name.rs @@ -1,1817 +1,1815 @@ pub mod item_name { use std::{collections::HashMap, sync::Mutex}; - use once_cell::sync::Lazy; - pub static ITEM_NAME: Lazy>> = Lazy::new(|| { Mutex::new(HashMap::from([ - (0,"Empty"), - (10,""), - (11,""), - (12,""), - (13,""), - (14,""), - (15,""), - (16,""), - (20,""), - (21,""), - (22,""), - (23,""), - (24,""), - (25,""), - (26,""), - (27,""), - (28,""), - (29,""), - (30,""), - (31,""), - (35,""), - (40,""), - (41,""), - (42,""), - (43,""), - (44,""), - (60,""), - (61,""), - (62,""), - (63,""), - (64,""), - (65,""), - (66,""), - (67,""), - (68,""), - (69,""), - (70,""), - (71,""), - (72,""), - (73,""), - (74,""), - (75,""), - (76,""), - (77,""), - (78,""), - (79,""), - (90,""), - (91,""), - (92,""), - (93,""), - (94,""), - (98,""), - (99,""), - (100,"Tarnished's Furled Finger"), - (101,"Duelist's Furled Finger"), - (102,"Bloody Finger"), - (103,"Finger Severer"), - (104,"White Cipher Ring"), - (105,"Blue Cipher Ring"), - (106,"Tarnished's Wizened Finger"), - (107,"Phantom Bloody Finger"), - (108,"Taunter's Tongue"), - (109,"Small Golden Effigy"), - (110,"Small Red Effigy"), - (111,"Festering Bloody Finger"), - (112,"Recusant Finger"), - (113,"Phantom Bloody Finger"), - (114,"Phantom Recusant Finger"), - (115,"Memory of Grace"), - (130,"Spectral Steed Whistle"), - (135,"Phantom Great Rune"), - (150,"Furlcalling Finger Remedy"), - (166,""), - (170,"Tarnished's Furled Finger"), - (171,"Duelist's Furled Finger"), - (172,"Bloody Finger"), - (174,"White Cipher Ring"), - (175,"Blue Cipher Ring"), - (178,"Taunter's Tongue"), - (179,"Small Golden Effigy"), - (180,"Small Red Effigy"), - (181,"Spectral Steed Whistle"), - (182,"Furlcalling Finger Remedy"), - (183,"Festering Bloody Finger"), - (184,"Recusant Finger"), - (190,"Rune Arc"), - (191,"Godrick's Great Rune"), - (192,"Radahn's Great Rune"), - (193,"Morgott's Great Rune"), - (194,"Rykard's Great Rune"), - (195,"Mohg's Great Rune"), - (196,"Malenia's Great Rune"), - (250,"Flask of Wondrous Physick"), - (251,"Flask of Wondrous Physick"), - (300,"Fire Pot"), - (301,"Redmane Fire Pot"), - (302,"Giantsflame Fire Pot"), - (320,"Lightning Pot"), - (321,"Ancient Dragonbolt Pot"), - (330,"Fetid Pot"), - (340,"Swarm Pot"), - (350,"Holy Water Pot"), - (351,"Sacred Order Pot"), - (360,"Freezing Pot"), - (370,"Poison Pot"), - (380,"Oil Pot"), - (390,"Alluring Pot"), - (391,"Beastlure Pot"), - (400,"Roped Fire Pot"), - (420,"Roped Lightning Pot"), - (430,"Roped Fetid Pot"), - (440,"Roped Poison Pot"), - (450,"Roped Oil Pot"), - (460,"Roped Magic Pot"), - (470,"Roped Fly Pot"), - (480,"Roped Freezing Pot"), - (490,"Roped Volcano Pot"), - (510,"Roped Holy Water Pot"), - (600,"Volcano Pot"), - (610,"Albinauric Pot"), - (630,"Cursed-Blood Pot"), - (640,"Sleep Pot"), - (650,"Rancor Pot"), - (660,"Magic Pot"), - (661,"Academy Magic Pot"), - (670,"Rot Pot"), - (810,"Rowa Raisin"), - (811,"Sweet Raisin"), - (812,"Frozen Raisin"), - (820,"Boiled Crab"), - (830,"Boiled Prawn"), - (900,"Neutralizing Boluses"), - (910,"Stanching Boluses"), - (920,"Thawfrost Boluses"), - (930,"Stimulating Boluses"), - (940,"Preserving Boluses"), - (950,"Rejuvenating Boluses"), - (960,"Clarifying Boluses"), - (1000,"Flask of Crimson Tears"), - (1001,"Flask of Crimson Tears"), - (1002,"Flask of Crimson Tears +1"), - (1003,"Flask of Crimson Tears +1"), - (1004,"Flask of Crimson Tears +2"), - (1005,"Flask of Crimson Tears +2"), - (1006,"Flask of Crimson Tears +3"), - (1007,"Flask of Crimson Tears +3"), - (1008,"Flask of Crimson Tears +4"), - (1009,"Flask of Crimson Tears +4"), - (1010,"Flask of Crimson Tears +5"), - (1011,"Flask of Crimson Tears +5"), - (1012,"Flask of Crimson Tears +6"), - (1013,"Flask of Crimson Tears +6"), - (1014,"Flask of Crimson Tears +7"), - (1015,"Flask of Crimson Tears +7"), - (1016,"Flask of Crimson Tears +8"), - (1017,"Flask of Crimson Tears +8"), - (1018,"Flask of Crimson Tears +9"), - (1019,"Flask of Crimson Tears +9"), - (1020,"Flask of Crimson Tears +10"), - (1021,"Flask of Crimson Tears +10"), - (1022,"Flask of Crimson Tears +11"), - (1023,"Flask of Crimson Tears +11"), - (1024,"Flask of Crimson Tears +12"), - (1025,"Flask of Crimson Tears +12"), - (1050,"Flask of Cerulean Tears"), - (1051,"Flask of Cerulean Tears"), - (1052,"Flask of Cerulean Tears +1"), - (1053,"Flask of Cerulean Tears +1"), - (1054,"Flask of Cerulean Tears +2"), - (1055,"Flask of Cerulean Tears +2"), - (1056,"Flask of Cerulean Tears +3"), - (1057,"Flask of Cerulean Tears +3"), - (1058,"Flask of Cerulean Tears +4"), - (1059,"Flask of Cerulean Tears +4"), - (1060,"Flask of Cerulean Tears +5"), - (1061,"Flask of Cerulean Tears +5"), - (1062,"Flask of Cerulean Tears +6"), - (1063,"Flask of Cerulean Tears +6"), - (1064,"Flask of Cerulean Tears +7"), - (1065,"Flask of Cerulean Tears +7"), - (1066,"Flask of Cerulean Tears +8"), - (1067,"Flask of Cerulean Tears +8"), - (1068,"Flask of Cerulean Tears +9"), - (1069,"Flask of Cerulean Tears +9"), - (1070,"Flask of Cerulean Tears +10"), - (1071,"Flask of Cerulean Tears +10"), - (1072,"Flask of Cerulean Tears +11"), - (1073,"Flask of Cerulean Tears +11"), - (1074,"Flask of Cerulean Tears +12"), - (1075,"Flask of Cerulean Tears +12"), - (1100,"Pickled Turtle Neck"), - (1110,"Immunizing Cured Meat"), - (1120,"Invigorating Cured Meat"), - (1130,"Clarifying Cured Meat"), - (1140,"Dappled Cured Meat"), - (1150,"Spellproof Dried Liver"), - (1160,"Fireproof Dried Liver"), - (1170,"Lightningproof Dried Liver"), - (1180,"Holyproof Dried Liver"), - (1190,"Silver-Pickled Fowl Foot"), - (1200,"Gold-Pickled Fowl Foot"), - (1210,"Exalted Flesh"), - (1220,"Deathsbane Jerky"), - (1235,"Raw Meat Dumpling"), - (1240,"Shabriri Grape"), - (1290,"Starlight Shards"), - (1310,"Immunizing White Cured Meat"), - (1320,"Invigorating White Cured Meat"), - (1330,"Clarifying White Cured Meat"), - (1340,"Dappled White Cured Meat"), - (1350,"Deathsbane White Jerky"), - (1400,"Fire Grease"), - (1410,"Lightning Grease"), - (1420,"Magic Grease"), - (1430,"Holy Grease"), - (1440,"Blood Grease"), - (1450,"Soporific Grease"), - (1460,"Poison Grease"), - (1470,"Freezing Grease"), - (1480,"Dragonwound Grease"), - (1490,"Rot Grease"), - (1500,"Drawstring Fire Grease"), - (1510,"Drawstring Lightning Grease"), - (1520,"Drawstring Magic Grease"), - (1530,"Drawstring Holy Grease"), - (1540,"Drawstring Blood Grease"), - (1550,"Drawstring Soporific Grease"), - (1560,"Drawstring Poison Grease"), - (1570,"Drawstring Freezing Grease"), - (1590,"Drawstring Rot Grease"), - (1690,"Shield Grease"), - (1700,"Throwing Dagger"), - (1710,"Bone Dart"), - (1720,"Poisonbone Dart"), - (1730,"Kukri"), - (1740,"Crystal Dart"), - (1750,"Fan Daggers"), - (1760,"Ruin Fragment"), - (1830,"Explosive Stone"), - (1831,"Explosive Stone Clump"), - (1840,"Poisoned Stone"), - (1841,"Poisoned Stone Clump"), - (2020,"Rainbow Stone"), - (2030,"Glowstone"), - (2040,"Telescope"), - (2050,"Grace Mimic"), - (2070,"Lantern"), - (2080,"Blasphemous Claw"), - (2090,"Deathroot"), - (2100,"Soft Cotton"), - (2120,"Soap"), - (2130,"Celestial Dew"), - (2140,"Margit's Shackle"), - (2150,"Mohg's Shackle"), - (2160,"Pureblood Knight's Medal"), - (2190,"Miquella's Needle"), - (2200,"Prattling Pate 'Hello'"), - (2201,"Prattling Pate 'Thank you'"), - (2202,"Prattling Pate 'Apologies'"), - (2203,"Prattling Pate 'Wonderful'"), - (2204,"Prattling Pate 'Please help'"), - (2205,"Prattling Pate 'My beloved'"), - (2206,"Prattling Pate 'Let's get to it'"), - (2207,"Prattling Pate 'You're beautiful'"), - (2900,"Golden Rune [1]"), - (2901,"Golden Rune [2]"), - (2902,"Golden Rune [3]"), - (2903,"Golden Rune [4]"), - (2904,"Golden Rune [5]"), - (2905,"Golden Rune [6]"), - (2906,"Golden Rune [7]"), - (2907,"Golden Rune [8]"), - (2908,"Golden Rune [9]"), - (2909,"Golden Rune [10]"), - (2910,"Golden Rune [11]"), - (2911,"Golden Rune [12]"), - (2912,"Golden Rune [13]"), - (2913,"Numen's Rune"), - (2914,"Hero's Rune [1]"), - (2915,"Hero's Rune [2]"), - (2916,"Hero's Rune [3]"), - (2917,"Hero's Rune [4]"), - (2918,"Hero's Rune [5]"), - (2919,"Lord's Rune"), - (2950,"Remembrance of the Grafted"), - (2951,"Remembrance of the Starscourge"), - (2952,"Remembrance of the Omen King"), - (2953,"Remembrance of the Blasphemous"), - (2954,"Remembrance of the Rot Goddess"), - (2955,"Remembrance of the Blood Lord"), - (2956,"Remembrance of the Black Blade"), - (2957,"Remembrance of Hoarah Loux"), - (2958,"Remembrance of the Dragonlord"), - (2959,"Remembrance of the Full Moon Queen"), - (2960,"Remembrance of the Lichdragon"), - (2961,"Remembrance of the Fire Giant"), - (2962,"Remembrance of the Regal Ancestor"), - (2963,"Elden Remembrance"), - (2964,"Remembrance of the Naturalborn"), - (2990,"Lands Between Rune"), - (3000,"Ancestral Infant's Head"), - (3010,"Omen Bairn"), - (3011,"Regal Omen Bairn"), - (3020,"Miranda's Prayer"), - (3030,"Cuckoo Glintstone"), - (3040,"Mimic's Veil"), - (3050,"Glintstone Scrap"), - (3051,"Large Glintstone Scrap"), - (3060,"Gravity Stone Fan"), - (3070,"Gravity Stone Chunk"), - (3080,"Wraith Calling Bell"), - (3300,"Holy Water Grease"), - (3310,"Warming Stone"), - (3311,"Frenzyflame Stone"), - (3320,"Scriptstone"), - (3350,"Bewitching Branch"), - (3360,"Baldachin's Blessing"), - (3361,"Radiant Baldachin's Blessing"), - (3500,"Uplifting Aromatic"), - (3510,"Spark Aromatic"), - (3520,"Ironjar Aromatic"), - (3550,"Bloodboil Aromatic"), - (3580,"Poison Spraymist"), - (3610,"Acid Spraymist"), - (4000,"[Sorcery] Glintstone Pebble"), - (4001,"[Sorcery] Great Glintstone Shard"), - (4010,"[Sorcery] Swift Glintstone Shard"), - (4020,"[Sorcery] Glintstone Cometshard"), - (4021,"[Sorcery] Comet"), - (4030,"[Sorcery] Shard Spiral"), - (4040,"[Sorcery] Glintstone Stars"), - (4050,"[Sorcery] Star Shower"), - (4060,"[Sorcery] Crystal Barrage"), - (4070,"[Sorcery] Glintstone Arc"), - (4080,"[Sorcery] Cannon of Haima"), - (4090,"[Sorcery] Crystal Burst"), - (4100,"[Sorcery] Shatter Earth"), - (4110,"[Sorcery] Rock Blaster"), - (4120,"[Sorcery] Gavel of Haima"), - (4130,"[Sorcery] Terra Magicus"), - (4140,"[Sorcery] Starlight"), - (4200,"[Sorcery] Comet Azur"), - (4210,"[Sorcery] Founding Rain of Stars"), - (4220,"[Sorcery] Stars of Ruin"), - (4300,"[Sorcery] Glintblade Phalanx"), - (4301,"[Sorcery] Carian Phalanx"), - (4302,"[Sorcery] Greatblade Phalanx"), - (4360,"[Sorcery] Rennala's Full Moon"), - (4361,"[Sorcery] Ranni's Dark Moon"), - (4370,"[Sorcery] Magic Downpour"), - (4380,"[Sorcery] Loretta's Greatbow"), - (4381,"[Sorcery] Loretta's Mastery"), - (4390,"[Sorcery] Magic Glintblade"), - (4400,"[Sorcery] Glintstone Icecrag"), - (4410,"[Sorcery] Zamor Ice Storm"), - (4420,"[Sorcery] Freezing Mist"), - (4430,"[Sorcery] Carian Greatsword"), - (4431,"[Sorcery] Adula's Moonblade"), - (4440,"[Sorcery] Carian Slicer"), - (4450,"[Sorcery] Carian Piercer"), - (4460,"[Sorcery] Scholar's Armament"), - (4470,"[Sorcery] Scholar's Shield"), - (4480,"[Sorcery] Lucidity"), - (4490,"[Sorcery] Frozen Armament"), - (4500,"[Sorcery] Shattering Crystal"), - (4510,"[Sorcery] Crystal Release"), - (4520,"[Sorcery] Crystal Torrent"), - (4600,"[Sorcery] Ambush Shard"), - (4610,"[Sorcery] Night Shard"), - (4620,"[Sorcery] Night Comet"), - (4630,"[Sorcery] Thops's Barrier"), - (4640,"[Sorcery] Carian Retaliation"), - (4650,"[Sorcery] Eternal Darkness"), - (4660,"[Sorcery] Unseen Blade"), - (4670,"[Sorcery] Unseen Form"), - (4700,"[Sorcery] Meteorite"), - (4701,"[Sorcery] Meteorite of Astel"), - (4710,"[Sorcery] Rock Sling"), - (4720,"[Sorcery] Gravity Well"), - (4721,"[Sorcery] Collapsing Stars"), - (4800,"[Sorcery] Magma Shot"), - (4810,"[Sorcery] Gelmir's Fury"), - (4820,"[Sorcery] Roiling Magma"), - (4830,"[Sorcery] Rykard's Rancor"), - (4900,"[Sorcery] Briars of Sin"), - (4910,"[Sorcery] Briars of Punishment"), - (5000,"[Sorcery] Rancorcall"), - (5001,"[Sorcery] Ancient Death Rancor"), - (5010,"[Sorcery] Explosive Ghostflame"), - (5020,"[Sorcery] Fia's Mist"), - (5030,"[Sorcery] Tibia's Summons"), - (5040,"[Sorcery] Death Lightning"), - (5100,"[Sorcery] Oracle Bubbles"), - (5110,"[Sorcery] Great Oracular Bubble"), - (6000,"[Incantation] Catch Flame"), - (6001,"[Incantation] O- Flame!"), - (6010,"[Incantation] Flame Sling"), - (6020,"[Incantation] Flame- Fall Upon Them"), - (6030,"[Incantation] Whirl- O Flame!"), - (6040,"[Incantation] Flame- Cleanse Me"), - (6050,"[Incantation] Flame- Grant Me Strength"), - (6060,"[Incantation] Flame- Protect Me"), - (6100,"[Incantation] Giantsflame Take Thee"), - (6110,"[Incantation] Flame of the Fell God"), - (6120,"[Incantation] Burn- O Flame!"), - (6210,"[Incantation] Black Flame"), - (6220,"[Incantation] Surge- O Flame!"), - (6230,"[Incantation] Scouring Black Flame"), - (6240,"[Incantation] Black Flame Ritual"), - (6250,"[Incantation] Black Flame Blade"), - (6260,"[Incantation] Black Flame's Protection"), - (6270,"[Incantation] Noble Presence"), - (6300,"[Incantation] Bloodflame Talons"), - (6310,"[Incantation] Bloodboon"), - (6320,"[Incantation] Bloodflame Blade"), - (6330,"[Incantation] Barrier of Gold"), - (6340,"[Incantation] Protection of the Erdtree"), - (6400,"[Incantation] Rejection"), - (6410,"[Incantation] Wrath of Gold"), - (6420,"[Incantation] Urgent Heal"), - (6421,"[Incantation] Heal"), - (6422,"[Incantation] Great Heal"), - (6423,"[Incantation] Lord's Heal"), - (6424,"[Incantation] Erdtree Heal"), - (6430,"[Incantation] Blessing's Boon"), - (6431,"[Incantation] Blessing of the Erdtree"), - (6440,"[Incantation] Cure Poison"), - (6441,"[Incantation] Lord's Aid"), - (6450,"[Incantation] Flame Fortification"), - (6460,"[Incantation] Magic Fortification"), - (6470,"[Incantation] Lightning Fortification"), - (6480,"[Incantation] Divine Fortification"), - (6490,"[Incantation] Lord's Divine Fortification"), - (6500,"[Incantation] Night Maiden's Mist"), - (6510,"[Incantation] Assassin's Approach"), - (6520,"[Incantation] Shadow Bait"), - (6530,"[Incantation] Darkness"), - (6600,"[Incantation] Golden Vow"), - (6700,"[Incantation] Discus of Light"), - (6701,"[Incantation] Triple Rings of Light"), - (6710,"[Incantation] Radagon's Rings of Light"), - (6720,"[Incantation] Elden Stars"), - (6730,"[Incantation] Law of Regression"), - (6740,"[Incantation] Immutable Shield"), - (6750,"[Incantation] Litany of Proper Death"), - (6760,"[Incantation] Law of Causality"), - (6770,"[Incantation] Order's Blade"), - (6780,"[Incantation] Order Healing"), - (6800,"[Incantation] Bestial Sling"), - (6810,"[Incantation] Stone of Gurranq"), - (6820,"[Incantation] Beast Claw"), - (6830,"[Incantation] Gurranq's Beast Claw"), - (6840,"[Incantation] Bestial Vitality"), - (6850,"[Incantation] Bestial Constitution"), - (6900,"[Incantation] Lightning Spear"), - (6910,"[Incantation] Ancient Dragons' Lightning Strike"), - (6920,"[Incantation] Lightning Strike"), - (6921,"[Incantation] Frozen Lightning Spear"), - (6930,"[Incantation] Honed Bolt"), - (6940,"[Incantation] Ancient Dragons' Lightning Spear"), - (6941,"[Incantation] Fortissax's Lightning Spear"), - (6950,"[Incantation] Lansseax's Glaive"), - (6960,"[Incantation] Electrify Armament"), - (6970,"[Incantation] Vyke's Dragonbolt"), - (6971,"[Incantation] Dragonbolt Blessing"), - (7000,"[Incantation] Dragonfire"), - (7001,"[Incantation] Agheel's Flame"), - (7010,"[Incantation] Magma Breath"), - (7011,"[Incantation] Theodorix's Magma"), - (7020,"[Incantation] Dragonice"), - (7021,"[Incantation] Borealis's Mist"), - (7030,"[Incantation] Rotten Breath"), - (7031,"[Incantation] Ekzykes's Decay"), - (7040,"[Incantation] Glintstone Breath"), - (7041,"[Incantation] Smarag's Glintstone Breath"), - (7050,"[Incantation] Placidusax's Ruin"), - (7060,"[Incantation] Dragonclaw"), - (7080,"[Incantation] Dragonmaw"), - (7090,"[Incantation] Greyoll's Roar"), - (7200,"[Incantation] Pest Threads"), - (7210,"[Incantation] Swarm of Flies"), - (7220,"[Incantation] Poison Mist"), - (7230,"[Incantation] Poison Armament"), - (7240,"[Incantation] Scarlet Aeonia"), - (7300,"[Incantation] Inescapable Frenzy"), - (7310,"[Incantation] The Flame of Frenzy"), - (7311,"[Incantation] Unendurable Frenzy"), - (7320,"[Incantation] Frenzied Burst"), - (7330,"[Incantation] Howl of Shabriri"), - (7500,"[Incantation] Aspects of the Crucible: Tail"), - (7510,"[Incantation] Aspects of the Crucible: Horns"), - (7520,"[Incantation] Aspects of the Crucible: Breath"), - (7530,"[Incantation] Black Blade"), - (7900,"[Incantation] Fire's Deadly Sin"), - (7903,"[Incantation] Golden Lightning Fortification"), - (8000,"Stonesword Key"), - (8010,"Rusty Key"), - (8102,"Lucent Baldachin's Blessing"), - (8105,"Dectus Medallion (Left)"), - (8106,"Dectus Medallion (Right)"), - (8107,"Rold Medallion"), - (8109,"Academy Glintstone Key"), - (8111,"Carian Inverted Statue"), - (8121,"Dark Moon Ring"), - (8126,"Fingerprint Grape"), - (8127,"Letter from Volcano Manor"), - (8128,"Tonic of Forgetfulness"), - (8129,"Serpent's Amnion"), - (8130,"Rya's Necklace"), - (8131,"Irina's Letter"), - (8132,"Letter from Volcano Manor"), - (8133,"Red Letter"), - (8134,"Drawing-Room Key"), - (8136,"Rya's Necklace"), - (8137,"Volcano Manor Invitation"), - (8142,"Amber Starlight"), - (8143,"Seluvis's Introduction"), - (8144,"Sellen's Primal Glintstone"), - (8146,"Miniature Ranni"), - (8147,"Asimi- Silver Tear"), - (8148,"Godrick's Great Rune"), - (8149,"Radahn's Great Rune"), - (8150,"Morgott's Great Rune"), - (8151,"Rykard's Great Rune"), - (8152,"Mohg's Great Rune"), - (8153,"Malenia's Great Rune"), - (8154,"Lord of Blood's Favor"), - (8155,"Lord of Blood's Favor"), - (8156,"Burial Crow's Letter"), - (8158,"Spirit Calling Bell"), - (8159,"Fingerslayer Blade"), - (8161,"Sewing Needle"), - (8162,"Gold Sewing Needle"), - (8163,"Tailoring Tools"), - (8164,"Seluvis's Potion"), - (8165,""), - (8166,"Amber Draught"), - (8167,"Letter to Patches"), - (8168,"Dancer's Castanets"), - (8169,"Sellian Sealbreaker"), - (8171,"Chrysalids' Memento"), - (8172,"Black Knifeprint"), - (8173,"Letter to Bernahl"), - (8174,"Academy Glintstone Key"), - (8175,"Haligtree Secret Medallion (Left)"), - (8176,"Haligtree Secret Medallion (Right)"), - (8181,"Burial Crow's Letter"), - (8182,"Mending Rune of Perfect Order"), - (8183,"Mending Rune of the Death-Prince"), - (8184,"Mending Rune of the Fell Curse"), - (8185,"Larval Tear"), - (8186,"Imbued Sword Key"), - (8187,"Miniature Ranni"), - (8188,"Golden Tailoring Tools"), - (8189,"Iji's Confession"), - (8190,"Knifeprint Clue"), - (8191,"Cursemark of Death"), - (8192,"Asimi's Husk"), - (8193,"Seedbed Curse"), - (8194,"The Stormhawk King"), - (8195,"Asimi- Silver Chrysalid"), - (8196,"Unalloyed Gold Needle"), - (8197,"Sewer-Gaol Key"), - (8198,"Meeting Place Map"), - (8199,"Discarded Palace Key"), - (8200,"'Homing Instinct' Painting"), - (8201,"'Resurrection' Painting"), - (8202,"'Champion's Song' Painting"), - (8203,"'Sorcerer' Painting"), - (8204,"'Prophecy' Painting"), - (8205,"'Flightless Bird' Painting"), - (8206,"'Redmane' Painting"), - (8221,"Zorayas's Letter"), - (8222,"Alexander's Innards"), - (8223,"Rogier's Letter"), - (8224,"Note: The Preceptor's Secrets"), - (8225,"Weathered Map"), - (8226,"Note: The Preceptor's Secret"), - (8227,"Weathered Map"), - (8500,"Crafting Kit"), - (8590,"Whetstone Knife"), - (8600,"Map: Limgrave- West"), - (8601,"Map: Weeping Peninsula"), - (8602,"Map: Limgrave- East"), - (8603,"Map: Liurnia- East"), - (8604,"Map: Liurnia- North"), - (8605,"Map: Liurnia- West"), - (8606,"Map: Altus Plateau"), - (8607,"Map: Leyndell- Royal Capital"), - (8608,"Map: Mt. Gelmir"), - (8609,"Map: Caelid"), - (8610,"Map: Dragonbarrow"), - (8611,"Map: Mountaintops of the Giants- West"), - (8612,"Map: Mountaintops of the Giants- East"), - (8613,"Map: Ainsel River"), - (8614,"Map: Lake of Rot"), - (8615,"Map: Siofra River"), - (8616,"Map: Mohgwyn Palace"), - (8617,"Map: Deeproot Depths"), - (8618,"Map: Consecrated Snowfield"), - (8660,"Mirage Riddle"), - (8700,"Note: Hidden Cave"), - (8701,"Note: Imp Shades"), - (8702,"Note: Flask of Wondrous Physick"), - (8703,"Note: Stonedigger Trolls"), - (8704,"Note: Walking Mausoleum"), - (8705,"Note: Unseen Assassins"), - (8706,"Note: Great Coffins"), - (8707,"Note: Flame Chariots"), - (8708,"Note: Demi-human Mobs"), - (8709,"Note: Land Squirts"), - (8710,"Note: Gravity's Advantage"), - (8711,"Note: Revenants"), - (8712,"Note: Waypoint Ruins"), - (8713,"Note: Gateway"), - (8714,"Note: Miquella's Needle"), - (8715,"Note: Frenzied Flame Village"), - (8716,"Note: The Lord of Frenzied Flame"), - (8717,"Note: Below the Capital"), - (8750,"Note: Hidden Cave"), - (8751,"Note: Imp Shades"), - (8752,"Note: Flask of Wondrous Physick"), - (8753,"Note: Stonedigger Trolls"), - (8754,"Note: Walking Mausoleum"), - (8755,"Note: Unseen Assassins"), - (8756,"Note: Great Coffins"), - (8757,"Note: Flame Chariots"), - (8758,"Note: Demi-human Mobs"), - (8759,"Note: Land Squirts"), - (8760,"Note: Gravity's Advantage"), - (8761,"Note: Revenants"), - (8762,"Note: Waypoint Ruins"), - (8763,"Note: Gateway"), - (8765,"Note: Frenzied Flame Village"), - (8767,"Note: Below the Capital"), - (8850,"Conspectus Scroll"), - (8851,"Royal House Scroll"), - (8852,""), - (8853,""), - (8854,""), - (8855,"Fire Monks' Prayerbook"), - (8856,"Giant's Prayerbook"), - (8857,"Godskin Prayerbook"), - (8858,"Two Fingers' Prayerbook"), - (8859,"Assassin's Prayerbook"), - (8860,"Erdtree Prayerbook"), - (8861,"Erdtree Codex"), - (8862,"Golden Order Principia"), - (8863,"Golden Order Principles"), - (8864,"Dragon Cult Prayerbook"), - (8865,"Ancient Dragon Prayerbook"), - (8866,"Academy Scroll"), - (8910,"Pidia's Bell Bearing"), - (8911,"Seluvis's Bell Bearing"), - (8912,"Patches' Bell Bearing"), - (8913,"Sellen's Bell Bearing"), - (8914,""), - (8915,"D's Bell Bearing"), - (8916,"Bernahl's Bell Bearing"), - (8917,"Miriel's Bell Bearing"), - (8918,"Gostoc's Bell Bearing"), - (8919,"Thops's Bell Bearing"), - (8920,"Kalé's Bell Bearing"), - (8921,"Nomadic Merchant's Bell Bearing [1]"), - (8922,"Nomadic Merchant's Bell Bearing [2]"), - (8923,"Nomadic Merchant's Bell Bearing [3]"), - (8924,"Nomadic Merchant's Bell Bearing [4]"), - (8925,"Nomadic Merchant's Bell Bearing [5]"), - (8926,"Isolated Merchant's Bell Bearing [1]"), - (8927,"Isolated Merchant's Bell Bearing [2]"), - (8928,"Nomadic Merchant's Bell Bearing [6]"), - (8929,"Hermit Merchant's Bell Bearing [1]"), - (8930,"Nomadic Merchant's Bell Bearing [7]"), - (8931,"Nomadic Merchant's Bell Bearing [8]"), - (8932,"Nomadic Merchant's Bell Bearing [9]"), - (8933,"Nomadic Merchant's Bell Bearing [10]"), - (8934,"Nomadic Merchant's Bell Bearing [11]"), - (8935,"Isolated Merchant's Bell Bearing [3]"), - (8936,"Hermit Merchant's Bell Bearing [2]"), - (8937,"Abandoned Merchant's Bell Bearing"), - (8938,"Hermit Merchant's Bell Bearing [3]"), - (8939,"Imprisoned Merchant's Bell Bearing"), - (8940,"Iji's Bell Bearing"), - (8941,"Rogier's Bell Bearing"), - (8942,"Blackguard's Bell Bearing"), - (8943,"Corhyn's Bell Bearing"), - (8944,"Gowry's Bell Bearing"), - (8945,"Bone Peddler's Bell Bearing"), - (8946,"Meat Peddler's Bell Bearing"), - (8947,"Medicine Peddler's Bell Bearing"), - (8948,"Gravity Stone Peddler's Bell Bearing"), - (8949,""), - (8950,""), - (8951,"Smithing-Stone Miner's Bell Bearing [1]"), - (8952,"Smithing-Stone Miner's Bell Bearing [2]"), - (8953,"Smithing-Stone Miner's Bell Bearing [3]"), - (8954,"Smithing-Stone Miner's Bell Bearing [4]"), - (8955,"Somberstone Miner's Bell Bearing [1]"), - (8956,"Somberstone Miner's Bell Bearing [2]"), - (8957,"Somberstone Miner's Bell Bearing [3]"), - (8958,"Somberstone Miner's Bell Bearing [4]"), - (8959,"Somberstone Miner's Bell Bearing [5]"), - (8960,"Glovewort Picker's Bell Bearing [1]"), - (8961,"Glovewort Picker's Bell Bearing [2]"), - (8962,"Glovewort Picker's Bell Bearing [3]"), - (8963,"Ghost-Glovewort Picker's Bell Bearing [1]"), - (8964,"Ghost-Glovewort Picker's Bell Bearing [2]"), - (8965,"Ghost-Glovewort Picker's Bell Bearing [3]"), - (8970,"Iron Whetblade"), - (8971,"Red-Hot Whetblade"), - (8972,"Sanctified Whetblade"), - (8973,"Glintstone Whetblade"), - (8974,"Black Whetblade"), - (8975,"Unalloyed Gold Needle"), - (8976,"Unalloyed Gold Needle"), - (8977,"Valkyrie's Prosthesis"), - (8978,"Sellia's Secret"), - (8979,"Beast Eye"), - (8980,"Weathered Dagger"), - (9000,"Bow"), - (9001,"Polite Bow"), - (9002,"My Thanks"), - (9003,"Curtsy"), - (9004,"Reverential Bow"), - (9005,"My Lord"), - (9006,"Warm Welcome"), - (9007,"Wave"), - (9008,"Casual Greeting"), - (9009,"Strength!"), - (9010,"As You Wish"), - (9011,"Point Forwards"), - (9012,"Point Upwards"), - (9013,"Point Downwards"), - (9014,"Beckon"), - (9015,"Wait!"), - (9016,"Calm Down!"), - (9017,"Nod In Thought"), - (9018,"Extreme Repentance"), - (9019,"Grovel For Mercy"), - (9020,"Rallying Cry"), - (9021,"Heartening Cry"), - (9022,"By My Sword"), - (9023,"Hoslow's Oath"), - (9024,"Fire Spur Me"), - (9026,"Bravo!"), - (9027,"Jump for Joy"), - (9028,"Triumphant Delight"), - (9029,"Fancy Spin"), - (9030,"Finger Snap"), - (9031,"Dejection"), - (9032,"Patches' Crouch"), - (9033,"Crossed Legs"), - (9034,"Rest"), - (9035,"Sitting Sideways"), - (9036,"Dozing Cross-Legged"), - (9037,"Spread Out"), - (9039,"Balled Up"), - (9040,"What Do You Want?"), - (9041,"Prayer"), - (9042,"Desperate Prayer"), - (9043,"Rapture"), - (9045,"Erudition"), - (9046,"Outer Order"), - (9047,"Inner Order"), - (9048,"Golden Order Totality"), - (9049,"The Ring"), - (9050,"The Ring"), - (9100,"About Sites of Grace"), - (9101,"About Sorceries and Incantations"), - (9102,"About Bows"), - (9103,"About Crouching"), - (9104,"About Stance-Breaking"), - (9105,"About Stakes of Marika"), - (9106,"About Guard Counters"), - (9107,"About the Map"), - (9108,"About Guidance of Grace"), - (9109,"About Horseback Riding"), - (9110,"About Death"), - (9111,"About Summoning Spirits"), - (9112,"About Guarding"), - (9113,"About Item Crafting"), - (9115,"About Flask of Wondrous Physick"), - (9116,"About Adding Skills"), - (9117,"About Birdseye Telescopes"), - (9118,"About Spiritspring Jumping"), - (9119,"About Vanquishing Enemy Groups"), - (9120,"About Teardrop Scarabs"), - (9121,"About Summoning Other Players"), - (9122,"About Cooperative Multiplayer"), - (9123,"About Competitive Multiplayer"), - (9124,"About Invasion Multiplayer"), - (9125,"About Hunter Multiplayer"), - (9126,"About Summoning Pools"), - (9127,"About Monument Icon"), - (9128,"About Requesting Help from Hunters"), - (9129,"About Skills"), - (9130,"About Fast Travel to Sites of Grace"), - (9131,"About Strengthening Armaments"), - (9132,"About Roundtable Hold"), - (9134,"About Materials"), - (9135,"About Containers"), - (9136,"About Adding Affinities"), - (9137,"About Pouches"), - (9138,"About Dodging"), - (9140,"About Wielding Armaments"), - (9141,"About Great Runes"), - (9142,""), - (9150,""), - (9151,""), - (9152,""), - (9153,""), - (9195,"About Multiplayer"), - (9300,"Nomadic Warrior's Cookbook [1]"), - (9301,"Nomadic Warrior's Cookbook [3]"), - (9302,"Nomadic Warrior's Cookbook [6]"), - (9303,"Nomadic Warrior's Cookbook [10]"), - (9304,"Fugitive Warrior's Recipe [5]"), - (9305,"Nomadic Warrior's Cookbook [7]"), - (9306,"Nomadic Warrior's Cookbook [12]"), - (9307,"Nomadic Warrior's Cookbook [19]"), - (9308,"Nomadic Warrior's Cookbook [13]"), - (9309,"Nomadic Warrior's Cookbook [23]"), - (9310,"Nomadic Warrior's Cookbook [17]"), - (9311,"Nomadic Warrior's Cookbook [2]"), - (9312,"Nomadic Warrior's Cookbook [21]"), - (9313,"Missionary's Cookbook [6]"), - (9314,""), - (9315,""), - (9316,""), - (9317,""), - (9318,""), - (9319,""), - (9320,"Armorer's Cookbook [1]"), - (9321,"Armorer's Cookbook [2]"), - (9322,"Nomadic Warrior's Cookbook [11]"), - (9323,"Nomadic Warrior's Cookbook [20]"), - (9324,"Armorer's Cookbook (5)"), - (9325,"Armorer's Cookbook [7]"), - (9326,"Armorer's Cookbook [4]"), - (9327,"Nomadic Warrior's Cookbook [18]"), - (9328,"Armorer's Cookbook [3]"), - (9329,"Nomadic Warrior's Cookbook [16]"), - (9330,"Armorer's Cookbook [6]"), - (9331,"Armorer's Cookbook [5]"), - (9332,""), - (9333,""), - (9334,""), - (9335,""), - (9336,""), - (9337,""), - (9338,""), - (9339,""), - (9340,"Glintstone Craftsman's Cookbook [4]"), - (9341,"Glintstone Craftsman's Cookbook [1]"), - (9342,"Glintstone Craftsman's Cookbook [5]"), - (9343,"Nomadic Warrior's Cookbook [9]"), - (9344,"Glintstone Craftsman's Cookbook [8]"), - (9345,"Glintstone Craftsman's Cookbook [2]"), - (9346,"Glintstone Craftsman's Cookbook [6]"), - (9347,"Glintstone Craftsman's Cookbook [7]"), - (9348,"Glintstone Craftsman's Cookbook [3]"), - (9349,""), - (9350,""), - (9351,""), - (9352,""), - (9353,""), - (9354,""), - (9355,""), - (9356,""), - (9357,""), - (9358,""), - (9359,""), - (9360,"Missionary's Cookbook [2]"), - (9361,"Missionary's Cookbook [1]"), - (9362,"Missionary's Cookbook (3)"), - (9363,"Missionary's Cookbook [5]"), - (9364,"Missionary's Cookbook [4]"), - (9365,"Missionary's Cookbook [3]"), - (9366,""), - (9367,""), - (9368,""), - (9369,""), - (9370,""), - (9380,"Nomadic Warrior's Cookbook [4]"), - (9381,"Perfumer's Cookbook (1)"), - (9382,"Perfumer's Cookbook (2)"), - (9383,"Nomadic Warrior's Cookbook [5]"), - (9384,"Perfumer's Cookbook [1]"), - (9385,"Perfumer's Cookbook [2]"), - (9386,"Perfumer's Cookbook [3]"), - (9387,"Nomadic Warrior's Cookbook [14]"), - (9388,"Nomadic Warrior's Cookbook [8]"), - (9389,"Nomadic Warrior's Cookbook [22]"), - (9390,"Nomadic Warrior's Cookbook [15]"), - (9391,"Nomadic Warrior's Cookbook [24]"), - (9392,"Perfumer's Cookbook [4]"), - (9393,"Perfumer's Cookbook (13)"), - (9394,""), - (9395,""), - (9396,""), - (9397,""), - (9398,""), - (9399,""), - (9400,"Ancient Dragon Apostle's Cookbook [1]"), - (9401,"Ancient Dragon Apostle's Cookbook [2]"), - (9402,"Ancient Dragon Apostle's Cookbook [4]"), - (9403,"Ancient Dragon Apostle's Cookbook [3]"), - (9404,""), - (9405,""), - (9406,""), - (9407,""), - (9408,""), - (9409,""), - (9410,""), - (9420,"Fevor's Cookbook [1]"), - (9421,"Fevor's Cookbook [3]"), - (9422,"Fevor's Cookbook [2]"), - (9423,"Missionary's Cookbook [7]"), - (9424,""), - (9425,""), - (9426,""), - (9427,""), - (9428,""), - (9429,""), - (9430,""), - (9440,"Frenzied's Cookbook [1]"), - (9441,"Frenzied's Cookbook [2]"), - (9442,""), - (9443,""), - (9444,""), - (9445,""), - (9446,""), - (9447,""), - (9448,""), - (9449,""), - (9450,""), - (9500,"Cracked Pot"), - (9501,"Ritual Pot"), - (9510,"Perfume Bottle"), - (10000,"Glass Shard"), - (10010,"Golden Seed"), - (10020,"Sacred Tear"), - (10030,"Memory Stone"), - (10040,"Talisman Pouch"), - (10060,"Dragon Heart"), - (10070,"Lost Ashes of War"), - (10080,"Great Rune of the Unborn"), - (10100,"Smithing Stone [1]"), - (10101,"Smithing Stone [2]"), - (10102,"Smithing Stone [3]"), - (10103,"Smithing Stone [4]"), - (10104,"Smithing Stone [5]"), - (10105,"Smithing Stone [6]"), - (10106,"Smithing Stone [7]"), - (10107,"Smithing Stone [8]"), - (10140,"Ancient Dragon Smithing Stone"), - (10160,"Somber Smithing Stone [1]"), - (10161,"Somber Smithing Stone [2]"), - (10162,"Somber Smithing Stone [3]"), - (10163,"Somber Smithing Stone [4]"), - (10164,"Somber Smithing Stone [5]"), - (10165,"Somber Smithing Stone [6]"), - (10166,"Somber Smithing Stone [7]"), - (10167,"Somber Smithing Stone [8]"), - (10168,"Somber Ancient Dragon Smithing Stone"), - (10200,"Somber Smithing Stone [9]"), - (10900,"Grave Glovewort [1]"), - (10901,"Grave Glovewort [2]"), - (10902,"Grave Glovewort [3]"), - (10903,"Grave Glovewort [4]"), - (10904,"Grave Glovewort [5]"), - (10905,"Grave Glovewort [6]"), - (10906,"Grave Glovewort [7]"), - (10907,"Grave Glovewort [8]"), - (10908,"Grave Glovewort [9]"), - (10909,"Great Grave Glovewort"), - (10910,"Ghost Glovewort [1]"), - (10911,"Ghost Glovewort [2]"), - (10912,"Ghost Glovewort [3]"), - (10913,"Ghost Glovewort [4]"), - (10914,"Ghost Glovewort [5]"), - (10915,"Ghost Glovewort [6]"), - (10916,"Ghost Glovewort [7]"), - (10917,"Ghost Glovewort [8]"), - (10918,"Ghost Glovewort [9]"), - (10919,"Great Ghost Glovewort"), - (11000,"Crimsonspill Crystal Tear"), - (11001,"Greenspill Crystal Tear"), - (11002,"Crimson Crystal Tear"), - (11003,"Crimson Crystal Tear"), - (11004,"Cerulean Crystal Tear"), - (11005,"Cerulean Crystal Tear"), - (11006,"Speckled Hardtear"), - (11007,"Crimson Bubbletear"), - (11008,"Opaline Bubbletear"), - (11009,"Crimsonburst Crystal Tear"), - (11010,"Greenburst Crystal Tear"), - (11011,"Opaline Hardtear"), - (11012,"Winged Crystal Tear"), - (11013,"Thorny Cracked Tear"), - (11014,"Spiked Cracked Tear"), - (11015,"Windy Crystal Tear"), - (11016,"Ruptured Crystal Tear"), - (11017,"Ruptured Crystal Tear"), - (11018,"Leaden Hardtear"), - (11019,"Twiggy Cracked Tear"), - (11020,"Crimsonwhorl Bubbletear"), - (11021,"Strength-knot Crystal Tear"), - (11022,"Dexterity-knot Crystal Tear"), - (11023,"Intelligence-knot Crystal Tear"), - (11024,"Faith-knot Crystal Tear"), - (11025,"Cerulean Hidden Tear"), - (11026,"Stonebarb Cracked Tear"), - (11027,"Purifying Crystal Tear"), - (11028,"Flame-Shrouding Cracked Tear"), - (11029,"Magic-Shrouding Cracked Tear"), - (11030,"Lightning-Shrouding Cracked Tear"), - (11031,"Holy-Shrouding Cracked Tear"), - (15000,"Sliver of Meat"), - (15010,"Beast Liver"), - (15020,"Lump of Flesh"), - (15030,"Beast Blood"), - (15040,"Old Fang"), - (15050,"Budding Horn"), - (15060,"Flight Pinion"), - (15080,"Four-Toed Fowl Foot"), - (15090,"Turtle Neck Meat"), - (15100,"Human Bone Shard"), - (15110,"Great Dragonfly Head"), - (15120,"Slumbering Egg"), - (15130,"Crab Eggs"), - (15140,"Land Octopus Ovary"), - (15150,"Miranda Powder"), - (15160,"Strip of White Flesh"), - (15340,"Thin Beast Bones"), - (15341,"Hefty Beast Bone"), - (15400,"String"), - (15410,"Living Jar Shard"), - (15420,"Albinauric Bloodclot"), - (15430,"Stormhawk Feather"), - (20650,"Poisonbloom"), - (20651,"Trina's Lily"), - (20652,"Fulgurbloom"), - (20653,"Miquella's Lily"), - (20654,"Grave Violet"), - (20660,"Faded Erdleaf Flower"), - (20680,"Erdleaf Flower"), - (20681,"Altus Bloom"), - (20682,"Fire Blossom"), - (20683,"Golden Sunflower"), - (20685,"Tarnished Golden Sunflower"), - (20690,"Herba"), - (20691,"Arteria Leaf"), - (20710,"Dewkissed Herba"), - (20720,"Rowa Fruit"), - (20721,"Golden Rowa"), - (20722,"Rimed Rowa"), - (20723,"Bloodrose"), - (20740,"Eye of Yelough"), - (20750,"Crystal Bud"), - (20751,"Rimed Crystal Bud"), - (20753,"Sacramental Bud"), - (20760,"Mushroom"), - (20761,"Melted Mushroom"), - (20770,"Toxic Mushroom"), - (20775,"Root Resin"), - (20780,"Cracked Crystal"), - (20795,"Sanctuary Stone"), - (20800,"Nascent Butterfly"), - (20801,"Aeonian Butterfly"), - (20802,"Smoldering Butterfly"), - (20810,"Silver Firefly"), - (20811,"Gold Firefly"), - (20812,"Glintstone Firefly"), - (20820,"Golden Centipede"), - (20825,"Silver Tear Husk"), - (20830,"Gold-Tinged Excrement"), - (20831,"Blood-Tainted Excrement"), - (20840,"Cave Moss"), - (20841,"Budding Cave Moss"), - (20842,"Crystal Cave Moss"), - (20845,"Yellow Ember"), - (20850,"Volcanic Stone"), - (20852,"Formic Rock"), - (20855,"Gravel Stone"), - (50200,""), - (50201,""), - (50202,""), - (50203,""), - (51760,""), - (53090,""), - (53230,""), - (53400,""), - (53630,""), - (53650,""), - (53651,""), - (53652,""), - (53653,""), - (53654,""), - (53655,""), - (53656,""), - (53657,""), - (53658,""), - (200000,"Black Knife Tiche"), - (200001,"Black Knife Tiche +1"), - (200002,"Black Knife Tiche +2"), - (200003,"Black Knife Tiche +3"), - (200004,"Black Knife Tiche +4"), - (200005,"Black Knife Tiche +5"), - (200006,"Black Knife Tiche +6"), - (200007,"Black Knife Tiche +7"), - (200008,"Black Knife Tiche +8"), - (200009,"Black Knife Tiche +9"), - (200010,"Black Knife Tiche +10"), - (201000,"Banished Knight Oleg"), - (201001,"Banished Knight Oleg +1"), - (201002,"Banished Knight Oleg +2"), - (201003,"Banished Knight Oleg +3"), - (201004,"Banished Knight Oleg +4"), - (201005,"Banished Knight Oleg +5"), - (201006,"Banished Knight Oleg +6"), - (201007,"Banished Knight Oleg +7"), - (201008,"Banished Knight Oleg +8"), - (201009,"Banished Knight Oleg +9"), - (201010,"Banished Knight Oleg +10"), - (202000,"Banished Knight Engvall"), - (202001,"Banished Knight Engvall +1"), - (202002,"Banished Knight Engvall +2"), - (202003,"Banished Knight Engvall +3"), - (202004,"Banished Knight Engvall +4"), - (202005,"Banished Knight Engvall +5"), - (202006,"Banished Knight Engvall +6"), - (202007,"Banished Knight Engvall +7"), - (202008,"Banished Knight Engvall +8"), - (202009,"Banished Knight Engvall +9"), - (202010,"Banished Knight Engvall +10"), - (203000,"Fanged Imp Ashes"), - (203001,"Fanged Imp Ashes +1"), - (203002,"Fanged Imp Ashes +2"), - (203003,"Fanged Imp Ashes +3"), - (203004,"Fanged Imp Ashes +4"), - (203005,"Fanged Imp Ashes +5"), - (203006,"Fanged Imp Ashes +6"), - (203007,"Fanged Imp Ashes +7"), - (203008,"Fanged Imp Ashes +8"), - (203009,"Fanged Imp Ashes +9"), - (203010,"Fanged Imp Ashes +10"), - (204000,"Latenna the Albinauric"), - (204001,"Latenna the Albinauric +1"), - (204002,"Latenna the Albinauric +2"), - (204003,"Latenna the Albinauric +3"), - (204004,"Latenna the Albinauric +4"), - (204005,"Latenna the Albinauric +5"), - (204006,"Latenna the Albinauric +6"), - (204007,"Latenna the Albinauric +7"), - (204008,"Latenna the Albinauric +8"), - (204009,"Latenna the Albinauric +9"), - (204010,"Latenna the Albinauric +10"), - (205000,"Nomad Ashes"), - (205001,"Nomad Ashes +1"), - (205002,"Nomad Ashes +2"), - (205003,"Nomad Ashes +3"), - (205004,"Nomad Ashes +4"), - (205005,"Nomad Ashes +5"), - (205006,"Nomad Ashes +6"), - (205007,"Nomad Ashes +7"), - (205008,"Nomad Ashes +8"), - (205009,"Nomad Ashes +9"), - (205010,"Nomad Ashes +10"), - (206000,"Nightmaiden & Swordstress Puppets"), - (206001,"Nightmaiden & Swordstress Puppets +1"), - (206002,"Nightmaiden & Swordstress Puppets +2"), - (206003,"Nightmaiden & Swordstress Puppets +3"), - (206004,"Nightmaiden & Swordstress Puppets +4"), - (206005,"Nightmaiden & Swordstress Puppets +5"), - (206006,"Nightmaiden & Swordstress Puppets +6"), - (206007,"Nightmaiden & Swordstress Puppets +7"), - (206008,"Nightmaiden & Swordstress Puppets +8"), - (206009,"Nightmaiden & Swordstress Puppets +9"), - (206010,"Nightmaiden & Swordstress Puppets +10"), - (207000,"Mimic Tear Ashes"), - (207001,"Mimic Tear Ashes +1"), - (207002,"Mimic Tear Ashes +2"), - (207003,"Mimic Tear Ashes +3"), - (207004,"Mimic Tear Ashes +4"), - (207005,"Mimic Tear Ashes +5"), - (207006,"Mimic Tear Ashes +6"), - (207007,"Mimic Tear Ashes +7"), - (207008,"Mimic Tear Ashes +8"), - (207009,"Mimic Tear Ashes +9"), - (207010,"Mimic Tear Ashes +10"), - (208000,"Crystalian Ashes"), - (208001,"Crystalian Ashes +1"), - (208002,"Crystalian Ashes +2"), - (208003,"Crystalian Ashes +3"), - (208004,"Crystalian Ashes +4"), - (208005,"Crystalian Ashes +5"), - (208006,"Crystalian Ashes +6"), - (208007,"Crystalian Ashes +7"), - (208008,"Crystalian Ashes +8"), - (208009,"Crystalian Ashes +9"), - (208010,"Crystalian Ashes +10"), - (209000,"Ancestral Follower Ashes"), - (209001,"Ancestral Follower Ashes +1"), - (209002,"Ancestral Follower Ashes +2"), - (209003,"Ancestral Follower Ashes +3"), - (209004,"Ancestral Follower Ashes +4"), - (209005,"Ancestral Follower Ashes +5"), - (209006,"Ancestral Follower Ashes +6"), - (209007,"Ancestral Follower Ashes +7"), - (209008,"Ancestral Follower Ashes +8"), - (209009,"Ancestral Follower Ashes +9"), - (209010,"Ancestral Follower Ashes +10"), - (210000,"Winged Misbegotten Ashes"), - (210001,"Winged Misbegotten Ashes + 1"), - (210002,"Winged Misbegotten Ashes + 2"), - (210003,"Winged Misbegotten Ashes + 3"), - (210004,"Winged Misbegotten Ashes + 4"), - (210005,"Winged Misbegotten Ashes + 5"), - (210006,"Winged Misbegotten Ashes + 6"), - (210007,"Winged Misbegotten Ashes + 7"), - (210008,"Winged Misbegotten Ashes + 8"), - (210009,"Winged Misbegotten Ashes + 9"), - (210010,"Winged Misbegotten Ashes + 10"), - (211000,"Albinauric Ashes"), - (211001,"Albinauric Ashes +1"), - (211002,"Albinauric Ashes +2"), - (211003,"Albinauric Ashes +3"), - (211004,"Albinauric Ashes +4"), - (211005,"Albinauric Ashes +5"), - (211006,"Albinauric Ashes +6"), - (211007,"Albinauric Ashes +7"), - (211008,"Albinauric Ashes +8"), - (211009,"Albinauric Ashes +9"), - (211010,"Albinauric Ashes +10"), - (212000,"Skeletal Militiaman Ashes"), - (212001,"Skeletal Militiaman Ashes +1"), - (212002,"Skeletal Militiaman Ashes +2"), - (212003,"Skeletal Militiaman Ashes +3"), - (212004,"Skeletal Militiaman Ashes +4"), - (212005,"Skeletal Militiaman Ashes +5"), - (212006,"Skeletal Militiaman Ashes +6"), - (212007,"Skeletal Militiaman Ashes +7"), - (212008,"Skeletal Militiaman Ashes +8"), - (212009,"Skeletal Militiaman Ashes +9"), - (212010,"Skeletal Militiaman Ashes +10"), - (213000,"Skeletal Bandit Ashes"), - (213001,"Skeletal Bandit Ashes +1"), - (213002,"Skeletal Bandit Ashes +2"), - (213003,"Skeletal Bandit Ashes +3"), - (213004,"Skeletal Bandit Ashes +4"), - (213005,"Skeletal Bandit Ashes +5"), - (213006,"Skeletal Bandit Ashes +6"), - (213007,"Skeletal Bandit Ashes +7"), - (213008,"Skeletal Bandit Ashes +8"), - (213009,"Skeletal Bandit Ashes +9"), - (213010,"Skeletal Bandit Ashes +10"), - (214000,"Oracle Envoy Ashes"), - (214001,"Oracle Envoy Ashes +1"), - (214002,"Oracle Envoy Ashes +2"), - (214003,"Oracle Envoy Ashes +3"), - (214004,"Oracle Envoy Ashes +4"), - (214005,"Oracle Envoy Ashes +5"), - (214006,"Oracle Envoy Ashes +6"), - (214007,"Oracle Envoy Ashes +7"), - (214008,"Oracle Envoy Ashes +8"), - (214009,"Oracle Envoy Ashes +9"), - (214010,"Oracle Envoy Ashes +10"), - (215000,"Putrid Corpse Ashes"), - (215001,"Putrid Corpse Ashes +1"), - (215002,"Putrid Corpse Ashes +2"), - (215003,"Putrid Corpse Ashes +3"), - (215004,"Putrid Corpse Ashes +4"), - (215005,"Putrid Corpse Ashes +5"), - (215006,"Putrid Corpse Ashes +6"), - (215007,"Putrid Corpse Ashes +7"), - (215008,"Putrid Corpse Ashes +8"), - (215009,"Putrid Corpse Ashes +9"), - (215010,"Putrid Corpse Ashes +10"), - (216000,"Depraved Perfumer Carmaan"), - (216001,"Depraved Perfumer Carmaan +1"), - (216002,"Depraved Perfumer Carmaan +2"), - (216003,"Depraved Perfumer Carmaan +3"), - (216004,"Depraved Perfumer Carmaan +4"), - (216005,"Depraved Perfumer Carmaan +5"), - (216006,"Depraved Perfumer Carmaan +6"), - (216007,"Depraved Perfumer Carmaan +7"), - (216008,"Depraved Perfumer Carmaan +8"), - (216009,"Depraved Perfumer Carmaan +9"), - (216010,"Depraved Perfumer Carmaan +10"), - (217000,"Perfumer Tricia"), - (217001,"Perfumer Tricia +1"), - (217002,"Perfumer Tricia +2"), - (217003,"Perfumer Tricia +3"), - (217004,"Perfumer Tricia +4"), - (217005,"Perfumer Tricia +5"), - (217006,"Perfumer Tricia +6"), - (217007,"Perfumer Tricia +7"), - (217008,"Perfumer Tricia +8"), - (217009,"Perfumer Tricia +9"), - (217010,"Perfumer Tricia +10"), - (218000,"Glintstone Sorcerer Ashes"), - (218001,"Glintstone Sorcerer Ashes +1"), - (218002,"Glintstone Sorcerer Ashes +2"), - (218003,"Glintstone Sorcerer Ashes +3"), - (218004,"Glintstone Sorcerer Ashes +4"), - (218005,"Glintstone Sorcerer Ashes +5"), - (218006,"Glintstone Sorcerer Ashes +6"), - (218007,"Glintstone Sorcerer Ashes +7"), - (218008,"Glintstone Sorcerer Ashes +8"), - (218009,"Glintstone Sorcerer Ashes +9"), - (218010,"Glintstone Sorcerer Ashes +10"), - (219000,"Twinsage Sorcerer Ashes"), - (219001,"Twinsage Sorcerer Ashes +1"), - (219002,"Twinsage Sorcerer Ashes +2"), - (219003,"Twinsage Sorcerer Ashes +3"), - (219004,"Twinsage Sorcerer Ashes +4"), - (219005,"Twinsage Sorcerer Ashes +5"), - (219006,"Twinsage Sorcerer Ashes +6"), - (219007,"Twinsage Sorcerer Ashes +7"), - (219008,"Twinsage Sorcerer Ashes +8"), - (219009,"Twinsage Sorcerer Ashes +9"), - (219010,"Twinsage Sorcerer Ashes +10"), - (220000,"Page Ashes"), - (220001,"Page Ashes +1"), - (220002,"Page Ashes +2"), - (220003,"Page Ashes +3"), - (220004,"Page Ashes +4"), - (220005,"Page Ashes +5"), - (220006,"Page Ashes +6"), - (220007,"Page Ashes +7"), - (220008,"Page Ashes +8"), - (220009,"Page Ashes +9"), - (220010,"Page Ashes +10"), - (221000,"Battlemage Hugues"), - (221001,"Battlemage Hugues +1"), - (221002,"Battlemage Hugues +2"), - (221003,"Battlemage Hugues +3"), - (221004,"Battlemage Hugues +4"), - (221005,"Battlemage Hugues +5"), - (221006,"Battlemage Hugues +6"), - (221007,"Battlemage Hugues +7"), - (221008,"Battlemage Hugues +8"), - (221009,"Battlemage Hugues +9"), - (221010,"Battlemage Hugues +10"), - (222000,"Clayman Ashes"), - (222001,"Clayman Ashes +1"), - (222002,"Clayman Ashes +2"), - (222003,"Clayman Ashes +3"), - (222004,"Clayman Ashes +4"), - (222005,"Clayman Ashes +5"), - (222006,"Clayman Ashes +6"), - (222007,"Clayman Ashes +7"), - (222008,"Clayman Ashes +8"), - (222009,"Clayman Ashes +9"), - (222010,"Clayman Ashes +10"), - (223000,"Cleanrot Knight Finlay"), - (223001,"Cleanrot Knight Finlay +1"), - (223002,"Cleanrot Knight Finlay +2"), - (223003,"Cleanrot Knight Finlay +3"), - (223004,"Cleanrot Knight Finlay +4"), - (223005,"Cleanrot Knight Finlay +5"), - (223006,"Cleanrot Knight Finlay +6"), - (223007,"Cleanrot Knight Finlay +7"), - (223008,"Cleanrot Knight Finlay +8"), - (223009,"Cleanrot Knight Finlay +9"), - (223010,"Cleanrot Knight Finlay +10"), - (224000,"Kindred of Rot Ashes"), - (224001,"Kindred of Rot Ashes +1"), - (224002,"Kindred of Rot Ashes +2"), - (224003,"Kindred of Rot Ashes +3"), - (224004,"Kindred of Rot Ashes +4"), - (224005,"Kindred of Rot Ashes +5"), - (224006,"Kindred of Rot Ashes +6"), - (224007,"Kindred of Rot Ashes +7"), - (224008,"Kindred of Rot Ashes +8"), - (224009,"Kindred of Rot Ashes +9"), - (224010,"Kindred of Rot Ashes +10"), - (225000,"Marionette Soldier Ashes"), - (225001,"Marionette Soldier Ashes +1"), - (225002,"Marionette Soldier Ashes +2"), - (225003,"Marionette Soldier Ashes +3"), - (225004,"Marionette Soldier Ashes +4"), - (225005,"Marionette Soldier Ashes +5"), - (225006,"Marionette Soldier Ashes +6"), - (225007,"Marionette Soldier Ashes +7"), - (225008,"Marionette Soldier Ashes +8"), - (225009,"Marionette Soldier Ashes +9"), - (225010,"Marionette Soldier Ashes +10"), - (226000,"Avionette Soldier Ashes"), - (226001,"Avionette Soldier Ashes +1"), - (226002,"Avionette Soldier Ashes +2"), - (226003,"Avionette Soldier Ashes +3"), - (226004,"Avionette Soldier Ashes +4"), - (226005,"Avionette Soldier Ashes +5"), - (226006,"Avionette Soldier Ashes +6"), - (226007,"Avionette Soldier Ashes +7"), - (226008,"Avionette Soldier Ashes +8"), - (226009,"Avionette Soldier Ashes +9"), - (226010,"Avionette Soldier Ashes +10"), - (227000,"Fire Monk Ashes"), - (227001,"Fire Monk Ashes +1"), - (227002,"Fire Monk Ashes +2"), - (227003,"Fire Monk Ashes +3"), - (227004,"Fire Monk Ashes +4"), - (227005,"Fire Monk Ashes +5"), - (227006,"Fire Monk Ashes +6"), - (227007,"Fire Monk Ashes +7"), - (227008,"Fire Monk Ashes +8"), - (227009,"Fire Monk Ashes +9"), - (227010,"Fire Monk Ashes +10"), - (228000,"Blackflame Monk Amon"), - (228001,"Blackflame Monk Amon +1"), - (228002,"Blackflame Monk Amon +2"), - (228003,"Blackflame Monk Amon +3"), - (228004,"Blackflame Monk Amon +4"), - (228005,"Blackflame Monk Amon +5"), - (228006,"Blackflame Monk Amon +6"), - (228007,"Blackflame Monk Amon +7"), - (228008,"Blackflame Monk Amon +8"), - (228009,"Blackflame Monk Amon +9"), - (228010,"Blackflame Monk Amon +10"), - (229000,"Man-Serpent Ashes"), - (229001,"Man-Serpent Ashes +1"), - (229002,"Man-Serpent Ashes +2"), - (229003,"Man-Serpent Ashes +3"), - (229004,"Man-Serpent Ashes +4"), - (229005,"Man-Serpent Ashes +5"), - (229006,"Man-Serpent Ashes +6"), - (229007,"Man-Serpent Ashes +7"), - (229008,"Man-Serpent Ashes +8"), - (229009,"Man-Serpent Ashes +9"), - (229010,"Man-Serpent Ashes +10"), - (230000,"Azula Beastman Ashes"), - (230001,"Azula Beastman Ashes +1"), - (230002,"Azula Beastman Ashes +2"), - (230003,"Azula Beastman Ashes +3"), - (230004,"Azula Beastman Ashes +4"), - (230005,"Azula Beastman Ashes +5"), - (230006,"Azula Beastman Ashes +6"), - (230007,"Azula Beastman Ashes +7"), - (230008,"Azula Beastman Ashes +8"), - (230009,"Azula Beastman Ashes +9"), - (230010,"Azula Beastman Ashes +10"), - (231000,"Kaiden Sellsword Ashes"), - (231001,"Kaiden Sellsword Ashes +1"), - (231002,"Kaiden Sellsword Ashes +2"), - (231003,"Kaiden Sellsword Ashes +3"), - (231004,"Kaiden Sellsword Ashes +4"), - (231005,"Kaiden Sellsword Ashes +5"), - (231006,"Kaiden Sellsword Ashes +6"), - (231007,"Kaiden Sellsword Ashes +7"), - (231008,"Kaiden Sellsword Ashes +8"), - (231009,"Kaiden Sellsword Ashes +9"), - (231010,"Kaiden Sellsword Ashes +10"), - (232000,"Lone Wolf Ashes"), - (232001,"Lone Wolf Ashes +1"), - (232002,"Lone Wolf Ashes +2"), - (232003,"Lone Wolf Ashes +3"), - (232004,"Lone Wolf Ashes +4"), - (232005,"Lone Wolf Ashes +5"), - (232006,"Lone Wolf Ashes +6"), - (232007,"Lone Wolf Ashes +7"), - (232008,"Lone Wolf Ashes +8"), - (232009,"Lone Wolf Ashes +9"), - (232010,"Lone Wolf Ashes +10"), - (233000,"Giant Rat Ashes"), - (233001,"Giant Rat Ashes +1"), - (233002,"Giant Rat Ashes +2"), - (233003,"Giant Rat Ashes +3"), - (233004,"Giant Rat Ashes +4"), - (233005,"Giant Rat Ashes +5"), - (233006,"Giant Rat Ashes +6"), - (233007,"Giant Rat Ashes +7"), - (233008,"Giant Rat Ashes +8"), - (233009,"Giant Rat Ashes +9"), - (233010,"Giant Rat Ashes +10"), - (234000,"Demi-Human Ashes"), - (234001,"Demi-Human Ashes +1"), - (234002,"Demi-Human Ashes +2"), - (234003,"Demi-Human Ashes +3"), - (234004,"Demi-Human Ashes +4"), - (234005,"Demi-Human Ashes +5"), - (234006,"Demi-Human Ashes +6"), - (234007,"Demi-Human Ashes +7"), - (234008,"Demi-Human Ashes +8"), - (234009,"Demi-Human Ashes +9"), - (234010,"Demi-Human Ashes +10"), - (235000,"Rotten Stray Ashes"), - (235001,"Rotten Stray Ashes +1"), - (235002,"Rotten Stray Ashes +2"), - (235003,"Rotten Stray Ashes +3"), - (235004,"Rotten Stray Ashes +4"), - (235005,"Rotten Stray Ashes +5"), - (235006,"Rotten Stray Ashes +6"), - (235007,"Rotten Stray Ashes +7"), - (235008,"Rotten Stray Ashes +8"), - (235009,"Rotten Stray Ashes +9"), - (235010,"Rotten Stray Ashes +10"), - (236000,"Spirit Jellyfish Ashes"), - (236001,"Spirit Jellyfish Ashes +1"), - (236002,"Spirit Jellyfish Ashes +2"), - (236003,"Spirit Jellyfish Ashes +3"), - (236004,"Spirit Jellyfish Ashes +4"), - (236005,"Spirit Jellyfish Ashes +5"), - (236006,"Spirit Jellyfish Ashes +6"), - (236007,"Spirit Jellyfish Ashes +7"), - (236008,"Spirit Jellyfish Ashes +8"), - (236009,"Spirit Jellyfish Ashes +9"), - (236010,"Spirit Jellyfish Ashes +10"), - (237000,"Warhawk Ashes"), - (237001,"Warhawk Ashes +1"), - (237002,"Warhawk Ashes +2"), - (237003,"Warhawk Ashes +3"), - (237004,"Warhawk Ashes +4"), - (237005,"Warhawk Ashes +5"), - (237006,"Warhawk Ashes +6"), - (237007,"Warhawk Ashes +7"), - (237008,"Warhawk Ashes +8"), - (237009,"Warhawk Ashes +9"), - (237010,"Warhawk Ashes +10"), - (238000,"Stormhawk Deenh"), - (238001,"Stormhawk Deenh +1"), - (238002,"Stormhawk Deenh +2"), - (238003,"Stormhawk Deenh +3"), - (238004,"Stormhawk Deenh +4"), - (238005,"Stormhawk Deenh +5"), - (238006,"Stormhawk Deenh +6"), - (238007,"Stormhawk Deenh +7"), - (238008,"Stormhawk Deenh +8"), - (238009,"Stormhawk Deenh +9"), - (238010,"Stormhawk Deenh +10"), - (239000,"Bloodhound Knight Floh"), - (239001,"Bloodhound Knight Floh +1"), - (239002,"Bloodhound Knight Floh +2"), - (239003,"Bloodhound Knight Floh +3"), - (239004,"Bloodhound Knight Floh +4"), - (239005,"Bloodhound Knight Floh +5"), - (239006,"Bloodhound Knight Floh +6"), - (239007,"Bloodhound Knight Floh +7"), - (239008,"Bloodhound Knight Floh +8"), - (239009,"Bloodhound Knight Floh +9"), - (239010,"Bloodhound Knight Floh +10"), - (240000,"Wandering Noble Ashes"), - (240001,"Wandering Noble Ashes +1"), - (240002,"Wandering Noble Ashes +2"), - (240003,"Wandering Noble Ashes +3"), - (240004,"Wandering Noble Ashes +4"), - (240005,"Wandering Noble Ashes +5"), - (240006,"Wandering Noble Ashes +6"), - (240007,"Wandering Noble Ashes +7"), - (240008,"Wandering Noble Ashes +8"), - (240009,"Wandering Noble Ashes +9"), - (240010,"Wandering Noble Ashes +10"), - (241000,"Noble Sorcerer Ashes"), - (241001,"Noble Sorcerer Ashes +1"), - (241002,"Noble Sorcerer Ashes +2"), - (241003,"Noble Sorcerer Ashes +3"), - (241004,"Noble Sorcerer Ashes +4"), - (241005,"Noble Sorcerer Ashes +5"), - (241006,"Noble Sorcerer Ashes +6"), - (241007,"Noble Sorcerer Ashes +7"), - (241008,"Noble Sorcerer Ashes +8"), - (241009,"Noble Sorcerer Ashes +9"), - (241010,"Noble Sorcerer Ashes +10"), - (242000,"Vulgar Militia Ashes"), - (242001,"Vulgar Militia Ashes +1"), - (242002,"Vulgar Militia Ashes +2"), - (242003,"Vulgar Militia Ashes +3"), - (242004,"Vulgar Militia Ashes +4"), - (242005,"Vulgar Militia Ashes +5"), - (242006,"Vulgar Militia Ashes +6"), - (242007,"Vulgar Militia Ashes +7"), - (242008,"Vulgar Militia Ashes +8"), - (242009,"Vulgar Militia Ashes +9"), - (242010,"Vulgar Militia Ashes +10"), - (243000,"Mad Pumpkin Head Ashes"), - (243001,"Mad Pumpkin Head Ashes +1"), - (243002,"Mad Pumpkin Head Ashes +2"), - (243003,"Mad Pumpkin Head Ashes +3"), - (243004,"Mad Pumpkin Head Ashes +4"), - (243005,"Mad Pumpkin Head Ashes +5"), - (243006,"Mad Pumpkin Head Ashes +6"), - (243007,"Mad Pumpkin Head Ashes +7"), - (243008,"Mad Pumpkin Head Ashes +8"), - (243009,"Mad Pumpkin Head Ashes +9"), - (243010,"Mad Pumpkin Head Ashes +10"), - (244000,"Land Squirt Ashes"), - (244001,"Land Squirt Ashes +1"), - (244002,"Land Squirt Ashes +2"), - (244003,"Land Squirt Ashes +3"), - (244004,"Land Squirt Ashes +4"), - (244005,"Land Squirt Ashes +5"), - (244006,"Land Squirt Ashes +6"), - (244007,"Land Squirt Ashes +7"), - (244008,"Land Squirt Ashes +8"), - (244009,"Land Squirt Ashes +9"), - (244010,"Land Squirt Ashes +10"), - (245000,"Miranda Sprout Ashes"), - (245001,"Miranda Sprout Ashes +1"), - (245002,"Miranda Sprout Ashes +2"), - (245003,"Miranda Sprout Ashes +3"), - (245004,"Miranda Sprout Ashes +4"), - (245005,"Miranda Sprout Ashes +5"), - (245006,"Miranda Sprout Ashes +6"), - (245007,"Miranda Sprout Ashes +7"), - (245008,"Miranda Sprout Ashes +8"), - (245009,"Miranda Sprout Ashes +9"), - (245010,"Miranda Sprout Ashes +10"), - (246000,"Soldjars of Fortune Ashes"), - (246001,"Soldjars of Fortune Ashes +1"), - (246002,"Soldjars of Fortune Ashes +2"), - (246003,"Soldjars of Fortune Ashes +3"), - (246004,"Soldjars of Fortune Ashes +4"), - (246005,"Soldjars of Fortune Ashes +5"), - (246006,"Soldjars of Fortune Ashes +6"), - (246007,"Soldjars of Fortune Ashes +7"), - (246008,"Soldjars of Fortune Ashes +8"), - (246009,"Soldjars of Fortune Ashes +9"), - (246010,"Soldjars of Fortune Ashes +10"), - (247000,"Omenkiller Rollo"), - (247001,"Omenkiller Rollo +1"), - (247002,"Omenkiller Rollo +2"), - (247003,"Omenkiller Rollo +3"), - (247004,"Omenkiller Rollo +4"), - (247005,"Omenkiller Rollo +5"), - (247006,"Omenkiller Rollo +6"), - (247007,"Omenkiller Rollo +7"), - (247008,"Omenkiller Rollo +8"), - (247009,"Omenkiller Rollo +9"), - (247010,"Omenkiller Rollo +10"), - (248000,"Greatshield Soldier Ashes"), - (248001,"Greatshield Soldier Ashes +1"), - (248002,"Greatshield Soldier Ashes +2"), - (248003,"Greatshield Soldier Ashes +3"), - (248004,"Greatshield Soldier Ashes +4"), - (248005,"Greatshield Soldier Ashes +5"), - (248006,"Greatshield Soldier Ashes +6"), - (248007,"Greatshield Soldier Ashes +7"), - (248008,"Greatshield Soldier Ashes +8"), - (248009,"Greatshield Soldier Ashes +9"), - (248010,"Greatshield Soldier Ashes +10"), - (249000,"Archer Ashes"), - (249001,"Archer Ashes +1"), - (249002,"Archer Ashes +2"), - (249003,"Archer Ashes +3"), - (249004,"Archer Ashes +4"), - (249005,"Archer Ashes +5"), - (249006,"Archer Ashes +6"), - (249007,"Archer Ashes +7"), - (249008,"Archer Ashes +8"), - (249009,"Archer Ashes +9"), - (249010,"Archer Ashes +10"), - (250000,"Godrick Soldier Ashes"), - (250001,"Godrick Soldier Ashes +1"), - (250002,"Godrick Soldier Ashes +2"), - (250003,"Godrick Soldier Ashes +3"), - (250004,"Godrick Soldier Ashes +4"), - (250005,"Godrick Soldier Ashes +5"), - (250006,"Godrick Soldier Ashes +6"), - (250007,"Godrick Soldier Ashes +7"), - (250008,"Godrick Soldier Ashes +8"), - (250009,"Godrick Soldier Ashes +9"), - (250010,"Godrick Soldier Ashes +10"), - (251000,"Raya Lucaria Soldier Ashes"), - (251001,"Raya Lucaria Soldier Ashes +1"), - (251002,"Raya Lucaria Soldier Ashes +2"), - (251003,"Raya Lucaria Soldier Ashes +3"), - (251004,"Raya Lucaria Soldier Ashes +4"), - (251005,"Raya Lucaria Soldier Ashes +5"), - (251006,"Raya Lucaria Soldier Ashes +6"), - (251007,"Raya Lucaria Soldier Ashes +7"), - (251008,"Raya Lucaria Soldier Ashes +8"), - (251009,"Raya Lucaria Soldier Ashes +9"), - (251010,"Raya Lucaria Soldier Ashes +10"), - (252000,"Leyndell Soldier Ashes"), - (252001,"Leyndell Soldier Ashes +1"), - (252002,"Leyndell Soldier Ashes +2"), - (252003,"Leyndell Soldier Ashes +3"), - (252004,"Leyndell Soldier Ashes +4"), - (252005,"Leyndell Soldier Ashes +5"), - (252006,"Leyndell Soldier Ashes +6"), - (252007,"Leyndell Soldier Ashes +7"), - (252008,"Leyndell Soldier Ashes +8"), - (252009,"Leyndell Soldier Ashes +9"), - (252010,"Leyndell Soldier Ashes +10"), - (253000,"Radahn Soldier Ashes"), - (253001,"Radahn Soldier Ashes +1"), - (253002,"Radahn Soldier Ashes +2"), - (253003,"Radahn Soldier Ashes +3"), - (253004,"Radahn Soldier Ashes +4"), - (253005,"Radahn Soldier Ashes +5"), - (253006,"Radahn Soldier Ashes +6"), - (253007,"Radahn Soldier Ashes +7"), - (253008,"Radahn Soldier Ashes +8"), - (253009,"Radahn Soldier Ashes +9"), - (253010,"Radahn Soldier Ashes +10"), - (254000,"Mausoleum Soldier Ashes"), - (254001,"Mausoleum Soldier Ashes +1"), - (254002,"Mausoleum Soldier Ashes +2"), - (254003,"Mausoleum Soldier Ashes +3"), - (254004,"Mausoleum Soldier Ashes +4"), - (254005,"Mausoleum Soldier Ashes +5"), - (254006,"Mausoleum Soldier Ashes +6"), - (254007,"Mausoleum Soldier Ashes +7"), - (254008,"Mausoleum Soldier Ashes +8"), - (254009,"Mausoleum Soldier Ashes +9"), - (254010,"Mausoleum Soldier Ashes +10"), - (255000,"Haligtree Soldier Ashes"), - (255001,"Haligtree Soldier Ashes +1"), - (255002,"Haligtree Soldier Ashes +2"), - (255003,"Haligtree Soldier Ashes +3"), - (255004,"Haligtree Soldier Ashes +4"), - (255005,"Haligtree Soldier Ashes +5"), - (255006,"Haligtree Soldier Ashes +6"), - (255007,"Haligtree Soldier Ashes +7"), - (255008,"Haligtree Soldier Ashes +8"), - (255009,"Haligtree Soldier Ashes +9"), - (255010,"Haligtree Soldier Ashes +10"), - (256000,"Ancient Dragon Knight Kristoff"), - (256001,"Ancient Dragon Knight Kristoff +1"), - (256002,"Ancient Dragon Knight Kristoff +2"), - (256003,"Ancient Dragon Knight Kristoff +3"), - (256004,"Ancient Dragon Knight Kristoff +4"), - (256005,"Ancient Dragon Knight Kristoff +5"), - (256006,"Ancient Dragon Knight Kristoff +6"), - (256007,"Ancient Dragon Knight Kristoff +7"), - (256008,"Ancient Dragon Knight Kristoff +8"), - (256009,"Ancient Dragon Knight Kristoff +9"), - (256010,"Ancient Dragon Knight Kristoff +10"), - (257000,"Redmane Knight Ogha"), - (257001,"Redmane Knight Ogha +1"), - (257002,"Redmane Knight Ogha +2"), - (257003,"Redmane Knight Ogha +3"), - (257004,"Redmane Knight Ogha +4"), - (257005,"Redmane Knight Ogha +5"), - (257006,"Redmane Knight Ogha +6"), - (257007,"Redmane Knight Ogha +7"), - (257008,"Redmane Knight Ogha +8"), - (257009,"Redmane Knight Ogha +9"), - (257010,"Redmane Knight Ogha +10"), - (258000,"Lhutel the Headless"), - (258001,"Lhutel the Headless +1"), - (258002,"Lhutel the Headless +2"), - (258003,"Lhutel the Headless +3"), - (258004,"Lhutel the Headless +4"), - (258005,"Lhutel the Headless +5"), - (258006,"Lhutel the Headless +6"), - (258007,"Lhutel the Headless +7"), - (258008,"Lhutel the Headless +8"), - (258009,"Lhutel the Headless +9"), - (258010,"Lhutel the Headless +10"), - (259000,"Nepheli Loux Puppet"), - (259001,"Nepheli Loux Puppet +1"), - (259002,"Nepheli Loux Puppet +2"), - (259003,"Nepheli Loux Puppet +3"), - (259004,"Nepheli Loux Puppet +4"), - (259005,"Nepheli Loux Puppet +5"), - (259006,"Nepheli Loux Puppet +6"), - (259007,"Nepheli Loux Puppet +7"), - (259008,"Nepheli Loux Puppet +8"), - (259009,"Nepheli Loux Puppet +9"), - (259010,"Nepheli Loux Puppet +10"), - (260000,"Dung Eater Puppet"), - (260001,"Dung Eater Puppet +1"), - (260002,"Dung Eater Puppet +2"), - (260003,"Dung Eater Puppet +3"), - (260004,"Dung Eater Puppet +4"), - (260005,"Dung Eater Puppet +5"), - (260006,"Dung Eater Puppet +6"), - (260007,"Dung Eater Puppet +7"), - (260008,"Dung Eater Puppet +8"), - (260009,"Dung Eater Puppet +9"), - (260010,"Dung Eater Puppet +10"), - (261000,"Finger Maiden Therolina Puppet"), - (261001,"Finger Maiden Therolina Puppet +1"), - (261002,"Finger Maiden Therolina Puppet +2"), - (261003,"Finger Maiden Therolina Puppet +3"), - (261004,"Finger Maiden Therolina Puppet +4"), - (261005,"Finger Maiden Therolina Puppet +5"), - (261006,"Finger Maiden Therolina Puppet +6"), - (261007,"Finger Maiden Therolina Puppet +7"), - (261008,"Finger Maiden Therolina Puppet +8"), - (261009,"Finger Maiden Therolina Puppet +9"), - (261010,"Finger Maiden Therolina Puppet +10"), - (262000,"Dolores the Sleeping Arrow Puppet"), - (262001,"Dolores the Sleeping Arrow Puppet +1"), - (262002,"Dolores the Sleeping Arrow Puppet +2"), - (262003,"Dolores the Sleeping Arrow Puppet +3"), - (262004,"Dolores the Sleeping Arrow Puppet +4"), - (262005,"Dolores the Sleeping Arrow Puppet +5"), - (262006,"Dolores the Sleeping Arrow Puppet +6"), - (262007,"Dolores the Sleeping Arrow Puppet +7"), - (262008,"Dolores the Sleeping Arrow Puppet +8"), - (262009,"Dolores the Sleeping Arrow Puppet +9"), - (262010,"Dolores the Sleeping Arrow Puppet +10"), - (263000,"Jarwight Puppet"), - (263001,"Jarwight Puppet +1"), - (263002,"Jarwight Puppet +2"), - (263003,"Jarwight Puppet +3"), - (263004,"Jarwight Puppet +4"), - (263005,"Jarwight Puppet +5"), - (263006,"Jarwight Puppet +6"), - (263007,"Jarwight Puppet +7"), - (263008,"Jarwight Puppet +8"), - (263009,"Jarwight Puppet +9"), - (263010,"Jarwight Puppet +10"), - (999999999,"") + (0, "Empty"), + (10, ""), + (11, ""), + (12, ""), + (13, ""), + (14, ""), + (15, ""), + (16, ""), + (20, ""), + (21, ""), + (22, ""), + (23, ""), + (24, ""), + (25, ""), + (26, ""), + (27, ""), + (28, ""), + (29, ""), + (30, ""), + (31, ""), + (35, ""), + (40, ""), + (41, ""), + (42, ""), + (43, ""), + (44, ""), + (60, ""), + (61, ""), + (62, ""), + (63, ""), + (64, ""), + (65, ""), + (66, ""), + (67, ""), + (68, ""), + (69, ""), + (70, ""), + (71, ""), + (72, ""), + (73, ""), + (74, ""), + (75, ""), + (76, ""), + (77, ""), + (78, ""), + (79, ""), + (90, ""), + (91, ""), + (92, ""), + (93, ""), + (94, ""), + (98, ""), + (99, ""), + (100, "Tarnished's Furled Finger"), + (101, "Duelist's Furled Finger"), + (102, "Bloody Finger"), + (103, "Finger Severer"), + (104, "White Cipher Ring"), + (105, "Blue Cipher Ring"), + (106, "Tarnished's Wizened Finger"), + (107, "Phantom Bloody Finger"), + (108, "Taunter's Tongue"), + (109, "Small Golden Effigy"), + (110, "Small Red Effigy"), + (111, "Festering Bloody Finger"), + (112, "Recusant Finger"), + (113, "Phantom Bloody Finger"), + (114, "Phantom Recusant Finger"), + (115, "Memory of Grace"), + (130, "Spectral Steed Whistle"), + (135, "Phantom Great Rune"), + (150, "Furlcalling Finger Remedy"), + (166, ""), + (170, "Tarnished's Furled Finger"), + (171, "Duelist's Furled Finger"), + (172, "Bloody Finger"), + (174, "White Cipher Ring"), + (175, "Blue Cipher Ring"), + (178, "Taunter's Tongue"), + (179, "Small Golden Effigy"), + (180, "Small Red Effigy"), + (181, "Spectral Steed Whistle"), + (182, "Furlcalling Finger Remedy"), + (183, "Festering Bloody Finger"), + (184, "Recusant Finger"), + (190, "Rune Arc"), + (191, "Godrick's Great Rune"), + (192, "Radahn's Great Rune"), + (193, "Morgott's Great Rune"), + (194, "Rykard's Great Rune"), + (195, "Mohg's Great Rune"), + (196, "Malenia's Great Rune"), + (250, "Flask of Wondrous Physick"), + (251, "Flask of Wondrous Physick"), + (300, "Fire Pot"), + (301, "Redmane Fire Pot"), + (302, "Giantsflame Fire Pot"), + (320, "Lightning Pot"), + (321, "Ancient Dragonbolt Pot"), + (330, "Fetid Pot"), + (340, "Swarm Pot"), + (350, "Holy Water Pot"), + (351, "Sacred Order Pot"), + (360, "Freezing Pot"), + (370, "Poison Pot"), + (380, "Oil Pot"), + (390, "Alluring Pot"), + (391, "Beastlure Pot"), + (400, "Roped Fire Pot"), + (420, "Roped Lightning Pot"), + (430, "Roped Fetid Pot"), + (440, "Roped Poison Pot"), + (450, "Roped Oil Pot"), + (460, "Roped Magic Pot"), + (470, "Roped Fly Pot"), + (480, "Roped Freezing Pot"), + (490, "Roped Volcano Pot"), + (510, "Roped Holy Water Pot"), + (600, "Volcano Pot"), + (610, "Albinauric Pot"), + (630, "Cursed-Blood Pot"), + (640, "Sleep Pot"), + (650, "Rancor Pot"), + (660, "Magic Pot"), + (661, "Academy Magic Pot"), + (670, "Rot Pot"), + (810, "Rowa Raisin"), + (811, "Sweet Raisin"), + (812, "Frozen Raisin"), + (820, "Boiled Crab"), + (830, "Boiled Prawn"), + (900, "Neutralizing Boluses"), + (910, "Stanching Boluses"), + (920, "Thawfrost Boluses"), + (930, "Stimulating Boluses"), + (940, "Preserving Boluses"), + (950, "Rejuvenating Boluses"), + (960, "Clarifying Boluses"), + (1000, "Flask of Crimson Tears"), + (1001, "Flask of Crimson Tears"), + (1002, "Flask of Crimson Tears +1"), + (1003, "Flask of Crimson Tears +1"), + (1004, "Flask of Crimson Tears +2"), + (1005, "Flask of Crimson Tears +2"), + (1006, "Flask of Crimson Tears +3"), + (1007, "Flask of Crimson Tears +3"), + (1008, "Flask of Crimson Tears +4"), + (1009, "Flask of Crimson Tears +4"), + (1010, "Flask of Crimson Tears +5"), + (1011, "Flask of Crimson Tears +5"), + (1012, "Flask of Crimson Tears +6"), + (1013, "Flask of Crimson Tears +6"), + (1014, "Flask of Crimson Tears +7"), + (1015, "Flask of Crimson Tears +7"), + (1016, "Flask of Crimson Tears +8"), + (1017, "Flask of Crimson Tears +8"), + (1018, "Flask of Crimson Tears +9"), + (1019, "Flask of Crimson Tears +9"), + (1020, "Flask of Crimson Tears +10"), + (1021, "Flask of Crimson Tears +10"), + (1022, "Flask of Crimson Tears +11"), + (1023, "Flask of Crimson Tears +11"), + (1024, "Flask of Crimson Tears +12"), + (1025, "Flask of Crimson Tears +12"), + (1050, "Flask of Cerulean Tears"), + (1051, "Flask of Cerulean Tears"), + (1052, "Flask of Cerulean Tears +1"), + (1053, "Flask of Cerulean Tears +1"), + (1054, "Flask of Cerulean Tears +2"), + (1055, "Flask of Cerulean Tears +2"), + (1056, "Flask of Cerulean Tears +3"), + (1057, "Flask of Cerulean Tears +3"), + (1058, "Flask of Cerulean Tears +4"), + (1059, "Flask of Cerulean Tears +4"), + (1060, "Flask of Cerulean Tears +5"), + (1061, "Flask of Cerulean Tears +5"), + (1062, "Flask of Cerulean Tears +6"), + (1063, "Flask of Cerulean Tears +6"), + (1064, "Flask of Cerulean Tears +7"), + (1065, "Flask of Cerulean Tears +7"), + (1066, "Flask of Cerulean Tears +8"), + (1067, "Flask of Cerulean Tears +8"), + (1068, "Flask of Cerulean Tears +9"), + (1069, "Flask of Cerulean Tears +9"), + (1070, "Flask of Cerulean Tears +10"), + (1071, "Flask of Cerulean Tears +10"), + (1072, "Flask of Cerulean Tears +11"), + (1073, "Flask of Cerulean Tears +11"), + (1074, "Flask of Cerulean Tears +12"), + (1075, "Flask of Cerulean Tears +12"), + (1100, "Pickled Turtle Neck"), + (1110, "Immunizing Cured Meat"), + (1120, "Invigorating Cured Meat"), + (1130, "Clarifying Cured Meat"), + (1140, "Dappled Cured Meat"), + (1150, "Spellproof Dried Liver"), + (1160, "Fireproof Dried Liver"), + (1170, "Lightningproof Dried Liver"), + (1180, "Holyproof Dried Liver"), + (1190, "Silver-Pickled Fowl Foot"), + (1200, "Gold-Pickled Fowl Foot"), + (1210, "Exalted Flesh"), + (1220, "Deathsbane Jerky"), + (1235, "Raw Meat Dumpling"), + (1240, "Shabriri Grape"), + (1290, "Starlight Shards"), + (1310, "Immunizing White Cured Meat"), + (1320, "Invigorating White Cured Meat"), + (1330, "Clarifying White Cured Meat"), + (1340, "Dappled White Cured Meat"), + (1350, "Deathsbane White Jerky"), + (1400, "Fire Grease"), + (1410, "Lightning Grease"), + (1420, "Magic Grease"), + (1430, "Holy Grease"), + (1440, "Blood Grease"), + (1450, "Soporific Grease"), + (1460, "Poison Grease"), + (1470, "Freezing Grease"), + (1480, "Dragonwound Grease"), + (1490, "Rot Grease"), + (1500, "Drawstring Fire Grease"), + (1510, "Drawstring Lightning Grease"), + (1520, "Drawstring Magic Grease"), + (1530, "Drawstring Holy Grease"), + (1540, "Drawstring Blood Grease"), + (1550, "Drawstring Soporific Grease"), + (1560, "Drawstring Poison Grease"), + (1570, "Drawstring Freezing Grease"), + (1590, "Drawstring Rot Grease"), + (1690, "Shield Grease"), + (1700, "Throwing Dagger"), + (1710, "Bone Dart"), + (1720, "Poisonbone Dart"), + (1730, "Kukri"), + (1740, "Crystal Dart"), + (1750, "Fan Daggers"), + (1760, "Ruin Fragment"), + (1830, "Explosive Stone"), + (1831, "Explosive Stone Clump"), + (1840, "Poisoned Stone"), + (1841, "Poisoned Stone Clump"), + (2020, "Rainbow Stone"), + (2030, "Glowstone"), + (2040, "Telescope"), + (2050, "Grace Mimic"), + (2070, "Lantern"), + (2080, "Blasphemous Claw"), + (2090, "Deathroot"), + (2100, "Soft Cotton"), + (2120, "Soap"), + (2130, "Celestial Dew"), + (2140, "Margit's Shackle"), + (2150, "Mohg's Shackle"), + (2160, "Pureblood Knight's Medal"), + (2190, "Miquella's Needle"), + (2200, "Prattling Pate 'Hello'"), + (2201, "Prattling Pate 'Thank you'"), + (2202, "Prattling Pate 'Apologies'"), + (2203, "Prattling Pate 'Wonderful'"), + (2204, "Prattling Pate 'Please help'"), + (2205, "Prattling Pate 'My beloved'"), + (2206, "Prattling Pate 'Let's get to it'"), + (2207, "Prattling Pate 'You're beautiful'"), + (2900, "Golden Rune [1]"), + (2901, "Golden Rune [2]"), + (2902, "Golden Rune [3]"), + (2903, "Golden Rune [4]"), + (2904, "Golden Rune [5]"), + (2905, "Golden Rune [6]"), + (2906, "Golden Rune [7]"), + (2907, "Golden Rune [8]"), + (2908, "Golden Rune [9]"), + (2909, "Golden Rune [10]"), + (2910, "Golden Rune [11]"), + (2911, "Golden Rune [12]"), + (2912, "Golden Rune [13]"), + (2913, "Numen's Rune"), + (2914, "Hero's Rune [1]"), + (2915, "Hero's Rune [2]"), + (2916, "Hero's Rune [3]"), + (2917, "Hero's Rune [4]"), + (2918, "Hero's Rune [5]"), + (2919, "Lord's Rune"), + (2950, "Remembrance of the Grafted"), + (2951, "Remembrance of the Starscourge"), + (2952, "Remembrance of the Omen King"), + (2953, "Remembrance of the Blasphemous"), + (2954, "Remembrance of the Rot Goddess"), + (2955, "Remembrance of the Blood Lord"), + (2956, "Remembrance of the Black Blade"), + (2957, "Remembrance of Hoarah Loux"), + (2958, "Remembrance of the Dragonlord"), + (2959, "Remembrance of the Full Moon Queen"), + (2960, "Remembrance of the Lichdragon"), + (2961, "Remembrance of the Fire Giant"), + (2962, "Remembrance of the Regal Ancestor"), + (2963, "Elden Remembrance"), + (2964, "Remembrance of the Naturalborn"), + (2990, "Lands Between Rune"), + (3000, "Ancestral Infant's Head"), + (3010, "Omen Bairn"), + (3011, "Regal Omen Bairn"), + (3020, "Miranda's Prayer"), + (3030, "Cuckoo Glintstone"), + (3040, "Mimic's Veil"), + (3050, "Glintstone Scrap"), + (3051, "Large Glintstone Scrap"), + (3060, "Gravity Stone Fan"), + (3070, "Gravity Stone Chunk"), + (3080, "Wraith Calling Bell"), + (3300, "Holy Water Grease"), + (3310, "Warming Stone"), + (3311, "Frenzyflame Stone"), + (3320, "Scriptstone"), + (3350, "Bewitching Branch"), + (3360, "Baldachin's Blessing"), + (3361, "Radiant Baldachin's Blessing"), + (3500, "Uplifting Aromatic"), + (3510, "Spark Aromatic"), + (3520, "Ironjar Aromatic"), + (3550, "Bloodboil Aromatic"), + (3580, "Poison Spraymist"), + (3610, "Acid Spraymist"), + (4000, "[Sorcery] Glintstone Pebble"), + (4001, "[Sorcery] Great Glintstone Shard"), + (4010, "[Sorcery] Swift Glintstone Shard"), + (4020, "[Sorcery] Glintstone Cometshard"), + (4021, "[Sorcery] Comet"), + (4030, "[Sorcery] Shard Spiral"), + (4040, "[Sorcery] Glintstone Stars"), + (4050, "[Sorcery] Star Shower"), + (4060, "[Sorcery] Crystal Barrage"), + (4070, "[Sorcery] Glintstone Arc"), + (4080, "[Sorcery] Cannon of Haima"), + (4090, "[Sorcery] Crystal Burst"), + (4100, "[Sorcery] Shatter Earth"), + (4110, "[Sorcery] Rock Blaster"), + (4120, "[Sorcery] Gavel of Haima"), + (4130, "[Sorcery] Terra Magicus"), + (4140, "[Sorcery] Starlight"), + (4200, "[Sorcery] Comet Azur"), + (4210, "[Sorcery] Founding Rain of Stars"), + (4220, "[Sorcery] Stars of Ruin"), + (4300, "[Sorcery] Glintblade Phalanx"), + (4301, "[Sorcery] Carian Phalanx"), + (4302, "[Sorcery] Greatblade Phalanx"), + (4360, "[Sorcery] Rennala's Full Moon"), + (4361, "[Sorcery] Ranni's Dark Moon"), + (4370, "[Sorcery] Magic Downpour"), + (4380, "[Sorcery] Loretta's Greatbow"), + (4381, "[Sorcery] Loretta's Mastery"), + (4390, "[Sorcery] Magic Glintblade"), + (4400, "[Sorcery] Glintstone Icecrag"), + (4410, "[Sorcery] Zamor Ice Storm"), + (4420, "[Sorcery] Freezing Mist"), + (4430, "[Sorcery] Carian Greatsword"), + (4431, "[Sorcery] Adula's Moonblade"), + (4440, "[Sorcery] Carian Slicer"), + (4450, "[Sorcery] Carian Piercer"), + (4460, "[Sorcery] Scholar's Armament"), + (4470, "[Sorcery] Scholar's Shield"), + (4480, "[Sorcery] Lucidity"), + (4490, "[Sorcery] Frozen Armament"), + (4500, "[Sorcery] Shattering Crystal"), + (4510, "[Sorcery] Crystal Release"), + (4520, "[Sorcery] Crystal Torrent"), + (4600, "[Sorcery] Ambush Shard"), + (4610, "[Sorcery] Night Shard"), + (4620, "[Sorcery] Night Comet"), + (4630, "[Sorcery] Thops's Barrier"), + (4640, "[Sorcery] Carian Retaliation"), + (4650, "[Sorcery] Eternal Darkness"), + (4660, "[Sorcery] Unseen Blade"), + (4670, "[Sorcery] Unseen Form"), + (4700, "[Sorcery] Meteorite"), + (4701, "[Sorcery] Meteorite of Astel"), + (4710, "[Sorcery] Rock Sling"), + (4720, "[Sorcery] Gravity Well"), + (4721, "[Sorcery] Collapsing Stars"), + (4800, "[Sorcery] Magma Shot"), + (4810, "[Sorcery] Gelmir's Fury"), + (4820, "[Sorcery] Roiling Magma"), + (4830, "[Sorcery] Rykard's Rancor"), + (4900, "[Sorcery] Briars of Sin"), + (4910, "[Sorcery] Briars of Punishment"), + (5000, "[Sorcery] Rancorcall"), + (5001, "[Sorcery] Ancient Death Rancor"), + (5010, "[Sorcery] Explosive Ghostflame"), + (5020, "[Sorcery] Fia's Mist"), + (5030, "[Sorcery] Tibia's Summons"), + (5040, "[Sorcery] Death Lightning"), + (5100, "[Sorcery] Oracle Bubbles"), + (5110, "[Sorcery] Great Oracular Bubble"), + (6000, "[Incantation] Catch Flame"), + (6001, "[Incantation] O- Flame!"), + (6010, "[Incantation] Flame Sling"), + (6020, "[Incantation] Flame- Fall Upon Them"), + (6030, "[Incantation] Whirl- O Flame!"), + (6040, "[Incantation] Flame- Cleanse Me"), + (6050, "[Incantation] Flame- Grant Me Strength"), + (6060, "[Incantation] Flame- Protect Me"), + (6100, "[Incantation] Giantsflame Take Thee"), + (6110, "[Incantation] Flame of the Fell God"), + (6120, "[Incantation] Burn- O Flame!"), + (6210, "[Incantation] Black Flame"), + (6220, "[Incantation] Surge- O Flame!"), + (6230, "[Incantation] Scouring Black Flame"), + (6240, "[Incantation] Black Flame Ritual"), + (6250, "[Incantation] Black Flame Blade"), + (6260, "[Incantation] Black Flame's Protection"), + (6270, "[Incantation] Noble Presence"), + (6300, "[Incantation] Bloodflame Talons"), + (6310, "[Incantation] Bloodboon"), + (6320, "[Incantation] Bloodflame Blade"), + (6330, "[Incantation] Barrier of Gold"), + (6340, "[Incantation] Protection of the Erdtree"), + (6400, "[Incantation] Rejection"), + (6410, "[Incantation] Wrath of Gold"), + (6420, "[Incantation] Urgent Heal"), + (6421, "[Incantation] Heal"), + (6422, "[Incantation] Great Heal"), + (6423, "[Incantation] Lord's Heal"), + (6424, "[Incantation] Erdtree Heal"), + (6430, "[Incantation] Blessing's Boon"), + (6431, "[Incantation] Blessing of the Erdtree"), + (6440, "[Incantation] Cure Poison"), + (6441, "[Incantation] Lord's Aid"), + (6450, "[Incantation] Flame Fortification"), + (6460, "[Incantation] Magic Fortification"), + (6470, "[Incantation] Lightning Fortification"), + (6480, "[Incantation] Divine Fortification"), + (6490, "[Incantation] Lord's Divine Fortification"), + (6500, "[Incantation] Night Maiden's Mist"), + (6510, "[Incantation] Assassin's Approach"), + (6520, "[Incantation] Shadow Bait"), + (6530, "[Incantation] Darkness"), + (6600, "[Incantation] Golden Vow"), + (6700, "[Incantation] Discus of Light"), + (6701, "[Incantation] Triple Rings of Light"), + (6710, "[Incantation] Radagon's Rings of Light"), + (6720, "[Incantation] Elden Stars"), + (6730, "[Incantation] Law of Regression"), + (6740, "[Incantation] Immutable Shield"), + (6750, "[Incantation] Litany of Proper Death"), + (6760, "[Incantation] Law of Causality"), + (6770, "[Incantation] Order's Blade"), + (6780, "[Incantation] Order Healing"), + (6800, "[Incantation] Bestial Sling"), + (6810, "[Incantation] Stone of Gurranq"), + (6820, "[Incantation] Beast Claw"), + (6830, "[Incantation] Gurranq's Beast Claw"), + (6840, "[Incantation] Bestial Vitality"), + (6850, "[Incantation] Bestial Constitution"), + (6900, "[Incantation] Lightning Spear"), + (6910, "[Incantation] Ancient Dragons' Lightning Strike"), + (6920, "[Incantation] Lightning Strike"), + (6921, "[Incantation] Frozen Lightning Spear"), + (6930, "[Incantation] Honed Bolt"), + (6940, "[Incantation] Ancient Dragons' Lightning Spear"), + (6941, "[Incantation] Fortissax's Lightning Spear"), + (6950, "[Incantation] Lansseax's Glaive"), + (6960, "[Incantation] Electrify Armament"), + (6970, "[Incantation] Vyke's Dragonbolt"), + (6971, "[Incantation] Dragonbolt Blessing"), + (7000, "[Incantation] Dragonfire"), + (7001, "[Incantation] Agheel's Flame"), + (7010, "[Incantation] Magma Breath"), + (7011, "[Incantation] Theodorix's Magma"), + (7020, "[Incantation] Dragonice"), + (7021, "[Incantation] Borealis's Mist"), + (7030, "[Incantation] Rotten Breath"), + (7031, "[Incantation] Ekzykes's Decay"), + (7040, "[Incantation] Glintstone Breath"), + (7041, "[Incantation] Smarag's Glintstone Breath"), + (7050, "[Incantation] Placidusax's Ruin"), + (7060, "[Incantation] Dragonclaw"), + (7080, "[Incantation] Dragonmaw"), + (7090, "[Incantation] Greyoll's Roar"), + (7200, "[Incantation] Pest Threads"), + (7210, "[Incantation] Swarm of Flies"), + (7220, "[Incantation] Poison Mist"), + (7230, "[Incantation] Poison Armament"), + (7240, "[Incantation] Scarlet Aeonia"), + (7300, "[Incantation] Inescapable Frenzy"), + (7310, "[Incantation] The Flame of Frenzy"), + (7311, "[Incantation] Unendurable Frenzy"), + (7320, "[Incantation] Frenzied Burst"), + (7330, "[Incantation] Howl of Shabriri"), + (7500, "[Incantation] Aspects of the Crucible: Tail"), + (7510, "[Incantation] Aspects of the Crucible: Horns"), + (7520, "[Incantation] Aspects of the Crucible: Breath"), + (7530, "[Incantation] Black Blade"), + (7900, "[Incantation] Fire's Deadly Sin"), + (7903, "[Incantation] Golden Lightning Fortification"), + (8000, "Stonesword Key"), + (8010, "Rusty Key"), + (8102, "Lucent Baldachin's Blessing"), + (8105, "Dectus Medallion (Left)"), + (8106, "Dectus Medallion (Right)"), + (8107, "Rold Medallion"), + (8109, "Academy Glintstone Key"), + (8111, "Carian Inverted Statue"), + (8121, "Dark Moon Ring"), + (8126, "Fingerprint Grape"), + (8127, "Letter from Volcano Manor"), + (8128, "Tonic of Forgetfulness"), + (8129, "Serpent's Amnion"), + (8130, "Rya's Necklace"), + (8131, "Irina's Letter"), + (8132, "Letter from Volcano Manor"), + (8133, "Red Letter"), + (8134, "Drawing-Room Key"), + (8136, "Rya's Necklace"), + (8137, "Volcano Manor Invitation"), + (8142, "Amber Starlight"), + (8143, "Seluvis's Introduction"), + (8144, "Sellen's Primal Glintstone"), + (8146, "Miniature Ranni"), + (8147, "Asimi- Silver Tear"), + (8148, "Godrick's Great Rune"), + (8149, "Radahn's Great Rune"), + (8150, "Morgott's Great Rune"), + (8151, "Rykard's Great Rune"), + (8152, "Mohg's Great Rune"), + (8153, "Malenia's Great Rune"), + (8154, "Lord of Blood's Favor"), + (8155, "Lord of Blood's Favor"), + (8156, "Burial Crow's Letter"), + (8158, "Spirit Calling Bell"), + (8159, "Fingerslayer Blade"), + (8161, "Sewing Needle"), + (8162, "Gold Sewing Needle"), + (8163, "Tailoring Tools"), + (8164, "Seluvis's Potion"), + (8165, ""), + (8166, "Amber Draught"), + (8167, "Letter to Patches"), + (8168, "Dancer's Castanets"), + (8169, "Sellian Sealbreaker"), + (8171, "Chrysalids' Memento"), + (8172, "Black Knifeprint"), + (8173, "Letter to Bernahl"), + (8174, "Academy Glintstone Key"), + (8175, "Haligtree Secret Medallion (Left)"), + (8176, "Haligtree Secret Medallion (Right)"), + (8181, "Burial Crow's Letter"), + (8182, "Mending Rune of Perfect Order"), + (8183, "Mending Rune of the Death-Prince"), + (8184, "Mending Rune of the Fell Curse"), + (8185, "Larval Tear"), + (8186, "Imbued Sword Key"), + (8187, "Miniature Ranni"), + (8188, "Golden Tailoring Tools"), + (8189, "Iji's Confession"), + (8190, "Knifeprint Clue"), + (8191, "Cursemark of Death"), + (8192, "Asimi's Husk"), + (8193, "Seedbed Curse"), + (8194, "The Stormhawk King"), + (8195, "Asimi- Silver Chrysalid"), + (8196, "Unalloyed Gold Needle"), + (8197, "Sewer-Gaol Key"), + (8198, "Meeting Place Map"), + (8199, "Discarded Palace Key"), + (8200, "'Homing Instinct' Painting"), + (8201, "'Resurrection' Painting"), + (8202, "'Champion's Song' Painting"), + (8203, "'Sorcerer' Painting"), + (8204, "'Prophecy' Painting"), + (8205, "'Flightless Bird' Painting"), + (8206, "'Redmane' Painting"), + (8221, "Zorayas's Letter"), + (8222, "Alexander's Innards"), + (8223, "Rogier's Letter"), + (8224, "Note: The Preceptor's Secrets"), + (8225, "Weathered Map"), + (8226, "Note: The Preceptor's Secret"), + (8227, "Weathered Map"), + (8500, "Crafting Kit"), + (8590, "Whetstone Knife"), + (8600, "Map: Limgrave- West"), + (8601, "Map: Weeping Peninsula"), + (8602, "Map: Limgrave- East"), + (8603, "Map: Liurnia- East"), + (8604, "Map: Liurnia- North"), + (8605, "Map: Liurnia- West"), + (8606, "Map: Altus Plateau"), + (8607, "Map: Leyndell- Royal Capital"), + (8608, "Map: Mt. Gelmir"), + (8609, "Map: Caelid"), + (8610, "Map: Dragonbarrow"), + (8611, "Map: Mountaintops of the Giants- West"), + (8612, "Map: Mountaintops of the Giants- East"), + (8613, "Map: Ainsel River"), + (8614, "Map: Lake of Rot"), + (8615, "Map: Siofra River"), + (8616, "Map: Mohgwyn Palace"), + (8617, "Map: Deeproot Depths"), + (8618, "Map: Consecrated Snowfield"), + (8660, "Mirage Riddle"), + (8700, "Note: Hidden Cave"), + (8701, "Note: Imp Shades"), + (8702, "Note: Flask of Wondrous Physick"), + (8703, "Note: Stonedigger Trolls"), + (8704, "Note: Walking Mausoleum"), + (8705, "Note: Unseen Assassins"), + (8706, "Note: Great Coffins"), + (8707, "Note: Flame Chariots"), + (8708, "Note: Demi-human Mobs"), + (8709, "Note: Land Squirts"), + (8710, "Note: Gravity's Advantage"), + (8711, "Note: Revenants"), + (8712, "Note: Waypoint Ruins"), + (8713, "Note: Gateway"), + (8714, "Note: Miquella's Needle"), + (8715, "Note: Frenzied Flame Village"), + (8716, "Note: The Lord of Frenzied Flame"), + (8717, "Note: Below the Capital"), + (8750, "Note: Hidden Cave"), + (8751, "Note: Imp Shades"), + (8752, "Note: Flask of Wondrous Physick"), + (8753, "Note: Stonedigger Trolls"), + (8754, "Note: Walking Mausoleum"), + (8755, "Note: Unseen Assassins"), + (8756, "Note: Great Coffins"), + (8757, "Note: Flame Chariots"), + (8758, "Note: Demi-human Mobs"), + (8759, "Note: Land Squirts"), + (8760, "Note: Gravity's Advantage"), + (8761, "Note: Revenants"), + (8762, "Note: Waypoint Ruins"), + (8763, "Note: Gateway"), + (8765, "Note: Frenzied Flame Village"), + (8767, "Note: Below the Capital"), + (8850, "Conspectus Scroll"), + (8851, "Royal House Scroll"), + (8852, ""), + (8853, ""), + (8854, ""), + (8855, "Fire Monks' Prayerbook"), + (8856, "Giant's Prayerbook"), + (8857, "Godskin Prayerbook"), + (8858, "Two Fingers' Prayerbook"), + (8859, "Assassin's Prayerbook"), + (8860, "Erdtree Prayerbook"), + (8861, "Erdtree Codex"), + (8862, "Golden Order Principia"), + (8863, "Golden Order Principles"), + (8864, "Dragon Cult Prayerbook"), + (8865, "Ancient Dragon Prayerbook"), + (8866, "Academy Scroll"), + (8910, "Pidia's Bell Bearing"), + (8911, "Seluvis's Bell Bearing"), + (8912, "Patches' Bell Bearing"), + (8913, "Sellen's Bell Bearing"), + (8914, ""), + (8915, "D's Bell Bearing"), + (8916, "Bernahl's Bell Bearing"), + (8917, "Miriel's Bell Bearing"), + (8918, "Gostoc's Bell Bearing"), + (8919, "Thops's Bell Bearing"), + (8920, "Kalé's Bell Bearing"), + (8921, "Nomadic Merchant's Bell Bearing [1]"), + (8922, "Nomadic Merchant's Bell Bearing [2]"), + (8923, "Nomadic Merchant's Bell Bearing [3]"), + (8924, "Nomadic Merchant's Bell Bearing [4]"), + (8925, "Nomadic Merchant's Bell Bearing [5]"), + (8926, "Isolated Merchant's Bell Bearing [1]"), + (8927, "Isolated Merchant's Bell Bearing [2]"), + (8928, "Nomadic Merchant's Bell Bearing [6]"), + (8929, "Hermit Merchant's Bell Bearing [1]"), + (8930, "Nomadic Merchant's Bell Bearing [7]"), + (8931, "Nomadic Merchant's Bell Bearing [8]"), + (8932, "Nomadic Merchant's Bell Bearing [9]"), + (8933, "Nomadic Merchant's Bell Bearing [10]"), + (8934, "Nomadic Merchant's Bell Bearing [11]"), + (8935, "Isolated Merchant's Bell Bearing [3]"), + (8936, "Hermit Merchant's Bell Bearing [2]"), + (8937, "Abandoned Merchant's Bell Bearing"), + (8938, "Hermit Merchant's Bell Bearing [3]"), + (8939, "Imprisoned Merchant's Bell Bearing"), + (8940, "Iji's Bell Bearing"), + (8941, "Rogier's Bell Bearing"), + (8942, "Blackguard's Bell Bearing"), + (8943, "Corhyn's Bell Bearing"), + (8944, "Gowry's Bell Bearing"), + (8945, "Bone Peddler's Bell Bearing"), + (8946, "Meat Peddler's Bell Bearing"), + (8947, "Medicine Peddler's Bell Bearing"), + (8948, "Gravity Stone Peddler's Bell Bearing"), + (8949, ""), + (8950, ""), + (8951, "Smithing-Stone Miner's Bell Bearing [1]"), + (8952, "Smithing-Stone Miner's Bell Bearing [2]"), + (8953, "Smithing-Stone Miner's Bell Bearing [3]"), + (8954, "Smithing-Stone Miner's Bell Bearing [4]"), + (8955, "Somberstone Miner's Bell Bearing [1]"), + (8956, "Somberstone Miner's Bell Bearing [2]"), + (8957, "Somberstone Miner's Bell Bearing [3]"), + (8958, "Somberstone Miner's Bell Bearing [4]"), + (8959, "Somberstone Miner's Bell Bearing [5]"), + (8960, "Glovewort Picker's Bell Bearing [1]"), + (8961, "Glovewort Picker's Bell Bearing [2]"), + (8962, "Glovewort Picker's Bell Bearing [3]"), + (8963, "Ghost-Glovewort Picker's Bell Bearing [1]"), + (8964, "Ghost-Glovewort Picker's Bell Bearing [2]"), + (8965, "Ghost-Glovewort Picker's Bell Bearing [3]"), + (8970, "Iron Whetblade"), + (8971, "Red-Hot Whetblade"), + (8972, "Sanctified Whetblade"), + (8973, "Glintstone Whetblade"), + (8974, "Black Whetblade"), + (8975, "Unalloyed Gold Needle"), + (8976, "Unalloyed Gold Needle"), + (8977, "Valkyrie's Prosthesis"), + (8978, "Sellia's Secret"), + (8979, "Beast Eye"), + (8980, "Weathered Dagger"), + (9000, "Bow"), + (9001, "Polite Bow"), + (9002, "My Thanks"), + (9003, "Curtsy"), + (9004, "Reverential Bow"), + (9005, "My Lord"), + (9006, "Warm Welcome"), + (9007, "Wave"), + (9008, "Casual Greeting"), + (9009, "Strength!"), + (9010, "As You Wish"), + (9011, "Point Forwards"), + (9012, "Point Upwards"), + (9013, "Point Downwards"), + (9014, "Beckon"), + (9015, "Wait!"), + (9016, "Calm Down!"), + (9017, "Nod In Thought"), + (9018, "Extreme Repentance"), + (9019, "Grovel For Mercy"), + (9020, "Rallying Cry"), + (9021, "Heartening Cry"), + (9022, "By My Sword"), + (9023, "Hoslow's Oath"), + (9024, "Fire Spur Me"), + (9026, "Bravo!"), + (9027, "Jump for Joy"), + (9028, "Triumphant Delight"), + (9029, "Fancy Spin"), + (9030, "Finger Snap"), + (9031, "Dejection"), + (9032, "Patches' Crouch"), + (9033, "Crossed Legs"), + (9034, "Rest"), + (9035, "Sitting Sideways"), + (9036, "Dozing Cross-Legged"), + (9037, "Spread Out"), + (9039, "Balled Up"), + (9040, "What Do You Want?"), + (9041, "Prayer"), + (9042, "Desperate Prayer"), + (9043, "Rapture"), + (9045, "Erudition"), + (9046, "Outer Order"), + (9047, "Inner Order"), + (9048, "Golden Order Totality"), + (9049, "The Ring"), + (9050, "The Ring"), + (9100, "About Sites of Grace"), + (9101, "About Sorceries and Incantations"), + (9102, "About Bows"), + (9103, "About Crouching"), + (9104, "About Stance-Breaking"), + (9105, "About Stakes of Marika"), + (9106, "About Guard Counters"), + (9107, "About the Map"), + (9108, "About Guidance of Grace"), + (9109, "About Horseback Riding"), + (9110, "About Death"), + (9111, "About Summoning Spirits"), + (9112, "About Guarding"), + (9113, "About Item Crafting"), + (9115, "About Flask of Wondrous Physick"), + (9116, "About Adding Skills"), + (9117, "About Birdseye Telescopes"), + (9118, "About Spiritspring Jumping"), + (9119, "About Vanquishing Enemy Groups"), + (9120, "About Teardrop Scarabs"), + (9121, "About Summoning Other Players"), + (9122, "About Cooperative Multiplayer"), + (9123, "About Competitive Multiplayer"), + (9124, "About Invasion Multiplayer"), + (9125, "About Hunter Multiplayer"), + (9126, "About Summoning Pools"), + (9127, "About Monument Icon"), + (9128, "About Requesting Help from Hunters"), + (9129, "About Skills"), + (9130, "About Fast Travel to Sites of Grace"), + (9131, "About Strengthening Armaments"), + (9132, "About Roundtable Hold"), + (9134, "About Materials"), + (9135, "About Containers"), + (9136, "About Adding Affinities"), + (9137, "About Pouches"), + (9138, "About Dodging"), + (9140, "About Wielding Armaments"), + (9141, "About Great Runes"), + (9142, ""), + (9150, ""), + (9151, ""), + (9152, ""), + (9153, ""), + (9195, "About Multiplayer"), + (9300, "Nomadic Warrior's Cookbook [1]"), + (9301, "Nomadic Warrior's Cookbook [3]"), + (9302, "Nomadic Warrior's Cookbook [6]"), + (9303, "Nomadic Warrior's Cookbook [10]"), + (9304, "Fugitive Warrior's Recipe [5]"), + (9305, "Nomadic Warrior's Cookbook [7]"), + (9306, "Nomadic Warrior's Cookbook [12]"), + (9307, "Nomadic Warrior's Cookbook [19]"), + (9308, "Nomadic Warrior's Cookbook [13]"), + (9309, "Nomadic Warrior's Cookbook [23]"), + (9310, "Nomadic Warrior's Cookbook [17]"), + (9311, "Nomadic Warrior's Cookbook [2]"), + (9312, "Nomadic Warrior's Cookbook [21]"), + (9313, "Missionary's Cookbook [6]"), + (9314, ""), + (9315, ""), + (9316, ""), + (9317, ""), + (9318, ""), + (9319, ""), + (9320, "Armorer's Cookbook [1]"), + (9321, "Armorer's Cookbook [2]"), + (9322, "Nomadic Warrior's Cookbook [11]"), + (9323, "Nomadic Warrior's Cookbook [20]"), + (9324, "Armorer's Cookbook (5)"), + (9325, "Armorer's Cookbook [7]"), + (9326, "Armorer's Cookbook [4]"), + (9327, "Nomadic Warrior's Cookbook [18]"), + (9328, "Armorer's Cookbook [3]"), + (9329, "Nomadic Warrior's Cookbook [16]"), + (9330, "Armorer's Cookbook [6]"), + (9331, "Armorer's Cookbook [5]"), + (9332, ""), + (9333, ""), + (9334, ""), + (9335, ""), + (9336, ""), + (9337, ""), + (9338, ""), + (9339, ""), + (9340, "Glintstone Craftsman's Cookbook [4]"), + (9341, "Glintstone Craftsman's Cookbook [1]"), + (9342, "Glintstone Craftsman's Cookbook [5]"), + (9343, "Nomadic Warrior's Cookbook [9]"), + (9344, "Glintstone Craftsman's Cookbook [8]"), + (9345, "Glintstone Craftsman's Cookbook [2]"), + (9346, "Glintstone Craftsman's Cookbook [6]"), + (9347, "Glintstone Craftsman's Cookbook [7]"), + (9348, "Glintstone Craftsman's Cookbook [3]"), + (9349, ""), + (9350, ""), + (9351, ""), + (9352, ""), + (9353, ""), + (9354, ""), + (9355, ""), + (9356, ""), + (9357, ""), + (9358, ""), + (9359, ""), + (9360, "Missionary's Cookbook [2]"), + (9361, "Missionary's Cookbook [1]"), + (9362, "Missionary's Cookbook (3)"), + (9363, "Missionary's Cookbook [5]"), + (9364, "Missionary's Cookbook [4]"), + (9365, "Missionary's Cookbook [3]"), + (9366, ""), + (9367, ""), + (9368, ""), + (9369, ""), + (9370, ""), + (9380, "Nomadic Warrior's Cookbook [4]"), + (9381, "Perfumer's Cookbook (1)"), + (9382, "Perfumer's Cookbook (2)"), + (9383, "Nomadic Warrior's Cookbook [5]"), + (9384, "Perfumer's Cookbook [1]"), + (9385, "Perfumer's Cookbook [2]"), + (9386, "Perfumer's Cookbook [3]"), + (9387, "Nomadic Warrior's Cookbook [14]"), + (9388, "Nomadic Warrior's Cookbook [8]"), + (9389, "Nomadic Warrior's Cookbook [22]"), + (9390, "Nomadic Warrior's Cookbook [15]"), + (9391, "Nomadic Warrior's Cookbook [24]"), + (9392, "Perfumer's Cookbook [4]"), + (9393, "Perfumer's Cookbook (13)"), + (9394, ""), + (9395, ""), + (9396, ""), + (9397, ""), + (9398, ""), + (9399, ""), + (9400, "Ancient Dragon Apostle's Cookbook [1]"), + (9401, "Ancient Dragon Apostle's Cookbook [2]"), + (9402, "Ancient Dragon Apostle's Cookbook [4]"), + (9403, "Ancient Dragon Apostle's Cookbook [3]"), + (9404, ""), + (9405, ""), + (9406, ""), + (9407, ""), + (9408, ""), + (9409, ""), + (9410, ""), + (9420, "Fevor's Cookbook [1]"), + (9421, "Fevor's Cookbook [3]"), + (9422, "Fevor's Cookbook [2]"), + (9423, "Missionary's Cookbook [7]"), + (9424, ""), + (9425, ""), + (9426, ""), + (9427, ""), + (9428, ""), + (9429, ""), + (9430, ""), + (9440, "Frenzied's Cookbook [1]"), + (9441, "Frenzied's Cookbook [2]"), + (9442, ""), + (9443, ""), + (9444, ""), + (9445, ""), + (9446, ""), + (9447, ""), + (9448, ""), + (9449, ""), + (9450, ""), + (9500, "Cracked Pot"), + (9501, "Ritual Pot"), + (9510, "Perfume Bottle"), + (10000, "Glass Shard"), + (10010, "Golden Seed"), + (10020, "Sacred Tear"), + (10030, "Memory Stone"), + (10040, "Talisman Pouch"), + (10060, "Dragon Heart"), + (10070, "Lost Ashes of War"), + (10080, "Great Rune of the Unborn"), + (10100, "Smithing Stone [1]"), + (10101, "Smithing Stone [2]"), + (10102, "Smithing Stone [3]"), + (10103, "Smithing Stone [4]"), + (10104, "Smithing Stone [5]"), + (10105, "Smithing Stone [6]"), + (10106, "Smithing Stone [7]"), + (10107, "Smithing Stone [8]"), + (10140, "Ancient Dragon Smithing Stone"), + (10160, "Somber Smithing Stone [1]"), + (10161, "Somber Smithing Stone [2]"), + (10162, "Somber Smithing Stone [3]"), + (10163, "Somber Smithing Stone [4]"), + (10164, "Somber Smithing Stone [5]"), + (10165, "Somber Smithing Stone [6]"), + (10166, "Somber Smithing Stone [7]"), + (10167, "Somber Smithing Stone [8]"), + (10168, "Somber Ancient Dragon Smithing Stone"), + (10200, "Somber Smithing Stone [9]"), + (10900, "Grave Glovewort [1]"), + (10901, "Grave Glovewort [2]"), + (10902, "Grave Glovewort [3]"), + (10903, "Grave Glovewort [4]"), + (10904, "Grave Glovewort [5]"), + (10905, "Grave Glovewort [6]"), + (10906, "Grave Glovewort [7]"), + (10907, "Grave Glovewort [8]"), + (10908, "Grave Glovewort [9]"), + (10909, "Great Grave Glovewort"), + (10910, "Ghost Glovewort [1]"), + (10911, "Ghost Glovewort [2]"), + (10912, "Ghost Glovewort [3]"), + (10913, "Ghost Glovewort [4]"), + (10914, "Ghost Glovewort [5]"), + (10915, "Ghost Glovewort [6]"), + (10916, "Ghost Glovewort [7]"), + (10917, "Ghost Glovewort [8]"), + (10918, "Ghost Glovewort [9]"), + (10919, "Great Ghost Glovewort"), + (11000, "Crimsonspill Crystal Tear"), + (11001, "Greenspill Crystal Tear"), + (11002, "Crimson Crystal Tear"), + (11003, "Crimson Crystal Tear"), + (11004, "Cerulean Crystal Tear"), + (11005, "Cerulean Crystal Tear"), + (11006, "Speckled Hardtear"), + (11007, "Crimson Bubbletear"), + (11008, "Opaline Bubbletear"), + (11009, "Crimsonburst Crystal Tear"), + (11010, "Greenburst Crystal Tear"), + (11011, "Opaline Hardtear"), + (11012, "Winged Crystal Tear"), + (11013, "Thorny Cracked Tear"), + (11014, "Spiked Cracked Tear"), + (11015, "Windy Crystal Tear"), + (11016, "Ruptured Crystal Tear"), + (11017, "Ruptured Crystal Tear"), + (11018, "Leaden Hardtear"), + (11019, "Twiggy Cracked Tear"), + (11020, "Crimsonwhorl Bubbletear"), + (11021, "Strength-knot Crystal Tear"), + (11022, "Dexterity-knot Crystal Tear"), + (11023, "Intelligence-knot Crystal Tear"), + (11024, "Faith-knot Crystal Tear"), + (11025, "Cerulean Hidden Tear"), + (11026, "Stonebarb Cracked Tear"), + (11027, "Purifying Crystal Tear"), + (11028, "Flame-Shrouding Cracked Tear"), + (11029, "Magic-Shrouding Cracked Tear"), + (11030, "Lightning-Shrouding Cracked Tear"), + (11031, "Holy-Shrouding Cracked Tear"), + (15000, "Sliver of Meat"), + (15010, "Beast Liver"), + (15020, "Lump of Flesh"), + (15030, "Beast Blood"), + (15040, "Old Fang"), + (15050, "Budding Horn"), + (15060, "Flight Pinion"), + (15080, "Four-Toed Fowl Foot"), + (15090, "Turtle Neck Meat"), + (15100, "Human Bone Shard"), + (15110, "Great Dragonfly Head"), + (15120, "Slumbering Egg"), + (15130, "Crab Eggs"), + (15140, "Land Octopus Ovary"), + (15150, "Miranda Powder"), + (15160, "Strip of White Flesh"), + (15340, "Thin Beast Bones"), + (15341, "Hefty Beast Bone"), + (15400, "String"), + (15410, "Living Jar Shard"), + (15420, "Albinauric Bloodclot"), + (15430, "Stormhawk Feather"), + (20650, "Poisonbloom"), + (20651, "Trina's Lily"), + (20652, "Fulgurbloom"), + (20653, "Miquella's Lily"), + (20654, "Grave Violet"), + (20660, "Faded Erdleaf Flower"), + (20680, "Erdleaf Flower"), + (20681, "Altus Bloom"), + (20682, "Fire Blossom"), + (20683, "Golden Sunflower"), + (20685, "Tarnished Golden Sunflower"), + (20690, "Herba"), + (20691, "Arteria Leaf"), + (20710, "Dewkissed Herba"), + (20720, "Rowa Fruit"), + (20721, "Golden Rowa"), + (20722, "Rimed Rowa"), + (20723, "Bloodrose"), + (20740, "Eye of Yelough"), + (20750, "Crystal Bud"), + (20751, "Rimed Crystal Bud"), + (20753, "Sacramental Bud"), + (20760, "Mushroom"), + (20761, "Melted Mushroom"), + (20770, "Toxic Mushroom"), + (20775, "Root Resin"), + (20780, "Cracked Crystal"), + (20795, "Sanctuary Stone"), + (20800, "Nascent Butterfly"), + (20801, "Aeonian Butterfly"), + (20802, "Smoldering Butterfly"), + (20810, "Silver Firefly"), + (20811, "Gold Firefly"), + (20812, "Glintstone Firefly"), + (20820, "Golden Centipede"), + (20825, "Silver Tear Husk"), + (20830, "Gold-Tinged Excrement"), + (20831, "Blood-Tainted Excrement"), + (20840, "Cave Moss"), + (20841, "Budding Cave Moss"), + (20842, "Crystal Cave Moss"), + (20845, "Yellow Ember"), + (20850, "Volcanic Stone"), + (20852, "Formic Rock"), + (20855, "Gravel Stone"), + (50200, ""), + (50201, ""), + (50202, ""), + (50203, ""), + (51760, ""), + (53090, ""), + (53230, ""), + (53400, ""), + (53630, ""), + (53650, ""), + (53651, ""), + (53652, ""), + (53653, ""), + (53654, ""), + (53655, ""), + (53656, ""), + (53657, ""), + (53658, ""), + (200000, "Black Knife Tiche"), + (200001, "Black Knife Tiche +1"), + (200002, "Black Knife Tiche +2"), + (200003, "Black Knife Tiche +3"), + (200004, "Black Knife Tiche +4"), + (200005, "Black Knife Tiche +5"), + (200006, "Black Knife Tiche +6"), + (200007, "Black Knife Tiche +7"), + (200008, "Black Knife Tiche +8"), + (200009, "Black Knife Tiche +9"), + (200010, "Black Knife Tiche +10"), + (201000, "Banished Knight Oleg"), + (201001, "Banished Knight Oleg +1"), + (201002, "Banished Knight Oleg +2"), + (201003, "Banished Knight Oleg +3"), + (201004, "Banished Knight Oleg +4"), + (201005, "Banished Knight Oleg +5"), + (201006, "Banished Knight Oleg +6"), + (201007, "Banished Knight Oleg +7"), + (201008, "Banished Knight Oleg +8"), + (201009, "Banished Knight Oleg +9"), + (201010, "Banished Knight Oleg +10"), + (202000, "Banished Knight Engvall"), + (202001, "Banished Knight Engvall +1"), + (202002, "Banished Knight Engvall +2"), + (202003, "Banished Knight Engvall +3"), + (202004, "Banished Knight Engvall +4"), + (202005, "Banished Knight Engvall +5"), + (202006, "Banished Knight Engvall +6"), + (202007, "Banished Knight Engvall +7"), + (202008, "Banished Knight Engvall +8"), + (202009, "Banished Knight Engvall +9"), + (202010, "Banished Knight Engvall +10"), + (203000, "Fanged Imp Ashes"), + (203001, "Fanged Imp Ashes +1"), + (203002, "Fanged Imp Ashes +2"), + (203003, "Fanged Imp Ashes +3"), + (203004, "Fanged Imp Ashes +4"), + (203005, "Fanged Imp Ashes +5"), + (203006, "Fanged Imp Ashes +6"), + (203007, "Fanged Imp Ashes +7"), + (203008, "Fanged Imp Ashes +8"), + (203009, "Fanged Imp Ashes +9"), + (203010, "Fanged Imp Ashes +10"), + (204000, "Latenna the Albinauric"), + (204001, "Latenna the Albinauric +1"), + (204002, "Latenna the Albinauric +2"), + (204003, "Latenna the Albinauric +3"), + (204004, "Latenna the Albinauric +4"), + (204005, "Latenna the Albinauric +5"), + (204006, "Latenna the Albinauric +6"), + (204007, "Latenna the Albinauric +7"), + (204008, "Latenna the Albinauric +8"), + (204009, "Latenna the Albinauric +9"), + (204010, "Latenna the Albinauric +10"), + (205000, "Nomad Ashes"), + (205001, "Nomad Ashes +1"), + (205002, "Nomad Ashes +2"), + (205003, "Nomad Ashes +3"), + (205004, "Nomad Ashes +4"), + (205005, "Nomad Ashes +5"), + (205006, "Nomad Ashes +6"), + (205007, "Nomad Ashes +7"), + (205008, "Nomad Ashes +8"), + (205009, "Nomad Ashes +9"), + (205010, "Nomad Ashes +10"), + (206000, "Nightmaiden & Swordstress Puppets"), + (206001, "Nightmaiden & Swordstress Puppets +1"), + (206002, "Nightmaiden & Swordstress Puppets +2"), + (206003, "Nightmaiden & Swordstress Puppets +3"), + (206004, "Nightmaiden & Swordstress Puppets +4"), + (206005, "Nightmaiden & Swordstress Puppets +5"), + (206006, "Nightmaiden & Swordstress Puppets +6"), + (206007, "Nightmaiden & Swordstress Puppets +7"), + (206008, "Nightmaiden & Swordstress Puppets +8"), + (206009, "Nightmaiden & Swordstress Puppets +9"), + (206010, "Nightmaiden & Swordstress Puppets +10"), + (207000, "Mimic Tear Ashes"), + (207001, "Mimic Tear Ashes +1"), + (207002, "Mimic Tear Ashes +2"), + (207003, "Mimic Tear Ashes +3"), + (207004, "Mimic Tear Ashes +4"), + (207005, "Mimic Tear Ashes +5"), + (207006, "Mimic Tear Ashes +6"), + (207007, "Mimic Tear Ashes +7"), + (207008, "Mimic Tear Ashes +8"), + (207009, "Mimic Tear Ashes +9"), + (207010, "Mimic Tear Ashes +10"), + (208000, "Crystalian Ashes"), + (208001, "Crystalian Ashes +1"), + (208002, "Crystalian Ashes +2"), + (208003, "Crystalian Ashes +3"), + (208004, "Crystalian Ashes +4"), + (208005, "Crystalian Ashes +5"), + (208006, "Crystalian Ashes +6"), + (208007, "Crystalian Ashes +7"), + (208008, "Crystalian Ashes +8"), + (208009, "Crystalian Ashes +9"), + (208010, "Crystalian Ashes +10"), + (209000, "Ancestral Follower Ashes"), + (209001, "Ancestral Follower Ashes +1"), + (209002, "Ancestral Follower Ashes +2"), + (209003, "Ancestral Follower Ashes +3"), + (209004, "Ancestral Follower Ashes +4"), + (209005, "Ancestral Follower Ashes +5"), + (209006, "Ancestral Follower Ashes +6"), + (209007, "Ancestral Follower Ashes +7"), + (209008, "Ancestral Follower Ashes +8"), + (209009, "Ancestral Follower Ashes +9"), + (209010, "Ancestral Follower Ashes +10"), + (210000, "Winged Misbegotten Ashes"), + (210001, "Winged Misbegotten Ashes + 1"), + (210002, "Winged Misbegotten Ashes + 2"), + (210003, "Winged Misbegotten Ashes + 3"), + (210004, "Winged Misbegotten Ashes + 4"), + (210005, "Winged Misbegotten Ashes + 5"), + (210006, "Winged Misbegotten Ashes + 6"), + (210007, "Winged Misbegotten Ashes + 7"), + (210008, "Winged Misbegotten Ashes + 8"), + (210009, "Winged Misbegotten Ashes + 9"), + (210010, "Winged Misbegotten Ashes + 10"), + (211000, "Albinauric Ashes"), + (211001, "Albinauric Ashes +1"), + (211002, "Albinauric Ashes +2"), + (211003, "Albinauric Ashes +3"), + (211004, "Albinauric Ashes +4"), + (211005, "Albinauric Ashes +5"), + (211006, "Albinauric Ashes +6"), + (211007, "Albinauric Ashes +7"), + (211008, "Albinauric Ashes +8"), + (211009, "Albinauric Ashes +9"), + (211010, "Albinauric Ashes +10"), + (212000, "Skeletal Militiaman Ashes"), + (212001, "Skeletal Militiaman Ashes +1"), + (212002, "Skeletal Militiaman Ashes +2"), + (212003, "Skeletal Militiaman Ashes +3"), + (212004, "Skeletal Militiaman Ashes +4"), + (212005, "Skeletal Militiaman Ashes +5"), + (212006, "Skeletal Militiaman Ashes +6"), + (212007, "Skeletal Militiaman Ashes +7"), + (212008, "Skeletal Militiaman Ashes +8"), + (212009, "Skeletal Militiaman Ashes +9"), + (212010, "Skeletal Militiaman Ashes +10"), + (213000, "Skeletal Bandit Ashes"), + (213001, "Skeletal Bandit Ashes +1"), + (213002, "Skeletal Bandit Ashes +2"), + (213003, "Skeletal Bandit Ashes +3"), + (213004, "Skeletal Bandit Ashes +4"), + (213005, "Skeletal Bandit Ashes +5"), + (213006, "Skeletal Bandit Ashes +6"), + (213007, "Skeletal Bandit Ashes +7"), + (213008, "Skeletal Bandit Ashes +8"), + (213009, "Skeletal Bandit Ashes +9"), + (213010, "Skeletal Bandit Ashes +10"), + (214000, "Oracle Envoy Ashes"), + (214001, "Oracle Envoy Ashes +1"), + (214002, "Oracle Envoy Ashes +2"), + (214003, "Oracle Envoy Ashes +3"), + (214004, "Oracle Envoy Ashes +4"), + (214005, "Oracle Envoy Ashes +5"), + (214006, "Oracle Envoy Ashes +6"), + (214007, "Oracle Envoy Ashes +7"), + (214008, "Oracle Envoy Ashes +8"), + (214009, "Oracle Envoy Ashes +9"), + (214010, "Oracle Envoy Ashes +10"), + (215000, "Putrid Corpse Ashes"), + (215001, "Putrid Corpse Ashes +1"), + (215002, "Putrid Corpse Ashes +2"), + (215003, "Putrid Corpse Ashes +3"), + (215004, "Putrid Corpse Ashes +4"), + (215005, "Putrid Corpse Ashes +5"), + (215006, "Putrid Corpse Ashes +6"), + (215007, "Putrid Corpse Ashes +7"), + (215008, "Putrid Corpse Ashes +8"), + (215009, "Putrid Corpse Ashes +9"), + (215010, "Putrid Corpse Ashes +10"), + (216000, "Depraved Perfumer Carmaan"), + (216001, "Depraved Perfumer Carmaan +1"), + (216002, "Depraved Perfumer Carmaan +2"), + (216003, "Depraved Perfumer Carmaan +3"), + (216004, "Depraved Perfumer Carmaan +4"), + (216005, "Depraved Perfumer Carmaan +5"), + (216006, "Depraved Perfumer Carmaan +6"), + (216007, "Depraved Perfumer Carmaan +7"), + (216008, "Depraved Perfumer Carmaan +8"), + (216009, "Depraved Perfumer Carmaan +9"), + (216010, "Depraved Perfumer Carmaan +10"), + (217000, "Perfumer Tricia"), + (217001, "Perfumer Tricia +1"), + (217002, "Perfumer Tricia +2"), + (217003, "Perfumer Tricia +3"), + (217004, "Perfumer Tricia +4"), + (217005, "Perfumer Tricia +5"), + (217006, "Perfumer Tricia +6"), + (217007, "Perfumer Tricia +7"), + (217008, "Perfumer Tricia +8"), + (217009, "Perfumer Tricia +9"), + (217010, "Perfumer Tricia +10"), + (218000, "Glintstone Sorcerer Ashes"), + (218001, "Glintstone Sorcerer Ashes +1"), + (218002, "Glintstone Sorcerer Ashes +2"), + (218003, "Glintstone Sorcerer Ashes +3"), + (218004, "Glintstone Sorcerer Ashes +4"), + (218005, "Glintstone Sorcerer Ashes +5"), + (218006, "Glintstone Sorcerer Ashes +6"), + (218007, "Glintstone Sorcerer Ashes +7"), + (218008, "Glintstone Sorcerer Ashes +8"), + (218009, "Glintstone Sorcerer Ashes +9"), + (218010, "Glintstone Sorcerer Ashes +10"), + (219000, "Twinsage Sorcerer Ashes"), + (219001, "Twinsage Sorcerer Ashes +1"), + (219002, "Twinsage Sorcerer Ashes +2"), + (219003, "Twinsage Sorcerer Ashes +3"), + (219004, "Twinsage Sorcerer Ashes +4"), + (219005, "Twinsage Sorcerer Ashes +5"), + (219006, "Twinsage Sorcerer Ashes +6"), + (219007, "Twinsage Sorcerer Ashes +7"), + (219008, "Twinsage Sorcerer Ashes +8"), + (219009, "Twinsage Sorcerer Ashes +9"), + (219010, "Twinsage Sorcerer Ashes +10"), + (220000, "Page Ashes"), + (220001, "Page Ashes +1"), + (220002, "Page Ashes +2"), + (220003, "Page Ashes +3"), + (220004, "Page Ashes +4"), + (220005, "Page Ashes +5"), + (220006, "Page Ashes +6"), + (220007, "Page Ashes +7"), + (220008, "Page Ashes +8"), + (220009, "Page Ashes +9"), + (220010, "Page Ashes +10"), + (221000, "Battlemage Hugues"), + (221001, "Battlemage Hugues +1"), + (221002, "Battlemage Hugues +2"), + (221003, "Battlemage Hugues +3"), + (221004, "Battlemage Hugues +4"), + (221005, "Battlemage Hugues +5"), + (221006, "Battlemage Hugues +6"), + (221007, "Battlemage Hugues +7"), + (221008, "Battlemage Hugues +8"), + (221009, "Battlemage Hugues +9"), + (221010, "Battlemage Hugues +10"), + (222000, "Clayman Ashes"), + (222001, "Clayman Ashes +1"), + (222002, "Clayman Ashes +2"), + (222003, "Clayman Ashes +3"), + (222004, "Clayman Ashes +4"), + (222005, "Clayman Ashes +5"), + (222006, "Clayman Ashes +6"), + (222007, "Clayman Ashes +7"), + (222008, "Clayman Ashes +8"), + (222009, "Clayman Ashes +9"), + (222010, "Clayman Ashes +10"), + (223000, "Cleanrot Knight Finlay"), + (223001, "Cleanrot Knight Finlay +1"), + (223002, "Cleanrot Knight Finlay +2"), + (223003, "Cleanrot Knight Finlay +3"), + (223004, "Cleanrot Knight Finlay +4"), + (223005, "Cleanrot Knight Finlay +5"), + (223006, "Cleanrot Knight Finlay +6"), + (223007, "Cleanrot Knight Finlay +7"), + (223008, "Cleanrot Knight Finlay +8"), + (223009, "Cleanrot Knight Finlay +9"), + (223010, "Cleanrot Knight Finlay +10"), + (224000, "Kindred of Rot Ashes"), + (224001, "Kindred of Rot Ashes +1"), + (224002, "Kindred of Rot Ashes +2"), + (224003, "Kindred of Rot Ashes +3"), + (224004, "Kindred of Rot Ashes +4"), + (224005, "Kindred of Rot Ashes +5"), + (224006, "Kindred of Rot Ashes +6"), + (224007, "Kindred of Rot Ashes +7"), + (224008, "Kindred of Rot Ashes +8"), + (224009, "Kindred of Rot Ashes +9"), + (224010, "Kindred of Rot Ashes +10"), + (225000, "Marionette Soldier Ashes"), + (225001, "Marionette Soldier Ashes +1"), + (225002, "Marionette Soldier Ashes +2"), + (225003, "Marionette Soldier Ashes +3"), + (225004, "Marionette Soldier Ashes +4"), + (225005, "Marionette Soldier Ashes +5"), + (225006, "Marionette Soldier Ashes +6"), + (225007, "Marionette Soldier Ashes +7"), + (225008, "Marionette Soldier Ashes +8"), + (225009, "Marionette Soldier Ashes +9"), + (225010, "Marionette Soldier Ashes +10"), + (226000, "Avionette Soldier Ashes"), + (226001, "Avionette Soldier Ashes +1"), + (226002, "Avionette Soldier Ashes +2"), + (226003, "Avionette Soldier Ashes +3"), + (226004, "Avionette Soldier Ashes +4"), + (226005, "Avionette Soldier Ashes +5"), + (226006, "Avionette Soldier Ashes +6"), + (226007, "Avionette Soldier Ashes +7"), + (226008, "Avionette Soldier Ashes +8"), + (226009, "Avionette Soldier Ashes +9"), + (226010, "Avionette Soldier Ashes +10"), + (227000, "Fire Monk Ashes"), + (227001, "Fire Monk Ashes +1"), + (227002, "Fire Monk Ashes +2"), + (227003, "Fire Monk Ashes +3"), + (227004, "Fire Monk Ashes +4"), + (227005, "Fire Monk Ashes +5"), + (227006, "Fire Monk Ashes +6"), + (227007, "Fire Monk Ashes +7"), + (227008, "Fire Monk Ashes +8"), + (227009, "Fire Monk Ashes +9"), + (227010, "Fire Monk Ashes +10"), + (228000, "Blackflame Monk Amon"), + (228001, "Blackflame Monk Amon +1"), + (228002, "Blackflame Monk Amon +2"), + (228003, "Blackflame Monk Amon +3"), + (228004, "Blackflame Monk Amon +4"), + (228005, "Blackflame Monk Amon +5"), + (228006, "Blackflame Monk Amon +6"), + (228007, "Blackflame Monk Amon +7"), + (228008, "Blackflame Monk Amon +8"), + (228009, "Blackflame Monk Amon +9"), + (228010, "Blackflame Monk Amon +10"), + (229000, "Man-Serpent Ashes"), + (229001, "Man-Serpent Ashes +1"), + (229002, "Man-Serpent Ashes +2"), + (229003, "Man-Serpent Ashes +3"), + (229004, "Man-Serpent Ashes +4"), + (229005, "Man-Serpent Ashes +5"), + (229006, "Man-Serpent Ashes +6"), + (229007, "Man-Serpent Ashes +7"), + (229008, "Man-Serpent Ashes +8"), + (229009, "Man-Serpent Ashes +9"), + (229010, "Man-Serpent Ashes +10"), + (230000, "Azula Beastman Ashes"), + (230001, "Azula Beastman Ashes +1"), + (230002, "Azula Beastman Ashes +2"), + (230003, "Azula Beastman Ashes +3"), + (230004, "Azula Beastman Ashes +4"), + (230005, "Azula Beastman Ashes +5"), + (230006, "Azula Beastman Ashes +6"), + (230007, "Azula Beastman Ashes +7"), + (230008, "Azula Beastman Ashes +8"), + (230009, "Azula Beastman Ashes +9"), + (230010, "Azula Beastman Ashes +10"), + (231000, "Kaiden Sellsword Ashes"), + (231001, "Kaiden Sellsword Ashes +1"), + (231002, "Kaiden Sellsword Ashes +2"), + (231003, "Kaiden Sellsword Ashes +3"), + (231004, "Kaiden Sellsword Ashes +4"), + (231005, "Kaiden Sellsword Ashes +5"), + (231006, "Kaiden Sellsword Ashes +6"), + (231007, "Kaiden Sellsword Ashes +7"), + (231008, "Kaiden Sellsword Ashes +8"), + (231009, "Kaiden Sellsword Ashes +9"), + (231010, "Kaiden Sellsword Ashes +10"), + (232000, "Lone Wolf Ashes"), + (232001, "Lone Wolf Ashes +1"), + (232002, "Lone Wolf Ashes +2"), + (232003, "Lone Wolf Ashes +3"), + (232004, "Lone Wolf Ashes +4"), + (232005, "Lone Wolf Ashes +5"), + (232006, "Lone Wolf Ashes +6"), + (232007, "Lone Wolf Ashes +7"), + (232008, "Lone Wolf Ashes +8"), + (232009, "Lone Wolf Ashes +9"), + (232010, "Lone Wolf Ashes +10"), + (233000, "Giant Rat Ashes"), + (233001, "Giant Rat Ashes +1"), + (233002, "Giant Rat Ashes +2"), + (233003, "Giant Rat Ashes +3"), + (233004, "Giant Rat Ashes +4"), + (233005, "Giant Rat Ashes +5"), + (233006, "Giant Rat Ashes +6"), + (233007, "Giant Rat Ashes +7"), + (233008, "Giant Rat Ashes +8"), + (233009, "Giant Rat Ashes +9"), + (233010, "Giant Rat Ashes +10"), + (234000, "Demi-Human Ashes"), + (234001, "Demi-Human Ashes +1"), + (234002, "Demi-Human Ashes +2"), + (234003, "Demi-Human Ashes +3"), + (234004, "Demi-Human Ashes +4"), + (234005, "Demi-Human Ashes +5"), + (234006, "Demi-Human Ashes +6"), + (234007, "Demi-Human Ashes +7"), + (234008, "Demi-Human Ashes +8"), + (234009, "Demi-Human Ashes +9"), + (234010, "Demi-Human Ashes +10"), + (235000, "Rotten Stray Ashes"), + (235001, "Rotten Stray Ashes +1"), + (235002, "Rotten Stray Ashes +2"), + (235003, "Rotten Stray Ashes +3"), + (235004, "Rotten Stray Ashes +4"), + (235005, "Rotten Stray Ashes +5"), + (235006, "Rotten Stray Ashes +6"), + (235007, "Rotten Stray Ashes +7"), + (235008, "Rotten Stray Ashes +8"), + (235009, "Rotten Stray Ashes +9"), + (235010, "Rotten Stray Ashes +10"), + (236000, "Spirit Jellyfish Ashes"), + (236001, "Spirit Jellyfish Ashes +1"), + (236002, "Spirit Jellyfish Ashes +2"), + (236003, "Spirit Jellyfish Ashes +3"), + (236004, "Spirit Jellyfish Ashes +4"), + (236005, "Spirit Jellyfish Ashes +5"), + (236006, "Spirit Jellyfish Ashes +6"), + (236007, "Spirit Jellyfish Ashes +7"), + (236008, "Spirit Jellyfish Ashes +8"), + (236009, "Spirit Jellyfish Ashes +9"), + (236010, "Spirit Jellyfish Ashes +10"), + (237000, "Warhawk Ashes"), + (237001, "Warhawk Ashes +1"), + (237002, "Warhawk Ashes +2"), + (237003, "Warhawk Ashes +3"), + (237004, "Warhawk Ashes +4"), + (237005, "Warhawk Ashes +5"), + (237006, "Warhawk Ashes +6"), + (237007, "Warhawk Ashes +7"), + (237008, "Warhawk Ashes +8"), + (237009, "Warhawk Ashes +9"), + (237010, "Warhawk Ashes +10"), + (238000, "Stormhawk Deenh"), + (238001, "Stormhawk Deenh +1"), + (238002, "Stormhawk Deenh +2"), + (238003, "Stormhawk Deenh +3"), + (238004, "Stormhawk Deenh +4"), + (238005, "Stormhawk Deenh +5"), + (238006, "Stormhawk Deenh +6"), + (238007, "Stormhawk Deenh +7"), + (238008, "Stormhawk Deenh +8"), + (238009, "Stormhawk Deenh +9"), + (238010, "Stormhawk Deenh +10"), + (239000, "Bloodhound Knight Floh"), + (239001, "Bloodhound Knight Floh +1"), + (239002, "Bloodhound Knight Floh +2"), + (239003, "Bloodhound Knight Floh +3"), + (239004, "Bloodhound Knight Floh +4"), + (239005, "Bloodhound Knight Floh +5"), + (239006, "Bloodhound Knight Floh +6"), + (239007, "Bloodhound Knight Floh +7"), + (239008, "Bloodhound Knight Floh +8"), + (239009, "Bloodhound Knight Floh +9"), + (239010, "Bloodhound Knight Floh +10"), + (240000, "Wandering Noble Ashes"), + (240001, "Wandering Noble Ashes +1"), + (240002, "Wandering Noble Ashes +2"), + (240003, "Wandering Noble Ashes +3"), + (240004, "Wandering Noble Ashes +4"), + (240005, "Wandering Noble Ashes +5"), + (240006, "Wandering Noble Ashes +6"), + (240007, "Wandering Noble Ashes +7"), + (240008, "Wandering Noble Ashes +8"), + (240009, "Wandering Noble Ashes +9"), + (240010, "Wandering Noble Ashes +10"), + (241000, "Noble Sorcerer Ashes"), + (241001, "Noble Sorcerer Ashes +1"), + (241002, "Noble Sorcerer Ashes +2"), + (241003, "Noble Sorcerer Ashes +3"), + (241004, "Noble Sorcerer Ashes +4"), + (241005, "Noble Sorcerer Ashes +5"), + (241006, "Noble Sorcerer Ashes +6"), + (241007, "Noble Sorcerer Ashes +7"), + (241008, "Noble Sorcerer Ashes +8"), + (241009, "Noble Sorcerer Ashes +9"), + (241010, "Noble Sorcerer Ashes +10"), + (242000, "Vulgar Militia Ashes"), + (242001, "Vulgar Militia Ashes +1"), + (242002, "Vulgar Militia Ashes +2"), + (242003, "Vulgar Militia Ashes +3"), + (242004, "Vulgar Militia Ashes +4"), + (242005, "Vulgar Militia Ashes +5"), + (242006, "Vulgar Militia Ashes +6"), + (242007, "Vulgar Militia Ashes +7"), + (242008, "Vulgar Militia Ashes +8"), + (242009, "Vulgar Militia Ashes +9"), + (242010, "Vulgar Militia Ashes +10"), + (243000, "Mad Pumpkin Head Ashes"), + (243001, "Mad Pumpkin Head Ashes +1"), + (243002, "Mad Pumpkin Head Ashes +2"), + (243003, "Mad Pumpkin Head Ashes +3"), + (243004, "Mad Pumpkin Head Ashes +4"), + (243005, "Mad Pumpkin Head Ashes +5"), + (243006, "Mad Pumpkin Head Ashes +6"), + (243007, "Mad Pumpkin Head Ashes +7"), + (243008, "Mad Pumpkin Head Ashes +8"), + (243009, "Mad Pumpkin Head Ashes +9"), + (243010, "Mad Pumpkin Head Ashes +10"), + (244000, "Land Squirt Ashes"), + (244001, "Land Squirt Ashes +1"), + (244002, "Land Squirt Ashes +2"), + (244003, "Land Squirt Ashes +3"), + (244004, "Land Squirt Ashes +4"), + (244005, "Land Squirt Ashes +5"), + (244006, "Land Squirt Ashes +6"), + (244007, "Land Squirt Ashes +7"), + (244008, "Land Squirt Ashes +8"), + (244009, "Land Squirt Ashes +9"), + (244010, "Land Squirt Ashes +10"), + (245000, "Miranda Sprout Ashes"), + (245001, "Miranda Sprout Ashes +1"), + (245002, "Miranda Sprout Ashes +2"), + (245003, "Miranda Sprout Ashes +3"), + (245004, "Miranda Sprout Ashes +4"), + (245005, "Miranda Sprout Ashes +5"), + (245006, "Miranda Sprout Ashes +6"), + (245007, "Miranda Sprout Ashes +7"), + (245008, "Miranda Sprout Ashes +8"), + (245009, "Miranda Sprout Ashes +9"), + (245010, "Miranda Sprout Ashes +10"), + (246000, "Soldjars of Fortune Ashes"), + (246001, "Soldjars of Fortune Ashes +1"), + (246002, "Soldjars of Fortune Ashes +2"), + (246003, "Soldjars of Fortune Ashes +3"), + (246004, "Soldjars of Fortune Ashes +4"), + (246005, "Soldjars of Fortune Ashes +5"), + (246006, "Soldjars of Fortune Ashes +6"), + (246007, "Soldjars of Fortune Ashes +7"), + (246008, "Soldjars of Fortune Ashes +8"), + (246009, "Soldjars of Fortune Ashes +9"), + (246010, "Soldjars of Fortune Ashes +10"), + (247000, "Omenkiller Rollo"), + (247001, "Omenkiller Rollo +1"), + (247002, "Omenkiller Rollo +2"), + (247003, "Omenkiller Rollo +3"), + (247004, "Omenkiller Rollo +4"), + (247005, "Omenkiller Rollo +5"), + (247006, "Omenkiller Rollo +6"), + (247007, "Omenkiller Rollo +7"), + (247008, "Omenkiller Rollo +8"), + (247009, "Omenkiller Rollo +9"), + (247010, "Omenkiller Rollo +10"), + (248000, "Greatshield Soldier Ashes"), + (248001, "Greatshield Soldier Ashes +1"), + (248002, "Greatshield Soldier Ashes +2"), + (248003, "Greatshield Soldier Ashes +3"), + (248004, "Greatshield Soldier Ashes +4"), + (248005, "Greatshield Soldier Ashes +5"), + (248006, "Greatshield Soldier Ashes +6"), + (248007, "Greatshield Soldier Ashes +7"), + (248008, "Greatshield Soldier Ashes +8"), + (248009, "Greatshield Soldier Ashes +9"), + (248010, "Greatshield Soldier Ashes +10"), + (249000, "Archer Ashes"), + (249001, "Archer Ashes +1"), + (249002, "Archer Ashes +2"), + (249003, "Archer Ashes +3"), + (249004, "Archer Ashes +4"), + (249005, "Archer Ashes +5"), + (249006, "Archer Ashes +6"), + (249007, "Archer Ashes +7"), + (249008, "Archer Ashes +8"), + (249009, "Archer Ashes +9"), + (249010, "Archer Ashes +10"), + (250000, "Godrick Soldier Ashes"), + (250001, "Godrick Soldier Ashes +1"), + (250002, "Godrick Soldier Ashes +2"), + (250003, "Godrick Soldier Ashes +3"), + (250004, "Godrick Soldier Ashes +4"), + (250005, "Godrick Soldier Ashes +5"), + (250006, "Godrick Soldier Ashes +6"), + (250007, "Godrick Soldier Ashes +7"), + (250008, "Godrick Soldier Ashes +8"), + (250009, "Godrick Soldier Ashes +9"), + (250010, "Godrick Soldier Ashes +10"), + (251000, "Raya Lucaria Soldier Ashes"), + (251001, "Raya Lucaria Soldier Ashes +1"), + (251002, "Raya Lucaria Soldier Ashes +2"), + (251003, "Raya Lucaria Soldier Ashes +3"), + (251004, "Raya Lucaria Soldier Ashes +4"), + (251005, "Raya Lucaria Soldier Ashes +5"), + (251006, "Raya Lucaria Soldier Ashes +6"), + (251007, "Raya Lucaria Soldier Ashes +7"), + (251008, "Raya Lucaria Soldier Ashes +8"), + (251009, "Raya Lucaria Soldier Ashes +9"), + (251010, "Raya Lucaria Soldier Ashes +10"), + (252000, "Leyndell Soldier Ashes"), + (252001, "Leyndell Soldier Ashes +1"), + (252002, "Leyndell Soldier Ashes +2"), + (252003, "Leyndell Soldier Ashes +3"), + (252004, "Leyndell Soldier Ashes +4"), + (252005, "Leyndell Soldier Ashes +5"), + (252006, "Leyndell Soldier Ashes +6"), + (252007, "Leyndell Soldier Ashes +7"), + (252008, "Leyndell Soldier Ashes +8"), + (252009, "Leyndell Soldier Ashes +9"), + (252010, "Leyndell Soldier Ashes +10"), + (253000, "Radahn Soldier Ashes"), + (253001, "Radahn Soldier Ashes +1"), + (253002, "Radahn Soldier Ashes +2"), + (253003, "Radahn Soldier Ashes +3"), + (253004, "Radahn Soldier Ashes +4"), + (253005, "Radahn Soldier Ashes +5"), + (253006, "Radahn Soldier Ashes +6"), + (253007, "Radahn Soldier Ashes +7"), + (253008, "Radahn Soldier Ashes +8"), + (253009, "Radahn Soldier Ashes +9"), + (253010, "Radahn Soldier Ashes +10"), + (254000, "Mausoleum Soldier Ashes"), + (254001, "Mausoleum Soldier Ashes +1"), + (254002, "Mausoleum Soldier Ashes +2"), + (254003, "Mausoleum Soldier Ashes +3"), + (254004, "Mausoleum Soldier Ashes +4"), + (254005, "Mausoleum Soldier Ashes +5"), + (254006, "Mausoleum Soldier Ashes +6"), + (254007, "Mausoleum Soldier Ashes +7"), + (254008, "Mausoleum Soldier Ashes +8"), + (254009, "Mausoleum Soldier Ashes +9"), + (254010, "Mausoleum Soldier Ashes +10"), + (255000, "Haligtree Soldier Ashes"), + (255001, "Haligtree Soldier Ashes +1"), + (255002, "Haligtree Soldier Ashes +2"), + (255003, "Haligtree Soldier Ashes +3"), + (255004, "Haligtree Soldier Ashes +4"), + (255005, "Haligtree Soldier Ashes +5"), + (255006, "Haligtree Soldier Ashes +6"), + (255007, "Haligtree Soldier Ashes +7"), + (255008, "Haligtree Soldier Ashes +8"), + (255009, "Haligtree Soldier Ashes +9"), + (255010, "Haligtree Soldier Ashes +10"), + (256000, "Ancient Dragon Knight Kristoff"), + (256001, "Ancient Dragon Knight Kristoff +1"), + (256002, "Ancient Dragon Knight Kristoff +2"), + (256003, "Ancient Dragon Knight Kristoff +3"), + (256004, "Ancient Dragon Knight Kristoff +4"), + (256005, "Ancient Dragon Knight Kristoff +5"), + (256006, "Ancient Dragon Knight Kristoff +6"), + (256007, "Ancient Dragon Knight Kristoff +7"), + (256008, "Ancient Dragon Knight Kristoff +8"), + (256009, "Ancient Dragon Knight Kristoff +9"), + (256010, "Ancient Dragon Knight Kristoff +10"), + (257000, "Redmane Knight Ogha"), + (257001, "Redmane Knight Ogha +1"), + (257002, "Redmane Knight Ogha +2"), + (257003, "Redmane Knight Ogha +3"), + (257004, "Redmane Knight Ogha +4"), + (257005, "Redmane Knight Ogha +5"), + (257006, "Redmane Knight Ogha +6"), + (257007, "Redmane Knight Ogha +7"), + (257008, "Redmane Knight Ogha +8"), + (257009, "Redmane Knight Ogha +9"), + (257010, "Redmane Knight Ogha +10"), + (258000, "Lhutel the Headless"), + (258001, "Lhutel the Headless +1"), + (258002, "Lhutel the Headless +2"), + (258003, "Lhutel the Headless +3"), + (258004, "Lhutel the Headless +4"), + (258005, "Lhutel the Headless +5"), + (258006, "Lhutel the Headless +6"), + (258007, "Lhutel the Headless +7"), + (258008, "Lhutel the Headless +8"), + (258009, "Lhutel the Headless +9"), + (258010, "Lhutel the Headless +10"), + (259000, "Nepheli Loux Puppet"), + (259001, "Nepheli Loux Puppet +1"), + (259002, "Nepheli Loux Puppet +2"), + (259003, "Nepheli Loux Puppet +3"), + (259004, "Nepheli Loux Puppet +4"), + (259005, "Nepheli Loux Puppet +5"), + (259006, "Nepheli Loux Puppet +6"), + (259007, "Nepheli Loux Puppet +7"), + (259008, "Nepheli Loux Puppet +8"), + (259009, "Nepheli Loux Puppet +9"), + (259010, "Nepheli Loux Puppet +10"), + (260000, "Dung Eater Puppet"), + (260001, "Dung Eater Puppet +1"), + (260002, "Dung Eater Puppet +2"), + (260003, "Dung Eater Puppet +3"), + (260004, "Dung Eater Puppet +4"), + (260005, "Dung Eater Puppet +5"), + (260006, "Dung Eater Puppet +6"), + (260007, "Dung Eater Puppet +7"), + (260008, "Dung Eater Puppet +8"), + (260009, "Dung Eater Puppet +9"), + (260010, "Dung Eater Puppet +10"), + (261000, "Finger Maiden Therolina Puppet"), + (261001, "Finger Maiden Therolina Puppet +1"), + (261002, "Finger Maiden Therolina Puppet +2"), + (261003, "Finger Maiden Therolina Puppet +3"), + (261004, "Finger Maiden Therolina Puppet +4"), + (261005, "Finger Maiden Therolina Puppet +5"), + (261006, "Finger Maiden Therolina Puppet +6"), + (261007, "Finger Maiden Therolina Puppet +7"), + (261008, "Finger Maiden Therolina Puppet +8"), + (261009, "Finger Maiden Therolina Puppet +9"), + (261010, "Finger Maiden Therolina Puppet +10"), + (262000, "Dolores the Sleeping Arrow Puppet"), + (262001, "Dolores the Sleeping Arrow Puppet +1"), + (262002, "Dolores the Sleeping Arrow Puppet +2"), + (262003, "Dolores the Sleeping Arrow Puppet +3"), + (262004, "Dolores the Sleeping Arrow Puppet +4"), + (262005, "Dolores the Sleeping Arrow Puppet +5"), + (262006, "Dolores the Sleeping Arrow Puppet +6"), + (262007, "Dolores the Sleeping Arrow Puppet +7"), + (262008, "Dolores the Sleeping Arrow Puppet +8"), + (262009, "Dolores the Sleeping Arrow Puppet +9"), + (262010, "Dolores the Sleeping Arrow Puppet +10"), + (263000, "Jarwight Puppet"), + (263001, "Jarwight Puppet +1"), + (263002, "Jarwight Puppet +2"), + (263003, "Jarwight Puppet +3"), + (263004, "Jarwight Puppet +4"), + (263005, "Jarwight Puppet +5"), + (263006, "Jarwight Puppet +6"), + (263007, "Jarwight Puppet +7"), + (263008, "Jarwight Puppet +8"), + (263009, "Jarwight Puppet +9"), + (263010, "Jarwight Puppet +10"), + (999999999, ""), ])) }); -} \ No newline at end of file +} diff --git a/src/db/map_name.rs b/src/db/map_name.rs index 29ad9bc..a5809dc 100644 --- a/src/db/map_name.rs +++ b/src/db/map_name.rs @@ -1,85 +1,98 @@ -pub mod map_name { - use std::{collections::HashMap, sync::Mutex}; - use once_cell::sync::Lazy; +use std::{ + collections::HashMap, + sync::OnceLock, +}; - #[derive(PartialEq, Eq, Hash, Clone, Copy, PartialOrd, Ord)] - pub enum MapName { - AcademyOfRayaLucaria, - AinselRiver, - AinselRiverMain, - AltusPlateau, - BellumHighway, - Caelid, - CapitalOutskirts, - ConsecratedSnowfield, - CrumblingFarumAzula, - DeeprootDepths, - ElphaelBraceOfTheHaligtree, - FlamePeak, - ForbiddenLands, - GreyollsDragonbarrow, - LakeOfRot, - LeyndellAshenCapital, - LeyndellRoyalCapital, - Limgrave, - LiurniaOfTheLakes, - MiquellasHaligtree, - MohgwynPalace, - MoonlightAltar, - MountaintopsOfTheGiants, - MtGelmir, - NokronEternalCity, - RoundtableHold, - RuinStrewnPrecipice, - SiofraRiver, - StonePlatform, - Stormhill, - StormveilCastle, - StrandedGraveyard, - SubterraneanShunningGrounds, - SwampOfAeonia, - VolcanoManor, - WeepingPeninsula, - } +#[derive(PartialEq, Eq, Hash, Clone, Copy, PartialOrd, Ord)] +pub enum MapName { + AcademyOfRayaLucaria, + AinselRiver, + AinselRiverMain, + AltusPlateau, + BellumHighway, + Caelid, + CapitalOutskirts, + ConsecratedSnowfield, + CrumblingFarumAzula, + DeeprootDepths, + ElphaelBraceOfTheHaligtree, + FlamePeak, + ForbiddenLands, + GreyollsDragonbarrow, + LakeOfRot, + LeyndellAshenCapital, + LeyndellRoyalCapital, + Limgrave, + LiurniaOfTheLakes, + MiquellasHaligtree, + MohgwynPalace, + MoonlightAltar, + MountaintopsOfTheGiants, + MtGelmir, + NokronEternalCity, + RoundtableHold, + RuinStrewnPrecipice, + SiofraRiver, + StonePlatform, + Stormhill, + StormveilCastle, + StrandedGraveyard, + SubterraneanShunningGrounds, + SwampOfAeonia, + VolcanoManor, + WeepingPeninsula, + + //DLC + RealmofShadow, +} - pub static MAP_NAME: Lazy>> = Lazy::new(|| { - Mutex::new(HashMap::from([ - (MapName::RoundtableHold, "Table of Lost Grace / Roundtable Hold"), - (MapName::Limgrave, "Limgrave"), - (MapName::StrandedGraveyard, "Stranded Graveyard"), - (MapName::Stormhill, "Stormhill"), - (MapName::WeepingPeninsula, "Weeping Peninsula"), - (MapName::StormveilCastle, "Stormveil Castle"), - (MapName::LiurniaOfTheLakes, "Liurnia of the Lakes"), - (MapName::BellumHighway, "Bellum Highway"), - (MapName::RuinStrewnPrecipice, "Ruin-Strewn Precipice"), - (MapName::MoonlightAltar, "Moonlight Altar"), - (MapName::AcademyOfRayaLucaria, "Academy of Raya Lucaria"), - (MapName::AltusPlateau, "Altus Plateau"), - (MapName::MtGelmir, "Mt. Gelmir"), - (MapName::CapitalOutskirts, "Capital Outskirts"), - (MapName::VolcanoManor, "Volcano Manor"), - (MapName::LeyndellRoyalCapital, "Leyndell, Royal Capital"), - (MapName::SubterraneanShunningGrounds, "Subterranean Shunning-Grounds"), - (MapName::LeyndellAshenCapital, "Leyndell, Ashen Capital"), - (MapName::StonePlatform, "Stone Platform"), - (MapName::Caelid, "Caelid"), - (MapName::SwampOfAeonia, "Swamp of Aeonia"), - (MapName::GreyollsDragonbarrow, "Greyoll's Dragonbarrow"), - (MapName::ForbiddenLands, "Forbidden Lands"), - (MapName::MountaintopsOfTheGiants, "Mountaintops of the Giants"), - (MapName::FlamePeak, "Flame Peak"), - (MapName::ConsecratedSnowfield, "Consecrated Snowfield"), - (MapName::MiquellasHaligtree, "Miquella's Haligtree"), - (MapName::ElphaelBraceOfTheHaligtree, "Elphael, Brace of the Haligtree"), - (MapName::AinselRiver, "Ainsel River"), - (MapName::AinselRiverMain, "Ainsel River Main"), - (MapName::LakeOfRot, "Lake of Rot"), - (MapName::NokronEternalCity, "Nokron, Eternal City"), - (MapName::MohgwynPalace, "Mohgwyn Palace"), - (MapName::SiofraRiver, "Siofra River"), - (MapName::DeeprootDepths, "Deeproot Depths"), - (MapName::CrumblingFarumAzula, "Crumbling Farum Azula"), - ])) - }); -} \ No newline at end of file +impl MapName { + #[rustfmt::skip] + pub fn map_names() -> &'static HashMap { + static MAP_NAMES: OnceLock> = OnceLock::new(); + + MAP_NAMES.get_or_init(|| + HashMap::from([ + (MapName::RoundtableHold, "Table of Lost Grace / Roundtable Hold"), + (MapName::Limgrave, "Limgrave"), + (MapName::StrandedGraveyard, "Stranded Graveyard"), + (MapName::Stormhill, "Stormhill"), + (MapName::WeepingPeninsula, "Weeping Peninsula"), + (MapName::StormveilCastle, "Stormveil Castle"), + (MapName::LiurniaOfTheLakes, "Liurnia of the Lakes"), + (MapName::BellumHighway, "Bellum Highway"), + (MapName::RuinStrewnPrecipice, "Ruin-Strewn Precipice"), + (MapName::MoonlightAltar, "Moonlight Altar"), + (MapName::AcademyOfRayaLucaria, "Academy of Raya Lucaria"), + (MapName::AltusPlateau, "Altus Plateau"), + (MapName::MtGelmir, "Mt. Gelmir"), + (MapName::CapitalOutskirts, "Capital Outskirts"), + (MapName::VolcanoManor, "Volcano Manor"), + (MapName::LeyndellRoyalCapital, "Leyndell, Royal Capital"), + (MapName::SubterraneanShunningGrounds, "Subterranean Shunning-Grounds"), + (MapName::LeyndellAshenCapital, "Leyndell, Ashen Capital"), + (MapName::StonePlatform, "Stone Platform"), + (MapName::Caelid, "Caelid"), + (MapName::SwampOfAeonia, "Swamp of Aeonia"), + (MapName::GreyollsDragonbarrow, "Greyoll's Dragonbarrow"), + (MapName::ForbiddenLands, "Forbidden Lands"), + (MapName::MountaintopsOfTheGiants, "Mountaintops of the Giants"), + (MapName::FlamePeak, "Flame Peak"), + (MapName::ConsecratedSnowfield, "Consecrated Snowfield"), + (MapName::MiquellasHaligtree, "Miquella's Haligtree"), + (MapName::ElphaelBraceOfTheHaligtree, "Elphael, Brace of the Haligtree"), + (MapName::AinselRiver, "Ainsel River"), + (MapName::AinselRiverMain, "Ainsel River Main"), + (MapName::LakeOfRot, "Lake of Rot"), + (MapName::NokronEternalCity, "Nokron, Eternal City"), + (MapName::MohgwynPalace, "Mohgwyn Palace"), + (MapName::SiofraRiver, "Siofra River"), + (MapName::DeeprootDepths, "Deeproot Depths"), + (MapName::CrumblingFarumAzula, "Crumbling Farum Azula"), + + // DLC + (MapName::RealmofShadow, "Realm of Shadow (DLC)"), + ]) + ) + } +} diff --git a/src/db/maps.rs b/src/db/maps.rs index a703092..38bc10c 100644 --- a/src/db/maps.rs +++ b/src/db/maps.rs @@ -1,69 +1,106 @@ -pub mod maps { - use std::{collections::HashMap, sync::Mutex}; - use once_cell::sync::Lazy; - - #[derive(PartialEq, Eq, Hash, Clone, Copy, PartialOrd, Ord)] - pub enum Map { - SE, - NW, - SW, - Center, - LimgraveEast, - WeepingPeninsula, - LimgraveWest, - N, - NE, - LiurniaWest, - LiurniaNorth, - LiurniaEast, - LeyndellRoyalCapital, - AltusPlateur, - MtGelmir, - Dragonbarrow, - Caelid, - MountaintopsoftheGiantsNorth, - MountaintopsoftheGiantsEast, - MountaintopsoftheGiantsWest, - SiofraRiver, - MohgwynPalace, - LakeofRot, - AinselRiver, - DeeproothDepths, - StormfootCatacombs, - FringefolkHeroCave, - ShowUnderground, +use std::{collections::HashMap, sync::OnceLock}; + +#[derive(PartialEq, Eq, Hash, Clone, Copy, PartialOrd, Ord)] +pub enum Map { + SE, + NW, + SW, + Center, + LimgraveEast, + WeepingPeninsula, + LimgraveWest, + N, + NE, + LiurniaWest, + LiurniaNorth, + LiurniaEast, + LeyndellRoyalCapital, + AltusPlateur, + MtGelmir, + Dragonbarrow, + Caelid, + MountaintopsoftheGiantsNorth, + MountaintopsoftheGiantsEast, + MountaintopsoftheGiantsWest, + SiofraRiver, + MohgwynPalace, + LakeofRot, + AinselRiver, + DeeproothDepths, + StormfootCatacombs, + FringefolkHeroCave, + ShowUnderground, +} + +impl Map { + #[rustfmt::skip] + pub fn maps() -> &'static HashMap { + static MAPS: OnceLock> = OnceLock::new(); + + MAPS.get_or_init(|| + HashMap::from([ + (Map::SE,(62007,"SE")), + (Map::NW,(62006,"NW")), + (Map::SW,(62005,"SW")), + (Map::Center,(62004,"Center")), + (Map::LimgraveEast,(62012,"Limgrave, East")), + (Map::WeepingPeninsula,(62011,"Weeping Peninsula")), + (Map::LimgraveWest,(62010,"Limgrave, West")), + (Map::N,(62009,"N")), + (Map::NE,(62008,"NE")), + (Map::LiurniaWest,(62022,"Liurnia, West")), + (Map::LiurniaNorth,(62021,"Liurnia, North")), + (Map::LiurniaEast,(62020,"Liurnia, East")), + (Map::LeyndellRoyalCapital,(62031,"Leyndell, Royal Capital")), + (Map::AltusPlateur,(62030,"Altus Plateur")), + (Map::MtGelmir,(62032,"Mt. Gelmir")), + (Map::Dragonbarrow,(62041,"Dragonbarrow")), + (Map::Caelid,(62040,"Caelid")), + (Map::MountaintopsoftheGiantsNorth,(62052,"Mountaintops of the Giants, North")), + (Map::MountaintopsoftheGiantsEast,(62051,"Mountaintops of the Giants, East")), + (Map::MountaintopsoftheGiantsWest,(62050,"Mountaintops of the Giants, West")), + (Map::SiofraRiver,(62063,"Siofra River")), + (Map::MohgwynPalace,(62062,"Mohgwyn Palace")), + (Map::LakeofRot,(62061,"Lake of Rot")), + (Map::AinselRiver,(62060,"Ainsel River")), + (Map::DeeproothDepths,(62064,"Deeprooth Depths")), + (Map::StormfootCatacombs,(62103,"Stormfoot Catacombs")), + (Map::FringefolkHeroCave,(62102,"Fringefolk Hero's Cave")), + (Map::ShowUnderground,(82001,"Show underground")), + ]) + ) } +} - pub static MAPS: Lazy>> = Lazy::new(|| { - Mutex::new(HashMap::from([ - (Map::SE,(62007,"SE")), - (Map::NW,(62006,"NW")), - (Map::SW,(62005,"SW")), - (Map::Center,(62004,"Center")), - (Map::LimgraveEast,(62012,"Limgrave, East")), - (Map::WeepingPeninsula,(62011,"Weeping Peninsula")), - (Map::LimgraveWest,(62010,"Limgrave, West")), - (Map::N,(62009,"N")), - (Map::NE,(62008,"NE")), - (Map::LiurniaWest,(62022,"Liurnia, West")), - (Map::LiurniaNorth,(62021,"Liurnia, North")), - (Map::LiurniaEast,(62020,"Liurnia, East")), - (Map::LeyndellRoyalCapital,(62031,"Leyndell, Royal Capital")), - (Map::AltusPlateur,(62030,"Altus Plateur")), - (Map::MtGelmir,(62032,"Mt. Gelmir")), - (Map::Dragonbarrow,(62041,"Dragonbarrow")), - (Map::Caelid,(62040,"Caelid")), - (Map::MountaintopsoftheGiantsNorth,(62052,"Mountaintops of the Giants, North")), - (Map::MountaintopsoftheGiantsEast,(62051,"Mountaintops of the Giants, East")), - (Map::MountaintopsoftheGiantsWest,(62050,"Mountaintops of the Giants, West")), - (Map::SiofraRiver,(62063,"Siofra River")), - (Map::MohgwynPalace,(62062,"Mohgwyn Palace")), - (Map::LakeofRot,(62061,"Lake of Rot")), - (Map::AinselRiver,(62060,"Ainsel River")), - (Map::DeeproothDepths,(62064,"Deeprooth Depths")), - (Map::StormfootCatacombs,(62103,"Stormfoot Catacombs")), - (Map::FringefolkHeroCave,(62102,"Fringefolk Hero's Cave")), - (Map::ShowUnderground,(82001,"Show underground")), - ])) - }); -} \ No newline at end of file +// pub static MAPS: Lazy>> = Lazy::new(|| { +// Mutex::new(HashMap::from([ +// (Map::SE,(62007,"SE")), +// (Map::NW,(62006,"NW")), +// (Map::SW,(62005,"SW")), +// (Map::Center,(62004,"Center")), +// (Map::LimgraveEast,(62012,"Limgrave, East")), +// (Map::WeepingPeninsula,(62011,"Weeping Peninsula")), +// (Map::LimgraveWest,(62010,"Limgrave, West")), +// (Map::N,(62009,"N")), +// (Map::NE,(62008,"NE")), +// (Map::LiurniaWest,(62022,"Liurnia, West")), +// (Map::LiurniaNorth,(62021,"Liurnia, North")), +// (Map::LiurniaEast,(62020,"Liurnia, East")), +// (Map::LeyndellRoyalCapital,(62031,"Leyndell, Royal Capital")), +// (Map::AltusPlateur,(62030,"Altus Plateur")), +// (Map::MtGelmir,(62032,"Mt. Gelmir")), +// (Map::Dragonbarrow,(62041,"Dragonbarrow")), +// (Map::Caelid,(62040,"Caelid")), +// (Map::MountaintopsoftheGiantsNorth,(62052,"Mountaintops of the Giants, North")), +// (Map::MountaintopsoftheGiantsEast,(62051,"Mountaintops of the Giants, East")), +// (Map::MountaintopsoftheGiantsWest,(62050,"Mountaintops of the Giants, West")), +// (Map::SiofraRiver,(62063,"Siofra River")), +// (Map::MohgwynPalace,(62062,"Mohgwyn Palace")), +// (Map::LakeofRot,(62061,"Lake of Rot")), +// (Map::AinselRiver,(62060,"Ainsel River")), +// (Map::DeeproothDepths,(62064,"Deeprooth Depths")), +// (Map::StormfootCatacombs,(62103,"Stormfoot Catacombs")), +// (Map::FringefolkHeroCave,(62102,"Fringefolk Hero's Cave")), +// (Map::ShowUnderground,(82001,"Show underground")), +// ])) +// }); diff --git a/src/db/mod.rs b/src/db/mod.rs index 11f2f3d..932ac7b 100644 --- a/src/db/mod.rs +++ b/src/db/mod.rs @@ -1,22 +1,22 @@ -pub mod item_name; -pub mod weapon_name; -pub mod armor_name; -pub mod aow_name; -pub mod accessory_name; -pub mod map_name; -pub mod graces; -pub mod whetblades; +// pub mod accessory_name; +// pub mod aow_name; +// pub mod armor_name; +pub mod bosses; pub mod cookbooks; +pub mod graces; +// pub mod item_name; +pub mod map_name; pub mod maps; -pub mod bosses; -pub mod event_flags; -pub mod summoning_pools; +// pub mod weapon_name; +pub mod whetblades; +// pub mod event_flags; +pub mod classes; pub mod colosseums; pub mod regions; -pub mod classes; pub mod stats; -pub mod weapons; -pub mod armors; -pub mod aows; -pub mod talismans; -pub mod items; \ No newline at end of file +pub mod summoning_pools; +// pub mod weapons; +// pub mod armors; +// pub mod aows; +// pub mod talismans; +// pub mod items; diff --git a/src/db/regions.rs b/src/db/regions.rs index d1a5eed..7f3cd8c 100644 --- a/src/db/regions.rs +++ b/src/db/regions.rs @@ -1,689 +1,871 @@ -// Region data such as classification of an area as open world area, dungeon area or near boss area +// Region data such as classification of an area as open world area, dungeon area or near boss area // are from TGA table https://github.com/The-Grand-Archives/Elden-Ring-CT-TGA -pub mod regions { - use std::{collections::HashMap, sync::Mutex}; - use once_cell::sync::Lazy; - - use crate::db::map_name::map_name::MapName; - - #[derive(PartialEq, Eq, Hash, Clone, Copy, PartialOrd, Ord)] - pub enum Region { - AbandonedCave, - AbductorVirgin, - AcademyCrystalCave, - AcrosstheRoots, - AgheelLakeNorthMurkwaterCoastGatefrontRuins, - AinselRiverDownstream, - AinselRiverDownstreamPartII, - AinselRiverMain, - AinselRiverWellDepths, - AltusHighwayJunction, - AltusTunnel, - AncestralWoods, - AqueductFacingCliffs, - AqueductFacingCliffsPartII, - AshenDivineBridge, - AshenEldenThrone, - AshenQueensBedchamber, - AstelNaturalbornoftheVoid, - AudiencePathway, - AurizaHerosGrave, - AurizaSideTomb, - AvenueBalcony, - BehindCariaManor, - BellumHighway, - BesidetheGreatBridge, - BestialSanctum, - BlackKnifeCatacombs, - CaelidCatacombs, - CaelidNorth, - CapitalOutskirts, - CapitalRampart, - CariaManor, - CastellansHall, - CastleMorne, - CastleSol, - CastleSolMainGateChurchoftheEclipse, - CastleSolRooftop, - CathedraloftheForsaken, - CaveofKnowledge, - CaveoftheForlorn, - CentralCaelid, - CentralMountaintops, - ChairCryptofSellia, - ChamberOutsidethePlaza, - ChurchofDragonCommunion, - ChurchoftheCuckoo, - CliffbottomCatacombs, - CoastalCave, - CocoonoftheEmpyrean, - ConsecratedSnowfield, - ConsecratedSnowfieldCatacombs, - CrumblingBeastGrave, - CrumblingBeastGraveDepthsTempestFacingBalcony, - DeathtouchedCatacombs, - DebateParlor, - DeeprootDepths, - DivineBridge, - DivineTowerofCaelidBasemenr, - DivineTowerofCaelidCenter, - DivineTowerofEastAltus, - DivineTowerofLimgrave, - DivineTowerofLiurnia, - DivineTowerofWestAltus, - DominulaWindmillVillageRoadofIniquitySidePath, - Dragonbarrow, - DragonbarrowCave, - DragonkinSoldierofNokstella, - DragonlordPlacidusax, - DragonTemple, - DragonTempleAltar, - DragonTempleLift, - DragonTempleRooftop, - DragonTempleTransept, - DynastyMausoleumEntrance, - DynastyMausoleumMidpoint, - EarthboreCave, - EastCapitalRampart, - EldenBeast, - EldenThrone, - ElphaelInnerWallDrainageChannel, - ErdtreeSanctuary, - FireGiant, - ForbiddenLands, - ForestSpanningGreatbridge, - ForsakenDepths, - FracturedMarika, - FrenziedFlameProscription, - GaelTunnel, - GaelTunnelPartII, - GaolCave, - GatesideChamber, - GelmirHerosGrave, - GiantConqueringHerosGrave, - GiantsGravepostFootoftheForge, - GiantsMountaintopCatacombs, - GodricktheGrafted, - GrandCloister, - GrandCloisterPartII, - GrandLiftofDectusJarburg, - GrandLiftofRold, - GreatWaterfallBasin, - GreatWaterfallCrestPartII, - GrovesideCave, - GuestHall, - HaligtreeCanopy, - HaligtreePromenade, - HaligtreeRoots, - HaligtreeTownPlaza, - HiddenPathtotheHaligtree, - HiddenPathtotheHaligtreePartII, - HighroadCave, - ImpalersCatacombs, - IsolatedDivineTower, - KingsrealmRuins, - LakeofRotShoreside, - LakesideCrystalCave, - LeyndellCapitalofAsh, - LeyndellCatacombs, - LeyndellCatacombsPartII, - LiftsideChamberSecludedCell, - LimgraveTunnels, - LiurniaEast, - LiurniaSouth, - LiurniaSouthEast, - LiurniaSouthWest, - LiurniaWest, - LowerCapitalChurch, - MagmaWyrmMakar, - MainAcademyGate, - MainCariaManorGate, - MaleniaGoddessofRot, - MalikeththeBlackBlade, - ManorLowerLevel, - MargittheFellOmen, - MimicTear, - MinorErdtreeCatacombs, - MistwoodOutskirtsFortHaightWest, - MoonlightAltar, - MorneMoangrave, - MorneTunnel, - MurkwaterCatacombs, - MurkwaterCave, - NightsSacredGround, - NinthMtGelmirCampsite, - NokronEternalCity, - NokstellaEternalCity, - NokstellaWaterfallBasin, - OldAltusTunnel, - PalaceApproachLedgeRoad, - PerfumersGrotto, - PrayerRoom, - PrinceofDeathsThrone, - PrisonTownChurch, - QueensBedchamber, - RampartsidePath, - RampartTower, - RayaLucariaCrystalTunnel, - RayaLucariaGrandLibrary, - RearGaelTunnelEntrance, - RedmaneCastlePlaza, - RoadofIniquity, - RoadsEndCatacombs, - RootFacingCliffs, - RoyalMoongazingGrounds, - RuinStrewnPrecipice, - RuinStrewnPrecipiceOverlook, - RykardLordofBlasphemy, - SagesCave, - SaintedHerosGrave, - SchoolhouseClassroom, - SealedTunnel, - SeasideRuins, - SeethewaterCave, - SeethewaterTerminusPrimevalSorcererAzur, - SelliaCrystalTunnel, - SelliaHideaway, - SiofraRiverBank, - SiofraRiverWellDepths, - SlumberingWolfsShack, - SpiritcallersCave, - StarscourgeRadahn, - StillwaterCave, - StormcallerChurchLuxRuins, - StormfootCatacombs, - Stormhill, - StormveilMainGateStormveilCliffside, - StrandedGraveyard, - SubterraneanInquisitionChamber, - SummonwaterVillageOutskirts, - SwampofAeonia, - TempleofEiglay, - TheFirstStepChurchofElleh, - TheNamelessEternalCity, - TheRavine, - TheShadedCastle, - TombswardCatacombs, - TombswardCave, - UndergroundRoadside, - UnsightlyCatacombs, - VolcanoCave, - VolcanoManor, - WarDeadCatacombs, - WaypointRuinsCellar, - WeepingPeninsulaEast, - WeepingPeninsulaWest, - WestCapitalRampartFortifiedManorFirstFloor, - WorshippersWoods, - WyndhamCatacombs, - YeloughAnixTunnel, - ZamorRuins, +use std::{collections::HashMap, sync::OnceLock}; + +use crate::db::map_name::MapName; + +#[derive(PartialEq, Eq, Hash, Clone, Copy, PartialOrd, Ord)] +pub enum Region { + AbandonedCave, + AbductorVirgin, + AcademyCrystalCave, + AcrosstheRoots, + AgheelLakeNorthMurkwaterCoastGatefrontRuins, + AinselRiverDownstream, + AinselRiverDownstreamPartII, + AinselRiverMain, + AinselRiverWellDepths, + AltusHighwayJunction, + AltusTunnel, + AncestralWoods, + AqueductFacingCliffs, + AqueductFacingCliffsPartII, + AshenDivineBridge, + AshenEldenThrone, + AshenQueensBedchamber, + AstelNaturalbornoftheVoid, + AudiencePathway, + AurizaHerosGrave, + AurizaSideTomb, + AvenueBalcony, + BehindCariaManor, + BellumHighway, + BesidetheGreatBridge, + BestialSanctum, + BlackKnifeCatacombs, + CaelidCatacombs, + CaelidNorth, + CapitalOutskirts, + CapitalRampart, + CariaManor, + CastellansHall, + CastleMorne, + CastleSol, + CastleSolMainGateChurchoftheEclipse, + CastleSolRooftop, + CathedraloftheForsaken, + CaveofKnowledge, + CaveoftheForlorn, + CentralCaelid, + CentralMountaintops, + ChairCryptofSellia, + ChamberOutsidethePlaza, + ChurchofDragonCommunion, + ChurchoftheCuckoo, + CliffbottomCatacombs, + CoastalCave, + CocoonoftheEmpyrean, + ConsecratedSnowfield, + ConsecratedSnowfieldCatacombs, + CrumblingBeastGrave, + CrumblingBeastGraveDepthsTempestFacingBalcony, + DeathtouchedCatacombs, + DebateParlor, + DeeprootDepths, + DivineBridge, + DivineTowerofCaelidBasemenr, + DivineTowerofCaelidCenter, + DivineTowerofEastAltus, + DivineTowerofLimgrave, + DivineTowerofLiurnia, + DivineTowerofWestAltus, + DominulaWindmillVillageRoadofIniquitySidePath, + Dragonbarrow, + DragonbarrowCave, + DragonkinSoldierofNokstella, + DragonlordPlacidusax, + DragonTemple, + DragonTempleAltar, + DragonTempleLift, + DragonTempleRooftop, + DragonTempleTransept, + DynastyMausoleumEntrance, + DynastyMausoleumMidpoint, + EarthboreCave, + EastCapitalRampart, + EldenBeast, + EldenThrone, + ElphaelInnerWallDrainageChannel, + ErdtreeSanctuary, + FireGiant, + ForbiddenLands, + ForestSpanningGreatbridge, + ForsakenDepths, + FracturedMarika, + FrenziedFlameProscription, + GaelTunnel, + GaelTunnelPartII, + GaolCave, + GatesideChamber, + GelmirHerosGrave, + GiantConqueringHerosGrave, + GiantsGravepostFootoftheForge, + GiantsMountaintopCatacombs, + GodricktheGrafted, + GrandCloister, + GrandCloisterPartII, + GrandLiftofDectusJarburg, + GrandLiftofRold, + GreatWaterfallBasin, + GreatWaterfallCrestPartII, + GrovesideCave, + GuestHall, + HaligtreeCanopy, + HaligtreePromenade, + HaligtreeRoots, + HaligtreeTownPlaza, + HiddenPathtotheHaligtree, + HiddenPathtotheHaligtreePartII, + HighroadCave, + ImpalersCatacombs, + IsolatedDivineTower, + KingsrealmRuins, + LakeofRotShoreside, + LakesideCrystalCave, + LeyndellCapitalofAsh, + LeyndellCatacombs, + LeyndellCatacombsPartII, + LiftsideChamberSecludedCell, + LimgraveTunnels, + LiurniaEast, + LiurniaSouth, + LiurniaSouthEast, + LiurniaSouthWest, + LiurniaWest, + LowerCapitalChurch, + MagmaWyrmMakar, + MainAcademyGate, + MainCariaManorGate, + MaleniaGoddessofRot, + MalikeththeBlackBlade, + ManorLowerLevel, + MargittheFellOmen, + MimicTear, + MinorErdtreeCatacombs, + MistwoodOutskirtsFortHaightWest, + MoonlightAltar, + MorneMoangrave, + MorneTunnel, + MurkwaterCatacombs, + MurkwaterCave, + NightsSacredGround, + NinthMtGelmirCampsite, + NokronEternalCity, + NokstellaEternalCity, + NokstellaWaterfallBasin, + OldAltusTunnel, + PalaceApproachLedgeRoad, + PerfumersGrotto, + PrayerRoom, + PrinceofDeathsThrone, + PrisonTownChurch, + QueensBedchamber, + RampartsidePath, + RampartTower, + RayaLucariaCrystalTunnel, + RayaLucariaGrandLibrary, + RearGaelTunnelEntrance, + RedmaneCastlePlaza, + RoadofIniquity, + RoadsEndCatacombs, + RootFacingCliffs, + RoyalMoongazingGrounds, + RuinStrewnPrecipice, + RuinStrewnPrecipiceOverlook, + RykardLordofBlasphemy, + SagesCave, + SaintedHerosGrave, + SchoolhouseClassroom, + SealedTunnel, + SeasideRuins, + SeethewaterCave, + SeethewaterTerminusPrimevalSorcererAzur, + SelliaCrystalTunnel, + SelliaHideaway, + SiofraRiverBank, + SiofraRiverWellDepths, + SlumberingWolfsShack, + SpiritcallersCave, + StarscourgeRadahn, + StillwaterCave, + StormcallerChurchLuxRuins, + StormfootCatacombs, + Stormhill, + StormveilMainGateStormveilCliffside, + StrandedGraveyard, + SubterraneanInquisitionChamber, + SummonwaterVillageOutskirts, + SwampofAeonia, + TempleofEiglay, + TheFirstStepChurchofElleh, + TheNamelessEternalCity, + TheRavine, + TheShadedCastle, + TombswardCatacombs, + TombswardCave, + UndergroundRoadside, + UnsightlyCatacombs, + VolcanoCave, + VolcanoManor, + WarDeadCatacombs, + WaypointRuinsCellar, + WeepingPeninsulaEast, + WeepingPeninsulaWest, + WestCapitalRampartFortifiedManorFirstFloor, + WorshippersWoods, + WyndhamCatacombs, + YeloughAnixTunnel, + ZamorRuins, + NonInvadeableRegion, + + // DLC + BeluratTheatreoftheDivineBeast, + BeluratBeluratTowerSettlement, + BeluratStagefront, + EnirIlimGateofDivinity, + EnirIlimOuterWall, + EnirIlimSpiralRise, + EnirIlimCleansingChamberAnteroom, + EnirIlimDivineGateFrontStaircase, + ShadowKeepMainGate, + ShadowKeepMainGatePlaza, + ShadowKeepChurchDistrictEntrance, + ShadowKeepSunkenChapel, + ShadowKeepTreeWorshipSanctum, + StorehouseMessmersDarkChamber, + StorehouseFirstFloor, + StorehouseFourthFloor, + StorehouseSeventhFloor, + StorehouseDarkChamberEntrance, + StorehouseBackSection, + StorehouseLoft, + StorehouseWestRampart, + StoneCoffinFissureGardenofDeepPurple, + StoneCoffinFissureStoneCoffinFissure, + StoneCoffinFissureFissureCross, + StoneCoffinFissureFissureWaypointDepths, + MidrasManseDiscussionChamber, + MidrasManseManseHall, + MidrasManseMidrasLibrary, + GravesitePlainFogRiftCatacombs, + GravesitePlainRuinedForgeLavaIntake, + GravesitePlainRivermouthCave, + GravesitePlainDragonsPit, + GravesitePlainDragonsPitTerminus, + GravesitePlainGravesitePlain, + GravesitePlainEllacRiverCave, + GravesitePlainPillarPath, + GravesitePlainBeluratGaol, + GravesitePlainEllacRiverDownstream, + CharosHiddenGraveCharosHiddenGrave, + CharosHiddenGraveLamentersGaol, + CastleEnsisCastleEnsis, + CastleEnsisEnsisMoongazingGrounds, + CeruleanCoastCeruleanCoast, + CeruleanCoastTheFissure, + AbyssalWoodsAbyssalWoods, + AbyssalWoodsForsakenGraveyard, + FootoftheJaggedPeak, + JaggedPeakMountainside, + JaggedPeakSummit, + JaggedPeakRestoftheDreadDragon, + AncientRuinsofRauhWest, + AncientRuinsofRauhChurchoftheBud, + AncientRuinsofRauhEast, + RauhBaseAncientRuins, + RauhBaseScorpionRiverCatacombs, + RauhBaseTaylewsRuinedForge, + ScaduAltusFingerBirthingGrounds, + ScaduAltusScaduAltus, + ScaduAltusBonnyVillage, + ScaduAltusCastleWateringHole, + ScaduAltusReclusesRiverDownstream, + ScaduAltusDarklightCatacombs, + ScaduAltusBonnyGaol, + ScaduAltusRuinedForgeofStarfallPast, + ScaduviewScadutreeBase, + ScaduviewScaduview, + ScaduviewShadowKeepBackGate, + ScaduviewHinterland, +} + +impl From for Region { + #[rustfmt::skip] + fn from(region_id: u32) -> Self { + match region_id { + region_id if region_id == 6100090 => Region::ChurchofDragonCommunion, + region_id if region_id == 6100000 => Region::TheFirstStepChurchofElleh, + region_id if region_id == 6100001 => Region::SeasideRuins, + region_id if region_id == 6100004 => Region::MistwoodOutskirtsFortHaightWest, + region_id if region_id == 6100002 => Region::AgheelLakeNorthMurkwaterCoastGatefrontRuins, + region_id if region_id == 6100003 => Region::SummonwaterVillageOutskirts, + region_id if region_id == 6100010 => Region::WaypointRuinsCellar, + region_id if region_id == 3002001 => Region::StormfootCatacombs, + region_id if region_id == 3004001 => Region::MurkwaterCatacombs, + region_id if region_id == 3103001 => Region::GrovesideCave, + region_id if region_id == 3115001 => Region::CoastalCave, + region_id if region_id == 3100001 => Region::MurkwaterCave, + region_id if region_id == 3117001 => Region::HighroadCave, + region_id if region_id == 3201001 => Region::LimgraveTunnels, + region_id if region_id == 1800090 => Region::CaveofKnowledge, + region_id if region_id == 1800001 => Region::StrandedGraveyard, + region_id if region_id == 6101000 => Region::Stormhill, + region_id if region_id == 6101010 => Region::MargittheFellOmen, + region_id if region_id == 3011001 => Region::DeathtouchedCatacombs, + region_id if region_id == 3410090 => Region::DivineTowerofLimgrave, + region_id if region_id == 6102001 => Region::CastleMorne, + region_id if region_id == 6102020 => Region::MorneMoangrave, + region_id if region_id == 6102000 => Region::WeepingPeninsulaEast, + region_id if region_id == 6102002 => Region::WeepingPeninsulaWest, + region_id if region_id == 3001001 => Region::ImpalersCatacombs, + region_id if region_id == 3000001 => Region::TombswardCatacombs, + region_id if region_id == 3101001 => Region::EarthboreCave, + region_id if region_id == 3102001 => Region::TombswardCave, + region_id if region_id == 3200001 => Region::MorneTunnel, + region_id if region_id == 1000001 => Region::StormveilMainGateStormveilCliffside, + region_id if region_id == 1000006 => Region::GatesideChamber, + region_id if region_id == 1000003 => Region::RampartTower, + region_id if region_id == 1000005 => Region::LiftsideChamberSecludedCell, + region_id if region_id == 1000000 => Region::GodricktheGrafted, + region_id if region_id == 6200001 => Region::LiurniaSouthEast, + region_id if region_id == 6200004 => Region::LiurniaEast, + region_id if region_id == 6200008 => Region::BehindCariaManor, + region_id if region_id == 3105090 => Region::SlumberingWolfsShack, + region_id if region_id == 6200000 => Region::LiurniaSouth, + region_id if region_id == 6200002 => Region::LiurniaSouthWest, + region_id if region_id == 6200005 => Region::LiurniaWest, + region_id if region_id == 6200003 => Region::KingsrealmRuins, + // TODO: Fix these duplictaes + region_id if region_id == 6200007 => Region::MainCariaManorGate, + region_id if region_id == 6200007 => Region::CariaManor, + region_id if region_id == 6200007 => Region::ManorLowerLevel, + region_id if region_id == 6200010 => Region::RoyalMoongazingGrounds, + region_id if region_id == 6200006 => Region::TheRavine, + region_id if region_id == 3006001 => Region::CliffbottomCatacombs, + region_id if region_id == 3003001 => Region::RoadsEndCatacombs, + region_id if region_id == 3005001 => Region::BlackKnifeCatacombs, + region_id if region_id == 3104001 => Region::StillwaterCave, + region_id if region_id == 3105001 => Region::LakesideCrystalCave, + region_id if region_id == 3106001 => Region::AcademyCrystalCave, + region_id if region_id == 1400011 => Region::MainAcademyGate, + region_id if region_id == 3202001 => Region::RayaLucariaCrystalTunnel, + region_id if region_id == 3411090 => Region::DivineTowerofLiurnia, + region_id if region_id == 6201000 => Region::BellumHighway, + region_id if region_id == 6200090 => Region::GrandLiftofDectusJarburg, + region_id if region_id == 3920002 => Region::RuinStrewnPrecipice, + region_id if region_id == 3920003 => Region::RuinStrewnPrecipiceOverlook, + region_id if region_id == 3920000 => Region::MagmaWyrmMakar, + region_id if region_id == 6202000 => Region::MoonlightAltar, + region_id if region_id == 1400013 => Region::ChurchoftheCuckoo, + region_id if region_id == 1400015 => Region::SchoolhouseClassroom, + region_id if region_id == 1400010 => Region::DebateParlor, + region_id if region_id == 1400000 => Region::RayaLucariaGrandLibrary, + region_id if region_id == 6300005 => Region::RampartsidePath, + region_id if region_id == 6300000 => Region::StormcallerChurchLuxRuins, + region_id if region_id == 6300001 => Region::TheShadedCastle, + region_id if region_id == 6300002 => Region::AltusHighwayJunction, + region_id if region_id == 6300030 => Region::CastellansHall, + region_id if region_id == 6300003 => Region::ForestSpanningGreatbridge, + region_id if region_id == 3012001 => Region::UnsightlyCatacombs, + region_id if region_id == 3008001 => Region::SaintedHerosGrave, + region_id if region_id == 3119001 => Region::SagesCave, + region_id if region_id == 3118001 => Region::PerfumersGrotto, + region_id if region_id == 6300004 => Region::DominulaWindmillVillageRoadofIniquitySidePath, + region_id if region_id == 3204001 => Region::OldAltusTunnel, + region_id if region_id == 3205001 => Region::AltusTunnel, + region_id if region_id == 6302000 => Region::NinthMtGelmirCampsite, + region_id if region_id == 6302001 => Region::RoadofIniquity, + region_id if region_id == 6302002 => Region::SeethewaterTerminusPrimevalSorcererAzur, + region_id if region_id == 3007001 => Region::WyndhamCatacombs, + region_id if region_id == 3009001 => Region::GelmirHerosGrave, + region_id if region_id == 3107001 => Region::SeethewaterCave, + region_id if region_id == 3109001 => Region::VolcanoCave, + region_id if region_id == 6301000 => Region::CapitalOutskirts, + region_id if region_id == 6301090 => Region::CapitalRampart, + region_id if region_id == 3013091 => Region::AurizaSideTomb, + region_id if region_id == 3010001 => Region::AurizaHerosGrave, + region_id if region_id == 3412011 => Region::SealedTunnel, + region_id if region_id == 3412090 => Region::DivineTowerofWestAltus, + region_id if region_id == 1600012 => Region::VolcanoManor, + region_id if region_id == 1600014 => Region::PrisonTownChurch, + region_id if region_id == 1600010 => Region::TempleofEiglay, + region_id if region_id == 1600016 => Region::GuestHall, + region_id if region_id == 1600006 => Region::AudiencePathway, + region_id if region_id == 1600020 => Region::AbductorVirgin, + region_id if region_id == 1600022 => Region::SubterraneanInquisitionChamber, + region_id if region_id == 1600000 => Region::RykardLordofBlasphemy, + region_id if region_id == 1100010 => Region::ErdtreeSanctuary, + region_id if region_id == 1100012 => Region::EastCapitalRampart, + region_id if region_id == 1100015 => Region::LowerCapitalChurch, + region_id if region_id == 1100013 => Region::AvenueBalcony, + region_id if region_id == 1100001 => Region::QueensBedchamber, + region_id if region_id == 1100016 => Region::WestCapitalRampartFortifiedManorFirstFloor, + region_id if region_id == 1100017 => Region::DivineBridge, + region_id if region_id == 1100000 => Region::EldenThrone, + region_id if region_id == 3500002 => Region::UndergroundRoadside, + region_id if region_id == 3500008 => Region::ForsakenDepths, + region_id if region_id == 3500010 => Region::LeyndellCatacombs, + region_id if region_id == 3500011 => Region::LeyndellCatacombsPartII, + region_id if region_id == 3500092 => Region::FrenziedFlameProscription, + region_id if region_id == 3500000 => Region::CathedraloftheForsaken, + region_id if region_id == 1105011 => Region::LeyndellCapitalofAsh, + region_id if region_id == 1105001 => Region::AshenQueensBedchamber, + region_id if region_id == 1105092 => Region::AshenDivineBridge, + region_id if region_id == 1105000 => Region::AshenEldenThrone, + region_id if region_id == 1900000 => Region::FracturedMarika, + region_id if region_id == 1900001 => Region::EldenBeast, + region_id if region_id == 6400001 => Region::CentralCaelid, + region_id if region_id == 6400000 => Region::CaelidNorth, + region_id if region_id == 6400002 => Region::ChamberOutsidethePlaza, + region_id if region_id == 6400010 => Region::RedmaneCastlePlaza, + region_id if region_id == 6400040 => Region::StarscourgeRadahn, + region_id if region_id == 3014001 => Region::MinorErdtreeCatacombs, + region_id if region_id == 3015001 => Region::CaelidCatacombs, + region_id if region_id == 3016001 => Region::WarDeadCatacombs, + region_id if region_id == 3120001 => Region::AbandonedCave, + region_id if region_id == 3121001 => Region::GaolCave, + region_id if region_id == 3207001 => Region::GaelTunnel, + region_id if region_id == 3207002 => Region::GaelTunnelPartII, + region_id if region_id == 3207090 => Region::RearGaelTunnelEntrance, + region_id if region_id == 3208001 => Region::SelliaCrystalTunnel, + region_id if region_id == 6400020 => Region::ChairCryptofSellia, + region_id if region_id == 6401000 => Region::SwampofAeonia, + region_id if region_id == 6402000 => Region::Dragonbarrow, + region_id if region_id == 3111001 => Region::SelliaHideaway, + region_id if region_id == 3110001 => Region::DragonbarrowCave, + region_id if region_id == 6402001 => Region::BestialSanctum, + region_id if region_id == 3413003 => Region::DivineTowerofCaelidCenter, + region_id if region_id == 3413013 => Region::DivineTowerofCaelidBasemenr, + region_id if region_id == 3415090 => Region::IsolatedDivineTower, + region_id if region_id == 6500000 => Region::ForbiddenLands, + region_id if region_id == 6500090 => Region::GrandLiftofRold, + region_id if region_id == 3020001 => Region::HiddenPathtotheHaligtree, + region_id if region_id == 3020002 => Region::HiddenPathtotheHaligtreePartII, + region_id if region_id == 3414011 => Region::DivineTowerofEastAltus, + region_id if region_id == 6501000 => Region::ZamorRuins, + region_id if region_id == 6501001 => Region::CentralMountaintops, + region_id if region_id == 6501002 => Region::CastleSol, + region_id if region_id == 3122001 => Region::SpiritcallersCave, + region_id if region_id == 6501003 => Region::CastleSolMainGateChurchoftheEclipse, + region_id if region_id == 6501010 => Region::CastleSolRooftop, + region_id if region_id == 6502000 => Region::GiantsGravepostFootoftheForge, + region_id if region_id == 6502010 => Region::FireGiant, + region_id if region_id == 3018001 => Region::GiantsMountaintopCatacombs, + region_id if region_id == 3017002 => Region::GiantConqueringHerosGrave, + region_id if region_id == 6503000 => Region::ConsecratedSnowfield, + region_id if region_id == 3019001 => Region::ConsecratedSnowfieldCatacombs, + region_id if region_id == 3112001 => Region::CaveoftheForlorn, + region_id if region_id == 3211001 => Region::YeloughAnixTunnel, + region_id if region_id == 1500011 => Region::HaligtreeCanopy, + region_id if region_id == 1500012 => Region::HaligtreeTownPlaza, + region_id if region_id == 1500010 => Region::HaligtreePromenade, + region_id if region_id == 1500001 => Region::PrayerRoom, + region_id if region_id == 1500002 => Region::ElphaelInnerWallDrainageChannel, + region_id if region_id == 1500003 => Region::HaligtreeRoots, + region_id if region_id == 1500000 => Region::MaleniaGoddessofRot, + region_id if region_id == 1201001 => Region::AinselRiverWellDepths, + region_id if region_id == 1201002 => Region::AinselRiverDownstream, + region_id if region_id == 1201003 => Region::AinselRiverDownstreamPartII, + region_id if region_id == 1204000 => Region::AstelNaturalbornoftheVoid, + region_id if region_id == 1201000 => Region::DragonkinSoldierofNokstella, + region_id if region_id == 1201011 => Region::AinselRiverMain, + region_id if region_id == 1201013 => Region::NokstellaEternalCity, + region_id if region_id == 1201014 => Region::NokstellaWaterfallBasin, + region_id if region_id == 1201015 => Region::LakeofRotShoreside, + region_id if region_id == 1201016 => Region::GrandCloister, + region_id if region_id == 1201017 => Region::GrandCloisterPartII, + region_id if region_id == 1207026 => Region::NokronEternalCity, + region_id if region_id == 1202020 => Region::MimicTear, + region_id if region_id == 1202002 => Region::AncestralWoods, + region_id if region_id == 1202007 => Region::NightsSacredGround, + region_id if region_id == 1202003 => Region::AqueductFacingCliffs, + region_id if region_id == 1202004 => Region::AqueductFacingCliffsPartII, + region_id if region_id == 1202000 => Region::GreatWaterfallBasin, + region_id if region_id == 1205001 => Region::PalaceApproachLedgeRoad, + region_id if region_id == 1205004 => Region::DynastyMausoleumEntrance, + region_id if region_id == 1205006 => Region::DynastyMausoleumMidpoint, + region_id if region_id == 1205000 => Region::CocoonoftheEmpyrean, + region_id if region_id == 1207031 => Region::SiofraRiverWellDepths, + region_id if region_id == 1202033 => Region::SiofraRiverBank, + region_id if region_id == 1202034 => Region::WorshippersWoods, + region_id if region_id == 1203001 => Region::RootFacingCliffs, + region_id if region_id == 1203002 => Region::GreatWaterfallCrestPartII, + region_id if region_id == 1203003 => Region::DeeprootDepths, + region_id if region_id == 1203004 => Region::TheNamelessEternalCity, + region_id if region_id == 1203005 => Region::AcrosstheRoots, + region_id if region_id == 1203000 => Region::PrinceofDeathsThrone, + region_id if region_id == 1300012 => Region::CrumblingBeastGrave, + region_id if region_id == 1300013 => Region::CrumblingBeastGraveDepthsTempestFacingBalcony, + region_id if region_id == 1300017 => Region::DragonTemple, + region_id if region_id == 1300018 => Region::DragonTempleTransept, + region_id if region_id == 1300010 => Region::DragonTempleAltar, + region_id if region_id == 1300019 => Region::DragonTempleLift, + region_id if region_id == 1300003 => Region::DragonTempleRooftop, + region_id if region_id == 1300020 => Region::DragonlordPlacidusax, + region_id if region_id == 1300006 => Region::BesidetheGreatBridge, + region_id if region_id == 1300000 => Region::MalikeththeBlackBlade, + + // DLC + region_id if region_id == 2000000 => Region::BeluratTheatreoftheDivineBeast, + region_id if region_id == 2000001 => Region::BeluratBeluratTowerSettlement, + region_id if region_id == 2000002 => Region::BeluratStagefront, + region_id if region_id == 2001000 => Region::EnirIlimGateofDivinity, + region_id if region_id == 2001001 => Region::EnirIlimOuterWall, + region_id if region_id == 2001004 => Region::EnirIlimSpiralRise, + region_id if region_id == 2001005 => Region::EnirIlimCleansingChamberAnteroom, + region_id if region_id == 2001007 => Region::EnirIlimDivineGateFrontStaircase, + region_id if region_id == 6900000 => Region::ShadowKeepMainGate, + region_id if region_id == 6900010 => Region::ShadowKeepMainGatePlaza, + region_id if region_id == 2100011 => Region::ShadowKeepChurchDistrictEntrance, + region_id if region_id == 2100014 => Region::ShadowKeepSunkenChapel, + region_id if region_id == 2100015 => Region::ShadowKeepTreeWorshipSanctum, + region_id if region_id == 2101000 => Region::StorehouseMessmersDarkChamber, + region_id if region_id == 2101001 => Region::StorehouseFirstFloor, + region_id if region_id == 2101003 => Region::StorehouseFourthFloor, + region_id if region_id == 2101004 => Region::StorehouseSeventhFloor, + region_id if region_id == 2101006 => Region::StorehouseDarkChamberEntrance, + region_id if region_id == 2101011 => Region::StorehouseBackSection, + region_id if region_id == 2101012 => Region::StorehouseLoft, + region_id if region_id == 2102001 => Region::StorehouseWestRampart, + region_id if region_id == 2200000 => Region::StoneCoffinFissureGardenofDeepPurple, + region_id if region_id == 2200001 => Region::StoneCoffinFissureStoneCoffinFissure, + region_id if region_id == 2200002 => Region::StoneCoffinFissureFissureCross, + region_id if region_id == 2200004 => Region::StoneCoffinFissureFissureWaypointDepths, + region_id if region_id == 6860010 => Region::MidrasManseDiscussionChamber, + region_id if region_id == 6860001 => Region::MidrasManseManseHall, + region_id if region_id == 6860004 => Region::MidrasManseMidrasLibrary, + region_id if region_id == 4000001 => Region::GravesitePlainFogRiftCatacombs, + region_id if region_id == 4200090 => Region::GravesitePlainRuinedForgeLavaIntake, + region_id if region_id == 4300001 => Region::GravesitePlainRivermouthCave, + region_id if region_id == 4200090 => Region::GravesitePlainDragonsPit, + region_id if region_id == 4301090 => Region::GravesitePlainDragonsPitTerminus, + region_id if region_id == 6800000 => Region::GravesitePlainGravesitePlain, + region_id if region_id == 6810001 => Region::GravesitePlainEllacRiverCave, + region_id if region_id == 6810000 => Region::GravesitePlainPillarPath, + region_id if region_id == 4100001 => Region::GravesitePlainBeluratGaol, + region_id if region_id == 6810090 => Region::GravesitePlainEllacRiverDownstream, + region_id if region_id == 6840000 => Region::CharosHiddenGraveCharosHiddenGrave, + region_id if region_id == 4102001 => Region::CharosHiddenGraveLamentersGaol, + region_id if region_id == 6820000 => Region::CastleEnsisCastleEnsis, + region_id if region_id == 6820010 => Region::CastleEnsisEnsisMoongazingGrounds, + region_id if region_id == 6830000 => Region::CeruleanCoastCeruleanCoast, + region_id if region_id == 6830002 => Region::CeruleanCoastTheFissure, + region_id if region_id == 6860000 => Region::AbyssalWoodsAbyssalWoods, + region_id if region_id == 4002000 => Region::AbyssalWoodsForsakenGraveyard, + region_id if region_id == 6841000 => Region::FootoftheJaggedPeak, + region_id if region_id == 6850000 => Region::JaggedPeakMountainside, + region_id if region_id == 6850001 => Region::JaggedPeakSummit, + region_id if region_id == 6850010 => Region::JaggedPeakRestoftheDreadDragon, + region_id if region_id == 6941000 => Region::AncientRuinsofRauhWest, + region_id if region_id == 6941010 => Region::AncientRuinsofRauhChurchoftheBud, + region_id if region_id == 6940000 => Region::AncientRuinsofRauhEast, + region_id if region_id == 6901000 => Region::RauhBaseAncientRuins, + region_id if region_id == 4001001 => Region::RauhBaseScorpionRiverCatacombs, + region_id if region_id == 4203090 => Region::RauhBaseTaylewsRuinedForge, + region_id if region_id == 2500000 => Region::ScaduAltusFingerBirthingGrounds, + region_id if region_id == 6900000 => Region::ScaduAltusScaduAltus, + region_id if region_id == 6902000 => Region::ScaduAltusBonnyVillage, + region_id if region_id == 6903090 => Region::ScaduAltusCastleWateringHole, + region_id if region_id == 6903000 => Region::ScaduAltusReclusesRiverDownstream, + region_id if region_id == 4002001 => Region::ScaduAltusDarklightCatacombs, + region_id if region_id == 4101001 => Region::ScaduAltusBonnyGaol, + region_id if region_id == 4202090 => Region::ScaduAltusRuinedForgeofStarfallPast, + region_id if region_id == 2100010 => Region::ScaduviewScadutreeBase, + region_id if region_id == 2101010 => Region::ScaduviewScaduview, + region_id if region_id == 2101013 => Region::ScaduviewShadowKeepBackGate, + region_id if region_id == 6930000 => Region::ScaduviewHinterland, + + _ => Region::NonInvadeableRegion + } } +} - pub static ID_TO_REGION: Lazy>> = Lazy::new(|| { - Mutex::new(HashMap::from([ - (6100090,Region::ChurchofDragonCommunion), - (6100000,Region::TheFirstStepChurchofElleh), - (6100001,Region::SeasideRuins), - (6100004,Region::MistwoodOutskirtsFortHaightWest), - (6100002,Region::AgheelLakeNorthMurkwaterCoastGatefrontRuins), - (6100003,Region::SummonwaterVillageOutskirts), - (6100010,Region::WaypointRuinsCellar), - (3002001,Region::StormfootCatacombs), - (3004001,Region::MurkwaterCatacombs), - (3103001,Region::GrovesideCave), - (3115001,Region::CoastalCave), - (3100001,Region::MurkwaterCave), - (3117001,Region::HighroadCave), - (3201001,Region::LimgraveTunnels), - (1800090,Region::CaveofKnowledge), - (1800001,Region::StrandedGraveyard), - (6101000,Region::Stormhill), - (6101010,Region::MargittheFellOmen), - (3011001,Region::DeathtouchedCatacombs), - (3410090,Region::DivineTowerofLimgrave), - (6102001,Region::CastleMorne), - (6102020,Region::MorneMoangrave), - (6102000,Region::WeepingPeninsulaEast), - (6102002,Region::WeepingPeninsulaWest), - (3001001,Region::ImpalersCatacombs), - (3000001,Region::TombswardCatacombs), - (3101001,Region::EarthboreCave), - (3102001,Region::TombswardCave), - (3200001,Region::MorneTunnel), - (1000001,Region::StormveilMainGateStormveilCliffside), - (1000006,Region::GatesideChamber), - (1000003,Region::RampartTower), - (1000005,Region::LiftsideChamberSecludedCell), - (1000000,Region::GodricktheGrafted), - (6200001,Region::LiurniaSouthEast), - (6200004,Region::LiurniaEast), - (6200008,Region::BehindCariaManor), - (3105090,Region::SlumberingWolfsShack), - (6200000,Region::LiurniaSouth), - (6200002,Region::LiurniaSouthWest), - (6200005,Region::LiurniaWest), - (6200003,Region::KingsrealmRuins), - (6200007,Region::MainCariaManorGate), - (6200007,Region::CariaManor), - (6200007,Region::ManorLowerLevel), - (6200010,Region::RoyalMoongazingGrounds), - (6200006,Region::TheRavine), - (3006001,Region::CliffbottomCatacombs), - (3003001,Region::RoadsEndCatacombs), - (3005001,Region::BlackKnifeCatacombs), - (3104001,Region::StillwaterCave), - (3105001,Region::LakesideCrystalCave), - (3106001,Region::AcademyCrystalCave), - (1400011,Region::MainAcademyGate), - (3202001,Region::RayaLucariaCrystalTunnel), - (3411090,Region::DivineTowerofLiurnia), - (6201000,Region::BellumHighway), - (6200090,Region::GrandLiftofDectusJarburg), - (3920002,Region::RuinStrewnPrecipice), - (3920003,Region::RuinStrewnPrecipiceOverlook), - (3920000,Region::MagmaWyrmMakar), - (6202000,Region::MoonlightAltar), - (1400013,Region::ChurchoftheCuckoo), - (1400015,Region::SchoolhouseClassroom), - (1400010,Region::DebateParlor), - (1400000,Region::RayaLucariaGrandLibrary), - (6300005,Region::RampartsidePath), - (6300000,Region::StormcallerChurchLuxRuins), - (6300001,Region::TheShadedCastle), - (6300002,Region::AltusHighwayJunction), - (6300030,Region::CastellansHall), - (6300003,Region::ForestSpanningGreatbridge), - (3012001,Region::UnsightlyCatacombs), - (3008001,Region::SaintedHerosGrave), - (3119001,Region::SagesCave), - (3118001,Region::PerfumersGrotto), - (6300004,Region::DominulaWindmillVillageRoadofIniquitySidePath), - (3204001,Region::OldAltusTunnel), - (3205001,Region::AltusTunnel), - (6302000,Region::NinthMtGelmirCampsite), - (6302001,Region::RoadofIniquity), - (6302002,Region::SeethewaterTerminusPrimevalSorcererAzur), - (3007001,Region::WyndhamCatacombs), - (3009001,Region::GelmirHerosGrave), - (3107001,Region::SeethewaterCave), - (3109001,Region::VolcanoCave), - (6301000,Region::CapitalOutskirts), - (6301090,Region::CapitalRampart), - (3013091,Region::AurizaSideTomb), - (3010001,Region::AurizaHerosGrave), - (3412011,Region::SealedTunnel), - (3412090,Region::DivineTowerofWestAltus), - (1600012,Region::VolcanoManor), - (1600014,Region::PrisonTownChurch), - (1600010,Region::TempleofEiglay), - (1600016,Region::GuestHall), - (1600006,Region::AudiencePathway), - (1600020,Region::AbductorVirgin), - (1600022,Region::SubterraneanInquisitionChamber), - (1600000,Region::RykardLordofBlasphemy), - (1100010,Region::ErdtreeSanctuary), - (1100012,Region::EastCapitalRampart), - (1100015,Region::LowerCapitalChurch), - (1100013,Region::AvenueBalcony), - (1100001,Region::QueensBedchamber), - (1100016,Region::WestCapitalRampartFortifiedManorFirstFloor), - (1100017,Region::DivineBridge), - (1100000,Region::EldenThrone), - (3500002,Region::UndergroundRoadside), - (3500008,Region::ForsakenDepths), - (3500010,Region::LeyndellCatacombs), - (3500011,Region::LeyndellCatacombsPartII), - (3500092,Region::FrenziedFlameProscription), - (3500000,Region::CathedraloftheForsaken), - (1105011,Region::LeyndellCapitalofAsh), - (1105001,Region::AshenQueensBedchamber), - (1105092,Region::AshenDivineBridge), - (1105000,Region::AshenEldenThrone), - (1900000,Region::FracturedMarika), - (1900001,Region::EldenBeast), - (6400001,Region::CentralCaelid), - (6400000,Region::CaelidNorth), - (6400002,Region::ChamberOutsidethePlaza), - (6400010,Region::RedmaneCastlePlaza), - (6400040,Region::StarscourgeRadahn), - (3014001,Region::MinorErdtreeCatacombs), - (3015001,Region::CaelidCatacombs), - (3016001,Region::WarDeadCatacombs), - (3120001,Region::AbandonedCave), - (3121001,Region::GaolCave), - (3207001,Region::GaelTunnel), - (3207002,Region::GaelTunnelPartII), - (3207090,Region::RearGaelTunnelEntrance), - (3208001,Region::SelliaCrystalTunnel), - (6400020,Region::ChairCryptofSellia), - (6401000,Region::SwampofAeonia), - (6402000,Region::Dragonbarrow), - (3111001,Region::SelliaHideaway), - (3110001,Region::DragonbarrowCave), - (6402001,Region::BestialSanctum), - (3413003,Region::DivineTowerofCaelidCenter), - (3413013,Region::DivineTowerofCaelidBasemenr), - (3415090,Region::IsolatedDivineTower), - (6500000,Region::ForbiddenLands), - (6500090,Region::GrandLiftofRold), - (3020001,Region::HiddenPathtotheHaligtree), - (3020002,Region::HiddenPathtotheHaligtreePartII), - (3414011,Region::DivineTowerofEastAltus), - (6501000,Region::ZamorRuins), - (6501001,Region::CentralMountaintops), - (6501002,Region::CastleSol), - (3122001,Region::SpiritcallersCave), - (6501003,Region::CastleSolMainGateChurchoftheEclipse), - (6501010,Region::CastleSolRooftop), - (6502000,Region::GiantsGravepostFootoftheForge), - (6502010,Region::FireGiant), - (3018001,Region::GiantsMountaintopCatacombs), - (3017002,Region::GiantConqueringHerosGrave), - (6503000,Region::ConsecratedSnowfield), - (3019001,Region::ConsecratedSnowfieldCatacombs), - (3112001,Region::CaveoftheForlorn), - (3211001,Region::YeloughAnixTunnel), - (1500011,Region::HaligtreeCanopy), - (1500012,Region::HaligtreeTownPlaza), - (1500010,Region::HaligtreePromenade), - (1500001,Region::PrayerRoom), - (1500002,Region::ElphaelInnerWallDrainageChannel), - (1500003,Region::HaligtreeRoots), - (1500000,Region::MaleniaGoddessofRot), - (1201001,Region::AinselRiverWellDepths), - (1201002,Region::AinselRiverDownstream), - (1201003,Region::AinselRiverDownstreamPartII), - (1204000,Region::AstelNaturalbornoftheVoid), - (1201000,Region::DragonkinSoldierofNokstella), - (1201011,Region::AinselRiverMain), - (1201013,Region::NokstellaEternalCity), - (1201014,Region::NokstellaWaterfallBasin), - (1201015,Region::LakeofRotShoreside), - (1201016,Region::GrandCloister), - (1201017,Region::GrandCloisterPartII), - (1207026,Region::NokronEternalCity), - (1202020,Region::MimicTear), - (1202002,Region::AncestralWoods), - (1202007,Region::NightsSacredGround), - (1202003,Region::AqueductFacingCliffs), - (1202004,Region::AqueductFacingCliffsPartII), - (1202000,Region::GreatWaterfallBasin), - (1205001,Region::PalaceApproachLedgeRoad), - (1205004,Region::DynastyMausoleumEntrance), - (1205006,Region::DynastyMausoleumMidpoint), - (1205000,Region::CocoonoftheEmpyrean), - (1207031,Region::SiofraRiverWellDepths), - (1202033,Region::SiofraRiverBank), - (1202034,Region::WorshippersWoods), - (1203001,Region::RootFacingCliffs), - (1203002,Region::GreatWaterfallCrestPartII), - (1203003,Region::DeeprootDepths), - (1203004,Region::TheNamelessEternalCity), - (1203005,Region::AcrosstheRoots), - (1203000,Region::PrinceofDeathsThrone), - (1300012,Region::CrumblingBeastGrave), - (1300013,Region::CrumblingBeastGraveDepthsTempestFacingBalcony), - (1300017,Region::DragonTemple), - (1300018,Region::DragonTempleTransept), - (1300010,Region::DragonTempleAltar), - (1300019,Region::DragonTempleLift), - (1300003,Region::DragonTempleRooftop), - (1300020,Region::DragonlordPlacidusax), - (1300006,Region::BesidetheGreatBridge), - (1300000,Region::MalikeththeBlackBlade), - ])) - }); - - +impl Region { //key, id, name, map, is_open_world, is_dungeon, is_boss - pub static REGIONS: Lazy>> = Lazy::new(|| { - Mutex::new(HashMap::from([ - (Region::ChurchofDragonCommunion, (6100090,"Church of Dragon Communion", MapName::Limgrave, true, false, false)), - (Region::TheFirstStepChurchofElleh, (6100000,"The First Step, Church of Elleh", MapName::Limgrave, true, false, false)), - (Region::SeasideRuins, (6100001,"Seaside Ruins", MapName::Limgrave, true, false, false)), - (Region::MistwoodOutskirtsFortHaightWest, (6100004,"Mistwood Outskirts, Fort Haight West", MapName::Limgrave, true, false, false)), - (Region::AgheelLakeNorthMurkwaterCoastGatefrontRuins, (6100002,"Agheel Lake North, Murkwater Coast, Gatefront Ruins", MapName::Limgrave, true, false, false)), - (Region::SummonwaterVillageOutskirts, (6100003,"Summonwater Village Outskirts", MapName::Limgrave, true, false, false)), - (Region::WaypointRuinsCellar, (6100010,"Waypoint Ruins Cellar", MapName::Limgrave, true, false, false)), - (Region::StormfootCatacombs, (3002001,"Stormfoot Catacombs", MapName::Limgrave, false, true, false)), - (Region::MurkwaterCatacombs, (3004001,"Murkwater Catacombs", MapName::Limgrave, false, true, false)), - (Region::GrovesideCave, (3103001,"Groveside Cave", MapName::Limgrave, false, true, false)), - (Region::CoastalCave, (3115001,"Coastal Cave", MapName::Limgrave, false, true, false)), - (Region::MurkwaterCave, (3100001,"Murkwater Cave", MapName::Limgrave, false, true, false)), - (Region::HighroadCave, (3117001,"Highroad Cave", MapName::Limgrave, false, true, false)), - (Region::LimgraveTunnels, (3201001,"Limgrave Tunnels", MapName::Limgrave, false, true, false)), - - (Region::CaveofKnowledge, (1800090,"Cave of Knowledge", MapName::StrandedGraveyard, false, true, false)), - (Region::StrandedGraveyard, (1800001,"Stranded Graveyard", MapName::StrandedGraveyard, false, true, false)), - - (Region::Stormhill, (6101000,"Stormhill", MapName::Stormhill, true, false, false)), - (Region::MargittheFellOmen, (6101010,"Margit, the Fell Omen", MapName::Stormhill, false, false, true)), - (Region::DeathtouchedCatacombs, (3011001,"Deathtouched Catacombs", MapName::Stormhill, false, true, false)), - (Region::DivineTowerofLimgrave, (3410090,"Divine Tower of Limgrave", MapName::Stormhill, false, false, false)), - - (Region::CastleMorne, (6102001,"Castle Morne", MapName::WeepingPeninsula, false, false, true)), - (Region::MorneMoangrave, (6102020,"Morne Moangrave", MapName::WeepingPeninsula, false, false, true)), - (Region::WeepingPeninsulaEast, (6102000,"Weeping Peninsula East", MapName::WeepingPeninsula, true, false, false)), - (Region::WeepingPeninsulaWest, (6102002,"Weeping Peninsula West", MapName::WeepingPeninsula, true, false, false)), - (Region::ImpalersCatacombs, (3001001,"Impaler's Catacombs", MapName::WeepingPeninsula, false, true, false)), - (Region::TombswardCatacombs, (3000001,"Tombsward Catacombs", MapName::WeepingPeninsula, false, true, false)), - (Region::EarthboreCave, (3101001,"Earthbore Cave", MapName::WeepingPeninsula, false, true, false)), - (Region::TombswardCave, (3102001,"Tombsward Cave", MapName::WeepingPeninsula, false, true, false)), - (Region::MorneTunnel, (3200001,"Morne Tunnel", MapName::WeepingPeninsula, false, true, false)), - - (Region::StormveilMainGateStormveilCliffside, (1000001,"Stormveil Main Gate, Stormveil Cliffside", MapName::StormveilCastle, false, false, false)), - (Region::GatesideChamber, (1000006,"Gateside Chamber", MapName::StormveilCastle, false, false, false)), - (Region::RampartTower, (1000003,"Rampart Tower", MapName::StormveilCastle, false, false, false)), - (Region::LiftsideChamberSecludedCell, (1000005,"Liftside Chamber, Secluded Cell", MapName::StormveilCastle, false, false, true)), - (Region::GodricktheGrafted, (1000000,"Godrick the Grafted", MapName::StormveilCastle, false, false, true)), - - (Region::LiurniaSouthEast, (6200001,"Liurnia South-East", MapName::LiurniaOfTheLakes, true, false, false)), - (Region::LiurniaEast, (6200004,"Liurnia East", MapName::LiurniaOfTheLakes, true, false, false)), - (Region::BehindCariaManor, (6200008,"Behind Caria Manor", MapName::LiurniaOfTheLakes, false, false, false)), - (Region::SlumberingWolfsShack, (3105090,"Slumbering Wolf's Shack", MapName::LiurniaOfTheLakes, false, false, false)), - (Region::LiurniaSouth, (6200000,"Liurnia South", MapName::LiurniaOfTheLakes, true, false, false)), - (Region::LiurniaSouthWest, (6200002,"Liurnia South-West", MapName::LiurniaOfTheLakes, true, false, false)), - (Region::LiurniaWest, (6200005,"Liurnia West", MapName::LiurniaOfTheLakes, true, false, false)), - (Region::KingsrealmRuins, (6200003,"Kingsrealm Ruins", MapName::LiurniaOfTheLakes, true, false, false)), - (Region::MainCariaManorGate, (6200007,"Main Caria Manor Gate", MapName::LiurniaOfTheLakes, true, false, false)), - (Region::CariaManor, (6200007,"Caria Manor", MapName::LiurniaOfTheLakes, false, false, false)), - (Region::ManorLowerLevel, (6200007,"Manor Lower Level", MapName::LiurniaOfTheLakes, false, false, false)), - (Region::RoyalMoongazingGrounds, (6200010,"Royal Moongazing Grounds", MapName::LiurniaOfTheLakes, false, false, false)), - (Region::TheRavine, (6200006,"The Ravine", MapName::LiurniaOfTheLakes, true, false, false)), - (Region::CliffbottomCatacombs, (3006001,"Cliffbottom Catacombs", MapName::LiurniaOfTheLakes, false, true, false)), - (Region::RoadsEndCatacombs, (3003001,"Road's End Catacombs", MapName::LiurniaOfTheLakes, false, true, false)), - (Region::BlackKnifeCatacombs, (3005001,"Black Knife Catacombs", MapName::LiurniaOfTheLakes, false, true, false)), - (Region::StillwaterCave, (3104001,"Stillwater Cave", MapName::LiurniaOfTheLakes, false, true, false)), - (Region::LakesideCrystalCave, (3105001,"Lakeside Crystal Cave", MapName::LiurniaOfTheLakes, false, true, false)), - (Region::AcademyCrystalCave, (3106001,"Academy Crystal Cave", MapName::LiurniaOfTheLakes, false, true, false)), - (Region::MainAcademyGate, (1400011,"Main Academy Gate", MapName::LiurniaOfTheLakes, false, false, false)), - (Region::RayaLucariaCrystalTunnel, (3202001,"Raya Lucaria Crystal Tunnel", MapName::LiurniaOfTheLakes, false, true, false)), - (Region::DivineTowerofLiurnia, (3411090,"Divine Tower of Liurnia", MapName::LiurniaOfTheLakes, false, false, false)), - - - (Region::BellumHighway, (6201000,"Bellum Highway", MapName::BellumHighway, true, false, false)), - (Region::GrandLiftofDectusJarburg, (6200090,"Grand Lift of Dectus, Jarburg", MapName::BellumHighway, true, false, false)), - - (Region::RuinStrewnPrecipice, (3920002,"Ruin-Strewn Precipice", MapName::RuinStrewnPrecipice, false, false, false)), - (Region::RuinStrewnPrecipiceOverlook, (3920003,"Ruin-Strewn Precipice Overlook", MapName::RuinStrewnPrecipice, false, false, true)), - (Region::MagmaWyrmMakar, (3920000,"Magma Wyrm Makar", MapName::RuinStrewnPrecipice, false, false, true)), - - (Region::MoonlightAltar, (6202000,"Moonlight Altar", MapName::MoonlightAltar, false, false, false)), - - (Region::ChurchoftheCuckoo, (1400013,"Church of the Cuckoo", MapName::AcademyOfRayaLucaria, false, false, false)), - (Region::SchoolhouseClassroom, (1400015,"Schoolhouse Classroom", MapName::AcademyOfRayaLucaria, false, false, false)), - (Region::DebateParlor, (1400010,"Debate Parlor", MapName::AcademyOfRayaLucaria, false, false, false)), - (Region::RayaLucariaGrandLibrary, (1400000,"Raya Lucaria Grand Library", MapName::AcademyOfRayaLucaria, false, false, true)), - - (Region::RampartsidePath, (6300005,"Rampartside Path", MapName::AltusPlateau, true, false, false)), - (Region::StormcallerChurchLuxRuins, (6300000,"Stormcaller Church, Lux Ruins", MapName::AltusPlateau, true, false, false)), - (Region::TheShadedCastle, (6300001,"The Shaded Castle", MapName::AltusPlateau, false, false, false)), - (Region::AltusHighwayJunction, (6300002,"Altus Highway Junction", MapName::AltusPlateau, true, false, false)), - (Region::CastellansHall, (6300030,"Castellan's Hall", MapName::AltusPlateau, false, false, false)), - (Region::ForestSpanningGreatbridge, (6300003,"Forest-Spanning Greatbridge", MapName::AltusPlateau, true, false, false)), - (Region::UnsightlyCatacombs, (3012001,"Unsightly Catacombs", MapName::AltusPlateau, false, true, false)), - (Region::SaintedHerosGrave, (3008001,"Sainted Hero's Grave", MapName::AltusPlateau, false, true, false)), - (Region::SagesCave, (3119001,"Sage's Cave", MapName::AltusPlateau, false, true, false)), - (Region::PerfumersGrotto, (3118001,"Perfumer's Grotto", MapName::AltusPlateau, false, true, false)), - (Region::DominulaWindmillVillageRoadofIniquitySidePath, (6300004,"Dominula, Windmill Village, Road of Iniquity Side Path", MapName::AltusPlateau, true, false, false)), - (Region::OldAltusTunnel, (3204001,"Old Altus Tunnel", MapName::AltusPlateau, false, true, false)), - (Region::AltusTunnel, (3205001,"Altus Tunnel", MapName::AltusPlateau, false, true, false)), - - (Region::NinthMtGelmirCampsite, (6302000,"Ninth Mt. Gelmir Campsite", MapName::MtGelmir, true, false, false)), - (Region::RoadofIniquity, (6302001,"Road of Iniquity", MapName::MtGelmir, true, false, false)), - (Region::SeethewaterTerminusPrimevalSorcererAzur, (6302002,"Seethewater Terminus, Primeval Sorcerer Azur", MapName::MtGelmir, true, false, false)), - (Region::WyndhamCatacombs, (3007001,"Wyndham Catacombs", MapName::MtGelmir, false, true, false)), - (Region::GelmirHerosGrave, (3009001,"Gelmir Hero's Grave", MapName::MtGelmir, false, true, false)), - (Region::SeethewaterCave, (3107001,"Seethewater Cave", MapName::MtGelmir, false, true, false)), - (Region::VolcanoCave, (3109001,"Volcano Cave", MapName::MtGelmir, false, true, false)), - - (Region::CapitalOutskirts, (6301000,"Capital Outskirts", MapName::CapitalOutskirts, true, false, false)), - (Region::CapitalRampart, (6301090,"Capital Rampart", MapName::CapitalOutskirts, true, false, false)), - (Region::AurizaSideTomb, (3013091,"Auriza Side Tomb", MapName::CapitalOutskirts, false, true, false)), - (Region::AurizaHerosGrave, (3010001,"Auriza Hero's Grave", MapName::CapitalOutskirts, false, true, false)), - (Region::SealedTunnel, (3412011,"Sealed Tunnel", MapName::CapitalOutskirts, false, true, false)), - (Region::DivineTowerofWestAltus, (3412090,"Divine Tower of West Altus", MapName::CapitalOutskirts, false, false, false)), - - (Region::VolcanoManor, (1600012,"Volcano Manor", MapName::VolcanoManor, false, false, false)), - (Region::PrisonTownChurch, (1600014,"Prison Town Church", MapName::VolcanoManor, false, false, false)), - (Region::TempleofEiglay, (1600010,"Temple of Eiglay", MapName::VolcanoManor, false, false, false)), - (Region::GuestHall, (1600016,"Guest Hall", MapName::VolcanoManor, false, false, false)), - (Region::AudiencePathway, (1600006,"Audience Pathway", MapName::VolcanoManor, false, false, true)), - (Region::AbductorVirgin, (1600020,"Abductor Virgin", MapName::VolcanoManor, false, true, false)), - (Region::SubterraneanInquisitionChamber, (1600022,"Subterranean Inquisition Chamber", MapName::VolcanoManor, false, false, false)), - (Region::RykardLordofBlasphemy, (1600000,"Rykard, Lord of Blasphemy", MapName::VolcanoManor, false, false, true)), - - (Region::ErdtreeSanctuary, (1100010,"Erdtree Sanctuary", MapName::LeyndellRoyalCapital, false, false, false)), - (Region::EastCapitalRampart, (1100012,"East Capital Rampart", MapName::LeyndellRoyalCapital, false, false, false)), - (Region::LowerCapitalChurch, (1100015,"Lower Capital Church", MapName::LeyndellRoyalCapital, false, false, false)), - (Region::AvenueBalcony, (1100013,"Avenue Balcony", MapName::LeyndellRoyalCapital, false, false, false)), - (Region::QueensBedchamber, (1100001,"Queen's Bedchamber", MapName::LeyndellRoyalCapital, false, false, true)), - (Region::WestCapitalRampartFortifiedManorFirstFloor, (1100016,"West Capital Rampart, Fortified Manor, First Floor", MapName::LeyndellRoyalCapital, false, false, false)), - (Region::DivineBridge, (1100017,"Divine Bridge", MapName::LeyndellRoyalCapital, false, false, false)), - (Region::EldenThrone, (1100000,"Elden Throne", MapName::LeyndellRoyalCapital, false, false, true)), - - (Region::UndergroundRoadside, (3500002,"Underground Roadside", MapName::SubterraneanShunningGrounds, false, false, false)), - (Region::ForsakenDepths, (3500008,"Forsaken Depths", MapName::SubterraneanShunningGrounds, false, false, true)), - (Region::LeyndellCatacombs, (3500010,"Leyndell Catacombs", MapName::SubterraneanShunningGrounds, false, false, false)), - (Region::LeyndellCatacombsPartII, (3500011,"Leyndell Catacombs Part II", MapName::SubterraneanShunningGrounds, false, false, false)), - (Region::FrenziedFlameProscription, (3500092,"Frenzied Flame Proscription", MapName::SubterraneanShunningGrounds, false, false, false)), - (Region::CathedraloftheForsaken, (3500000,"Cathedral of the Forsaken", MapName::SubterraneanShunningGrounds, false, false, false)), - - (Region::LeyndellCapitalofAsh, (1105011,"Leyndell, Capital of Ash", MapName::LeyndellAshenCapital, false, false, true)), - (Region::AshenQueensBedchamber, (1105001,"Queen's Bedchamber ", MapName::LeyndellAshenCapital, false, false, true)), - (Region::AshenDivineBridge, (1105092,"Divine Bridge ", MapName::LeyndellAshenCapital, false, false, false)), - (Region::AshenEldenThrone, (1105000,"Elden Throne ", MapName::LeyndellAshenCapital, false, false, true)), - - (Region::FracturedMarika, (1900000,"Fractured Marika", MapName::StonePlatform, false, false, true)), - (Region::EldenBeast, (1900001,"Elden Beast", MapName::StonePlatform, false, false, true)), - - (Region::CentralCaelid, (6400001,"Central Caelid", MapName::Caelid, true, false, false)), - (Region::CaelidNorth, (6400000,"Caelid North", MapName::Caelid, true, false, false)), - (Region::ChamberOutsidethePlaza, (6400002,"Chamber Outside the Plaza", MapName::Caelid, false, false, true)), - (Region::RedmaneCastlePlaza, (6400010,"Redmane Castle Plaza", MapName::Caelid, false, false, false)), - (Region::StarscourgeRadahn, (6400040,"Starscourge Radahn", MapName::Caelid, false, false, true)), - (Region::MinorErdtreeCatacombs, (3014001,"Minor Erdtree Catacombs", MapName::Caelid, false, true, false)), - (Region::CaelidCatacombs, (3015001,"Caelid Catacombs", MapName::Caelid, false, true, false)), - (Region::WarDeadCatacombs, (3016001,"War-Dead Catacombs", MapName::Caelid, false, true, false)), - (Region::AbandonedCave, (3120001,"Abandoned Cave", MapName::Caelid, false, true, false)), - (Region::GaolCave, (3121001,"Gaol Cave", MapName::Caelid, false, true, false)), - (Region::GaelTunnel, (3207001,"Gael Tunnel", MapName::Caelid, false, true, false)), - (Region::GaelTunnelPartII, (3207002,"Gael Tunnel Part II", MapName::Caelid, false, true, false)), - (Region::RearGaelTunnelEntrance, (3207090,"Rear Gael Tunnel Entrance", MapName::Caelid, false, true, false)), - (Region::SelliaCrystalTunnel, (3208001,"Sellia Crystal Tunnel", MapName::Caelid, false, true, false)), - (Region::ChairCryptofSellia, (6400020,"Chair-Crypt of Sellia", MapName::Caelid, true, false, false)), - - (Region::SwampofAeonia, (6401000,"Swamp of Aeonia", MapName::SwampOfAeonia, true, false, false)), - - (Region::Dragonbarrow, (6402000,"Dragonbarrow", MapName::GreyollsDragonbarrow, true, false, false)), - (Region::SelliaHideaway, (3111001,"Sellia Hideaway", MapName::GreyollsDragonbarrow, true, false, false)), - (Region::DragonbarrowCave, (3110001,"Dragonbarrow Cave", MapName::GreyollsDragonbarrow, true, false, false)), - (Region::BestialSanctum, (6402001,"Bestial Sanctum", MapName::GreyollsDragonbarrow, true, false, false)), - (Region::DivineTowerofCaelidCenter, (3413003,"Divine Tower of Caelid: Center", MapName::GreyollsDragonbarrow, false, false, false)), - (Region::DivineTowerofCaelidBasemenr, (3413013,"Divine Tower of Caelid: Basement", MapName::GreyollsDragonbarrow, false, false, true)), - (Region::IsolatedDivineTower, (3415090,"Isolated Divine Tower", MapName::GreyollsDragonbarrow, false, false, false)), - - (Region::ForbiddenLands, (6500000,"Forbidden Lands", MapName::ForbiddenLands, true, false, false)), - (Region::GrandLiftofRold, (6500090,"Grand Lift of Rold", MapName::ForbiddenLands, true, false, false)), - (Region::HiddenPathtotheHaligtree, (3020001,"Hidden Path to the Haligtree", MapName::ForbiddenLands, false, true, false)), - (Region::HiddenPathtotheHaligtreePartII, (3020002,"Hidden Path to the Haligtree Part II", MapName::ForbiddenLands, false, true, false)), - (Region::DivineTowerofEastAltus, (3414011,"Divine Tower of East Altus", MapName::ForbiddenLands, false, false, false)), - - (Region::ZamorRuins, (6501000,"Zamor Ruins", MapName::MountaintopsOfTheGiants, true, false, false)), - (Region::CentralMountaintops, (6501001,"Central Mountaintops", MapName::MountaintopsOfTheGiants, true, false, false)), - (Region::CastleSol, (6501002,"Castle Sol", MapName::MountaintopsOfTheGiants, true, false, false)), - (Region::SpiritcallersCave, (3122001,"Spiritcaller's Cave", MapName::MountaintopsOfTheGiants, false, true, false)), - (Region::CastleSolMainGateChurchoftheEclipse, (6501003,"Castle Sol Main Gate, Church of the Eclipse", MapName::MountaintopsOfTheGiants, true, false, false)), - (Region::CastleSolRooftop, (6501010,"Castle Sol Rooftop", MapName::MountaintopsOfTheGiants, true, false, false)), - - (Region::GiantsGravepostFootoftheForge, (6502000,"Giants' Gravepost, Foot of the Forge", MapName::FlamePeak, false, false, true)), - (Region::FireGiant, (6502010,"Fire Giant", MapName::FlamePeak, false, false, true)), - (Region::GiantsMountaintopCatacombs, (3018001,"Giants' Mountaintop Catacombs", MapName::FlamePeak, false, true, false)), - (Region::GiantConqueringHerosGrave, (3017002,"Giant-Conquering Hero's Grave", MapName::FlamePeak, false, true, false)), - - (Region::ConsecratedSnowfield, (6503000,"Consecrated Snowfield", MapName::ConsecratedSnowfield, true, false, false)), - (Region::ConsecratedSnowfieldCatacombs, (3019001,"Consecrated Snowfield Catacombs", MapName::ConsecratedSnowfield, false, true, false)), - (Region::CaveoftheForlorn, (3112001,"Cave of the Forlorn", MapName::ConsecratedSnowfield, false, true, false)), - (Region::YeloughAnixTunnel, (3211001,"Yelough Anix Tunnel", MapName::ConsecratedSnowfield, false, true, false)), - - (Region::HaligtreeCanopy, (1500011,"Haligtree Canopy", MapName::MiquellasHaligtree, false, false, false)), - (Region::HaligtreeTownPlaza, (1500012,"Haligtree Town Plaza", MapName::MiquellasHaligtree, false, false, true)), - (Region::HaligtreePromenade, (1500010,"Haligtree Promenade", MapName::MiquellasHaligtree, false, false, true)), - - (Region::PrayerRoom, (1500001,"Prayer Room", MapName::ElphaelBraceOfTheHaligtree, false, false, false)), - (Region::ElphaelInnerWallDrainageChannel, (1500002,"Elphael Inner Wall, Drainage Channel", MapName::ElphaelBraceOfTheHaligtree, false, false, false)), - (Region::HaligtreeRoots, (1500003,"Haligtree Roots", MapName::ElphaelBraceOfTheHaligtree, false, false, true)), - (Region::MaleniaGoddessofRot, (1500000,"Malenia, Goddess of Rot", MapName::ElphaelBraceOfTheHaligtree, false, false, true)), - - (Region::AinselRiverWellDepths, (1201001,"Ainsel River Well Depths", MapName::AinselRiver, false, false, false)), - (Region::AinselRiverDownstream, (1201002,"Ainsel River Downstream", MapName::AinselRiver, false, false, false)), - (Region::AinselRiverDownstreamPartII, (1201003,"Ainsel River Downstream Part II", MapName::AinselRiver, false, false, false)), - (Region::AstelNaturalbornoftheVoid, (1204000,"Astel, Naturalborn of the Void", MapName::AinselRiver, false, false, true)), - (Region::DragonkinSoldierofNokstella, (1201000,"Dragonkin Soldier of Nokstella", MapName::AinselRiver, false, false, false)), - - (Region::AinselRiverMain, (1201011,"Ainsel River Main", MapName::AinselRiverMain, false, false, false)), - (Region::NokstellaEternalCity, (1201013,"Nokstella, Eternal City", MapName::AinselRiverMain, false, false, false)), - (Region::NokstellaWaterfallBasin, (1201014,"Nokstella Waterfall Basin", MapName::AinselRiverMain, false, false, false)), - - (Region::LakeofRotShoreside, (1201015,"Lake of Rot Shoreside", MapName::LakeOfRot, false, false, false)), - (Region::GrandCloister, (1201016,"Grand Cloister", MapName::LakeOfRot, false, false, false)), - (Region::GrandCloisterPartII, (1201017,"Grand Cloister Part II", MapName::LakeOfRot, false, false, false)), - - (Region::NokronEternalCity, (1207026,"Nokron, Eternal City", MapName::NokronEternalCity, false, false, false)), - (Region::MimicTear, (1202020,"Mimic Tear", MapName::NokronEternalCity, false, false, false)), - (Region::AncestralWoods, (1202002,"Ancestral Woods", MapName::NokronEternalCity, false, false, false)), - (Region::NightsSacredGround, (1202007,"Night's Sacred Ground", MapName::NokronEternalCity, false, false, false)), - (Region::AqueductFacingCliffs, (1202003,"Aqueduct-Facing Cliffs", MapName::NokronEternalCity, false, false, false)), - (Region::AqueductFacingCliffsPartII, (1202004,"Aqueduct-Facing Cliffs Part II", MapName::NokronEternalCity, false, false, true)), - (Region::GreatWaterfallBasin, (1202000,"Great Waterfall Basin", MapName::NokronEternalCity, false, false, true)), - - (Region::PalaceApproachLedgeRoad, (1205001,"Palace Approach Ledge-Road", MapName::MohgwynPalace, false, false, false)), - (Region::DynastyMausoleumEntrance, (1205004,"Dynasty Mausoleum Entrance", MapName::MohgwynPalace, false, false, false)), - (Region::DynastyMausoleumMidpoint, (1205006,"Dynasty Mausoleum Midpoint", MapName::MohgwynPalace, false, false, true)), - (Region::CocoonoftheEmpyrean, (1205000,"Cocoon of the Empyrean", MapName::MohgwynPalace, false, false, true)), - - (Region::SiofraRiverWellDepths, (1207031,"Siofra River Well Depths", MapName::SiofraRiver, false, false, false)), - (Region::SiofraRiverBank, (1202033,"Siofra River Bank", MapName::SiofraRiver, false, false, false)), - (Region::WorshippersWoods, (1202034,"Worshippers' Woods", MapName::SiofraRiver, false, false, false)), - - (Region::RootFacingCliffs, (1203001,"Root-Facing Cliffs", MapName::DeeprootDepths, false, false, false)), - (Region::GreatWaterfallCrestPartII, (1203002,"Great Waterfall Crest Part II", MapName::DeeprootDepths, false, false, false)), - (Region::DeeprootDepths, (1203003,"Deeproot Depths", MapName::DeeprootDepths, false, false, false)), - (Region::TheNamelessEternalCity, (1203004,"The Nameless Eternal City", MapName::DeeprootDepths, false, false, false)), - (Region::AcrosstheRoots, (1203005,"Across the Roots", MapName::DeeprootDepths, false, false, true)), - (Region::PrinceofDeathsThrone, (1203000,"Prince of Death's Throne", MapName::DeeprootDepths, false, false, true)), - - (Region::CrumblingBeastGrave, (1300012,"Crumbling Beast Grave", MapName::CrumblingFarumAzula, false, false, false)), - (Region::CrumblingBeastGraveDepthsTempestFacingBalcony, (1300013,"Crumbling Beast Grave Depths, Tempest-Facing Balcony", MapName::CrumblingFarumAzula, false, false, false)), - (Region::DragonTemple, (1300017,"Dragon Temple", MapName::CrumblingFarumAzula, false, false, true)), - (Region::DragonTempleTransept, (1300018,"Dragon Temple Transept", MapName::CrumblingFarumAzula, false, false, true)), - (Region::DragonTempleAltar, (1300010,"Dragon Temple Altar", MapName::CrumblingFarumAzula, false, false, true)), - (Region::DragonTempleLift, (1300019,"Dragon Temple Lift", MapName::CrumblingFarumAzula, false, false, false)), - (Region::DragonTempleRooftop, (1300003,"Dragon Temple Rooftop", MapName::CrumblingFarumAzula, false, false, false)), - (Region::DragonlordPlacidusax, (1300020,"Dragonlord Placidusax", MapName::CrumblingFarumAzula, false, false, true)), - (Region::BesidetheGreatBridge, (1300006,"Beside the Great Bridge", MapName::CrumblingFarumAzula, false, false, true)), - (Region::MalikeththeBlackBlade, (1300000,"Maliketh, the Black Blade", MapName::CrumblingFarumAzula, false, false, true)), - ])) - }); -} \ No newline at end of file + #[rustfmt::skip] + pub fn regions() -> &'static HashMap { + static REGIONS: OnceLock> = OnceLock::new(); + + REGIONS.get_or_init(|| + HashMap::from([ + ( Region::ChurchofDragonCommunion, ( 6100090, "Church of Dragon Communion", MapName::Limgrave, true, false, false, ), ), + ( Region::TheFirstStepChurchofElleh, ( 6100000, "The First Step, Church of Elleh", MapName::Limgrave, true, false, false, ), ), + ( Region::SeasideRuins, ( 6100001, "Seaside Ruins", MapName::Limgrave, true, false, false, ), ), + ( Region::MistwoodOutskirtsFortHaightWest, ( 6100004, "Mistwood Outskirts, Fort Haight West", MapName::Limgrave, true, false, false, ), ), + ( Region::AgheelLakeNorthMurkwaterCoastGatefrontRuins, ( 6100002, "Agheel Lake North, Murkwater Coast, Gatefront Ruins", MapName::Limgrave, true, false, false, ), ), + ( Region::SummonwaterVillageOutskirts, ( 6100003, "Summonwater Village Outskirts", MapName::Limgrave, true, false, false, ), ), + ( Region::WaypointRuinsCellar, ( 6100010, "Waypoint Ruins Cellar", MapName::Limgrave, true, false, false, ), ), + ( Region::StormfootCatacombs, ( 3002001, "Stormfoot Catacombs", MapName::Limgrave, false, true, false, ), ), + ( Region::MurkwaterCatacombs, ( 3004001, "Murkwater Catacombs", MapName::Limgrave, false, true, false, ), ), + ( Region::GrovesideCave, ( 3103001, "Groveside Cave", MapName::Limgrave, false, true, false, ), ), + ( Region::CoastalCave, ( 3115001, "Coastal Cave", MapName::Limgrave, false, true, false, ), ), + ( Region::MurkwaterCave, ( 3100001, "Murkwater Cave", MapName::Limgrave, false, true, false, ), ), + ( Region::HighroadCave, ( 3117001, "Highroad Cave", MapName::Limgrave, false, true, false, ), ), + ( Region::LimgraveTunnels, ( 3201001, "Limgrave Tunnels", MapName::Limgrave, false, true, false, ), ), + ( Region::CaveofKnowledge, ( 1800090, "Cave of Knowledge", MapName::StrandedGraveyard, false, true, false, ), ), + ( Region::StrandedGraveyard, ( 1800001, "Stranded Graveyard", MapName::StrandedGraveyard, false, true, false, ), ), + ( Region::Stormhill, (6101000, "Stormhill", MapName::Stormhill, true, false, false), ), ( Region::MargittheFellOmen, ( 6101010, "Margit, the Fell Omen", MapName::Stormhill, false, false, true, ), ), + ( Region::DeathtouchedCatacombs, ( 3011001, "Deathtouched Catacombs", MapName::Stormhill, false, true, false, ), ), + ( Region::DivineTowerofLimgrave, ( 3410090, "Divine Tower of Limgrave", MapName::Stormhill, false, false, false, ), ), + ( Region::CastleMorne, ( 6102001, "Castle Morne", MapName::WeepingPeninsula, false, false, true, ), ), + ( Region::MorneMoangrave, ( 6102020, "Morne Moangrave", MapName::WeepingPeninsula, false, false, true, ), ), + ( Region::WeepingPeninsulaEast, ( 6102000, "Weeping Peninsula East", MapName::WeepingPeninsula, true, false, false, ), ), + ( Region::WeepingPeninsulaWest, ( 6102002, "Weeping Peninsula West", MapName::WeepingPeninsula, true, false, false, ), ), + ( Region::ImpalersCatacombs, ( 3001001, "Impaler's Catacombs", MapName::WeepingPeninsula, false, true, false, ), ), + ( Region::TombswardCatacombs, ( 3000001, "Tombsward Catacombs", MapName::WeepingPeninsula, false, true, false, ), ), + ( Region::EarthboreCave, ( 3101001, "Earthbore Cave", MapName::WeepingPeninsula, false, true, false, ), ), + ( Region::TombswardCave, ( 3102001, "Tombsward Cave", MapName::WeepingPeninsula, false, true, false, ), ), + ( Region::MorneTunnel, ( 3200001, "Morne Tunnel", MapName::WeepingPeninsula, false, true, false, ), ), + ( Region::StormveilMainGateStormveilCliffside, ( 1000001, "Stormveil Main Gate, Stormveil Cliffside", MapName::StormveilCastle, false, false, false, ), ), + ( Region::GatesideChamber, ( 1000006, "Gateside Chamber", MapName::StormveilCastle, false, false, false, ), ), + ( Region::RampartTower, ( 1000003, "Rampart Tower", MapName::StormveilCastle, false, false, false, ), ), + ( Region::LiftsideChamberSecludedCell, ( 1000005, "Liftside Chamber, Secluded Cell", MapName::StormveilCastle, false, false, true, ), ), + ( Region::GodricktheGrafted, ( 1000000, "Godrick the Grafted", MapName::StormveilCastle, false, false, true, ), ), + ( Region::LiurniaSouthEast, ( 6200001, "Liurnia South-East", MapName::LiurniaOfTheLakes, true, false, false, ), ), + ( Region::LiurniaEast, ( 6200004, "Liurnia East", MapName::LiurniaOfTheLakes, true, false, false, ), ), + ( Region::BehindCariaManor, ( 6200008, "Behind Caria Manor", MapName::LiurniaOfTheLakes, false, false, false, ), ), + ( Region::SlumberingWolfsShack, ( 3105090, "Slumbering Wolf's Shack", MapName::LiurniaOfTheLakes, false, false, false, ), ), + ( Region::LiurniaSouth, ( 6200000, "Liurnia South", MapName::LiurniaOfTheLakes, true, false, false, ), ), + ( Region::LiurniaSouthWest, ( 6200002, "Liurnia South-West", MapName::LiurniaOfTheLakes, true, false, false, ), ), + ( Region::LiurniaWest, ( 6200005, "Liurnia West", MapName::LiurniaOfTheLakes, true, false, false, ), ), + ( Region::KingsrealmRuins, ( 6200003, "Kingsrealm Ruins", MapName::LiurniaOfTheLakes, true, false, false, ), ), + ( Region::MainCariaManorGate, ( 6200007, "Main Caria Manor Gate", MapName::LiurniaOfTheLakes, true, false, false, ), ), + ( Region::CariaManor, ( 6200007, "Caria Manor", MapName::LiurniaOfTheLakes, false, false, false, ), ), + ( Region::ManorLowerLevel, ( 6200007, "Manor Lower Level", MapName::LiurniaOfTheLakes, false, false, false, ), ), + ( Region::RoyalMoongazingGrounds, ( 6200010, "Royal Moongazing Grounds", MapName::LiurniaOfTheLakes, false, false, false, ), ), + ( Region::TheRavine, ( 6200006, "The Ravine", MapName::LiurniaOfTheLakes, true, false, false, ), ), + ( Region::CliffbottomCatacombs, ( 3006001, "Cliffbottom Catacombs", MapName::LiurniaOfTheLakes, false, true, false, ), ), + ( Region::RoadsEndCatacombs, ( 3003001, "Road's End Catacombs", MapName::LiurniaOfTheLakes, false, true, false, ), ), + ( Region::BlackKnifeCatacombs, ( 3005001, "Black Knife Catacombs", MapName::LiurniaOfTheLakes, false, true, false, ), ), + ( Region::StillwaterCave, ( 3104001, "Stillwater Cave", MapName::LiurniaOfTheLakes, false, true, false, ), ), + ( Region::LakesideCrystalCave, ( 3105001, "Lakeside Crystal Cave", MapName::LiurniaOfTheLakes, false, true, false, ), ), + ( Region::AcademyCrystalCave, ( 3106001, "Academy Crystal Cave", MapName::LiurniaOfTheLakes, false, true, false, ), ), + ( Region::MainAcademyGate, ( 1400011, "Main Academy Gate", MapName::LiurniaOfTheLakes, false, false, false, ), ), + ( Region::RayaLucariaCrystalTunnel, ( 3202001, "Raya Lucaria Crystal Tunnel", MapName::LiurniaOfTheLakes, false, true, false, ), ), + ( Region::DivineTowerofLiurnia, ( 3411090, "Divine Tower of Liurnia", MapName::LiurniaOfTheLakes, false, false, false, ), ), + ( Region::BellumHighway, ( 6201000, "Bellum Highway", MapName::BellumHighway, true, false, false, ), ), + ( Region::GrandLiftofDectusJarburg, ( 6200090, "Grand Lift of Dectus, Jarburg", MapName::BellumHighway, true, false, false, ), ), + ( Region::RuinStrewnPrecipice, ( 3920002, "Ruin-Strewn Precipice", MapName::RuinStrewnPrecipice, false, false, false, ), ), + ( Region::RuinStrewnPrecipiceOverlook, ( 3920003, "Ruin-Strewn Precipice Overlook", MapName::RuinStrewnPrecipice, false, false, true, ), ), + ( Region::MagmaWyrmMakar, ( 3920000, "Magma Wyrm Makar", MapName::RuinStrewnPrecipice, false, false, true, ), ), + ( Region::MoonlightAltar, ( 6202000, "Moonlight Altar", MapName::MoonlightAltar, false, false, false, ), ), + ( Region::ChurchoftheCuckoo, ( 1400013, "Church of the Cuckoo", MapName::AcademyOfRayaLucaria, false, false, false, ), ), + ( Region::SchoolhouseClassroom, ( 1400015, "Schoolhouse Classroom", MapName::AcademyOfRayaLucaria, false, false, false, ), ), + ( Region::DebateParlor, ( 1400010, "Debate Parlor", MapName::AcademyOfRayaLucaria, false, false, false, ), ), + ( Region::RayaLucariaGrandLibrary, ( 1400000, "Raya Lucaria Grand Library", MapName::AcademyOfRayaLucaria, false, false, true, ), ), + ( Region::RampartsidePath, ( 6300005, "Rampartside Path", MapName::AltusPlateau, true, false, false, ), ), + ( Region::StormcallerChurchLuxRuins, ( 6300000, "Stormcaller Church, Lux Ruins", MapName::AltusPlateau, true, false, false, ), ), + ( Region::TheShadedCastle, ( 6300001, "The Shaded Castle", MapName::AltusPlateau, false, false, false, ), ), + ( Region::AltusHighwayJunction, ( 6300002, "Altus Highway Junction", MapName::AltusPlateau, true, false, false, ), ), + ( Region::CastellansHall, ( 6300030, "Castellan's Hall", MapName::AltusPlateau, false, false, false, ), ), + ( Region::ForestSpanningGreatbridge, ( 6300003, "Forest-Spanning Greatbridge", MapName::AltusPlateau, true, false, false, ), ), + ( Region::UnsightlyCatacombs, ( 3012001, "Unsightly Catacombs", MapName::AltusPlateau, false, true, false, ), ), + ( Region::SaintedHerosGrave, ( 3008001, "Sainted Hero's Grave", MapName::AltusPlateau, false, true, false, ), ), + ( Region::SagesCave, ( 3119001, "Sage's Cave", MapName::AltusPlateau, false, true, false, ), ), + ( Region::PerfumersGrotto, ( 3118001, "Perfumer's Grotto", MapName::AltusPlateau, false, true, false, ), ), + ( Region::DominulaWindmillVillageRoadofIniquitySidePath, ( 6300004, "Dominula, Windmill Village, Road of Iniquity Side Path", MapName::AltusPlateau, true, false, false, ), ), + ( Region::OldAltusTunnel, ( 3204001, "Old Altus Tunnel", MapName::AltusPlateau, false, true, false, ), ), + ( Region::AltusTunnel, ( 3205001, "Altus Tunnel", MapName::AltusPlateau, false, true, false, ), ), + ( Region::NinthMtGelmirCampsite, ( 6302000, "Ninth Mt. Gelmir Campsite", MapName::MtGelmir, true, false, false, ), ), + ( Region::RoadofIniquity, ( 6302001, "Road of Iniquity", MapName::MtGelmir, true, false, false, ), ), + ( Region::SeethewaterTerminusPrimevalSorcererAzur, ( 6302002, "Seethewater Terminus, Primeval Sorcerer Azur", MapName::MtGelmir, true, false, false, ), ), + ( Region::WyndhamCatacombs, ( 3007001, "Wyndham Catacombs", MapName::MtGelmir, false, true, false, ), ), + ( Region::GelmirHerosGrave, ( 3009001, "Gelmir Hero's Grave", MapName::MtGelmir, false, true, false, ), ), + ( Region::SeethewaterCave, ( 3107001, "Seethewater Cave", MapName::MtGelmir, false, true, false, ), ), + ( Region::VolcanoCave, ( 3109001, "Volcano Cave", MapName::MtGelmir, false, true, false, ), ), + ( Region::CapitalOutskirts, ( 6301000, "Capital Outskirts", MapName::CapitalOutskirts, true, false, false, ), ), + ( Region::CapitalRampart, ( 6301090, "Capital Rampart", MapName::CapitalOutskirts, true, false, false, ), ), + ( Region::AurizaSideTomb, ( 3013091, "Auriza Side Tomb", MapName::CapitalOutskirts, false, true, false, ), ), + ( Region::AurizaHerosGrave, ( 3010001, "Auriza Hero's Grave", MapName::CapitalOutskirts, false, true, false, ), ), + ( Region::SealedTunnel, ( 3412011, "Sealed Tunnel", MapName::CapitalOutskirts, false, true, false, ), ), + ( Region::DivineTowerofWestAltus, ( 3412090, "Divine Tower of West Altus", MapName::CapitalOutskirts, false, false, false, ), ), + ( Region::VolcanoManor, ( 1600012, "Volcano Manor", MapName::VolcanoManor, false, false, false, ), ), + ( Region::PrisonTownChurch, ( 1600014, "Prison Town Church", MapName::VolcanoManor, false, false, false, ), ), + ( Region::TempleofEiglay, ( 1600010, "Temple of Eiglay", MapName::VolcanoManor, false, false, false, ), ), + ( Region::GuestHall, ( 1600016, "Guest Hall", MapName::VolcanoManor, false, false, false, ), ), + ( Region::AudiencePathway, ( 1600006, "Audience Pathway", MapName::VolcanoManor, false, false, true, ), ), + ( Region::AbductorVirgin, ( 1600020, "Abductor Virgin", MapName::VolcanoManor, false, true, false, ), ), + ( Region::SubterraneanInquisitionChamber, ( 1600022, "Subterranean Inquisition Chamber", MapName::VolcanoManor, false, false, false, ), ), + ( Region::RykardLordofBlasphemy, ( 1600000, "Rykard, Lord of Blasphemy", MapName::VolcanoManor, false, false, true, ), ), + ( Region::ErdtreeSanctuary, ( 1100010, "Erdtree Sanctuary", MapName::LeyndellRoyalCapital, false, false, false, ), ), + ( Region::EastCapitalRampart, ( 1100012, "East Capital Rampart", MapName::LeyndellRoyalCapital, false, false, false, ), ), + ( Region::LowerCapitalChurch, ( 1100015, "Lower Capital Church", MapName::LeyndellRoyalCapital, false, false, false, ), ), + ( Region::AvenueBalcony, ( 1100013, "Avenue Balcony", MapName::LeyndellRoyalCapital, false, false, false, ), ), + ( Region::QueensBedchamber, ( 1100001, "Queen's Bedchamber", MapName::LeyndellRoyalCapital, false, false, true, ), ), + ( Region::WestCapitalRampartFortifiedManorFirstFloor, ( 1100016, "West Capital Rampart, Fortified Manor, First Floor", MapName::LeyndellRoyalCapital, false, false, false, ), ), + ( Region::DivineBridge, ( 1100017, "Divine Bridge", MapName::LeyndellRoyalCapital, false, false, false, ), ), + ( Region::EldenThrone, ( 1100000, "Elden Throne", MapName::LeyndellRoyalCapital, false, false, true, ), ), + ( Region::UndergroundRoadside, ( 3500002, "Underground Roadside", MapName::SubterraneanShunningGrounds, false, false, false, ), ), + ( Region::ForsakenDepths, ( 3500008, "Forsaken Depths", MapName::SubterraneanShunningGrounds, false, false, true, ), ), + ( Region::LeyndellCatacombs, ( 3500010, "Leyndell Catacombs", MapName::SubterraneanShunningGrounds, false, false, false, ), ), + ( Region::LeyndellCatacombsPartII, ( 3500011, "Leyndell Catacombs Part II", MapName::SubterraneanShunningGrounds, false, false, false, ), ), + ( Region::FrenziedFlameProscription, ( 3500092, "Frenzied Flame Proscription", MapName::SubterraneanShunningGrounds, false, false, false, ), ), + ( Region::CathedraloftheForsaken, ( 3500000, "Cathedral of the Forsaken", MapName::SubterraneanShunningGrounds, false, false, false, ), ), + ( Region::LeyndellCapitalofAsh, ( 1105011, "Leyndell, Capital of Ash", MapName::LeyndellAshenCapital, false, false, true, ), ), + ( Region::AshenQueensBedchamber, ( 1105001, "Queen's Bedchamber ", MapName::LeyndellAshenCapital, false, false, true, ), ), + ( Region::AshenDivineBridge, ( 1105092, "Divine Bridge ", MapName::LeyndellAshenCapital, false, false, false, ), ), + ( Region::AshenEldenThrone, ( 1105000, "Elden Throne ", MapName::LeyndellAshenCapital, false, false, true, ), ), + ( Region::FracturedMarika, ( 1900000, "Fractured Marika", MapName::StonePlatform, false, false, true, ), ), + ( Region::EldenBeast, ( 1900001, "Elden Beast", MapName::StonePlatform, false, false, true, ), ), + ( Region::CentralCaelid, ( 6400001, "Central Caelid", MapName::Caelid, true, false, false, ), ), + ( Region::CaelidNorth, (6400000, "Caelid North", MapName::Caelid, true, false, false), ), ( Region::ChamberOutsidethePlaza, ( 6400002, "Chamber Outside the Plaza", MapName::Caelid, false, false, true, ), ), + ( Region::RedmaneCastlePlaza, ( 6400010, "Redmane Castle Plaza", MapName::Caelid, false, false, false, ), ), + ( Region::StarscourgeRadahn, ( 6400040, "Starscourge Radahn", MapName::Caelid, false, false, true, ), ), + ( Region::MinorErdtreeCatacombs, ( 3014001, "Minor Erdtree Catacombs", MapName::Caelid, false, true, false, ), ), + ( Region::CaelidCatacombs, ( 3015001, "Caelid Catacombs", MapName::Caelid, false, true, false, ), ), + ( Region::WarDeadCatacombs, ( 3016001, "War-Dead Catacombs", MapName::Caelid, false, true, false, ), ), + ( Region::AbandonedCave, ( 3120001, "Abandoned Cave", MapName::Caelid, false, true, false, ), ), + ( Region::GaolCave, (3121001, "Gaol Cave", MapName::Caelid, false, true, false), ), ( Region::GaelTunnel, (3207001, "Gael Tunnel", MapName::Caelid, false, true, false), ), + ( Region::GaelTunnelPartII, ( 3207002, "Gael Tunnel Part II", MapName::Caelid, false, true, false, ), ), + ( Region::RearGaelTunnelEntrance, ( 3207090, "Rear Gael Tunnel Entrance", MapName::Caelid, false, true, false, ), ), + ( Region::SelliaCrystalTunnel, ( 3208001, "Sellia Crystal Tunnel", MapName::Caelid, false, true, false, ), ), + ( Region::ChairCryptofSellia, ( 6400020, "Chair-Crypt of Sellia", MapName::Caelid, true, false, false, ), ), + ( Region::SwampofAeonia, ( 6401000, "Swamp of Aeonia", MapName::SwampOfAeonia, true, false, false, ), ), + ( Region::Dragonbarrow, ( 6402000, "Dragonbarrow", MapName::GreyollsDragonbarrow, true, false, false, ), ), + ( Region::SelliaHideaway, ( 3111001, "Sellia Hideaway", MapName::GreyollsDragonbarrow, true, false, false, ), ), + ( Region::DragonbarrowCave, ( 3110001, "Dragonbarrow Cave", MapName::GreyollsDragonbarrow, true, false, false, ), ), + ( Region::BestialSanctum, ( 6402001, "Bestial Sanctum", MapName::GreyollsDragonbarrow, true, false, false, ), ), + ( Region::DivineTowerofCaelidCenter, ( 3413003, "Divine Tower of Caelid: Center", MapName::GreyollsDragonbarrow, false, false, false, ), ), + ( Region::DivineTowerofCaelidBasemenr, ( 3413013, "Divine Tower of Caelid: Basement", MapName::GreyollsDragonbarrow, false, false, true, ), ), + ( Region::IsolatedDivineTower, ( 3415090, "Isolated Divine Tower", MapName::GreyollsDragonbarrow, false, false, false, ), ), + ( Region::ForbiddenLands, ( 6500000, "Forbidden Lands", MapName::ForbiddenLands, true, false, false, ), ), + ( Region::GrandLiftofRold, ( 6500090, "Grand Lift of Rold", MapName::ForbiddenLands, true, false, false, ), ), + ( Region::HiddenPathtotheHaligtree, ( 3020001, "Hidden Path to the Haligtree", MapName::ForbiddenLands, false, true, false, ), ), + ( Region::HiddenPathtotheHaligtreePartII, ( 3020002, "Hidden Path to the Haligtree Part II", MapName::ForbiddenLands, false, true, false, ), ), + ( Region::DivineTowerofEastAltus, ( 3414011, "Divine Tower of East Altus", MapName::ForbiddenLands, false, false, false, ), ), + ( Region::ZamorRuins, ( 6501000, "Zamor Ruins", MapName::MountaintopsOfTheGiants, true, false, false, ), ), + ( Region::CentralMountaintops, ( 6501001, "Central Mountaintops", MapName::MountaintopsOfTheGiants, true, false, false, ), ), + ( Region::CastleSol, ( 6501002, "Castle Sol", MapName::MountaintopsOfTheGiants, true, false, false, ), ), + ( Region::SpiritcallersCave, ( 3122001, "Spiritcaller's Cave", MapName::MountaintopsOfTheGiants, false, true, false, ), ), + ( Region::CastleSolMainGateChurchoftheEclipse, ( 6501003, "Castle Sol Main Gate, Church of the Eclipse", MapName::MountaintopsOfTheGiants, true, false, false, ), ), + ( Region::CastleSolRooftop, ( 6501010, "Castle Sol Rooftop", MapName::MountaintopsOfTheGiants, true, false, false, ), ), + ( Region::GiantsGravepostFootoftheForge, ( 6502000, "Giants' Gravepost, Foot of the Forge", MapName::FlamePeak, false, false, true, ), ), + ( Region::FireGiant, ( 6502010, "Fire Giant", MapName::FlamePeak, false, false, true, ), ), + ( Region::GiantsMountaintopCatacombs, ( 3018001, "Giants' Mountaintop Catacombs", MapName::FlamePeak, false, true, false, ), ), + ( Region::GiantConqueringHerosGrave, ( 3017002, "Giant-Conquering Hero's Grave", MapName::FlamePeak, false, true, false, ), ), + ( Region::ConsecratedSnowfield, ( 6503000, "Consecrated Snowfield", MapName::ConsecratedSnowfield, true, false, false, ), ), + ( Region::ConsecratedSnowfieldCatacombs, ( 3019001, "Consecrated Snowfield Catacombs", MapName::ConsecratedSnowfield, false, true, false, ), ), + ( Region::CaveoftheForlorn, ( 3112001, "Cave of the Forlorn", MapName::ConsecratedSnowfield, false, true, false, ), ), + ( Region::YeloughAnixTunnel, ( 3211001, "Yelough Anix Tunnel", MapName::ConsecratedSnowfield, false, true, false, ), ), + ( Region::HaligtreeCanopy, ( 1500011, "Haligtree Canopy", MapName::MiquellasHaligtree, false, false, false, ), ), + ( Region::HaligtreeTownPlaza, ( 1500012, "Haligtree Town Plaza", MapName::MiquellasHaligtree, false, false, true, ), ), + ( Region::HaligtreePromenade, ( 1500010, "Haligtree Promenade", MapName::MiquellasHaligtree, false, false, true, ), ), + ( Region::PrayerRoom, ( 1500001, "Prayer Room", MapName::ElphaelBraceOfTheHaligtree, false, false, false, ), ), + ( Region::ElphaelInnerWallDrainageChannel, ( 1500002, "Elphael Inner Wall, Drainage Channel", MapName::ElphaelBraceOfTheHaligtree, false, false, false, ), ), + ( Region::HaligtreeRoots, ( 1500003, "Haligtree Roots", MapName::ElphaelBraceOfTheHaligtree, false, false, true, ), ), + ( Region::MaleniaGoddessofRot, ( 1500000, "Malenia, Goddess of Rot", MapName::ElphaelBraceOfTheHaligtree, false, false, true, ), ), + ( Region::AinselRiverWellDepths, ( 1201001, "Ainsel River Well Depths", MapName::AinselRiver, false, false, false, ), ), + ( Region::AinselRiverDownstream, ( 1201002, "Ainsel River Downstream", MapName::AinselRiver, false, false, false, ), ), + ( Region::AinselRiverDownstreamPartII, ( 1201003, "Ainsel River Downstream Part II", MapName::AinselRiver, false, false, false, ), ), + ( Region::AstelNaturalbornoftheVoid, ( 1204000, "Astel, Naturalborn of the Void", MapName::AinselRiver, false, false, true, ), ), + ( Region::DragonkinSoldierofNokstella, ( 1201000, "Dragonkin Soldier of Nokstella", MapName::AinselRiver, false, false, false, ), ), + ( Region::AinselRiverMain, ( 1201011, "Ainsel River Main", MapName::AinselRiverMain, false, false, false, ), ), + ( Region::NokstellaEternalCity, ( 1201013, "Nokstella, Eternal City", MapName::AinselRiverMain, false, false, false, ), ), + ( Region::NokstellaWaterfallBasin, ( 1201014, "Nokstella Waterfall Basin", MapName::AinselRiverMain, false, false, false, ), ), + ( Region::LakeofRotShoreside, ( 1201015, "Lake of Rot Shoreside", MapName::LakeOfRot, false, false, false, ), ), + ( Region::GrandCloister, ( 1201016, "Grand Cloister", MapName::LakeOfRot, false, false, false, ), ), + ( Region::GrandCloisterPartII, ( 1201017, "Grand Cloister Part II", MapName::LakeOfRot, false, false, false, ), ), + ( Region::NokronEternalCity, ( 1207026, "Nokron, Eternal City", MapName::NokronEternalCity, false, false, false, ), ), + ( Region::MimicTear, ( 1202020, "Mimic Tear", MapName::NokronEternalCity, false, false, false, ), ), + ( Region::AncestralWoods, ( 1202002, "Ancestral Woods", MapName::NokronEternalCity, false, false, false, ), ), + ( Region::NightsSacredGround, ( 1202007, "Night's Sacred Ground", MapName::NokronEternalCity, false, false, false, ), ), + ( Region::AqueductFacingCliffs, ( 1202003, "Aqueduct-Facing Cliffs", MapName::NokronEternalCity, false, false, false, ), ), + ( Region::AqueductFacingCliffsPartII, ( 1202004, "Aqueduct-Facing Cliffs Part II", MapName::NokronEternalCity, false, false, true, ), ), + ( Region::GreatWaterfallBasin, ( 1202000, "Great Waterfall Basin", MapName::NokronEternalCity, false, false, true, ), ), + ( Region::PalaceApproachLedgeRoad, ( 1205001, "Palace Approach Ledge-Road", MapName::MohgwynPalace, false, false, false, ), ), + ( Region::DynastyMausoleumEntrance, ( 1205004, "Dynasty Mausoleum Entrance", MapName::MohgwynPalace, false, false, false, ), ), + ( Region::DynastyMausoleumMidpoint, ( 1205006, "Dynasty Mausoleum Midpoint", MapName::MohgwynPalace, false, false, true, ), ), + ( Region::CocoonoftheEmpyrean, ( 1205000, "Cocoon of the Empyrean", MapName::MohgwynPalace, false, false, true, ), ), + ( Region::SiofraRiverWellDepths, ( 1207031, "Siofra River Well Depths", MapName::SiofraRiver, false, false, false, ), ), + ( Region::SiofraRiverBank, ( 1202033, "Siofra River Bank", MapName::SiofraRiver, false, false, false, ), ), + ( Region::WorshippersWoods, ( 1202034, "Worshippers' Woods", MapName::SiofraRiver, false, false, false, ), ), + ( Region::RootFacingCliffs, ( 1203001, "Root-Facing Cliffs", MapName::DeeprootDepths, false, false, false, ), ), + ( Region::GreatWaterfallCrestPartII, ( 1203002, "Great Waterfall Crest Part II", MapName::DeeprootDepths, false, false, false, ), ), + ( Region::DeeprootDepths, ( 1203003, "Deeproot Depths", MapName::DeeprootDepths, false, false, false, ), ), + ( Region::TheNamelessEternalCity, ( 1203004, "The Nameless Eternal City", MapName::DeeprootDepths, false, false, false, ), ), + ( Region::AcrosstheRoots, ( 1203005, "Across the Roots", MapName::DeeprootDepths, false, false, true, ), ), + ( Region::PrinceofDeathsThrone, ( 1203000, "Prince of Death's Throne", MapName::DeeprootDepths, false, false, true, ), ), + ( Region::CrumblingBeastGrave, ( 1300012, "Crumbling Beast Grave", MapName::CrumblingFarumAzula, false, false, false, ), ), + ( Region::CrumblingBeastGraveDepthsTempestFacingBalcony, ( 1300013, "Crumbling Beast Grave Depths, Tempest-Facing Balcony", MapName::CrumblingFarumAzula, false, false, false, ), ), + ( Region::DragonTemple, ( 1300017, "Dragon Temple", MapName::CrumblingFarumAzula, false, false, true, ), ), + ( Region::DragonTempleTransept, ( 1300018, "Dragon Temple Transept", MapName::CrumblingFarumAzula, false, false, true, ), ), + ( Region::DragonTempleAltar, ( 1300010, "Dragon Temple Altar", MapName::CrumblingFarumAzula, false, false, true, ), ), + ( Region::DragonTempleLift, ( 1300019, "Dragon Temple Lift", MapName::CrumblingFarumAzula, false, false, false, ), ), + ( Region::DragonTempleRooftop, ( 1300003, "Dragon Temple Rooftop", MapName::CrumblingFarumAzula, false, false, false, ), ), + ( Region::DragonlordPlacidusax, ( 1300020, "Dragonlord Placidusax", MapName::CrumblingFarumAzula, false, false, true, ), ), + ( Region::BesidetheGreatBridge, ( 1300006, "Beside the Great Bridge", MapName::CrumblingFarumAzula, false, false, true, ), ), + ( Region::MalikeththeBlackBlade, ( 1300000, "Maliketh, the Black Blade", MapName::CrumblingFarumAzula, false, false, true, ), ), + + // DLC + ( Region::BeluratTheatreoftheDivineBeast, (2000000, "Belurat: Theatre of the Divine Beast", MapName::RealmofShadow, false, false, true) ), + ( Region::BeluratBeluratTowerSettlement, (2000001, "Belurat: Belurat, Tower Settlement", MapName::RealmofShadow, false, false, false) ), + ( Region::BeluratStagefront, (2000002, "Belurat: Stagefront", MapName::RealmofShadow, false, false, false) ), + ( Region::EnirIlimGateofDivinity, (2001000, "Enir-Ilim: Gate of Divinity", MapName::RealmofShadow, false, false, true) ), + ( Region::EnirIlimOuterWall, (2001001, "Enir-Ilim: Outer Wall", MapName::RealmofShadow, false, false, false) ), + ( Region::EnirIlimSpiralRise, (2001004, "Enir-Ilim: Spiral Rise", MapName::RealmofShadow, false, false, false) ), + ( Region::EnirIlimCleansingChamberAnteroom, (2001005, "Enir-Ilim: Cleansing Chamber Anteroom", MapName::RealmofShadow, false, false, false) ), + ( Region::EnirIlimDivineGateFrontStaircase, (2001007, "Enir-Ilim: Divine Gate Front Staircase", MapName::RealmofShadow, false, false, false) ), + ( Region::ShadowKeepMainGate, (6900000, "Shadow Keep: Main Gate", MapName::RealmofShadow, false, false, false) ), + ( Region::ShadowKeepMainGatePlaza, (6900010, "Shadow Keep: Main Gate Plaza", MapName::RealmofShadow, false, false, false) ), + ( Region::ShadowKeepChurchDistrictEntrance, (2100011, "Shadow Keep: Church District Entrance", MapName::RealmofShadow, false, false, true) ), + ( Region::ShadowKeepSunkenChapel, (2100014, "Shadow Keep: Sunken Chapel", MapName::RealmofShadow, false, false, false) ), + ( Region::ShadowKeepTreeWorshipSanctum, (2100015, "Shadow Keep: Tree-Worship Sanctum", MapName::RealmofShadow, false, false, false) ), + ( Region::StorehouseMessmersDarkChamber, (2101000, "Storehouse: Messmer's Dark Chamber", MapName::RealmofShadow, false, false, true) ), + ( Region::StorehouseFirstFloor, (2101001, "Storehouse: First Floor", MapName::RealmofShadow, false, false, false) ), + ( Region::StorehouseFourthFloor, (2101003, "Storehouse: Fourth Floor", MapName::RealmofShadow, false, false, false) ), + ( Region::StorehouseSeventhFloor, (2101004, "Storehouse: Seventh Floor", MapName::RealmofShadow, false, false, false) ), + ( Region::StorehouseDarkChamberEntrance, (2101006, "Storehouse: Dark Chamber Entrance", MapName::RealmofShadow, false, false, false) ), + ( Region::StorehouseBackSection, (2101011, "Storehouse: Back Section", MapName::RealmofShadow, false, false, false) ), + ( Region::StorehouseLoft, (2101012, "Storehouse: Loft", MapName::RealmofShadow, false, false, false) ), + ( Region::StorehouseWestRampart, (2102001, "Storehouse: West Rampart", MapName::RealmofShadow, false, false, false) ), + ( Region::StoneCoffinFissureGardenofDeepPurple, (2200000, "Stone Coffin Fissure: Garden of Deep Purple", MapName::RealmofShadow, false, false, true) ), + ( Region::StoneCoffinFissureStoneCoffinFissure, (2200001, "Stone Coffin Fissure: Stone Coffin Fissure", MapName::RealmofShadow, true, false, false) ), + ( Region::StoneCoffinFissureFissureCross, (2200002, "Stone Coffin Fissure: Fissure Cross", MapName::RealmofShadow, true, false, false) ), + ( Region::StoneCoffinFissureFissureWaypointDepths, (2200004, "Stone Coffin Fissure: Fissure Waypoint & Depths", MapName::RealmofShadow, true, false, false) ), + ( Region::MidrasManseDiscussionChamber, (6860010, "Midra's Manse: Discussion Chamber", MapName::RealmofShadow, false, false, true) ), + ( Region::MidrasManseManseHall, (6860001, "Midra's Manse: Manse Hall", MapName::RealmofShadow, false, false, false) ), + ( Region::MidrasManseMidrasLibrary, (6860004, "Midra's Manse: Midra's Library", MapName::RealmofShadow, false, false, false) ), + ( Region::GravesitePlainFogRiftCatacombs, (4000001, "Gravesite Plain: Fog Rift Catacombs", MapName::RealmofShadow, false, true, false) ), + ( Region::GravesitePlainRuinedForgeLavaIntake, (4200090, "Gravesite Plain: Ruined Forge Lava Intake", MapName::RealmofShadow, false, true, false) ), + ( Region::GravesitePlainRivermouthCave, (4300001, "Gravesite Plain: Rivermouth Cave", MapName::RealmofShadow, false, true, false) ), + ( Region::GravesitePlainDragonsPit, (4200090, "Gravesite Plain: Dragon's Pit", MapName::RealmofShadow, false, true, false) ), + ( Region::GravesitePlainDragonsPitTerminus, (4301090, "Gravesite Plain: Dragon's Pit Terminus", MapName::RealmofShadow, false, false, false) ), + ( Region::GravesitePlainGravesitePlain, (6800000, "Gravesite Plain: Gravesite Plain", MapName::RealmofShadow, true, false, false) ), + ( Region::GravesitePlainEllacRiverCave, (6810001, "Gravesite Plain: Ellac River Cave", MapName::RealmofShadow, true, false, false) ), + ( Region::GravesitePlainPillarPath, (6810000, "Gravesite Plain: Pillar Path", MapName::RealmofShadow, true, false, false) ), + ( Region::GravesitePlainBeluratGaol, (4100001, "Gravesite Plain: Belurat Gaol", MapName::RealmofShadow, false, true, false) ), + ( Region::GravesitePlainEllacRiverDownstream, (6810090, "Gravesite Plain: Ellac River Downstream", MapName::RealmofShadow, true, false, false) ), + ( Region::CharosHiddenGraveCharosHiddenGrave, (6840000, "Charo's Hidden Grave: Charo's Hidden Grave", MapName::RealmofShadow, true, false, false) ), + ( Region::CharosHiddenGraveLamentersGaol, (4102001, "Charo's Hidden Grave: Lamenter's Gaol", MapName::RealmofShadow, false, true, false) ), + ( Region::CastleEnsisCastleEnsis, (6820000, "Castle Ensis: Castle Ensis", MapName::RealmofShadow, false, false, false) ), + ( Region::CastleEnsisEnsisMoongazingGrounds, (6820010, "Castle Ensis: Ensis Moongazing Grounds", MapName::RealmofShadow, false, false, true) ), + ( Region::CeruleanCoastCeruleanCoast, (6830000, "Cerulean Coast: Cerulean Coast", MapName::RealmofShadow, true, false, false) ), + ( Region::CeruleanCoastTheFissure, (6830002, "Cerulean Coast: The Fissure", MapName::RealmofShadow, true, false, false) ), + ( Region::AbyssalWoodsAbyssalWoods, (6860000, "Abyssal Woods: Abyssal Woods", MapName::RealmofShadow, true, false, false) ), + ( Region::AbyssalWoodsForsakenGraveyard, (4002000, "Abyssal Woods: Forsaken Graveyard", MapName::RealmofShadow, false, false, true) ), + ( Region::FootoftheJaggedPeak, (6841000, "Foot of the Jagged Peak", MapName::RealmofShadow, true, false, false) ), + ( Region::JaggedPeakMountainside, (6850000, "Jagged Peak: Mountainside", MapName::RealmofShadow, true, false, false) ), + ( Region::JaggedPeakSummit, (6850001, "Jagged Peak: Summit", MapName::RealmofShadow, true, false, false) ), + ( Region::JaggedPeakRestoftheDreadDragon, (6850010, "Jagged Peak: Rest of the Dread Dragon", MapName::RealmofShadow, false, false, true) ), + ( Region::AncientRuinsofRauhWest, (6941000, "Ancient Ruins of Rauh: West", MapName::RealmofShadow, true, false, false) ), + ( Region::AncientRuinsofRauhChurchoftheBud, (6941010, "Ancient Ruins of Rauh: Church of the Bud", MapName::RealmofShadow, false, false, true) ), + ( Region::AncientRuinsofRauhEast, (6940000, "Ancient Ruins of Rauh: East", MapName::RealmofShadow, true, false, false) ), + ( Region::RauhBaseAncientRuins, (6901000, "Rauh Base: Ancient Ruins", MapName::RealmofShadow, true, false, false) ), + ( Region::RauhBaseScorpionRiverCatacombs, (4001001, "Rauh Base: Scorpion River Catacombs", MapName::RealmofShadow, false, true, false) ), + ( Region::RauhBaseTaylewsRuinedForge, (4203090, "Rauh Base: Taylew's Ruined Forge", MapName::RealmofShadow, false, true, false) ), + ( Region::ScaduAltusFingerBirthingGrounds, (2500000, "Scadu Altus: Finger Birthing Grounds", MapName::RealmofShadow, false, false, true) ), + ( Region::ScaduAltusScaduAltus, (6900000, "Scadu Altus: Scadu Altus", MapName::RealmofShadow, true, false, false) ), + ( Region::ScaduAltusBonnyVillage, (6902000, "Scadu Altus: Bonny Village", MapName::RealmofShadow, true, false, false) ), + ( Region::ScaduAltusCastleWateringHole, (6903090, "Scadu Altus: Castle Watering Hole", MapName::RealmofShadow, true, false, false) ), + ( Region::ScaduAltusReclusesRiverDownstream, (6903000, "Scadu Altus: Recluses' River Downstream", MapName::RealmofShadow, true, false, false) ), + ( Region::ScaduAltusDarklightCatacombs, (4002001, "Scadu Altus: Darklight Catacombs", MapName::RealmofShadow, false, true, false) ), + ( Region::ScaduAltusBonnyGaol, (4101001, "Scadu Altus: Bonny Gaol", MapName::RealmofShadow, false, true, false) ), + ( Region::ScaduAltusRuinedForgeofStarfallPast, (4202090, "Scadu Altus: Ruined Forge of Starfall Past", MapName::RealmofShadow, false, true, false) ), + ( Region::ScaduviewScadutreeBase, (2100010, "Scaduview: Scadutree Base", MapName::RealmofShadow, false, false, true) ), + ( Region::ScaduviewScaduview, (2101010, "Scaduview: Scaduview", MapName::RealmofShadow, false, false, true) ), + ( Region::ScaduviewShadowKeepBackGate, (2101013, "Scaduview: Shadow Keep, Back Gate", MapName::RealmofShadow, false, false, true) ), + ( Region::ScaduviewHinterland, (6930000, "Scaduview: Hinterland", MapName::RealmofShadow, true, false, false) ), + ]) + ) + } +} diff --git a/src/db/stats.rs b/src/db/stats.rs index ef4e868..5393ea5 100644 --- a/src/db/stats.rs +++ b/src/db/stats.rs @@ -1,2390 +1,2387 @@ -pub mod stats { +pub const HP: [f32; 793] = [ + 300., + 300., + 304.2525864, + 312.0281306, + 322.0970869, + 334.0206909, + 347.5453609, + 362.5, + 378.7590015, + 396.2250449, + 414.8198317, + 434.4785884, + 455.1465668, + 476.7766953, + 499.3279362, + 522.7640963, + 547.0529422, + 572.165527, + 598.0756666, + 624.7595264, + 652.1952896, + 680.3628872, + 709.2437767, + 738.8207577, + 769.0778175, + 800., + 833.0531568, + 870.8509938, + 910.6741857, + 951.8724323, + 994.1243279, + 1037.235314, + 1081.074086, + 1125.545691, + 1170.57808, + 1216.114613, + 1262.109527, + 1308.525037, + 1355.329389, + 1402.495504, + 1450., + 1476.863159, + 1503.444915, + 1529.732818, + 1555.713104, + 1581.370469, + 1606.687782, + 1631.645716, + 1656.222284, + 1680.392216, + 1704.12613, + 1727.389379, + 1750.140429, + 1772.328446, + 1793.88959, + 1814.740949, + 1834.769835, + 1853.812763, + 1871.606923, + 1887.641196, + 1900., + 1906.137958, + 1912.243693, + 1918.316509, + 1924.355677, + 1930.360429, + 1936.329959, + 1942.263414, + 1948.159895, + 1954.018451, + 1959.838073, + 1965.617691, + 1971.356166, + 1977.052281, + 1982.704738, + 1988.312146, + 1993.873007, + 1999.385709, + 2004.848507, + 2010.259508, + 2015.616648, + 2020.91767, + 2026.160091, + 2031.341165, + 2036.457842, + 2041.506705, + 2046.483899, + 2051.385039, + 2056.205087, + 2060.938183, + 2065.577418, + 2070.114507, + 2074.539315, + 2078.83911, + 2082.997357, + 2086.991584, + 2090.789188, + 2094.337758, + 2097.535366, + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., + 2100., +]; - pub const HP: [f32; 793] = [ - 300., - 300., - 304.2525864, - 312.0281306, - 322.0970869, - 334.0206909, - 347.5453609, - 362.5, - 378.7590015, - 396.2250449, - 414.8198317, - 434.4785884, - 455.1465668, - 476.7766953, - 499.3279362, - 522.7640963, - 547.0529422, - 572.165527, - 598.0756666, - 624.7595264, - 652.1952896, - 680.3628872, - 709.2437767, - 738.8207577, - 769.0778175, - 800., - 833.0531568, - 870.8509938, - 910.6741857, - 951.8724323, - 994.1243279, - 1037.235314, - 1081.074086, - 1125.545691, - 1170.57808, - 1216.114613, - 1262.109527, - 1308.525037, - 1355.329389, - 1402.495504, - 1450., - 1476.863159, - 1503.444915, - 1529.732818, - 1555.713104, - 1581.370469, - 1606.687782, - 1631.645716, - 1656.222284, - 1680.392216, - 1704.12613, - 1727.389379, - 1750.140429, - 1772.328446, - 1793.88959, - 1814.740949, - 1834.769835, - 1853.812763, - 1871.606923, - 1887.641196, - 1900., - 1906.137958, - 1912.243693, - 1918.316509, - 1924.355677, - 1930.360429, - 1936.329959, - 1942.263414, - 1948.159895, - 1954.018451, - 1959.838073, - 1965.617691, - 1971.356166, - 1977.052281, - 1982.704738, - 1988.312146, - 1993.873007, - 1999.385709, - 2004.848507, - 2010.259508, - 2015.616648, - 2020.91767, - 2026.160091, - 2031.341165, - 2036.457842, - 2041.506705, - 2046.483899, - 2051.385039, - 2056.205087, - 2060.938183, - 2065.577418, - 2070.114507, - 2074.539315, - 2078.83911, - 2082.997357, - 2086.991584, - 2090.789188, - 2094.337758, - 2097.535366, - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - 2100., - ]; +pub const FP: [f32; 793] = [ + 50., + 50., + 53.21428571, + 56.42857143, + 59.64285714, + 62.85714286, + 66.07142857, + 69.28571429, + 72.5, + 75.71428571, + 78.92857143, + 82.14285714, + 85.35714286, + 88.57142857, + 91.78571429, + 95., + 100.25, + 105.5, + 110.75, + 116., + 121.25, + 126.5, + 131.75, + 137., + 142.25, + 147.5, + 152.75, + 158., + 163.25, + 168.5, + 173.75, + 179., + 184.25, + 189.5, + 194.75, + 200., + 207.1708874, + 214.2822503, + 221.3320259, + 228.3179833, + 235.2377012, + 242.0885411, + 248.8676153, + 255.5717489, + 262.1974319, + 268.7407613, + 275.197368, + 281.5623233, + 287.8300198, + 293.9940132, + 300.0468097, + 305.9795742, + 311.7817137, + 317.4402643, + 322.9389453, + 328.2566118, + 333.3645252, + 338.2209922, + 342.7589893, + 346.8481671, + 350., + 352.5641026, + 355.1282051, + 357.6923077, + 360.2564103, + 362.8205128, + 365.3846154, + 367.9487179, + 370.5128205, + 373.0769231, + 375.6410256, + 378.2051282, + 380.7692308, + 383.3333333, + 385.8974359, + 388.4615385, + 391.025641, + 393.5897436, + 396.1538462, + 398.7179487, + 401.2820513, + 403.8461538, + 406.4102564, + 408.974359, + 411.5384615, + 414.1025641, + 416.6666667, + 419.2307692, + 421.7948718, + 424.3589744, + 426.9230769, + 429.4871795, + 432.0512821, + 434.6153846, + 437.1794872, + 439.7435897, + 442.3076923, + 444.8717949, + 447.4358974, + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., + 450., +]; - pub const FP: [f32; 793] = [ - 50., - 50., - 53.21428571, - 56.42857143, - 59.64285714, - 62.85714286, - 66.07142857, - 69.28571429, - 72.5, - 75.71428571, - 78.92857143, - 82.14285714, - 85.35714286, - 88.57142857, - 91.78571429, - 95., - 100.25, - 105.5, - 110.75, - 116., - 121.25, - 126.5, - 131.75, - 137., - 142.25, - 147.5, - 152.75, - 158., - 163.25, - 168.5, - 173.75, - 179., - 184.25, - 189.5, - 194.75, - 200., - 207.1708874, - 214.2822503, - 221.3320259, - 228.3179833, - 235.2377012, - 242.0885411, - 248.8676153, - 255.5717489, - 262.1974319, - 268.7407613, - 275.197368, - 281.5623233, - 287.8300198, - 293.9940132, - 300.0468097, - 305.9795742, - 311.7817137, - 317.4402643, - 322.9389453, - 328.2566118, - 333.3645252, - 338.2209922, - 342.7589893, - 346.8481671, - 350., - 352.5641026, - 355.1282051, - 357.6923077, - 360.2564103, - 362.8205128, - 365.3846154, - 367.9487179, - 370.5128205, - 373.0769231, - 375.6410256, - 378.2051282, - 380.7692308, - 383.3333333, - 385.8974359, - 388.4615385, - 391.025641, - 393.5897436, - 396.1538462, - 398.7179487, - 401.2820513, - 403.8461538, - 406.4102564, - 408.974359, - 411.5384615, - 414.1025641, - 416.6666667, - 419.2307692, - 421.7948718, - 424.3589744, - 426.9230769, - 429.4871795, - 432.0512821, - 434.6153846, - 437.1794872, - 439.7435897, - 442.3076923, - 444.8717949, - 447.4358974, - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - 450., - ]; - - pub const SP: [f32; 793] = [ - 80., - 80., - 81.78571429, - 83.57142857, - 85.35714286, - 87.14285714, - 88.92857143, - 90.71428571, - 92.5, - 94.28571429, - 96.07142857, - 97.85714286, - 99.64285714, - 101.4285714, - 103.2142857, - 105., - 106.6666667, - 108.3333333, - 110., - 111.6666667, - 113.3333333, - 115., - 116.6666667, - 118.3333333, - 120., - 121.6666667, - 123.3333333, - 125., - 126.6666667, - 128.3333333, - 130., - 131.25, - 132.5, - 133.75, - 135., - 136.25, - 137.5, - 138.75, - 140., - 141.25, - 142.5, - 143.75, - 145., - 146.25, - 147.5, - 148.75, - 150., - 151.25, - 152.5, - 153.75, - 155., - 155.3061224, - 155.6122449, - 155.9183673, - 156.2244898, - 156.5306122, - 156.8367347, - 157.1428571, - 157.4489796, - 157.755102, - 158.0612245, - 158.3673469, - 158.6734694, - 158.9795918, - 159.2857143, - 159.5918367, - 159.8979592, - 160.2040816, - 160.5102041, - 160.8163265, - 161.122449, - 161.4285714, - 161.7346939, - 162.0408163, - 162.3469388, - 162.6530612, - 162.9591837, - 163.2653061, - 163.5714286, - 163.877551, - 164.1836735, - 164.4897959, - 164.7959184, - 165.1020408, - 165.4081633, - 165.7142857, - 166.0204082, - 166.3265306, - 166.6326531, - 166.9387755, - 167.244898, - 167.5510204, - 167.8571429, - 168.1632653, - 168.4693878, - 168.7755102, - 169.0816327, - 169.3877551, - 169.6938776, - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - 170., - ]; -} \ No newline at end of file +pub const SP: [f32; 793] = [ + 80., + 80., + 81.78571429, + 83.57142857, + 85.35714286, + 87.14285714, + 88.92857143, + 90.71428571, + 92.5, + 94.28571429, + 96.07142857, + 97.85714286, + 99.64285714, + 101.4285714, + 103.2142857, + 105., + 106.6666667, + 108.3333333, + 110., + 111.6666667, + 113.3333333, + 115., + 116.6666667, + 118.3333333, + 120., + 121.6666667, + 123.3333333, + 125., + 126.6666667, + 128.3333333, + 130., + 131.25, + 132.5, + 133.75, + 135., + 136.25, + 137.5, + 138.75, + 140., + 141.25, + 142.5, + 143.75, + 145., + 146.25, + 147.5, + 148.75, + 150., + 151.25, + 152.5, + 153.75, + 155., + 155.3061224, + 155.6122449, + 155.9183673, + 156.2244898, + 156.5306122, + 156.8367347, + 157.1428571, + 157.4489796, + 157.755102, + 158.0612245, + 158.3673469, + 158.6734694, + 158.9795918, + 159.2857143, + 159.5918367, + 159.8979592, + 160.2040816, + 160.5102041, + 160.8163265, + 161.122449, + 161.4285714, + 161.7346939, + 162.0408163, + 162.3469388, + 162.6530612, + 162.9591837, + 163.2653061, + 163.5714286, + 163.877551, + 164.1836735, + 164.4897959, + 164.7959184, + 165.1020408, + 165.4081633, + 165.7142857, + 166.0204082, + 166.3265306, + 166.6326531, + 166.9387755, + 167.244898, + 167.5510204, + 167.8571429, + 168.1632653, + 168.4693878, + 168.7755102, + 169.0816327, + 169.3877551, + 169.6938776, + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., + 170., +]; diff --git a/src/db/summoning_pools.rs b/src/db/summoning_pools.rs index c58672d..7e9ccdf 100644 --- a/src/db/summoning_pools.rs +++ b/src/db/summoning_pools.rs @@ -1,337 +1,341 @@ -pub mod summoning_pools { - use std::{collections::HashMap, sync::Mutex}; - use once_cell::sync::Lazy; - - #[derive(PartialEq, Eq, Hash, Clone, Copy, PartialOrd, Ord)] - pub enum SummoningPool { - SummoningPool10000040, - SummoningPool10000041, - SummoningPool10000042, - SummoningPool10000043, - SummoningPool10000044, - SummoningPool10000045, - SummoningPool11000040, - SummoningPool11000041, - SummoningPool11000042, - SummoningPool11000043, - SummoningPool11000044, - SummoningPool11050040, - SummoningPool11050041, - SummoningPool12010040, - SummoningPool12010041, - SummoningPool12010042, - SummoningPool12010043, - SummoningPool12010044, - SummoningPool12010045, - SummoningPool12010046, - SummoningPool12020040, - SummoningPool12020041, - SummoningPool12020042, - SummoningPool12020043, - SummoningPool12020044, - SummoningPool12020045, - SummoningPool12020046, - SummoningPool12030040, - SummoningPool12030041, - SummoningPool12030042, - SummoningPool12030043, - SummoningPool12030044, - SummoningPool12050040, - SummoningPool12050041, - SummoningPool12050042, - SummoningPool12070040, - SummoningPool12070041, - SummoningPool13000040, - SummoningPool13000041, - SummoningPool13000042, - SummoningPool13000043, - SummoningPool13000044, - SummoningPool13000045, - SummoningPool13000046, - SummoningPool13000047, - SummoningPool14000040, - SummoningPool14000041, - SummoningPool14000042, - SummoningPool14000043, - SummoningPool15000040, - SummoningPool15000041, - SummoningPool15000042, - SummoningPool15000044, - SummoningPool15000045, - SummoningPool15000046, - SummoningPool15000047, - SummoningPool15000049, - SummoningPool16000040, - SummoningPool16000041, - SummoningPool16000042, - SummoningPool16000043, - SummoningPool16000044, - SummoningPool19000040, - SummoningPool30000040, - SummoningPool30010040, - SummoningPool30020040, - SummoningPool30110040, - SummoningPool30040040, - SummoningPool30050040, - SummoningPool30030040, - SummoningPool30060040, - SummoningPool30080040, - SummoningPool30090040, - SummoningPool30100040, - SummoningPool30120040, - SummoningPool30070040, - SummoningPool30140040, - SummoningPool30150040, - SummoningPool30160040, - SummoningPool30170040, - SummoningPool30180040, - SummoningPool30190040, - SummoningPool30200040, - SummoningPool31020040, - SummoningPool31010040, - SummoningPool31000040, - SummoningPool31030040, - SummoningPool31150040, - SummoningPool31170040, - SummoningPool31040040, - SummoningPool31050040, - SummoningPool31060040, - SummoningPool31070040, - SummoningPool31090040, - SummoningPool31180040, - SummoningPool31190040, - SummoningPool31210040, - SummoningPool31100040, - SummoningPool31200040, - SummoningPool31110040, - SummoningPool31120040, - SummoningPool31220040, - SummoningPool32000040, - SummoningPool32010040, - SummoningPool32020040, - SummoningPool32040040, - SummoningPool32050040, - SummoningPool32070040, - SummoningPool32080040, - SummoningPool32110040, - SummoningPool34100040, - SummoningPool34110040, - SummoningPool34120040, - SummoningPool34120041, - SummoningPool34130040, - SummoningPool35000040, - SummoningPool35000041, - SummoningPool35000042, - SummoningPool39200040, - SummoningPool39200041, - SummoningPool1060410040, - SummoningPool1060420040, - SummoningPool1060430040, - SummoningPool1060430041, - SummoningPool1060430042, - SummoningPool1060430043, - SummoningPool1060440040, - SummoningPool1060330040, - SummoningPool1060340040, - SummoningPool1060340041, - SummoningPool1060340043, - SummoningPool1060350040, - SummoningPool1060380040, - SummoningPool1035530040, - SummoningPool1036520040, - SummoningPool1036540040, - SummoningPool1036540041, - SummoningPool1037530040, - SummoningPool1038520040, - SummoningPool1039540040, - SummoningPool1040530040, - SummoningPool1042540040, - SummoningPool1044530040, - SummoningPool1045520040, - SummoningPool1046400040, - SummoningPool1047400040, - SummoningPool1048370040, - SummoningPool1049380040, - SummoningPool1049380041, - SummoningPool1050400040, - SummoningPool1051360040, - SummoningPool1051370040, - SummoningPool1051400040, - SummoningPool1052410040, - SummoningPool1047510840, - SummoningPool1053570840, - SummoningPool1052530840, - SummoningPool1052570840, - SummoningPool1051570840, - SummoningPool1051570841, - SummoningPool1049560840, - SummoningPool1049570840, - } +use std::{collections::HashMap, sync::OnceLock}; + +#[derive(PartialEq, Eq, Hash, Clone, Copy, PartialOrd, Ord)] +pub enum SummoningPool { + SummoningPool10000040, + SummoningPool10000041, + SummoningPool10000042, + SummoningPool10000043, + SummoningPool10000044, + SummoningPool10000045, + SummoningPool11000040, + SummoningPool11000041, + SummoningPool11000042, + SummoningPool11000043, + SummoningPool11000044, + SummoningPool11050040, + SummoningPool11050041, + SummoningPool12010040, + SummoningPool12010041, + SummoningPool12010042, + SummoningPool12010043, + SummoningPool12010044, + SummoningPool12010045, + SummoningPool12010046, + SummoningPool12020040, + SummoningPool12020041, + SummoningPool12020042, + SummoningPool12020043, + SummoningPool12020044, + SummoningPool12020045, + SummoningPool12020046, + SummoningPool12030040, + SummoningPool12030041, + SummoningPool12030042, + SummoningPool12030043, + SummoningPool12030044, + SummoningPool12050040, + SummoningPool12050041, + SummoningPool12050042, + SummoningPool12070040, + SummoningPool12070041, + SummoningPool13000040, + SummoningPool13000041, + SummoningPool13000042, + SummoningPool13000043, + SummoningPool13000044, + SummoningPool13000045, + SummoningPool13000046, + SummoningPool13000047, + SummoningPool14000040, + SummoningPool14000041, + SummoningPool14000042, + SummoningPool14000043, + SummoningPool15000040, + SummoningPool15000041, + SummoningPool15000042, + SummoningPool15000044, + SummoningPool15000045, + SummoningPool15000046, + SummoningPool15000047, + SummoningPool15000049, + SummoningPool16000040, + SummoningPool16000041, + SummoningPool16000042, + SummoningPool16000043, + SummoningPool16000044, + SummoningPool19000040, + SummoningPool30000040, + SummoningPool30010040, + SummoningPool30020040, + SummoningPool30110040, + SummoningPool30040040, + SummoningPool30050040, + SummoningPool30030040, + SummoningPool30060040, + SummoningPool30080040, + SummoningPool30090040, + SummoningPool30100040, + SummoningPool30120040, + SummoningPool30070040, + SummoningPool30140040, + SummoningPool30150040, + SummoningPool30160040, + SummoningPool30170040, + SummoningPool30180040, + SummoningPool30190040, + SummoningPool30200040, + SummoningPool31020040, + SummoningPool31010040, + SummoningPool31000040, + SummoningPool31030040, + SummoningPool31150040, + SummoningPool31170040, + SummoningPool31040040, + SummoningPool31050040, + SummoningPool31060040, + SummoningPool31070040, + SummoningPool31090040, + SummoningPool31180040, + SummoningPool31190040, + SummoningPool31210040, + SummoningPool31100040, + SummoningPool31200040, + SummoningPool31110040, + SummoningPool31120040, + SummoningPool31220040, + SummoningPool32000040, + SummoningPool32010040, + SummoningPool32020040, + SummoningPool32040040, + SummoningPool32050040, + SummoningPool32070040, + SummoningPool32080040, + SummoningPool32110040, + SummoningPool34100040, + SummoningPool34110040, + SummoningPool34120040, + SummoningPool34120041, + SummoningPool34130040, + SummoningPool35000040, + SummoningPool35000041, + SummoningPool35000042, + SummoningPool39200040, + SummoningPool39200041, + SummoningPool1060410040, + SummoningPool1060420040, + SummoningPool1060430040, + SummoningPool1060430041, + SummoningPool1060430042, + SummoningPool1060430043, + SummoningPool1060440040, + SummoningPool1060330040, + SummoningPool1060340040, + SummoningPool1060340041, + SummoningPool1060340043, + SummoningPool1060350040, + SummoningPool1060380040, + SummoningPool1035530040, + SummoningPool1036520040, + SummoningPool1036540040, + SummoningPool1036540041, + SummoningPool1037530040, + SummoningPool1038520040, + SummoningPool1039540040, + SummoningPool1040530040, + SummoningPool1042540040, + SummoningPool1044530040, + SummoningPool1045520040, + SummoningPool1046400040, + SummoningPool1047400040, + SummoningPool1048370040, + SummoningPool1049380040, + SummoningPool1049380041, + SummoningPool1050400040, + SummoningPool1051360040, + SummoningPool1051370040, + SummoningPool1051400040, + SummoningPool1052410040, + SummoningPool1047510840, + SummoningPool1053570840, + SummoningPool1052530840, + SummoningPool1052570840, + SummoningPool1051570840, + SummoningPool1051570841, + SummoningPool1049560840, + SummoningPool1049570840, +} - pub static SUMMONING_POOLS: Lazy>> = Lazy::new(|| { - Mutex::new(HashMap::from([ - (SummoningPool::SummoningPool10000040, (10000040, "Name_10000040")), - (SummoningPool::SummoningPool10000041, (10000041, "Name_10000041")), - (SummoningPool::SummoningPool10000042, (10000042, "Name_10000042")), - (SummoningPool::SummoningPool10000043, (10000043, "Name_10000043")), - (SummoningPool::SummoningPool10000044, (10000044, "Name_10000044")), - (SummoningPool::SummoningPool10000045, (10000045, "Name_10000045")), - (SummoningPool::SummoningPool11000040, (11000040, "Name_11000040")), - (SummoningPool::SummoningPool11000041, (11000041, "Name_11000041")), - (SummoningPool::SummoningPool11000042, (11000042, "Name_11000042")), - (SummoningPool::SummoningPool11000043, (11000043, "Name_11000043")), - (SummoningPool::SummoningPool11000044, (11000044, "Name_11000044")), - (SummoningPool::SummoningPool11050040, (11050040, "Name_11050040")), - (SummoningPool::SummoningPool11050041, (11050041, "Name_11050041")), - (SummoningPool::SummoningPool12010040, (12010040, "Name_12010040")), - (SummoningPool::SummoningPool12010041, (12010041, "Name_12010041")), - (SummoningPool::SummoningPool12010042, (12010042, "Name_12010042")), - (SummoningPool::SummoningPool12010043, (12010043, "Name_12010043")), - (SummoningPool::SummoningPool12010044, (12010044, "Name_12010044")), - (SummoningPool::SummoningPool12010045, (12010045, "Name_12010045")), - (SummoningPool::SummoningPool12010046, (12010046, "Name_12010046")), - (SummoningPool::SummoningPool12020040, (12020040, "Name_12020040")), - (SummoningPool::SummoningPool12020041, (12020041, "Name_12020041")), - (SummoningPool::SummoningPool12020042, (12020042, "Name_12020042")), - (SummoningPool::SummoningPool12020043, (12020043, "Name_12020043")), - (SummoningPool::SummoningPool12020044, (12020044, "Name_12020044")), - (SummoningPool::SummoningPool12020045, (12020045, "Name_12020045")), - (SummoningPool::SummoningPool12020046, (12020046, "Name_12020046")), - (SummoningPool::SummoningPool12030040, (12030040, "Name_12030040")), - (SummoningPool::SummoningPool12030041, (12030041, "Name_12030041")), - (SummoningPool::SummoningPool12030042, (12030042, "Name_12030042")), - (SummoningPool::SummoningPool12030043, (12030043, "Name_12030043")), - (SummoningPool::SummoningPool12030044, (12030044, "Name_12030044")), - (SummoningPool::SummoningPool12050040, (12050040, "Name_12050040")), - (SummoningPool::SummoningPool12050041, (12050041, "Name_12050041")), - (SummoningPool::SummoningPool12050042, (12050042, "Name_12050042")), - (SummoningPool::SummoningPool12070040, (12070040, "Name_12070040")), - (SummoningPool::SummoningPool12070041, (12070041, "Name_12070041")), - (SummoningPool::SummoningPool13000040, (13000040, "Name_13000040")), - (SummoningPool::SummoningPool13000041, (13000041, "Name_13000041")), - (SummoningPool::SummoningPool13000042, (13000042, "Name_13000042")), - (SummoningPool::SummoningPool13000043, (13000043, "Name_13000043")), - (SummoningPool::SummoningPool13000044, (13000044, "Name_13000044")), - (SummoningPool::SummoningPool13000045, (13000045, "Name_13000045")), - (SummoningPool::SummoningPool13000046, (13000046, "Name_13000046")), - (SummoningPool::SummoningPool13000047, (13000047, "Name_13000047")), - (SummoningPool::SummoningPool14000040, (14000040, "Name_14000040")), - (SummoningPool::SummoningPool14000041, (14000041, "Name_14000041")), - (SummoningPool::SummoningPool14000042, (14000042, "Name_14000042")), - (SummoningPool::SummoningPool14000043, (14000043, "Name_14000043")), - (SummoningPool::SummoningPool15000040, (15000040, "Name_15000040")), - (SummoningPool::SummoningPool15000041, (15000041, "Name_15000041")), - (SummoningPool::SummoningPool15000042, (15000042, "Name_15000042")), - (SummoningPool::SummoningPool15000044, (15000044, "Name_15000044")), - (SummoningPool::SummoningPool15000045, (15000045, "Name_15000045")), - (SummoningPool::SummoningPool15000046, (15000046, "Name_15000046")), - (SummoningPool::SummoningPool15000047, (15000047, "Name_15000047")), - (SummoningPool::SummoningPool15000049, (15000049, "Name_15000049")), - (SummoningPool::SummoningPool16000040, (16000040, "Name_16000040")), - (SummoningPool::SummoningPool16000041, (16000041, "Name_16000041")), - (SummoningPool::SummoningPool16000042, (16000042, "Name_16000042")), - (SummoningPool::SummoningPool16000043, (16000043, "Name_16000043")), - (SummoningPool::SummoningPool16000044, (16000044, "Name_16000044")), - (SummoningPool::SummoningPool19000040, (19000040, "Name_19000040")), - (SummoningPool::SummoningPool30000040, (30000040, "Name_30000040")), - (SummoningPool::SummoningPool30010040, (30010040, "Name_30010040")), - (SummoningPool::SummoningPool30020040, (30020040, "Name_30020040")), - (SummoningPool::SummoningPool30110040, (30110040, "Name_30110040")), - (SummoningPool::SummoningPool30040040, (30040040, "Name_30040040")), - (SummoningPool::SummoningPool30050040, (30050040, "Name_30050040")), - (SummoningPool::SummoningPool30030040, (30030040, "Name_30030040")), - (SummoningPool::SummoningPool30060040, (30060040, "Name_30060040")), - (SummoningPool::SummoningPool30080040, (30080040, "Name_30080040")), - (SummoningPool::SummoningPool30090040, (30090040, "Name_30090040")), - (SummoningPool::SummoningPool30100040, (30100040, "Name_30100040")), - (SummoningPool::SummoningPool30120040, (30120040, "Name_30120040")), - (SummoningPool::SummoningPool30070040, (30070040, "Name_30070040")), - (SummoningPool::SummoningPool30140040, (30140040, "Name_30140040")), - (SummoningPool::SummoningPool30150040, (30150040, "Name_30150040")), - (SummoningPool::SummoningPool30160040, (30160040, "Name_30160040")), - (SummoningPool::SummoningPool30170040, (30170040, "Name_30170040")), - (SummoningPool::SummoningPool30180040, (30180040, "Name_30180040")), - (SummoningPool::SummoningPool30190040, (30190040, "Name_30190040")), - (SummoningPool::SummoningPool30200040, (30200040, "Name_30200040")), - (SummoningPool::SummoningPool31020040, (31020040, "Name_31020040")), - (SummoningPool::SummoningPool31010040, (31010040, "Name_31010040")), - (SummoningPool::SummoningPool31000040, (31000040, "Name_31000040")), - (SummoningPool::SummoningPool31030040, (31030040, "Name_31030040")), - (SummoningPool::SummoningPool31150040, (31150040, "Name_31150040")), - (SummoningPool::SummoningPool31170040, (31170040, "Name_31170040")), - (SummoningPool::SummoningPool31040040, (31040040, "Name_31040040")), - (SummoningPool::SummoningPool31050040, (31050040, "Name_31050040")), - (SummoningPool::SummoningPool31060040, (31060040, "Name_31060040")), - (SummoningPool::SummoningPool31070040, (31070040, "Name_31070040")), - (SummoningPool::SummoningPool31090040, (31090040, "Name_31090040")), - (SummoningPool::SummoningPool31180040, (31180040, "Name_31180040")), - (SummoningPool::SummoningPool31190040, (31190040, "Name_31190040")), - (SummoningPool::SummoningPool31210040, (31210040, "Name_31210040")), - (SummoningPool::SummoningPool31100040, (31100040, "Name_31100040")), - (SummoningPool::SummoningPool31200040, (31200040, "Name_31200040")), - (SummoningPool::SummoningPool31110040, (31110040, "Name_31110040")), - (SummoningPool::SummoningPool31120040, (31120040, "Name_31120040")), - (SummoningPool::SummoningPool31220040, (31220040, "Name_31220040")), - (SummoningPool::SummoningPool32000040, (32000040, "Name_32000040")), - (SummoningPool::SummoningPool32010040, (32010040, "Name_32010040")), - (SummoningPool::SummoningPool32020040, (32020040, "Name_32020040")), - (SummoningPool::SummoningPool32040040, (32040040, "Name_32040040")), - (SummoningPool::SummoningPool32050040, (32050040, "Name_32050040")), - (SummoningPool::SummoningPool32070040, (32070040, "Name_32070040")), - (SummoningPool::SummoningPool32080040, (32080040, "Name_32080040")), - (SummoningPool::SummoningPool32110040, (32110040, "Name_32110040")), - (SummoningPool::SummoningPool34100040, (34100040, "Name_34100040")), - (SummoningPool::SummoningPool34110040, (34110040, "Name_34110040")), - (SummoningPool::SummoningPool34120040, (34120040, "Name_34120040")), - (SummoningPool::SummoningPool34120041, (34120041, "Name_34120041")), - (SummoningPool::SummoningPool34130040, (34130040, "Name_34130040")), - (SummoningPool::SummoningPool35000040, (35000040, "Name_35000040")), - (SummoningPool::SummoningPool35000041, (35000041, "Name_35000041")), - (SummoningPool::SummoningPool35000042, (35000042, "Name_35000042")), - (SummoningPool::SummoningPool39200040, (39200040, "Name_39200040")), - (SummoningPool::SummoningPool39200041, (39200041, "Name_39200041")), - (SummoningPool::SummoningPool1060410040, (1060410040, "Name_1060410040")), - (SummoningPool::SummoningPool1060420040, (1060420040, "Name_1060420040")), - (SummoningPool::SummoningPool1060430040, (1060430040, "Name_1060430040")), - (SummoningPool::SummoningPool1060430041, (1060430041, "Name_1060430041")), - (SummoningPool::SummoningPool1060430042, (1060430042, "Name_1060430042")), - (SummoningPool::SummoningPool1060430043, (1060430043, "Name_1060430043")), - (SummoningPool::SummoningPool1060440040, (1060440040, "Name_1060440040")), - (SummoningPool::SummoningPool1060330040, (1060330040, "Name_1060330040")), - (SummoningPool::SummoningPool1060340040, (1060340040, "Name_1060340040")), - (SummoningPool::SummoningPool1060340041, (1060340041, "Name_1060340041")), - (SummoningPool::SummoningPool1060340043, (1060340043, "Name_1060340043")), - (SummoningPool::SummoningPool1060350040, (1060350040, "Name_1060350040")), - (SummoningPool::SummoningPool1060380040, (1060380040, "Name_1060380040")), - (SummoningPool::SummoningPool1035530040, (1035530040, "Name_1035530040")), - (SummoningPool::SummoningPool1036520040, (1036520040, "Name_1036520040")), - (SummoningPool::SummoningPool1036540040, (1036540040, "Name_1036540040")), - (SummoningPool::SummoningPool1036540041, (1036540041, "Name_1036540041")), - (SummoningPool::SummoningPool1037530040, (1037530040, "Name_1037530040")), - (SummoningPool::SummoningPool1038520040, (1038520040, "Name_1038520040")), - (SummoningPool::SummoningPool1039540040, (1039540040, "Name_1039540040")), - (SummoningPool::SummoningPool1040530040, (1040530040, "Name_1040530040")), - (SummoningPool::SummoningPool1042540040, (1042540040, "Name_1042540040")), - (SummoningPool::SummoningPool1044530040, (1044530040, "Name_1044530040")), - (SummoningPool::SummoningPool1045520040, (1045520040, "Name_1045520040")), - (SummoningPool::SummoningPool1046400040, (1046400040, "Name_1046400040")), - (SummoningPool::SummoningPool1047400040, (1047400040, "Name_1047400040")), - (SummoningPool::SummoningPool1048370040, (1048370040, "Name_1048370040")), - (SummoningPool::SummoningPool1049380040, (1049380040, "Name_1049380040")), - (SummoningPool::SummoningPool1049380041, (1049380041, "Name_1049380041")), - (SummoningPool::SummoningPool1050400040, (1050400040, "Name_1050400040")), - (SummoningPool::SummoningPool1051360040, (1051360040, "Name_1051360040")), - (SummoningPool::SummoningPool1051370040, (1051370040, "Name_1051370040")), - (SummoningPool::SummoningPool1051400040, (1051400040, "Name_1051400040")), - (SummoningPool::SummoningPool1052410040, (1052410040, "Name_1052410040")), - (SummoningPool::SummoningPool1047510840, (1047510840, "Name_1047510840")), - (SummoningPool::SummoningPool1053570840, (1053570840, "Name_1053570840")), - (SummoningPool::SummoningPool1052530840, (1052530840, "Name_1052530840")), - (SummoningPool::SummoningPool1052570840, (1052570840, "Name_1052570840")), - (SummoningPool::SummoningPool1051570840, (1051570840, "Name_1051570840")), - (SummoningPool::SummoningPool1051570841, (1051570841, "Name_1051570841")), - (SummoningPool::SummoningPool1049560840, (1049560840, "Name_1049560840")), - (SummoningPool::SummoningPool1049570840, (1049570840, "Name_1049570840")), - ])) - }); -} \ No newline at end of file +impl SummoningPool { + #[rustfmt::skip] + pub fn summoning_pools() -> &'static HashMap { + static SUMMONING_POOLS: OnceLock> = OnceLock::new(); + + SUMMONING_POOLS.get_or_init(|| + HashMap::from([ + (SummoningPool::SummoningPool10000040, (10000040, "Name_10000040")), + (SummoningPool::SummoningPool10000041, (10000041, "Name_10000041")), + (SummoningPool::SummoningPool10000042, (10000042, "Name_10000042")), + (SummoningPool::SummoningPool10000043, (10000043, "Name_10000043")), + (SummoningPool::SummoningPool10000044, (10000044, "Name_10000044")), + (SummoningPool::SummoningPool10000045, (10000045, "Name_10000045")), + (SummoningPool::SummoningPool11000040, (11000040, "Name_11000040")), + (SummoningPool::SummoningPool11000041, (11000041, "Name_11000041")), + (SummoningPool::SummoningPool11000042, (11000042, "Name_11000042")), + (SummoningPool::SummoningPool11000043, (11000043, "Name_11000043")), + (SummoningPool::SummoningPool11000044, (11000044, "Name_11000044")), + (SummoningPool::SummoningPool11050040, (11050040, "Name_11050040")), + (SummoningPool::SummoningPool11050041, (11050041, "Name_11050041")), + (SummoningPool::SummoningPool12010040, (12010040, "Name_12010040")), + (SummoningPool::SummoningPool12010041, (12010041, "Name_12010041")), + (SummoningPool::SummoningPool12010042, (12010042, "Name_12010042")), + (SummoningPool::SummoningPool12010043, (12010043, "Name_12010043")), + (SummoningPool::SummoningPool12010044, (12010044, "Name_12010044")), + (SummoningPool::SummoningPool12010045, (12010045, "Name_12010045")), + (SummoningPool::SummoningPool12010046, (12010046, "Name_12010046")), + (SummoningPool::SummoningPool12020040, (12020040, "Name_12020040")), + (SummoningPool::SummoningPool12020041, (12020041, "Name_12020041")), + (SummoningPool::SummoningPool12020042, (12020042, "Name_12020042")), + (SummoningPool::SummoningPool12020043, (12020043, "Name_12020043")), + (SummoningPool::SummoningPool12020044, (12020044, "Name_12020044")), + (SummoningPool::SummoningPool12020045, (12020045, "Name_12020045")), + (SummoningPool::SummoningPool12020046, (12020046, "Name_12020046")), + (SummoningPool::SummoningPool12030040, (12030040, "Name_12030040")), + (SummoningPool::SummoningPool12030041, (12030041, "Name_12030041")), + (SummoningPool::SummoningPool12030042, (12030042, "Name_12030042")), + (SummoningPool::SummoningPool12030043, (12030043, "Name_12030043")), + (SummoningPool::SummoningPool12030044, (12030044, "Name_12030044")), + (SummoningPool::SummoningPool12050040, (12050040, "Name_12050040")), + (SummoningPool::SummoningPool12050041, (12050041, "Name_12050041")), + (SummoningPool::SummoningPool12050042, (12050042, "Name_12050042")), + (SummoningPool::SummoningPool12070040, (12070040, "Name_12070040")), + (SummoningPool::SummoningPool12070041, (12070041, "Name_12070041")), + (SummoningPool::SummoningPool13000040, (13000040, "Name_13000040")), + (SummoningPool::SummoningPool13000041, (13000041, "Name_13000041")), + (SummoningPool::SummoningPool13000042, (13000042, "Name_13000042")), + (SummoningPool::SummoningPool13000043, (13000043, "Name_13000043")), + (SummoningPool::SummoningPool13000044, (13000044, "Name_13000044")), + (SummoningPool::SummoningPool13000045, (13000045, "Name_13000045")), + (SummoningPool::SummoningPool13000046, (13000046, "Name_13000046")), + (SummoningPool::SummoningPool13000047, (13000047, "Name_13000047")), + (SummoningPool::SummoningPool14000040, (14000040, "Name_14000040")), + (SummoningPool::SummoningPool14000041, (14000041, "Name_14000041")), + (SummoningPool::SummoningPool14000042, (14000042, "Name_14000042")), + (SummoningPool::SummoningPool14000043, (14000043, "Name_14000043")), + (SummoningPool::SummoningPool15000040, (15000040, "Name_15000040")), + (SummoningPool::SummoningPool15000041, (15000041, "Name_15000041")), + (SummoningPool::SummoningPool15000042, (15000042, "Name_15000042")), + (SummoningPool::SummoningPool15000044, (15000044, "Name_15000044")), + (SummoningPool::SummoningPool15000045, (15000045, "Name_15000045")), + (SummoningPool::SummoningPool15000046, (15000046, "Name_15000046")), + (SummoningPool::SummoningPool15000047, (15000047, "Name_15000047")), + (SummoningPool::SummoningPool15000049, (15000049, "Name_15000049")), + (SummoningPool::SummoningPool16000040, (16000040, "Name_16000040")), + (SummoningPool::SummoningPool16000041, (16000041, "Name_16000041")), + (SummoningPool::SummoningPool16000042, (16000042, "Name_16000042")), + (SummoningPool::SummoningPool16000043, (16000043, "Name_16000043")), + (SummoningPool::SummoningPool16000044, (16000044, "Name_16000044")), + (SummoningPool::SummoningPool19000040, (19000040, "Name_19000040")), + (SummoningPool::SummoningPool30000040, (30000040, "Name_30000040")), + (SummoningPool::SummoningPool30010040, (30010040, "Name_30010040")), + (SummoningPool::SummoningPool30020040, (30020040, "Name_30020040")), + (SummoningPool::SummoningPool30110040, (30110040, "Name_30110040")), + (SummoningPool::SummoningPool30040040, (30040040, "Name_30040040")), + (SummoningPool::SummoningPool30050040, (30050040, "Name_30050040")), + (SummoningPool::SummoningPool30030040, (30030040, "Name_30030040")), + (SummoningPool::SummoningPool30060040, (30060040, "Name_30060040")), + (SummoningPool::SummoningPool30080040, (30080040, "Name_30080040")), + (SummoningPool::SummoningPool30090040, (30090040, "Name_30090040")), + (SummoningPool::SummoningPool30100040, (30100040, "Name_30100040")), + (SummoningPool::SummoningPool30120040, (30120040, "Name_30120040")), + (SummoningPool::SummoningPool30070040, (30070040, "Name_30070040")), + (SummoningPool::SummoningPool30140040, (30140040, "Name_30140040")), + (SummoningPool::SummoningPool30150040, (30150040, "Name_30150040")), + (SummoningPool::SummoningPool30160040, (30160040, "Name_30160040")), + (SummoningPool::SummoningPool30170040, (30170040, "Name_30170040")), + (SummoningPool::SummoningPool30180040, (30180040, "Name_30180040")), + (SummoningPool::SummoningPool30190040, (30190040, "Name_30190040")), + (SummoningPool::SummoningPool30200040, (30200040, "Name_30200040")), + (SummoningPool::SummoningPool31020040, (31020040, "Name_31020040")), + (SummoningPool::SummoningPool31010040, (31010040, "Name_31010040")), + (SummoningPool::SummoningPool31000040, (31000040, "Name_31000040")), + (SummoningPool::SummoningPool31030040, (31030040, "Name_31030040")), + (SummoningPool::SummoningPool31150040, (31150040, "Name_31150040")), + (SummoningPool::SummoningPool31170040, (31170040, "Name_31170040")), + (SummoningPool::SummoningPool31040040, (31040040, "Name_31040040")), + (SummoningPool::SummoningPool31050040, (31050040, "Name_31050040")), + (SummoningPool::SummoningPool31060040, (31060040, "Name_31060040")), + (SummoningPool::SummoningPool31070040, (31070040, "Name_31070040")), + (SummoningPool::SummoningPool31090040, (31090040, "Name_31090040")), + (SummoningPool::SummoningPool31180040, (31180040, "Name_31180040")), + (SummoningPool::SummoningPool31190040, (31190040, "Name_31190040")), + (SummoningPool::SummoningPool31210040, (31210040, "Name_31210040")), + (SummoningPool::SummoningPool31100040, (31100040, "Name_31100040")), + (SummoningPool::SummoningPool31200040, (31200040, "Name_31200040")), + (SummoningPool::SummoningPool31110040, (31110040, "Name_31110040")), + (SummoningPool::SummoningPool31120040, (31120040, "Name_31120040")), + (SummoningPool::SummoningPool31220040, (31220040, "Name_31220040")), + (SummoningPool::SummoningPool32000040, (32000040, "Name_32000040")), + (SummoningPool::SummoningPool32010040, (32010040, "Name_32010040")), + (SummoningPool::SummoningPool32020040, (32020040, "Name_32020040")), + (SummoningPool::SummoningPool32040040, (32040040, "Name_32040040")), + (SummoningPool::SummoningPool32050040, (32050040, "Name_32050040")), + (SummoningPool::SummoningPool32070040, (32070040, "Name_32070040")), + (SummoningPool::SummoningPool32080040, (32080040, "Name_32080040")), + (SummoningPool::SummoningPool32110040, (32110040, "Name_32110040")), + (SummoningPool::SummoningPool34100040, (34100040, "Name_34100040")), + (SummoningPool::SummoningPool34110040, (34110040, "Name_34110040")), + (SummoningPool::SummoningPool34120040, (34120040, "Name_34120040")), + (SummoningPool::SummoningPool34120041, (34120041, "Name_34120041")), + (SummoningPool::SummoningPool34130040, (34130040, "Name_34130040")), + (SummoningPool::SummoningPool35000040, (35000040, "Name_35000040")), + (SummoningPool::SummoningPool35000041, (35000041, "Name_35000041")), + (SummoningPool::SummoningPool35000042, (35000042, "Name_35000042")), + (SummoningPool::SummoningPool39200040, (39200040, "Name_39200040")), + (SummoningPool::SummoningPool39200041, (39200041, "Name_39200041")), + (SummoningPool::SummoningPool1060410040, (1060410040, "Name_1060410040")), + (SummoningPool::SummoningPool1060420040, (1060420040, "Name_1060420040")), + (SummoningPool::SummoningPool1060430040, (1060430040, "Name_1060430040")), + (SummoningPool::SummoningPool1060430041, (1060430041, "Name_1060430041")), + (SummoningPool::SummoningPool1060430042, (1060430042, "Name_1060430042")), + (SummoningPool::SummoningPool1060430043, (1060430043, "Name_1060430043")), + (SummoningPool::SummoningPool1060440040, (1060440040, "Name_1060440040")), + (SummoningPool::SummoningPool1060330040, (1060330040, "Name_1060330040")), + (SummoningPool::SummoningPool1060340040, (1060340040, "Name_1060340040")), + (SummoningPool::SummoningPool1060340041, (1060340041, "Name_1060340041")), + (SummoningPool::SummoningPool1060340043, (1060340043, "Name_1060340043")), + (SummoningPool::SummoningPool1060350040, (1060350040, "Name_1060350040")), + (SummoningPool::SummoningPool1060380040, (1060380040, "Name_1060380040")), + (SummoningPool::SummoningPool1035530040, (1035530040, "Name_1035530040")), + (SummoningPool::SummoningPool1036520040, (1036520040, "Name_1036520040")), + (SummoningPool::SummoningPool1036540040, (1036540040, "Name_1036540040")), + (SummoningPool::SummoningPool1036540041, (1036540041, "Name_1036540041")), + (SummoningPool::SummoningPool1037530040, (1037530040, "Name_1037530040")), + (SummoningPool::SummoningPool1038520040, (1038520040, "Name_1038520040")), + (SummoningPool::SummoningPool1039540040, (1039540040, "Name_1039540040")), + (SummoningPool::SummoningPool1040530040, (1040530040, "Name_1040530040")), + (SummoningPool::SummoningPool1042540040, (1042540040, "Name_1042540040")), + (SummoningPool::SummoningPool1044530040, (1044530040, "Name_1044530040")), + (SummoningPool::SummoningPool1045520040, (1045520040, "Name_1045520040")), + (SummoningPool::SummoningPool1046400040, (1046400040, "Name_1046400040")), + (SummoningPool::SummoningPool1047400040, (1047400040, "Name_1047400040")), + (SummoningPool::SummoningPool1048370040, (1048370040, "Name_1048370040")), + (SummoningPool::SummoningPool1049380040, (1049380040, "Name_1049380040")), + (SummoningPool::SummoningPool1049380041, (1049380041, "Name_1049380041")), + (SummoningPool::SummoningPool1050400040, (1050400040, "Name_1050400040")), + (SummoningPool::SummoningPool1051360040, (1051360040, "Name_1051360040")), + (SummoningPool::SummoningPool1051370040, (1051370040, "Name_1051370040")), + (SummoningPool::SummoningPool1051400040, (1051400040, "Name_1051400040")), + (SummoningPool::SummoningPool1052410040, (1052410040, "Name_1052410040")), + (SummoningPool::SummoningPool1047510840, (1047510840, "Name_1047510840")), + (SummoningPool::SummoningPool1053570840, (1053570840, "Name_1053570840")), + (SummoningPool::SummoningPool1052530840, (1052530840, "Name_1052530840")), + (SummoningPool::SummoningPool1052570840, (1052570840, "Name_1052570840")), + (SummoningPool::SummoningPool1051570840, (1051570840, "Name_1051570840")), + (SummoningPool::SummoningPool1051570841, (1051570841, "Name_1051570841")), + (SummoningPool::SummoningPool1049560840, (1049560840, "Name_1049560840")), + (SummoningPool::SummoningPool1049570840, (1049570840, "Name_1049570840")), + ]) + ) + } +} diff --git a/src/db/whetblades.rs b/src/db/whetblades.rs index c3428c8..134537c 100644 --- a/src/db/whetblades.rs +++ b/src/db/whetblades.rs @@ -1,38 +1,46 @@ -pub mod whetblades { - use std::{collections::HashMap, sync::Mutex}; - use once_cell::sync::Lazy; - - #[derive(PartialEq, Eq, Hash, Clone, Copy, PartialOrd, Ord)] - pub enum Whetblade { - // Standard, - BlackWhetbladeBlood, - BlackWhetbladeOccult, - BlackWhetbladePoison, - GlintstoneWhetbladeFrost, - GlintstoneWhetbladeMagic, - IronWhetbladeHeavy, - IronWhetbladeKeen, - IronWhetbladeQuality, - RedHotWhetbladeFire, - RedHotWhetbladeFlameArt, - SanctifiedWhetbladeLightning, - SanctifiedWhetbladeSacred, +use std::{ + collections::HashMap, + sync::OnceLock, +}; + +#[derive(PartialEq, Eq, Hash, Clone, Copy, PartialOrd, Ord)] +pub enum Whetblade { + // Standard, + BlackWhetbladeBlood, + BlackWhetbladeOccult, + BlackWhetbladePoison, + GlintstoneWhetbladeFrost, + GlintstoneWhetbladeMagic, + IronWhetbladeHeavy, + IronWhetbladeKeen, + IronWhetbladeQuality, + RedHotWhetbladeFire, + RedHotWhetbladeFlameArt, + SanctifiedWhetbladeLightning, + SanctifiedWhetbladeSacred, +} + +impl Whetblade { + #[rustfmt::skip] + pub fn whetblades() -> &'static HashMap { + static WHETBLADES: OnceLock> = OnceLock::new(); + + WHETBLADES.get_or_init(|| + HashMap::from([ + // (Whetblade::Standard,(65600, "Upgrade - Standard")), + (Whetblade::BlackWhetbladeBlood,(65710, "Black Whetblade (Blood)")), + (Whetblade::BlackWhetbladeOccult,(65720, "Black Whetblade (Occult)")), + (Whetblade::BlackWhetbladePoison,(65700, "Black Whetblade (Poison)")), + (Whetblade::GlintstoneWhetbladeFrost,(65690, "Glintstone Whetblade (Frost)")), + (Whetblade::GlintstoneWhetbladeMagic,(65680, "Glintstone Whetblade (Magic)")), + (Whetblade::IronWhetbladeHeavy,(65610, "Iron Whetblade (Heavy)")), + (Whetblade::IronWhetbladeKeen,(65620, "Iron Whetblade (Keen)")), + (Whetblade::IronWhetbladeQuality,(65630, "Iron Whetblade (Quality)")), + (Whetblade::RedHotWhetbladeFire,(65640, "Red-Hot Whetblade (Fire)")), + (Whetblade::RedHotWhetbladeFlameArt,(65650, "Red-Hot Whetblade (Flame Art)")), + (Whetblade::SanctifiedWhetbladeLightning,(65660, "Sanctified Whetblade (Lightning)")), + (Whetblade::SanctifiedWhetbladeSacred,(65670, "Sanctified Whetblade (Sacred)")), + ]) + ) } - pub static WHETBLADES: Lazy>> = Lazy::new(|| { - Mutex::new(HashMap::from([ - // (Whetblade::Standard,(65600, "Upgrade - Standard")), - (Whetblade::BlackWhetbladeBlood,(65710, "Black Whetblade (Blood)")), - (Whetblade::BlackWhetbladeOccult,(65720, "Black Whetblade (Occult)")), - (Whetblade::BlackWhetbladePoison,(65700, "Black Whetblade (Poison)")), - (Whetblade::GlintstoneWhetbladeFrost,(65690, "Glintstone Whetblade (Frost)")), - (Whetblade::GlintstoneWhetbladeMagic,(65680, "Glintstone Whetblade (Magic)")), - (Whetblade::IronWhetbladeHeavy,(65610, "Iron Whetblade (Heavy)")), - (Whetblade::IronWhetbladeKeen,(65620, "Iron Whetblade (Keen)")), - (Whetblade::IronWhetbladeQuality,(65630, "Iron Whetblade (Quality)")), - (Whetblade::RedHotWhetbladeFire,(65640, "Red-Hot Whetblade (Fire)")), - (Whetblade::RedHotWhetbladeFlameArt,(65650, "Red-Hot Whetblade (Flame Art)")), - (Whetblade::SanctifiedWhetbladeLightning,(65660, "Sanctified Whetblade (Lightning)")), - (Whetblade::SanctifiedWhetbladeSacred,(65670, "Sanctified Whetblade (Sacred)")), - ])) - }); -} \ No newline at end of file +} diff --git a/src/main.rs b/src/main.rs index ccfa347..4e02a51 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,310 +1,241 @@ #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] // hide console window on Windows in release -mod vm; -mod save; -mod util; -mod read; -mod write; -mod ui; +mod api; mod db; +mod ui; +mod updater; +mod vm; -use std::{fs::File, io::Write, path::PathBuf}; - -use eframe::{egui::{self, text::LayoutJob, Align, FontSelection, Id, LayerId, Layout, Order, RichText, Rounding, Style}, epaint::Color32}; +use eframe::egui::{self, Rounding}; +use er_save_lib::{SaveApi, SaveApiError}; use rfd::FileDialog; -use save::save::save::{Save, SaveType}; -use ui::{equipment::equipment::equipment, events::events::events, general::general::general, importer::import::character_importer, inventory::inventory::inventory::inventory, menu::menu::{menu, Route}, none::none::none, regions::regions::regions, stats::stats::stats}; -use vm::{importer::general_view_model::ImporterViewModel, vm::vm::ViewModel}; -use crate::write::write::Write as w; use rust_embed::RustEmbed; +use std::{fs::create_dir_all, path::PathBuf}; +use ui::{ + character_list::character_list_side_panel, + events::events, + file_drop::file_drop_main_panel, + general::general, + information::information_top_panel, + inventory::inventory::inventory, + menu::{menu, Route}, + none::none, + notifications::notifications, + regions::regions, + settings::settings_bottom_panel, + stats::stats, + toolbar::toolbar_top_panel, +}; +use updater::updater::Updater; + +use vm::{ + importer::ImporterViewModel, + notifications::{Notification, NotificationButtons, NotificationType, NOTIFICATIONS}, + vm::ViewModel, +}; #[derive(RustEmbed)] #[folder = "icon/"] struct Asset; +// Starter values for window const WINDOW_WIDTH: f32 = 1920.; const WINDOW_HEIGHT: f32 = 960.; +const DEFAULT_ZOOM_FACTOR: f32 = 1.5; fn main() -> Result<(), eframe::Error> { + // Check for updates + let result = Updater::get_new_version(); + + // Push an update notification if there's a new version + if let Some(new_version) = result { + NOTIFICATIONS.write().unwrap().push(Notification::new( + NotificationType::Warning, + format!( + "This version is outdated. A new version is available for downlaod!\n\nChangelog\n--------------------\n{}\n", + new_version.body + ), + NotificationButtons::::None, + )); + } + // App Icon let mut app_icon = egui::IconData::default(); - - let image = Asset::get("icon.png").expect("Failed to get image data").data; - let icon = image::load_from_memory(&image).expect("Failed to open icon path").to_rgba8(); + + // Add Icon to app + let image = Asset::get("icon.png") + .expect("Failed to get image data") + .data; + let icon = image::load_from_memory(&image) + .expect("Failed to open icon path") + .to_rgba8(); let (icon_width, icon_height) = icon.dimensions(); app_icon.rgba = icon.into_raw(); app_icon.width = icon_width; app_icon.height = icon_height; + // Define window options let options = eframe::NativeOptions { - viewport: egui::ViewportBuilder::default().with_inner_size([WINDOW_WIDTH, WINDOW_HEIGHT]) - .with_icon(app_icon), + viewport: egui::ViewportBuilder::default() + .with_inner_size([WINDOW_WIDTH, WINDOW_HEIGHT]) + .with_icon(app_icon), ..Default::default() }; - eframe::run_native("ER Save Editor 0.0.21", options, Box::new(|creation_context| { - let mut fonts = egui::FontDefinitions::default(); - egui_phosphor::add_to_fonts(&mut fonts, egui_phosphor::Variant::Regular); - egui_phosphor::add_to_fonts(&mut fonts, egui_phosphor::Variant::Fill); - creation_context.egui_ctx.set_fonts(fonts); - let mut visuals = creation_context.egui_ctx.style().visuals.clone(); - let rounding = 3.; - visuals.window_rounding = Rounding::default().at_least(rounding); - visuals.window_highlight_topmost = false; - creation_context.egui_ctx.set_visuals(visuals); - Box::new(App::new(creation_context)) - })) + // Run window + eframe::run_native( + &format!("ER Save Editor {}", env!("CARGO_PKG_VERSION")), + options, + Box::new(|creation_context| { + let mut fonts = egui::FontDefinitions::default(); + egui_phosphor::add_to_fonts(&mut fonts, egui_phosphor::Variant::Regular); + egui_phosphor::add_to_fonts(&mut fonts, egui_phosphor::Variant::Fill); + creation_context.egui_ctx.set_fonts(fonts); + let mut visuals = creation_context.egui_ctx.style().visuals.clone(); + let rounding = 3.; + visuals.window_rounding = Rounding::default().at_least(rounding); + visuals.window_highlight_topmost = false; + creation_context.egui_ctx.set_visuals(visuals); + creation_context + .egui_ctx + .set_zoom_factor(DEFAULT_ZOOM_FACTOR); + Box::new(App::new(creation_context)) + }), + ) } pub struct App { - save: Save, - vm: ViewModel, - picked_path: PathBuf, - current_route: Route, - importer_vm: ImporterViewModel, - importer_open: bool, + save_api: Option, // Save Api + vm: ViewModel, // ViewModel from the save data + backup_dir: Option, // Directory containing backup saves + picked_path: PathBuf, // Path to current save file for future use when opening dialogs + current_route: Route, // Current in app view + importer_vm: ImporterViewModel, // ViewModel used for the importer + importer_open: bool, // Importer Open Flag } impl App { + /// Constructs a new App instance. pub fn new(_cc: &eframe::CreationContext<'_>) -> Self { Self { - save: Save::default(), - picked_path: Default::default(), + save_api: None, + backup_dir: None, + picked_path: Default::default(), current_route: Route::None, vm: ViewModel::default(), - importer_vm: Default::default(), - importer_open: Default::default() + importer_vm: ImporterViewModel::default(), + importer_open: false, } } - fn open(&mut self, path: PathBuf) { - self.save = Save::from_path(&path).expect("Failed to read save"); - self.vm = ViewModel::from_save(&self.save); + /// Reads the save file from the user picked path. + pub(crate) fn open(&mut self, path: &PathBuf) -> Result<(), SaveApiError> { + let save_api = SaveApi::from_path(path)?; + self.save_api = Some(save_api); + self.vm = ViewModel::from_save(self.save_api.as_mut().unwrap())?; self.picked_path = path.clone(); + Ok(()) } - fn save(&mut self, path: PathBuf) { - self.vm.update_save(&mut self.save.save_type); - let mut f = File::create(path).expect(""); - let bytes = self.save.write().expect(""); - let res = f.write_all(&bytes); + /// Writes the save file to the user picked path. + pub(crate) fn save(&mut self, path: &PathBuf) -> Result<(), SaveApiError> { + // Save backup of original save file + if let Some(save) = &self.save_api { + // Get formatted date time + let now = chrono::Utc::now().format("%d_%m_%Y_%H_%M_%S"); + + // Clone path and add timestamp to it + let mut backup_path = path.clone(); + + if let Some(parent) = backup_path.parent() { + // Append paths parent directory with the backup files new path + backup_path = parent.to_path_buf(); + backup_path.push("backups"); + backup_path.push(format!("{}", chrono::Utc::now().format("%m_%Y"))); + + // Create directories for the backups if they don't exist + create_dir_all(&backup_path)?; + + self.backup_dir = Some(backup_path.clone()); + } else { + return Err(SaveApiError::IoError(std::io::Error::new( + std::io::ErrorKind::NotFound, + "Failed to get directory of the selected save path!", + ))); + } + + // Add now datetime as name for the backup file + backup_path.push(format!("{}.sl2", now)); - match res { - Ok(_) => {}, - Err(_) => todo!(), + // Write backup file to path + save.write_to_path(&backup_path)?; } + + // Update raw save with edited save data + self.vm.update_save(&mut self.save_api.as_mut().unwrap())?; + + // Write save file to disk + self.save_api.as_mut().unwrap().write_to_path(path)?; + + Ok(()) } - fn open_file_dialog() -> Option { + /// Opens a file dialog intended for picking the path a save file. + pub(crate) fn open_file_dialog() -> Option { FileDialog::new() - .add_filter("SL2", &["sl2", "Regular Save File"]) - .add_filter("TXT", &["txt", "Save Wizard Exported TXT File"]) - .add_filter("*", &["*", "All files"]) - .set_directory("/") - .pick_file() - } - - fn save_file_dialog() -> Option { + .add_filter("SL2", &["sl2", "Regular Save File"]) + .add_filter("TXT", &["txt", "Save Wizard Exported TXT File"]) + .add_filter("*", &["*", "All files"]) + .set_directory("/") + .pick_file() + } + + /// Opens a file dialog intended for picking a path to where the opened save file will be written. + pub(crate) fn save_file_dialog() -> Option { FileDialog::new() - .add_filter("SL2", &["sl2", "Regular Save File"]) - .add_filter("TXT", &["txt", "Save Wizard Exported TXT File"]) - .add_filter("*", &["*", "Any format"]) - .set_directory("/") - .save_file() - } + .add_filter("SL2", &["sl2", "Regular Save File"]) + .add_filter("TXT", &["txt", "Save Wizard Exported TXT File"]) + .add_filter("*", &["*", "Any format"]) + .set_directory("/") + .save_file() + } } - impl eframe::App for App { fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { - ctx.set_zoom_factor(1.75); - // TOP PANEL - egui::TopBottomPanel::top("toolbar").default_height(35.).show(ctx, |ui| { - ui.columns(2, |uis|{ - uis[0].with_layout(Layout::left_to_right(Align::Center),| ui| { - if ui.button(egui::RichText::new(format!("{} open", egui_phosphor::regular::FOLDER_OPEN))).clicked() { - let files = Self::open_file_dialog(); - match files { - Some(path) => self.open(path), - None => {}, - } - } - if ui.button(egui::RichText::new(format!("{} save", egui_phosphor::regular::FLOPPY_DISK))).clicked() { - let files = Self::save_file_dialog(); - match files { - Some(path) => self.save(path), - None => {}, - } - } - }); - - uis[1].with_layout(Layout::right_to_left(egui::Align::Center),|ui| { - let import_button = egui::widgets::Button::new(egui::RichText::new(format!("{} Import Character", egui_phosphor::regular::DOWNLOAD_SIMPLE))); - if ui.add_enabled(!self.vm.steam_id.is_empty(), import_button).clicked() { - let files = Self::open_file_dialog(); - match files { - Some(path) => { - match Save::from_path(&path) { - Ok(save) => { - self.importer_vm = ImporterViewModel::new(save, &self.vm); - self.importer_open = true; - }, - Err(_) => {}, - } - }, - None => {}, - } - } - character_importer(ui, &mut self.importer_open, &mut self.importer_vm, &mut self.save, &mut self.vm); - }); - }); - - }); - - // TOP PANEL - egui::TopBottomPanel::top("top").show(ctx, |ui| { - if self.picked_path.exists() { - let save_type = match self.save.save_type { - SaveType::Unknown => { - "Platform: Unknown" - } - SaveType::PC(_) => { - "Platform: PC" - } - SaveType::PlayStation(_) => { - "Platform: Playstation" - }, - }; - - ui.columns(2,| uis| { - if self.vm.active.is_some_and(|valid| valid) { - egui::Frame::none().show(&mut uis[1], |ui| { - let steam_id_text_edit = egui::widgets::TextEdit::singleline(&mut self.vm.steam_id) - .char_limit(17) - .desired_width(125.); - ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { - ui.label(format!("Character: {}", self.vm.slots[self.vm.index].general_vm.character_name)); - - match self.save.save_type { - SaveType::Unknown => {}, - SaveType::PC(_) => { - let steam_id_text_edit = ui.add(steam_id_text_edit).labelled_by(ui.label("Steam Id:").id); - if steam_id_text_edit.hovered() { - egui::popup::show_tooltip(ui.ctx(), steam_id_text_edit.id, |ui|{ - ui.label(egui::RichText::new("Important: This needs to match the id of the steam account that will use this save!").size(8.0).color(Color32::PLACEHOLDER)); - }); - } - }, - SaveType::PlayStation(_) => {}, - }; - }); - }); - } - egui::Frame::none().show(&mut uis[0], |ui| { - ui.with_layout(egui::Layout::left_to_right(egui::Align::Center), |ui| { - ui.label(format!("{}",save_type)); - }); - }); - }); - } - }); - - // Character List Panel - if self.vm.active.is_some_and(|valid| valid) { - egui::SidePanel::left("characters").show(ctx, |ui| { - egui::ScrollArea::vertical() - .id_source("left") - .show(ui, |ui| { - ui.vertical(|ui| { - for i in 0..0xA { - if self.vm.profile_summary[i].active { - let button = ui.add_sized([120., 40.], egui::Button::new(&self.vm.slots[i].general_vm.character_name)); - if button.clicked() {self.vm.index = i;} - if self.vm.index == i {button.highlight();} - } - } - }) - }); - }); - - // Slot Section Panel - egui::SidePanel::left("slot_sections_menu").show(ctx, |ui| { - egui::ScrollArea::vertical() .id_source("left") .show(ui, |ui| { - ui.vertical(|ui| { - menu(ui, self); - }) - }); - }); - - // Main Content - egui::CentralPanel::default().show(ctx, |ui| { - match self.current_route { - Route::None => none(ui), - Route::General => general(ui, &mut self.vm), - Route::Stats => stats(ui, &mut self.vm), - Route::Equipment => equipment(ui, &mut self.vm), - Route::Inventory => inventory(ui, &mut self.vm), - Route::EventFlags => events(ui, &mut self.vm), - Route::Regions => regions(ui, &mut self.vm), - } + // TOOLBAR (open, save, import) + toolbar_top_panel(ctx, self); + + // Notifications (for updates getting notified about updates) + notifications(ctx, self); + + // Settings (for showing dlc items and editing the zoom factor for the application) + settings_bottom_panel(ctx, self); + + // Only runs when a valid save is open + if self.save_api.is_some() { + // INFO (platform, steam_id, char_name) + information_top_panel(ctx, self); + + // Save characters + character_list_side_panel(ctx, self); + + // Menu (stats, inventory, equip, etc...) + menu(ctx, self); + + // Main Content based on menu selection + egui::CentralPanel::default().show(ctx, |ui| match self.current_route { + Route::General => general(ui, &mut self.vm), + Route::Stats => stats(ui, &mut self.vm), + // Route::Equipment => equipment(ui, &mut self.vm), + Route::Inventory => inventory(ui, &mut self.vm), + Route::EventFlags => events(ui, &mut self.vm), + Route::Regions => regions(ui, &mut self.vm), + _ => none(ui), }); } - // No file loaded View + // File drop when no save is open else { - // Listen for dragged files and update path - egui::CentralPanel::default().show(ctx, |ui| { - // Check if hovering a file - let path = ctx.input(|i| { - if !i.raw.hovered_files.is_empty() { - let file = i.raw.hovered_files[0].clone(); - let path: std::path::PathBuf = file.path.expect("Error!"); - return path.into_os_string().into_string().expect(""); - } - "".to_string() - }); - - // Display indicator of hovering file - ui.centered_and_justified(|ui| { - if !path.is_empty() { - let painter = - ctx.layer_painter(LayerId::new(Order::Foreground, Id::new("file_drop_target"))); - - let screen_rect = ctx.screen_rect(); - painter.rect_filled(screen_rect, 0.0, Color32::from_black_alpha(96)); - ui.label(egui::RichText::new(path)); - } - else { - let style = Style::default(); - let mut layout_job = LayoutJob::default(); - if self.vm.active.is_some_and(|valid| !valid) { - RichText::new("Save file has irregular data!\n\n") - .color(Color32::DARK_RED) - .append_to( - &mut layout_job, - &style, - FontSelection::Default, - Align::Center, - ); - } - RichText::new("Drop a save file here or click 'Open' to browse") - .append_to( - &mut layout_job, - &style, - FontSelection::Default, - Align::Center, - ); - ui.label(layout_job); - } - }); - - // Check a file that has been dropped in the window - ctx.input(|i| { - if !i.raw.dropped_files.is_empty() { - let file = i.raw.dropped_files[0].clone(); - let path: std::path::PathBuf = file.path.expect("Error!"); - self.open(path); - } - }); - }); + file_drop_main_panel(ctx, self); } } } diff --git a/src/read/mod.rs b/src/read/mod.rs deleted file mode 100644 index d3d7132..0000000 --- a/src/read/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod read; \ No newline at end of file diff --git a/src/read/read.rs b/src/read/read.rs deleted file mode 100644 index 363a446..0000000 --- a/src/read/read.rs +++ /dev/null @@ -1,6 +0,0 @@ -use std::io; -use binary_reader::BinaryReader; - -pub trait Read where Self: Sized { - fn read(br: &mut BinaryReader) -> Result; -} \ No newline at end of file diff --git a/src/save/common/mod.rs b/src/save/common/mod.rs deleted file mode 100644 index 534968d..0000000 --- a/src/save/common/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub mod save_slot; -pub mod user_data_10; -pub mod user_data_11; diff --git a/src/save/common/save_slot.rs b/src/save/common/save_slot.rs deleted file mode 100644 index cfae923..0000000 --- a/src/save/common/save_slot.rs +++ /dev/null @@ -1,1810 +0,0 @@ -use std::io; -use binary_reader::BinaryReader; -use crate::{read::read::Read, write::write::Write}; - -#[derive(Clone)] -pub struct WorldAreaTime { - unk0: i32, - unk1: i32, - unk2: i32 -} - -impl Default for WorldAreaTime { - fn default() -> Self { - Self { unk0: Default::default(), unk1: Default::default(), unk2: Default::default() } - } -} - -impl Read for WorldAreaTime { - fn read(br: &mut BinaryReader) -> Result { - let mut world_area_time = WorldAreaTime::default(); - world_area_time.unk0 = br.read_i32()?; - world_area_time.unk1 = br.read_i32()?; - world_area_time.unk2 = br.read_i32()?; - Ok(world_area_time) - } -} - -impl Write for WorldAreaTime { - fn write(&self) -> Result, io::Error> { - let mut bytes: Vec = Vec::new(); - bytes.extend(self.unk0.to_le_bytes()); - bytes.extend(self.unk1.to_le_bytes()); - bytes.extend(self.unk2.to_le_bytes()); - Ok(bytes) - } -} - - -#[derive(Clone)] -pub struct WorldAreaWeather { - unk0: i32, - unk1: i32, - unk2: i32 -} - -impl Default for WorldAreaWeather { - fn default() -> Self { - Self { unk0: Default::default(), unk1: Default::default(), unk2: Default::default() } - } -} - -impl Read for WorldAreaWeather { - fn read(br: &mut BinaryReader) -> Result { - let mut world_area_weather = WorldAreaWeather::default(); - world_area_weather.unk0 = br.read_i32()?; - world_area_weather.unk1 = br.read_i32()?; - world_area_weather.unk2 = br.read_i32()?; - Ok(world_area_weather) - } -} - -impl Write for WorldAreaWeather { - fn write(&self) -> Result, io::Error> { - let mut bytes: Vec = Vec::new(); - bytes.extend(self.unk0.to_le_bytes()); - bytes.extend(self.unk1.to_le_bytes()); - bytes.extend(self.unk2.to_le_bytes()); - Ok(bytes) - } -} - - -#[derive(Clone)] -pub struct PlayerCoords { - pub player_coords: (f32, f32, f32), - pub map_id: [u8; 4], - _0x11: [u8; 0x11], - pub player_coords2: (f32, f32, f32), - _0x10: [u8; 0x10], -} - -impl Default for PlayerCoords { - fn default() -> Self { - Self { - player_coords: Default::default(), - map_id: Default::default(), - _0x11: Default::default(), - player_coords2: Default::default(), - _0x10: Default::default() - } - } -} - -impl Read for PlayerCoords { - fn read(br: &mut BinaryReader) -> Result { - let mut player_coords = PlayerCoords::default(); - player_coords.player_coords = (br.read_f32()?, br.read_f32()?, br.read_f32()?); - player_coords.map_id.copy_from_slice(br.read_bytes(4)?); - let _0x11 = br.read_bytes(0x11)?; - player_coords.player_coords2 = (br.read_f32()?, br.read_f32()?, br.read_f32()?); - let _0x10: &[u8] = br.read_bytes(0x10)?; - Ok(player_coords) - } -} - -impl Write for PlayerCoords { - fn write(&self) -> Result, io::Error> { - let mut bytes: Vec = Vec::new(); - bytes.extend(self.player_coords.0.to_le_bytes()); - bytes.extend(self.player_coords.1.to_le_bytes()); - bytes.extend(self.player_coords.2.to_le_bytes()); - bytes.extend(self.map_id); - bytes.extend(self._0x11); - bytes.extend(self.player_coords2.0.to_le_bytes()); - bytes.extend(self.player_coords2.1.to_le_bytes()); - bytes.extend(self.player_coords2.2.to_le_bytes()); - bytes.extend(self._0x10); - Ok(bytes) - } -} - -#[derive(Clone)] -struct UknownList { - length: i32, - elements: Vec -} - -impl Default for UknownList { - fn default() -> Self { - Self { length: Default::default(), elements: Default::default() } - } -} - -impl Read for UknownList { - fn read(br: &mut BinaryReader) -> Result { - let mut unk_list = UknownList::default(); - unk_list.length = br.read_i32()?; - for byte in br.read_bytes(unk_list.length as usize)?.iter() { - unk_list.elements.push(*byte); - } - Ok(unk_list) - } -} - -impl Write for UknownList { - fn write(&self) -> Result, io::Error> { - let mut bytes: Vec = Vec::new(); - bytes.extend(self.length.to_le_bytes()); - bytes.extend(self.elements.to_vec()); - Ok(bytes) - } -} - - -#[derive(Clone)] -pub struct GaItem2 { - pub id: u32, - pub unk: u32, - pub reinforce_type: u32, - pub unk1: u32, -} - -impl Default for GaItem2 { - fn default() -> Self { - Self { - id: Default::default(), - unk: Default::default(), - reinforce_type: Default::default(), - unk1: Default::default() - } - } -} - -impl Read for GaItem2 { - fn read(br: &mut BinaryReader) -> Result { - let mut ga_item = GaItem2::default(); - ga_item.id = br.read_u32()?; - ga_item.unk = br.read_u32()?; - ga_item.reinforce_type = br.read_u32()?; - ga_item.unk1 = br.read_u32()?; - Ok(ga_item) - } -} - -impl Write for GaItem2 { - fn write(&self) -> Result, io::Error> { - let mut bytes: Vec = Vec::new(); - bytes.extend(self.id.to_le_bytes()); - bytes.extend(self.unk.to_le_bytes()); - bytes.extend(self.reinforce_type.to_le_bytes()); - bytes.extend(self.unk1.to_le_bytes()); - Ok(bytes) - } -} - -#[derive(Clone)] -pub struct EventFlags { - pub flags: Vec -} - -impl Default for EventFlags { - fn default() -> Self { - Self { - flags: vec![Default::default(); 0x1bf99f] - } - } -} - -impl Read for EventFlags { - fn read(br: &mut BinaryReader) -> Result { - let mut event_flags = EventFlags::default(); - event_flags.flags.copy_from_slice(br.read_bytes(0x1bf99f)?); - Ok(event_flags) - } -} - -impl Write for EventFlags { - fn write(&self) -> Result, io::Error> { - let mut bytes: Vec = Vec::new(); - bytes.extend(self.flags.to_vec()); - Ok(bytes) - } -} - -#[derive(Clone)] -pub struct GaItemData { - pub distinct_aquired_items_count: i32, - pub unk1: i32, - pub ga_items: Vec -} - -impl Default for GaItemData { - fn default() -> Self { - Self { - distinct_aquired_items_count: Default::default(), - unk1: Default::default(), - ga_items: vec![GaItem2::default(); 0x1b58] - } - } -} - -impl Read for GaItemData { - fn read(br: &mut BinaryReader) -> Result { - let mut ga_item_data = GaItemData::default(); - ga_item_data.distinct_aquired_items_count = br.read_i32()?; - ga_item_data.unk1 = br.read_i32()?; - for i in 0..0x1b58 { - ga_item_data.ga_items[i] = GaItem2::read(br)?; - } - Ok(ga_item_data) - } -} - -impl Write for GaItemData { - fn write(&self) -> Result, io::Error> { - let mut bytes: Vec = Vec::new(); - bytes.extend(self.distinct_aquired_items_count.to_le_bytes()); - bytes.extend(self.unk1.to_le_bytes()); - - for i in 0..0x1b58 { - bytes.extend(self.ga_items[i].write()?); - } - Ok(bytes) - } -} - -#[derive(Clone)] -pub struct RideGameData { - horse_coords: (f32, f32, f32), - _0x4: i32, - _0x10: [u8; 0x10], - horse_hp: u32, - _0x4_1: u32, -} - -impl Default for RideGameData { - fn default() -> Self { - Self { - horse_coords: Default::default(), - _0x4: Default::default(), - _0x10: Default::default(), - horse_hp: Default::default(), - _0x4_1: Default::default() - } - } -} - -impl Read for RideGameData { - fn read(br: &mut BinaryReader) -> Result { - let mut ride_game_data = RideGameData::default(); - - ride_game_data.horse_coords = (br.read_f32()?, br.read_f32()?, br.read_f32()?); - - ride_game_data._0x4 = br.read_i32()?; - ride_game_data._0x10.copy_from_slice(br.read_bytes(0x10)?); - - ride_game_data.horse_hp = br.read_u32()?; - - ride_game_data._0x4_1 = br.read_u32()?; - - Ok(ride_game_data) - } -} - -impl Write for RideGameData { - fn write(&self) -> Result, io::Error> { - let mut bytes: Vec = Vec::new(); - bytes.extend(self.horse_coords.0.to_le_bytes()); - bytes.extend(self.horse_coords.1.to_le_bytes()); - bytes.extend(self.horse_coords.2.to_le_bytes()); - bytes.extend(self._0x4.to_le_bytes()); - bytes.extend(self._0x10); - bytes.extend(self.horse_hp.to_le_bytes()); - bytes.extend(self._0x4_1.to_le_bytes()); - Ok(bytes) - } -} - -#[derive(Clone)] -pub struct Regions { - pub unlocked_regions_count: u32, - pub unlocked_regions: Vec -} - -impl Default for Regions { - fn default() -> Self { - Self { unlocked_regions_count: Default::default(), unlocked_regions: Default::default() } - } -} - -impl Read for Regions { - fn read(br: &mut BinaryReader) -> Result { - let mut regions = Regions::default(); - - regions.unlocked_regions_count = br.read_u32()?; - - for _i in 0..regions.unlocked_regions_count as usize { - regions.unlocked_regions.push(br.read_u32()?); - } - - Ok(regions) - } -} - -impl Write for Regions { - fn write(&self) -> Result, io::Error> { - let mut bytes: Vec = Vec::new(); - - bytes.extend(self.unlocked_regions_count.to_le_bytes()); - - for i in 0..self.unlocked_regions_count as usize { - bytes.extend(self.unlocked_regions[i].to_le_bytes()); - } - - Ok(bytes) - } -} - -#[derive(Clone)] -pub struct EquipPhysicsData { - pub slot1: u32, - pub slot2: u32, -} - -impl Default for EquipPhysicsData { - fn default() -> Self { - Self { - slot1: Default::default(), - slot2: Default::default(), - } - } -} - -impl Read for EquipPhysicsData { - fn read(br: &mut BinaryReader) -> Result { - let mut equip_physics_data = EquipPhysicsData::default(); - - // Slot 1 - equip_physics_data.slot1 = br.read_u32()?; - - // Slot 2 - equip_physics_data.slot2 = br.read_u32()?; - - Ok(equip_physics_data) - } -} - -impl Write for EquipPhysicsData { - fn write(&self) -> Result, io::Error> { - let mut bytes: Vec = Vec::new(); - bytes.extend(self.slot1.to_le_bytes()); - bytes.extend(self.slot2.to_le_bytes()); - Ok(bytes) - } -} - -#[derive(Clone)] -pub struct EquipProjectile { - pub projectile_id: u32, - pub unk: i32, -} - -impl Default for EquipProjectile { - fn default() -> Self { - Self { - projectile_id: Default::default(), - unk: Default::default(), - } - } -} - -impl Read for EquipProjectile { - fn read(br: &mut BinaryReader) -> Result { - let mut equip_projectile = EquipProjectile::default(); - equip_projectile.projectile_id = br.read_u32()?; - equip_projectile.unk = br.read_i32()?; - Ok(equip_projectile) - } -} - -impl Write for EquipProjectile { - fn write(&self) -> Result, io::Error> { - let mut bytes: Vec = Vec::new(); - bytes.extend(self.projectile_id.to_le_bytes()); - bytes.extend(self.unk.to_le_bytes()); - Ok(bytes) - } -} - -#[derive(Clone)] -pub struct EquipProjectileData { - pub projectile_count: i32, - pub projectiles: Vec -} - -impl Default for EquipProjectileData { - fn default() -> Self { - Self { - projectile_count: Default::default(), - projectiles: vec![], - } - } -} -impl Read for EquipProjectileData { - fn read(br: &mut BinaryReader) -> Result { - let mut equip_projectile_data = EquipProjectileData::default(); - - // Distinct Projectile Count - equip_projectile_data.projectile_count = br.read_i32()?; - - // Quick slot items - for _i in 0..equip_projectile_data.projectile_count { - equip_projectile_data.projectiles.push(EquipProjectile::read(br)?); - } - - Ok(equip_projectile_data) - } -} -impl Write for EquipProjectileData { - fn write(&self) -> Result, io::Error> { - let mut bytes: Vec = Vec::new(); - - // Distinct Projectile Count - bytes.extend(self.projectile_count.to_le_bytes()); - - // Quick slot items - for i in 0..self.projectile_count as usize { - bytes.extend(self.projectiles[i].write()?); - } - - Ok(bytes) - } -} - -#[derive(Clone, Default)] -pub struct EquippedItems { - pub left_hand_armaments: [u32; 3], - pub right_hand_armaments: [u32; 3], - pub arrows: [u32; 2], - pub bolts: [u32; 2], - _unk1: u32, - _unk2: u32, - pub head: u32, - pub chest: u32, - pub arms: u32, - pub legs: u32, - _unk3: u32, - pub talismans: [u32; 4], - _unk4: u32, //Most likely covenant. - pub quickitems: [u32; 0xA], - pub pouch: [u32; 6], - _padding17: u32, -} -impl Read for EquippedItems { - fn read(br: &mut BinaryReader) -> Result { - let mut equipped_items = EquippedItems::default(); - equipped_items.left_hand_armaments[0] = br.read_u32()?; - equipped_items.right_hand_armaments[0] = br.read_u32()?; - equipped_items.left_hand_armaments[1] = br.read_u32()?; - equipped_items.right_hand_armaments[1] = br.read_u32()?; - equipped_items.left_hand_armaments[2] = br.read_u32()?; - equipped_items.right_hand_armaments[2] = br.read_u32()?; - equipped_items.arrows[0] = br.read_u32()?; - equipped_items.bolts[0] = br.read_u32()?; - equipped_items.arrows[1] = br.read_u32()?; - equipped_items.bolts[1] = br.read_u32()?; - equipped_items._unk1 = br.read_u32()?; - equipped_items._unk2 = br.read_u32()?; - equipped_items.head = br.read_u32()?; - equipped_items.chest = br.read_u32()?; - equipped_items.arms = br.read_u32()?; - equipped_items.legs = br.read_u32()?; - equipped_items._unk3 = br.read_u32()?; - for i in 0..4 { equipped_items.talismans[i] = br.read_u32()?; } - equipped_items._unk4 = br.read_u32()?; - for i in 0..0xA { equipped_items.quickitems[i] = br.read_u32()?; } - for i in 0..0x6 { equipped_items.pouch[i] = br.read_u32()?; } - equipped_items._padding17 = br.read_u32()?; - Ok(equipped_items) - } -} -impl Write for EquippedItems { - fn write(&self) -> Result, io::Error> { - let mut bytes: Vec = Vec::new(); - bytes.extend(self.left_hand_armaments[0].to_le_bytes()); - bytes.extend(self.right_hand_armaments[0].to_le_bytes()); - bytes.extend(self.left_hand_armaments[1].to_le_bytes()); - bytes.extend(self.right_hand_armaments[1].to_le_bytes()); - bytes.extend(self.left_hand_armaments[2].to_le_bytes()); - bytes.extend(self.right_hand_armaments[2].to_le_bytes()); - bytes.extend(self.arrows[0].to_le_bytes()); - bytes.extend(self.bolts[0].to_le_bytes()); - bytes.extend(self.arrows[1].to_le_bytes()); - bytes.extend(self.bolts[1].to_le_bytes()); - bytes.extend(self._unk1.to_le_bytes()); - bytes.extend(self._unk2.to_le_bytes()); - bytes.extend(self.head.to_le_bytes()); - bytes.extend(self.chest.to_le_bytes()); - bytes.extend(self.arms.to_le_bytes()); - bytes.extend(self.legs.to_le_bytes()); - bytes.extend(self._unk3.to_le_bytes()); - for i in 0..4 { bytes.extend(self.talismans[i].to_le_bytes()); } - bytes.extend(self._unk4.to_le_bytes()); - for i in 0..0xA { bytes.extend(self.quickitems[i].to_le_bytes()); } - for i in 0..0x6 { bytes.extend(self.pouch[i].to_le_bytes()); } - bytes.extend(self._padding17.to_le_bytes()); - Ok(bytes) - } -} - - -#[derive(Copy, Clone)] -pub struct EquipItem { - pub item_id: u32, - pub equipment_index: u32, -} - -impl Default for EquipItem { - fn default() -> Self { - Self { - item_id: Default::default(), - equipment_index: Default::default() - } - } -} - -impl Read for EquipItem { - fn read(br: &mut BinaryReader) -> Result { - let mut equip_item = EquipItem::default(); - equip_item.item_id = br.read_u32()?; - equip_item.equipment_index = br.read_u32()?; - Ok(equip_item) - } -} - -impl Write for EquipItem { - fn write(&self) -> Result, io::Error> { - let mut bytes: Vec = Vec::new(); - bytes.extend(self.item_id.to_le_bytes()); - bytes.extend(self.equipment_index.to_le_bytes()); - Ok(bytes) - } -} - -#[derive(Clone)] -pub struct EquipItemData { - pub quick_slot_items: Vec, - pub active_slot: i32, - pub pouch_items: Vec, - _0x8: [u8; 0x8], -} - -impl Default for EquipItemData { - fn default() -> Self { - Self { - quick_slot_items: vec![EquipItem::default(); 0xa], - active_slot: Default::default(), - pouch_items: vec![EquipItem::default(); 0x6], - _0x8: [0; 0x8] - } - } -} - -impl Read for EquipItemData { - fn read(br: &mut BinaryReader) -> Result { - let mut equip_item_data = EquipItemData::default(); - - // Quick slot items - for i in 0..0xa { - equip_item_data.quick_slot_items[i] = EquipItem::read(br)?; - } - - // Current active quickslot index - equip_item_data.active_slot = br.read_i32()?; - - // Pouch items - for i in 0..0x6 { - equip_item_data.pouch_items[i] = EquipItem::read(br)?; - } - - equip_item_data._0x8.copy_from_slice(br.read_bytes(0x8)?); - - Ok(equip_item_data) - } -} - -impl Write for EquipItemData { - fn write(&self) -> Result, io::Error> { - let mut bytes: Vec = Vec::new(); - - // Quick slot items - for i in 0..0xa { - bytes.extend(self.quick_slot_items[i].write()?); - } - - bytes.extend(self.active_slot.to_le_bytes()); - - // Pouch items - for i in 0..0x6 { - bytes.extend(self.pouch_items[i].write()?); - } - - bytes.extend(self._0x8); - - Ok(bytes) - } -} - -#[derive(Clone)] -pub struct EquipMagicSpell { - spell_id: i32, - unk: i32, -} - -impl Default for EquipMagicSpell { - fn default() -> Self { - Self { - spell_id: Default::default(), - unk: Default::default() - } - } -} - -impl Read for EquipMagicSpell { - fn read(br: &mut BinaryReader) -> Result { - let mut equip_magic_spell = EquipMagicSpell::default(); - equip_magic_spell.spell_id = br.read_i32()?; - equip_magic_spell.unk = br.read_i32()?; - Ok(equip_magic_spell) - } -} - -impl Write for EquipMagicSpell { - fn write(&self) -> Result, io::Error> { - let mut bytes: Vec = Vec::new(); - bytes.extend(self.spell_id.to_le_bytes()); - bytes.extend(self.unk.to_le_bytes()); - Ok(bytes) - } -} - -#[derive(Clone)] -pub struct EquipMagicData { - equip_magic_spells: Vec, - _0x10: [u8; 0x10], - active_slot: i32, -} - -impl Default for EquipMagicData { - fn default() -> Self { - Self { - equip_magic_spells: vec![EquipMagicSpell::default(); 0xc], - _0x10: [0x0; 0x10], - active_slot: Default::default() - } - } -} - -impl Read for EquipMagicData { - fn read(br: &mut BinaryReader) -> Result { - let mut equip_magic_data = EquipMagicData::default(); - - for i in 0..0xC { - equip_magic_data.equip_magic_spells[i] = EquipMagicSpell::read(br)?; - } - - equip_magic_data._0x10.copy_from_slice(br.read_bytes(0x10)?); - - equip_magic_data.active_slot = br.read_i32()?; - - Ok(equip_magic_data) - } -} - -impl Write for EquipMagicData { - fn write(&self) -> Result, io::Error> { - let mut bytes: Vec = Vec::new(); - for i in 0..0xC { - bytes.extend(self.equip_magic_spells[i].write()?); - } - bytes.extend(self._0x10); - bytes.extend(self.active_slot.to_le_bytes()); - Ok(bytes) - } -} - - -#[derive(Copy, Clone)] -pub struct EquipInventoryItem { - pub ga_item_handle: u32, - pub quantity: u32, - pub inventory_index: u32 -} - -impl Default for EquipInventoryItem { - fn default() -> Self { - Self { - ga_item_handle: Default::default(), - quantity: Default::default(), - inventory_index: Default::default() - } - } -} - -impl Read for EquipInventoryItem{ - fn read(br: &mut BinaryReader) -> Result { - let mut equip_inventory_item = EquipInventoryItem::default(); - - equip_inventory_item.ga_item_handle = br.read_u32()?; - equip_inventory_item.quantity = br.read_u32()?; - equip_inventory_item.inventory_index = br.read_u32()?; - - Ok(equip_inventory_item) - } -} - -impl Write for EquipInventoryItem { - fn write(&self) -> Result, io::Error> { - let mut bytes: Vec = Vec::new(); - - bytes.extend(self.ga_item_handle.to_le_bytes()); - bytes.extend(self.quantity.to_le_bytes()); - bytes.extend(self.inventory_index.to_le_bytes()); - - Ok(bytes) - } -} - - -#[derive(Clone)] -pub struct EquipInventoryData { - pub common_inventory_items_distinct_count: u32, - pub common_items: Vec, - pub key_inventory_items_distinct_count: u32, - pub key_items: Vec, - pub next_equip_index: u32, - pub next_acquisition_sort_id: u32, -} - -impl Default for EquipInventoryData { - fn default() -> Self { - Self { - common_inventory_items_distinct_count: Default::default(), - common_items: vec![], - key_inventory_items_distinct_count: Default::default(), - key_items: vec![], - next_equip_index: 0, - next_acquisition_sort_id: 0, - } - } -} - -impl EquipInventoryData { - fn read(br: &mut BinaryReader, length1: usize, length2: usize) -> Result { - let mut equip_inventory_data = EquipInventoryData::default(); - - equip_inventory_data.common_inventory_items_distinct_count = br.read_u32()?; - - for _i in 0..length1 { - equip_inventory_data.common_items.push(EquipInventoryItem::read(br)?); - } - - equip_inventory_data.key_inventory_items_distinct_count = br.read_u32()?; - - for _i in 0..length2 { - equip_inventory_data.key_items.push(EquipInventoryItem::read(br)?); - } - - equip_inventory_data.next_equip_index = br.read_u32()?; - equip_inventory_data.next_acquisition_sort_id = br.read_u32()?; - - Ok(equip_inventory_data) - } - - fn write(&self, length1: usize, length2: usize) -> Result, io::Error>{ - let mut bytes: Vec = Vec::new(); - - bytes.extend(self.common_inventory_items_distinct_count.to_le_bytes()); - - for i in 0..length1 { - bytes.extend(self.common_items[i].write()?); - } - - bytes.extend(self.key_inventory_items_distinct_count.to_le_bytes()); - - for i in 0..length2 { - bytes.extend(self.key_items[i].write()?); - } - - bytes.extend(self.next_equip_index.to_le_bytes()); - bytes.extend(self.next_acquisition_sort_id.to_le_bytes()); - - Ok(bytes) - } -} - -#[derive(Clone, Default)] -pub struct ChrAsm { - pub arm_style: u32, - pub left_hand_active_slot: u32, - pub right_hand_active_slot: u32, - pub left_arrow_active_slot: u32, - pub right_arrow_active_slot: u32, - pub left_bolt_active_slot: u32, - pub right_bolt_active_slot: u32, - pub left_hand_armaments: [u32; 3], - pub right_hand_armaments: [u32; 3], - pub arrows: [u32; 2], - pub bolts: [u32; 2], - pub _0x4: u32, - pub _0x4_1: u32, - pub head: u32, - pub chest: u32, - pub arms: u32, - pub legs: u32, - pub _0x4_2: u32, - pub talismans: [u32; 4], - pub unk: u32 -} - -impl Read for ChrAsm { - fn read(br: &mut BinaryReader) -> Result { - let mut chr_asm = ChrAsm::default(); - - chr_asm.arm_style = br.read_u32()?; - chr_asm.left_hand_active_slot = br.read_u32()?; - chr_asm.right_hand_active_slot = br.read_u32()?; - chr_asm.left_arrow_active_slot = br.read_u32()?; - chr_asm.right_arrow_active_slot = br.read_u32()?; - chr_asm.left_bolt_active_slot = br.read_u32()?; - chr_asm.right_bolt_active_slot = br.read_u32()?; - chr_asm.left_hand_armaments[0] = br.read_u32()?; - chr_asm.right_hand_armaments[0] = br.read_u32()?; - chr_asm.left_hand_armaments[1] = br.read_u32()?; - chr_asm.right_hand_armaments[1] = br.read_u32()?; - chr_asm.left_hand_armaments[2] = br.read_u32()?; - chr_asm.right_hand_armaments[2] = br.read_u32()?; - chr_asm.arrows[0] = br.read_u32()?; - chr_asm.bolts[0] = br.read_u32()?; - chr_asm.arrows[1] = br.read_u32()?; - chr_asm.bolts[1] = br.read_u32()?; - chr_asm._0x4 = br.read_u32()?; - chr_asm._0x4_1 = br.read_u32()?; - chr_asm.head = br.read_u32()?; - chr_asm.chest = br.read_u32()?; - chr_asm.arms = br.read_u32()?; - chr_asm.legs = br.read_u32()?; - chr_asm._0x4_2 = br.read_u32()?; - for i in 0..4 { chr_asm.talismans[i] = br.read_u32()?; } - chr_asm.unk = br.read_u32()?; - - Ok(chr_asm) - } -} - -impl Write for ChrAsm { - fn write(&self) -> Result, io::Error> { - let mut bytes: Vec = Vec::new(); - bytes.extend(self.arm_style.to_le_bytes()); - bytes.extend(self.left_hand_active_slot.to_le_bytes()); - bytes.extend(self.right_hand_active_slot.to_le_bytes()); - bytes.extend(self.left_arrow_active_slot.to_le_bytes()); - bytes.extend(self.right_arrow_active_slot.to_le_bytes()); - bytes.extend(self.left_bolt_active_slot.to_le_bytes()); - bytes.extend(self.right_bolt_active_slot.to_le_bytes()); - bytes.extend(self.left_hand_armaments[0].to_le_bytes()); - bytes.extend(self.right_hand_armaments[0].to_le_bytes()); - bytes.extend(self.left_hand_armaments[1].to_le_bytes()); - bytes.extend(self.right_hand_armaments[1].to_le_bytes()); - bytes.extend(self.left_hand_armaments[2].to_le_bytes()); - bytes.extend(self.right_hand_armaments[2].to_le_bytes()); - bytes.extend(self.arrows[0].to_le_bytes()); - bytes.extend(self.bolts[0].to_le_bytes()); - bytes.extend(self.arrows[1].to_le_bytes()); - bytes.extend(self.bolts[1].to_le_bytes()); - bytes.extend(self._0x4.to_le_bytes()); - bytes.extend(self._0x4_1.to_le_bytes()); - bytes.extend(self.head.to_le_bytes()); - bytes.extend(self.chest.to_le_bytes()); - bytes.extend(self.arms.to_le_bytes()); - bytes.extend(self.legs.to_le_bytes()); - bytes.extend(self._0x4_2.to_le_bytes()); - for i in 0..4 { bytes.extend(self.talismans[i].to_le_bytes()); } - bytes.extend(self.unk.to_le_bytes()); - Ok(bytes) - } -} - -#[derive(Clone, Default)] -pub struct ChrAsm2 { - pub left_hand_armaments: [u32; 3], - pub right_hand_armaments: [u32; 3], - pub arrows: [u32; 2], - pub bolts: [u32; 2], - _unk0: u32, - _unk1: u32, - pub head: u32, - pub chest: u32, - pub arms: u32, - pub legs: u32, - _unk2: u32, - pub talismans: [u32; 4], - _unk3: u32, -} - -impl Read for ChrAsm2 { - fn read(br: &mut BinaryReader) -> Result { - let mut chr_asm = ChrAsm2::default(); - chr_asm.left_hand_armaments[0] = br.read_u32()?; - chr_asm.right_hand_armaments[0] = br.read_u32()?; - chr_asm.left_hand_armaments[1] = br.read_u32()?; - chr_asm.right_hand_armaments[1] = br.read_u32()?; - chr_asm.left_hand_armaments[2] = br.read_u32()?; - chr_asm.right_hand_armaments[2] = br.read_u32()?; - chr_asm.arrows[0] = br.read_u32()?; - chr_asm.bolts[0] = br.read_u32()?; - chr_asm.arrows[1] = br.read_u32()?; - chr_asm.bolts[1] = br.read_u32()?; - chr_asm._unk0 = br.read_u32()?; - chr_asm._unk1 = br.read_u32()?; - chr_asm.head = br.read_u32()?; - chr_asm.chest = br.read_u32()?; - chr_asm.arms = br.read_u32()?; - chr_asm.legs = br.read_u32()?; - chr_asm._unk2 = br.read_u32()?; - for i in 0..4 { chr_asm.talismans[i] = br.read_u32()?; } - chr_asm._unk3 = br.read_u32()?; - Ok(chr_asm) - } -} - -impl Write for ChrAsm2 { - fn write(&self) -> Result, io::Error> { - let mut bytes: Vec = Vec::new(); - bytes.extend(self.left_hand_armaments[0].to_le_bytes()); - bytes.extend(self.right_hand_armaments[0].to_le_bytes()); - bytes.extend(self.left_hand_armaments[1].to_le_bytes()); - bytes.extend(self.right_hand_armaments[1].to_le_bytes()); - bytes.extend(self.left_hand_armaments[2].to_le_bytes()); - bytes.extend(self.right_hand_armaments[2].to_le_bytes()); - bytes.extend(self.arrows[0].to_le_bytes()); - bytes.extend(self.bolts[0].to_le_bytes()); - bytes.extend(self.arrows[1].to_le_bytes()); - bytes.extend(self.bolts[1].to_le_bytes()); - bytes.extend(self._unk0.to_le_bytes()); - bytes.extend(self._unk1.to_le_bytes()); - bytes.extend(self.head.to_le_bytes()); - bytes.extend(self.chest.to_le_bytes()); - bytes.extend(self.arms.to_le_bytes()); - bytes.extend(self.legs.to_le_bytes()); - bytes.extend(self._unk2.to_le_bytes()); - for i in 0..4 { bytes.extend(self.talismans[i].to_le_bytes()); } - bytes.extend(self._unk3.to_le_bytes()); - Ok(bytes) - } -} - -#[derive(Default, Clone)] -pub struct EquipData { - pub left_hand_armaments: [u32; 3], - pub right_hand_armaments: [u32; 3], - pub arrows: [u32; 2], - pub bolts: [u32; 2], - _0x4: u32, - _0x4_1: u32, - pub head: u32, - pub chest: u32, - pub arms: u32, - pub legs: u32, - _0x4_2: u32, - pub talismans: [u32; 4], - unk: u32, -} - -impl Read for EquipData { - fn read(br: &mut BinaryReader) -> Result { - let mut equip_data = EquipData::default(); - equip_data.left_hand_armaments[0] = br.read_u32()?; - equip_data.right_hand_armaments[0] = br.read_u32()?; - equip_data.left_hand_armaments[1] = br.read_u32()?; - equip_data.right_hand_armaments[1] = br.read_u32()?; - equip_data.left_hand_armaments[2] = br.read_u32()?; - equip_data.right_hand_armaments[2] = br.read_u32()?; - equip_data.arrows[0] = br.read_u32()?; - equip_data.bolts[0] = br.read_u32()?; - equip_data.arrows[1] = br.read_u32()?; - equip_data.bolts[1] = br.read_u32()?; - - equip_data._0x4 = br.read_u32()?; - equip_data._0x4_1 = br.read_u32()?; - - equip_data.head = br.read_u32()?; - equip_data.chest = br.read_u32()?; - equip_data.arms = br.read_u32()?; - equip_data.legs = br.read_u32()?; - - equip_data._0x4_2 = br.read_u32()?; - - for i in 0..4 { equip_data.talismans[i] = br.read_u32()?; } - equip_data.unk = br.read_u32()?; - - Ok(equip_data) - } -} - -impl Write for EquipData { - fn write(&self) -> Result, io::Error> { - let mut bytes: Vec = Vec::new(); - bytes.extend(self.left_hand_armaments[0].to_le_bytes()); - bytes.extend(self.right_hand_armaments[0].to_le_bytes()); - bytes.extend(self.left_hand_armaments[1].to_le_bytes()); - bytes.extend(self.right_hand_armaments[1].to_le_bytes()); - bytes.extend(self.left_hand_armaments[2].to_le_bytes()); - bytes.extend(self.right_hand_armaments[2].to_le_bytes()); - bytes.extend(self.arrows[0].to_le_bytes()); - bytes.extend(self.bolts[0].to_le_bytes()); - bytes.extend(self.arrows[1].to_le_bytes()); - bytes.extend(self.bolts[1].to_le_bytes()); - - bytes.extend(self._0x4.to_le_bytes()); - bytes.extend(self._0x4_1.to_le_bytes()); - - bytes.extend(self.head.to_le_bytes()); - bytes.extend(self.chest.to_le_bytes()); - bytes.extend(self.arms.to_le_bytes()); - bytes.extend(self.legs.to_le_bytes()); - - bytes.extend(self._0x4_2.to_le_bytes()); - - for i in 0..4 { bytes.extend(self.talismans[i].to_le_bytes()); } - bytes.extend(self.unk.to_le_bytes()); - Ok(bytes) - } -} - -#[derive(Clone)] -pub struct PlayerGameData { - _0x4: i32, - _0x4_1: i32, - pub health: u32, - pub max_health: u32, - pub base_max_health: u32, - pub fp: u32, - pub max_fp: u32, - pub base_max_fp: u32, - _0x4_2: i32, - pub sp: u32, - pub max_sp: u32, - pub base_max_sp: u32, - _0x4_3: i32, - pub vigor: u32, - pub mind: u32, - pub endurance: u32, - pub strength: u32, - pub dexterity: u32, - pub intelligence: u32, - pub faith: u32, - pub arcane: u32, - _0x4_4: i32, - _0x4_5: i32, - _0x4_6: i32, - pub level: u32, - pub souls: u32, - pub soulsmemory: u32, - _0x28: [u8; 0x28], - pub character_name: [u16; 0x10], - _0x2: [u8; 0x2], - pub gender: u8, - pub arche_type: u8, - _0x3_1: [u8; 0x3], - pub gift: u8, - _0x1e: [u8; 0x1e], - pub match_making_wpn_lvl: u8, - _0x35: [u8; 0x35], - pub password: [u8; 0x12], - pub group_password1: [u8; 0x12], - pub group_password2: [u8; 0x12], - pub group_password3: [u8; 0x12], - pub group_password4: [u8; 0x12], - pub group_password5: [u8; 0x12], - _unk: [u8; 0x34] -} - -impl Default for PlayerGameData { - fn default() -> Self { - Self { - _0x4: 0, - _0x4_1: 0, - health: Default::default(), - max_health: Default::default(), - base_max_health: Default::default(), - fp: Default::default(), - max_fp: Default::default(), - base_max_fp: Default::default(), - _0x4_2: 0, - sp: Default::default(), - max_sp: Default::default(), - base_max_sp: Default::default(), - _0x4_3: 0, - vigor: Default::default(), - mind: Default::default(), - endurance: Default::default(), - strength: Default::default(), - dexterity: Default::default(), - intelligence: Default::default(), - faith: Default::default(), - arcane: Default::default(), - _0x4_4: 0, - _0x4_5: 0, - _0x4_6: 0, - level: Default::default(), - souls: Default::default(), - soulsmemory: Default::default(), - _0x28: [0; 0x28], - character_name: [0;0x10], - _0x2: [0;0x2], - gender: 0, - arche_type: 0, - _0x3_1: [0;0x3], - gift:0, - _0x1e: [0; 0x1e], - match_making_wpn_lvl: 0, - _0x35: [0; 0x35], - password: Default::default(), - group_password1: Default::default(), - group_password2: Default::default(), - group_password3: Default::default(), - group_password4: Default::default(), - group_password5: Default::default(), - _unk: [0x0; 0x34] - } - } -} - -impl Read for PlayerGameData { - fn read(br: &mut BinaryReader) -> Result { - let mut player_game_data = PlayerGameData::default(); - - player_game_data._0x4 = br.read_i32()?; - player_game_data._0x4_1 = br.read_i32()?; - - // Health - player_game_data.health = br.read_u32()?; - player_game_data.max_health = br.read_u32()?; - player_game_data.base_max_health = br.read_u32()?; - - // FP - player_game_data.fp = br.read_u32()?; - player_game_data.max_fp = br.read_u32()?; - player_game_data.base_max_fp = br.read_u32()?; - - player_game_data._0x4_2 = br.read_i32()?; - - // SP - player_game_data.sp = br.read_u32()?; - player_game_data.max_sp = br.read_u32()?; - player_game_data.base_max_sp = br.read_u32()?; - - player_game_data._0x4_3 = br.read_i32()?; - - // Stats - player_game_data.vigor = br.read_u32()?; - player_game_data.mind = br.read_u32()?; - player_game_data.endurance = br.read_u32()?; - player_game_data.strength = br.read_u32()?; - player_game_data.dexterity = br.read_u32()?; - player_game_data.intelligence = br.read_u32()?; - player_game_data.faith = br.read_u32()?; - player_game_data.arcane = br.read_u32()?; - - player_game_data._0x4_4 = br.read_i32()?; - player_game_data._0x4_5 = br.read_i32()?; - player_game_data._0x4_6 = br.read_i32()?; - - // Level - player_game_data.level = br.read_u32()?; - - // Souls - player_game_data.souls = br.read_u32()?; - player_game_data.soulsmemory = br.read_u32()?; - - player_game_data._0x28.copy_from_slice(br.read_bytes(0x28)?); - - // Character Name - for i in 0..0x10 { - player_game_data.character_name[i] = br.read_u16()?; - } - - player_game_data._0x2.copy_from_slice(br.read_bytes(0x2)?); - - // Gender - player_game_data.gender = br.read_u8()?; - assert!(player_game_data.gender == 0 || player_game_data.gender == 1); - - // ArcheType - player_game_data.arche_type = br.read_u8()?; - - player_game_data._0x3_1.copy_from_slice(br.read_bytes(0x3)?); - - // Gift - player_game_data.gift = br.read_u8()?; - - player_game_data._0x1e.copy_from_slice(br.read_bytes(0x1e)?); - - // Weapon Match Making Level - player_game_data.match_making_wpn_lvl = br.read_u8()?; - - player_game_data._0x35.copy_from_slice(br.read_bytes(0x35)?); - - // Passwords - let password = br.read_bytes(0x12)?; - player_game_data.password.copy_from_slice(password); - - let group_password1 = br.read_bytes(0x12)?; - player_game_data.group_password1.copy_from_slice(group_password1); - - let group_password2 = br.read_bytes(0x12)?; - player_game_data.group_password2.copy_from_slice(group_password2); - - let group_password3 = br.read_bytes(0x12)?; - player_game_data.group_password3.copy_from_slice(group_password3); - - let group_password4 = br.read_bytes(0x12)?; - player_game_data.group_password4.copy_from_slice(group_password4); - - let group_password5 = br.read_bytes(0x12)?; - player_game_data.group_password5.copy_from_slice(group_password5); - - player_game_data._unk.copy_from_slice(br.read_bytes(0x34)?); - - Ok(player_game_data) - } -} - -impl Write for PlayerGameData { - fn write(&self) -> Result, io::Error> { - let mut bytes: Vec = Vec::new(); - - bytes.extend(self._0x4.to_le_bytes()); - bytes.extend(self._0x4_1.to_le_bytes()); - - // Health - bytes.extend(self.health.to_le_bytes()); - bytes.extend(self.max_health.to_le_bytes()); - bytes.extend(self.base_max_health.to_le_bytes()); - - // FP - bytes.extend(self.fp.to_le_bytes()); - bytes.extend(self.max_fp.to_le_bytes()); - bytes.extend(self.base_max_fp.to_le_bytes()); - - bytes.extend(self._0x4_2.to_le_bytes()); - - // SP - bytes.extend(self.sp.to_le_bytes()); - bytes.extend(self.max_sp.to_le_bytes()); - bytes.extend(self.base_max_sp.to_le_bytes()); - - bytes.extend(self._0x4_3.to_le_bytes()); - - // Stats - bytes.extend(self.vigor.to_le_bytes()); - bytes.extend(self.mind.to_le_bytes()); - bytes.extend(self.endurance.to_le_bytes()); - bytes.extend(self.strength.to_le_bytes()); - bytes.extend(self.dexterity.to_le_bytes()); - bytes.extend(self.intelligence.to_le_bytes()); - bytes.extend(self.faith.to_le_bytes()); - bytes.extend(self.arcane.to_le_bytes()); - - bytes.extend(self._0x4_4.to_le_bytes()); - bytes.extend(self._0x4_5.to_le_bytes()); - bytes.extend(self._0x4_6.to_le_bytes()); - - // Level - bytes.extend(self.level.to_le_bytes()); - - // Souls - bytes.extend(self.souls.to_le_bytes()); - bytes.extend(self.soulsmemory.to_le_bytes()); - - bytes.extend(self._0x28); - - // Character Name - for i in 0..0x10 { - bytes.extend(self.character_name[i].to_le_bytes()); - } - - bytes.extend(self._0x2); - - // Gender - bytes.push(self.gender); - - // ArcheType - bytes.push(self.arche_type); - - bytes.extend(self._0x3_1); - - // Gift - bytes.push(self.gift); - - bytes.extend(self._0x1e); - - // Weapon Match Making Level - bytes.push(self.match_making_wpn_lvl); - - bytes.extend(self._0x35); - - // Passwords - bytes.extend(self.password); - bytes.extend(self.group_password1); - bytes.extend(self.group_password2); - bytes.extend(self.group_password3); - bytes.extend(self.group_password4); - bytes.extend(self.group_password5); - - bytes.extend(self._unk); - - Ok(bytes) - } -} - -#[derive(Copy, Clone)] -pub struct GaItem { - pub gaitem_handle: u32, - pub item_id: u32, - pub unk2: i32, - pub unk3: i32, - pub aow_gaitem_handle: u32, - pub unk5: u8 -} - -impl Default for GaItem { - fn default() -> Self { - Self { - gaitem_handle: 0, - item_id: 0, - unk2: -1, - unk3: -1, - aow_gaitem_handle: u32::MAX, - unk5: 0 - } - } -} - -impl Read for GaItem { - fn read(br: &mut BinaryReader) -> Result { - let mut ga_item = GaItem::default(); - ga_item.gaitem_handle = br.read_u32()?; - ga_item.item_id = br.read_u32()?; - - // Weapon - if ga_item.item_id != 0 && (ga_item.item_id & 0xf0000000) == 0 { - ga_item.unk2 = br.read_i32()?; - ga_item.unk3 = br.read_i32()?; - ga_item.aow_gaitem_handle = br.read_u32()?; - ga_item.unk5 = br.read_bytes(1)?[0]; - } - // Armor - else if ga_item.item_id != 0 && (ga_item.item_id & 0xf0000000) == 0x10000000 { - ga_item.unk2 = br.read_i32()?; - ga_item.unk3 = br.read_i32()?; - } - - Ok(ga_item) - } -} - -impl Write for GaItem { - fn write(&self) -> Result, io::Error> { - let mut bytes: Vec = Vec::new(); - - bytes.extend(self.gaitem_handle.to_le_bytes()); - bytes.extend(self.item_id.to_le_bytes()); - - if self.item_id != 0 && (self.item_id & 0xf0000000) == 0 { - bytes.extend(self.unk2.to_le_bytes()); - bytes.extend(self.unk3.to_le_bytes()); - bytes.extend(self.aow_gaitem_handle.to_le_bytes()); - bytes.extend(self.unk5.to_le_bytes()); - } - else if self.item_id != 0 && (self.item_id & 0xf0000000) == 0x10000000 { - bytes.extend(self.unk2.to_le_bytes()); - bytes.extend(self.unk3.to_le_bytes()); - } - - Ok(bytes) - } -} - -#[derive(Clone)] -pub struct SaveSlot { - pub ver: u32, - pub map_id: [u8; 4], - _0x18: [u8; 0x18], - pub ga_items: Vec, - pub player_game_data: PlayerGameData, - _0xd0: [u8; 0xd0], - pub equip_data: EquipData, - pub chr_asm: ChrAsm, - pub chr_asm2: ChrAsm2, - pub equip_inventory_data: EquipInventoryData, - pub equip_magic_data: EquipMagicData, - pub equip_item_data: EquipItemData, - pub equip_gesture_data: [i32;0x6], - pub equip_projectile_data: EquipProjectileData, - pub equipped_items: EquippedItems, - pub equip_physics_data: EquipPhysicsData, - _0x4: u32, - _face_data: [u8;0x12f], - pub storage_inventory_data: EquipInventoryData, - pub gesture_game_data: Vec, - pub regions: Regions, - pub ride_game_data: RideGameData, - _0x1: u8, - _0x40: [u8;0x40], - _0x4_1: i32, - _0x4_2: i32, - _0x4_3: i32, - _menu_profile_save_load: [u8; 0x1008], - _trophy_equip_data: [u8; 0x34], - pub ga_item_data: GaItemData, - _tutorial_data: [u8;0x408], - _0x1d: [u8; 0x1d], - pub event_flags: EventFlags, - _0x1_1: u8, - _unk_lists: Vec, - pub player_coords: PlayerCoords, - _game_man_unkown_values: [u8; 0xf], - _0x1_2: u32, - _cs_net_data_chunks: Vec, - pub world_area_weather: WorldAreaWeather, - pub world_area_time: WorldAreaTime, - _0x10_1: [u8; 0x10], - pub steam_id: u64, - _cs_ps5_activity: [u8;0x20], - _cs_dlc: [u8;0x32], - _0x80: [u8;0x80], - _rest: Vec -} - -impl Default for SaveSlot { - fn default() -> Self { - Self { - ver: 0, - map_id: [0x0; 4], - _0x18: [0x0; 0x18], - ga_items: vec![GaItem::default(); 0x1400], - player_game_data: PlayerGameData::default(), - _0xd0: [0x0;0xd0], - equip_data: EquipData::default(), - chr_asm: ChrAsm::default(), - chr_asm2: ChrAsm2::default(), - equip_inventory_data: EquipInventoryData::default(), - equip_magic_data: EquipMagicData::default(), - equip_item_data: EquipItemData::default(), - equip_gesture_data: [Default::default(); 0x6], - equip_projectile_data: EquipProjectileData::default(), - equipped_items: EquippedItems::default(), - equip_physics_data: EquipPhysicsData::default(), - _0x4: 0, - _face_data: [0x0;0x12f], - storage_inventory_data: EquipInventoryData::default(), - gesture_game_data: vec![0; 0x40], - regions: Regions::default(), - ride_game_data: RideGameData::default(), - _0x1: 0, - _0x40: [0x0;0x40], - _0x4_1: 0, - _0x4_2: 0, - _0x4_3: 0, - _menu_profile_save_load: [0x0;0x1008], - _trophy_equip_data: [0x0;0x34], - event_flags: EventFlags::default(), - _0x1_1: 0, - ga_item_data: GaItemData::default(), - _tutorial_data: [0x0;0x408], - _0x1d: [0x0;0x1d], - _unk_lists: Vec::new(), - player_coords: PlayerCoords::default(), - _game_man_unkown_values: [0x0; 0xf], - _0x1_2: 0, - _cs_net_data_chunks: vec![0x0; 0x20000], - world_area_weather: WorldAreaWeather::default(), - world_area_time: WorldAreaTime::default(), - _0x10_1: [0x0; 0x10], - steam_id: Default::default(), - _cs_ps5_activity: [0x0;0x20], - _cs_dlc: [0x0; 0x32], - _0x80: [0x0;0x80], - _rest: Default::default(), - } - } -} - -impl Read for SaveSlot { - fn read(br: &mut BinaryReader) -> Result { - let mut save_slot = SaveSlot::default(); - - // Slot end position - let end = br.pos + 0x280000; - - // Unknown - save_slot.ver = br.read_u32()?; - - // MapId - save_slot.map_id.copy_from_slice(br.read_bytes(4)?); - - // Uknown - save_slot._0x18.copy_from_slice(br.read_bytes(0x18)?); - - // GaItem - for i in 0..0x1400 { - save_slot.ga_items[i] = GaItem::read(br)?; - } - - // Player Game Data (Health, Fp, Stats, etc...) - save_slot.player_game_data = PlayerGameData::read(br)?; - - save_slot._0xd0.copy_from_slice(br.read_bytes(0xd0)?); - - // Equip Data - save_slot.equip_data = EquipData::read(br)?; - - // Chr Asm - save_slot.chr_asm = ChrAsm::read(br)?; - - // Chr Asm2 - save_slot.chr_asm2 = ChrAsm2::read(br)?; - - // Equip Inventory Data - save_slot.equip_inventory_data = EquipInventoryData::read(br, 0xa80, 0x180)?; - - // Equip Magic Spell - save_slot.equip_magic_data = EquipMagicData::read(br)?; - - // Equip Item - save_slot.equip_item_data = EquipItemData::read(br)?; - - // Equipped Gestures - for i in 0..0x6 { - save_slot.equip_gesture_data[i] = br.read_i32()?; - } - - // Equipped Projectiles - save_slot.equip_projectile_data = EquipProjectileData::read(br)?; - - // Equip data again - save_slot.equipped_items = EquippedItems::read(br)?; - - // Equipped physics - save_slot.equip_physics_data = EquipPhysicsData::read(br)?; - - save_slot._0x4 = br.read_u32()?; - - // Face data (skipping it) - save_slot._face_data.copy_from_slice(br.read_bytes(0x12f)?); - - // Equip Inventory Data 2 - save_slot.storage_inventory_data = EquipInventoryData::read(br, 0x780, 0x80)?; - - // Equipped Gestures - for i in 0..0x40 { - save_slot.gesture_game_data[i] = br.read_i32()?; - } - - // Regions - save_slot.regions = Regions::read(br)?; - - // Horse Data - save_slot.ride_game_data = RideGameData::read(br)?; - - save_slot._0x1 = br.read_bytes(1)?[0]; - save_slot._0x40.copy_from_slice(br.read_bytes(0x40)?); - save_slot._0x4_1= br.read_i32()?; - save_slot._0x4_2= br.read_i32()?; - save_slot._0x4_3= br.read_i32()?; - - // Menu Profile Save Load (Skipping) - save_slot._menu_profile_save_load.copy_from_slice(br.read_bytes(0x1008)?); - - // Trophy Equip Data (Skipping) - save_slot._trophy_equip_data.copy_from_slice(br.read_bytes(0x34)?); - - // GaItems - save_slot.ga_item_data = GaItemData::read(br)?; - - // Tutorial Data (Skipping) - save_slot._tutorial_data.copy_from_slice(br.read_bytes(0x408)?); - - // Unknown values (Grouping and skipping) - save_slot._0x1d.copy_from_slice(br.read_bytes(0x1d)?); - - // Event Flags - save_slot.event_flags = EventFlags::read(br)?; - - save_slot._0x1_1 = br.read_bytes(1)?[0]; - - for _i in 0..0x5 { - save_slot._unk_lists.push(UknownList::read(br)?); - } - - // Player Coordinates - save_slot.player_coords = PlayerCoords::read(br)?; - - save_slot._game_man_unkown_values.copy_from_slice(br.read_bytes(0xf)?); - - save_slot._0x1_2 = br.read_u32()?; - // Value should always be 2 for active accounts. 0 for empty ones. - assert!(save_slot._0x1_2 == 2 || save_slot._0x1_2 == 0); - - save_slot._cs_net_data_chunks.copy_from_slice( br.read_bytes(0x20000)?); - - save_slot.world_area_weather = WorldAreaWeather::read(br)?; - save_slot.world_area_time = WorldAreaTime::read(br)?; - - save_slot._0x10_1.copy_from_slice(br.read_bytes(0x10)?); - - save_slot.steam_id = br.read_u64()?; - - // CSPS5Activity (Skipping) - save_slot._cs_ps5_activity.copy_from_slice(br.read_bytes(0x20)?); - - // DLC? - save_slot._cs_dlc.copy_from_slice(br.read_bytes(0x32)?); - - save_slot._0x80.copy_from_slice(br.read_bytes(0x80)?); - - save_slot._rest.extend(br.read_bytes(end - br.pos)?); - - Ok(save_slot) - } -} - -impl Write for SaveSlot { - fn write(&self) -> Result, io::Error> { - let mut bytes: Vec = Vec::new(); - - bytes.extend(self.ver.to_le_bytes()); - - // MapId - bytes.extend(self.map_id); - - bytes.extend(self._0x18); - - // GaItem - for i in 0..0x1400 { - bytes.extend(self.ga_items[i].write()?); - } - - // Player Game Data (Health, Fp, Stats, etc...) - bytes.extend(self.player_game_data.write()?); - - bytes.extend(self._0xd0); - - // Equip Data - bytes.extend(self.equip_data.write()?); - - // Chr Asm - bytes.extend(self.chr_asm.write()?); - - // Chr Asm2 - bytes.extend(self.chr_asm2.write()?); - - // Equip Inventory Data - bytes.extend(self.equip_inventory_data.write(0xa80, 0x180)?); - - // Equip Magic Spell - bytes.extend(self.equip_magic_data.write()?); - - // Equip Item - bytes.extend(self.equip_item_data.write()?); - - // Equipped Gestures - for i in 0..0x6 { - bytes.extend(self.equip_gesture_data[i].to_le_bytes()); - } - - // Equipped Projectiles - bytes.extend(self.equip_projectile_data.write()?); - - bytes.extend(self.equipped_items.write()?); - - // Equipped physics - bytes.extend(self.equip_physics_data.write()?); - - bytes.extend(self._0x4.to_le_bytes()); - - // Face Data (sliders) - bytes.extend(self._face_data); - - // Equip Inventory Data 2 - bytes.extend(self.storage_inventory_data.write(0x780, 0x80)?); - - // Equipped Gestures - for i in 0..0x40 { - bytes.extend(self.gesture_game_data[i].to_le_bytes()); - } - - // Regions - bytes.extend(self.regions.write()?); - - // Horse Data - bytes.extend(self.ride_game_data.write()?); - - bytes.push(self._0x1); - bytes.extend(self._0x40); - bytes.extend(self._0x4_1.to_le_bytes()); - bytes.extend(self._0x4_2.to_le_bytes()); - bytes.extend(self._0x4_3.to_le_bytes()); - - // Menu Profile Save Load - bytes.extend(self._menu_profile_save_load); - - // Trophy Equip Data (Skipping) - bytes.extend(self._trophy_equip_data); - - // GaItems - bytes.extend(self.ga_item_data.write()?); - - // Tutorial Data - bytes.extend(self._tutorial_data); - - // Unknown values - bytes.extend(self._0x1d); - - // Event Flags - bytes.extend(self.event_flags.write()?); - - bytes.push(self._0x1_1); - - for i in 0..0x5 as usize { - bytes.extend(self._unk_lists[i].write()?); - } - - // Player Coordinates - bytes.extend(self.player_coords.write()?); - - bytes.extend(self._game_man_unkown_values); - - bytes.extend(self._0x1_2.to_le_bytes()); - - // CSNetMan - bytes.extend(self._cs_net_data_chunks.to_vec()); - - // WorldAreaWeather - bytes.extend(self.world_area_weather.write()?); - - // WorldAreaTime - bytes.extend(self.world_area_time.write()?); - - bytes.extend(self._0x10_1); - - // Steam ID - bytes.extend(self.steam_id.to_le_bytes()); - - // CSPS5Activity - bytes.extend(self._cs_ps5_activity); - - // DLC - bytes.extend(self._cs_dlc); - - bytes.extend(self._0x80); - - // Empty calories - bytes.extend(vec![0;0x280000-bytes.len()]); - - Ok(bytes) - } -} \ No newline at end of file diff --git a/src/save/common/user_data_10.rs b/src/save/common/user_data_10.rs deleted file mode 100644 index 69642de..0000000 --- a/src/save/common/user_data_10.rs +++ /dev/null @@ -1,326 +0,0 @@ -// Common user_data_10 chunks that is in both PC and Playstation save -use std::io; -use binary_reader::BinaryReader; -use crate::{read::read::Read, write::write::Write}; - -pub struct CSMenuSystemSaveLoad { - unk: u32, - length: u32, - data: Vec -} - -impl Default for CSMenuSystemSaveLoad { - fn default() -> Self { - Self { unk: Default::default(), length: Default::default(), data: Default::default() } - } -} - -impl Read for CSMenuSystemSaveLoad { - fn read(br: &mut BinaryReader) -> Result { - let mut cs_menu_system_save_load = CSMenuSystemSaveLoad::default(); - cs_menu_system_save_load.unk = br.read_u32()?; - cs_menu_system_save_load.length = br.read_u32()?; - cs_menu_system_save_load.data.extend(br.read_bytes(cs_menu_system_save_load.length as usize)?); - Ok(cs_menu_system_save_load) - } -} - -impl Write for CSMenuSystemSaveLoad { - fn write(&self) -> Result, io::Error> { - let mut bytes: Vec = Vec::new(); - bytes.extend(self.unk.to_le_bytes()); - bytes.extend(self.length.to_le_bytes()); - bytes.extend(self.data.to_vec()); - Ok(bytes) - } -} - -#[derive(Default, Copy, Clone)] -pub struct ProfileSummaryEquipmentGaitem { - unk: u32, - unk1: u32, - pub arm_style: u32, - pub left_hand_active_slot: u32, - pub right_hand_active_slot: u32, - pub left_arrow_active_slot: u32, - pub right_arrow_active_slot: u32, - pub left_bolt_active_slot: u32, - pub right_bolt_active_slot: u32, - pub left_hand_armaments: [u32; 3], - pub right_hand_armaments: [u32; 3], - pub arrows: [u32; 2], - pub bolts: [u32; 2], - pub _0x4: u32, - pub head: u32, - pub chest: u32, - pub arms: u32, - pub legs: u32, - pub _0x4_2: u32, - pub talismans: [u32; 4], - pub _0x4_3: u32 -} -impl Read for ProfileSummaryEquipmentGaitem { - fn read(br: &mut BinaryReader) -> Result { - let mut equipment = ProfileSummaryEquipmentGaitem::default(); - equipment.unk = br.read_u32()?; - equipment.unk1 = br.read_u32()?; - - equipment.arm_style = br.read_u32()?; - equipment.left_hand_active_slot = br.read_u32()?; - equipment.right_hand_active_slot = br.read_u32()?; - equipment.left_arrow_active_slot = br.read_u32()?; - equipment.right_arrow_active_slot = br.read_u32()?; - equipment.left_bolt_active_slot = br.read_u32()?; - equipment.right_bolt_active_slot = br.read_u32()?; - equipment.left_hand_armaments[0] = br.read_u32()?; - equipment.right_hand_armaments[0] = br.read_u32()?; - equipment.left_hand_armaments[1] = br.read_u32()?; - equipment.right_hand_armaments[1] = br.read_u32()?; - equipment.left_hand_armaments[2] = br.read_u32()?; - equipment.right_hand_armaments[2] = br.read_u32()?; - equipment.arrows[0] = br.read_u32()?; - equipment.bolts[0] = br.read_u32()?; - equipment.arrows[1] = br.read_u32()?; - equipment.bolts[1] = br.read_u32()?; - equipment._0x4 = br.read_u32()?; - equipment.head = br.read_u32()?; - equipment.chest = br.read_u32()?; - equipment.arms = br.read_u32()?; - equipment.legs = br.read_u32()?; - equipment._0x4_2 = br.read_u32()?; - for i in 0..4 { equipment.talismans[i] = br.read_u32()?; } - equipment._0x4_3 = br.read_u32()?; - Ok(equipment) - } -} -impl Write for ProfileSummaryEquipmentGaitem { - fn write(&self) -> Result, io::Error> { - let mut bytes: Vec = Vec::new(); - - bytes.extend(self.unk.to_le_bytes()); - bytes.extend(self.unk1.to_le_bytes()); - - bytes.extend(self.arm_style.to_le_bytes()); - bytes.extend(self.left_hand_active_slot.to_le_bytes()); - bytes.extend(self.right_hand_active_slot.to_le_bytes()); - bytes.extend(self.left_arrow_active_slot.to_le_bytes()); - bytes.extend(self.right_arrow_active_slot.to_le_bytes()); - bytes.extend(self.left_bolt_active_slot.to_le_bytes()); - bytes.extend(self.right_bolt_active_slot.to_le_bytes()); - bytes.extend(self.left_hand_armaments[0].to_le_bytes()); - bytes.extend(self.right_hand_armaments[0].to_le_bytes()); - bytes.extend(self.left_hand_armaments[1].to_le_bytes()); - bytes.extend(self.right_hand_armaments[1].to_le_bytes()); - bytes.extend(self.left_hand_armaments[2].to_le_bytes()); - bytes.extend(self.right_hand_armaments[2].to_le_bytes()); - bytes.extend(self.arrows[0].to_le_bytes()); - bytes.extend(self.bolts[0].to_le_bytes()); - bytes.extend(self.arrows[1].to_le_bytes()); - bytes.extend(self.bolts[1].to_le_bytes()); - bytes.extend(self._0x4.to_le_bytes()); - bytes.extend(self.head.to_le_bytes()); - bytes.extend(self.chest.to_le_bytes()); - bytes.extend(self.arms.to_le_bytes()); - bytes.extend(self.legs.to_le_bytes()); - bytes.extend(self._0x4_2.to_le_bytes()); - for i in 0..4 { bytes.extend(self.talismans[i].to_le_bytes()); } - bytes.extend(self._0x4_3.to_le_bytes()); - Ok(bytes) - } -} - -#[derive(Default, Copy, Clone)] -pub struct ProfileSummaryEquipmentItem { - pub left_hand_armaments: [u32; 3], - pub right_hand_armaments: [u32; 3], - _0x4: u32, - pub arrows: [u32; 2], - pub bolts: [u32; 2], - _0x8: u64, - pub head: u32, - pub chest: u32, - pub arms: u32, - pub legs: u32, - _0x4_2: u32, - pub talismans: [u32; 4], - _0x4_3: [u32; 6] -} -impl Read for ProfileSummaryEquipmentItem { - fn read(br: &mut BinaryReader) -> Result { - let mut equipment = ProfileSummaryEquipmentItem::default(); - - equipment.left_hand_armaments[0] = br.read_u32()?; - equipment.right_hand_armaments[0] = br.read_u32()?; - equipment.left_hand_armaments[1] = br.read_u32()?; - equipment.right_hand_armaments[1] = br.read_u32()?; - equipment.left_hand_armaments[2] = br.read_u32()?; - equipment.right_hand_armaments[2] = br.read_u32()?; - equipment._0x4 = br.read_u32()?; - equipment.arrows[0] = br.read_u32()?; - equipment.bolts[0] = br.read_u32()?; - equipment.arrows[1] = br.read_u32()?; - equipment.bolts[1] = br.read_u32()?; - equipment._0x8 = br.read_u64()?; - equipment.head = br.read_u32()?; - equipment.chest = br.read_u32()?; - equipment.arms = br.read_u32()?; - equipment.legs = br.read_u32()?; - equipment._0x4_2 = br.read_u32()?; - - for i in 0..4 { equipment.talismans[i] = br.read_u32()?; } - for i in 0..6 { equipment._0x4_3[i] = br.read_u32()?; } - - Ok(equipment) - } -} -impl Write for ProfileSummaryEquipmentItem { - fn write(&self) -> Result, io::Error> { - let mut bytes: Vec = Vec::new(); - - bytes.extend(self.left_hand_armaments[0].to_le_bytes()); - bytes.extend(self.right_hand_armaments[0].to_le_bytes()); - bytes.extend(self.left_hand_armaments[1].to_le_bytes()); - bytes.extend(self.right_hand_armaments[1].to_le_bytes()); - bytes.extend(self.left_hand_armaments[2].to_le_bytes()); - bytes.extend(self.right_hand_armaments[2].to_le_bytes()); - bytes.extend(self._0x4.to_le_bytes()); - bytes.extend(self.arrows[0].to_le_bytes()); - bytes.extend(self.bolts[0].to_le_bytes()); - bytes.extend(self.arrows[1].to_le_bytes()); - bytes.extend(self.bolts[1].to_le_bytes()); - bytes.extend(self._0x8.to_le_bytes()); - bytes.extend(self.head.to_le_bytes()); - bytes.extend(self.chest.to_le_bytes()); - bytes.extend(self.arms.to_le_bytes()); - bytes.extend(self.legs.to_le_bytes()); - bytes.extend(self._0x4_2.to_le_bytes()); - for i in 0..4 { bytes.extend(self.talismans[i].to_le_bytes()); } - for i in 0..6 { bytes.extend(self._0x4_3[i].to_le_bytes()); } - Ok(bytes) - } -} - -#[derive(Copy, Clone)] -pub struct ProfileSummary{ - pub character_name: [u16; 0x11], - pub level: u32, - _0x28: u32 , - _0x2c: u32 , - _0x30: u32 , - _0x34: u32 , - _0x38_0x150: u32 , - _0x38_0x8: [u8;0x120] , - pub equipment_gaitem: ProfileSummaryEquipmentGaitem, - pub equipment_item: ProfileSummaryEquipmentItem, - _0x290: u8 , - _0x291: u8 , - _0x292: u8 , - _0x293: u8 , - _0x294: u8 , - _0x295: u8 , - _0x298: i32 , -} - -impl Default for ProfileSummary { - fn default() -> Self { - Self { - character_name: [0x0; 0x11], - level: 0, - _0x28: 0, - _0x2c: 0, - _0x30: 0, - _0x34: 0, - _0x38_0x150: 0, - _0x38_0x8: [0x0; 0x120], - equipment_gaitem: Default::default(), - equipment_item: Default::default(), - _0x290: 0, - _0x291: 0, - _0x292: 0, - _0x293: 0, - _0x294: 0, - _0x295: 0, - _0x298: 0, - } - } -} - -impl Read for ProfileSummary { - fn read(br: &mut BinaryReader) -> Result { - let mut profile_summary = ProfileSummary::default(); - for i in 0..0x11 { profile_summary.character_name[i] = br.read_u16()?;} - profile_summary.level = br.read_u32()?; - profile_summary._0x28 = br.read_u32()?; - profile_summary._0x2c = br.read_u32()?; - profile_summary._0x30 = br.read_u32()?; - profile_summary._0x34 = br.read_u32()?; - profile_summary._0x38_0x150 = br.read_u32()?; - profile_summary._0x38_0x8.copy_from_slice(br.read_bytes(0x120)?); - profile_summary.equipment_gaitem = ProfileSummaryEquipmentGaitem::read(br)?; - profile_summary.equipment_item = ProfileSummaryEquipmentItem::read(br)?; - profile_summary._0x290 = br.read_u8()?; - profile_summary._0x291 = br.read_u8()?; - profile_summary._0x292 = br.read_u8()?; - profile_summary._0x293 = br.read_u8()?; - profile_summary._0x294 = br.read_u8()?; - profile_summary._0x295 = br.read_u8()?; - profile_summary._0x298 = br.read_i32()?; - Ok(profile_summary) - } -} - -impl Write for ProfileSummary{ - fn write(&self) -> Result, io::Error> { - let mut bytes: Vec = Vec::new(); - for i in 0..0x11 { bytes.extend(self.character_name[i].to_le_bytes());} - bytes.extend(self.level.to_le_bytes()); - bytes.extend(self._0x28.to_le_bytes()); - bytes.extend(self._0x2c.to_le_bytes()); - bytes.extend(self._0x30.to_le_bytes()); - bytes.extend(self._0x34.to_le_bytes()); - bytes.extend(self._0x38_0x150.to_le_bytes()); - bytes.extend(self._0x38_0x8); - bytes.extend(self.equipment_gaitem.write()?); - bytes.extend(self.equipment_item.write()?); - bytes.push(self._0x290); - bytes.push(self._0x291); - bytes.push(self._0x292); - bytes.push(self._0x293); - bytes.push(self._0x294); - bytes.push(self._0x295); - bytes.extend(self._0x298.to_le_bytes()); - Ok(bytes) - } -} - - -#[derive(Clone)] - -pub struct CSKeyConfigSaveLoad { - length: i32, - elements: Vec -} - -impl Default for CSKeyConfigSaveLoad { - fn default() -> Self { - Self { length: Default::default(), elements: Default::default() } - } -} - -impl Read for CSKeyConfigSaveLoad { - fn read(br: &mut BinaryReader) -> Result { - let mut cs_key_config_save_load = CSKeyConfigSaveLoad::default(); - cs_key_config_save_load.length = br.read_i32()?; - cs_key_config_save_load.elements.extend(br.read_bytes(cs_key_config_save_load.length as usize)?); - Ok(cs_key_config_save_load) - } -} - -impl Write for CSKeyConfigSaveLoad { - fn write(&self) -> Result, io::Error> { - let mut bytes: Vec = Vec::new(); - bytes.extend(self.length.to_le_bytes()); - bytes.extend(self.elements.to_vec()); - Ok(bytes) - } -} \ No newline at end of file diff --git a/src/save/common/user_data_11.rs b/src/save/common/user_data_11.rs deleted file mode 100644 index 352e647..0000000 --- a/src/save/common/user_data_11.rs +++ /dev/null @@ -1,41 +0,0 @@ -use std::io::Error; -use binary_reader::BinaryReader; -use crate::write::write::Write; -use crate::read::read::Read; - -pub struct UserData11 { - unk: [u8;0x10], - pub regulation: Vec, - rest: Vec, -} - -impl Default for UserData11 { - fn default() -> Self { - Self { - unk: Default::default(), - regulation: vec![0; 0x1e9fb0], - rest: vec![0;0x56050] - } - } -} - -impl Read for UserData11 { - fn read(br: &mut BinaryReader) -> Result { - let mut user_data_11 = UserData11::default(); - user_data_11.unk.copy_from_slice(br.read_bytes(0x10)?); - user_data_11.regulation.copy_from_slice(br.read_bytes(0x1e9fb0)?); - user_data_11.rest.copy_from_slice(br.read_bytes(0x56050)?); - assert_eq!(user_data_11.rest[0], 0); - Ok(user_data_11) - } -} - -impl Write for UserData11 { - fn write(&self) -> Result, Error> { - let mut bytes: Vec = Vec::new(); - bytes.extend(self.unk); - bytes.extend(self.regulation.to_vec()); - bytes.extend(self.rest.to_vec()); - Ok(bytes) - } -} \ No newline at end of file diff --git a/src/save/mod.rs b/src/save/mod.rs deleted file mode 100644 index ed30b41..0000000 --- a/src/save/mod.rs +++ /dev/null @@ -1,4 +0,0 @@ -pub mod common; -mod pc; -mod playstation; -pub mod save; diff --git a/src/save/pc/mod.rs b/src/save/pc/mod.rs deleted file mode 100644 index 99e8654..0000000 --- a/src/save/pc/mod.rs +++ /dev/null @@ -1,5 +0,0 @@ -mod save_header; -mod save_slot; -mod user_data_10; -mod user_data_11; -pub mod pc_save; \ No newline at end of file diff --git a/src/save/pc/pc_save.rs b/src/save/pc/pc_save.rs deleted file mode 100644 index 540be26..0000000 --- a/src/save/pc/pc_save.rs +++ /dev/null @@ -1,54 +0,0 @@ -use std::io; -use binary_reader::BinaryReader; -use crate::{read::read::Read, write::write::Write}; -use super::{save_header::SaveHeader, save_slot::PCSaveSlot, user_data_10::UserData10, user_data_11::PcUserData11}; - -pub struct PCSave { - pub header: SaveHeader, - pub save_slots: Vec, - pub user_data_10: UserData10, - pub user_data_11: PcUserData11 -} -impl Default for PCSave { - fn default() -> Self { - Self { - header: SaveHeader::default(), - save_slots: vec![PCSaveSlot::default(); 0xA], - user_data_10: UserData10::default(), - user_data_11: PcUserData11::default() - } - } -} -impl Read for PCSave { - fn read(br: &mut BinaryReader) -> Result { - let mut save = PCSave::default(); - - save.header = SaveHeader::read(br)?; - - for i in 0..0xA { - save.save_slots[i] = PCSaveSlot::read(br)?; - } - - save.user_data_10 = UserData10::read(br)?; - save.user_data_11 = PcUserData11::read(br)?; - - Ok(save) - } -} -impl Write for PCSave { - fn write(&self) -> Result, io::Error> { - let mut bytes: Vec = Vec::new(); - - // Header - bytes.extend(self.header.write()?); - - for i in 0..0xA { - bytes.extend(self.save_slots[i].write()?) - } - - bytes.extend(self.user_data_10.write()?); - bytes.extend(self.user_data_11.write()?); - - Ok(bytes) - } -} diff --git a/src/save/pc/save_header.rs b/src/save/pc/save_header.rs deleted file mode 100644 index 040692d..0000000 --- a/src/save/pc/save_header.rs +++ /dev/null @@ -1,29 +0,0 @@ -use std::io; -use binary_reader::BinaryReader; - -use crate::{read::read::Read, write::write::Write}; - -pub struct SaveHeader { - pub data: Vec, -} - -impl Default for SaveHeader { - fn default() -> Self { - Self { - data: vec![Default::default();0x300], - } - } -} -impl Read for SaveHeader { - fn read(br: &mut BinaryReader) -> Result { - let mut header = SaveHeader::default(); - header.data.copy_from_slice(br.read_bytes(0x300)?); - Ok(header) - } -} - -impl Write for SaveHeader { - fn write(&self) -> Result, io::Error> { - Ok(self.data.clone()) - } -} \ No newline at end of file diff --git a/src/save/pc/save_slot.rs b/src/save/pc/save_slot.rs deleted file mode 100644 index 0529c51..0000000 --- a/src/save/pc/save_slot.rs +++ /dev/null @@ -1,50 +0,0 @@ -use crate::{read::read::Read, save::common::save_slot::SaveSlot, write::write::Write}; - -#[derive(Clone)] -pub struct PCSaveSlot { - pub checksum: [u8; 0x10], - pub save_slot: SaveSlot, -} - -impl Default for PCSaveSlot{ - fn default() -> Self { - Self { - checksum: [0x0; 0x10], - save_slot: SaveSlot::default() - } - } -} - -impl Read for PCSaveSlot { - fn read(br: &mut binary_reader::BinaryReader) -> Result { - let mut pc_save_slot = PCSaveSlot::default(); - - // Checksum - pc_save_slot.checksum.copy_from_slice(br.read_bytes(0x10)?); - - // Rest of the save slot - pc_save_slot.save_slot = SaveSlot::read(br)?; - - Ok(pc_save_slot) - } -} - -impl Write for PCSaveSlot { - fn write(&self) -> Result, std::io::Error> { - let mut bytes: Vec = Vec::new(); - - // Get save slot bytes - let save_slot_bytes = self.save_slot.write()?; - - // Calculate checksum - let digest = md5::compute(&save_slot_bytes); - - // Add Checksum - bytes.extend(digest.iter().collect::>()); - - // Add the rest of the save slot - bytes.extend(save_slot_bytes); - - Ok(bytes) - } -} diff --git a/src/save/pc/user_data_10.rs b/src/save/pc/user_data_10.rs deleted file mode 100644 index 5926824..0000000 --- a/src/save/pc/user_data_10.rs +++ /dev/null @@ -1,164 +0,0 @@ -use std::io; -use binary_reader::BinaryReader; - -use crate::{read::read::Read, save::common::user_data_10::{CSKeyConfigSaveLoad, CSMenuSystemSaveLoad, ProfileSummary}, write::write::Write}; - - -#[derive(Copy, Clone)] -pub struct PCOptionData { - _0x12: [u16; 0x9], - _0xa0: [u8; 0xA0], -} - -impl Default for PCOptionData { - fn default() -> Self { - Self { - _0x12: [0x0;0x9], - _0xa0: [0x0;0xa0] - } - } -} - -impl Read for PCOptionData { - fn read(br: &mut BinaryReader) -> Result { - let mut pc_option_data = PCOptionData::default(); - - for i in 0..pc_option_data._0x12.len() { - pc_option_data._0x12[i] = br.read_u16()?; - } - - pc_option_data._0xa0.copy_from_slice(br.read_bytes(0xa0)?); - - Ok(pc_option_data) - } -} - -impl Write for PCOptionData { - fn write(&self) -> Result, io::Error> { - let mut bytes: Vec = Vec::new(); - for i in 0..self._0x12.len() { - bytes.extend(self._0x12[i].to_le_bytes()); - } - bytes.extend(self._0xa0); - Ok(bytes) - } -} - -pub struct UserData10 { - pub checksum: [u8; 0x10], - _0x19003b4: i32, - pub steam_id: u64, - _0x19004fc: [u8; 0x140], - _cs_menu_system_save_load: CSMenuSystemSaveLoad, - pub active_slot: [bool; 0xA], - pub profile_summary: Vec, - _0x1903406: i32, - _0x190340a: u8, - _pc_option_data: PCOptionData, - _cs_key_config_save_load: CSKeyConfigSaveLoad, - _0x8: u64, - _rest: Vec -} - -impl Default for UserData10 { - fn default() -> Self { - Self { - checksum: [0; 0x10], - _0x19003b4: 0, - steam_id: 0, - _0x19004fc: [0; 0x140], - _cs_menu_system_save_load: CSMenuSystemSaveLoad::default(), - active_slot: [false; 0xA], - profile_summary: vec![ProfileSummary::default(); 0xA], - _0x1903406: 0, - _0x190340a: 0, - _pc_option_data: PCOptionData::default(), - _cs_key_config_save_load: CSKeyConfigSaveLoad::default(), - _0x8: 0, - _rest: Vec::new(), - } - } -} - -impl UserData10 { - pub fn read(br: &mut BinaryReader) -> Result { - let mut user_data_10 = UserData10::default(); - - let end = br.pos + 0x60010; - - // Checksum - user_data_10.checksum.copy_from_slice(br.read_bytes(0x10)?); - - user_data_10._0x19003b4 = br.read_i32()?; - - // Steam ID - user_data_10.steam_id = br.read_u64()?; - - user_data_10._0x19004fc.copy_from_slice(br.read_bytes(0x140)?); - - user_data_10._cs_menu_system_save_load = CSMenuSystemSaveLoad::read(br)?; - - for i in 0..0xA { - let slot_active = br.read_bytes(1)?[0]; - assert!(slot_active == 0x1 || slot_active == 0x0); - user_data_10.active_slot[i] = slot_active == 0x1; - } - - for i in 0..0xA { - let profile_summary = ProfileSummary::read(br)?; - user_data_10.profile_summary[i] = profile_summary; - } - - user_data_10._0x1903406 = br.read_i32()?; - user_data_10._0x190340a = br.read_bytes(0x1)?[0]; - user_data_10._pc_option_data = PCOptionData::read(br)?; - user_data_10._cs_key_config_save_load = CSKeyConfigSaveLoad::read(br)?; - user_data_10._0x8 = br.read_u64()?; - - user_data_10._rest.extend(br.read_bytes(end - br.pos)?); - - Ok(user_data_10) - } -} - -impl Write for UserData10 { - fn write(&self) -> Result, io::Error> { - let mut bytes: Vec = Vec::new(); - - // Checksum - bytes.extend(self.checksum); - - bytes.extend(self._0x19003b4.to_le_bytes()); - - // Steam ID - bytes.extend(self.steam_id.to_le_bytes()); - - bytes.extend(self._0x19004fc); - - bytes.extend(self._cs_menu_system_save_load.write()?); - - // Active Slots list - bytes.extend(self.active_slot.iter().map(|a| if *a {1} else {0}).collect::>()); - - // Profile Summaries - for i in 0..0xA { - bytes.extend(self.profile_summary[i].write()?); - } - - bytes.extend(self._0x1903406.to_le_bytes()); - bytes.extend(self._0x190340a.to_le_bytes()); - - bytes.extend(self._pc_option_data.write()?); - bytes.extend(self._cs_key_config_save_load.write()?); - bytes.extend(self._0x8.to_le_bytes()); - bytes.extend(self._rest.to_vec()); - - // Recalculate checksum at the end - let digest = md5::compute(&bytes[0x10..bytes.len()]); - for i in 0..0x10 { - bytes[i] = digest[i]; - } - - Ok(bytes) - } -} \ No newline at end of file diff --git a/src/save/pc/user_data_11.rs b/src/save/pc/user_data_11.rs deleted file mode 100644 index 6e576da..0000000 --- a/src/save/pc/user_data_11.rs +++ /dev/null @@ -1,49 +0,0 @@ -use crate::{read::read::Read, save::common::user_data_11::UserData11, write::write::Write}; - -pub struct PcUserData11 { - pub checksum: [u8; 0x10], - pub user_data_11: UserData11, -} - -impl Default for PcUserData11{ - fn default() -> Self { - Self { - checksum: [0x0; 0x10], - user_data_11: UserData11::default() - } - } -} - -impl Read for PcUserData11 { - fn read(br: &mut binary_reader::BinaryReader) -> Result { - let mut pc_user_data_11 = PcUserData11::default(); - - // Checksum - pc_user_data_11.checksum.copy_from_slice(br.read_bytes(0x10)?); - - // Rest of the UserData11 - pc_user_data_11.user_data_11 = UserData11::read(br)?; - - Ok(pc_user_data_11) - } -} - -impl Write for PcUserData11 { - fn write(&self) -> Result, std::io::Error> { - let mut bytes: Vec = Vec::new(); - - // Get UserData11 bytes - let user_data_11_bytes = self.user_data_11.write()?; - - // Calculate checksum - let digest = md5::compute(&user_data_11_bytes); - - // Add Checksum - bytes.extend(digest.iter().collect::>()); - - // Add the rest of the save slot - bytes.extend(user_data_11_bytes); - - Ok(bytes) - } -} diff --git a/src/save/playstation/mod.rs b/src/save/playstation/mod.rs deleted file mode 100644 index fd6178a..0000000 --- a/src/save/playstation/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -mod save_header; -mod user_data_10; -pub mod ps_save; \ No newline at end of file diff --git a/src/save/playstation/ps_save.rs b/src/save/playstation/ps_save.rs deleted file mode 100644 index 0e92576..0000000 --- a/src/save/playstation/ps_save.rs +++ /dev/null @@ -1,55 +0,0 @@ -use std::io; -use binary_reader::BinaryReader; -use crate::{read::read::Read, save::common::{save_slot::SaveSlot, user_data_11::UserData11}, write::write::Write}; -use super::{save_header::SaveHeader, user_data_10::UserData10}; - - -pub struct PSSave { - pub header: SaveHeader, - pub save_slots: Vec, - pub user_data_10: UserData10, - pub user_data_11: UserData11 -} -impl Default for PSSave { - fn default() -> Self { - Self { - header: Default::default(), - save_slots: vec![SaveSlot::default(); 0xA], - user_data_10: UserData10::default(), - user_data_11: UserData11::default() - } - } -} -impl Read for PSSave { - fn read(br: &mut BinaryReader) -> Result { - let mut save = PSSave::default(); - - save.header = SaveHeader::read(br)?; - - for i in 0..0xA { - save.save_slots[i] = SaveSlot::read(br)?; - } - - save.user_data_10 = UserData10::read(br)?; - save.user_data_11 = UserData11::read(br)?; - - Ok(save) - } -} -impl Write for PSSave { - fn write(&self) -> Result, io::Error> { - let mut bytes: Vec = Vec::new(); - - // Header - bytes.extend(self.header.write()?); - - for i in 0..0xA { - bytes.extend(self.save_slots[i].write()?) - } - - bytes.extend(self.user_data_10.write()?); - bytes.extend(self.user_data_11.write()?); - - Ok(bytes) - } -} \ No newline at end of file diff --git a/src/save/playstation/save_header.rs b/src/save/playstation/save_header.rs deleted file mode 100644 index 941b32e..0000000 --- a/src/save/playstation/save_header.rs +++ /dev/null @@ -1,29 +0,0 @@ -use std::io; -use binary_reader::BinaryReader; - -use crate::{read::read::Read, write::write::Write}; - -pub struct SaveHeader { - pub data: Vec, -} - -impl Default for SaveHeader { - fn default() -> Self { - Self { - data: vec![Default::default();0x70], - } - } -} -impl Read for SaveHeader { - fn read(br: &mut BinaryReader) -> Result { - let mut header = SaveHeader::default(); - header.data.copy_from_slice(br.read_bytes(0x70)?); - Ok(header) - } -} - -impl Write for SaveHeader { - fn write(&self) -> Result, io::Error> { - Ok(self.data.clone()) - } -} \ No newline at end of file diff --git a/src/save/playstation/user_data_10.rs b/src/save/playstation/user_data_10.rs deleted file mode 100644 index 325d1cf..0000000 --- a/src/save/playstation/user_data_10.rs +++ /dev/null @@ -1,105 +0,0 @@ -use std::io; -use binary_reader::BinaryReader; - -use crate::{read::read::Read, save::common::user_data_10::{CSKeyConfigSaveLoad, CSMenuSystemSaveLoad, ProfileSummary}, write::write::Write}; - -pub struct UserData10 { - _0x19003b4: i32, - pub steam_id: u64, - _0x19004fc: [u8; 0x140], - _cs_menu_system_save_load: CSMenuSystemSaveLoad, - pub active_slot: [bool; 0xA], - pub profile_summary: Vec, - _0x1903406: i32, - _0x190340a: u8, - _cs_key_config_save_load: CSKeyConfigSaveLoad, - _0x8: u64, - _rest: Vec -} - -impl Default for UserData10 { - fn default() -> Self { - Self { - _0x19003b4: 0, - steam_id: 0, - _0x19004fc: [0; 0x140], - _cs_menu_system_save_load: CSMenuSystemSaveLoad::default(), - active_slot: [false; 0xA], - profile_summary: vec![ProfileSummary::default(); 0xA], - _0x1903406: 0, - _0x190340a: 0, - _cs_key_config_save_load: CSKeyConfigSaveLoad::default(), - _0x8: 0, - _rest: Vec::new(), - } - } -} - -impl Read for UserData10 { - fn read(br: &mut BinaryReader) -> Result { - let mut user_data_10 = UserData10::default(); - - let end = br.pos + 0x60000; - - user_data_10._0x19003b4 = br.read_i32()?; - - // Steam ID - user_data_10.steam_id = br.read_u64()?; - - user_data_10._0x19004fc.copy_from_slice(br.read_bytes(0x140)?); - - user_data_10._cs_menu_system_save_load = CSMenuSystemSaveLoad::read(br)?; - - for i in 0..0xA { - let slot_active = br.read_bytes(1)?[0]; - assert!(slot_active == 0x1 || slot_active == 0x0); - user_data_10.active_slot[i] = slot_active == 0x1; - } - - for i in 0..0xA { - let profile_summary = ProfileSummary::read(br)?; - user_data_10.profile_summary[i] = profile_summary; - } - - user_data_10._0x1903406 = br.read_i32()?; - user_data_10._0x190340a = br.read_bytes(0x1)?[0]; - user_data_10._cs_key_config_save_load = CSKeyConfigSaveLoad::read(br)?; - user_data_10._0x8 = br.read_u64()?; - - user_data_10._rest.extend(br.read_bytes(end - br.pos)?); - - Ok(user_data_10) - } -} - -impl Write for UserData10 { - fn write(&self) -> Result, io::Error> { - let mut bytes: Vec = Vec::new(); - - bytes.extend(self._0x19003b4.to_le_bytes()); - - // Steam ID - bytes.extend(self.steam_id.to_le_bytes()); - - bytes.extend(self._0x19004fc); - - bytes.extend(self._cs_menu_system_save_load.write()?); - - // Active Slots list - bytes.extend(self.active_slot.iter().map(|a| if *a {1} else {0}).collect::>()); - - // Profile Summaries - for i in 0..0xA { - bytes.extend(self.profile_summary[i].write()?); - } - - bytes.extend(self._0x1903406.to_le_bytes()); - bytes.extend(self._0x190340a.to_le_bytes()); - - bytes.extend(self._cs_key_config_save_load.write()?); - bytes.extend(self._0x8.to_le_bytes()); - bytes.extend(self._rest.to_vec()); - - Ok(bytes) - } -} \ No newline at end of file diff --git a/src/save/save.rs b/src/save/save.rs deleted file mode 100644 index 46f690a..0000000 --- a/src/save/save.rs +++ /dev/null @@ -1,838 +0,0 @@ -pub mod save { - use std::{fs, io, path::PathBuf}; - use binary_reader::BinaryReader; - use crate::{ - read::read::Read, save::{ - common::{ save_slot::{EquipInventoryData, EquipProjectileData, GaItem, GaItemData, SaveSlot}, user_data_10::ProfileSummary, user_data_11::UserData11 }, - pc::pc_save::PCSave, - playstation::ps_save::PSSave, - }, util::bit::bit::set_bit, write::write::Write - }; - - // Using a checksum of the regulation bin file to check for Save Wizard .txt save file - const REGULATION_MD5_CHECKSUM: [u8; 0x10] =[0x2E, 0x88, 0x1A, 0x15, 0xAC, 0x05, 0x88, 0x8D, 0xF2, 0xC2, 0x6A, 0xEC, 0xC2, 0x90, 0x89, 0x23]; - - pub enum SaveType { - Unknown, - PC(PCSave), - PlayStation(PSSave) - } - - #[allow(unused)] - impl SaveType { - pub fn get_global_steam_id(&self) -> u64 { - match self { - SaveType::Unknown => todo!(), - SaveType::PC(pc_save) => { - pc_save.user_data_10.steam_id - } - SaveType::PlayStation(_) => 0, - } - } - - pub fn set_global_steam_id(&mut self, steam_id: u64) { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => { - pc_save.user_data_10.steam_id = steam_id; - } - SaveType::PlayStation(ps_save) => { - ps_save.user_data_10.steam_id = 0; - }, - } - } - - pub fn active_slots(&self) -> [bool; 10] { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => pc_save.user_data_10.active_slot, - SaveType::PlayStation(ps_save) => ps_save.user_data_10.active_slot, - } - } - - pub fn get_character_steam_id(&self, index: usize) -> u64 { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => { - pc_save.save_slots[index].save_slot.steam_id - } - SaveType::PlayStation(_) => 0, - } - } - - pub fn set_character_steam_id(&mut self, index: usize, steam_id: u64) { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => { - pc_save.save_slots[index].save_slot.steam_id = steam_id; - } - SaveType::PlayStation(ps_save) => { - ps_save.save_slots[index].steam_id = 0; - }, - } - } - - pub fn set_character_name(&mut self, index: usize, character_name_str: String) { - let mut character_name: [u16; 0x10] = [0; 0x10]; - let mut character_name2: [u16; 0x11] = [0; 0x11]; - for (i, char) in character_name_str.chars().enumerate() { - character_name[i] = char as u16; - character_name2[i] = char as u16; - } - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => { - pc_save.save_slots[index].save_slot.player_game_data.character_name.copy_from_slice(&character_name); - pc_save.user_data_10.profile_summary[index].character_name.copy_from_slice(&character_name2); - } - SaveType::PlayStation(ps_save) => { - ps_save.save_slots[index].player_game_data.character_name.copy_from_slice(&character_name); - ps_save.user_data_10.profile_summary[index].character_name.copy_from_slice(&character_name2); - }, - } - } - - pub fn set_character_gender(&mut self, index: usize, gender: u8) { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => { - pc_save.save_slots[index].save_slot.player_game_data.gender = gender; - } - SaveType::PlayStation(ps_save) => { - ps_save.save_slots[index].player_game_data.gender = gender; - }, - } - } - - pub fn set_character_health(&mut self, index: usize, health: u32) { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => { - pc_save.save_slots[index].save_slot.player_game_data.health = health; - } - SaveType::PlayStation(ps_save) => { - ps_save.save_slots[index].player_game_data.health = health; - }, - } - } - - pub fn set_character_base_max_health(&mut self, index: usize, base_max_health: u32) { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => { - pc_save.save_slots[index].save_slot.player_game_data.base_max_health = base_max_health; - } - SaveType::PlayStation(ps_save) => { - ps_save.save_slots[index].player_game_data.base_max_health = base_max_health; - }, - } - } - - pub fn set_character_fp(&mut self, index: usize, fp: u32) { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => { - pc_save.save_slots[index].save_slot.player_game_data.fp = fp; - } - SaveType::PlayStation(ps_save) => { - ps_save.save_slots[index].player_game_data.fp = fp; - }, - } - } - - pub fn set_character_base_max_fp(&mut self, index: usize, base_max_fp: u32) { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => { - pc_save.save_slots[index].save_slot.player_game_data.base_max_fp = base_max_fp; - } - SaveType::PlayStation(ps_save) => { - ps_save.save_slots[index].player_game_data.base_max_fp = base_max_fp; - }, - } - } - - pub fn set_character_sp(&mut self, index: usize, sp: u32) { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => { - pc_save.save_slots[index].save_slot.player_game_data.sp = sp; - } - SaveType::PlayStation(ps_save) => { - ps_save.save_slots[index].player_game_data.sp = sp; - }, - } - } - - pub fn set_character_base_max_sp(&mut self, index: usize, base_max_sp: u32) { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => { - pc_save.save_slots[index].save_slot.player_game_data.base_max_sp = base_max_sp; - } - SaveType::PlayStation(ps_save) => { - ps_save.save_slots[index].player_game_data.base_max_sp = base_max_sp; - }, - } - } - - pub fn set_character_level(&mut self, index: usize, level: u32) { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => { - pc_save.save_slots[index].save_slot.player_game_data.level = level; - pc_save.user_data_10.profile_summary[index].level = level; - } - SaveType::PlayStation(ps_save) => { - ps_save.save_slots[index].player_game_data.level = level; - }, - } - } - - pub fn set_character_vigor(&mut self, index: usize, vigor: u32) { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => { - pc_save.save_slots[index].save_slot.player_game_data.vigor = vigor; - } - SaveType::PlayStation(ps_save) => { - ps_save.save_slots[index].player_game_data.vigor = vigor; - }, - } - } - - pub fn set_character_mind(&mut self, index: usize, mind: u32) { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => { - pc_save.save_slots[index].save_slot.player_game_data.mind = mind; - } - SaveType::PlayStation(ps_save) => { - ps_save.save_slots[index].player_game_data.mind = mind; - }, - } - } - - pub fn set_character_endurance(&mut self, index: usize, endurance: u32) { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => { - pc_save.save_slots[index].save_slot.player_game_data.endurance = endurance; - } - SaveType::PlayStation(ps_save) => { - ps_save.save_slots[index].player_game_data.endurance = endurance; - }, - } - } - - pub fn set_character_strength(&mut self, index: usize, strength: u32) { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => { - pc_save.save_slots[index].save_slot.player_game_data.strength = strength; - } - SaveType::PlayStation(ps_save) => { - ps_save.save_slots[index].player_game_data.strength = strength; - }, - } - } - - pub fn set_character_dexterity(&mut self, index: usize, dexterity: u32) { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => { - pc_save.save_slots[index].save_slot.player_game_data.dexterity = dexterity; - } - SaveType::PlayStation(ps_save) => { - ps_save.save_slots[index].player_game_data.dexterity = dexterity; - }, - } - } - - pub fn set_character_intelligence(&mut self, index: usize, intelligence: u32) { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => { - pc_save.save_slots[index].save_slot.player_game_data.intelligence = intelligence; - } - SaveType::PlayStation(ps_save) => { - ps_save.save_slots[index].player_game_data.intelligence = intelligence; - }, - } - } - - pub fn set_character_faith(&mut self, index: usize, faith: u32) { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => { - pc_save.save_slots[index].save_slot.player_game_data.faith = faith; - } - SaveType::PlayStation(ps_save) => { - ps_save.save_slots[index].player_game_data.faith = faith; - }, - } - } - - pub fn set_character_arcane(&mut self, index: usize, arcane: u32) { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => { - pc_save.save_slots[index].save_slot.player_game_data.arcane = arcane; - } - SaveType::PlayStation(ps_save) => { - ps_save.save_slots[index].player_game_data.arcane = arcane; - }, - } - } - - pub fn set_character_souls(&mut self, index: usize, souls: u32) { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => { - let orgininal_soulsmemory = pc_save.save_slots[index].save_slot.player_game_data.soulsmemory; - let orgininal_souls = pc_save.save_slots[index].save_slot.player_game_data.soulsmemory; - pc_save.save_slots[index].save_slot.player_game_data.souls = souls; - if souls > orgininal_souls { - pc_save.save_slots[index].save_slot.player_game_data.soulsmemory = orgininal_soulsmemory + souls; - } - } - SaveType::PlayStation(ps_save) => { - let orgininal_soulsmemory = ps_save.save_slots[index].player_game_data.soulsmemory; - let orgininal_souls = ps_save.save_slots[index].player_game_data.soulsmemory; - ps_save.save_slots[index].player_game_data.souls = souls; - if souls > orgininal_souls { - ps_save.save_slots[index].player_game_data.soulsmemory = orgininal_soulsmemory + souls; - } - }, - } - } - - pub fn set_character_event_flag(&mut self, index: usize, offset: usize, bit_pos: u8, state: bool) { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => { - let event_byte = pc_save.save_slots[index].save_slot.event_flags.flags[offset]; - pc_save.save_slots[index].save_slot.event_flags.flags[offset] = set_bit(event_byte, bit_pos, state); - } - SaveType::PlayStation(ps_save) => { - let event_byte = ps_save.save_slots[index].event_flags.flags[offset]; - ps_save.save_slots[index].event_flags.flags[offset] = set_bit(event_byte, bit_pos, state); - }, - } - } - - pub fn add_region(&mut self, index: usize, region_id: u32) { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => { - let res = pc_save.save_slots[index].save_slot.regions.unlocked_regions.iter().position(|r| *r == region_id); - match res { - Some(i) => {}, - None => { - pc_save.save_slots[index].save_slot.regions.unlocked_regions.push(region_id); - pc_save.save_slots[index].save_slot.regions.unlocked_regions_count = pc_save.save_slots[index].save_slot.regions.unlocked_regions_count + 1; - }, - } - } - SaveType::PlayStation(ps_save) => { - let res = ps_save.save_slots[index].regions.unlocked_regions.iter().position(|r| *r == region_id); - match res { - Some(i) => {}, - None => { - ps_save.save_slots[index].regions.unlocked_regions.push(region_id); - ps_save.save_slots[index].regions.unlocked_regions_count = ps_save.save_slots[index].regions.unlocked_regions_count + 1; - }, - } - }, - } - } - - pub fn remove_region(&mut self, index: usize, region_id: u32) { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => { - let res = pc_save.save_slots[index].save_slot.regions.unlocked_regions.iter().position(|r| *r == region_id); - match res { - Some(i) => { - pc_save.save_slots[index].save_slot.regions.unlocked_regions.swap_remove(i); - pc_save.save_slots[index].save_slot.regions.unlocked_regions_count = pc_save.save_slots[index].save_slot.regions.unlocked_regions_count - 1; - }, - None => {}, - } - } - SaveType::PlayStation(ps_save) => { - let res = ps_save.save_slots[index].regions.unlocked_regions.iter().position(|r| *r == region_id); - match res { - Some(i) => { - ps_save.save_slots[index].regions.unlocked_regions.swap_remove(i); - ps_save.save_slots[index].regions.unlocked_regions_count = ps_save.save_slots[index].regions.unlocked_regions_count - 1; - }, - None => {}, - } - }, - } - } - - pub fn get_profile_summary(&self, index: usize) -> ProfileSummary { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => pc_save.user_data_10.profile_summary[index], - SaveType::PlayStation(ps_save) => ps_save.user_data_10.profile_summary[index], - } - } - - pub fn set_profile_summary(&mut self, index:usize, profile_summary: ProfileSummary) { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => {pc_save.user_data_10.profile_summary[index] = profile_summary}, - SaveType::PlayStation(ps_save) => {ps_save.user_data_10.profile_summary[index] = profile_summary}, - } - } - - pub fn get_slot(&self, index: usize) -> &SaveSlot { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => &pc_save.save_slots[index].save_slot, - SaveType::PlayStation(ps_save) => &ps_save.save_slots[index], - } - } - - pub fn set_slot(&mut self, index:usize, save_slot: &SaveSlot) { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => {pc_save.save_slots[index].save_slot = save_slot.clone()}, - SaveType::PlayStation(ps_save) => {ps_save.save_slots[index] = save_slot.clone()}, - } - } - - pub fn get_user_data_11(&mut self) -> &UserData11{ - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => &pc_save.user_data_11.user_data_11, - SaveType::PlayStation(ps_save) => &ps_save.user_data_11, - } - } - - pub fn get_regulation(&self) -> &[u8]{ - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => &pc_save.user_data_11.user_data_11.regulation, - SaveType::PlayStation(ps_save) => &ps_save.user_data_11.regulation, - } - } - - pub fn set_gaitem_map(&mut self, index: usize, ga_items: Vec) { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => {pc_save.save_slots[index].save_slot.ga_items = ga_items;} - SaveType::PlayStation(ps_save) => {ps_save.save_slots[index].ga_items = ga_items;} - } - } - - pub fn set_held_inventory(&mut self, index: usize, held_inventory: EquipInventoryData) { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => { - pc_save.save_slots[index].save_slot.equip_inventory_data = held_inventory; - } - SaveType::PlayStation(ps_save) => { - ps_save.save_slots[index].equip_inventory_data = held_inventory; - } - } - } - - pub fn set_storage_box_inventory(&mut self, index: usize, storage_box_inventory: EquipInventoryData) { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => { - pc_save.save_slots[index].save_slot.storage_inventory_data = storage_box_inventory; - } - SaveType::PlayStation(ps_save) => { - ps_save.save_slots[index].storage_inventory_data = storage_box_inventory; - } - } - } - - pub fn set_gaitem_item_data(&mut self, index: usize, gaitem_data: GaItemData) { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => { - pc_save.save_slots[index].save_slot.ga_item_data = gaitem_data; - } - SaveType::PlayStation(ps_save) => { - ps_save.save_slots[index].ga_item_data = gaitem_data; - } - } - } - - pub fn set_quickslot_item(&mut self, slot_index: usize, quickslot_index: usize, gaitem_handle: u32, item_id: u32, equip_index: u32) { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => { - pc_save.save_slots[slot_index].save_slot.equipped_items.quickitems[quickslot_index] = item_id; - pc_save.save_slots[slot_index].save_slot.equip_item_data.quick_slot_items[quickslot_index].item_id = gaitem_handle; - pc_save.save_slots[slot_index].save_slot.equip_item_data.quick_slot_items[quickslot_index].equipment_index = equip_index; - }, - SaveType::PlayStation(ps_save) => { - ps_save.save_slots[slot_index].equipped_items.quickitems[quickslot_index] = item_id; - ps_save.save_slots[slot_index].equip_item_data.quick_slot_items[quickslot_index].item_id = gaitem_handle; - ps_save.save_slots[slot_index].equip_item_data.quick_slot_items[quickslot_index].equipment_index = equip_index; - }, - } - } - - pub fn set_pouch_item(&mut self, slot_index: usize, pouch_index: usize, gaitem_handle: u32, item_id: u32, equip_index: u32) { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => { - pc_save.save_slots[slot_index].save_slot.equipped_items.pouch[pouch_index] = item_id; - pc_save.save_slots[slot_index].save_slot.equip_item_data.pouch_items[pouch_index].item_id = gaitem_handle; - pc_save.save_slots[slot_index].save_slot.equip_item_data.pouch_items[pouch_index].equipment_index = equip_index; - }, - SaveType::PlayStation(ps_save) => { - ps_save.save_slots[slot_index].equipped_items.pouch[pouch_index] = item_id; - ps_save.save_slots[slot_index].equip_item_data.pouch_items[pouch_index].item_id = gaitem_handle; - ps_save.save_slots[slot_index].equip_item_data.pouch_items[pouch_index].equipment_index = equip_index; - }, - } - } - - pub fn set_left_weapon_slot(&mut self, slot_index: usize, weapon_slot_index: usize, gaitem_handle: u32, item_id: u32, equip_index: u32) { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => { - let slot = &mut pc_save.save_slots[slot_index].save_slot; - let profile_summary = &mut pc_save.user_data_10.profile_summary[slot_index]; - slot.equip_data.left_hand_armaments[weapon_slot_index] = equip_index; - slot.chr_asm.left_hand_armaments[weapon_slot_index] = item_id; - slot.chr_asm2.left_hand_armaments[weapon_slot_index] = gaitem_handle; - slot.equipped_items.left_hand_armaments[weapon_slot_index] = item_id; - profile_summary.equipment_gaitem.left_hand_armaments[weapon_slot_index] = gaitem_handle; - profile_summary.equipment_item.left_hand_armaments[weapon_slot_index] = item_id; - }, - SaveType::PlayStation(ps_save) => { - let slot = &mut ps_save.save_slots[slot_index]; - let profile_summary = &mut ps_save.user_data_10.profile_summary[slot_index]; - slot.equip_data.left_hand_armaments[weapon_slot_index] = equip_index; - slot.chr_asm.left_hand_armaments[weapon_slot_index] = item_id; - slot.chr_asm2.left_hand_armaments[weapon_slot_index] = gaitem_handle; - slot.equipped_items.left_hand_armaments[weapon_slot_index] = item_id; - profile_summary.equipment_gaitem.left_hand_armaments[weapon_slot_index] = gaitem_handle; - profile_summary.equipment_item.left_hand_armaments[weapon_slot_index] = item_id; - }, - } - } - - pub fn set_right_weapon_slot(&mut self, slot_index: usize, weapon_slot_index: usize, gaitem_handle: u32, item_id: u32, equip_index: u32) { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => { - let slot = &mut pc_save.save_slots[slot_index].save_slot; - let profile_summary = &mut pc_save.user_data_10.profile_summary[slot_index]; - slot.equip_data.right_hand_armaments[weapon_slot_index] = equip_index; - slot.chr_asm.right_hand_armaments[weapon_slot_index] = item_id; - slot.chr_asm2.right_hand_armaments[weapon_slot_index] = gaitem_handle; - slot.equipped_items.right_hand_armaments[weapon_slot_index] = item_id; - profile_summary.equipment_gaitem.right_hand_armaments[weapon_slot_index] = gaitem_handle; - profile_summary.equipment_item.right_hand_armaments[weapon_slot_index] = item_id; - }, - SaveType::PlayStation(ps_save) => { - let slot = &mut ps_save.save_slots[slot_index]; - let profile_summary = &mut ps_save.user_data_10.profile_summary[slot_index]; - slot.equip_data.right_hand_armaments[weapon_slot_index] = equip_index; - slot.chr_asm.right_hand_armaments[weapon_slot_index] = item_id; - slot.chr_asm2.right_hand_armaments[weapon_slot_index] = gaitem_handle; - slot.equipped_items.right_hand_armaments[weapon_slot_index] = item_id; - profile_summary.equipment_gaitem.right_hand_armaments[weapon_slot_index] = gaitem_handle; - profile_summary.equipment_item.right_hand_armaments[weapon_slot_index] = item_id; - }, - } - } - - pub fn set_arrow_slot(&mut self, slot_index: usize, weapon_slot_index: usize, gaitem_handle: u32, item_id: u32, equip_index: u32) { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => { - let slot = &mut pc_save.save_slots[slot_index].save_slot; - let profile_summary = &mut pc_save.user_data_10.profile_summary[slot_index]; - slot.equip_data.arrows[weapon_slot_index] = equip_index; - slot.chr_asm.arrows[weapon_slot_index] = if item_id == 0 {u32::MAX} else {item_id}; - slot.chr_asm2.arrows[weapon_slot_index] = gaitem_handle; - slot.equipped_items.arrows[weapon_slot_index] = if item_id == 0 {u32::MAX} else {item_id}; - profile_summary.equipment_gaitem.arrows[weapon_slot_index] = gaitem_handle; - profile_summary.equipment_item.arrows[weapon_slot_index] = item_id; - }, - SaveType::PlayStation(ps_save) => { - let slot = &mut ps_save.save_slots[slot_index]; - let profile_summary = &mut ps_save.user_data_10.profile_summary[slot_index]; - slot.equip_data.arrows[weapon_slot_index] = equip_index; - slot.chr_asm.arrows[weapon_slot_index] = if item_id == 0 {u32::MAX} else {item_id}; - slot.chr_asm2.arrows[weapon_slot_index] = gaitem_handle; - slot.equipped_items.arrows[weapon_slot_index] = if item_id == 0 {u32::MAX} else {item_id}; - profile_summary.equipment_gaitem.arrows[weapon_slot_index] = gaitem_handle; - profile_summary.equipment_item.arrows[weapon_slot_index] = item_id; - }, - } - } - - pub fn set_bolt_slot(&mut self, slot_index: usize, weapon_slot_index: usize, gaitem_handle: u32, item_id: u32, equip_index: u32) { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => { - let slot = &mut pc_save.save_slots[slot_index].save_slot; - let profile_summary = &mut pc_save.user_data_10.profile_summary[slot_index]; - slot.equip_data.bolts[weapon_slot_index] = equip_index; - slot.chr_asm.bolts[weapon_slot_index] = if item_id == 0 {u32::MAX} else {item_id}; - slot.chr_asm2.bolts[weapon_slot_index] = gaitem_handle; - slot.equipped_items.bolts[weapon_slot_index] = if item_id == 0 {u32::MAX} else {item_id}; - profile_summary.equipment_gaitem.bolts[weapon_slot_index] = gaitem_handle; - profile_summary.equipment_item.bolts[weapon_slot_index] = item_id; - }, - SaveType::PlayStation(ps_save) => { - let slot = &mut ps_save.save_slots[slot_index]; - let profile_summary = &mut ps_save.user_data_10.profile_summary[slot_index]; - slot.equip_data.bolts[weapon_slot_index] = equip_index; - slot.chr_asm.bolts[weapon_slot_index] = if item_id == 0 {u32::MAX} else {item_id}; - slot.chr_asm2.bolts[weapon_slot_index] = gaitem_handle; - slot.equipped_items.bolts[weapon_slot_index] = if item_id == 0 {u32::MAX} else {item_id}; - profile_summary.equipment_gaitem.bolts[weapon_slot_index] = gaitem_handle; - profile_summary.equipment_item.bolts[weapon_slot_index] = item_id; - }, - } - } - - pub fn set_talisman_slot(&mut self, slot_index: usize, weapon_slot_index: usize, gaitem_handle: u32, item_id: u32, equip_index: u32) { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => { - let slot = &mut pc_save.save_slots[slot_index].save_slot; - let profile_summary = &mut pc_save.user_data_10.profile_summary[slot_index]; - slot.equip_data.talismans[weapon_slot_index] = equip_index; - slot.chr_asm.talismans[weapon_slot_index] = item_id; - slot.chr_asm2.talismans[weapon_slot_index] = gaitem_handle; - slot.equipped_items.talismans[weapon_slot_index] = item_id | 0x20000000; - profile_summary.equipment_gaitem.talismans[weapon_slot_index] = gaitem_handle; - profile_summary.equipment_item.talismans[weapon_slot_index] = item_id | 0x20000000; - }, - SaveType::PlayStation(ps_save) => { - let slot = &mut ps_save.save_slots[slot_index]; - let profile_summary = &mut ps_save.user_data_10.profile_summary[slot_index]; - slot.equip_data.talismans[weapon_slot_index] = equip_index; - slot.chr_asm.talismans[weapon_slot_index] = item_id; - slot.chr_asm2.talismans[weapon_slot_index] = gaitem_handle; - slot.equipped_items.talismans[weapon_slot_index] = item_id | 0x20000000; - profile_summary.equipment_gaitem.talismans[weapon_slot_index] = gaitem_handle; - profile_summary.equipment_item.talismans[weapon_slot_index] = item_id | 0x20000000; - }, - } - } - - pub fn set_head_gear(&mut self, slot_index: usize, gaitem_handle: u32, item_id: u32, equip_index: u32) { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => { - let slot = &mut pc_save.save_slots[slot_index].save_slot; - let profile_summary = &mut pc_save.user_data_10.profile_summary[slot_index]; - slot.equip_data.head = equip_index; - slot.chr_asm.head = item_id; - slot.chr_asm2.head = gaitem_handle; - slot.equipped_items.head = item_id | 0x10000000; - profile_summary.equipment_gaitem.head = gaitem_handle; - profile_summary.equipment_item.head = item_id | 0x10000000; - }, - SaveType::PlayStation(ps_save) => { - let slot = &mut ps_save.save_slots[slot_index]; - let profile_summary = &mut ps_save.user_data_10.profile_summary[slot_index]; - slot.equip_data.head = equip_index; - slot.chr_asm.head = item_id; - slot.chr_asm2.head = gaitem_handle; - slot.equipped_items.head = item_id | 0x10000000; - profile_summary.equipment_gaitem.head = gaitem_handle; - profile_summary.equipment_item.head = item_id | 0x10000000; - }, - } - } - - pub fn set_chest_piece(&mut self, slot_index: usize, gaitem_handle: u32, item_id: u32, equip_index: u32) { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => { - let slot = &mut pc_save.save_slots[slot_index].save_slot; - let profile_summary = &mut pc_save.user_data_10.profile_summary[slot_index]; - slot.equip_data.chest = equip_index; - slot.chr_asm.chest = item_id; - slot.chr_asm2.chest = gaitem_handle; - slot.equipped_items.chest = item_id | 0x10000000; - profile_summary.equipment_gaitem.chest = gaitem_handle; - profile_summary.equipment_item.chest = item_id | 0x10000000; - }, - SaveType::PlayStation(ps_save) => { - let slot = &mut ps_save.save_slots[slot_index]; - let profile_summary = &mut ps_save.user_data_10.profile_summary[slot_index]; - slot.equip_data.chest = equip_index; - slot.chr_asm.chest = item_id; - slot.chr_asm2.chest = gaitem_handle; - slot.equipped_items.chest = item_id | 0x10000000; - profile_summary.equipment_gaitem.chest = gaitem_handle; - profile_summary.equipment_item.chest = item_id | 0x10000000; - }, - } - } - - pub fn set_gauntlets(&mut self, slot_index: usize, gaitem_handle: u32, item_id: u32, equip_index: u32) { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => { - let slot = &mut pc_save.save_slots[slot_index].save_slot; - let profile_summary = &mut pc_save.user_data_10.profile_summary[slot_index]; - slot.equip_data.arms = equip_index; - slot.chr_asm.arms = item_id; - slot.chr_asm2.arms = gaitem_handle; - slot.equipped_items.arms = item_id | 0x10000000; - profile_summary.equipment_gaitem.arms = gaitem_handle; - profile_summary.equipment_item.arms = item_id | 0x10000000; - }, - SaveType::PlayStation(ps_save) => { - let slot = &mut ps_save.save_slots[slot_index]; - let profile_summary = &mut ps_save.user_data_10.profile_summary[slot_index]; - slot.equip_data.arms = equip_index; - slot.chr_asm.arms = item_id; - slot.chr_asm2.arms = gaitem_handle; - slot.equipped_items.arms = item_id | 0x10000000; - profile_summary.equipment_gaitem.arms = gaitem_handle; - profile_summary.equipment_item.arms = item_id | 0x10000000; - }, - } - } - - pub fn set_leggings(&mut self, slot_index: usize, gaitem_handle: u32, item_id: u32, equip_index: u32) { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => { - let slot = &mut pc_save.save_slots[slot_index].save_slot; - let profile_summary = &mut pc_save.user_data_10.profile_summary[slot_index]; - slot.equip_data.legs = equip_index; - slot.chr_asm.legs = item_id; - slot.chr_asm2.legs = gaitem_handle; - slot.equipped_items.legs = item_id | 0x10000000; - profile_summary.equipment_gaitem.legs = gaitem_handle; - profile_summary.equipment_item.legs = item_id | 0x10000000; - }, - SaveType::PlayStation(ps_save) => { - let slot = &mut ps_save.save_slots[slot_index]; - let profile_summary = &mut ps_save.user_data_10.profile_summary[slot_index]; - slot.equip_data.legs = equip_index; - slot.chr_asm.legs = item_id; - slot.chr_asm2.legs = gaitem_handle; - slot.equipped_items.legs = item_id | 0x10000000; - profile_summary.equipment_gaitem.legs = gaitem_handle; - profile_summary.equipment_item.legs = item_id | 0x10000000; - }, - } - } - - pub fn set_equip_projectile_data(&mut self, index: usize, projectile_list: EquipProjectileData) { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => { - pc_save.save_slots[index].save_slot.equip_projectile_data = projectile_list.clone(); - } - SaveType::PlayStation(ps_save) => { - ps_save.save_slots[index].equip_projectile_data = projectile_list.clone(); - } - } - } - - pub fn set_match_making_wpn_lvl(&mut self, index: usize, weapon_level: u8) { - match self { - SaveType::Unknown => panic!("Why are we here?"), - SaveType::PC(pc_save) => { - pc_save.save_slots[index].save_slot.player_game_data.match_making_wpn_lvl = weapon_level; - } - SaveType::PlayStation(ps_save) => { - ps_save.save_slots[index].player_game_data.match_making_wpn_lvl = weapon_level; - } - } - } - } - - pub struct Save { - pub save_type: SaveType, - } - - impl Default for Save { - fn default() -> Self { - Self { - save_type: SaveType::Unknown, - } - } - } - - impl Read for Save { - fn read(br: &mut BinaryReader) -> Result { - let mut save = Save::default(); - - if Self::is_pc(br) { - save.save_type = SaveType::PC(PCSave::read(br)?); - } - else if Self::is_ps_save_wizard(br) { - save.save_type = SaveType::PlayStation(PSSave::read(br)?); - } - else { - return Err( std::io::Error::new(io::ErrorKind::InvalidData, "Invalid data!") ); - } - - Ok(save) - } - } - - impl Write for Save { - fn write(&self) -> Result, io::Error> { - let save_bytes: Vec = match &self.save_type { - SaveType::Unknown => Vec::new(), - SaveType::PC(pc_save) => pc_save.write()?, - SaveType::PlayStation(ps_save) => ps_save.write()?, - }; - Ok(save_bytes) - } - } - - impl Save { - pub fn from_path(path: &PathBuf) -> Result { - let contents = fs::read(path).expect("Should have been able to read the file"); - let mut br = BinaryReader::from_u8(&contents); - br.set_endian(binary_reader::Endian::Little); - - // Check if it's an actual save file - assert!(Self::is(&mut br)); - - Self::read(&mut br) - } - - // Check if it's a save file - pub fn is(br: &mut BinaryReader) -> bool { - let is = Self::is_pc(br) || Self::is_ps_save_wizard(br); - is - } - - // Check if it's a PC save file - pub fn is_pc(br: &mut BinaryReader) -> bool { - let magic = br.read_bytes(4).expect(""); - let is_pc = magic == [66, 78, 68, 52]; - br.jmp(0); - is_pc - } - - // Check if it's a PS Save Wizard save file - pub fn is_ps_save_wizard(br: &mut BinaryReader) -> bool { - br.jmp(0x1960070); - let regulation = br.read_bytes(0x240010).expect(""); - let digest = md5::compute(regulation); - let is_ps_save_wizard = digest == md5::Digest(REGULATION_MD5_CHECKSUM); - br.jmp(0); - is_ps_save_wizard - } - } - -} - diff --git a/src/ui/character_list.rs b/src/ui/character_list.rs new file mode 100644 index 0000000..4867137 --- /dev/null +++ b/src/ui/character_list.rs @@ -0,0 +1,38 @@ +use crate::App; +use eframe::egui; +use egui::Context; + +/// Draws a side panel showing a menu for navigating an opened save characters. +pub fn character_list_side_panel(ctx: &Context, app: &mut App) { + egui::SidePanel::left("characters").show(ctx, |ui| { + egui::ScrollArea::vertical() + .id_source("left") + .show(ui, |ui| { + ui.vertical(|ui| { + for (i, state) in app + .save_api + .as_ref() + .unwrap() + .active_characters() + .iter() + .enumerate() + { + if *state { + let button = ui.add_sized( + [120., 40.], + egui::Button::new( + &app.save_api.as_ref().unwrap().character_name(i), + ), + ); + if button.clicked() { + app.vm.index = i; + } + if app.vm.index == i { + button.highlight(); + } + } + } + }) + }); + }); +} diff --git a/src/ui/custom/checkbox.rs b/src/ui/custom/checkbox.rs index b307931..b810148 100644 --- a/src/ui/custom/checkbox.rs +++ b/src/ui/custom/checkbox.rs @@ -1,62 +1,54 @@ -pub mod checkbox { - use eframe::egui; +use eframe::egui; - pub enum State { - Off = 0, - On = 1, - InBetween = 2 +pub enum State { + Off = 0, + On = 1, + InBetween = 2, +} + +pub fn three_states_checkbox(ui: &mut egui::Ui, state: &State) -> egui::Response { + let desired_size = ui.spacing().interact_size.y * egui::vec2(1.0, 1.0); + let (rect, mut response) = ui.allocate_exact_size(desired_size, egui::Sense::click()); + + if response.clicked() { + response.mark_changed(); } - - pub fn three_states_checkbox(ui: &mut egui::Ui, state: &State) -> egui::Response { - let desired_size = ui.spacing().interact_size.y * egui::vec2(1.0, 1.0); - let (rect, mut response) = ui.allocate_exact_size(desired_size, egui::Sense::click()); - - if response.clicked() { - response.mark_changed(); - } - - if ui.is_rect_visible(rect) { - let visuals = ui.style().interact(&response); - let rect = rect.expand(visuals.expansion); - ui.painter().rect( - rect, - 2., - visuals.bg_fill, - visuals.bg_stroke - ); - match state { - State::Off => { + if ui.is_rect_visible(rect) { + let visuals = ui.style().interact(&response); + let rect = rect.expand(visuals.expansion); + ui.painter() + .rect(rect, 2., visuals.bg_fill, visuals.bg_stroke); - }, - State::On => { - ui.painter().line_segment( - [ - egui::pos2(rect.right()-4., rect.top()+4.), - egui::pos2(rect.left()+8., rect.bottom()-4.) - ], - visuals.fg_stroke - ); - - ui.painter().line_segment( - [ - egui::pos2(rect.left()+8., rect.bottom()-4.), - egui::pos2(rect.left()+4., rect.bottom()-8.) - ], - visuals.fg_stroke - ); - }, - State::InBetween => { - ui.painter().line_segment( - [ - egui::pos2(rect.left()+4., rect.center().y), - egui::pos2(rect.right()-4., rect.center().y) - ], - visuals.fg_stroke - ); - }, + match state { + State::Off => {} + State::On => { + ui.painter().line_segment( + [ + egui::pos2(rect.right() - 4., rect.top() + 4.), + egui::pos2(rect.left() + 8., rect.bottom() - 4.), + ], + visuals.fg_stroke, + ); + + ui.painter().line_segment( + [ + egui::pos2(rect.left() + 8., rect.bottom() - 4.), + egui::pos2(rect.left() + 4., rect.bottom() - 8.), + ], + visuals.fg_stroke, + ); + } + State::InBetween => { + ui.painter().line_segment( + [ + egui::pos2(rect.left() + 4., rect.center().y), + egui::pos2(rect.right() - 4., rect.center().y), + ], + visuals.fg_stroke, + ); } } - response } -} \ No newline at end of file + response +} diff --git a/src/ui/custom/mod.rs b/src/ui/custom/mod.rs index 9767a8f..4768972 100644 --- a/src/ui/custom/mod.rs +++ b/src/ui/custom/mod.rs @@ -1 +1,2 @@ -pub mod checkbox; \ No newline at end of file +pub(crate) mod checkbox; +pub(crate) mod selectable; diff --git a/src/ui/custom/selectable.rs b/src/ui/custom/selectable.rs new file mode 100644 index 0000000..22db6bb --- /dev/null +++ b/src/ui/custom/selectable.rs @@ -0,0 +1,66 @@ +use eframe::egui::{ + NumExt, Response, Sense, TextStyle, Ui, Widget, WidgetInfo, WidgetText, WidgetType, +}; + +pub struct SelectableButton { + selected: bool, + text: WidgetText, +} + +impl SelectableButton { + pub fn new(selected: bool, text: impl Into) -> Self { + Self { + selected, + text: text.into(), + } + } +} + +impl Widget for SelectableButton { + fn ui(self, ui: &mut Ui) -> Response { + let Self { selected, text } = self; + + let button_padding = ui.spacing().button_padding; + let total_extra = button_padding + button_padding; + + let wrap_width = ui.available_width() - total_extra.x; + let galley = text.into_galley(ui, None, wrap_width, TextStyle::Button); + + let mut desired_size = total_extra + galley.size(); + desired_size.y = desired_size.y.at_least(ui.spacing().interact_size.y); + let (rect, response) = ui.allocate_at_least(desired_size, Sense::click()); + response.widget_info(|| WidgetInfo::selected(WidgetType::Button, selected, galley.text())); + + if ui.is_rect_visible(response.rect) { + let text_pos = ui + .layout() + .align_size_within_rect(galley.size(), rect.shrink2(button_padding)) + .min; + + let visuals = ui.style().interact_selectable(&response, selected); + + if selected || response.hovered() || response.highlighted() || response.has_focus() { + let rect = rect.expand(visuals.expansion); + + ui.painter().rect( + rect, + visuals.rounding, + ui.visuals().widgets.inactive.bg_fill, + ui.visuals().widgets.hovered.bg_stroke, + ); + } else { + ui.painter().rect( + rect, + visuals.rounding, + ui.visuals().widgets.inactive.bg_fill, + ui.visuals().widgets.inactive.bg_stroke, + ); + } + + ui.painter() + .galley(text_pos, galley, ui.visuals().widgets.active.text_color()); + } + + response + } +} diff --git a/src/ui/events.rs b/src/ui/events.rs index 23be4f1..6d63add 100644 --- a/src/ui/events.rs +++ b/src/ui/events.rs @@ -1,178 +1,242 @@ -pub mod events { +use std::collections::BTreeMap; - use std::collections::BTreeMap; +use crate::{ + db::{ + bosses::Boss, colosseums::Colosseum, cookbooks::Cookbook, graces::maps::Grace, + map_name::MapName, maps::Map, summoning_pools::SummoningPool, whetblades::Whetblade, + }, + ui::custom::checkbox::{three_states_checkbox, State}, + vm::{events::EventsRoute, vm::ViewModel}, +}; +use eframe::egui::{self, Ui}; - use eframe::egui::{self, Ui}; - use crate::{db::{bosses::bosses::{Boss, BOSSES}, colosseums::colosseums::{Colosseum, COLOSSEUMS}, cookbooks::books::{Cookbook, COOKBOKS}, graces::maps::GRACES, map_name::map_name::{MapName, MAP_NAME}, maps::maps::{Map, MAPS}, summoning_pools::summoning_pools::{SummoningPool, SUMMONING_POOLS}, whetblades::whetblades::{Whetblade, WHETBLADES}}, ui::custom::checkbox::checkbox::{three_states_checkbox, State}, vm::{events::events_view_model::EventsRoute, vm::vm::ViewModel}}; - - pub fn events(ui: &mut Ui, vm:&mut ViewModel) { - egui::SidePanel::left("inventory_menu").show(ui.ctx(), |ui|{ - egui::ScrollArea::vertical() +/// Draws the 'Events' route view. +pub fn events(ui: &mut Ui, vm: &mut ViewModel) { + egui::SidePanel::left("inventory_menu").show(ui.ctx(), |ui| { + egui::ScrollArea::vertical() .id_source("left") .show(ui, |ui| { ui.vertical(|ui| { - let sites_of_grace = ui.add_sized([100., 40.], egui::Button::new("Sites Of Grace")); + let sites_of_grace = + ui.add_sized([100., 40.], egui::Button::new("Sites Of Grace")); let whetblades = ui.add_sized([100., 40.], egui::Button::new("Whetblades")); let cookboks = ui.add_sized([100., 40.], egui::Button::new("Cookbooks")); let maps = ui.add_sized([100., 40.], egui::Button::new("Maps")); let bosses = ui.add_sized([100., 40.], egui::Button::new("Bosses")); - let summoning_pools = ui.add_sized([100., 60.], egui::Button::new("Summoning\nPools")); + let summoning_pools = + ui.add_sized([100., 60.], egui::Button::new("Summoning\nPools")); let colosseums = ui.add_sized([100., 40.], egui::Button::new("Colosseums")); - - if sites_of_grace.clicked() {vm.slots[vm.index].events_vm.current_route = EventsRoute::SitesOfGrace} - if whetblades.clicked() {vm.slots[vm.index].events_vm.current_route = EventsRoute::Whetblades} - if cookboks.clicked() {vm.slots[vm.index].events_vm.current_route = EventsRoute::Cookboks} - if maps.clicked() {vm.slots[vm.index].events_vm.current_route = EventsRoute::Maps} - if bosses.clicked() {vm.slots[vm.index].events_vm.current_route = EventsRoute::Bosses} - if summoning_pools.clicked() {vm.slots[vm.index].events_vm.current_route = EventsRoute::SummoningPools} - if colosseums.clicked() {vm.slots[vm.index].events_vm.current_route = EventsRoute::Colosseums} - - // Highlight active - match vm.slots[vm.index].events_vm.current_route { - EventsRoute::None => {}, - EventsRoute::SitesOfGrace => {sites_of_grace.highlight();}, - EventsRoute::Whetblades => {whetblades.highlight();}, - EventsRoute::Cookboks => {cookboks.highlight();}, - EventsRoute::Maps => {maps.highlight();}, - EventsRoute::Bosses => {bosses.highlight();}, - EventsRoute::SummoningPools => {summoning_pools.highlight();}, - EventsRoute::Colosseums => {colosseums.highlight();}, + + if sites_of_grace.clicked() { + vm.characters[vm.index].events_vm.current_route = EventsRoute::SitesOfGrace + } + if whetblades.clicked() { + vm.characters[vm.index].events_vm.current_route = EventsRoute::Whetblades + } + if cookboks.clicked() { + vm.characters[vm.index].events_vm.current_route = EventsRoute::Cookboks + } + if maps.clicked() { + vm.characters[vm.index].events_vm.current_route = EventsRoute::Maps + } + if bosses.clicked() { + vm.characters[vm.index].events_vm.current_route = EventsRoute::Bosses + } + if summoning_pools.clicked() { + vm.characters[vm.index].events_vm.current_route = + EventsRoute::SummoningPools + } + if colosseums.clicked() { + vm.characters[vm.index].events_vm.current_route = EventsRoute::Colosseums + } + + // Highlight active + match vm.characters[vm.index].events_vm.current_route { + EventsRoute::None => {} + EventsRoute::SitesOfGrace => { + sites_of_grace.highlight(); + } + EventsRoute::Whetblades => { + whetblades.highlight(); + } + EventsRoute::Cookboks => { + cookboks.highlight(); + } + EventsRoute::Maps => { + maps.highlight(); + } + EventsRoute::Bosses => { + bosses.highlight(); + } + EventsRoute::SummoningPools => { + summoning_pools.highlight(); + } + EventsRoute::Colosseums => { + colosseums.highlight(); + } } }) }); - }); + }); - egui::CentralPanel::default().show(ui.ctx(), |ui|{ - egui::ScrollArea::vertical() + egui::CentralPanel::default().show(ui.ctx(), |ui| { + egui::ScrollArea::vertical() .id_source("left") .auto_shrink(false) .show(ui, |ui| { - match vm.slots[vm.index].events_vm.current_route { - EventsRoute::None => {}, - EventsRoute::SitesOfGrace => {graces(ui, vm);}, - EventsRoute::Whetblades => {whetblades(ui, vm);}, - EventsRoute::Cookboks => {cookbooks(ui, vm);}, - EventsRoute::Maps => {maps(ui, vm);}, - EventsRoute::Bosses => {bosses(ui, vm);}, - EventsRoute::SummoningPools => {summoning_pools(ui, vm);}, - EventsRoute::Colosseums => {colosseums(ui, vm);}, + match vm.characters[vm.index].events_vm.current_route { + EventsRoute::None => {} + EventsRoute::SitesOfGrace => { + graces(ui, vm); + } + EventsRoute::Whetblades => { + whetblades(ui, vm); + } + EventsRoute::Cookboks => { + cookbooks(ui, vm); + } + EventsRoute::Maps => { + maps(ui, vm); + } + EventsRoute::Bosses => { + bosses(ui, vm); + } + EventsRoute::SummoningPools => { + summoning_pools(ui, vm); + } + EventsRoute::Colosseums => { + colosseums(ui, vm); + } } }); - }); - - } + }); +} - fn graces(ui: &mut Ui, vm:&mut ViewModel) { - ui.vertical(|ui| { - let maps = &vm.slots[vm.index].events_vm.grace_groups; - let graces = &mut vm.slots[vm.index].events_vm.graces; - select_all_checkbox(ui, graces, "All Graces"); - for map in maps { - ui.push_id(map.0, |ui| { - let collapsing = egui::containers::collapsing_header::CollapsingHeader::new(MAP_NAME.lock().unwrap()[&map.0]); - ui.horizontal(|ui|{ - let mut state = State::Off; - if map.1.iter().all(|g| graces[&g]) { - state = State::On; - } - else if map.1.iter().any(|g| graces[&g]) { - state = State::InBetween; - } +fn graces(ui: &mut Ui, vm: &mut ViewModel) { + ui.vertical(|ui| { + let maps = &vm.characters[vm.index].events_vm.grace_groups; + let graces = &mut vm.characters[vm.index].events_vm.graces; + select_all_checkbox(ui, graces, "All Graces"); + for map in maps { + ui.push_id(map.0, |ui| { + let collapsing = egui::containers::collapsing_header::CollapsingHeader::new( + MapName::map_names()[&map.0], + ); + ui.horizontal(|ui| { + let mut state = State::Off; + if map.1.iter().all(|g| graces[&g]) { + state = State::On; + } else if map.1.iter().any(|g| graces[&g]) { + state = State::InBetween; + } - if three_states_checkbox(ui, &state).clicked() { - match state { - State::Off => map.1.iter().for_each(|g| *graces.get_mut(g).expect("") = true), - State::On => map.1.iter().for_each(|g| *graces.get_mut(g).expect("") = false), - State::InBetween => map.1.iter().for_each(|g| *graces.get_mut(g).expect("") = true), - } + if three_states_checkbox(ui, &state).clicked() { + match state { + State::Off => map + .1 + .iter() + .for_each(|g| *graces.get_mut(g).expect("") = true), + State::On => map + .1 + .iter() + .for_each(|g| *graces.get_mut(g).expect("") = false), + State::InBetween => map + .1 + .iter() + .for_each(|g| *graces.get_mut(g).expect("") = true), } + } - collapsing.show(ui, |ui| { - for grace in map.1 { - let grace_info: (MapName, u32, &str) = GRACES.lock().unwrap()[&grace]; - let on = graces.get_mut(grace).expect(""); - ui.checkbox(on, grace_info.2.to_string()); - } - }); + collapsing.show(ui, |ui| { + for grace in map.1 { + let grace_info: (MapName, u32, &str) = Grace::graces()[&grace]; + let on = graces.get_mut(grace).expect(""); + ui.checkbox(on, grace_info.2.to_string()); + } }); }); - } - }); - } + }); + } + }); +} - fn whetblades(ui: &mut Ui, vm:&mut ViewModel) { - let whetblades = &mut vm.slots[vm.index].events_vm.whetblades; - select_all_checkbox::(ui, whetblades, "All Whetblades"); - for (whetblade, on) in whetblades { - let whetblade_info: (u32,&str) = WHETBLADES.lock().unwrap()[&whetblade]; - ui.checkbox(on, whetblade_info.1.to_string()); +fn whetblades(ui: &mut Ui, vm: &mut ViewModel) { + let whetblades = &mut vm.characters[vm.index].events_vm.whetblades; + select_all_checkbox::(ui, whetblades, "All Whetblades"); + for (whetblade, on) in whetblades { + if let Some((_, name)) = Whetblade::whetblades().get(whetblade) { + ui.checkbox(on, name.to_string()); } } +} - fn cookbooks(ui: &mut Ui, vm:&mut ViewModel) { - let cookbooks = &mut vm.slots[vm.index].events_vm.cookbooks; - select_all_checkbox::(ui, cookbooks, "All Cookbooks"); - for (cookbook, on) in cookbooks { - let cookbook_info: (u32,&str) = COOKBOKS.lock().unwrap()[&cookbook]; - ui.checkbox(on, cookbook_info.1.to_string()); +fn cookbooks(ui: &mut Ui, vm: &mut ViewModel) { + let cookbooks = &mut vm.characters[vm.index].events_vm.cookbooks; + select_all_checkbox::(ui, cookbooks, "All Cookbooks"); + for (cookbook, on) in cookbooks { + if let Some((_, name)) = Cookbook::cookbooks().get(cookbook) { + ui.checkbox(on, name.to_string()); } } +} - fn maps(ui: &mut Ui, vm:&mut ViewModel) { - let maps = &mut vm.slots[vm.index].events_vm.maps; - select_all_checkbox::(ui, maps, "All Maps"); - for (map, on) in maps { - let map_info: (u32,&str) = MAPS.lock().unwrap()[&map]; - ui.checkbox(on, map_info.1.to_string()); +fn maps(ui: &mut Ui, vm: &mut ViewModel) { + let maps = &mut vm.characters[vm.index].events_vm.maps; + select_all_checkbox::(ui, maps, "All Maps"); + for (map, on) in maps { + if let Some((_, name)) = Map::maps().get(map) { + ui.checkbox(on, name.to_string()); } } +} - fn bosses(ui: &mut Ui, vm:&mut ViewModel) { - let bosses = &mut vm.slots[vm.index].events_vm.bosses; - select_all_checkbox::(ui, bosses, "All Bosses"); - for (boss, on) in bosses { - let boss_info: (u32,&str) = BOSSES.lock().unwrap()[&boss]; - ui.checkbox(on, boss_info.1.to_string()); +fn bosses(ui: &mut Ui, vm: &mut ViewModel) { + let bosses = &mut vm.characters[vm.index].events_vm.bosses; + select_all_checkbox::(ui, bosses, "All Bosses"); + for (boss, on) in bosses { + if let Some((_, name)) = Boss::bosses().get(boss) { + ui.checkbox(on, name.to_string()); } } +} - fn summoning_pools(ui: &mut Ui, vm:&mut ViewModel) { - let summoning_pools = &mut vm.slots[vm.index].events_vm.summoning_pools; - select_all_checkbox::(ui, summoning_pools, "All Summoning Pools"); - for (summoning_pool, on) in summoning_pools { - let summoning_pool_info: (u32,&str) = SUMMONING_POOLS.lock().unwrap()[&summoning_pool]; - ui.checkbox(on, summoning_pool_info.1.to_string()); +fn summoning_pools(ui: &mut Ui, vm: &mut ViewModel) { + let summoning_pools = &mut vm.characters[vm.index].events_vm.summoning_pools; + select_all_checkbox::(ui, summoning_pools, "All Summoning Pools"); + for (summoning_pool, on) in summoning_pools { + if let Some((_, name)) = SummoningPool::summoning_pools().get(summoning_pool) { + ui.checkbox(on, name.to_string()); } } +} - fn colosseums(ui: &mut Ui, vm:&mut ViewModel) { - let colosseums = &mut vm.slots[vm.index].events_vm.colosseums; - select_all_checkbox::(ui, colosseums, "All Colusseums"); - for (colosseum, on) in colosseums { - let colosseum_info: (u32,&str) = COLOSSEUMS.lock().unwrap()[&colosseum]; - ui.checkbox(on, colosseum_info.1.to_string()); +fn colosseums(ui: &mut Ui, vm: &mut ViewModel) { + let colosseums = &mut vm.characters[vm.index].events_vm.colosseums; + select_all_checkbox::(ui, colosseums, "All Colusseums"); + for (colosseum, on) in colosseums { + if let Some((_, name)) = Colosseum::colusseums().get(colosseum) { + ui.checkbox(on, name.to_string()); } } +} - fn select_all_checkbox(ui: &mut Ui, map: &mut BTreeMap, label: &str) { - let mut state = State::Off; - if map.values().all(|w|*w) { - state = State::On; - } - else if map.values().any(|w|*w) { - state = State::InBetween; - } +fn select_all_checkbox(ui: &mut Ui, map: &mut BTreeMap, label: &str) { + let mut state = State::Off; + if map.values().all(|w| *w) { + state = State::On; + } else if map.values().any(|w| *w) { + state = State::InBetween; + } - ui.horizontal(|ui| { - if three_states_checkbox(ui, &state).clicked() { - match state { - State::Off => map.values_mut().for_each(|w| *w = true), - State::On => map.values_mut().for_each(|w| *w = false), - State::InBetween => map.values_mut().for_each(|w| *w = true), - } + ui.horizontal(|ui| { + if three_states_checkbox(ui, &state).clicked() { + match state { + State::Off => map.values_mut().for_each(|w| *w = true), + State::On => map.values_mut().for_each(|w| *w = false), + State::InBetween => map.values_mut().for_each(|w| *w = true), } - ui.label(label); - }); - ui.separator(); - } -} \ No newline at end of file + } + ui.label(label); + }); + ui.separator(); +} diff --git a/src/ui/file_drop.rs b/src/ui/file_drop.rs new file mode 100644 index 0000000..6ab5b85 --- /dev/null +++ b/src/ui/file_drop.rs @@ -0,0 +1,62 @@ +use crate::{ + vm::notifications::{Notification, NotificationButtons, NotificationType, NOTIFICATIONS}, + App, +}; +use eframe::egui::{self, text::LayoutJob, FontSelection, Id, LayerId, Order, RichText, Style}; +use egui::{Align, Color32, Context}; + +/// Draws a Central Panel used for listening for dragged files and attempting +/// to open them when dropped. +pub fn file_drop_main_panel(ctx: &Context, app: &mut App) { + // Listen for dragged files and update path + egui::CentralPanel::default().show(ctx, |ui| { + // Check if hovering a file + let path = ctx.input(|i| { + if !i.raw.hovered_files.is_empty() { + let file = i.raw.hovered_files[0].clone(); + let path: std::path::PathBuf = file.path.expect("Error!"); + return path.into_os_string().into_string().expect(""); + } + "".to_string() + }); + + // Display indicator of hovering file + ui.centered_and_justified(|ui| { + if !path.is_empty() { + let painter = + ctx.layer_painter(LayerId::new(Order::Foreground, Id::new("file_drop_target"))); + + let screen_rect = ctx.screen_rect(); + painter.rect_filled(screen_rect, 0.0, Color32::from_black_alpha(96)); + ui.label(egui::RichText::new(path)); + } else { + let style = Style::default(); + let mut layout_job = LayoutJob::default(); + RichText::new("Drop a save file here or click 'Open' to browse").append_to( + &mut layout_job, + &style, + FontSelection::Default, + Align::Center, + ); + ui.label(layout_job); + } + }); + + // Check a file that has been dropped in the window + ctx.input(|i| { + if !i.raw.dropped_files.is_empty() { + let file = &i.raw.dropped_files[0]; + if let Some(path) = &file.path { + // Try to open file. Notify if there's error. + if let Err(err) = app.open(&path) { + NOTIFICATIONS.write().unwrap().push(Notification::new( + NotificationType::Error, + format!("Failed to open file: {}", err), + NotificationButtons::::None, + )); + } + } + } + }); + }); +} diff --git a/src/ui/general.rs b/src/ui/general.rs index 417ec42..33420a2 100644 --- a/src/ui/general.rs +++ b/src/ui/general.rs @@ -1,26 +1,31 @@ -pub mod general { - use eframe::egui::{self, Ui}; - use crate::vm::{general::general_view_model::Gender, vm::vm::ViewModel}; +use crate::vm::{general::general_view_model::Gender, vm::ViewModel}; +use eframe::egui::{self, Ui}; +/// Draws the 'General' route view. +pub fn general(ui: &mut Ui, vm: &mut ViewModel) { + ui.with_layout(egui::Layout::top_down_justified(egui::Align::Min), |ui| { + let general_vm = &mut vm.characters[vm.index].general_vm; - pub fn general(ui: &mut Ui, vm:&mut ViewModel) { - ui.with_layout( egui::Layout::top_down_justified(egui::Align::Min),|ui|{ - let general_vm = &mut vm.slots[vm.index].general_vm; - - // Character Name - ui.label("Character Name:"); - ui.add(egui::widgets::TextEdit::singleline(&mut general_vm.character_name).char_limit(0x10)); - - ui.add_space(8.0); + // Character Name + ui.label("Character Name:"); + ui.add(egui::widgets::TextEdit::singleline(&mut general_vm.character_name).char_limit(16)); - ui.horizontal(|ui|{ - if ui.radio(general_vm.gender == Gender::Male, "Male").clicked(){ - general_vm.gender = Gender::Male; - }; - if ui.radio(general_vm.gender == Gender::Female, "Female").clicked(){ - general_vm.gender = Gender::Female; - }; - }); + ui.add_space(8.0); + + // Gender + ui.horizontal(|ui| { + if ui + .radio(general_vm.gender == Gender::Male, "Male") + .clicked() + { + general_vm.gender = Gender::Male; + }; + if ui + .radio(general_vm.gender == Gender::Female, "Female") + .clicked() + { + general_vm.gender = Gender::Female; + }; }); - } -} \ No newline at end of file + }); +} diff --git a/src/ui/importer.rs b/src/ui/importer.rs index 5a3f06c..a4a1d25 100644 --- a/src/ui/importer.rs +++ b/src/ui/importer.rs @@ -1,43 +1,94 @@ -pub mod import { - use eframe::egui::{self, Color32, Ui}; - use crate::{save::save::save::Save, vm::{importer::general_view_model::ImporterViewModel, vm::vm::ViewModel}}; +use eframe::egui::{self, Color32, Ui}; +use er_save_lib::SaveApi; - pub fn character_importer(ui: &mut Ui, open: &mut bool, importer_vm: &mut ImporterViewModel, to_save:&mut Save, vm: &mut ViewModel) { - egui::Window::new("Importer") - .open(open) +use crate::vm::{ + importer::ImporterViewModel, + notifications::{Notification, NotificationButtons, NotificationType, NOTIFICATIONS}, + vm::ViewModel, +}; + +/// Draws a window showing the character importer. +pub fn character_importer( + ui: &mut Ui, + app_save_api: &mut SaveApi, + vm: &mut ViewModel, + importer_vm: &mut ImporterViewModel, + importer_open: &mut bool, +) { + // Window (Importer) + egui::Window::new("Importer") + .open(importer_open) .resizable(false) .show(ui.ctx(), |ui| { + // Check if save file is valid if importer_vm.valid { - ui.columns(2, |uis|{ - uis[0].vertical_centered_justified(|ui|{ + // Row with two columns (FROM list, and TO list) + ui.columns(2, |uis| { + // FROM character List + uis[0].vertical_centered_justified(|ui| { ui.heading("From"); ui.separator(); - for (i, from_character) in importer_vm.from_list.iter().filter(|c|c.active).enumerate() { - if ui.selectable_label(importer_vm.selected_from_index == i, &from_character.name).clicked() { - importer_vm.selected_from_index = i + for (i, from_character) in importer_vm + .from_list + .iter() + .filter(|c| c.active) + .enumerate() + { + if ui + .selectable_label(importer_vm.from_index == i, &from_character.name) + .clicked() + { + importer_vm.from_index = i } } }); - uis[1].vertical_centered_justified(|ui|{ + // TO character list + uis[1].vertical_centered_justified(|ui| { ui.heading("To"); ui.separator(); - for (i, to_character) in importer_vm.to_list.iter().filter(|c|c.active).enumerate() { - if ui.selectable_label(importer_vm.selected_to_index == i, &to_character.name).clicked() { - importer_vm.selected_to_index = i + for (i, to_character) in + importer_vm.to_list.iter().filter(|c| c.active).enumerate() + { + let character_name = if to_character.name.is_empty() { + format!("-- empty --") + } else { + to_character.name.to_string() + }; + if ui + .selectable_label(importer_vm.to_index == i, character_name) + .clicked() + { + importer_vm.to_index = i } } }); }); + + // Space ui.add_space(5.); - ui.vertical_centered_justified(|ui|{ - if ui.add_sized([ui.available_width(), 40.], egui::widgets::Button::new("Import")).clicked() { - importer_vm.import_character(to_save, vm); + + // Import Button + ui.vertical_centered_justified(|ui| { + if ui + .add_sized( + [ui.available_width(), 40.], + egui::widgets::Button::new("Import"), + ) + .clicked() + { + if let Err(err) = importer_vm.import_character(app_save_api, vm) { + NOTIFICATIONS.write().unwrap().push(Notification::new( + NotificationType::Error, + format!("Failed to import character: {}", err), + NotificationButtons::::None, + )); + }; } }); - } - else { - ui.label(egui::RichText::new("Save file has irregular data!").color(Color32::DARK_RED)); + } else { + ui.label( + egui::RichText::new("Save file has irregular data!").color(Color32::DARK_RED), + ); } }); - } -} \ No newline at end of file +} diff --git a/src/ui/information.rs b/src/ui/information.rs new file mode 100644 index 0000000..31e986f --- /dev/null +++ b/src/ui/information.rs @@ -0,0 +1,43 @@ +use eframe::egui::{self, Color32, Context}; +use er_save_lib::SaveType; +use crate::App; + +/// Draws a top panel with showing information about the opened save information like platform, +/// active character name and steam_id. +pub(crate) fn information_top_panel(ctx: &Context, app: &mut App) { + egui::TopBottomPanel::top("top").show(ctx, |ui| { + if app.picked_path.exists() { + let save_type = match app.save_api.as_ref().unwrap().platform() { + SaveType::PC => "Platform: PC", + SaveType::Playstation => "Platform: Playstation", + }; + + ui.columns(2,| uis| { + if app.save_api.is_some() { + egui::Frame::none().show(&mut uis[1], |ui| { + let steam_id_text_edit = egui::widgets::TextEdit::singleline(&mut app.vm.steam_id) + .char_limit(17) + .desired_width(125.); + ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { + ui.label(format!("Character: {}", app.save_api.as_ref().unwrap().character_name(app.vm.index))); + + if app.save_api.as_ref().unwrap().platform() == SaveType::PC { + let steam_id_text_edit = ui.add(steam_id_text_edit).labelled_by(ui.label("Steam Id:").id); + if steam_id_text_edit.hovered() { + egui::popup::show_tooltip(ui.ctx(), steam_id_text_edit.id, |ui|{ + ui.label(egui::RichText::new("Important: This needs to match the id of the steam account that will use this save!").size(8.0).color(Color32::PLACEHOLDER)); + }); + } + } + }); + }); + } + egui::Frame::none().show(&mut uis[0], |ui| { + ui.with_layout(egui::Layout::left_to_right(egui::Align::Center), |ui| { + ui.label(format!("{}",save_type)); + }); + }); + }); + } + }); +} diff --git a/src/ui/inventory/add.rs b/src/ui/inventory.old/add.rs similarity index 100% rename from src/ui/inventory/add.rs rename to src/ui/inventory.old/add.rs diff --git a/src/ui/inventory.old/mod.rs b/src/ui/inventory.old/mod.rs new file mode 100644 index 0000000..fc8df46 --- /dev/null +++ b/src/ui/inventory.old/mod.rs @@ -0,0 +1,3 @@ +// mod add; +mod browse; +// pub mod inventory; diff --git a/src/ui/inventory/add/add.rs b/src/ui/inventory/add/add.rs new file mode 100644 index 0000000..027d118 --- /dev/null +++ b/src/ui/inventory/add/add.rs @@ -0,0 +1,520 @@ +use crate::{ + ui::custom::selectable::SelectableButton, + vm::{inventory::add::add::AddTypeRoute, vm::ViewModel}, +}; +use eframe::egui::{self, Layout, Ui}; +use er_save_lib::ItemType; + +use super::single::{single, single_customization}; + +pub(crate) fn add(ui: &mut Ui, vm: &mut ViewModel) { + let inventory_vm = &mut vm.characters[vm.index].inventory_vm; + + egui::TopBottomPanel::top("top_panel").show(ui.ctx(), |ui| { + ui.add_space(6.); + ui.columns(2, |uis| { + let single_button = uis[0].add_sized( + [100., 40.], + SelectableButton::new( + inventory_vm.add_vm.current_type_route == AddTypeRoute::Single, + "Single", + ), + ); + let bulk_button = uis[1].add_sized( + [100., 40.], + SelectableButton::new( + inventory_vm.add_vm.current_type_route == AddTypeRoute::Bulk, + "Bulk", + ), + ); + + if single_button.clicked() { + inventory_vm.add_vm.current_type_route = AddTypeRoute::Single; + }; + if bulk_button.clicked() { + inventory_vm.add_vm.current_type_route = AddTypeRoute::Bulk; + }; + }); + + ui.add_space(6.); + ui.columns(5, |uis| { + let common_items = uis[0].add_sized( + [uis[0].available_width(), 40.], + SelectableButton::new( + inventory_vm.add_vm.current_sub_type_route == ItemType::Item, + "Items", + ), + ); + let weapons = uis[1].add_sized( + [uis[1].available_width(), 40.], + SelectableButton::new( + inventory_vm.add_vm.current_sub_type_route == ItemType::Weapon, + "Weapons", + ), + ); + let armors = uis[2].add_sized( + [uis[2].available_width(), 40.], + SelectableButton::new( + inventory_vm.add_vm.current_sub_type_route == ItemType::Armor, + "Armors", + ), + ); + let ashofwar = uis[3].add_sized( + [uis[3].available_width(), 40.], + SelectableButton::new( + inventory_vm.add_vm.current_sub_type_route == ItemType::Aow, + "Ash of War", + ), + ); + let talismans = uis[4].add_sized( + [uis[4].available_width(), 40.], + SelectableButton::new( + inventory_vm.add_vm.current_sub_type_route == ItemType::Accessory, + "Talismans", + ), + ); + + if common_items.clicked() { + inventory_vm + .add_vm + .to_route(ItemType::Item, &inventory_vm.filter_text); + } + if weapons.clicked() { + inventory_vm + .add_vm + .to_route(ItemType::Weapon, &inventory_vm.filter_text); + } + if armors.clicked() { + inventory_vm + .add_vm + .to_route(ItemType::Armor, &inventory_vm.filter_text); + } + if ashofwar.clicked() { + inventory_vm + .add_vm + .to_route(ItemType::Aow, &inventory_vm.filter_text); + } + if talismans.clicked() { + inventory_vm + .add_vm + .to_route(ItemType::Accessory, &inventory_vm.filter_text); + } + }); + + ui.add_space(6.); + }); + // Side Panel + egui::SidePanel::left("item_choice").show(ui.ctx(), |ui| { + match &inventory_vm.add_vm.current_type_route { + AddTypeRoute::Single => single(ui, inventory_vm), + AddTypeRoute::Bulk => {} + } + }); + + // Central View (Item Customization) + egui::CentralPanel::default().show(ui.ctx(), |ui| { + ui.with_layout(Layout::top_down(egui::Align::Min), |ui| { + egui::ScrollArea::vertical().show(ui, |ui| { + ui.add_space(8.); + ui.vertical(|ui| { + // Single Item customization view + match &inventory_vm.add_vm.current_type_route { + AddTypeRoute::Single => single_customization(ui, inventory_vm), + AddTypeRoute::Bulk => {} + } + }); + }); + }); + ui.separator(); + ui.with_layout(Layout::top_down(egui::Align::Min), |ui| { + ui.push_id("log", |ui| { + egui::ScrollArea::vertical() + .auto_shrink(false) + .max_height(ui.available_height() - 8.) + .show_rows(ui, 10., inventory_vm.log.len(), |ui, row_range| { + for i in row_range { + ui.label( + egui::RichText::new(&inventory_vm.log[i]) + .monospace() + .size(10.), + ); + } + }); + }); + }); + }); +} + +// fn single_item_customization( +// ui: &mut Ui, +// inventory_vm: &mut InventoryViewModel, +// regulation_vm: &mut RegulationViewModel, +// ) { +// if !regulation_vm.selected_item.name.is_empty() { +// egui::Frame::none().inner_margin(8.).show(ui, |ui| { +// ui.label( +// egui::RichText::new(regulation_vm.selected_item.name.to_string()) +// .strong() +// .heading() +// .size(24.), +// ); +// ui.add_space(8.); + +// match inventory_vm.current_type_route { +// InventoryTypeRoute::CommonItems | InventoryTypeRoute::KeyItems => { +// let res = +// Regulation::equip_goods_param_map().get(®ulation_vm.selected_item.id); +// if res.is_some() { +// let item = res.unwrap(); +// let goods_type = GoodsType::from(item.data.goodsType); +// let max_repository_num = if goods_type == GoodsType::KeyItem { +// item.data.maxNum +// } else { +// item.data.maxRepositoryNum +// }; +// let field = egui::DragValue::new( +// regulation_vm.selected_item.quantity.as_mut().unwrap(), +// ) +// .clamp_range(1..=max_repository_num); +// ui.horizontal(|ui| { +// let label = ui.label("Quantity"); +// ui.add(field).labelled_by(label.id); +// }); +// } +// } +// InventoryTypeRoute::Weapons => { +// egui::Grid::new("grid") +// .num_columns(2) +// .spacing([8., 8.]) +// .show(ui, |ui| { +// let res = Regulation::equip_weapon_params_map() +// .get(®ulation_vm.selected_item.id); +// if res.is_some() { +// let item = res.unwrap(); +// let wep_type = WepType::from(item.data.wepType); + +// if wep_type == WepType::Arrow +// || wep_type == WepType::Greatarrow +// || wep_type == WepType::Bolt +// || wep_type == WepType::BallistaBolt +// { +// ui.horizontal(|ui| { +// let field = egui::DragValue::new( +// regulation_vm.selected_item.quantity.as_mut().unwrap(), +// ) +// .clamp_range(1..=item.data.maxArrowQuantity); +// let label = ui.label("Quantity"); +// ui.add(field).labelled_by(label.id); +// }); +// } else { +// let max_upgrade = if item.data.reinforceTypeId != 0 +// && (item.data.reinforceTypeId % 2200 == 0 +// || item.data.reinforceTypeId % 2400 == 0 +// || item.data.reinforceTypeId % 3200 == 0 +// || item.data.reinforceTypeId % 3300 == 0 +// || item.data.reinforceTypeId % 8300 == 0 +// || item.data.reinforceTypeId % 8500 == 0) +// { +// 10 +// } else { +// 25 +// }; +// let field = egui::DragValue::new( +// regulation_vm.selected_item.upgrade.as_mut().unwrap(), +// ) +// .clamp_range(0..=max_upgrade) +// .custom_formatter(|n, _| format!("+{}", n)); +// let label = ui.add(egui::Label::new("Weapon Level:")); +// ui.add(field).labelled_by(label.id); +// ui.end_row(); + +// if regulation_vm.available_infusions.len() > 0 { +// ui.add(egui::Label::new("Infusion:")); +// if egui::ComboBox::new("infsuion", "") +// .show_index( +// ui, +// &mut regulation_vm.selected_infusion, +// regulation_vm.available_infusions.len(), +// |i| { +// regulation_vm.available_infusions[i] +// .name +// .to_string() +// }, +// ) +// .changed() +// { +// regulation_vm.update_available_affinities(); +// regulation_vm.selected_item.infusion = Some( +// regulation_vm.available_infusions +// [regulation_vm.selected_infusion] +// .id, +// ); +// }; +// ui.end_row(); +// } + +// if regulation_vm.available_affinities.len() > 0 { +// ui.add(egui::Label::new("Affintiy:")); +// if egui::ComboBox::new("affinity", "") +// .show_index( +// ui, +// &mut regulation_vm.selected_affinity, +// regulation_vm.available_affinities.len(), +// |i| { +// regulation_vm.available_affinities[i] +// .to_string() +// }, +// ) +// .changed() +// { +// regulation_vm.selected_item.affinity = Some( +// regulation_vm.available_affinities +// [regulation_vm.selected_affinity] +// .as_i16(), +// ); +// }; +// ui.end_row(); +// } +// } +// } +// }); +// } +// InventoryTypeRoute::Armors +// | InventoryTypeRoute::AshOfWar +// | InventoryTypeRoute::Talismans => {} +// }; +// }); + +// egui::Frame::none().inner_margin(8.).show(ui, |ui| { +// ui.add_enabled_ui(true, |ui| { +// if ui +// .add_sized([ui.available_width(), 40.], egui::Button::new("Add")) +// .clicked() +// { +// inventory_vm.add_to_inventory(®ulation_vm.selected_item); +// } +// }) +// }); +// } +// } + +// fn bulk_item_customization(ui: &mut Ui, inventory_vm: &mut InventoryViewModel) { +// egui::Frame::none().inner_margin(8.).show(ui, |ui| { +// ui.label( +// egui::RichText::new("Customize") +// .strong() +// .heading() +// .size(24.), +// ); +// ui.add_space(6.); +// match inventory_vm.current_bulk_type_route { +// InventoryTypeRoute::CommonItems | InventoryTypeRoute::KeyItems => { +// ui.add(egui::Checkbox::new( +// &mut inventory_vm.bulk_items_max_quantity, +// "Max Quantity", +// )); +// } +// InventoryTypeRoute::Weapons => { +// egui::Grid::new("bulk_items_customization") +// .spacing(Vec2::new(6., 6.)) +// .show(ui, |ui| { +// let field = +// egui::DragValue::new(&mut inventory_vm.bulk_items_arrow_quantity) +// .clamp_range(1..=99); +// let label = ui.label("Projectile Quantity"); +// ui.add(field).labelled_by(label.id); +// ui.end_row(); + +// let label = ui.label("Weapon Level:"); +// ui.add( +// egui::DragValue::new(&mut inventory_vm.bulk_items_weapon_level) +// .clamp_range(0..=25) +// .custom_formatter(|val, _| { +// let somber_upgrade_level: f64 = (val + 0.5) / 2.5; +// format!( +// "Normal: +{}\t Somber: +{}", +// val as u32, somber_upgrade_level as u32 +// ) +// }), +// ) +// .labelled_by(label.id); +// ui.end_row(); +// }); +// } +// InventoryTypeRoute::Armors +// | InventoryTypeRoute::AshOfWar +// | InventoryTypeRoute::Talismans => {} +// }; +// }); + +// egui::Frame::none().inner_margin(8.).show(ui, |ui| { +// ui.add_enabled_ui(true, |ui| { +// if ui +// .add_sized([ui.available_width(), 40.], egui::Button::new("Add All")) +// .clicked() +// { +// inventory_vm.add_all_to_inventory(); +// } +// }) +// }); +// } + +// fn select_all_sub_group_checkbox(ui: &mut Ui, inventory_vm: &mut InventoryViewModel, index: usize) { +// if inventory_vm.bulk_items_selected.is_empty() { +// return; +// } +// let is_all_selected = inventory_vm.bulk_items_selected[index] +// .values() +// .all(|on| *on); +// let is_any_selected = inventory_vm.bulk_items_selected[index] +// .values() +// .any(|on| *on); +// let state = if is_all_selected { +// State::On +// } else if is_any_selected { +// State::InBetween +// } else { +// State::Off +// }; +// if three_states_checkbox(ui, &state).clicked() { +// match state { +// State::On => inventory_vm.bulk_items_selected[index] +// .values_mut() +// .for_each(|selected| *selected = false), +// State::Off => inventory_vm.bulk_items_selected[index] +// .values_mut() +// .for_each(|selected| *selected = true), +// State::InBetween => inventory_vm.bulk_items_selected[index] +// .values_mut() +// .for_each(|selected| *selected = true), +// } +// }; +// } + +// fn bulk(ui: &mut Ui, inventory_vm: &mut InventoryViewModel) { +// ui.with_layout(Layout::top_down(egui::Align::Min), |ui| { +// ui.add_space(8.); + +// ui.horizontal(|ui| { +// let is_all_selected = inventory_vm +// .bulk_items_selected +// .iter() +// .all(|map| map.values().all(|on| *on)); +// let is_any_selected = inventory_vm +// .bulk_items_selected +// .iter() +// .any(|map| map.values().any(|on| *on)); +// let state = if is_all_selected { +// State::On +// } else if is_any_selected { +// State::InBetween +// } else { +// State::Off +// }; +// if three_states_checkbox(ui, &state).clicked() { +// match state { +// State::On => inventory_vm +// .bulk_items_selected +// .iter_mut() +// .for_each(|map| map.values_mut().for_each(|selected| *selected = false)), +// State::Off => inventory_vm +// .bulk_items_selected +// .iter_mut() +// .for_each(|map| map.values_mut().for_each(|selected| *selected = true)), +// State::InBetween => inventory_vm +// .bulk_items_selected +// .iter_mut() +// .for_each(|map| map.values_mut().for_each(|selected| *selected = true)), +// } +// }; +// ui.label("Select All"); +// }); +// ui.separator(); +// egui::ScrollArea::vertical() +// .auto_shrink(false) +// .max_height(ui.available_height() - 8.) +// .show(ui, |ui| { +// match inventory_vm.current_bulk_type_route { +// InventoryTypeRoute::KeyItems | InventoryTypeRoute::CommonItems => { +// for (index, (group_name, items)) in items().iter().enumerate() { +// ui.horizontal(|ui| { +// select_all_sub_group_checkbox(ui, inventory_vm, index); +// ui.collapsing(group_name, |ui| { +// for item in items { +// ui.checkbox( +// &mut inventory_vm.bulk_items_selected[index] +// .get_mut(&item) +// .unwrap(), +// ITEM_NAME.lock().unwrap()[&(item ^ 0x40000000)], +// ); +// } +// }); +// }); +// } +// } +// InventoryTypeRoute::Weapons => { +// for (index, (group_name, weapons)) in weapons().iter().enumerate() { +// ui.horizontal(|ui| { +// select_all_sub_group_checkbox(ui, inventory_vm, index); +// ui.collapsing(group_name, |ui| { +// for weapon in weapons { +// ui.checkbox( +// &mut inventory_vm.bulk_items_selected[index] +// .get_mut(&weapon) +// .unwrap(), +// WEAPON_NAME.lock().unwrap()[&weapon], +// ); +// } +// }); +// }); +// } +// } +// InventoryTypeRoute::Armors => { +// for (index, (group_name, armor_sets)) in armor_sets().iter().enumerate() { +// ui.horizontal(|ui| { +// select_all_sub_group_checkbox(ui, inventory_vm, index); +// ui.collapsing(group_name, |ui| { +// for armor in armor_sets { +// ui.checkbox( +// &mut inventory_vm.bulk_items_selected[index] +// .get_mut(&armor) +// .unwrap(), +// ARMOR_NAME.lock().unwrap()[&(armor ^ 0x10000000)], +// ); +// } +// }); +// }); +// } +// } +// InventoryTypeRoute::AshOfWar => { +// for (index, (_, aows)) in aows().iter().enumerate() { +// ui.vertical(|ui| { +// for aow in aows { +// ui.checkbox( +// &mut inventory_vm.bulk_items_selected[index] +// .get_mut(&aow) +// .unwrap(), +// AOW_NAME.lock().unwrap()[&(aow ^ 0x80000000)], +// ); +// } +// }); +// } +// } +// InventoryTypeRoute::Talismans => { +// for (index, (_, talismans)) in talismans().iter().enumerate() { +// ui.vertical(|ui| { +// for talisman in talismans { +// ui.checkbox( +// &mut inventory_vm.bulk_items_selected[index] +// .get_mut(&talisman) +// .unwrap(), +// ACCESSORY_NAME.lock().unwrap()[&(talisman ^ 0x20000000)], +// ); +// } +// }); +// } +// } +// }; +// }); +// }); +// } diff --git a/src/ui/inventory/add/mod.rs b/src/ui/inventory/add/mod.rs new file mode 100644 index 0000000..38bb54f --- /dev/null +++ b/src/ui/inventory/add/mod.rs @@ -0,0 +1,2 @@ +pub(crate) mod add; +pub(crate) mod single; diff --git a/src/ui/inventory/add/single.rs b/src/ui/inventory/add/single.rs new file mode 100644 index 0000000..8e56c1a --- /dev/null +++ b/src/ui/inventory/add/single.rs @@ -0,0 +1,201 @@ +use std::rc::Rc; + +use eframe::egui::{self, Color32, Layout, Ui}; + +use crate::vm::inventory::{add::add::SelectedItem, inventory::InventoryViewModel}; + +/// Draws the list for adding single items +pub(crate) fn single(ui: &mut Ui, inventory_vm: &mut InventoryViewModel) { + ui.with_layout(Layout::top_down(egui::Align::Max), |ui| { + ui.add_space(8.); + ui.horizontal(|ui| { + if ui + .add(egui::TextEdit::singleline(&mut inventory_vm.filter_text)) + .labelled_by(ui.label("Filter:").id) + .changed() + { + inventory_vm.add_vm.to_route( + inventory_vm.add_vm.current_sub_type_route.clone(), + &inventory_vm.filter_text, + ); + }; + }); + ui.separator(); + ui.add_space(6.); + + let row_height = 10.; + egui::ScrollArea::vertical() + .max_height(ui.available_height() - 8.) + .show_rows( + ui, + row_height, + inventory_vm.add_vm.current_list.len(), + |ui, row_range| { + for i in row_range { + let item = inventory_vm.add_vm.current_list[i].clone(); + let mut text = egui::RichText::new(format!( + "{}", + item.as_ref().borrow().item_name.as_ref().borrow() + )); + if let Some(header) = &inventory_vm.add_vm.selected_header { + if Rc::ptr_eq(header, &item) { + text = egui::RichText::new(format!( + "{}", + item.as_ref().borrow().item_name.as_ref().borrow() + )) + .strong() + .heading(); + } + } + ui.with_layout(Layout::left_to_right(egui::Align::Min), |ui| { + if ui + .add(egui::Button::new(text).fill(Color32::TRANSPARENT)) + .clicked() + { + inventory_vm.add_vm.select_item(item.clone()); + inventory_vm.add_vm.selected_infusion = 0; + }; + }); + } + }, + ); + }); +} + +/// Draws the customization view for adding a single item +pub(crate) fn single_customization(ui: &mut Ui, inventory_vm: &mut InventoryViewModel) { + if inventory_vm.add_vm.selected_header.is_none() { + return; + } + + egui::Frame::none().inner_margin(8.).show(ui, |ui| { + ui.label( + egui::RichText::new( + inventory_vm + .add_vm + .selected_header + .as_ref() + .unwrap() + .as_ref() + .borrow() + .item_name + .as_ref() + .borrow() + .to_string(), + ) + .strong() + .heading() + .size(24.), + ); + ui.add_space(8.); + + match &inventory_vm.add_vm.selected_item { + // No customization needed for these item categories + SelectedItem::None + | SelectedItem::Armor(_) + | SelectedItem::Accessory(_) + | SelectedItem::Aow(_) => { + return; + } + + // Draw item customization + SelectedItem::Item(item) => { + let field = egui::DragValue::new(&mut inventory_vm.add_vm.selected_item_quantity) + .clamp_range(1..=item.as_ref().borrow().param.maxRepositoryNum); + ui.horizontal(|ui| { + let label = ui.label("Quantity"); + ui.add(field).labelled_by(label.id); + }); + } + + // Draw weapon customization + SelectedItem::Weapon(item) => { + let weapon_type = item.as_ref().borrow().weapon_type(); + ui.label(egui::RichText::new(weapon_type.to_string()).size(10.)); + ui.add_space(8.); + + // Draw max quantity drag value if there's any + let max_quantity = item.as_ref().borrow().param.maxArrowQuantity; + if max_quantity > 1 { + let field = + egui::DragValue::new(&mut inventory_vm.add_vm.selected_item_quantity) + .clamp_range(1..=item.as_ref().borrow().param.maxArrowQuantity); + ui.horizontal(|ui| { + let label = ui.label("Quantity"); + ui.add(field).labelled_by(label.id); + }); + } + + // Weapon customization grid + egui::Grid::new("grid") + .num_columns(2) + .spacing([8., 8.]) + .show(ui, |ui| { + // Determine max upgrade if any + let reinforce_type_id = item.as_ref().borrow().param.materialSetId; + let max_upgrade = if reinforce_type_id == -1 { + None + } else if reinforce_type_id == 2200 { + Some(10) + } else { + Some(25) + }; + + // Draw max upgrade drag value if there's any + if let Some(max_upgrade) = max_upgrade { + let field = egui::DragValue::new( + &mut inventory_vm.add_vm.selected_weapon_level, + ) + .clamp_range(0..=max_upgrade) + .custom_formatter(|n, _| format!("+{}", n)); + let label = ui.add(egui::Label::new("Weapon Level:")); + ui.add(field).labelled_by(label.id); + ui.end_row(); + } + + // Draw available ash of war Infusions combo box if there's any + if item.as_ref().borrow().is_infusable() { + ui.add(egui::Label::new("Ash Of War:")); + if inventory_vm.add_vm.available_infusions.len() > 0 { + if egui::ComboBox::new("infsuion", "") + .show_index( + ui, + &mut inventory_vm.add_vm.selected_infusion, + inventory_vm.add_vm.available_infusions.len(), + |i| { + inventory_vm.add_vm.available_infusions[i] + .as_ref() + .borrow() + .item_name + .as_ref() + .borrow() + .to_string() + }, + ) + .changed() + {}; + } + ui.end_row(); + } + }); + } + } + }); + + egui::Frame::none().inner_margin(8.).show(ui, |ui| { + ui.add_enabled_ui(true, |ui| { + if ui + .add_sized([ui.available_width(), 40.], egui::Button::new("Add")) + .clicked() + { + // inventory_vm.add_to_inventory(®ulation_vm.selected_item); + } + }) + }); +} + +pub(crate) fn single_item_customization(ui: &mut Ui, inventory_vm: &mut InventoryViewModel) {} + +pub(crate) fn single_weapon_customization(ui: &mut Ui, inventory_vm: &mut InventoryViewModel) {} + +pub(crate) fn single_projectile_customization(ui: &mut Ui, inventory_vm: &mut InventoryViewModel) {} diff --git a/src/ui/inventory/browse.rs b/src/ui/inventory/browse.rs index 96f3a6f..6afdcc7 100644 --- a/src/ui/inventory/browse.rs +++ b/src/ui/inventory/browse.rs @@ -1,112 +1,228 @@ -use eframe::{egui::{self, Margin, TextFormat, Ui}, epaint::{text::LayoutJob, Color32}}; -use crate::vm::{inventory::InventoryTypeRoute, vm::vm::ViewModel}; +use crate::{ + ui::custom::selectable::SelectableButton, + vm::{ + inventory::browse::{BrowseStorageType, BrowseTypeRoute}, + vm::ViewModel, + }, +}; +use eframe::{ + egui::{self, Margin, TextFormat, Ui}, + epaint::{text::LayoutJob, Color32}, +}; +use er_save_lib::ItemType; -pub fn browse_inventory(ui: &mut Ui, vm:&mut ViewModel) { - let inventory_vm = &mut vm.slots[vm.index].inventory_vm; - +pub fn browse_inventory(ui: &mut Ui, vm: &mut ViewModel) { + let inventory_vm = &mut vm.characters[vm.index].inventory_vm; ui.columns(2, |uis| { - let equipped_button = uis[0].add_sized([100.,40.], egui::widgets::Button::new("Equipped")); - let storage_button = uis[1].add_sized([100.,40.], egui::widgets::Button::new("Storage Box")); + let held_button = uis[0].add_sized( + [100., 40.], + SelectableButton::new( + inventory_vm.browse_vm.current_storage_type == BrowseStorageType::Held, + "Held", + ), + ); + let storage_box_button = uis[1].add_sized( + [100., 40.], + SelectableButton::new( + inventory_vm.browse_vm.current_storage_type == BrowseStorageType::StorageBox, + "Storage Box", + ), + ); - if equipped_button.clicked() {inventory_vm.at_storage_box = false;}; - if storage_button.clicked() {inventory_vm.at_storage_box = true;}; - - if inventory_vm.at_storage_box {storage_button.highlight();} - else {equipped_button.highlight();} + if held_button.clicked() { + inventory_vm.browse_vm.current_storage_type = BrowseStorageType::Held; + inventory_vm.browse_vm.filter(&inventory_vm.filter_text); + }; + if storage_box_button.clicked() { + inventory_vm.browse_vm.current_storage_type = BrowseStorageType::StorageBox; + inventory_vm.browse_vm.filter(&inventory_vm.filter_text); + }; }); ui.add_space(6.); - ui.columns(6,|uis| { - let common_items = uis[0].add_sized([uis[0].available_width(), 40.], egui::Button::new("Common Item")); - let key_items = uis[1].add_sized([uis[1].available_width(), 40.], egui::Button::new("Key Item")); - let weapons = uis[2].add_sized([uis[2].available_width(), 40.], egui::Button::new("Weapons")); - let armors = uis[3].add_sized([uis[3].available_width(), 40.], egui::Button::new("Armors")); - let ashofwar = uis[4].add_sized([uis[4].available_width(), 40.], egui::Button::new("Ash of War")); - let talismans = uis[5].add_sized([uis[5].available_width(), 40.], egui::Button::new("Talismans")); + ui.columns(6, |uis| { + let common_items = uis[0].add_sized( + [uis[0].available_width(), 40.], + SelectableButton::new( + inventory_vm.browse_vm.current_type_route == BrowseTypeRoute::RegularItems + && inventory_vm.browse_vm.current_sub_type_route == ItemType::Item, + "Common Item", + ), + ); + let key_items = uis[1].add_sized( + [uis[1].available_width(), 40.], + SelectableButton::new( + inventory_vm.browse_vm.current_type_route == BrowseTypeRoute::KeyItems + && inventory_vm.browse_vm.current_sub_type_route == ItemType::Item, + "Key Item", + ), + ); + let weapons = uis[2].add_sized( + [uis[2].available_width(), 40.], + SelectableButton::new( + inventory_vm.browse_vm.current_type_route == BrowseTypeRoute::RegularItems + && inventory_vm.browse_vm.current_sub_type_route == ItemType::Weapon, + "Weapons", + ), + ); + let armors = uis[3].add_sized( + [uis[3].available_width(), 40.], + SelectableButton::new( + inventory_vm.browse_vm.current_type_route == BrowseTypeRoute::RegularItems + && inventory_vm.browse_vm.current_sub_type_route == ItemType::Armor, + "Armors", + ), + ); + let ashofwar = uis[4].add_sized( + [uis[4].available_width(), 40.], + SelectableButton::new( + inventory_vm.browse_vm.current_type_route == BrowseTypeRoute::RegularItems + && inventory_vm.browse_vm.current_sub_type_route == ItemType::Aow, + "Ash of War", + ), + ); + let talismans = uis[5].add_sized( + [uis[5].available_width(), 40.], + SelectableButton::new( + inventory_vm.browse_vm.current_type_route == BrowseTypeRoute::RegularItems + && inventory_vm.browse_vm.current_sub_type_route == ItemType::Accessory, + "Talismans", + ), + ); - if common_items.clicked() {inventory_vm.current_type_route = InventoryTypeRoute::CommonItems} - if key_items.clicked() {inventory_vm.current_type_route = InventoryTypeRoute::KeyItems} - if weapons.clicked() {inventory_vm.current_type_route = InventoryTypeRoute::Weapons} - if armors.clicked() {inventory_vm.current_type_route = InventoryTypeRoute::Armors} - if ashofwar.clicked() {inventory_vm.current_type_route = InventoryTypeRoute::AshOfWar} - if talismans.clicked() {inventory_vm.current_type_route = InventoryTypeRoute::Talismans} - - // Highlight active - match inventory_vm.current_type_route { - InventoryTypeRoute::CommonItems => {common_items.highlight();}, - InventoryTypeRoute::KeyItems => {key_items.highlight();}, - InventoryTypeRoute::Weapons => {weapons.highlight();}, - InventoryTypeRoute::Armors => {armors.highlight();}, - InventoryTypeRoute::AshOfWar => {ashofwar.highlight();}, - InventoryTypeRoute::Talismans => {talismans.highlight();}, + if common_items.clicked() { + inventory_vm + .browse_vm + .to_regular_items_route(ItemType::Item, &inventory_vm.filter_text); + } + if key_items.clicked() { + inventory_vm + .browse_vm + .to_key_items_route(&inventory_vm.filter_text); + } + if weapons.clicked() { + inventory_vm + .browse_vm + .to_regular_items_route(ItemType::Weapon, &inventory_vm.filter_text); + } + if armors.clicked() { + inventory_vm + .browse_vm + .to_regular_items_route(ItemType::Armor, &inventory_vm.filter_text); + } + if ashofwar.clicked() { + inventory_vm + .browse_vm + .to_regular_items_route(ItemType::Aow, &inventory_vm.filter_text); + } + if talismans.clicked() { + inventory_vm + .browse_vm + .to_regular_items_route(ItemType::Accessory, &inventory_vm.filter_text); } }); ui.add_space(6.); - ui.horizontal(|ui|{ + ui.horizontal(|ui| { let height = 20.; let label = ui.label("Filter: "); - if ui.add_sized([ui.available_size().x,height], egui::widgets::TextEdit::singleline(&mut inventory_vm.filter_text)).labelled_by(label.id).changed() { - inventory_vm.filter(); + if ui + .add_sized( + [ui.available_size().x, height], + egui::widgets::TextEdit::singleline(&mut inventory_vm.filter_text), + ) + .labelled_by(label.id) + .changed() + { + inventory_vm.browse_vm.filter(&inventory_vm.filter_text); }; }); let mut frame = egui::Frame::none(); - frame.inner_margin = Margin { top: 8., left: 0., bottom: 8., right: 0. }; - frame.show(ui,|ui| { - egui::Grid::new("browse_header").spacing([16., 16.]).min_col_width(ui.available_width()/4.).striped(true).show(ui, |ui| { - // Table Header - let mut job = LayoutJob::default(); - job.append("Item ID", 0., TextFormat{ - color: Color32::BLACK, - ..Default::default() - }); - ui.label(job); - - let mut job = LayoutJob::default(); - job.append("Item Name", 0., TextFormat{ - color: Color32::BLACK, - ..Default::default() - }); - ui.label(job); - - let mut job = LayoutJob::default(); - job.append("Quantity", 0., TextFormat{ - color: Color32::BLACK, - ..Default::default() - }); - ui.label(job); - - let mut job = LayoutJob::default(); - job.append("Acquisition Sort ID", 0., TextFormat{ - color: Color32::BLACK, - ..Default::default() - }); - ui.label(job); - ui.end_row(); - }); - }); - - let current_inventory_list = match inventory_vm.current_type_route { - InventoryTypeRoute::CommonItems => &inventory_vm.storage[inventory_vm.at_storage_box as usize].filtered_items, - InventoryTypeRoute::KeyItems => &inventory_vm.storage[inventory_vm.at_storage_box as usize].filtered_key_items, - InventoryTypeRoute::Weapons => &inventory_vm.storage[inventory_vm.at_storage_box as usize].filtered_weapons, - InventoryTypeRoute::Armors => &inventory_vm.storage[inventory_vm.at_storage_box as usize].filtered_armors, - InventoryTypeRoute::AshOfWar => &inventory_vm.storage[inventory_vm.at_storage_box as usize].filtered_aows, - InventoryTypeRoute::Talismans => &inventory_vm.storage[inventory_vm.at_storage_box as usize].filtered_accessories, + frame.inner_margin = Margin { + top: 8., + left: 0., + bottom: 8., + right: 0., }; - egui::ScrollArea::vertical().show_rows(ui, 10., current_inventory_list.len(), |ui, row_range| { - egui::Grid::new("browse_body").spacing([8., 8.]).min_col_width(ui.available_width()/4.).striped(true).show(ui, |ui| { - for i in row_range { - let item = ¤t_inventory_list[i]; - ui.label(format!("{}",item.item_id)); - ui.add(egui::Label::new(item.item_name.to_string()).wrap(true)); - ui.label(format!("{}",item.quantity)); - ui.label(format!("{}",item.inventory_index)); + frame.show(ui, |ui| { + egui::Grid::new("browse_header") + .spacing([16., 16.]) + .min_col_width(ui.available_width() / 4.) + .striped(true) + .show(ui, |ui| { + // Table Header + let mut job = LayoutJob::default(); + job.append( + "Item ID", + 0., + TextFormat { + color: Color32::BLACK, + ..Default::default() + }, + ); + ui.label(job); + + let mut job = LayoutJob::default(); + job.append( + "Item Name", + 0., + TextFormat { + color: Color32::BLACK, + ..Default::default() + }, + ); + ui.label(job); + + let mut job = LayoutJob::default(); + job.append( + "Quantity", + 0., + TextFormat { + color: Color32::BLACK, + ..Default::default() + }, + ); + ui.label(job); + + let mut job = LayoutJob::default(); + job.append( + "Acquisition Sort ID", + 0., + TextFormat { + color: Color32::BLACK, + ..Default::default() + }, + ); + ui.label(job); ui.end_row(); - } - }); + }); }); -} \ No newline at end of file + + egui::ScrollArea::vertical().show_rows( + ui, + 10., + inventory_vm.browse_vm.current_item_list.len(), + |ui, row_range| { + egui::Grid::new("browse_body") + .spacing([8., 8.]) + .min_col_width(ui.available_width() / 4.) + .striped(true) + .show(ui, |ui| { + for i in row_range { + let item = inventory_vm.browse_vm.current_item_list[i].clone(); + ui.label(format!("{}", item.as_ref().borrow().item_id)); + ui.add( + egui::Label::new(item.as_ref().borrow().item_name.to_string()) + .wrap(true), + ); + ui.label(format!("{}", item.as_ref().borrow().quantity)); + ui.label(format!("{}", item.as_ref().borrow().aqcuistion_index)); + ui.end_row(); + } + }); + }, + ); +} diff --git a/src/ui/inventory/inventory.rs b/src/ui/inventory/inventory.rs index 77358e8..486dd34 100644 --- a/src/ui/inventory/inventory.rs +++ b/src/ui/inventory/inventory.rs @@ -1,48 +1,74 @@ -pub mod inventory { - use eframe::egui::{self, Color32, Ui}; - use crate::ui::inventory::{add::add, browse::browse_inventory}; - use crate::vm::{inventory::InventoryRoute, vm::vm::ViewModel}; +use crate::{ + ui::custom::selectable::SelectableButton, + vm::{inventory::inventory::InventoryRoute, vm::ViewModel}, +}; +use eframe::egui::{self, Ui}; - pub fn inventory(ui: &mut Ui, vm:&mut ViewModel) { - egui::SidePanel::left("inventory_menu").show(ui.ctx(), |ui|{ - egui::ScrollArea::vertical() +use super::{add::add::add, browse::browse_inventory}; + +pub fn inventory(ui: &mut Ui, vm: &mut ViewModel) { + let inventory_vm = &mut vm.characters[vm.index].inventory_vm; + egui::SidePanel::left("inventory_menu").show(ui.ctx(), |ui| { + egui::ScrollArea::vertical() .id_source("inventory_item_type_menu") .show(ui, |ui| { ui.vertical(|ui| { - let add_items = ui.add_sized([120., 60.], egui::Button::new("Add\n(WIP)")); - let browse_items = ui.add_sized([120., 40.], egui::Button::new("Browse")); + if ui + .add_sized( + [120., 60.], + SelectableButton::new( + inventory_vm.current_route == InventoryRoute::Add, + "Add\n(WIP)", + ), + ) + .clicked() + { + inventory_vm.current_route = InventoryRoute::Add; + }; + + if ui + .add_sized( + [120., 40.], + SelectableButton::new( + inventory_vm.current_route == InventoryRoute::Browse, + "Browse", + ), + ) + .clicked() + { + inventory_vm.current_route = InventoryRoute::Browse + }; - if add_items.clicked() { - vm.slots[vm.index].inventory_vm.filter(); - vm.slots[vm.index].inventory_vm.current_route = InventoryRoute::Add - } - if add_items.hovered() { - egui::popup::show_tooltip(ui.ctx(), add_items.id, |ui|{ - ui.label(egui::RichText::new("Warning: This is an experimental feature that is still being worked on. Use with catution.").size(8.0).color(Color32::PLACEHOLDER)); - }); - } - if browse_items.clicked() { - vm.slots[vm.index].inventory_vm.filter(); - vm.regulation.filter(&vm.slots[vm.index].inventory_vm.current_type_route, &vm.slots[vm.index].inventory_vm.filter_text); - vm.slots[vm.index].inventory_vm.current_route = InventoryRoute::Browse - } - - // Highlight active - match vm.slots[vm.index].inventory_vm.current_route { - InventoryRoute::None => {}, - InventoryRoute::Add => {add_items.highlight();}, - InventoryRoute::Browse => {browse_items.highlight();}, - } + // if add_items.clicked() { + // vm.slots[vm.index].inventory_vm.filter(); + // vm.slots[vm.index].inventory_vm.current_route = InventoryRoute::Add + // } + // if add_items.hovered() { + // egui::popup::show_tooltip(ui.ctx(), add_items.id, |ui|{ + // ui.label(egui::RichText::new("Warning: This is an experimental feature that is still being worked on. Use with catution.").size(8.0).color(Color32::PLACEHOLDER)); + // }); + // } + // if browse_items.clicked() { + // // vm.characters[vm.index].inventory_vm.filter(); + // // vm.regulation.filter( + // // &vm.slots[vm.index].inventory_vm.current_type_route, + // // &vm.slots[vm.index].inventory_vm.filter_text, + // // ); + // } }) }); - }); + }); - egui::CentralPanel::default().show(ui.ctx(), |ui|{ - match vm.slots[vm.index].inventory_vm.current_route { - InventoryRoute::None => {ui.label("Empty");}, - InventoryRoute::Add => {add(ui, vm);}, - InventoryRoute::Browse => {browse_inventory(ui, vm);}, - } - }); - } -} \ No newline at end of file + let current_route = inventory_vm.current_route.clone(); + egui::CentralPanel::default().show(ui.ctx(), |ui| match current_route { + InventoryRoute::None => { + ui.label("Empty"); + } + InventoryRoute::Add => { + add(ui, vm); + } + InventoryRoute::Browse => { + browse_inventory(ui, vm); + } + }); +} diff --git a/src/ui/inventory/mod.rs b/src/ui/inventory/mod.rs index f340a69..57c93b2 100644 --- a/src/ui/inventory/mod.rs +++ b/src/ui/inventory/mod.rs @@ -1,3 +1,3 @@ -mod add; -mod browse; -pub mod inventory; \ No newline at end of file +pub(crate) mod add; +pub(crate) mod browse; +pub(crate) mod inventory; diff --git a/src/ui/menu.rs b/src/ui/menu.rs index 5408f35..a2e34df 100644 --- a/src/ui/menu.rs +++ b/src/ui/menu.rs @@ -1,43 +1,75 @@ -pub mod menu { - use eframe::egui::{self, Ui}; - use crate::App; +use crate::App; +use eframe::egui::{self, Context}; - pub enum Route { - None, - General, - Stats, - Equipment, - Inventory, - EventFlags, - Regions, - } +pub enum Route { + None, + General, + Stats, + Equipment, + Inventory, + EventFlags, + Regions, +} - pub fn menu(ui: &mut Ui, app:&mut App) { - // Create the buttons - let general = ui.add_sized([120., 40.], egui::Button::new("General")); - let stats = ui.add_sized([120., 40.], egui::Button::new("Stats")); - let equipment = ui.add_sized([120., 40.], egui::Button::new("Equipment")); - let inventory = ui.add_sized([120., 40.], egui::Button::new("Inventory")); - let event_flags = ui.add_sized([120., 40.], egui::Button::new("Event Flags")); - let regions = ui.add_sized([120., 40.], egui::Button::new("Regions")); - - // Listen for clicks - if general.clicked() {app.current_route = Route::General;} - if stats.clicked() {app.current_route = Route::Stats;} - if equipment.clicked() {app.current_route = Route::Equipment;} - if inventory.clicked() {app.current_route = Route::Inventory} - if event_flags.clicked() {app.current_route = Route::EventFlags} - if regions.clicked() {app.current_route = Route::Regions} +/// Draws a side panel showing a menu for navigating views for a selected character in a opened save. +pub fn menu(ctx: &Context, app: &mut App) { + // Slot Section Panel + egui::SidePanel::left("slot_sections_menu").show(ctx, |ui| { + egui::ScrollArea::vertical() + .id_source("left") + .show(ui, |ui| { + ui.vertical(|ui| { + // Create the buttons + let general = ui.add_sized([120., 40.], egui::Button::new("General")); + let stats = ui.add_sized([120., 40.], egui::Button::new("Stats")); + let equipment = ui.add_sized([120., 40.], egui::Button::new("Equipment")); + let inventory = ui.add_sized([120., 40.], egui::Button::new("Inventory")); + let event_flags = ui.add_sized([120., 40.], egui::Button::new("Event Flags")); + let regions = ui.add_sized([120., 40.], egui::Button::new("Regions")); - // Highlight active - match app.current_route { - Route::None => {}, - Route::General => {general.highlight();}, - Route::Stats => {stats.highlight();}, - Route::Equipment => {equipment.highlight();}, - Route::Inventory => {inventory.highlight();}, - Route::EventFlags => {event_flags.highlight();}, - Route::Regions => {regions.highlight();}, - } - } -} \ No newline at end of file + // Listen for clicks + if general.clicked() { + app.current_route = Route::General; + } + if stats.clicked() { + app.current_route = Route::Stats; + } + if equipment.clicked() { + app.current_route = Route::Equipment; + } + if inventory.clicked() { + app.current_route = Route::Inventory + } + if event_flags.clicked() { + app.current_route = Route::EventFlags + } + if regions.clicked() { + app.current_route = Route::Regions + } + + // Highlight active + match app.current_route { + Route::None => {} + Route::General => { + general.highlight(); + } + Route::Stats => { + stats.highlight(); + } + Route::Equipment => { + equipment.highlight(); + } + Route::Inventory => { + inventory.highlight(); + } + Route::EventFlags => { + event_flags.highlight(); + } + Route::Regions => { + regions.highlight(); + } + } + }) + }); + }); +} diff --git a/src/ui/mod.rs b/src/ui/mod.rs index 1764fed..64d00ab 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -1,10 +1,16 @@ +pub(crate) mod character_list; mod custom; -pub mod menu; -pub mod none; -pub mod general; -pub mod stats; -pub mod inventory; -pub mod events; -pub mod regions; -pub mod importer; -pub mod equipment; \ No newline at end of file +// pub(crate) mod equipment; +pub(crate) mod events; +pub(crate) mod file_drop; +pub(crate) mod general; +pub(crate) mod importer; +pub(crate) mod information; +pub(crate) mod inventory; +pub(crate) mod menu; +pub(crate) mod none; +pub(crate) mod notifications; +pub(crate) mod regions; +pub(crate) mod settings; +pub(crate) mod stats; +pub(crate) mod toolbar; diff --git a/src/ui/none.rs b/src/ui/none.rs index d5d4cbc..b137a2b 100644 --- a/src/ui/none.rs +++ b/src/ui/none.rs @@ -1,9 +1,11 @@ -pub mod none { - use eframe::egui::{self, Ui}; +use eframe::egui::{self, Ui}; - pub fn none(ui: &mut Ui) { - ui.with_layout(egui::Layout::centered_and_justified(egui::Direction::TopDown), |ui| { +/// Draws the default empty view when no route is selected. +pub fn none(ui: &mut Ui) { + ui.with_layout( + egui::Layout::centered_and_justified(egui::Direction::TopDown), + |ui| { ui.label("Empty"); - }); - } -} \ No newline at end of file + }, + ); +} diff --git a/src/ui/notifications.rs b/src/ui/notifications.rs new file mode 100644 index 0000000..0b1c8a4 --- /dev/null +++ b/src/ui/notifications.rs @@ -0,0 +1,78 @@ +use crate::{ + vm::notifications::{NotificationType, NOTIFICATIONS}, + App, +}; +use eframe::egui::{self, Layout}; +use egui::{epaint::Shadow, Color32, Context, Margin, Rounding, Stroke}; + +/// Draws a top panel that functions as a notification bar. The notification bar is used to display +/// important messages, alerts, or notifications to the user. +pub fn notifications(ctx: &Context, app: &mut App) { + let vm = &mut app.vm; + + // If no pending notifications then exit early + if NOTIFICATIONS.read().unwrap().is_empty() { + return; + } + + let notifications = NOTIFICATIONS.read().unwrap().clone(); + + // Draw the top panel containing the notification + for (i, notification) in notifications.iter().enumerate() { + // Style the notification and give it the proper color based on it's type + let frame_style = egui::Frame { + outer_margin: Margin::ZERO, + inner_margin: Margin { + left: 10., + right: 10., + top: 10., + bottom: 10., + }, + rounding: Rounding::ZERO, + shadow: Shadow::NONE, + fill: match notification.notification_type { + NotificationType::Info => Color32::LIGHT_BLUE, + NotificationType::Success => Color32::LIGHT_GREEN, + NotificationType::Warning => Color32::YELLOW, + NotificationType::Error => Color32::LIGHT_RED, + }, + stroke: Stroke::NONE, + }; + + // Draw the top panel containing the notification + egui::TopBottomPanel::top(format!("notifications_{}", i)) + .frame(frame_style) + .show(ctx, |ui| { + ui.with_layout(Layout::left_to_right(egui::Align::Min), |ui| { + ui.with_layout(Layout::top_down(egui::Align::Min), |ui| { + ui.add_space(4.); + ui.label(¬ification.text); + + // Check if notification has any buttons + if notification.buttons.len() > 0 { + // Draw notification buttons + ui.horizontal(|ui| { + for (button_text, callback) in ¬ification.buttons { + if ui.button(button_text).clicked() { + callback(ctx, vm); + } + } + }); + } + }); + + ui.with_layout(Layout::right_to_left(egui::Align::Min), |ui| { + let button = egui::Button::new( + egui::RichText::new(format!("{}", egui_phosphor::regular::X)).size(18.), + ) + .fill(Color32::TRANSPARENT) + .stroke(Stroke::NONE); + + if ui.add(button).clicked() { + NOTIFICATIONS.write().unwrap().remove(i); + } + }) + }) + }); + } +} diff --git a/src/ui/regions.rs b/src/ui/regions.rs index 2628904..9a81c3b 100644 --- a/src/ui/regions.rs +++ b/src/ui/regions.rs @@ -1,16 +1,21 @@ -pub mod regions { - use std::collections::BTreeMap; +use std::collections::BTreeMap; - use eframe::egui::{self, Ui}; +use eframe::egui::{self, Ui}; - use crate::{db::{map_name::map_name::MAP_NAME, regions::regions::REGIONS}, ui::custom::checkbox::checkbox::{three_states_checkbox, State}, vm::vm::vm::ViewModel}; +use crate::{ + db::{map_name::MapName, regions::Region}, + vm::vm::ViewModel, +}; - pub fn regions(ui: &mut Ui, vm:&mut ViewModel) { - egui::ScrollArea::vertical() +use super::custom::checkbox::{three_states_checkbox, State}; + +/// Draws the 'Regions' view. +pub fn regions(ui: &mut Ui, vm: &mut ViewModel) { + egui::ScrollArea::vertical() .auto_shrink(false) .show(ui, |ui| { - let maps = &vm.slots[vm.index].regions_vm.region_groups; - let regions = &mut vm.slots[vm.index].regions_vm.regions; + let maps = &vm.characters[vm.index].regions_vm.region_groups; + let regions = &mut vm.characters[vm.index].regions_vm.regions; ui.horizontal(|ui| { select_all_checkbox(ui, regions, "All Regions"); ui.separator(); @@ -21,123 +26,203 @@ pub mod regions { select_bosses_checkbox(ui, regions, "Bosses"); }); ui.separator(); - - for map in maps { - ui.push_id(map.0, |ui| { - let collapsing = egui::containers::collapsing_header::CollapsingHeader::new(MAP_NAME.lock().unwrap()[&map.0]); - ui.horizontal(|ui|{ + + for (map_name, region_group) in maps { + // Skip DLC regions if not activated + if !vm.dlc && map_name == &MapName::RealmofShadow { + continue; + } + + ui.push_id(map_name, |ui| { + let collapsing = egui::containers::collapsing_header::CollapsingHeader::new( + if let Some(map_name_str) = MapName::map_names().get(map_name) { + map_name_str + } else { + "Uknown Region!" + }, + ); + ui.horizontal(|ui| { let mut state = State::Off; - if map.1.iter().all(|g| regions[&g].0) { + if region_group.iter().all(|g| regions[&g].0) { state = State::On; - } - else if map.1.iter().any(|g| regions[&g].0) { + } else if region_group.iter().any(|g| regions[&g].0) { state = State::InBetween; } if three_states_checkbox(ui, &state).clicked() { match state { - State::Off => map.1.iter().for_each(|g| regions.get_mut(g).expect("").0 = true), - State::On => map.1.iter().for_each(|g| regions.get_mut(g).expect("").0 = false), - State::InBetween => map.1.iter().for_each(|g| regions.get_mut(g).expect("").0 = true), + State::Off => region_group + .iter() + .for_each(|g| regions.get_mut(g).expect("").0 = true), + State::On => region_group + .iter() + .for_each(|g| regions.get_mut(g).expect("").0 = false), + State::InBetween => region_group + .iter() + .for_each(|g| regions.get_mut(g).expect("").0 = true), } } collapsing.show(ui, |ui| { - for region in map.1 { - let region_info = REGIONS.lock().unwrap()[®ion]; - let on = &mut regions.get_mut(region).expect("").0; - ui.checkbox(on, region_info.1.to_string()); + for region in region_group { + if let Some((_, name_str, _, _, _, _)) = + Region::regions().get(region) + { + if let Some((is_on, _, _, _)) = regions.get_mut(region) { + ui.checkbox(is_on, name_str.to_string()); + } + } } }); }) }); } }); +} + +fn select_all_checkbox( + ui: &mut Ui, + map: &mut BTreeMap, + label: &str, +) { + let mut state = State::Off; + if map.values().all(|(on, _, _, _)| *on) { + state = State::On; + } else if map.values().any(|(on, _, _, _)| *on) { + state = State::InBetween; } - - fn select_all_checkbox(ui: &mut Ui, map: &mut BTreeMap, label: &str) { - let mut state = State::Off; - if map.values().all(|(on,_,_,_)| *on) { - state = State::On; - } - else if map.values().any(|(on,_,_,_)| *on) { - state = State::InBetween; + ui.horizontal(|ui| { + if three_states_checkbox(ui, &state).clicked() { + match state { + State::Off => map.values_mut().for_each(|(on, _, _, _)| *on = true), + State::On => map.values_mut().for_each(|(on, _, _, _)| *on = false), + State::InBetween => map.values_mut().for_each(|(on, _, _, _)| *on = true), + } } + ui.label(label); + }); +} - ui.horizontal(|ui| { - if three_states_checkbox(ui, &state).clicked() { - match state { - State::Off => map.values_mut().for_each(|(on,_,_,_)| *on = true), - State::On => map.values_mut().for_each(|(on,_,_,_)| *on = false), - State::InBetween => map.values_mut().for_each(|(on,_,_,_)| *on = true), - } - } - ui.label(label); - }); +fn select_open_world_checkbox( + ui: &mut Ui, + map: &mut BTreeMap, + label: &str, +) { + let mut state = State::Off; + if map + .values() + .filter(|(_, is_open_world, _, _)| *is_open_world) + .all(|(on, _, _, _)| *on) + { + state = State::On; + } else if map + .values() + .filter(|(_, is_open_world, _, _)| *is_open_world) + .any(|(on, _, _, _)| *on) + { + state = State::InBetween; } - - fn select_open_world_checkbox(ui: &mut Ui, map: &mut BTreeMap, label: &str) { - let mut state = State::Off; - if map.values().filter(|(_, is_open_world,_,_)|*is_open_world).all(|(on,_,_,_)| *on) { - state = State::On; - } - else if map.values().filter(|(_, is_open_world,_,_)|*is_open_world).any(|(on,_,_,_)| *on) { - state = State::InBetween; + ui.horizontal(|ui| { + if three_states_checkbox(ui, &state).clicked() { + match state { + State::Off => map + .values_mut() + .filter(|(_, is_open_world, _, _)| *is_open_world) + .for_each(|(on, _, _, _)| *on = true), + State::On => map + .values_mut() + .filter(|(_, is_open_world, _, _)| *is_open_world) + .for_each(|(on, _, _, _)| *on = false), + State::InBetween => map + .values_mut() + .filter(|(_, is_open_world, _, _)| *is_open_world) + .for_each(|(on, _, _, _)| *on = true), + } } + ui.label(label); + }); +} - ui.horizontal(|ui| { - if three_states_checkbox(ui, &state).clicked() { - match state { - State::Off => map.values_mut().filter(|(_, is_open_world,_,_)|*is_open_world).for_each(|(on,_,_,_)| *on = true), - State::On => map.values_mut().filter(|(_, is_open_world,_,_)|*is_open_world).for_each(|(on,_,_,_)| *on = false), - State::InBetween => map.values_mut().filter(|(_, is_open_world,_,_)|*is_open_world).for_each(|(on,_,_,_)| *on = true), - } - } - ui.label(label); - }); +fn select_dungeon_checkbox( + ui: &mut Ui, + map: &mut BTreeMap, + label: &str, +) { + let mut state = State::Off; + if map + .values() + .filter(|(_, _, is_dungeon, _)| *is_dungeon) + .all(|(on, _, _, _)| *on) + { + state = State::On; + } else if map + .values() + .filter(|(_, _, is_dungeon, _)| *is_dungeon) + .any(|(on, _, _, _)| *on) + { + state = State::InBetween; } - - fn select_dungeon_checkbox(ui: &mut Ui, map: &mut BTreeMap, label: &str) { - let mut state = State::Off; - if map.values().filter(|(_,_, is_dungeon,_)| *is_dungeon).all(|(on,_,_,_)| *on) { - state = State::On; - } - else if map.values().filter(|(_,_, is_dungeon,_)| *is_dungeon).any(|(on,_,_,_)| *on) { - state = State::InBetween; - } - ui.horizontal(|ui| { - if three_states_checkbox(ui, &state).clicked() { - match state { - State::Off => map.values_mut().filter(|(_,_, is_dungeon,_)| *is_dungeon).for_each(|(on,_,_,_)| *on = true), - State::On => map.values_mut().filter(|(_,_, is_dungeon,_)| *is_dungeon).for_each(|(on,_,_,_)| *on = false), - State::InBetween => map.values_mut().filter(|(_,_, is_dungeon,_)| *is_dungeon).for_each(|(on,_,_,_)| *on = true), - } + ui.horizontal(|ui| { + if three_states_checkbox(ui, &state).clicked() { + match state { + State::Off => map + .values_mut() + .filter(|(_, _, is_dungeon, _)| *is_dungeon) + .for_each(|(on, _, _, _)| *on = true), + State::On => map + .values_mut() + .filter(|(_, _, is_dungeon, _)| *is_dungeon) + .for_each(|(on, _, _, _)| *on = false), + State::InBetween => map + .values_mut() + .filter(|(_, _, is_dungeon, _)| *is_dungeon) + .for_each(|(on, _, _, _)| *on = true), } - ui.label(label); - }); - } - - fn select_bosses_checkbox(ui: &mut Ui, map: &mut BTreeMap, label: &str) { - let mut state = State::Off; - if map.values().filter(|(_,_,_, is_boss)| *is_boss).all(|(on,_,_,_)| *on) { - state = State::On; - } - else if map.values().filter(|(_,_,_, is_boss)| *is_boss).any(|(on,_,_,_)| *on) { - state = State::InBetween; } + ui.label(label); + }); +} - ui.horizontal(|ui| { - if three_states_checkbox(ui, &state).clicked() { - match state { - State::Off => map.values_mut().filter(|(_,_,_, is_boss)| *is_boss).for_each(|(on,_,_,_)| *on = true), - State::On => map.values_mut().filter(|(_,_,_, is_boss)| *is_boss).for_each(|(on,_,_,_)| *on = false), - State::InBetween => map.values_mut().filter(|(_,_,_, is_boss)| *is_boss).for_each(|(on,_,_,_)| *on = true), - } - } - ui.label(label); - }); +fn select_bosses_checkbox( + ui: &mut Ui, + map: &mut BTreeMap, + label: &str, +) { + let mut state = State::Off; + if map + .values() + .filter(|(_, _, _, is_boss)| *is_boss) + .all(|(on, _, _, _)| *on) + { + state = State::On; + } else if map + .values() + .filter(|(_, _, _, is_boss)| *is_boss) + .any(|(on, _, _, _)| *on) + { + state = State::InBetween; } -} \ No newline at end of file + + ui.horizontal(|ui| { + if three_states_checkbox(ui, &state).clicked() { + match state { + State::Off => map + .values_mut() + .filter(|(_, _, _, is_boss)| *is_boss) + .for_each(|(on, _, _, _)| *on = true), + State::On => map + .values_mut() + .filter(|(_, _, _, is_boss)| *is_boss) + .for_each(|(on, _, _, _)| *on = false), + State::InBetween => map + .values_mut() + .filter(|(_, _, _, is_boss)| *is_boss) + .for_each(|(on, _, _, _)| *on = true), + } + } + ui.label(label); + }); +} diff --git a/src/ui/settings.rs b/src/ui/settings.rs new file mode 100644 index 0000000..d2f65bc --- /dev/null +++ b/src/ui/settings.rs @@ -0,0 +1,54 @@ +use crate::App; +use eframe::egui::{self, Color32, Context}; + +/// Draws a bottom panel with general application settings like activating DLC items, +/// Zoom out or Zoom in. +pub(crate) fn settings_bottom_panel(ctx: &Context, app: &mut App) { + egui::TopBottomPanel::bottom("bottom").show(ctx, |ui| { + egui::Frame::none().inner_margin(8.).show(ui, |ui| { + ui.horizontal(|ui| { + // DLC Checkbox + let dlc_checkbox = ui.checkbox(&mut app.vm.dlc, "DLC"); + if dlc_checkbox.hovered() { + egui::popup::show_tooltip(ui.ctx(), dlc_checkbox.id, |ui|{ + ui.label(egui::RichText::new("Important: Attempting to access specific DLC items without owning the DLC can result in a ban!").size(8.0).color(Color32::PLACEHOLDER)); + }); + } + + // Seperator + ui.separator(); + + // Zoom in Button + ui.label("Zoom"); + let zoom_in_button = ui.button(egui::RichText::new(format!( + "{}", + egui_phosphor::regular::MAGNIFYING_GLASS_PLUS + ))); + if zoom_in_button.hovered() { + egui::popup::show_tooltip(ui.ctx(), zoom_in_button.id, |ui|{ + ui.label(egui::RichText::new("Press 'CTRL' + '+' to zoom in").size(8.0).color(Color32::PLACEHOLDER)); + }); + } + if zoom_in_button.clicked() { + let zoom_factor = ctx.zoom_factor(); + ctx.set_zoom_factor(zoom_factor + 0.1); + } + + // Zoom out Button + let zoom_out_button = ui.button(egui::RichText::new(format!( + "{}", + egui_phosphor::regular::MAGNIFYING_GLASS_MINUS + ))); + if zoom_out_button.hovered() { + egui::popup::show_tooltip(ui.ctx(), zoom_in_button.id, |ui|{ + ui.label(egui::RichText::new("Press 'CTRL' + '-' to zoom out").size(8.0).color(Color32::PLACEHOLDER)); + }); + } + if zoom_out_button.clicked() { + let zoom_factor = ctx.zoom_factor(); + ctx.set_zoom_factor(zoom_factor - 0.1); + } + }); + }) + }); +} diff --git a/src/ui/stats.rs b/src/ui/stats.rs index 53176f5..a414b4b 100644 --- a/src/ui/stats.rs +++ b/src/ui/stats.rs @@ -1,101 +1,133 @@ -pub mod stats { - use std::ops::RangeInclusive; +use std::ops::RangeInclusive; - use eframe::egui::{self, Ui}; - use egui_extras::{Column, TableBody, TableBuilder}; - use crate::{db::classes::classes::STARTER_CLASSES, vm::vm::vm::ViewModel}; +use crate::{db::classes::STARTER_CLASSES, vm::vm::ViewModel}; +use eframe::egui::{self, Ui}; +use egui_extras::{Column, TableBody, TableBuilder}; - pub fn stats(ui: &mut Ui, vm: &mut ViewModel) { - egui::Frame::default() - .show(ui, |ui| { - ui.with_layout( egui::Layout::top_down_justified(egui::Align::Min),|ui|{ - ui.with_layout(egui::Layout::top_down(egui::Align::Min), |ui|{ +/// Draws the 'Stats' route view. +pub fn stats(ui: &mut Ui, vm: &mut ViewModel) { + egui::Frame::default().show(ui, |ui| { + ui.with_layout(egui::Layout::top_down_justified(egui::Align::Min), |ui| { + ui.with_layout(egui::Layout::top_down(egui::Align::Min), |ui| { + ui.heading(vm.characters[vm.index].stats_vm.arche_type.to_string()); + ui.add_space(8.0); - ui.heading(vm.slots[vm.index].stats_vm.arche_type.to_string()); - ui.add_space(8.0); + let class = &STARTER_CLASSES[&vm.characters[vm.index].stats_vm.arche_type]; - let class = &STARTER_CLASSES.lock().unwrap()[&vm.slots[vm.index].stats_vm.arche_type]; + // Calculate level from stats + let level = vm.characters[vm.index].stats_vm.vigor + + vm.characters[vm.index].stats_vm.mind + + vm.characters[vm.index].stats_vm.endurance + + vm.characters[vm.index].stats_vm.strength + + vm.characters[vm.index].stats_vm.dexterity + + vm.characters[vm.index].stats_vm.intelligence + + vm.characters[vm.index].stats_vm.faith + + vm.characters[vm.index].stats_vm.arcane + - 79; - // Calculate level from stats - let level = - vm.slots[vm.index].stats_vm.vigor + - vm.slots[vm.index].stats_vm.mind + - vm.slots[vm.index].stats_vm.endurance + - vm.slots[vm.index].stats_vm.strength + - vm.slots[vm.index].stats_vm.dexterity + - vm.slots[vm.index].stats_vm.intelligence + - vm.slots[vm.index].stats_vm.faith + - vm.slots[vm.index].stats_vm.arcane- - 79; - - - let table = TableBuilder::new(ui) + let table = TableBuilder::new(ui) .cell_layout(egui::Layout::left_to_right(egui::Align::Center)) .column(Column::initial(100.0)) .column(Column::initial(100.0)); - table.body(|mut body| { - - // Level - body.row(24., |mut row| { - row.col(|ui| { - ui.label("Level:"); }); - row.col(|ui| { - ui.label(format!("{:6}", level)); - }); + table.body(|mut body| { + // Level + body.row(24., |mut row| { + row.col(|ui| { + ui.label("Level:"); + }); + row.col(|ui| { + ui.label(format!("{:6}", level)); }); - - // Stats - self::stat_field(&mut body, class.vigor..=99, "Vigor:", &mut vm.slots[vm.index].stats_vm.vigor); - self::stat_field(&mut body, class.mind..=99, "Mind:", &mut vm.slots[vm.index].stats_vm.mind); - self::stat_field(&mut body, class.endurance..=99, "Endurance:", &mut vm.slots[vm.index].stats_vm.endurance); - self::stat_field(&mut body, class.strength..=99, "Strength:", &mut vm.slots[vm.index].stats_vm.strength); - self::stat_field(&mut body, class.dexterity..=99, "Dexterity:", &mut vm.slots[vm.index].stats_vm.dexterity); - self::stat_field(&mut body, class.intelligence..=99, "Intelligence:", &mut vm.slots[vm.index].stats_vm.intelligence); - self::stat_field(&mut body, class.faith..=99, "Faith:", &mut vm.slots[vm.index].stats_vm.faith); - self::stat_field(&mut body, class.arcane..=99, "Arcane:", &mut vm.slots[vm.index].stats_vm.arcane); + }); + + // Stats + stat_field( + &mut body, + class.vigor..=99, + "Vigor:", + &mut vm.characters[vm.index].stats_vm.vigor, + ); + stat_field( + &mut body, + class.mind..=99, + "Mind:", + &mut vm.characters[vm.index].stats_vm.mind, + ); + stat_field( + &mut body, + class.endurance..=99, + "Endurance:", + &mut vm.characters[vm.index].stats_vm.endurance, + ); + stat_field( + &mut body, + class.strength..=99, + "Strength:", + &mut vm.characters[vm.index].stats_vm.strength, + ); + stat_field( + &mut body, + class.dexterity..=99, + "Dexterity:", + &mut vm.characters[vm.index].stats_vm.dexterity, + ); + stat_field( + &mut body, + class.intelligence..=99, + "Intelligence:", + &mut vm.characters[vm.index].stats_vm.intelligence, + ); + stat_field( + &mut body, + class.faith..=99, + "Faith:", + &mut vm.characters[vm.index].stats_vm.faith, + ); + stat_field( + &mut body, + class.arcane..=99, + "Arcane:", + &mut vm.characters[vm.index].stats_vm.arcane, + ); - // Space - self::space(&mut body, 8.); + // Space + space(&mut body, 8.); - // Souls - let field = egui::widgets::DragValue::new(&mut vm.slots[vm.index].stats_vm.souls) + // Runes + let field = + egui::widgets::DragValue::new(&mut vm.characters[vm.index].stats_vm.runes) .clamp_range(0..=999999999) - .custom_formatter(|n, _|{ - format!("{:09}", n) - }); - body.row(24., |mut row| { - row.col(|ui| { - ui.label("Current Souls:"); - }); - row.col(|ui| { - ui.add(field); - }); + .custom_formatter(|n, _| format!("{:09}", n)); + body.row(24., |mut row| { + row.col(|ui| { + ui.label("Current Runes:"); + }); + row.col(|ui| { + ui.add(field); }); }); }); - }) - }); - } - - fn stat_field(body: &mut TableBody, range: RangeInclusive, name: &str, value: &mut u32) { - let field = egui::widgets::DragValue::new(value).clamp_range(range); - body.row(24., |mut row| { - row.col(|ui| { - ui.label(name); - }); - row.col(|ui| { - ui.add(field); }); - }); - } + }) + }); +} - fn space(body: &mut TableBody, height: f32) { - body.row(height, |mut row| { - row.col(|_| { - }); - row.col(|_| { - }); +fn stat_field(body: &mut TableBody, range: RangeInclusive, name: &str, value: &mut u32) { + let field = egui::widgets::DragValue::new(value).clamp_range(range); + body.row(24., |mut row| { + row.col(|ui| { + ui.label(name); + }); + row.col(|ui| { + ui.add(field); }); - } -} \ No newline at end of file + }); +} + +fn space(body: &mut TableBody, height: f32) { + body.row(height, |mut row| { + row.col(|_| {}); + row.col(|_| {}); + }); +} diff --git a/src/ui/toolbar.rs b/src/ui/toolbar.rs new file mode 100644 index 0000000..bf0f525 --- /dev/null +++ b/src/ui/toolbar.rs @@ -0,0 +1,112 @@ +use eframe::egui::{self, Align, Context, Layout}; +use er_save_lib::SaveApi; + +use crate::{ + vm::{ + importer::ImporterViewModel, + notifications::{Notification, NotificationButtons, NotificationType, NOTIFICATIONS}, + }, + App, +}; + +use super::importer::character_importer; + +/// Draws a top panel with "Open", "Save", and "Import" buttons. +pub(crate) fn toolbar_top_panel(ctx: &Context, app: &mut App) { + egui::TopBottomPanel::top("toolbar") + .default_height(35.) + .show(ctx, |ui| { + // Left Side: Open Save Buttons + ui.columns(2, |uis| { + uis[0].with_layout(Layout::left_to_right(Align::Center), |ui| { + if ui + .button(egui::RichText::new(format!( + "{} open", + egui_phosphor::regular::FOLDER_OPEN + ))) + .clicked() + { + let result = App::open_file_dialog(); + if let Some(path) = result { + // Try to open file. Notify if there's error. + if let Err(err) = app.open(&path) { + NOTIFICATIONS.write().unwrap().push(Notification::new( + NotificationType::Error, + format!("Failed to open file: {}", err), + NotificationButtons::::None, + )); + } + } + } + if ui + .button(egui::RichText::new(format!( + "{} save", + egui_phosphor::regular::FLOPPY_DISK + ))) + .clicked() + { + let result = App::save_file_dialog(); + if let Some(path) = result { + // Try to save file. Notify if there's error. + match app.save(&path) { + Ok(()) => { + NOTIFICATIONS.write().unwrap().push(Notification::new( + NotificationType::Success, + format!("Your file has been saved! A 'backups' folder has been created in the same directory with a copy of the original file."), + NotificationButtons::::None, + )); + }, + Err(err) => { + NOTIFICATIONS.write().unwrap().push(Notification::new( + NotificationType::Error, + format!("Failed to save file: {}", err), + NotificationButtons::::None, + )); + }, + } + } + } + }); + + // Right Side: Import Button + uis[1].with_layout(Layout::right_to_left(egui::Align::Center), |ui| { + let import_button = egui::widgets::Button::new(egui::RichText::new(format!( + "{} Import Character", + egui_phosphor::regular::DOWNLOAD_SIMPLE + ))); + if ui + .add_enabled(app.save_api.is_some(), import_button) + .clicked() + { + let path = App::open_file_dialog(); + + if let Some(path) = path { + let save_api = SaveApi::from_path(path); + match save_api { + Ok(save_api) => { + app.importer_vm = ImporterViewModel::new(save_api, &app.vm); + app.importer_open = true; + } + Err(err) => { + NOTIFICATIONS.write().unwrap().push(Notification::new( + NotificationType::Error, + format!("Failed to open save file: {}", err), + NotificationButtons::::None, + )); + } + } + } + } + if app.importer_vm.save_api.is_some() { + character_importer( + ui, + app.save_api.as_mut().unwrap(), + &mut app.vm, + &mut app.importer_vm, + &mut app.importer_open, + ); + } + }); + }); + }); +} diff --git a/src/updater/mod.rs b/src/updater/mod.rs new file mode 100644 index 0000000..e126084 --- /dev/null +++ b/src/updater/mod.rs @@ -0,0 +1 @@ +pub mod updater; \ No newline at end of file diff --git a/src/updater/updater.rs b/src/updater/updater.rs new file mode 100644 index 0000000..ca24b9f --- /dev/null +++ b/src/updater/updater.rs @@ -0,0 +1,57 @@ +use regex::Regex; + +use crate::api::{github::GithubApi, models::releases::Release}; + +const USER: &str = "ClayAmore"; +const REPO: &str = "ER-Save-Editor"; + +pub struct Updater; + +impl Updater { + // Checks for new app version by fetch latest release from github + // using GithubApi + pub fn get_new_version() -> Option { + // Fetch latest github release data + let release = GithubApi::fetch_latest_release(USER, REPO); + + // If something went wrong print the error then return false + if let Err(err) = &release { + eprintln!("Failed to fetch latest release.\n Error: {err}"); + return None; + } + + // Unwrap release result + let release = release.unwrap(); + + // Create a regex to match pattern (nn.nn.nn) + let re = Regex::new(r"(\d+).(\d+).(\d+)").unwrap(); + + // Match regex and extract version sub_match + if let Some(version_match) = re.captures(&release.tag_name) { + let remote_major = version_match[1].parse::().unwrap(); + let remote_minor = version_match[2].parse::().unwrap(); + let remote_patch = version_match[3].parse::().unwrap(); + + // Local Version + let local_version = env!("CARGO_PKG_VERSION"); + if let Some(local_version_match) = re.captures(local_version) { + let local_major = local_version_match[1].parse::().unwrap(); + let local_minor = local_version_match[2].parse::().unwrap(); + let local_patch = local_version_match[3].parse::().unwrap(); + + // Check version precedence + if remote_major > local_major + || (remote_major == local_major && remote_minor > local_minor) + || (remote_major == local_major + && remote_minor == local_minor + && remote_patch > local_patch) + { + return Some(release); + } + } + } + + // Default to returning false + None + } +} diff --git a/src/util/bit.rs b/src/util/bit.rs deleted file mode 100644 index 056cd8d..0000000 --- a/src/util/bit.rs +++ /dev/null @@ -1,22 +0,0 @@ -pub mod bit { - pub fn set_bit(byte: u8, bit_pos: u8, value: bool) -> u8 { - if bit_pos < 8 { - if value { - byte | (1 << bit_pos) - } else { - byte & !(1 << bit_pos) - } - } else { - panic!("Bit pos out of range (0-7)"); - } - } - - pub fn get_bit(byte: u8, bit_pos: u8) -> bool { - if bit_pos < 8 { - byte & (1 << bit_pos) != 0 - } - else { - panic!("Bit pos out of range (0-7)"); - } - } -} \ No newline at end of file diff --git a/src/util/bnd4.rs b/src/util/bnd4.rs deleted file mode 100644 index 1081044..0000000 --- a/src/util/bnd4.rs +++ /dev/null @@ -1,436 +0,0 @@ -pub mod bnd4 { - use std::io::Error; - use binary_reader::{BinaryReader, Endian}; - use encoding_rs::{SHIFT_JIS, UTF_16BE, UTF_16LE}; - - bitflags::bitflags! { - #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] - pub struct Format: u8 { - const None = 0; - const BigEndian = 0b0000_0001; - const IDs = 0b0000_0010; - const Names1 = 0b0000_0100; - const Names2 = 0b0000_1000; - const LongOffsets = 0b0001_0000; - const Compression = 0b0010_0000; - const Flag6 = 0b0100_0000; - const Flag7 = 0b1000_0000; - const _ = !0; - } - } - impl Format { - pub fn as_i32(&self) -> i32 { - self.bits() as i32 - } - } - impl Default for Format { - fn default() -> Self { - Format::IDs | Format::Names1 | Format::Names2 | Format::Compression - } - } - - bitflags::bitflags! { - #[derive(Default, Clone, Copy, Debug, PartialEq, Eq, Hash)] - pub struct FileFlags: u8 { - const None = 0; - const Compressed = 0b0000_0001; - const Flag1 = 0b0000_0010; - const Flag2 = 0b0000_0100; - const Flag3 = 0b0000_1000; - const Flag4 = 0b0001_0000; - const Flag5 = 0b0010_0000; - const Flag6 = 0b0100_0000; - const Flag7 = 0b1000_0000; - const _ = !0; - } - } - impl FileFlags { - pub fn as_i32(&self) -> i32 { - self.bits() as i32 - } - } - - // I am only using this to read the regulation so I am setting this to (DCX_DFLT_11000_44_9_15 = 10) - bitflags::bitflags! { - #[derive(Default, Clone, Copy, Debug, PartialEq, Eq, Hash)] - pub struct CompressionType: u8 { - const Unkown = 0; - const None = 1; - const Zlib = 2; - const Dcp_edge = 3 ; - const Dcp_dflt = 4; - const Dcx_edge = 5; - const Dcx_dflt_10000_24_9 = 6 ; - const Dcx_dflt_10000_44_9 = 7 ; - const Dcx_dflt_11000_44_8 = 8; - const Dcx_dflt_11000_44_9 = 9 ; - const Dcx_dflt_11000_44_9_15 = 10; - const Dcx_krak = 11; - } - } - - #[derive(Default)] - pub struct BinderFile { - pub flags: FileFlags, - pub id: i32, - pub name: String, - pub bytes: Vec, - pub compression_type: CompressionType, - pub uncompressed_size: i64, - pub data_offset: i64, - } - impl BinderFile { - pub fn new( - flags: FileFlags, - id: i32, - name: String, - bytes: Vec, - ) -> Self { - let mut binder_file = BinderFile::default(); - binder_file.flags = flags; - binder_file.id = id; - binder_file.name = name; - binder_file.bytes = bytes; - binder_file - } - } - - #[allow(unused)] - #[derive(Default)] - pub struct BinderHeader { - file_flags: FileFlags, - id: i32, - name: String, - compression_type: CompressionType, - compressed_size: i64, - uncompressed_size: i64, - data_offset: i64, - } - - impl BinderHeader { - pub fn read_file_data(&self, br: &mut BinaryReader) -> Result { - let mut bytes: Vec = Vec::new(); - let _compression_type = CompressionType::Zlib; - - if Binder::is_compressed(self.file_flags) { - todo!(); - } - else { - let prev_pos = br.pos; - br.jmp(self.data_offset as usize); - bytes.extend(br.read_bytes(self.uncompressed_size as usize)?); - br.jmp(prev_pos); - } - - Ok(BinderFile::new( - self.file_flags, - self.id, - self.name.to_string(), - bytes - )) - } - - pub fn read_binder4_file_header(br: &mut BinaryReader, format: Format, big_endian: bool, bit_big_endian: bool, unicode: bool) -> Result { - let byte = br.read_u8()?; - let raw_flags = if big_endian {i32::from_be_bytes([byte, 0, 0, 0])} else {i32::from_le_bytes([byte, 0, 0, 0])}; - - let file_flags = if bit_big_endian {raw_flags} else { - ((raw_flags & 0b00000001) << 7) | - ((raw_flags & 0b00000010) << 5) | - ((raw_flags & 0b00000100) << 3) | - ((raw_flags & 0b00001000) << 1) | - ((raw_flags & 0b00010000) >> 1) | - ((raw_flags & 0b00100000) >> 3) | - ((raw_flags & 0b01000000) >> 5) | - ((raw_flags & 0b10000000) >> 7) - }; - - assert_eq!(br.read_u8()?, 0); - assert_eq!(br.read_u8()?, 0); - assert_eq!(br.read_u8()?, 0); - assert_eq!(br.read_i32()?, -1); - - let compressed_size = br.read_i64()?; - - let uncompressed_size = if Binder::has_compression(format) { - br.read_i64()? - } - else { - br.read_i32()? as i64 - }; - - let data_offset = if Binder::has_long_offsets(format) { - br.read_i64()? - } - else { - br.read_i32()? as i64 - }; - - - let mut id = -1; - if Binder::has_ids(format) { - id = br.read_i32()?; - } - - let mut name = String::new(); - if Binder::has_names(format) { - let name_offset = br.read_i32()?; - - let saved_pos = br.pos; - br.jmp(name_offset as usize); - if unicode { - let mut bytes: Vec= Vec::new(); - let mut pair = br.read_bytes(2)?; - while pair[0] != 0 || pair[1] != 0 { - bytes.extend(pair); - pair = br.read_bytes(2)?; - } - - name = if big_endian { - let (res, _enc, errors) = UTF_16BE.decode(&bytes); - if errors { - eprintln!("Failed"); - String::new() - } else { - res.to_string() - } - } else { - let (res, _enc, errors) = UTF_16LE.decode(&bytes); - if errors { - eprintln!("Failed"); - String::new() - } else { - res.to_string() - } - }; - } - else { - let mut bytes: Vec= Vec::new(); - let mut b = br.read_u8()?; - while b != 0 { - bytes.push(b); - b = br.read_u8()?; - } - let (res, _enc, errors) = SHIFT_JIS.decode(&bytes); - if errors { - eprintln!("Failed"); - } else { - name = res.to_string(); - } - } - br.jmp(saved_pos); - } - - if format == Format::Names1 { - id = br.read_i32()?; - assert_eq!(br.read_i32()?, 0); - } - - - Ok(Self { - file_flags: FileFlags::from_bits_truncate(file_flags as u8), - id, - name, - compression_type: CompressionType::Dcx_dflt_11000_44_9_15, - compressed_size, - uncompressed_size, - data_offset, - }) - } - } - - - pub struct Binder { - } - - impl Binder { - fn get_bnd4_header_size(format: Format) -> i64 { - let mut size = 0x10; - if Binder::has_long_offsets(format) { - size += 8; - } - if Binder::has_compression(format) { - size += 8; - } - if Binder::has_ids(format) { - size += 4; - } - if Binder::has_names(format) { - size += 4; - } - if format == Format::Names1 { - size += 8; - } - size - } - - fn has_long_offsets(format: Format) -> bool { - (format & Format::LongOffsets).as_i32() != 0 - } - - fn has_compression(format: Format) -> bool { - (format & Format::Compression).as_i32() != 0 - } - - fn has_ids(format: Format) -> bool { - (format & Format::IDs).as_i32() != 0 - } - - fn has_names(format: Format) -> bool { - (format & (Format::Names1 | Format::Names2)).as_i32() != 0 - } - - fn is_compressed(flags: FileFlags) -> bool { - (flags& FileFlags::Compressed).as_i32() != 0 - } - } - - - #[derive(Default)] - pub struct BND4 { - pub files: Vec, - pub version: String, - pub format: Format, - pub unk04: bool, - pub unk05: bool, - pub big_endian: bool, - pub bit_big_endian: bool, - pub unicode: bool, - pub extended: i32, - } - - impl BND4 { - pub fn new() -> Self { - let mut bnd4 = BND4::default(); - bnd4.unicode = true; - bnd4.extended = 4; - bnd4 - } - - #[allow(unused)] - pub fn is(&self, br: &mut BinaryReader) -> bool { - if br.length < 4 { - return false; - } - let magic = br.read_bytes(4).unwrap(); - magic == b"BND4" - } - - pub fn from_bytes(bytes: &[u8]) -> Result{ - let mut br = BinaryReader::from_u8(bytes); - let mut bnd4 = BND4::new(); - bnd4.read(&mut br).expect(""); - Ok(bnd4) - } - - pub fn read(&mut self, br: &mut BinaryReader) -> Result<(), Error>{ - let file_headers = self.read_header(br)?; - for file_header in file_headers { - self.files.push(file_header.read_file_data(br)?); - } - Ok(()) - } - - fn read_header(&mut self, br: &mut BinaryReader) -> Result, Error> { - assert_eq!(br.read_bytes(4)?, b"BND4"); - - self.unk04 = br.read_bool()?; - self.unk05 = br.read_bool()?; - assert_eq!(br.read_u8()?, 0); - assert_eq!(br.read_u8()?, 0); - - assert_eq!(br.read_u8()?, 0); - self.big_endian = br.read_bool()?; - self.bit_big_endian = br.read_bool()?; - assert_eq!(br.read_u8()?, 0); - - br.set_endian(if self.big_endian {binary_reader::Endian::Big} else {Endian::Little}); - - let file_count = br.read_i32()?; - assert_eq!(br.read_i64()?, 0x40); - - let bytes = br.read_bytes(8)?; - let mut terminator = 0; - for i in 0..8 { - if bytes[i] == 0 { - break - } - terminator = i; - } - let (res, _enc, errors) = SHIFT_JIS.decode(&bytes[0..terminator]); - if errors { - eprintln!("Failed"); - } else { - self.version = res.to_string(); - } - - let file_header_size = br.read_i64()?; - let _unused00 = br.read_i64(); - - self.unicode = br.read_bool()?; - let byte = br.read_u8()?; - let raw_format = if self.big_endian {i32::from_be_bytes([byte, 0, 0, 0])} else {i32::from_le_bytes([byte, 0, 0, 0])}; - let reverse: bool = self.bit_big_endian || (raw_format & 1) != 0 && (raw_format & 0b1000_0000) == 0; - let format = if reverse {Format::from_bits_truncate(raw_format as u8)} else { - Format::from_bits_truncate( - (((raw_format & 0b00000001) << 7) | - ((raw_format & 0b00000010) << 5) | - ((raw_format & 0b00000100) << 3) | - ((raw_format & 0b00001000) << 1) | - ((raw_format & 0b00010000) >> 1) | - ((raw_format & 0b00100000) >> 3) | - ((raw_format & 0b01000000) >> 5) | - ((raw_format & 0b10000000) >> 7)) as u8) - }; - - let b = br.read_u8()?; - self.extended = -1; - if b == 0 { - self.extended = 0; - } else if b == 1 { - self.extended = 1; - } else if b == 4 { - self.extended = 4; - } else if b == 0x80 { - self.extended = 0x80; - }; - assert!(self.extended == 0 || self.extended == 1 || self.extended == 4 || self.extended == 0x80); - assert_eq!(br.read_u8()?, 0); - - assert_eq!(br.read_i32()?, 0); - - if self.extended == 4 { - let hash_table_offset = br.read_i64()?; - let prev_pos = br.pos; - br.jmp(hash_table_offset as usize); - let _unused01 = br.read_i64(); - let _unused02 = br.read_i32(); - assert_eq!(br.read_u8()?, 0x10); - assert_eq!(br.read_u8()?, 8); - assert_eq!(br.read_u8()?, 8); - assert_eq!(br.read_u8()?, 0); - br.jmp(prev_pos); - } - else { - assert_eq!(br.read_i64()?, 0); - } - - if file_header_size != Binder::get_bnd4_header_size(format) { - panic!("File header size for format {} is expected to be {:#X}, but was {:#X}", self.format.as_i32(), Binder::get_bnd4_header_size(self.format), file_header_size); - } - - let mut file_headers: Vec = Vec::with_capacity(file_count as usize); - for _i in 0..file_count { - file_headers.push(BinderHeader::read_binder4_file_header( - br, - self.format, - self.big_endian, - self.bit_big_endian, - self.unicode - )?); - } - - Ok(file_headers) - } - } -} \ No newline at end of file diff --git a/src/util/br_ext.rs b/src/util/br_ext.rs deleted file mode 100644 index ed167e8..0000000 --- a/src/util/br_ext.rs +++ /dev/null @@ -1,191 +0,0 @@ -// Extension for the binary_reader so I don't have to write the same code multiple times. -pub mod br_ext { - use std::io::Error; - - use binary_reader::{BinaryReader, Endian}; - use encoding_rs::{UTF_16BE, UTF_16LE, SHIFT_JIS}; - - pub struct BinaryReaderExtensions { - - } - - #[allow(unused)] - impl BinaryReaderExtensions { - - pub fn get_i8(br: &mut BinaryReader, offset: usize) -> Result { - let prev_pos = br.pos; - br.jmp(offset); - let byte = br.read_i8()?; - br.jmp(prev_pos); - Ok(byte) - } - - pub fn get_i16(br: &mut BinaryReader, offset: usize) -> Result { - let prev_pos = br.pos; - br.jmp(offset); - let byte = br.read_i16()?; - br.jmp(prev_pos); - Ok(byte) - } - - pub fn get_utf_16(br: &mut BinaryReader, offset: usize) -> Result { - let prev_pos = br.pos; - br.jmp(offset); - let mut bytes: Vec= Vec::new(); - let mut pair = br.read_bytes(2)?; - while pair[0] != 0 || pair[1] != 0 { - bytes.extend(pair); - pair = br.read_bytes(2)?; - } - - let string = match br.endian { - binary_reader::Endian::Big => { - let (res, _enc, errors) = UTF_16BE.decode(&bytes); - if errors { - eprintln!("Failed"); - String::new() - } else { - res.to_string() - } - }, - binary_reader::Endian::Little => { - let (res, _enc, errors) = UTF_16LE.decode(&bytes); - if errors { - eprintln!("Failed"); - String::new() - } else { - res.to_string() - } - }, - binary_reader::Endian::Native => {panic!("Endian type is wrong!")}, - binary_reader::Endian::Network => {panic!("Endian type is wrong!")}, - }; - - br.jmp(prev_pos); - Ok(string) - } - - pub fn read_fix_str_w(br: &mut BinaryReader, size: usize) -> Result { - let big_endian = br.endian == Endian::Big; - let bytes = br.read_bytes(size)?; - let mut terminator = 0; - for mut i in (0..size).step_by(2) { - terminator = i; - if i == size -1 { - i = i-1; - } - else if bytes[i] == 0 && bytes[i + 1] == 0 { - break; - } - } - - let string = if big_endian { - let (res, _enc, errors) = UTF_16BE.decode(&bytes[0..terminator]); - if errors { - eprintln!("Failed"); - String::new() - } else { - res.to_string() - } - } - else { - let (res, _enc, errors) = UTF_16LE.decode(&bytes[0..terminator]); - if errors { - eprintln!("Failed"); - String::new() - } else { - res.to_string() - } - }; - Ok(string) - } - - pub fn get_ascii(br: &mut BinaryReader, offset: usize) -> Result{ - let prev_pos = br.pos; - br.jmp(offset); - let string = Self::read_ascii(br)?; - br.jmp(prev_pos); - Ok(string) - } - - pub fn read_ascii(br: &mut BinaryReader) -> Result { - let bytes = Self::read_chars_terminated(br)?; - let res = String::from_utf8(bytes); - - match res { - Ok(str) => Ok(str), - Err(err) => panic!("Failed to read string: {err}"), - } - } - - pub fn read_fix_str(br: &mut BinaryReader, size: usize) -> Result { - let big_endian = br.endian == Endian::Big; - let bytes = br.read_bytes(size)?; - let mut terminator = 0; - - for i in 0..size { - terminator = i; - if bytes[i] == 0 { - break; - } - } - - let string = if big_endian { - let (res, _enc, errors) = UTF_16BE.decode(&bytes[0..terminator]); - if errors { - eprintln!("Failed"); - String::new() - } else { - res.to_string() - } - } - else { - let (res, _enc, errors) = UTF_16LE.decode(&bytes[0..terminator]); - if errors { - eprintln!("Failed"); - String::new() - } else { - res.to_string() - } - }; - Ok(string) - } - - - pub fn get_shift_jis(br: &mut BinaryReader, offset: usize) -> Result { - let prev_pos = br.pos; - br.jmp(offset); - let string = Self::read_shift_jis(br)?; - br.jmp(prev_pos); - Ok(string) - } - - pub fn read_shift_jis(br: &mut BinaryReader) -> Result { - let bytes = Self::read_chars_terminated(br)?; - let (res, _enc, errors) = SHIFT_JIS.decode(&bytes); - if errors { - panic!("Failed to read string!"); - } else { - Ok(res.to_string()) - } - } - - fn read_chars_terminated(br: &mut BinaryReader) -> Result, Error> { - let mut bytes: Vec = Vec::new(); - let mut b = br.read_u8()?; - while b != 0 { - bytes.push(b); - b = br.read_u8()?; - } - Ok(bytes) - } - - pub fn get_bytes(br: &mut BinaryReader, offset: usize, size: usize) -> Result, Error> { - let prev_pos = br.pos; - br.jmp(offset); - let bytes = br.read_bytes(size)?.to_vec(); - br.jmp(prev_pos); - Ok(bytes) - } - } -} \ No newline at end of file diff --git a/src/util/mod.rs b/src/util/mod.rs deleted file mode 100644 index a064cf4..0000000 --- a/src/util/mod.rs +++ /dev/null @@ -1,7 +0,0 @@ -pub mod bit; -pub mod bnd4; -pub mod params; -pub mod br_ext; -pub mod param_structs; -pub mod regulation; -pub mod validator; \ No newline at end of file diff --git a/src/util/param_structs.rs b/src/util/param_structs.rs deleted file mode 100644 index 5737894..0000000 --- a/src/util/param_structs.rs +++ /dev/null @@ -1,18629 +0,0 @@ -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct ACTIONBUTTON_PARAM_ST { - pub regionType: u8, - pub category: u8, - pub padding1: [u8;2], - pub dummyPoly1: i32, - pub dummyPoly2: i32, - pub radius: f32, - pub angle: i32, - pub depth: f32, - pub width: f32, - pub height: f32, - pub baseHeightOffset: f32, - pub angleCheckType: u8, - pub padding2: [u8;3], - pub allowAngle: i32, - pub spotDummyPoly: i32, - pub textBoxType: u8, - pub padding3: [u8;2], - bits_0: u8, - pub textId: i32, - pub invalidFlag: i32, - pub grayoutFlag: i32, - pub overrideActionButtonIdForRide: i32, - pub execInvalidTime: f32, - pub padding6: [u8;28], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl ACTIONBUTTON_PARAM_ST { - pub fn padding5(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn isInvalidForRide(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } - pub fn isGrayoutForRide(&self) -> bool { - self.bits_0 & (1 << 2) != 0 - } - pub fn isInvalidForCrouching(&self) -> bool { - self.bits_0 & (1 << 3) != 0 - } - pub fn isGrayoutForCrouching(&self) -> bool { - self.bits_0 & (1 << 4) != 0 - } - pub fn padding4(&self) -> bool { - self.bits_0 & (1 << 5) != 0 - } -} -impl Default for ACTIONBUTTON_PARAM_ST { - fn default() -> Self { - Self { - regionType: 0, - category: 0, - padding1: [0;2], - dummyPoly1: -1, - dummyPoly2: -1, - radius: 0., - angle: 180, - depth: 0., - width: 0., - height: 0., - baseHeightOffset: 0., - angleCheckType: 0, - padding2: [0;3], - allowAngle: 180, - spotDummyPoly: -1, - textBoxType: 0, - padding3: [0;2], - bits_0: 0, - textId: -1, - invalidFlag: 0, - grayoutFlag: 0, - overrideActionButtonIdForRide: -1, - execInvalidTime: 0., - padding6: [0;28], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct AI_ANIM_TBL_PARAM { - pub atk0_EzStateId: i16, - pub atk1_EzStateId: i16, - pub atk2_EzStateId: i16, - pub atk3_EzStateId: i16, - pub atk4_EzStateId: i16, - pub atk5_EzStateId: i16, - pub atk6_EzStateId: i16, - pub atk7_EzStateId: i16, - pub atk8_EzStateId: i16, - pub atk9_EzStateId: i16, - pub atk10_EzStateId: i16, - pub atk11_EzStateId: i16, - pub atk12_EzStateId: i16, - pub atk13_EzStateId: i16, - pub atk14_EzStateId: i16, - pub atk15_EzStateId: i16, - pub atk16_EzStateId: i16, - pub atk17_EzStateId: i16, - pub atk18_EzStateId: i16, - pub atk19_EzStateId: i16, - pub atk20_EzStateId: i16, - pub atk21_EzStateId: i16, - pub atk22_EzStateId: i16, - pub atk23_EzStateId: i16, - pub atk24_EzStateId: i16, - pub atk25_EzStateId: i16, - pub atk26_EzStateId: i16, - pub atk27_EzStateId: i16, - pub atk28_EzStateId: i16, - pub atk29_EzStateId: i16, - pub atk0_MinDist: i16, - pub atk1_MinDist: i16, - pub atk2_MinDist: i16, - pub atk3_MinDist: i16, - pub atk4_MinDist: i16, - pub atk5_MinDist: i16, - pub atk6_MinDist: i16, - pub atk7_MinDist: i16, - pub atk8_MinDist: i16, - pub atk9_MinDist: i16, - pub atk10_MinDist: i16, - pub atk11_MinDist: i16, - pub atk12_MinDist: i16, - pub atk13_MinDist: i16, - pub atk14_MinDist: i16, - pub atk15_MinDist: i16, - pub atk16_MinDist: i16, - pub atk17_MinDist: i16, - pub atk18_MinDist: i16, - pub atk19_MinDist: i16, - pub atk20_MinDist: i16, - pub atk21_MinDist: i16, - pub atk22_MinDist: i16, - pub atk23_MinDist: i16, - pub atk24_MinDist: i16, - pub atk25_MinDist: i16, - pub atk26_MinDist: i16, - pub atk27_MinDist: i16, - pub atk28_MinDist: i16, - pub atk29_MinDist: i16, - pub atk0_MaxDist: i16, - pub atk1_MaxDist: i16, - pub atk2_MaxDist: i16, - pub atk3_MaxDist: i16, - pub atk4_MaxDist: i16, - pub atk5_MaxDist: i16, - pub atk6_MaxDist: i16, - pub atk7_MaxDist: i16, - pub atk8_MaxDist: i16, - pub atk9_MaxDist: i16, - pub atk10_MaxDist: i16, - pub atk11_MaxDist: i16, - pub atk12_MaxDist: i16, - pub atk13_MaxDist: i16, - pub atk14_MaxDist: i16, - pub atk15_MaxDist: i16, - pub atk16_MaxDist: i16, - pub atk17_MaxDist: i16, - pub atk18_MaxDist: i16, - pub atk19_MaxDist: i16, - pub atk20_MaxDist: i16, - pub atk21_MaxDist: i16, - pub atk22_MaxDist: i16, - pub atk23_MaxDist: i16, - pub atk24_MaxDist: i16, - pub atk25_MaxDist: i16, - pub atk26_MaxDist: i16, - pub atk27_MaxDist: i16, - pub atk28_MaxDist: i16, - pub atk29_MaxDist: i16, - bits_0: u8, - bits_1: u8, - bits_2: u8, - bits_3: u8, - bits_4: u8, - bits_5: u8, - bits_6: u8, - bits_7: u8, - bits_8: u8, - bits_9: u8, - bits_10: u8, - bits_11: u8, - bits_12: u8, - bits_13: u8, - bits_14: u8, - pub pad0: [u8;13], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl AI_ANIM_TBL_PARAM { - pub fn atk0_AtkDistType(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn atk1_AtkDistType(&self) -> bool { - self.bits_0 & (1 << 4) != 0 - } - pub fn atk2_AtkDistType(&self) -> bool { - self.bits_1 & (1 << 0) != 0 - } - pub fn atk3_AtkDistType(&self) -> bool { - self.bits_1 & (1 << 4) != 0 - } - pub fn atk4_AtkDistType(&self) -> bool { - self.bits_2 & (1 << 0) != 0 - } - pub fn atk5_AtkDistType(&self) -> bool { - self.bits_2 & (1 << 4) != 0 - } - pub fn atk6_AtkDistType(&self) -> bool { - self.bits_3 & (1 << 0) != 0 - } - pub fn atk7_AtkDistType(&self) -> bool { - self.bits_3 & (1 << 4) != 0 - } - pub fn atk8_AtkDistType(&self) -> bool { - self.bits_4 & (1 << 0) != 0 - } - pub fn atk9_AtkDistType(&self) -> bool { - self.bits_4 & (1 << 4) != 0 - } - pub fn atk10_AtkDistType(&self) -> bool { - self.bits_5 & (1 << 0) != 0 - } - pub fn atk11_AtkDistType(&self) -> bool { - self.bits_5 & (1 << 4) != 0 - } - pub fn atk12_AtkDistType(&self) -> bool { - self.bits_6 & (1 << 0) != 0 - } - pub fn atk13_AtkDistType(&self) -> bool { - self.bits_6 & (1 << 4) != 0 - } - pub fn atk14_AtkDistType(&self) -> bool { - self.bits_7 & (1 << 0) != 0 - } - pub fn atk15_AtkDistType(&self) -> bool { - self.bits_7 & (1 << 4) != 0 - } - pub fn atk16_AtkDistType(&self) -> bool { - self.bits_8 & (1 << 0) != 0 - } - pub fn atk17_AtkDistType(&self) -> bool { - self.bits_8 & (1 << 4) != 0 - } - pub fn atk18_AtkDistType(&self) -> bool { - self.bits_9 & (1 << 0) != 0 - } - pub fn atk19_AtkDistType(&self) -> bool { - self.bits_9 & (1 << 4) != 0 - } - pub fn atk20_AtkDistType(&self) -> bool { - self.bits_10 & (1 << 0) != 0 - } - pub fn atk21_AtkDistType(&self) -> bool { - self.bits_10 & (1 << 4) != 0 - } - pub fn atk22_AtkDistType(&self) -> bool { - self.bits_11 & (1 << 0) != 0 - } - pub fn atk23_AtkDistType(&self) -> bool { - self.bits_11 & (1 << 4) != 0 - } - pub fn atk24_AtkDistType(&self) -> bool { - self.bits_12 & (1 << 0) != 0 - } - pub fn atk25_AtkDistType(&self) -> bool { - self.bits_12 & (1 << 4) != 0 - } - pub fn atk26_AtkDistType(&self) -> bool { - self.bits_13 & (1 << 0) != 0 - } - pub fn atk27_AtkDistType(&self) -> bool { - self.bits_13 & (1 << 4) != 0 - } - pub fn atk28_AtkDistType(&self) -> bool { - self.bits_14 & (1 << 0) != 0 - } - pub fn atk29_AtkDistType(&self) -> bool { - self.bits_14 & (1 << 4) != 0 - } -} -impl Default for AI_ANIM_TBL_PARAM { - fn default() -> Self { - Self { - atk0_EzStateId: 0, - atk1_EzStateId: 0, - atk2_EzStateId: 0, - atk3_EzStateId: 0, - atk4_EzStateId: 0, - atk5_EzStateId: 0, - atk6_EzStateId: 0, - atk7_EzStateId: 0, - atk8_EzStateId: 0, - atk9_EzStateId: 0, - atk10_EzStateId: 0, - atk11_EzStateId: 0, - atk12_EzStateId: 0, - atk13_EzStateId: 0, - atk14_EzStateId: 0, - atk15_EzStateId: 0, - atk16_EzStateId: 0, - atk17_EzStateId: 0, - atk18_EzStateId: 0, - atk19_EzStateId: 0, - atk20_EzStateId: 0, - atk21_EzStateId: 0, - atk22_EzStateId: 0, - atk23_EzStateId: 0, - atk24_EzStateId: 0, - atk25_EzStateId: 0, - atk26_EzStateId: 0, - atk27_EzStateId: 0, - atk28_EzStateId: 0, - atk29_EzStateId: 0, - atk0_MinDist: 0, - atk1_MinDist: 0, - atk2_MinDist: 0, - atk3_MinDist: 0, - atk4_MinDist: 0, - atk5_MinDist: 0, - atk6_MinDist: 0, - atk7_MinDist: 0, - atk8_MinDist: 0, - atk9_MinDist: 0, - atk10_MinDist: 0, - atk11_MinDist: 0, - atk12_MinDist: 0, - atk13_MinDist: 0, - atk14_MinDist: 0, - atk15_MinDist: 0, - atk16_MinDist: 0, - atk17_MinDist: 0, - atk18_MinDist: 0, - atk19_MinDist: 0, - atk20_MinDist: 0, - atk21_MinDist: 0, - atk22_MinDist: 0, - atk23_MinDist: 0, - atk24_MinDist: 0, - atk25_MinDist: 0, - atk26_MinDist: 0, - atk27_MinDist: 0, - atk28_MinDist: 0, - atk29_MinDist: 0, - atk0_MaxDist: 0, - atk1_MaxDist: 0, - atk2_MaxDist: 0, - atk3_MaxDist: 0, - atk4_MaxDist: 0, - atk5_MaxDist: 0, - atk6_MaxDist: 0, - atk7_MaxDist: 0, - atk8_MaxDist: 0, - atk9_MaxDist: 0, - atk10_MaxDist: 0, - atk11_MaxDist: 0, - atk12_MaxDist: 0, - atk13_MaxDist: 0, - atk14_MaxDist: 0, - atk15_MaxDist: 0, - atk16_MaxDist: 0, - atk17_MaxDist: 0, - atk18_MaxDist: 0, - atk19_MaxDist: 0, - atk20_MaxDist: 0, - atk21_MaxDist: 0, - atk22_MaxDist: 0, - atk23_MaxDist: 0, - atk24_MaxDist: 0, - atk25_MaxDist: 0, - atk26_MaxDist: 0, - atk27_MaxDist: 0, - atk28_MaxDist: 0, - atk29_MaxDist: 0, - bits_0: 0, - bits_1: 0, - bits_2: 0, - bits_3: 0, - bits_4: 0, - bits_5: 0, - bits_6: 0, - bits_7: 0, - bits_8: 0, - bits_9: 0, - bits_10: 0, - bits_11: 0, - bits_12: 0, - bits_13: 0, - bits_14: 0, - pad0: [0;13], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct AI_ATTACK_PARAM_ST { - pub attackTableId: i32, - pub attackId: i32, - pub successDistance: f32, - pub turnTimeBeforeAttack: f32, - pub frontAngleRange: i16, - pub upAngleThreshold: i16, - pub downAngleThershold: i16, - pub isFirstAttack: u8, - pub doesSelectOnOutRange: u8, - pub minOptimalDistance: f32, - pub maxOptimalDistance: f32, - pub baseDirectionForOptimalAngle1: i16, - pub optimalAttackAngleRange1: i16, - pub baseDirectionForOptimalAngle2: i16, - pub optimalAttackAngleRange2: i16, - pub intervalForExec: f32, - pub selectionTendency: f32, - pub shortRangeTendency: f32, - pub middleRangeTendency: f32, - pub farRangeTendency: f32, - pub outRangeTendency: f32, - pub deriveAttackId1: i32, - pub deriveAttackId2: i32, - pub deriveAttackId3: i32, - pub deriveAttackId4: i32, - pub deriveAttackId5: i32, - pub deriveAttackId6: i32, - pub deriveAttackId7: i32, - pub deriveAttackId8: i32, - pub deriveAttackId9: i32, - pub deriveAttackId10: i32, - pub deriveAttackId11: i32, - pub deriveAttackId12: i32, - pub deriveAttackId13: i32, - pub deriveAttackId14: i32, - pub deriveAttackId15: i32, - pub deriveAttackId16: i32, - pub goalLifeMin: f32, - pub goalLifeMax: f32, - pub doesSelectOnInnerRange: u8, - pub enableAttackOnBattleStart: u8, - pub doesSelectOnTargetDown: u8, - pub pad1: [u8;1], - pub minArriveDistance: f32, - pub maxArriveDistance: f32, - pub comboExecDistance: f32, - pub comboExecRange: f32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl AI_ATTACK_PARAM_ST { -} -impl Default for AI_ATTACK_PARAM_ST { - fn default() -> Self { - Self { - attackTableId: 0, - attackId: 0, - successDistance: 0., - turnTimeBeforeAttack: 0., - frontAngleRange: 0, - upAngleThreshold: 0, - downAngleThershold: 0, - isFirstAttack: 0, - doesSelectOnOutRange: 0, - minOptimalDistance: 0., - maxOptimalDistance: 0., - baseDirectionForOptimalAngle1: 0, - optimalAttackAngleRange1: 0, - baseDirectionForOptimalAngle2: 0, - optimalAttackAngleRange2: 0, - intervalForExec: 1., - selectionTendency: -1., - shortRangeTendency: -1., - middleRangeTendency: -1., - farRangeTendency: -1., - outRangeTendency: -1., - deriveAttackId1: -1, - deriveAttackId2: -1, - deriveAttackId3: -1, - deriveAttackId4: -1, - deriveAttackId5: -1, - deriveAttackId6: -1, - deriveAttackId7: -1, - deriveAttackId8: -1, - deriveAttackId9: -1, - deriveAttackId10: -1, - deriveAttackId11: -1, - deriveAttackId12: -1, - deriveAttackId13: -1, - deriveAttackId14: -1, - deriveAttackId15: -1, - deriveAttackId16: -1, - goalLifeMin: 0., - goalLifeMax: 0., - doesSelectOnInnerRange: 0, - enableAttackOnBattleStart: 1, - doesSelectOnTargetDown: 1, - pad1: [0;1], - minArriveDistance: 0., - maxArriveDistance: 0., - comboExecDistance: 4., - comboExecRange: 180., - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct AI_ODDS_PARAM { - pub act0: u8, - pub act1: u8, - pub act2: u8, - pub act3: u8, - pub act4: u8, - pub act5: u8, - pub act6: u8, - pub act7: u8, - pub act8: u8, - pub act9: u8, - pub act10: u8, - pub act11: u8, - pub act12: u8, - pub act13: u8, - pub act14: u8, - pub act15: u8, - pub act16: u8, - pub act17: u8, - pub act18: u8, - pub act19: u8, - pub act20: u8, - pub act21: u8, - pub act22: u8, - pub act23: u8, - pub act24: u8, - pub act25: u8, - pub act26: u8, - pub act27: u8, - pub act28: u8, - pub act29: u8, - pub act30: u8, - pub act31: u8, - pub act32: u8, - pub act33: u8, - pub act34: u8, - pub act35: u8, - pub act36: u8, - pub act37: u8, - pub act38: u8, - pub act39: u8, - pub act40: u8, - pub act41: u8, - pub act42: u8, - pub act43: u8, - pub act44: u8, - pub act45: u8, - pub act46: u8, - pub act47: u8, - pub act48: u8, - pub act49: u8, - pub act50: u8, - pub act51: u8, - pub act52: u8, - pub act53: u8, - pub act54: u8, - pub act55: u8, - pub act56: u8, - pub act57: u8, - pub act58: u8, - pub act59: u8, - pub act60: u8, - pub act61: u8, - pub act62: u8, - pub act63: u8, - pub act64: u8, - pub act65: u8, - pub act66: u8, - pub act67: u8, - pub act68: u8, - pub act69: u8, - pub act70: u8, - pub act71: u8, - pub act72: u8, - pub act73: u8, - pub act74: u8, - pub act75: u8, - pub act76: u8, - pub act77: u8, - pub act78: u8, - pub act79: u8, - pub act80: u8, - pub act81: u8, - pub act82: u8, - pub act83: u8, - pub act84: u8, - pub act85: u8, - pub act86: u8, - pub act87: u8, - pub act88: u8, - pub act89: u8, - pub act90: u8, - pub act91: u8, - pub act92: u8, - pub act93: u8, - pub act94: u8, - pub act95: u8, - pub act96: u8, - pub act97: u8, - pub act98: u8, - pub act99: u8, - pub pad0: [u8;12], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl AI_ODDS_PARAM { -} -impl Default for AI_ODDS_PARAM { - fn default() -> Self { - Self { - act0: 0, - act1: 0, - act2: 0, - act3: 0, - act4: 0, - act5: 0, - act6: 0, - act7: 0, - act8: 0, - act9: 0, - act10: 0, - act11: 0, - act12: 0, - act13: 0, - act14: 0, - act15: 0, - act16: 0, - act17: 0, - act18: 0, - act19: 0, - act20: 0, - act21: 0, - act22: 0, - act23: 0, - act24: 0, - act25: 0, - act26: 0, - act27: 0, - act28: 0, - act29: 0, - act30: 0, - act31: 0, - act32: 0, - act33: 0, - act34: 0, - act35: 0, - act36: 0, - act37: 0, - act38: 0, - act39: 0, - act40: 0, - act41: 0, - act42: 0, - act43: 0, - act44: 0, - act45: 0, - act46: 0, - act47: 0, - act48: 0, - act49: 0, - act50: 0, - act51: 0, - act52: 0, - act53: 0, - act54: 0, - act55: 0, - act56: 0, - act57: 0, - act58: 0, - act59: 0, - act60: 0, - act61: 0, - act62: 0, - act63: 0, - act64: 0, - act65: 0, - act66: 0, - act67: 0, - act68: 0, - act69: 0, - act70: 0, - act71: 0, - act72: 0, - act73: 0, - act74: 0, - act75: 0, - act76: 0, - act77: 0, - act78: 0, - act79: 0, - act80: 0, - act81: 0, - act82: 0, - act83: 0, - act84: 0, - act85: 0, - act86: 0, - act87: 0, - act88: 0, - act89: 0, - act90: 0, - act91: 0, - act92: 0, - act93: 0, - act94: 0, - act95: 0, - act96: 0, - act97: 0, - act98: 0, - act99: 0, - pad0: [0;12], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct AI_SOUND_PARAM_ST { - pub radius: f32, - pub lifeFrame: f32, - pub bSpEffectEnable: u8, - pub r#type: u8, - bits_0: u8, - pub forgetTime: f32, - pub priority: i32, - pub soundBehaviorId: i32, - pub aiSoundLevel: u8, - pub replaningState: u8, - pub pad1: [u8;6], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl AI_SOUND_PARAM_ST { - pub fn opposeTarget(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn friendlyTarget(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } - pub fn selfTarget(&self) -> bool { - self.bits_0 & (1 << 2) != 0 - } - pub fn disableOnTargetPCompany(&self) -> bool { - self.bits_0 & (1 << 3) != 0 - } -} -impl Default for AI_SOUND_PARAM_ST { - fn default() -> Self { - Self { - radius: 0., - lifeFrame: 0., - bSpEffectEnable: 0, - r#type: 0, - bits_0: 1, - forgetTime: -1., - priority: 100, - soundBehaviorId: -1, - aiSoundLevel: 0, - replaningState: 0, - pad1: [0;6], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct AI_STANDARD_INFO_BANK { - pub RadarRange: i16, - pub RadarAngleX: u8, - pub RadarAngleY: u8, - pub TerritorySize: i16, - pub ThreatBeforeAttackRate: u8, - pub ForceThreatOnFirstLocked: u8, - pub reserve0: [u8;24], - pub Attack1_Distance: i16, - pub Attack1_Margin: i16, - pub Attack1_Rate: u8, - pub Attack1_ActionID: u8, - pub Attack1_DelayMin: u8, - pub Attack1_DelayMax: u8, - pub Attack1_ConeAngle: u8, - pub reserve10: [u8;7], - pub Attack2_Distance: i16, - pub Attack2_Margin: i16, - pub Attack2_Rate: u8, - pub Attack2_ActionID: u8, - pub Attack2_DelayMin: u8, - pub Attack2_DelayMax: u8, - pub Attack2_ConeAngle: u8, - pub reserve11: [u8;7], - pub Attack3_Distance: i16, - pub Attack3_Margin: i16, - pub Attack3_Rate: u8, - pub Attack3_ActionID: u8, - pub Attack3_DelayMin: u8, - pub Attack3_DelayMax: u8, - pub Attack3_ConeAngle: u8, - pub reserve12: [u8;7], - pub Attack4_Distance: i16, - pub Attack4_Margin: i16, - pub Attack4_Rate: u8, - pub Attack4_ActionID: u8, - pub Attack4_DelayMin: u8, - pub Attack4_DelayMax: u8, - pub Attack4_ConeAngle: u8, - pub reserve13: [u8;7], - pub reserve_last: [u8;32], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl AI_STANDARD_INFO_BANK { -} -impl Default for AI_STANDARD_INFO_BANK { - fn default() -> Self { - Self { - RadarRange: 20, - RadarAngleX: 30, - RadarAngleY: 60, - TerritorySize: 20, - ThreatBeforeAttackRate: 50, - ForceThreatOnFirstLocked: 0, - reserve0: [0;24], - Attack1_Distance: 0, - Attack1_Margin: 0, - Attack1_Rate: 50, - Attack1_ActionID: 0, - Attack1_DelayMin: 0, - Attack1_DelayMax: 0, - Attack1_ConeAngle: 30, - reserve10: [0;7], - Attack2_Distance: 0, - Attack2_Margin: 0, - Attack2_Rate: 50, - Attack2_ActionID: 0, - Attack2_DelayMin: 0, - Attack2_DelayMax: 0, - Attack2_ConeAngle: 30, - reserve11: [0;7], - Attack3_Distance: 0, - Attack3_Margin: 0, - Attack3_Rate: 50, - Attack3_ActionID: 0, - Attack3_DelayMin: 0, - Attack3_DelayMax: 0, - Attack3_ConeAngle: 30, - reserve12: [0;7], - Attack4_Distance: 0, - Attack4_Margin: 0, - Attack4_Rate: 50, - Attack4_ActionID: 0, - Attack4_DelayMin: 0, - Attack4_DelayMax: 0, - Attack4_ConeAngle: 30, - reserve13: [0;7], - reserve_last: [0;32], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct ASSET_GEOMETORY_PARAM_ST { - pub soundBankId: i32, - pub soundBreakSEId: i32, - pub refDrawParamId: i32, - pub hitCreateType: i8, - pub behaviorType: u8, - pub collisionType: u8, - pub rainBlockingType: u8, - pub hp: i16, - pub defense: i16, - pub breakStopTime: f32, - pub breakSfxId: i32, - pub breakSfxCpId: i32, - pub breakLandingSfxId: i32, - pub breakBulletBehaviorId: i32, - pub breakBulletCpId: i32, - pub FragmentInvisibleWaitTime: f32, - pub FragmentInvisibleTime: f32, - pub BreakAiSoundID: i32, - pub breakItemLotType: i8, - pub animBreakIdMax: u8, - pub breakBulletAttributeDamageType: i8, - bits_0: u8, - bits_1: u8, - pub navimeshFlag: u8, - pub burnBulletInterval: i16, - pub clothUpdateDist: f32, - pub lifeTime_forRuntimeCreate: f32, - pub contactSeId: i32, - pub repickAnimIdOffset: i32, - pub windEffectRate_0: f32, - pub windEffectRate_1: f32, - pub windEffectType_0: u8, - pub windEffectType_1: u8, - pub overrideMaterialId: i16, - pub autoCreateOffsetHeight: f32, - pub burnTime: f32, - pub burnBraekRate: f32, - pub burnSfxId: i32, - pub burnSfxId_1: i32, - pub burnSfxId_2: i32, - pub burnSfxId_3: i32, - pub burnSfxDelayTimeMin: f32, - pub burnSfxDelayTimeMin_1: f32, - pub burnSfxDelayTimeMin_2: f32, - pub burnSfxDelayTimeMin_3: f32, - pub burnSfxDelayTimeMax: f32, - pub burnSfxDelayTimeMax_1: f32, - pub burnSfxDelayTimeMax_2: f32, - pub burnSfxDelayTimeMax_3: f32, - pub burnBulletBehaviorId: i32, - pub burnBulletBehaviorId_1: i32, - pub burnBulletBehaviorId_2: i32, - pub burnBulletBehaviorId_3: i32, - pub burnBulletDelayTime: f32, - pub paintDecalTargetTextureSize: i16, - pub navimeshFlag_after: u8, - pub camNearBehaviorType: i8, - pub breakItemLotParamId: i32, - pub pickUpActionButtonParamId: i32, - pub pickUpItemLotParamId: i32, - pub autoDrawGroupBackFaceCheck: u8, - pub autoDrawGroupDepthWrite: u8, - pub autoDrawGroupShadowTest: u8, - pub debug_isHeightCheckEnable: u8, - pub hitCarverCancelAreaFlag: u8, - pub assetNavimeshNoCombine: u8, - pub navimeshFlagApply: u8, - pub navimeshFlagApply_after: u8, - pub autoDrawGroupPassPixelNum: f32, - pub pickUpReplacementEventFlag: i32, - pub pickUpReplacementAnimIdOffset: i32, - pub pickUpReplacementActionButtonParamId: i32, - pub pickUpReplacementItemLotParamId: i32, - pub slidingBulletHitType: u8, - pub isBushesForDamage: u8, - pub penetrationBulletType: u8, - pub unkR3: u8, - pub unkR4: f32, - pub soundBreakSECpId: i32, - pub debug_HeightCheckCapacityMin: f32, - pub debug_HeightCheckCapacityMax: f32, - pub repickActionButtonParamId: i32, - pub repickItemLotParamId: i32, - pub repickReplacementAnimIdOffset: i32, - pub repickReplacementActionButtonParamId: i32, - pub repickReplacementItemLotParamId: i32, - pub noGenerateCarver: u8, - pub noHitHugeAfterBreak: u8, - bits_2: u8, - pub generateMultiForbiddenRegion: u8, - pub residentSeId0: i32, - pub residentSeId1: i32, - pub residentSeId2: i32, - pub residentSeId3: i32, - pub residentSeDmypolyId0: i16, - pub residentSeDmypolyId1: i16, - pub residentSeDmypolyId2: i16, - pub residentSeDmypolyId3: i16, - pub excludeActivateRatio_Xboxone_Grid: u8, - pub excludeActivateRatio_Xboxone_Legacy: u8, - pub excludeActivateRatio_PS4_Grid: u8, - pub excludeActivateRatio_PS4_Legacy: u8, - pub Reserve_0: [u8;32], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl ASSET_GEOMETORY_PARAM_ST { - pub fn isBreakByPlayerCollide(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn isBreakByEnemyCollide(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } - pub fn isBreak_ByChrRide(&self) -> bool { - self.bits_0 & (1 << 2) != 0 - } - pub fn isDisableBreakForFirstAppear(&self) -> bool { - self.bits_0 & (1 << 3) != 0 - } - pub fn isAnimBreak(&self) -> bool { - self.bits_0 & (1 << 4) != 0 - } - pub fn isDamageCover(&self) -> bool { - self.bits_0 & (1 << 5) != 0 - } - pub fn isAttackBacklash(&self) -> bool { - self.bits_0 & (1 << 6) != 0 - } - pub fn Reserve_2(&self) -> bool { - self.bits_0 & (1 << 7) != 0 - } - pub fn isLadder(&self) -> bool { - self.bits_1 & (1 << 0) != 0 - } - pub fn isMoveObj(&self) -> bool { - self.bits_1 & (1 << 1) != 0 - } - pub fn isSkydomeFlag(&self) -> bool { - self.bits_1 & (1 << 2) != 0 - } - pub fn isAnimPauseOnRemoPlay(&self) -> bool { - self.bits_1 & (1 << 3) != 0 - } - pub fn isBurn(&self) -> bool { - self.bits_1 & (1 << 4) != 0 - } - pub fn isEnableRepick(&self) -> bool { - self.bits_1 & (1 << 5) != 0 - } - pub fn isBreakOnPickUp(&self) -> bool { - self.bits_1 & (1 << 6) != 0 - } - pub fn isBreakByHugeenemyCollide(&self) -> bool { - self.bits_1 & (1 << 7) != 0 - } - pub fn isEnabledBreakSync(&self) -> bool { - self.bits_2 & (1 << 0) != 0 - } - pub fn isHiddenOnRepick(&self) -> bool { - self.bits_2 & (1 << 1) != 0 - } - pub fn isCreateMultiPlayOnly(&self) -> bool { - self.bits_2 & (1 << 2) != 0 - } - pub fn isDisableBulletHitSfx(&self) -> bool { - self.bits_2 & (1 << 3) != 0 - } - pub fn isEnableSignPreBreak(&self) -> bool { - self.bits_2 & (1 << 4) != 0 - } - pub fn isEnableSignPostBreak(&self) -> bool { - self.bits_2 & (1 << 5) != 0 - } - pub fn unkR1(&self) -> bool { - self.bits_2 & (1 << 6) != 0 - } -} -impl Default for ASSET_GEOMETORY_PARAM_ST { - fn default() -> Self { - Self { - soundBankId: -1, - soundBreakSEId: -1, - refDrawParamId: -1, - hitCreateType: 0, - behaviorType: 1, - collisionType: 0, - rainBlockingType: 0, - hp: -1, - defense: 0, - breakStopTime: 30., - breakSfxId: -1, - breakSfxCpId: -1, - breakLandingSfxId: -1, - breakBulletBehaviorId: -1, - breakBulletCpId: -1, - FragmentInvisibleWaitTime: 0., - FragmentInvisibleTime: 0., - BreakAiSoundID: 0, - breakItemLotType: 0, - animBreakIdMax: 0, - breakBulletAttributeDamageType: 0, - bits_0: 0, - bits_1: 0, - navimeshFlag: 0, - burnBulletInterval: 30, - clothUpdateDist: 30., - lifeTime_forRuntimeCreate: 0., - contactSeId: -1, - repickAnimIdOffset: 0, - windEffectRate_0: 0.5, - windEffectRate_1: 0.5, - windEffectType_0: 0, - windEffectType_1: 0, - overrideMaterialId: -1, - autoCreateOffsetHeight: 0.1, - burnTime: 0., - burnBraekRate: 0.5, - burnSfxId: -1, - burnSfxId_1: -1, - burnSfxId_2: -1, - burnSfxId_3: -1, - burnSfxDelayTimeMin: 0., - burnSfxDelayTimeMin_1: 0., - burnSfxDelayTimeMin_2: 0., - burnSfxDelayTimeMin_3: 0., - burnSfxDelayTimeMax: 0., - burnSfxDelayTimeMax_1: 0., - burnSfxDelayTimeMax_2: 0., - burnSfxDelayTimeMax_3: 0., - burnBulletBehaviorId: -1, - burnBulletBehaviorId_1: -1, - burnBulletBehaviorId_2: -1, - burnBulletBehaviorId_3: -1, - burnBulletDelayTime: 0., - paintDecalTargetTextureSize: 0, - navimeshFlag_after: 0, - camNearBehaviorType: 0, - breakItemLotParamId: -1, - pickUpActionButtonParamId: -1, - pickUpItemLotParamId: -1, - autoDrawGroupBackFaceCheck: 0, - autoDrawGroupDepthWrite: 0, - autoDrawGroupShadowTest: 0, - debug_isHeightCheckEnable: 0, - hitCarverCancelAreaFlag: 0, - assetNavimeshNoCombine: 0, - navimeshFlagApply: 0, - navimeshFlagApply_after: 0, - autoDrawGroupPassPixelNum: -1., - pickUpReplacementEventFlag: 0, - pickUpReplacementAnimIdOffset: 0, - pickUpReplacementActionButtonParamId: -1, - pickUpReplacementItemLotParamId: -1, - slidingBulletHitType: 0, - isBushesForDamage: 0, - penetrationBulletType: 0, - unkR3: 0, - unkR4: 0., - soundBreakSECpId: -1, - debug_HeightCheckCapacityMin: -99., - debug_HeightCheckCapacityMax: 99., - repickActionButtonParamId: -1, - repickItemLotParamId: -1, - repickReplacementAnimIdOffset: 0, - repickReplacementActionButtonParamId: -1, - repickReplacementItemLotParamId: -1, - noGenerateCarver: 0, - noHitHugeAfterBreak: 0, - bits_2: 1, - generateMultiForbiddenRegion: 0, - residentSeId0: -1, - residentSeId1: -1, - residentSeId2: -1, - residentSeId3: -1, - residentSeDmypolyId0: -1, - residentSeDmypolyId1: -1, - residentSeDmypolyId2: -1, - residentSeDmypolyId3: -1, - excludeActivateRatio_Xboxone_Grid: 0, - excludeActivateRatio_Xboxone_Legacy: 0, - excludeActivateRatio_PS4_Grid: 0, - excludeActivateRatio_PS4_Legacy: 0, - Reserve_0: [0;32], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct ASSET_MATERIAL_SFX_PARAM_ST { - pub sfxId_00: i32, - pub sfxId_01: i32, - pub sfxId_02: i32, - pub sfxId_03: i32, - pub sfxId_04: i32, - pub sfxId_05: i32, - pub sfxId_06: i32, - pub sfxId_07: i32, - pub sfxId_08: i32, - pub sfxId_09: i32, - pub sfxId_10: i32, - pub sfxId_11: i32, - pub sfxId_12: i32, - pub sfxId_13: i32, - pub sfxId_14: i32, - pub sfxId_15: i32, - pub sfxId_16: i32, - pub sfxId_17: i32, - pub sfxId_18: i32, - pub sfxId_19: i32, - pub sfxId_20: i32, - pub sfxId_21: i32, - pub sfxId_22: i32, - pub sfxId_23: i32, - pub sfxId_24: i32, - pub sfxId_25: i32, - pub sfxId_26: i32, - pub sfxId_27: i32, - pub sfxId_28: i32, - pub sfxId_29: i32, - pub sfxId_30: i32, - pub sfxId_31: i32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl ASSET_MATERIAL_SFX_PARAM_ST { -} -impl Default for ASSET_MATERIAL_SFX_PARAM_ST { - fn default() -> Self { - Self { - sfxId_00: 0, - sfxId_01: 0, - sfxId_02: 0, - sfxId_03: 0, - sfxId_04: 0, - sfxId_05: 0, - sfxId_06: 0, - sfxId_07: 0, - sfxId_08: 0, - sfxId_09: 0, - sfxId_10: 0, - sfxId_11: 0, - sfxId_12: 0, - sfxId_13: 0, - sfxId_14: 0, - sfxId_15: 0, - sfxId_16: 0, - sfxId_17: 0, - sfxId_18: 0, - sfxId_19: 0, - sfxId_20: 0, - sfxId_21: 0, - sfxId_22: 0, - sfxId_23: 0, - sfxId_24: 0, - sfxId_25: 0, - sfxId_26: 0, - sfxId_27: 0, - sfxId_28: 0, - sfxId_29: 0, - sfxId_30: 0, - sfxId_31: 0, - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct ASSET_MODEL_SFX_PARAM_ST { - pub sfxId_0: i32, - pub dmypolyId_0: i32, - pub reserve_0: [u8;8], - pub sfxId_1: i32, - pub dmypolyId_1: i32, - pub reserve_1: [u8;8], - pub sfxId_2: i32, - pub dmypolyId_2: i32, - pub reserve_2: [u8;8], - pub sfxId_3: i32, - pub dmypolyId_3: i32, - pub reserve_3: [u8;8], - pub sfxId_4: i32, - pub dmypolyId_4: i32, - pub reserve_4: [u8;8], - pub sfxId_5: i32, - pub dmypolyId_5: i32, - pub reserve_5: [u8;8], - pub sfxId_6: i32, - pub dmypolyId_6: i32, - pub reserve_6: [u8;8], - pub sfxId_7: i32, - pub dmypolyId_7: i32, - pub isDisableIV: u8, - pub reserve_7: [u8;7], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl ASSET_MODEL_SFX_PARAM_ST { -} -impl Default for ASSET_MODEL_SFX_PARAM_ST { - fn default() -> Self { - Self { - sfxId_0: -1, - dmypolyId_0: -1, - reserve_0: [0;8], - sfxId_1: -1, - dmypolyId_1: -1, - reserve_1: [0;8], - sfxId_2: -1, - dmypolyId_2: -1, - reserve_2: [0;8], - sfxId_3: -1, - dmypolyId_3: -1, - reserve_3: [0;8], - sfxId_4: -1, - dmypolyId_4: -1, - reserve_4: [0;8], - sfxId_5: -1, - dmypolyId_5: -1, - reserve_5: [0;8], - sfxId_6: -1, - dmypolyId_6: -1, - reserve_6: [0;8], - sfxId_7: -1, - dmypolyId_7: -1, - isDisableIV: 0, - reserve_7: [0;7], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct ATK_PARAM_ST { - pub hit0_Radius: f32, - pub hit1_Radius: f32, - pub hit2_Radius: f32, - pub hit3_Radius: f32, - pub knockbackDist: f32, - pub hitStopTime: f32, - pub spEffectId0: i32, - pub spEffectId1: i32, - pub spEffectId2: i32, - pub spEffectId3: i32, - pub spEffectId4: i32, - pub hit0_DmyPoly1: i16, - pub hit1_DmyPoly1: i16, - pub hit2_DmyPoly1: i16, - pub hit3_DmyPoly1: i16, - pub hit0_DmyPoly2: i16, - pub hit1_DmyPoly2: i16, - pub hit2_DmyPoly2: i16, - pub hit3_DmyPoly2: i16, - pub blowingCorrection: i16, - pub atkPhysCorrection: i16, - pub atkMagCorrection: i16, - pub atkFireCorrection: i16, - pub atkThunCorrection: i16, - pub atkStamCorrection: i16, - pub guardAtkRateCorrection: i16, - pub guardBreakCorrection: i16, - pub atkThrowEscapeCorrection: i16, - pub subCategory1: u8, - pub subCategory2: u8, - pub atkPhys: i16, - pub atkMag: i16, - pub atkFire: i16, - pub atkThun: i16, - pub atkStam: i16, - pub guardAtkRate: i16, - pub guardBreakRate: i16, - pub pad6: [u8;1], - pub isEnableCalcDamageForBushesObj: u8, - pub atkThrowEscape: i16, - pub atkObj: i16, - pub guardStaminaCutRate: i16, - pub guardRate: i16, - pub throwTypeId: i16, - pub hit0_hitType: u8, - pub hit1_hitType: u8, - pub hit2_hitType: u8, - pub hit3_hitType: u8, - pub hti0_Priority: u8, - pub hti1_Priority: u8, - pub hti2_Priority: u8, - pub hti3_Priority: u8, - pub dmgLevel: u8, - pub mapHitType: u8, - pub guardCutCancelRate: i8, - pub atkAttribute: u8, - pub spAttribute: u8, - pub atkType: u8, - pub atkMaterial: u8, - pub guardRangeType: u8, - pub defSeMaterial1: i16, - pub hitSourceType: u8, - pub throwFlag: u8, - bits_0: u8, - pub atkPow_forSfx: i8, - pub atkDir_forSfx: i8, - bits_1: u8, - pub atkBehaviorId: u8, - pub atkPow_forSe: i8, - pub atkSuperArmor: f32, - pub decalId1: i32, - pub decalId2: i32, - pub AppearAiSoundId: i32, - pub HitAiSoundId: i32, - pub HitRumbleId: i32, - pub HitRumbleIdByNormal: i32, - pub HitRumbleIdByMiddle: i32, - pub HitRumbleIdByRoot: i32, - pub traceSfxId0: i32, - pub traceDmyIdHead0: i32, - pub traceDmyIdTail0: i32, - pub traceSfxId1: i32, - pub traceDmyIdHead1: i32, - pub traceDmyIdTail1: i32, - pub traceSfxId2: i32, - pub traceDmyIdHead2: i32, - pub traceDmyIdTail2: i32, - pub traceSfxId3: i32, - pub traceDmyIdHead3: i32, - pub traceDmyIdTail3: i32, - pub traceSfxId4: i32, - pub traceDmyIdHead4: i32, - pub traceDmyIdTail4: i32, - pub traceSfxId5: i32, - pub traceDmyIdHead5: i32, - pub traceDmyIdTail5: i32, - pub traceSfxId6: i32, - pub traceDmyIdHead6: i32, - pub traceDmyIdTail6: i32, - pub traceSfxId7: i32, - pub traceDmyIdHead7: i32, - pub traceDmyIdTail7: i32, - pub hit4_Radius: f32, - pub hit5_Radius: f32, - pub hit6_Radius: f32, - pub hit7_Radius: f32, - pub hit8_Radius: f32, - pub hit9_Radius: f32, - pub hit10_Radius: f32, - pub hit11_Radius: f32, - pub hit12_Radius: f32, - pub hit13_Radius: f32, - pub hit14_Radius: f32, - pub hit15_Radius: f32, - pub hit4_DmyPoly1: i16, - pub hit5_DmyPoly1: i16, - pub hit6_DmyPoly1: i16, - pub hit7_DmyPoly1: i16, - pub hit8_DmyPoly1: i16, - pub hit9_DmyPoly1: i16, - pub hit10_DmyPoly1: i16, - pub hit11_DmyPoly1: i16, - pub hit12_DmyPoly1: i16, - pub hit13_DmyPoly1: i16, - pub hit14_DmyPoly1: i16, - pub hit15_DmyPoly1: i16, - pub hit4_DmyPoly2: i16, - pub hit5_DmyPoly2: i16, - pub hit6_DmyPoly2: i16, - pub hit7_DmyPoly2: i16, - pub hit8_DmyPoly2: i16, - pub hit9_DmyPoly2: i16, - pub hit10_DmyPoly2: i16, - pub hit11_DmyPoly2: i16, - pub hit12_DmyPoly2: i16, - pub hit13_DmyPoly2: i16, - pub hit14_DmyPoly2: i16, - pub hit15_DmyPoly2: i16, - pub hit4_hitType: u8, - pub hit5_hitType: u8, - pub hit6_hitType: u8, - pub hit7_hitType: u8, - pub hit8_hitType: u8, - pub hit9_hitType: u8, - pub hit10_hitType: u8, - pub hit11_hitType: u8, - pub hit12_hitType: u8, - pub hit13_hitType: u8, - pub hit14_hitType: u8, - pub hit15_hitType: u8, - pub hti4_Priority: u8, - pub hti5_Priority: u8, - pub hti6_Priority: u8, - pub hti7_Priority: u8, - pub hti8_Priority: u8, - pub hti9_Priority: u8, - pub hti10_Priority: u8, - pub hti11_Priority: u8, - pub hti12_Priority: u8, - pub hti13_Priority: u8, - pub hti14_Priority: u8, - pub hti15_Priority: u8, - pub defSfxMaterial1: i16, - pub defSeMaterial2: i16, - pub defSfxMaterial2: i16, - pub atkDarkCorrection: i16, - pub atkDark: i16, - bits_2: u8, - pub dmgLevel_vsPlayer: i8, - pub statusAilmentAtkPowerCorrectRate: i16, - pub spEffectAtkPowerCorrectRate_byPoint: i16, - pub spEffectAtkPowerCorrectRate_byRate: i16, - pub spEffectAtkPowerCorrectRate_byDmg: i16, - pub atkBehaviorId_2: u8, - pub throwDamageAttribute: u8, - pub statusAilmentAtkPowerCorrectRate_byPoint: i16, - pub overwriteAttackElementCorrectId: i32, - pub decalBaseId1: i16, - pub decalBaseId2: i16, - pub wepRegainHpScale: i16, - pub atkRegainHp: i16, - pub regainableTimeScale: f32, - pub regainableHpRateScale: f32, - pub regainableSlotId: i8, - pub spAttributeVariationValue: u8, - pub parryForwardOffset: i16, - pub atkSuperArmorCorrection: f32, - pub defSfxMaterialVariationValue: u8, - pub pad4: [u8;3], - pub finalDamageRateId: i32, - pub pad7: [u8;12], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl ATK_PARAM_ST { - pub fn disableGuard(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableStaminaAttack(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } - pub fn disableHitSpEffect(&self) -> bool { - self.bits_0 & (1 << 2) != 0 - } - pub fn IgnoreNotifyMissSwingForAI(&self) -> bool { - self.bits_0 & (1 << 3) != 0 - } - pub fn repeatHitSfx(&self) -> bool { - self.bits_0 & (1 << 4) != 0 - } - pub fn isArrowAtk(&self) -> bool { - self.bits_0 & (1 << 5) != 0 - } - pub fn isGhostAtk(&self) -> bool { - self.bits_0 & (1 << 6) != 0 - } - pub fn isDisableNoDamage(&self) -> bool { - self.bits_0 & (1 << 7) != 0 - } - pub fn opposeTarget(&self) -> bool { - self.bits_1 & (1 << 0) != 0 - } - pub fn friendlyTarget(&self) -> bool { - self.bits_1 & (1 << 1) != 0 - } - pub fn selfTarget(&self) -> bool { - self.bits_1 & (1 << 2) != 0 - } - pub fn isCheckDoorPenetration(&self) -> bool { - self.bits_1 & (1 << 3) != 0 - } - pub fn isVsRideAtk(&self) -> bool { - self.bits_1 & (1 << 4) != 0 - } - pub fn isAddBaseAtk(&self) -> bool { - self.bits_1 & (1 << 5) != 0 - } - pub fn excludeThreatLvNotify(&self) -> bool { - self.bits_1 & (1 << 6) != 0 - } - pub fn pad1(&self) -> bool { - self.bits_1 & (1 << 7) != 0 - } - pub fn pad5(&self) -> bool { - self.bits_2 & (1 << 0) != 0 - } - pub fn isDisableParry(&self) -> bool { - self.bits_2 & (1 << 1) != 0 - } - pub fn isDisableBothHandsAtkBonus(&self) -> bool { - self.bits_2 & (1 << 2) != 0 - } - pub fn isInvalidatedByNoDamageInAir(&self) -> bool { - self.bits_2 & (1 << 3) != 0 - } - pub fn pad2(&self) -> bool { - self.bits_2 & (1 << 4) != 0 - } -} -impl Default for ATK_PARAM_ST { - fn default() -> Self { - Self { - hit0_Radius: 0., - hit1_Radius: 0., - hit2_Radius: 0., - hit3_Radius: 0., - knockbackDist: 0., - hitStopTime: 0., - spEffectId0: -1, - spEffectId1: -1, - spEffectId2: -1, - spEffectId3: -1, - spEffectId4: -1, - hit0_DmyPoly1: 0, - hit1_DmyPoly1: 0, - hit2_DmyPoly1: 0, - hit3_DmyPoly1: 0, - hit0_DmyPoly2: 0, - hit1_DmyPoly2: 0, - hit2_DmyPoly2: 0, - hit3_DmyPoly2: 0, - blowingCorrection: 0, - atkPhysCorrection: 0, - atkMagCorrection: 0, - atkFireCorrection: 0, - atkThunCorrection: 0, - atkStamCorrection: 0, - guardAtkRateCorrection: 0, - guardBreakCorrection: 0, - atkThrowEscapeCorrection: 0, - subCategory1: 0, - subCategory2: 0, - atkPhys: 0, - atkMag: 0, - atkFire: 0, - atkThun: 0, - atkStam: 0, - guardAtkRate: 0, - guardBreakRate: 0, - pad6: [0;1], - isEnableCalcDamageForBushesObj: 0, - atkThrowEscape: 0, - atkObj: 0, - guardStaminaCutRate: 0, - guardRate: 0, - throwTypeId: 0, - hit0_hitType: 0, - hit1_hitType: 0, - hit2_hitType: 0, - hit3_hitType: 0, - hti0_Priority: 0, - hti1_Priority: 0, - hti2_Priority: 0, - hti3_Priority: 0, - dmgLevel: 0, - mapHitType: 0, - guardCutCancelRate: 0, - atkAttribute: 0, - spAttribute: 0, - atkType: 0, - atkMaterial: 0, - guardRangeType: 0, - defSeMaterial1: 0, - hitSourceType: 0, - throwFlag: 0, - bits_0: 0, - atkPow_forSfx: 0, - atkDir_forSfx: 0, - bits_1: 1, - atkBehaviorId: 0, - atkPow_forSe: 0, - atkSuperArmor: 0., - decalId1: -1, - decalId2: -1, - AppearAiSoundId: 0, - HitAiSoundId: 0, - HitRumbleId: -1, - HitRumbleIdByNormal: -1, - HitRumbleIdByMiddle: -1, - HitRumbleIdByRoot: -1, - traceSfxId0: -1, - traceDmyIdHead0: -1, - traceDmyIdTail0: -1, - traceSfxId1: -1, - traceDmyIdHead1: -1, - traceDmyIdTail1: -1, - traceSfxId2: -1, - traceDmyIdHead2: -1, - traceDmyIdTail2: -1, - traceSfxId3: -1, - traceDmyIdHead3: -1, - traceDmyIdTail3: -1, - traceSfxId4: -1, - traceDmyIdHead4: -1, - traceDmyIdTail4: -1, - traceSfxId5: -1, - traceDmyIdHead5: -1, - traceDmyIdTail5: -1, - traceSfxId6: -1, - traceDmyIdHead6: -1, - traceDmyIdTail6: -1, - traceSfxId7: -1, - traceDmyIdHead7: -1, - traceDmyIdTail7: -1, - hit4_Radius: 0., - hit5_Radius: 0., - hit6_Radius: 0., - hit7_Radius: 0., - hit8_Radius: 0., - hit9_Radius: 0., - hit10_Radius: 0., - hit11_Radius: 0., - hit12_Radius: 0., - hit13_Radius: 0., - hit14_Radius: 0., - hit15_Radius: 0., - hit4_DmyPoly1: 0, - hit5_DmyPoly1: 0, - hit6_DmyPoly1: 0, - hit7_DmyPoly1: 0, - hit8_DmyPoly1: 0, - hit9_DmyPoly1: 0, - hit10_DmyPoly1: 0, - hit11_DmyPoly1: 0, - hit12_DmyPoly1: 0, - hit13_DmyPoly1: 0, - hit14_DmyPoly1: 0, - hit15_DmyPoly1: 0, - hit4_DmyPoly2: 0, - hit5_DmyPoly2: 0, - hit6_DmyPoly2: 0, - hit7_DmyPoly2: 0, - hit8_DmyPoly2: 0, - hit9_DmyPoly2: 0, - hit10_DmyPoly2: 0, - hit11_DmyPoly2: 0, - hit12_DmyPoly2: 0, - hit13_DmyPoly2: 0, - hit14_DmyPoly2: 0, - hit15_DmyPoly2: 0, - hit4_hitType: 0, - hit5_hitType: 0, - hit6_hitType: 0, - hit7_hitType: 0, - hit8_hitType: 0, - hit9_hitType: 0, - hit10_hitType: 0, - hit11_hitType: 0, - hit12_hitType: 0, - hit13_hitType: 0, - hit14_hitType: 0, - hit15_hitType: 0, - hti4_Priority: 0, - hti5_Priority: 0, - hti6_Priority: 0, - hti7_Priority: 0, - hti8_Priority: 0, - hti9_Priority: 0, - hti10_Priority: 0, - hti11_Priority: 0, - hti12_Priority: 0, - hti13_Priority: 0, - hti14_Priority: 0, - hti15_Priority: 0, - defSfxMaterial1: 0, - defSeMaterial2: 0, - defSfxMaterial2: 0, - atkDarkCorrection: 0, - atkDark: 0, - bits_2: 0, - dmgLevel_vsPlayer: 0, - statusAilmentAtkPowerCorrectRate: 100, - spEffectAtkPowerCorrectRate_byPoint: 100, - spEffectAtkPowerCorrectRate_byRate: 100, - spEffectAtkPowerCorrectRate_byDmg: 100, - atkBehaviorId_2: 0, - throwDamageAttribute: 0, - statusAilmentAtkPowerCorrectRate_byPoint: 100, - overwriteAttackElementCorrectId: -1, - decalBaseId1: -1, - decalBaseId2: -1, - wepRegainHpScale: 100, - atkRegainHp: 0, - regainableTimeScale: 1., - regainableHpRateScale: 1., - regainableSlotId: -1, - spAttributeVariationValue: 0, - parryForwardOffset: 0, - atkSuperArmorCorrection: 0., - defSfxMaterialVariationValue: 0, - pad4: [0;3], - finalDamageRateId: 0, - pad7: [0;12], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct ATTACK_ELEMENT_CORRECT_PARAM_ST { - bits_0: u8, - bits_1: u8, - bits_2: u8, - bits_3: u8, - pub overwriteStrengthCorrectRate_byPhysics: i16, - pub overwriteDexterityCorrectRate_byPhysics: i16, - pub overwriteMagicCorrectRate_byPhysics: i16, - pub overwriteFaithCorrectRate_byPhysics: i16, - pub overwriteLuckCorrectRate_byPhysics: i16, - pub overwriteStrengthCorrectRate_byMagic: i16, - pub overwriteDexterityCorrectRate_byMagic: i16, - pub overwriteMagicCorrectRate_byMagic: i16, - pub overwriteFaithCorrectRate_byMagic: i16, - pub overwriteLuckCorrectRate_byMagic: i16, - pub overwriteStrengthCorrectRate_byFire: i16, - pub overwriteDexterityCorrectRate_byFire: i16, - pub overwriteMagicCorrectRate_byFire: i16, - pub overwriteFaithCorrectRate_byFire: i16, - pub overwriteLuckCorrectRate_byFire: i16, - pub overwriteStrengthCorrectRate_byThunder: i16, - pub overwriteDexterityCorrectRate_byThunder: i16, - pub overwriteMagicCorrectRate_byThunder: i16, - pub overwriteFaithCorrectRate_byThunder: i16, - pub overwriteLuckCorrectRate_byThunder: i16, - pub overwriteStrengthCorrectRate_byDark: i16, - pub overwriteDexterityCorrectRate_byDark: i16, - pub overwriteMagicCorrectRate_byDark: i16, - pub overwriteFaithCorrectRate_byDark: i16, - pub overwriteLuckCorrectRate_byDark: i16, - pub InfluenceStrengthCorrectRate_byPhysics: i16, - pub InfluenceDexterityCorrectRate_byPhysics: i16, - pub InfluenceMagicCorrectRate_byPhysics: i16, - pub InfluenceFaithCorrectRate_byPhysics: i16, - pub InfluenceLuckCorrectRate_byPhysics: i16, - pub InfluenceStrengthCorrectRate_byMagic: i16, - pub InfluenceDexterityCorrectRate_byMagic: i16, - pub InfluenceMagicCorrectRate_byMagic: i16, - pub InfluenceFaithCorrectRate_byMagic: i16, - pub InfluenceLuckCorrectRate_byMagic: i16, - pub InfluenceStrengthCorrectRate_byFire: i16, - pub InfluenceDexterityCorrectRate_byFire: i16, - pub InfluenceMagicCorrectRate_byFire: i16, - pub InfluenceFaithCorrectRate_byFire: i16, - pub InfluenceLuckCorrectRate_byFire: i16, - pub InfluenceStrengthCorrectRate_byThunder: i16, - pub InfluenceDexterityCorrectRate_byThunder: i16, - pub InfluenceMagicCorrectRate_byThunder: i16, - pub InfluenceFaithCorrectRate_byThunder: i16, - pub InfluenceLuckCorrectRate_byThunder: i16, - pub InfluenceStrengthCorrectRate_byDark: i16, - pub InfluenceDexterityCorrectRate_byDark: i16, - pub InfluenceMagicCorrectRate_byDark: i16, - pub InfluenceFaithCorrectRate_byDark: i16, - pub InfluenceLuckCorrectRate_byDark: i16, - pub pad2: [u8;24], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl ATTACK_ELEMENT_CORRECT_PARAM_ST { - pub fn isStrengthCorrect_byPhysics(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn isDexterityCorrect_byPhysics(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } - pub fn isMagicCorrect_byPhysics(&self) -> bool { - self.bits_0 & (1 << 2) != 0 - } - pub fn isFaithCorrect_byPhysics(&self) -> bool { - self.bits_0 & (1 << 3) != 0 - } - pub fn isLuckCorrect_byPhysics(&self) -> bool { - self.bits_0 & (1 << 4) != 0 - } - pub fn isStrengthCorrect_byMagic(&self) -> bool { - self.bits_0 & (1 << 5) != 0 - } - pub fn isDexterityCorrect_byMagic(&self) -> bool { - self.bits_0 & (1 << 6) != 0 - } - pub fn isMagicCorrect_byMagic(&self) -> bool { - self.bits_0 & (1 << 7) != 0 - } - pub fn isFaithCorrect_byMagic(&self) -> bool { - self.bits_1 & (1 << 0) != 0 - } - pub fn isLuckCorrect_byMagic(&self) -> bool { - self.bits_1 & (1 << 1) != 0 - } - pub fn isStrengthCorrect_byFire(&self) -> bool { - self.bits_1 & (1 << 2) != 0 - } - pub fn isDexterityCorrect_byFire(&self) -> bool { - self.bits_1 & (1 << 3) != 0 - } - pub fn isMagicCorrect_byFire(&self) -> bool { - self.bits_1 & (1 << 4) != 0 - } - pub fn isFaithCorrect_byFire(&self) -> bool { - self.bits_1 & (1 << 5) != 0 - } - pub fn isLuckCorrect_byFire(&self) -> bool { - self.bits_1 & (1 << 6) != 0 - } - pub fn isStrengthCorrect_byThunder(&self) -> bool { - self.bits_1 & (1 << 7) != 0 - } - pub fn isDexterityCorrect_byThunder(&self) -> bool { - self.bits_2 & (1 << 0) != 0 - } - pub fn isMagicCorrect_byThunder(&self) -> bool { - self.bits_2 & (1 << 1) != 0 - } - pub fn isFaithCorrect_byThunder(&self) -> bool { - self.bits_2 & (1 << 2) != 0 - } - pub fn isLuckCorrect_byThunder(&self) -> bool { - self.bits_2 & (1 << 3) != 0 - } - pub fn isStrengthCorrect_byDark(&self) -> bool { - self.bits_2 & (1 << 4) != 0 - } - pub fn isDexterityCorrect_byDark(&self) -> bool { - self.bits_2 & (1 << 5) != 0 - } - pub fn isMagicCorrect_byDark(&self) -> bool { - self.bits_2 & (1 << 6) != 0 - } - pub fn isFaithCorrect_byDark(&self) -> bool { - self.bits_2 & (1 << 7) != 0 - } - pub fn isLuckCorrect_byDark(&self) -> bool { - self.bits_3 & (1 << 0) != 0 - } - pub fn pad1(&self) -> bool { - self.bits_3 & (1 << 1) != 0 - } -} -impl Default for ATTACK_ELEMENT_CORRECT_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 0, - bits_1: 0, - bits_2: 0, - bits_3: 0, - overwriteStrengthCorrectRate_byPhysics: -1, - overwriteDexterityCorrectRate_byPhysics: -1, - overwriteMagicCorrectRate_byPhysics: -1, - overwriteFaithCorrectRate_byPhysics: -1, - overwriteLuckCorrectRate_byPhysics: -1, - overwriteStrengthCorrectRate_byMagic: -1, - overwriteDexterityCorrectRate_byMagic: -1, - overwriteMagicCorrectRate_byMagic: -1, - overwriteFaithCorrectRate_byMagic: -1, - overwriteLuckCorrectRate_byMagic: -1, - overwriteStrengthCorrectRate_byFire: -1, - overwriteDexterityCorrectRate_byFire: -1, - overwriteMagicCorrectRate_byFire: -1, - overwriteFaithCorrectRate_byFire: -1, - overwriteLuckCorrectRate_byFire: -1, - overwriteStrengthCorrectRate_byThunder: -1, - overwriteDexterityCorrectRate_byThunder: -1, - overwriteMagicCorrectRate_byThunder: -1, - overwriteFaithCorrectRate_byThunder: -1, - overwriteLuckCorrectRate_byThunder: -1, - overwriteStrengthCorrectRate_byDark: -1, - overwriteDexterityCorrectRate_byDark: -1, - overwriteMagicCorrectRate_byDark: -1, - overwriteFaithCorrectRate_byDark: -1, - overwriteLuckCorrectRate_byDark: -1, - InfluenceStrengthCorrectRate_byPhysics: 100, - InfluenceDexterityCorrectRate_byPhysics: 100, - InfluenceMagicCorrectRate_byPhysics: 100, - InfluenceFaithCorrectRate_byPhysics: 100, - InfluenceLuckCorrectRate_byPhysics: 100, - InfluenceStrengthCorrectRate_byMagic: 100, - InfluenceDexterityCorrectRate_byMagic: 100, - InfluenceMagicCorrectRate_byMagic: 100, - InfluenceFaithCorrectRate_byMagic: 100, - InfluenceLuckCorrectRate_byMagic: 100, - InfluenceStrengthCorrectRate_byFire: 100, - InfluenceDexterityCorrectRate_byFire: 100, - InfluenceMagicCorrectRate_byFire: 100, - InfluenceFaithCorrectRate_byFire: 100, - InfluenceLuckCorrectRate_byFire: 100, - InfluenceStrengthCorrectRate_byThunder: 100, - InfluenceDexterityCorrectRate_byThunder: 100, - InfluenceMagicCorrectRate_byThunder: 100, - InfluenceFaithCorrectRate_byThunder: 100, - InfluenceLuckCorrectRate_byThunder: 100, - InfluenceStrengthCorrectRate_byDark: 100, - InfluenceDexterityCorrectRate_byDark: 100, - InfluenceMagicCorrectRate_byDark: 100, - InfluenceFaithCorrectRate_byDark: 100, - InfluenceLuckCorrectRate_byDark: 100, - pad2: [0;24], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct AUTO_CREATE_ENV_SOUND_PARAM_ST { - pub RangeMin: f32, - pub RangeMax: f32, - pub LifeTimeMin: f32, - pub LifeTimeMax: f32, - pub DeleteDist: f32, - pub NearDist: f32, - pub LimiteRotateMin: f32, - pub LimiteRotateMax: f32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl AUTO_CREATE_ENV_SOUND_PARAM_ST { -} -impl Default for AUTO_CREATE_ENV_SOUND_PARAM_ST { - fn default() -> Self { - Self { - RangeMin: 10., - RangeMax: 25., - LifeTimeMin: 30., - LifeTimeMax: 30., - DeleteDist: 30., - NearDist: 15., - LimiteRotateMin: 0., - LimiteRotateMax: 180., - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct BASECHR_SELECT_MENU_PARAM_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub chrInitParam: i32, - pub originChrInitParam: i32, - pub imageId: i32, - pub textId: i32, - pub reserve: [u8;12], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl BASECHR_SELECT_MENU_PARAM_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } -} -impl Default for BASECHR_SELECT_MENU_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - chrInitParam: 0, - originChrInitParam: 0, - imageId: 0, - textId: 0, - reserve: [0;12], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct BEHAVIOR_PARAM_ST { - pub variationId: i32, - pub behaviorJudgeId: i32, - pub ezStateBehaviorType_old: u8, - pub refType: u8, - pub pad2: [u8;2], - pub refId: i32, - pub consumeSA: f32, - pub stamina: i32, - pub consumeDurability: i32, - pub category: u8, - pub heroPoint: u8, - pub pad1: [u8;2], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl BEHAVIOR_PARAM_ST { -} -impl Default for BEHAVIOR_PARAM_ST { - fn default() -> Self { - Self { - variationId: 0, - behaviorJudgeId: 0, - ezStateBehaviorType_old: 0, - refType: 0, - pad2: [0;2], - refId: -1, - consumeSA: 0., - stamina: 0, - consumeDurability: 0, - category: 0, - heroPoint: 0, - pad1: [0;2], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct BONFIRE_WARP_PARAM_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub eventflagId: i32, - pub bonfireEntityId: i32, - pub pad4: [u8;2], - pub bonfireSubCategorySortId: i16, - pub forbiddenIconId: i16, - pub dispMinZoomStep: u8, - pub selectMinZoomStep: u8, - pub bonfireSubCategoryId: i32, - pub clearedEventFlagId: i32, - pub iconId: i16, - bits_1: u8, - pub pad2: [u8;1], - pub areaNo: u8, - pub gridXNo: u8, - pub gridZNo: u8, - pub pad3: [u8;1], - pub posX: f32, - pub posY: f32, - pub posZ: f32, - pub textId1: i32, - pub textEnableFlagId1: i32, - pub textDisableFlagId1: i32, - pub textId2: i32, - pub textEnableFlagId2: i32, - pub textDisableFlagId2: i32, - pub textId3: i32, - pub textEnableFlagId3: i32, - pub textDisableFlagId3: i32, - pub textId4: i32, - pub textEnableFlagId4: i32, - pub textDisableFlagId4: i32, - pub textId5: i32, - pub textEnableFlagId5: i32, - pub textDisableFlagId5: i32, - pub textId6: i32, - pub textEnableFlagId6: i32, - pub textDisableFlagId6: i32, - pub textId7: i32, - pub textEnableFlagId7: i32, - pub textDisableFlagId7: i32, - pub textId8: i32, - pub textEnableFlagId8: i32, - pub textDisableFlagId8: i32, - pub textType1: u8, - pub textType2: u8, - pub textType3: u8, - pub textType4: u8, - pub textType5: u8, - pub textType6: u8, - pub textType7: u8, - pub textType8: u8, - pub noIgnitionSfxDmypolyId_0: i32, - pub noIgnitionSfxId_0: i32, - pub noIgnitionSfxDmypolyId_1: i32, - pub noIgnitionSfxId_1: i32, - pub unkA8: i32, - pub unkAC: i32, - pub unkB0: i32, - pub unkB4: i32, - pub unkB8: i32, - pub unkBC: i32, - pub unkC0: i32, - pub unkC4: i32, - pub unkC8: i32, - pub unkCC: i32, - pub unkD0: i32, - pub unkD4: i32, - pub unkD8: i32, - pub unkDC: i32, - pub unkE0: i32, - pub unkE4: i32, - pub unkE8: i32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl BONFIRE_WARP_PARAM_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } - pub fn dispMask00(&self) -> bool { - self.bits_1 & (1 << 0) != 0 - } - pub fn dispMask01(&self) -> bool { - self.bits_1 & (1 << 1) != 0 - } - pub fn pad1(&self) -> bool { - self.bits_1 & (1 << 2) != 0 - } -} -impl Default for BONFIRE_WARP_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - eventflagId: 0, - bonfireEntityId: 0, - pad4: [0;2], - bonfireSubCategorySortId: 0, - forbiddenIconId: 0, - dispMinZoomStep: 0, - selectMinZoomStep: 0, - bonfireSubCategoryId: -1, - clearedEventFlagId: 0, - iconId: 0, - bits_1: 0, - pad2: [0;1], - areaNo: 0, - gridXNo: 0, - gridZNo: 0, - pad3: [0;1], - posX: 0., - posY: 0., - posZ: 0., - textId1: -1, - textEnableFlagId1: 0, - textDisableFlagId1: 0, - textId2: -1, - textEnableFlagId2: 0, - textDisableFlagId2: 0, - textId3: -1, - textEnableFlagId3: 0, - textDisableFlagId3: 0, - textId4: -1, - textEnableFlagId4: 0, - textDisableFlagId4: 0, - textId5: -1, - textEnableFlagId5: 0, - textDisableFlagId5: 0, - textId6: -1, - textEnableFlagId6: 0, - textDisableFlagId6: 0, - textId7: -1, - textEnableFlagId7: 0, - textDisableFlagId7: 0, - textId8: -1, - textEnableFlagId8: 0, - textDisableFlagId8: 0, - textType1: 0, - textType2: 0, - textType3: 0, - textType4: 0, - textType5: 0, - textType6: 0, - textType7: 0, - textType8: 0, - noIgnitionSfxDmypolyId_0: -1, - noIgnitionSfxId_0: -1, - noIgnitionSfxDmypolyId_1: -1, - noIgnitionSfxId_1: -1, - unkA8: 0, - unkAC: 0, - unkB0: 0, - unkB4: 0, - unkB8: 0, - unkBC: 0, - unkC0: 0, - unkC4: 0, - unkC8: 0, - unkCC: 0, - unkD0: 0, - unkD4: 0, - unkD8: 0, - unkDC: 0, - unkE0: 0, - unkE4: 0, - unkE8: 0, - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct BONFIRE_WARP_SUB_CATEGORY_PARAM_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub textId: i32, - pub tabId: i16, - pub sortId: i16, - pub pad: [u8;4], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl BONFIRE_WARP_SUB_CATEGORY_PARAM_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } -} -impl Default for BONFIRE_WARP_SUB_CATEGORY_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - textId: 0, - tabId: 0, - sortId: 0, - pad: [0;4], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct BONFIRE_WARP_TAB_PARAM_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub textId: i32, - pub sortId: i32, - pub iconId: i16, - pub pad: [u8;2], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl BONFIRE_WARP_TAB_PARAM_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } -} -impl Default for BONFIRE_WARP_TAB_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - textId: 0, - sortId: 0, - iconId: 0, - pad: [0;2], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct BUDDY_PARAM_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub triggerSpEffectId: i32, - pub npcParamId: i32, - pub npcThinkParamId: i32, - pub npcParamId_ridden: i32, - pub npcThinkParamId_ridden: i32, - pub x_offset: f32, - pub z_offset: f32, - pub y_angle: f32, - pub appearOnAroundSekihi: u8, - pub disablePCTargetShare: u8, - pub pcFollowType: u8, - pub Reserve: [u8;1], - pub dopingSpEffect_lv0: i32, - pub dopingSpEffect_lv1: i32, - pub dopingSpEffect_lv2: i32, - pub dopingSpEffect_lv3: i32, - pub dopingSpEffect_lv4: i32, - pub dopingSpEffect_lv5: i32, - pub dopingSpEffect_lv6: i32, - pub dopingSpEffect_lv7: i32, - pub dopingSpEffect_lv8: i32, - pub dopingSpEffect_lv9: i32, - pub dopingSpEffect_lv10: i32, - pub npcPlayerInitParamId: i32, - pub generateAnimId: i32, - pub Reserve2: [u8;4], - pub Unk1: i32, - pub Unk2: i32, - pub Unk3: i32, - pub Unk4: i32, - pub Unk5: i32, - pub Unk6: i32, - pub Unk7: i32, - pub Unk8: i32, - pub Unk9: i32, - pub Unk10: i32, - pub Unk11: i32, - pub Unk12: i32, - pub Unk13: i32, - pub Unk14: i32, - pub Unk15: i32, - pub Unk16: i32, - pub Unk17: i32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl BUDDY_PARAM_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } -} -impl Default for BUDDY_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - triggerSpEffectId: -1, - npcParamId: -1, - npcThinkParamId: -1, - npcParamId_ridden: -1, - npcThinkParamId_ridden: -1, - x_offset: 0., - z_offset: 0., - y_angle: 0., - appearOnAroundSekihi: 0, - disablePCTargetShare: 0, - pcFollowType: 0, - Reserve: [0;1], - dopingSpEffect_lv0: -1, - dopingSpEffect_lv1: -1, - dopingSpEffect_lv2: -1, - dopingSpEffect_lv3: -1, - dopingSpEffect_lv4: -1, - dopingSpEffect_lv5: -1, - dopingSpEffect_lv6: -1, - dopingSpEffect_lv7: -1, - dopingSpEffect_lv8: -1, - dopingSpEffect_lv9: -1, - dopingSpEffect_lv10: -1, - npcPlayerInitParamId: -1, - generateAnimId: -1, - Reserve2: [0;4], - Unk1: 0, - Unk2: 0, - Unk3: 0, - Unk4: 0, - Unk5: 0, - Unk6: 0, - Unk7: 0, - Unk8: 0, - Unk9: 0, - Unk10: 0, - Unk11: 0, - Unk12: 0, - Unk13: 0, - Unk14: 0, - Unk15: 0, - Unk16: 0, - Unk17: 0, - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct BUDDY_STONE_PARAM_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub talkChrEntityId: i32, - pub eliminateTargetEntityId: i32, - pub summonedEventFlagId: i32, - bits_1: u8, - pub pad2: [u8;3], - pub buddyId: i32, - pub dopingSpEffectId: i32, - pub activateRange: i16, - pub overwriteReturnRange: i16, - pub overwriteActivateRegionEntityId: i32, - pub warnRegionEntityId: i32, - pub pad3: [u8;24], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl BUDDY_STONE_PARAM_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } - pub fn isSpecial(&self) -> bool { - self.bits_1 & (1 << 0) != 0 - } - pub fn pad1(&self) -> bool { - self.bits_1 & (1 << 1) != 0 - } -} -impl Default for BUDDY_STONE_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - talkChrEntityId: 0, - eliminateTargetEntityId: 0, - summonedEventFlagId: 0, - bits_1: 0, - pad2: [0;3], - buddyId: 0, - dopingSpEffectId: -1, - activateRange: 100, - overwriteReturnRange: -1, - overwriteActivateRegionEntityId: 0, - warnRegionEntityId: 0, - pad3: [0;24], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct BUDGET_PARAM_ST { - pub vram_all: f32, - pub vram_mapobj_tex: f32, - pub vram_mapobj_mdl: f32, - pub vram_map: f32, - pub vram_chr: f32, - pub vram_parts: f32, - pub vram_sfx: f32, - pub vram_chr_tex: f32, - pub vram_chr_mdl: f32, - pub vram_parts_tex: f32, - pub vram_parts_mdl: f32, - pub vram_sfx_tex: f32, - pub vram_sfx_mdl: f32, - pub vram_gi: f32, - pub vram_menu_tex: f32, - pub vram_decal_rt: f32, - pub vram_decal: f32, - pub reserve_0: [u8;4], - pub vram_other_tex: f32, - pub vram_other_mdl: f32, - pub havok_anim: f32, - pub havok_ins: f32, - pub havok_hit: f32, - pub vram_other: f32, - pub vram_detail_all: f32, - pub vram_chr_and_parts: f32, - pub havok_navimesh: f32, - pub reserve_1: [u8;24], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl BUDGET_PARAM_ST { -} -impl Default for BUDGET_PARAM_ST { - fn default() -> Self { - Self { - vram_all: 1., - vram_mapobj_tex: 1., - vram_mapobj_mdl: 1., - vram_map: 1., - vram_chr: 1., - vram_parts: 1., - vram_sfx: 1., - vram_chr_tex: 1., - vram_chr_mdl: 1., - vram_parts_tex: 1., - vram_parts_mdl: 1., - vram_sfx_tex: 1., - vram_sfx_mdl: 1., - vram_gi: 1., - vram_menu_tex: 1., - vram_decal_rt: 1., - vram_decal: 1., - reserve_0: [0;4], - vram_other_tex: 1., - vram_other_mdl: 1., - havok_anim: 1., - havok_ins: 1., - havok_hit: 1., - vram_other: 1., - vram_detail_all: 1., - vram_chr_and_parts: 1., - havok_navimesh: 1., - reserve_1: [0;24], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct BULLET_CREATE_LIMIT_PARAM_ST { - pub limitNum_byGroup: u8, - bits_0: u8, - pub pad: [u8;30], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl BULLET_CREATE_LIMIT_PARAM_ST { - pub fn isLimitEachOwner(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn pad2(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } -} -impl Default for BULLET_CREATE_LIMIT_PARAM_ST { - fn default() -> Self { - Self { - limitNum_byGroup: 0, - bits_0: 0, - pad: [0;30], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct BULLET_PARAM_ST { - pub atkId_Bullet: i32, - pub sfxId_Bullet: i32, - pub sfxId_Hit: i32, - pub sfxId_Flick: i32, - pub life: f32, - pub dist: f32, - pub shootInterval: f32, - pub gravityInRange: f32, - pub gravityOutRange: f32, - pub hormingStopRange: f32, - pub initVellocity: f32, - pub accelInRange: f32, - pub accelOutRange: f32, - pub maxVellocity: f32, - pub minVellocity: f32, - pub accelTime: f32, - pub homingBeginDist: f32, - pub hitRadius: f32, - pub hitRadiusMax: f32, - pub spreadTime: f32, - pub expDelay: f32, - pub hormingOffsetRange: f32, - pub dmgHitRecordLifeTime: f32, - pub externalForce: f32, - pub spEffectIDForShooter: i32, - pub autoSearchNPCThinkID: i32, - pub HitBulletID: i32, - pub spEffectId0: i32, - pub spEffectId1: i32, - pub spEffectId2: i32, - pub spEffectId3: i32, - pub spEffectId4: i32, - pub numShoot: i16, - pub homingAngle: i16, - pub shootAngle: i16, - pub shootAngleInterval: i16, - pub shootAngleXInterval: i16, - pub damageDamp: i8, - pub spelDamageDamp: i8, - pub fireDamageDamp: i8, - pub thunderDamageDamp: i8, - pub staminaDamp: i8, - pub knockbackDamp: i8, - pub shootAngleXZ: i8, - pub lockShootLimitAng: u8, - pub pad2: [u8;1], - pub prevVelocityDirRate: u8, - pub atkAttribute: u8, - pub spAttribute: u8, - pub Material_AttackType: u8, - pub Material_AttackMaterial: u8, - bits_0: u8, - pub launchConditionType: u8, - bits_1: u8, - bits_2: u8, - bits_3: u8, - pub darkDamageDamp: i8, - pub bulletSfxDeleteType_byHit: i8, - pub bulletSfxDeleteType_byLifeDead: i8, - pub targetYOffsetRange: f32, - pub shootAngleYMaxRandom: f32, - pub shootAngleXMaxRandom: f32, - pub intervalCreateBulletId: i32, - pub intervalCreateTimeMin: f32, - pub intervalCreateTimeMax: f32, - pub predictionShootObserveTime: f32, - pub intervalCreateWaitTime: f32, - pub sfxPostureType: u8, - pub createLimitGroupId: u8, - pub pad5: [u8;1], - bits_4: u8, - pub randomCreateRadius: f32, - pub followOffset_BaseHeight: f32, - pub assetNo_Hit: i32, - pub lifeRandomRange: f32, - pub homingAngleX: i16, - pub ballisticCalcType: u8, - pub attachEffectType: u8, - pub seId_Bullet1: i32, - pub seId_Bullet2: i32, - pub seId_Hit: i32, - pub seId_Flick: i32, - pub howitzerShootAngleXMin: i16, - pub howitzerShootAngleXMax: i16, - pub howitzerInitMinVelocity: f32, - pub howitzerInitMaxVelocity: f32, - pub sfxId_ForceErase: i32, - pub bulletSfxDeleteType_byForceErase: i8, - pub pad3: [u8;1], - pub followDmypoly_forSfxPose: i16, - pub followOffset_Radius: f32, - pub spBulletDistUpRate: f32, - pub nolockTargetDist: f32, - pub pad4: [u8;8], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl BULLET_PARAM_ST { - pub fn isPenetrateChr(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn isPenetrateObj(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } - pub fn pad(&self) -> bool { - self.bits_0 & (1 << 2) != 0 - } - pub fn FollowType(&self) -> bool { - self.bits_1 & (1 << 0) != 0 - } - pub fn EmittePosType(&self) -> bool { - self.bits_1 & (1 << 3) != 0 - } - pub fn isAttackSFX(&self) -> bool { - self.bits_1 & (1 << 6) != 0 - } - pub fn isEndlessHit(&self) -> bool { - self.bits_1 & (1 << 7) != 0 - } - pub fn isPenetrateMap(&self) -> bool { - self.bits_2 & (1 << 0) != 0 - } - pub fn isHitBothTeam(&self) -> bool { - self.bits_2 & (1 << 1) != 0 - } - pub fn isUseSharedHitList(&self) -> bool { - self.bits_2 & (1 << 2) != 0 - } - pub fn isUseMultiDmyPolyIfPlace(&self) -> bool { - self.bits_2 & (1 << 3) != 0 - } - pub fn isHitOtherBulletForceEraseA(&self) -> bool { - self.bits_2 & (1 << 4) != 0 - } - pub fn isHitOtherBulletForceEraseB(&self) -> bool { - self.bits_2 & (1 << 5) != 0 - } - pub fn isHitForceMagic(&self) -> bool { - self.bits_2 & (1 << 6) != 0 - } - pub fn isIgnoreSfxIfHitWater(&self) -> bool { - self.bits_2 & (1 << 7) != 0 - } - pub fn isIgnoreMoveStateIfHitWater(&self) -> bool { - self.bits_3 & (1 << 0) != 0 - } - pub fn isHitDarkForceMagic(&self) -> bool { - self.bits_3 & (1 << 1) != 0 - } - pub fn dmgCalcSide(&self) -> bool { - self.bits_3 & (1 << 2) != 0 - } - pub fn isEnableAutoHoming(&self) -> bool { - self.bits_3 & (1 << 4) != 0 - } - pub fn isSyncBulletCulcDumypolyPos(&self) -> bool { - self.bits_3 & (1 << 5) != 0 - } - pub fn isOwnerOverrideInitAngle(&self) -> bool { - self.bits_3 & (1 << 6) != 0 - } - pub fn isInheritSfxToChild(&self) -> bool { - self.bits_3 & (1 << 7) != 0 - } - pub fn isInheritSpeedToChild(&self) -> bool { - self.bits_4 & (1 << 0) != 0 - } - pub fn isDisableHitSfx_byChrAndObj(&self) -> bool { - self.bits_4 & (1 << 1) != 0 - } - pub fn isCheckWall_byCenterRay(&self) -> bool { - self.bits_4 & (1 << 2) != 0 - } - pub fn isHitFlare(&self) -> bool { - self.bits_4 & (1 << 3) != 0 - } - pub fn isUseBulletWallFilter(&self) -> bool { - self.bits_4 & (1 << 4) != 0 - } - pub fn pad1(&self) -> bool { - self.bits_4 & (1 << 5) != 0 - } - pub fn isNonDependenceMagicForFunnleNum(&self) -> bool { - self.bits_4 & (1 << 6) != 0 - } - pub fn isAiInterruptShootNoDamageBullet(&self) -> bool { - self.bits_4 & (1 << 7) != 0 - } -} -impl Default for BULLET_PARAM_ST { - fn default() -> Self { - Self { - atkId_Bullet: -1, - sfxId_Bullet: -1, - sfxId_Hit: -1, - sfxId_Flick: -1, - life: -1., - dist: 0., - shootInterval: 0., - gravityInRange: 0., - gravityOutRange: 0., - hormingStopRange: 0., - initVellocity: 0., - accelInRange: 0., - accelOutRange: 0., - maxVellocity: 0., - minVellocity: 0., - accelTime: 0., - homingBeginDist: 0., - hitRadius: -1., - hitRadiusMax: -1., - spreadTime: 0., - expDelay: 0., - hormingOffsetRange: 0., - dmgHitRecordLifeTime: 0., - externalForce: 0., - spEffectIDForShooter: -1, - autoSearchNPCThinkID: 0, - HitBulletID: -1, - spEffectId0: -1, - spEffectId1: -1, - spEffectId2: -1, - spEffectId3: -1, - spEffectId4: -1, - numShoot: 0, - homingAngle: 0, - shootAngle: 0, - shootAngleInterval: 0, - shootAngleXInterval: 0, - damageDamp: 0, - spelDamageDamp: 0, - fireDamageDamp: 0, - thunderDamageDamp: 0, - staminaDamp: 0, - knockbackDamp: 0, - shootAngleXZ: 0, - lockShootLimitAng: 0, - pad2: [0;1], - prevVelocityDirRate: 0, - atkAttribute: 254, - spAttribute: 254, - Material_AttackType: 254, - Material_AttackMaterial: 254, - bits_0: 0, - launchConditionType: 0, - bits_1: 0, - bits_2: 0, - bits_3: 0, - darkDamageDamp: 0, - bulletSfxDeleteType_byHit: 0, - bulletSfxDeleteType_byLifeDead: 0, - targetYOffsetRange: 0., - shootAngleYMaxRandom: 0., - shootAngleXMaxRandom: 0., - intervalCreateBulletId: -1, - intervalCreateTimeMin: 0., - intervalCreateTimeMax: 0., - predictionShootObserveTime: 0., - intervalCreateWaitTime: 0., - sfxPostureType: 0, - createLimitGroupId: 0, - pad5: [0;1], - bits_4: 0, - randomCreateRadius: 0., - followOffset_BaseHeight: 0., - assetNo_Hit: -1, - lifeRandomRange: 0., - homingAngleX: -1, - ballisticCalcType: 0, - attachEffectType: 0, - seId_Bullet1: -1, - seId_Bullet2: -1, - seId_Hit: -1, - seId_Flick: -1, - howitzerShootAngleXMin: 0, - howitzerShootAngleXMax: 0, - howitzerInitMinVelocity: 0., - howitzerInitMaxVelocity: 0., - sfxId_ForceErase: -1, - bulletSfxDeleteType_byForceErase: 0, - pad3: [0;1], - followDmypoly_forSfxPose: -1, - followOffset_Radius: 0., - spBulletDistUpRate: 1., - nolockTargetDist: 0., - pad4: [0;8], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct CACL_CORRECT_GRAPH_ST { - pub stageMaxVal0: f32, - pub stageMaxVal1: f32, - pub stageMaxVal2: f32, - pub stageMaxVal3: f32, - pub stageMaxVal4: f32, - pub stageMaxGrowVal0: f32, - pub stageMaxGrowVal1: f32, - pub stageMaxGrowVal2: f32, - pub stageMaxGrowVal3: f32, - pub stageMaxGrowVal4: f32, - pub adjPt_maxGrowVal0: f32, - pub adjPt_maxGrowVal1: f32, - pub adjPt_maxGrowVal2: f32, - pub adjPt_maxGrowVal3: f32, - pub adjPt_maxGrowVal4: f32, - pub init_inclination_soul: f32, - pub adjustment_value: f32, - pub boundry_inclination_soul: f32, - pub boundry_value: f32, - pub pad: [u8;4], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl CACL_CORRECT_GRAPH_ST { -} -impl Default for CACL_CORRECT_GRAPH_ST { - fn default() -> Self { - Self { - stageMaxVal0: 0., - stageMaxVal1: 0., - stageMaxVal2: 0., - stageMaxVal3: 0., - stageMaxVal4: 0., - stageMaxGrowVal0: 0., - stageMaxGrowVal1: 0., - stageMaxGrowVal2: 0., - stageMaxGrowVal3: 0., - stageMaxGrowVal4: 0., - adjPt_maxGrowVal0: 0., - adjPt_maxGrowVal1: 0., - adjPt_maxGrowVal2: 0., - adjPt_maxGrowVal3: 0., - adjPt_maxGrowVal4: 0., - init_inclination_soul: 0., - adjustment_value: 0., - boundry_inclination_soul: 0., - boundry_value: 0., - pad: [0;4], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct CAMERA_FADE_PARAM_ST { - pub NearMinDist: f32, - pub NearMaxDist: f32, - pub FarMinDist: f32, - pub FarMaxDist: f32, - pub MiddleAlpha: f32, - pub dummy: [u8;12], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl CAMERA_FADE_PARAM_ST { -} -impl Default for CAMERA_FADE_PARAM_ST { - fn default() -> Self { - Self { - NearMinDist: 0., - NearMaxDist: 0., - FarMinDist: 0., - FarMaxDist: 0., - MiddleAlpha: 0., - dummy: [0;12], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct CEREMONY_PARAM_ST { - pub eventLayerId: i32, - pub mapStudioLayerId: i32, - pub multiPlayAreaOffset: i32, - pub overrideMapPlaceNameId: i32, - pub overrideSaveMapNameId: i32, - pub pad2: [u8;16], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl CEREMONY_PARAM_ST { -} -impl Default for CEREMONY_PARAM_ST { - fn default() -> Self { - Self { - eventLayerId: 0, - mapStudioLayerId: 0, - multiPlayAreaOffset: 0, - overrideMapPlaceNameId: -1, - overrideSaveMapNameId: -1, - pad2: [0;16], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct CHARACTER_INIT_PARAM { - pub baseRec_mp: f32, - pub baseRec_sp: f32, - pub red_Falldam: f32, - pub soul: i32, - pub equip_Wep_Right: i32, - pub equip_Subwep_Right: i32, - pub equip_Wep_Left: i32, - pub equip_Subwep_Left: i32, - pub equip_Helm: i32, - pub equip_Armer: i32, - pub equip_Gaunt: i32, - pub equip_Leg: i32, - pub equip_Arrow: i32, - pub equip_Bolt: i32, - pub equip_SubArrow: i32, - pub equip_SubBolt: i32, - pub equip_Accessory01: i32, - pub equip_Accessory02: i32, - pub equip_Accessory03: i32, - pub equip_Accessory04: i32, - pub pad8: [u8;4], - pub elixir_material00: i32, - pub elixir_material01: i32, - pub elixir_material02: i32, - pub equip_Spell_01: i32, - pub equip_Spell_02: i32, - pub equip_Spell_03: i32, - pub equip_Spell_04: i32, - pub equip_Spell_05: i32, - pub equip_Spell_06: i32, - pub equip_Spell_07: i32, - pub item_01: i32, - pub item_02: i32, - pub item_03: i32, - pub item_04: i32, - pub item_05: i32, - pub item_06: i32, - pub item_07: i32, - pub item_08: i32, - pub item_09: i32, - pub item_10: i32, - pub npcPlayerFaceGenId: i32, - pub npcPlayerThinkId: i32, - pub baseHp: i16, - pub baseMp: i16, - pub baseSp: i16, - pub arrowNum: i16, - pub boltNum: i16, - pub subArrowNum: i16, - pub subBoltNum: i16, - pub pad4: [u8;6], - pub soulLv: i16, - pub baseVit: u8, - pub baseWil: u8, - pub baseEnd: u8, - pub baseStr: u8, - pub baseDex: u8, - pub baseMag: u8, - pub baseFai: u8, - pub baseLuc: u8, - pub baseHeroPoint: u8, - pub baseDurability: u8, - pub itemNum_01: u8, - pub itemNum_02: u8, - pub itemNum_03: u8, - pub itemNum_04: u8, - pub itemNum_05: u8, - pub itemNum_06: u8, - pub itemNum_07: u8, - pub itemNum_08: u8, - pub itemNum_09: u8, - pub itemNum_10: u8, - pub pad5: [u8;5], - pub gestureId0: i8, - pub gestureId1: i8, - pub gestureId2: i8, - pub gestureId3: i8, - pub gestureId4: i8, - pub gestureId5: i8, - pub gestureId6: i8, - pub npcPlayerType: u8, - pub npcPlayerDrawType: i8, - pub npcPlayerSex: u8, - bits_0: u8, - pub pad6: [u8;2], - pub wepParamType_Right1: u8, - pub wepParamType_Right2: u8, - pub wepParamType_Right3: u8, - pub wepParamType_Left1: u8, - pub wepParamType_Left2: u8, - pub wepParamType_Left3: u8, - pub pad2: [u8;26], - pub equip_Subwep_Right3: i32, - pub equip_Subwep_Left3: i32, - pub pad3: [u8;4], - pub secondaryItem_01: i32, - pub secondaryItem_02: i32, - pub secondaryItem_03: i32, - pub secondaryItem_04: i32, - pub secondaryItem_05: i32, - pub secondaryItem_06: i32, - pub secondaryItemNum_01: u8, - pub secondaryItemNum_02: u8, - pub secondaryItemNum_03: u8, - pub secondaryItemNum_04: u8, - pub secondaryItemNum_05: u8, - pub secondaryItemNum_06: u8, - pub HpEstMax: i8, - pub MpEstMax: i8, - pub pad7: [u8;5], - pub voiceType: u8, - pub reserve: [u8;6], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl CHARACTER_INIT_PARAM { - pub fn vowType(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn isSyncTarget(&self) -> bool { - self.bits_0 & (1 << 4) != 0 - } - pub fn pad(&self) -> bool { - self.bits_0 & (1 << 5) != 0 - } -} -impl Default for CHARACTER_INIT_PARAM { - fn default() -> Self { - Self { - baseRec_mp: 0., - baseRec_sp: 0., - red_Falldam: 0., - soul: 0, - equip_Wep_Right: -1, - equip_Subwep_Right: -1, - equip_Wep_Left: -1, - equip_Subwep_Left: -1, - equip_Helm: -1, - equip_Armer: -1, - equip_Gaunt: -1, - equip_Leg: -1, - equip_Arrow: -1, - equip_Bolt: -1, - equip_SubArrow: -1, - equip_SubBolt: -1, - equip_Accessory01: -1, - equip_Accessory02: -1, - equip_Accessory03: -1, - equip_Accessory04: -1, - pad8: [0;4], - elixir_material00: -1, - elixir_material01: -1, - elixir_material02: -1, - equip_Spell_01: -1, - equip_Spell_02: -1, - equip_Spell_03: -1, - equip_Spell_04: -1, - equip_Spell_05: -1, - equip_Spell_06: -1, - equip_Spell_07: -1, - item_01: -1, - item_02: -1, - item_03: -1, - item_04: -1, - item_05: -1, - item_06: -1, - item_07: -1, - item_08: -1, - item_09: -1, - item_10: -1, - npcPlayerFaceGenId: 0, - npcPlayerThinkId: 0, - baseHp: 0, - baseMp: 0, - baseSp: 0, - arrowNum: 0, - boltNum: 0, - subArrowNum: 0, - subBoltNum: 0, - pad4: [0;6], - soulLv: 0, - baseVit: 0, - baseWil: 0, - baseEnd: 0, - baseStr: 0, - baseDex: 0, - baseMag: 0, - baseFai: 0, - baseLuc: 0, - baseHeroPoint: 0, - baseDurability: 0, - itemNum_01: 0, - itemNum_02: 0, - itemNum_03: 0, - itemNum_04: 0, - itemNum_05: 0, - itemNum_06: 0, - itemNum_07: 0, - itemNum_08: 0, - itemNum_09: 0, - itemNum_10: 0, - pad5: [0;5], - gestureId0: -1, - gestureId1: -1, - gestureId2: -1, - gestureId3: -1, - gestureId4: -1, - gestureId5: -1, - gestureId6: -1, - npcPlayerType: 0, - npcPlayerDrawType: 0, - npcPlayerSex: 0, - bits_0: 0, - pad6: [0;2], - wepParamType_Right1: 0, - wepParamType_Right2: 0, - wepParamType_Right3: 0, - wepParamType_Left1: 0, - wepParamType_Left2: 0, - wepParamType_Left3: 0, - pad2: [0;26], - equip_Subwep_Right3: -1, - equip_Subwep_Left3: -1, - pad3: [0;4], - secondaryItem_01: -1, - secondaryItem_02: -1, - secondaryItem_03: -1, - secondaryItem_04: -1, - secondaryItem_05: -1, - secondaryItem_06: -1, - secondaryItemNum_01: 0, - secondaryItemNum_02: 0, - secondaryItemNum_03: 0, - secondaryItemNum_04: 0, - secondaryItemNum_05: 0, - secondaryItemNum_06: 0, - HpEstMax: -1, - MpEstMax: -1, - pad7: [0;5], - voiceType: 0, - reserve: [0;6], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct CHARMAKEMENU_LISTITEM_PARAM_ST { - pub value: i32, - pub captionId: i32, - pub iconId: u8, - pub reserved: [u8;7], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl CHARMAKEMENU_LISTITEM_PARAM_ST { -} -impl Default for CHARMAKEMENU_LISTITEM_PARAM_ST { - fn default() -> Self { - Self { - value: 0, - captionId: 0, - iconId: 0, - reserved: [0;7], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct CHARMAKEMENUTOP_PARAM_ST { - pub commandType: i32, - pub captionId: i32, - pub faceParamId: i32, - pub tableId: i32, - pub viewCondition: i32, - pub previewMode: i8, - pub reserved2: [u8;3], - pub tableId2: i32, - pub refFaceParamId: i32, - pub refTextId: i32, - pub helpTextId: i32, - pub unlockEventFlagId: i32, - pub reserved: [u8;4], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl CHARMAKEMENUTOP_PARAM_ST { -} -impl Default for CHARMAKEMENUTOP_PARAM_ST { - fn default() -> Self { - Self { - commandType: 0, - captionId: 0, - faceParamId: 0, - tableId: 0, - viewCondition: 0, - previewMode: 0, - reserved2: [0;3], - tableId2: -1, - refFaceParamId: -1, - refTextId: -1, - helpTextId: -1, - unlockEventFlagId: 0, - reserved: [0;4], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct CHR_ACTIVATE_CONDITION_PARAM_ST { - bits_0: u8, - bits_1: u8, - pub timeStartHour: u8, - pub timeStartMin: u8, - pub timeEndHour: u8, - pub timeEndMin: u8, - pub pad2: [u8;2], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl CHR_ACTIVATE_CONDITION_PARAM_ST { - pub fn weatherSunny(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn weatherClearSky(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } - pub fn weatherWeakCloudy(&self) -> bool { - self.bits_0 & (1 << 2) != 0 - } - pub fn weatherCloudy(&self) -> bool { - self.bits_0 & (1 << 3) != 0 - } - pub fn weatherRain(&self) -> bool { - self.bits_0 & (1 << 4) != 0 - } - pub fn weatherHeavyRain(&self) -> bool { - self.bits_0 & (1 << 5) != 0 - } - pub fn weatherStorm(&self) -> bool { - self.bits_0 & (1 << 6) != 0 - } - pub fn weatherStormForBattle(&self) -> bool { - self.bits_0 & (1 << 7) != 0 - } - pub fn weatherSnow(&self) -> bool { - self.bits_1 & (1 << 0) != 0 - } - pub fn weatherHeavySnow(&self) -> bool { - self.bits_1 & (1 << 1) != 0 - } - pub fn weatherFog(&self) -> bool { - self.bits_1 & (1 << 2) != 0 - } - pub fn weatherHeavyFog(&self) -> bool { - self.bits_1 & (1 << 3) != 0 - } - pub fn weatherHeavyFogRain(&self) -> bool { - self.bits_1 & (1 << 4) != 0 - } - pub fn weatherSandStorm(&self) -> bool { - self.bits_1 & (1 << 5) != 0 - } - pub fn pad1(&self) -> bool { - self.bits_1 & (1 << 6) != 0 - } -} -impl Default for CHR_ACTIVATE_CONDITION_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 1, - bits_1: 1, - timeStartHour: 0, - timeStartMin: 0, - timeEndHour: 0, - timeEndMin: 0, - pad2: [0;2], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct CHR_MODEL_PARAM_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub modelMemoryType: u8, - pub texMemoryType: u8, - pub cameraDitherFadeId: i16, - pub reportAnimMemSizeMb: f32, - pub unk: i32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl CHR_MODEL_PARAM_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } -} -impl Default for CHR_MODEL_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - modelMemoryType: 0, - texMemoryType: 0, - cameraDitherFadeId: 0, - reportAnimMemSizeMb: 12., - unk: 0, - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct CLEAR_COUNT_CORRECT_PARAM_ST { - pub MaxHpRate: f32, - pub MaxMpRate: f32, - pub MaxStaminaRate: f32, - pub PhysicsAttackRate: f32, - pub SlashAttackRate: f32, - pub BlowAttackRate: f32, - pub ThrustAttackRate: f32, - pub NeturalAttackRate: f32, - pub MagicAttackRate: f32, - pub FireAttackRate: f32, - pub ThunderAttackRate: f32, - pub DarkAttackRate: f32, - pub PhysicsDefenseRate: f32, - pub MagicDefenseRate: f32, - pub FireDefenseRate: f32, - pub ThunderDefenseRate: f32, - pub DarkDefenseRate: f32, - pub StaminaAttackRate: f32, - pub SoulRate: f32, - pub PoisionResistRate: f32, - pub DiseaseResistRate: f32, - pub BloodResistRate: f32, - pub CurseResistRate: f32, - pub FreezeResistRate: f32, - pub BloodDamageRate: f32, - pub SuperArmorDamageRate: f32, - pub FreezeDamageRate: f32, - pub SleepResistRate: f32, - pub MadnessResistRate: f32, - pub SleepDamageRate: f32, - pub MadnessDamageRate: f32, - pub pad1: [u8;4], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl CLEAR_COUNT_CORRECT_PARAM_ST { -} -impl Default for CLEAR_COUNT_CORRECT_PARAM_ST { - fn default() -> Self { - Self { - MaxHpRate: 1., - MaxMpRate: 1., - MaxStaminaRate: 1., - PhysicsAttackRate: 1., - SlashAttackRate: 1., - BlowAttackRate: 1., - ThrustAttackRate: 1., - NeturalAttackRate: 1., - MagicAttackRate: 1., - FireAttackRate: 1., - ThunderAttackRate: 1., - DarkAttackRate: 1., - PhysicsDefenseRate: 1., - MagicDefenseRate: 1., - FireDefenseRate: 1., - ThunderDefenseRate: 1., - DarkDefenseRate: 1., - StaminaAttackRate: 1., - SoulRate: 1., - PoisionResistRate: 1., - DiseaseResistRate: 1., - BloodResistRate: 1., - CurseResistRate: 1., - FreezeResistRate: 1., - BloodDamageRate: 1., - SuperArmorDamageRate: 1., - FreezeDamageRate: 1., - SleepResistRate: 1., - MadnessResistRate: 1., - SleepDamageRate: 1., - MadnessDamageRate: 1., - pad1: [0;4], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct COMMON_SYSTEM_PARAM_ST { - pub mapSaveMapNameIdOnGameStart: i32, - pub reserve0: [u8;60], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl COMMON_SYSTEM_PARAM_ST { -} -impl Default for COMMON_SYSTEM_PARAM_ST { - fn default() -> Self { - Self { - mapSaveMapNameIdOnGameStart: 0, - reserve0: [0;60], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct COOL_TIME_PARAM_ST { - pub limitationTime_0: f32, - pub observeTime_0: f32, - pub limitationTime_1: f32, - pub observeTime_1: f32, - pub limitationTime_2: f32, - pub observeTime_2: f32, - pub limitationTime_3: f32, - pub observeTime_3: f32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl COOL_TIME_PARAM_ST { -} -impl Default for COOL_TIME_PARAM_ST { - fn default() -> Self { - Self { - limitationTime_0: 0., - observeTime_0: 0., - limitationTime_1: 0., - observeTime_1: 0., - limitationTime_2: 0., - observeTime_2: 0., - limitationTime_3: 0., - observeTime_3: 0., - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct CUTSCENE_GPARAM_TIME_PARAM_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub DstTimezone_Morning: u8, - pub DstTimezone_Noon: u8, - pub DstTimezone_AfterNoon: u8, - pub DstTimezone_Evening: u8, - pub DstTimezone_Night: u8, - pub DstTimezone_DeepNightA: u8, - pub DstTimezone_DeepNightB: u8, - pub reserved: [u8;1], - pub PostPlayIngameTime: f32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl CUTSCENE_GPARAM_TIME_PARAM_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParam_Debug(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 2) != 0 - } -} -impl Default for CUTSCENE_GPARAM_TIME_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - DstTimezone_Morning: 0, - DstTimezone_Noon: 0, - DstTimezone_AfterNoon: 0, - DstTimezone_Evening: 0, - DstTimezone_Night: 0, - DstTimezone_DeepNightA: 0, - DstTimezone_DeepNightB: 0, - reserved: [0;1], - PostPlayIngameTime: -1., - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct CUTSCENE_GPARAM_WEATHER_PARAM_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub DstWeather_Sunny: i16, - pub DstWeather_ClearSky: i16, - pub DstWeather_WeakCloudy: i16, - pub DstWeather_Cloud: i16, - pub DstWeather_Rain: i16, - pub DstWeather_HeavyRain: i16, - pub DstWeather_Storm: i16, - pub DstWeather_StormForBattle: i16, - pub DstWeather_Snow: i16, - pub DstWeather_HeavySnow: i16, - pub DstWeather_Fog: i16, - pub DstWeather_HeavyFog: i16, - pub DstWeather_SandStorm: i16, - pub DstWeather_HeavyFogRain: i16, - pub PostPlayIngameWeather: i16, - pub IndoorOutdoorType: u8, - pub TakeOverDstWeather_Sunny: u8, - pub TakeOverDstWeather_ClearSky: u8, - pub TakeOverDstWeather_WeakCloudy: u8, - pub TakeOverDstWeather_Cloud: u8, - pub TakeOverDstWeather_Rain: u8, - pub TakeOverDstWeather_HeavyRain: u8, - pub TakeOverDstWeather_Storm: u8, - pub TakeOverDstWeather_StormForBattle: u8, - pub TakeOverDstWeather_Snow: u8, - pub TakeOverDstWeather_HeavySnow: u8, - pub TakeOverDstWeather_Fog: u8, - pub TakeOverDstWeather_HeavyFog: u8, - pub TakeOverDstWeather_SandStorm: u8, - pub TakeOverDstWeather_HeavyFogRain: u8, - pub reserved: [u8;7], - pub DstWeather_Snowstorm: i16, - pub DstWeather_LightningStorm: i16, - pub DstWeather_Reserved3: i16, - pub DstWeather_Reserved4: i16, - pub DstWeather_Reserved5: i16, - pub DstWeather_Reserved6: i16, - pub DstWeather_Reserved7: i16, - pub DstWeather_Reserved8: i16, - pub TakeOverDstWeather_Snowstorm: u8, - pub TakeOverDstWeather_LightningStorm: u8, - pub TakeOverDstWeather_Reserved3: u8, - pub TakeOverDstWeather_Reserved4: u8, - pub TakeOverDstWeather_Reserved5: u8, - pub TakeOverDstWeather_Reserved6: u8, - pub TakeOverDstWeather_Reserved7: u8, - pub TakeOverDstWeather_Reserved8: u8, - pub IsEnableApplyMapGdRegionIdForGparam: u8, - pub reserved2: [u8;1], - pub OverrideMapGdRegionId: i16, - pub reserved1: [u8;12], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl CUTSCENE_GPARAM_WEATHER_PARAM_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParam_Debug(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 2) != 0 - } -} -impl Default for CUTSCENE_GPARAM_WEATHER_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - DstWeather_Sunny: 0, - DstWeather_ClearSky: 0, - DstWeather_WeakCloudy: 0, - DstWeather_Cloud: 0, - DstWeather_Rain: 0, - DstWeather_HeavyRain: 0, - DstWeather_Storm: 0, - DstWeather_StormForBattle: 0, - DstWeather_Snow: 0, - DstWeather_HeavySnow: 0, - DstWeather_Fog: 0, - DstWeather_HeavyFog: 0, - DstWeather_SandStorm: 0, - DstWeather_HeavyFogRain: 0, - PostPlayIngameWeather: -1, - IndoorOutdoorType: 0, - TakeOverDstWeather_Sunny: 1, - TakeOverDstWeather_ClearSky: 1, - TakeOverDstWeather_WeakCloudy: 1, - TakeOverDstWeather_Cloud: 1, - TakeOverDstWeather_Rain: 1, - TakeOverDstWeather_HeavyRain: 1, - TakeOverDstWeather_Storm: 1, - TakeOverDstWeather_StormForBattle: 1, - TakeOverDstWeather_Snow: 1, - TakeOverDstWeather_HeavySnow: 1, - TakeOverDstWeather_Fog: 1, - TakeOverDstWeather_HeavyFog: 1, - TakeOverDstWeather_SandStorm: 1, - TakeOverDstWeather_HeavyFogRain: 1, - reserved: [0;7], - DstWeather_Snowstorm: 0, - DstWeather_LightningStorm: 0, - DstWeather_Reserved3: 0, - DstWeather_Reserved4: 0, - DstWeather_Reserved5: 0, - DstWeather_Reserved6: 0, - DstWeather_Reserved7: 0, - DstWeather_Reserved8: 0, - TakeOverDstWeather_Snowstorm: 1, - TakeOverDstWeather_LightningStorm: 1, - TakeOverDstWeather_Reserved3: 1, - TakeOverDstWeather_Reserved4: 1, - TakeOverDstWeather_Reserved5: 1, - TakeOverDstWeather_Reserved6: 1, - TakeOverDstWeather_Reserved7: 1, - TakeOverDstWeather_Reserved8: 1, - IsEnableApplyMapGdRegionIdForGparam: 0, - reserved2: [0;1], - OverrideMapGdRegionId: -1, - reserved1: [0;12], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct CUTSCENE_MAP_ID_PARAM_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub PlayMapId: i32, - pub RequireMapId0: i32, - pub RequireMapId1: i32, - pub RequireMapId2: i32, - pub RefCamPosHitPartsID: i32, - pub reserved_2: [u8;12], - pub ClientDisableViewTimeForProgress: i16, - pub reserved: [u8;2], - pub HitParts_0: i32, - pub HitParts_1: i32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl CUTSCENE_MAP_ID_PARAM_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParam_Debug(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 2) != 0 - } -} -impl Default for CUTSCENE_MAP_ID_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - PlayMapId: 0, - RequireMapId0: 0, - RequireMapId1: 0, - RequireMapId2: 0, - RefCamPosHitPartsID: -1, - reserved_2: [0;12], - ClientDisableViewTimeForProgress: 0, - reserved: [0;2], - HitParts_0: -1, - HitParts_1: -1, - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct CUTSCENE_TEXTURE_LOAD_PARAM_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub texName_00: [u8;16], - pub texName_01: [u8;16], - pub texName_02: [u8;16], - pub texName_03: [u8;16], - pub texName_04: [u8;16], - pub texName_05: [u8;16], - pub texName_06: [u8;16], - pub texName_07: [u8;16], - pub texName_08: [u8;16], - pub texName_09: [u8;16], - pub texName_10: [u8;16], - pub texName_11: [u8;16], - pub texName_12: [u8;16], - pub texName_13: [u8;16], - pub texName_14: [u8;16], - pub texName_15: [u8;16], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl CUTSCENE_TEXTURE_LOAD_PARAM_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParam_Debug(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 2) != 0 - } -} -impl Default for CUTSCENE_TEXTURE_LOAD_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - texName_00: [0;16], - texName_01: [0;16], - texName_02: [0;16], - texName_03: [0;16], - texName_04: [0;16], - texName_05: [0;16], - texName_06: [0;16], - texName_07: [0;16], - texName_08: [0;16], - texName_09: [0;16], - texName_10: [0;16], - texName_11: [0;16], - texName_12: [0;16], - texName_13: [0;16], - texName_14: [0;16], - texName_15: [0;16], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct CUTSCENE_TIMEZONE_CONVERT_PARAM_ST { - pub SrcTimezoneStart: f32, - pub DstCutscenTime: f32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl CUTSCENE_TIMEZONE_CONVERT_PARAM_ST { -} -impl Default for CUTSCENE_TIMEZONE_CONVERT_PARAM_ST { - fn default() -> Self { - Self { - SrcTimezoneStart: 0., - DstCutscenTime: 0., - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct CUTSCENE_WEATHER_OVERRIDE_GPARAM_ID_CONVERT_PARAM_ST { - pub weatherOverrideGparamId: i32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl CUTSCENE_WEATHER_OVERRIDE_GPARAM_ID_CONVERT_PARAM_ST { -} -impl Default for CUTSCENE_WEATHER_OVERRIDE_GPARAM_ID_CONVERT_PARAM_ST { - fn default() -> Self { - Self { - weatherOverrideGparamId: 0, - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct DECAL_PARAM_ST { - pub textureId: i32, - pub dmypolyId: i32, - pub pitchAngle: f32, - pub yawAngle: f32, - pub nearDistance: f32, - pub farDistance: f32, - pub nearSize: f32, - pub farSize: f32, - pub maskSpeffectId: i32, - bits_0: i32, - pub randomSizeMax: i16, - pub randomRollMin: f32, - pub randomRollMax: f32, - pub randomPitchMin: f32, - pub randomPitchMax: f32, - pub randomYawMin: f32, - pub randomYawMax: f32, - pub pomHightScale: f32, - pub pomSampleMin: u8, - pub pomSampleMax: u8, - pub blendMode: i8, - pub appearDirType: i8, - pub emissiveValueBegin: f32, - pub emissiveValueEnd: f32, - pub emissiveTime: f32, - pub bIntpEnable: u8, - pub pad_01: [u8;3], - pub intpIntervalDist: f32, - pub beginIntpTextureId: i32, - pub endIntpTextureId: i32, - pub appearSfxId: i32, - pub appearSfxOffsetPos: f32, - pub maskTextureId: i32, - pub diffuseTextureId: i32, - pub reflecTextureId: i32, - pub maskScale: f32, - pub normalTextureId: i32, - pub heightTextureId: i32, - pub emissiveTextureId: i32, - pub diffuseColorR: u8, - pub diffuseColorG: u8, - pub diffuseColorB: u8, - pub pad_03: [u8;1], - pub reflecColorR: u8, - pub reflecColorG: u8, - pub reflecColorB: u8, - pub bLifeEnable: u8, - pub siniScale: f32, - pub lifeTimeSec: f32, - pub fadeOutTimeSec: f32, - pub priority: i16, - pub bDistThinOutEnable: u8, - pub bAlignedTexRandomVariationEnable: u8, - pub distThinOutCheckDist: f32, - pub distThinOutCheckAngleDeg: f32, - pub distThinOutMaxNum: u8, - pub distThinOutCheckNum: u8, - pub delayAppearFrame: i16, - bits_1: i32, - pub fadeInTimeSec: f32, - pub thinOutOverlapMultiRadius: f32, - pub thinOutNeighborAddRadius: f32, - pub thinOutOverlapLimitNum: i32, - pub thinOutNeighborLimitNum: i32, - pub thinOutMode: i8, - pub emissiveColorR: u8, - pub emissiveColorG: u8, - pub emissiveColorB: u8, - pub maxDecalSfxCreatableSlopeAngleDeg: f32, - pub pad_02: [u8;40], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl DECAL_PARAM_ST { - pub fn pad_10(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn replaceTextureId_byMaterial(&self) -> bool { - self.bits_0 & (1 << 4) != 0 - } - pub fn dmypolyCategory(&self) -> bool { - self.bits_0 & (1 << 5) != 0 - } - pub fn pad_05(&self) -> bool { - self.bits_0 & (1 << 7) != 0 - } - pub fn useDeferredDecal(&self) -> bool { - self.bits_0 & (1 << 11) != 0 - } - pub fn usePaintDecal(&self) -> bool { - self.bits_0 & (1 << 12) != 0 - } - pub fn bloodTypeEnable(&self) -> bool { - self.bits_0 & (1 << 13) != 0 - } - pub fn bUseNormal(&self) -> bool { - self.bits_0 & (1 << 14) != 0 - } - pub fn pad_08(&self) -> bool { - self.bits_0 & (1 << 15) != 0 - } - pub fn pad_09(&self) -> bool { - self.bits_0 & (1 << 16) != 0 - } - pub fn usePom(&self) -> bool { - self.bits_0 & (1 << 17) != 0 - } - pub fn useEmissive(&self) -> bool { - self.bits_0 & (1 << 18) != 0 - } - pub fn putVertical(&self) -> bool { - self.bits_0 & (1 << 19) != 0 - } - pub fn randVaria_Diffuse(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn randVaria_Mask(&self) -> bool { - self.bits_0 & (1 << 4) != 0 - } - pub fn randVaria_Reflec(&self) -> bool { - self.bits_0 & (1 << 8) != 0 - } - pub fn pad_12(&self) -> bool { - self.bits_0 & (1 << 12) != 0 - } - pub fn randVaria_Normal(&self) -> bool { - self.bits_0 & (1 << 16) != 0 - } - pub fn randVaria_Height(&self) -> bool { - self.bits_0 & (1 << 20) != 0 - } - pub fn randVaria_Emissive(&self) -> bool { - self.bits_0 & (1 << 24) != 0 - } - pub fn pad_11(&self) -> bool { - self.bits_0 & (1 << 28) != 0 - } -} -impl Default for DECAL_PARAM_ST { - fn default() -> Self { - Self { - textureId: -1, - dmypolyId: -1, - pitchAngle: 0., - yawAngle: 0., - nearDistance: 0., - farDistance: 0., - nearSize: 0., - farSize: 0., - maskSpeffectId: -1, - bits_0: 0, - randomSizeMax: 100, - randomRollMin: 0., - randomRollMax: 0., - randomPitchMin: 0., - randomPitchMax: 0., - randomYawMin: 0., - randomYawMax: 0., - pomHightScale: 1., - pomSampleMin: 8, - pomSampleMax: 64, - blendMode: 1, - appearDirType: 0, - emissiveValueBegin: 1., - emissiveValueEnd: 1., - emissiveTime: 0., - bIntpEnable: 0, - pad_01: [0;3], - intpIntervalDist: 0.1, - beginIntpTextureId: -1, - endIntpTextureId: -1, - appearSfxId: -1, - appearSfxOffsetPos: 0., - maskTextureId: -1, - diffuseTextureId: -1, - reflecTextureId: -1, - maskScale: 1., - normalTextureId: -1, - heightTextureId: -1, - emissiveTextureId: -1, - diffuseColorR: 255, - diffuseColorG: 255, - diffuseColorB: 255, - pad_03: [0;1], - reflecColorR: 255, - reflecColorG: 255, - reflecColorB: 255, - bLifeEnable: 0, - siniScale: 1., - lifeTimeSec: 0., - fadeOutTimeSec: 0., - priority: -1, - bDistThinOutEnable: 0, - bAlignedTexRandomVariationEnable: 0, - distThinOutCheckDist: 0., - distThinOutCheckAngleDeg: 0., - distThinOutMaxNum: 1, - distThinOutCheckNum: 1, - delayAppearFrame: 0, - bits_1: 0, - fadeInTimeSec: 0., - thinOutOverlapMultiRadius: 0., - thinOutNeighborAddRadius: 0., - thinOutOverlapLimitNum: 0, - thinOutNeighborLimitNum: 0, - thinOutMode: 0, - emissiveColorR: 255, - emissiveColorG: 255, - emissiveColorB: 255, - maxDecalSfxCreatableSlopeAngleDeg: -1., - pad_02: [0;40], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct DEFAULT_KEY_ASSIGN { - bits_0: u8, - bits_1: u8, - bits_2: u8, - bits_3: u8, - pub dummy: [u8;12], - pub phyisicalKey_0: i32, - pub traitsType_0: u8, - pub a2dOperator_0: u8, - pub applyTarget_0: u8, - bits_4: u8, - pub time2_0: f32, - pub a2dThreshold_0: f32, - pub phyisicalKey_1: i32, - pub traitsType_1: u8, - pub a2dOperator_1: u8, - pub applyTarget_1: u8, - bits_5: u8, - pub time2_1: f32, - pub a2dThreshold_1: f32, - pub phyisicalKey_2: i32, - pub traitsType_2: u8, - pub a2dOperator_2: u8, - pub applyTarget_2: u8, - bits_6: u8, - pub time2_2: f32, - pub a2dThreshold_2: f32, - pub phyisicalKey_3: i32, - pub traitsType_3: u8, - pub a2dOperator_3: u8, - pub applyTarget_3: u8, - bits_7: u8, - pub time2_3: f32, - pub a2dThreshold_3: f32, - pub phyisicalKey_4: i32, - pub traitsType_4: u8, - pub a2dOperator_4: u8, - pub applyTarget_4: u8, - bits_8: u8, - pub time2_4: f32, - pub a2dThreshold_4: f32, - pub phyisicalKey_5: i32, - pub traitsType_5: u8, - pub a2dOperator_5: u8, - pub applyTarget_5: u8, - bits_9: u8, - pub time2_5: f32, - pub a2dThreshold_5: f32, - pub phyisicalKey_6: i32, - pub traitsType_6: u8, - pub a2dOperator_6: u8, - pub applyTarget_6: u8, - bits_10: u8, - pub time2_6: f32, - pub a2dThreshold_6: f32, - pub phyisicalKey_7: i32, - pub traitsType_7: u8, - pub a2dOperator_7: u8, - pub applyTarget_7: u8, - bits_11: u8, - pub time2_7: f32, - pub a2dThreshold_7: f32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl DEFAULT_KEY_ASSIGN { - pub fn priority0(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn priority1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } - pub fn priority2(&self) -> bool { - self.bits_0 & (1 << 2) != 0 - } - pub fn priority3(&self) -> bool { - self.bits_0 & (1 << 3) != 0 - } - pub fn priority4(&self) -> bool { - self.bits_0 & (1 << 4) != 0 - } - pub fn priority5(&self) -> bool { - self.bits_0 & (1 << 5) != 0 - } - pub fn priority6(&self) -> bool { - self.bits_0 & (1 << 6) != 0 - } - pub fn priority7(&self) -> bool { - self.bits_0 & (1 << 7) != 0 - } - pub fn priority8(&self) -> bool { - self.bits_1 & (1 << 0) != 0 - } - pub fn priority9(&self) -> bool { - self.bits_1 & (1 << 1) != 0 - } - pub fn priority10(&self) -> bool { - self.bits_1 & (1 << 2) != 0 - } - pub fn priority11(&self) -> bool { - self.bits_1 & (1 << 3) != 0 - } - pub fn priority12(&self) -> bool { - self.bits_1 & (1 << 4) != 0 - } - pub fn priority13(&self) -> bool { - self.bits_1 & (1 << 5) != 0 - } - pub fn priority14(&self) -> bool { - self.bits_1 & (1 << 6) != 0 - } - pub fn priority15(&self) -> bool { - self.bits_1 & (1 << 7) != 0 - } - pub fn priority16(&self) -> bool { - self.bits_2 & (1 << 0) != 0 - } - pub fn priority17(&self) -> bool { - self.bits_2 & (1 << 1) != 0 - } - pub fn priority18(&self) -> bool { - self.bits_2 & (1 << 2) != 0 - } - pub fn priority19(&self) -> bool { - self.bits_2 & (1 << 3) != 0 - } - pub fn priority20(&self) -> bool { - self.bits_2 & (1 << 4) != 0 - } - pub fn priority21(&self) -> bool { - self.bits_2 & (1 << 5) != 0 - } - pub fn priority22(&self) -> bool { - self.bits_2 & (1 << 6) != 0 - } - pub fn priority23(&self) -> bool { - self.bits_2 & (1 << 7) != 0 - } - pub fn priority24(&self) -> bool { - self.bits_3 & (1 << 0) != 0 - } - pub fn priority25(&self) -> bool { - self.bits_3 & (1 << 1) != 0 - } - pub fn priority26(&self) -> bool { - self.bits_3 & (1 << 2) != 0 - } - pub fn priority27(&self) -> bool { - self.bits_3 & (1 << 3) != 0 - } - pub fn priority28(&self) -> bool { - self.bits_3 & (1 << 4) != 0 - } - pub fn priority29(&self) -> bool { - self.bits_3 & (1 << 5) != 0 - } - pub fn priority30(&self) -> bool { - self.bits_3 & (1 << 6) != 0 - } - pub fn priority31(&self) -> bool { - self.bits_3 & (1 << 7) != 0 - } - pub fn isAnalog_0(&self) -> bool { - self.bits_4 & (1 << 0) != 0 - } - pub fn enableWin64_0(&self) -> bool { - self.bits_4 & (1 << 1) != 0 - } - pub fn enablePS4_0(&self) -> bool { - self.bits_4 & (1 << 2) != 0 - } - pub fn enableXboxOne_0(&self) -> bool { - self.bits_4 & (1 << 3) != 0 - } - pub fn isAnalog_1(&self) -> bool { - self.bits_4 & (1 << 0) != 0 - } - pub fn enableWin64_1(&self) -> bool { - self.bits_4 & (1 << 1) != 0 - } - pub fn enablePS4_1(&self) -> bool { - self.bits_4 & (1 << 2) != 0 - } - pub fn enableXboxOne_1(&self) -> bool { - self.bits_4 & (1 << 3) != 0 - } - pub fn isAnalog_2(&self) -> bool { - self.bits_4 & (1 << 0) != 0 - } - pub fn enableWin64_2(&self) -> bool { - self.bits_4 & (1 << 1) != 0 - } - pub fn enablePS4_2(&self) -> bool { - self.bits_4 & (1 << 2) != 0 - } - pub fn enableXboxOne_2(&self) -> bool { - self.bits_4 & (1 << 3) != 0 - } - pub fn isAnalog_3(&self) -> bool { - self.bits_4 & (1 << 0) != 0 - } - pub fn enableWin64_3(&self) -> bool { - self.bits_4 & (1 << 1) != 0 - } - pub fn enablePS4_3(&self) -> bool { - self.bits_4 & (1 << 2) != 0 - } - pub fn enableXboxOne_3(&self) -> bool { - self.bits_4 & (1 << 3) != 0 - } - pub fn isAnalog_4(&self) -> bool { - self.bits_4 & (1 << 0) != 0 - } - pub fn enableWin64_4(&self) -> bool { - self.bits_4 & (1 << 1) != 0 - } - pub fn enablePS4_4(&self) -> bool { - self.bits_4 & (1 << 2) != 0 - } - pub fn enableXboxOne_4(&self) -> bool { - self.bits_4 & (1 << 3) != 0 - } - pub fn isAnalog_5(&self) -> bool { - self.bits_4 & (1 << 0) != 0 - } - pub fn enableWin64_5(&self) -> bool { - self.bits_4 & (1 << 1) != 0 - } - pub fn enablePS4_5(&self) -> bool { - self.bits_4 & (1 << 2) != 0 - } - pub fn enableXboxOne_5(&self) -> bool { - self.bits_4 & (1 << 3) != 0 - } - pub fn isAnalog_6(&self) -> bool { - self.bits_4 & (1 << 0) != 0 - } - pub fn enableWin64_6(&self) -> bool { - self.bits_4 & (1 << 1) != 0 - } - pub fn enablePS4_6(&self) -> bool { - self.bits_4 & (1 << 2) != 0 - } - pub fn enableXboxOne_6(&self) -> bool { - self.bits_4 & (1 << 3) != 0 - } - pub fn isAnalog_7(&self) -> bool { - self.bits_4 & (1 << 0) != 0 - } - pub fn enableWin64_7(&self) -> bool { - self.bits_4 & (1 << 1) != 0 - } - pub fn enablePS4_7(&self) -> bool { - self.bits_4 & (1 << 2) != 0 - } - pub fn enableXboxOne_7(&self) -> bool { - self.bits_4 & (1 << 3) != 0 - } -} -impl Default for DEFAULT_KEY_ASSIGN { - fn default() -> Self { - Self { - bits_0: 0, - bits_1: 0, - bits_2: 0, - bits_3: 0, - dummy: [0;12], - phyisicalKey_0: -1, - traitsType_0: 0, - a2dOperator_0: 0, - applyTarget_0: 0, - bits_4: 0, - time2_0: 0., - a2dThreshold_0: 0.5, - phyisicalKey_1: -1, - traitsType_1: 0, - a2dOperator_1: 0, - applyTarget_1: 0, - bits_5: 0, - time2_1: 0., - a2dThreshold_1: 0.5, - phyisicalKey_2: -1, - traitsType_2: 0, - a2dOperator_2: 0, - applyTarget_2: 0, - bits_6: 0, - time2_2: 0., - a2dThreshold_2: 0.5, - phyisicalKey_3: -1, - traitsType_3: 0, - a2dOperator_3: 0, - applyTarget_3: 0, - bits_7: 0, - time2_3: 0., - a2dThreshold_3: 0.5, - phyisicalKey_4: -1, - traitsType_4: 0, - a2dOperator_4: 0, - applyTarget_4: 0, - bits_8: 0, - time2_4: 0., - a2dThreshold_4: 0.5, - phyisicalKey_5: -1, - traitsType_5: 0, - a2dOperator_5: 0, - applyTarget_5: 0, - bits_9: 0, - time2_5: 0., - a2dThreshold_5: 0.5, - phyisicalKey_6: -1, - traitsType_6: 0, - a2dOperator_6: 0, - applyTarget_6: 0, - bits_10: 0, - time2_6: 0., - a2dThreshold_6: 0.5, - phyisicalKey_7: -1, - traitsType_7: 0, - a2dOperator_7: 0, - applyTarget_7: 0, - bits_11: 0, - time2_7: 0., - a2dThreshold_7: 0.5, - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct DIRECTION_CAMERA_PARAM_ST { - bits_0: u8, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl DIRECTION_CAMERA_PARAM_ST { - pub fn isUseOption(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn pad2(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } -} -impl Default for DIRECTION_CAMERA_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 0, - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct ENEMY_COMMON_PARAM_ST { - pub reserved0: [u8;8], - pub soundTargetTryApproachTime: i32, - pub searchTargetTryApproachTime: i32, - pub memoryTargetTryApproachTime: i32, - pub reserved5: [u8;40], - pub activateChrByTime_PhantomId: i32, - pub findUnfavorableFailedPointDist: f32, - pub findUnfavorableFailedPointHeight: f32, - pub reserved18: [u8;184], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl ENEMY_COMMON_PARAM_ST { -} -impl Default for ENEMY_COMMON_PARAM_ST { - fn default() -> Self { - Self { - reserved0: [0;8], - soundTargetTryApproachTime: 0, - searchTargetTryApproachTime: 0, - memoryTargetTryApproachTime: 0, - reserved5: [0;40], - activateChrByTime_PhantomId: 0, - findUnfavorableFailedPointDist: 0., - findUnfavorableFailedPointHeight: 0., - reserved18: [0;184], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct ENEMY_STANDARD_INFO_BANK { - pub EnemyBehaviorID: i32, - pub HP: i16, - pub AttackPower: i16, - pub ChrType: i32, - pub HitHeight: f32, - pub HitRadius: f32, - pub Weight: f32, - pub DynamicFriction: f32, - pub StaticFriction: f32, - pub UpperDefState: i32, - pub ActionDefState: i32, - pub RotY_per_Second: f32, - pub reserve0: [u8;20], - pub RotY_per_Second_old: u8, - pub EnableSideStep: u8, - pub UseRagdollHit: u8, - pub reserve_last: [u8;5], - pub stamina: i16, - pub staminaRecover: i16, - pub staminaConsumption: i16, - pub deffenct_Phys: i16, - pub reserve_last2: [u8;48], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl ENEMY_STANDARD_INFO_BANK { -} -impl Default for ENEMY_STANDARD_INFO_BANK { - fn default() -> Self { - Self { - EnemyBehaviorID: 0, - HP: 1, - AttackPower: 1, - ChrType: 5, - HitHeight: 2., - HitRadius: 0.4, - Weight: 60., - DynamicFriction: 0., - StaticFriction: 0., - UpperDefState: 0, - ActionDefState: 0, - RotY_per_Second: 10., - reserve0: [0;20], - RotY_per_Second_old: 0, - EnableSideStep: 0, - UseRagdollHit: 0, - reserve_last: [0;5], - stamina: 0, - staminaRecover: 0, - staminaConsumption: 0, - deffenct_Phys: 0, - reserve_last2: [0;48], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct ENV_OBJ_LOT_PARAM_ST { - pub AssetId_0: i32, - pub AssetId_1: i32, - pub AssetId_2: i32, - pub AssetId_3: i32, - pub AssetId_4: i32, - pub AssetId_5: i32, - pub AssetId_6: i32, - pub AssetId_7: i32, - pub CreateWeight_0: u8, - pub CreateWeight_1: u8, - pub CreateWeight_2: u8, - pub CreateWeight_3: u8, - pub CreateWeight_4: u8, - pub CreateWeight_5: u8, - pub CreateWeight_6: u8, - pub CreateWeight_7: u8, - pub Reserve_0: [u8;24], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl ENV_OBJ_LOT_PARAM_ST { -} -impl Default for ENV_OBJ_LOT_PARAM_ST { - fn default() -> Self { - Self { - AssetId_0: -1, - AssetId_1: -1, - AssetId_2: -1, - AssetId_3: -1, - AssetId_4: -1, - AssetId_5: -1, - AssetId_6: -1, - AssetId_7: -1, - CreateWeight_0: 0, - CreateWeight_1: 0, - CreateWeight_2: 0, - CreateWeight_3: 0, - CreateWeight_4: 0, - CreateWeight_5: 0, - CreateWeight_6: 0, - CreateWeight_7: 0, - Reserve_0: [0;24], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct EQUIP_MTRL_SET_PARAM_ST { - pub materialId01: i32, - pub materialId02: i32, - pub materialId03: i32, - pub materialId04: i32, - pub materialId05: i32, - pub materialId06: i32, - pub pad_id: [u8;8], - pub itemNum01: i8, - pub itemNum02: i8, - pub itemNum03: i8, - pub itemNum04: i8, - pub itemNum05: i8, - pub itemNum06: i8, - pub pad_num: [u8;2], - pub materialCate01: u8, - pub materialCate02: u8, - pub materialCate03: u8, - pub materialCate04: u8, - pub materialCate05: u8, - pub materialCate06: u8, - pub pad_cate: [u8;2], - bits_0: u8, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl EQUIP_MTRL_SET_PARAM_ST { - pub fn isDisableDispNum01(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn isDisableDispNum02(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } - pub fn isDisableDispNum03(&self) -> bool { - self.bits_0 & (1 << 2) != 0 - } - pub fn isDisableDispNum04(&self) -> bool { - self.bits_0 & (1 << 3) != 0 - } - pub fn isDisableDispNum05(&self) -> bool { - self.bits_0 & (1 << 4) != 0 - } - pub fn isDisableDispNum06(&self) -> bool { - self.bits_0 & (1 << 5) != 0 - } -} -impl Default for EQUIP_MTRL_SET_PARAM_ST { - fn default() -> Self { - Self { - materialId01: -1, - materialId02: -1, - materialId03: -1, - materialId04: -1, - materialId05: -1, - materialId06: -1, - pad_id: [0;8], - itemNum01: -1, - itemNum02: -1, - itemNum03: -1, - itemNum04: -1, - itemNum05: -1, - itemNum06: -1, - pad_num: [0;2], - materialCate01: 4, - materialCate02: 4, - materialCate03: 4, - materialCate04: 4, - materialCate05: 4, - materialCate06: 4, - pad_cate: [0;2], - bits_0: 0, - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct EQUIP_PARAM_ACCESSORY_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub refId: i32, - pub sfxVariationId: i32, - pub weight: f32, - pub behaviorId: i32, - pub basicPrice: i32, - pub sellValue: i32, - pub sortId: i32, - pub qwcId: i32, - pub equipModelId: i16, - pub iconId: i16, - pub shopLv: i16, - pub trophySGradeId: i16, - pub trophySeqId: i16, - pub equipModelCategory: u8, - pub equipModelGender: u8, - pub accessoryCategory: u8, - pub refCategory: u8, - pub spEffectCategory: u8, - pub sortGroupId: u8, - pub vagrantItemLotId: i32, - pub vagrantBonusEneDropItemLotId: i32, - pub vagrantItemEneDropItemLotId: i32, - bits_1: u8, - pub rarity: u8, - pub pad2: [u8;2], - pub saleValue: i32, - pub accessoryGroup: i16, - pub pad3: [u8;1], - pub compTrophySedId: i8, - pub residentSpEffectId1: i32, - pub residentSpEffectId2: i32, - pub residentSpEffectId3: i32, - pub residentSpEffectId4: i32, - pub pad1: [u8;4], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl EQUIP_PARAM_ACCESSORY_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } - pub fn isDeposit(&self) -> bool { - self.bits_1 & (1 << 0) != 0 - } - pub fn isEquipOutBrake(&self) -> bool { - self.bits_1 & (1 << 1) != 0 - } - pub fn disableMultiDropShare(&self) -> bool { - self.bits_1 & (1 << 2) != 0 - } - pub fn isDiscard(&self) -> bool { - self.bits_1 & (1 << 3) != 0 - } - pub fn isDrop(&self) -> bool { - self.bits_1 & (1 << 4) != 0 - } - pub fn showLogCondType(&self) -> bool { - self.bits_1 & (1 << 5) != 0 - } - pub fn showDialogCondType(&self) -> bool { - self.bits_1 & (1 << 6) != 0 - } -} -impl Default for EQUIP_PARAM_ACCESSORY_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - refId: -1, - sfxVariationId: -1, - weight: 1., - behaviorId: 0, - basicPrice: 0, - sellValue: 0, - sortId: 0, - qwcId: -1, - equipModelId: 0, - iconId: 0, - shopLv: 0, - trophySGradeId: -1, - trophySeqId: -1, - equipModelCategory: 0, - equipModelGender: 0, - accessoryCategory: 0, - refCategory: 0, - spEffectCategory: 0, - sortGroupId: 255, - vagrantItemLotId: 0, - vagrantBonusEneDropItemLotId: 0, - vagrantItemEneDropItemLotId: 0, - bits_1: 0, - rarity: 0, - pad2: [0;2], - saleValue: -1, - accessoryGroup: -1, - pad3: [0;1], - compTrophySedId: -1, - residentSpEffectId1: 0, - residentSpEffectId2: 0, - residentSpEffectId3: 0, - residentSpEffectId4: 0, - pad1: [0;4], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct EQUIP_PARAM_CUSTOM_WEAPON_ST { - pub baseWepId: i32, - pub gemId: i32, - pub reinforceLv: u8, - pub pad: [u8;7], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl EQUIP_PARAM_CUSTOM_WEAPON_ST { -} -impl Default for EQUIP_PARAM_CUSTOM_WEAPON_ST { - fn default() -> Self { - Self { - baseWepId: 0, - gemId: 0, - reinforceLv: 0, - pad: [0;7], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct EQUIP_PARAM_GEM_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub iconId: i16, - pub rank: i8, - pub sortGroupId: u8, - pub spEffectId0: i32, - pub spEffectId1: i32, - pub spEffectId2: i32, - pub itemGetTutorialFlagId: i32, - pub swordArtsParamId: i32, - pub mountValue: i32, - pub sellValue: i32, - pub saleValue: i32, - pub sortId: i32, - pub compTrophySedId: i16, - pub trophySeqId: i16, - bits_1: u8, - bits_2: u8, - pub rarity: u8, - bits_3: u8, - bits_4: u8, - pub defaultWepAttr: u8, - pub pad2: [u8;2], - bits_5: u8, - bits_6: u8, - bits_7: u8, - bits_8: u8, - bits_9: u8, - pub reserved2_canMountWep: [u8;3], - pub spEffectMsgId0: i32, - pub spEffectMsgId1: i32, - pub spEffectId_forAtk0: i32, - pub spEffectId_forAtk1: i32, - pub spEffectId_forAtk2: i32, - pub mountWepTextId: i32, - pub pad6: [u8;8], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl EQUIP_PARAM_GEM_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } - pub fn configurableWepAttr00(&self) -> bool { - self.bits_1 & (1 << 0) != 0 - } - pub fn configurableWepAttr01(&self) -> bool { - self.bits_1 & (1 << 1) != 0 - } - pub fn configurableWepAttr02(&self) -> bool { - self.bits_1 & (1 << 2) != 0 - } - pub fn configurableWepAttr03(&self) -> bool { - self.bits_1 & (1 << 3) != 0 - } - pub fn configurableWepAttr04(&self) -> bool { - self.bits_1 & (1 << 4) != 0 - } - pub fn configurableWepAttr05(&self) -> bool { - self.bits_1 & (1 << 5) != 0 - } - pub fn configurableWepAttr06(&self) -> bool { - self.bits_1 & (1 << 6) != 0 - } - pub fn configurableWepAttr07(&self) -> bool { - self.bits_1 & (1 << 7) != 0 - } - pub fn configurableWepAttr08(&self) -> bool { - self.bits_2 & (1 << 0) != 0 - } - pub fn configurableWepAttr09(&self) -> bool { - self.bits_2 & (1 << 1) != 0 - } - pub fn configurableWepAttr10(&self) -> bool { - self.bits_2 & (1 << 2) != 0 - } - pub fn configurableWepAttr11(&self) -> bool { - self.bits_2 & (1 << 3) != 0 - } - pub fn configurableWepAttr12(&self) -> bool { - self.bits_2 & (1 << 4) != 0 - } - pub fn configurableWepAttr13(&self) -> bool { - self.bits_2 & (1 << 5) != 0 - } - pub fn configurableWepAttr14(&self) -> bool { - self.bits_2 & (1 << 6) != 0 - } - pub fn configurableWepAttr15(&self) -> bool { - self.bits_2 & (1 << 7) != 0 - } - pub fn configurableWepAttr16(&self) -> bool { - self.bits_3 & (1 << 0) != 0 - } - pub fn configurableWepAttr17(&self) -> bool { - self.bits_3 & (1 << 1) != 0 - } - pub fn configurableWepAttr18(&self) -> bool { - self.bits_3 & (1 << 2) != 0 - } - pub fn configurableWepAttr19(&self) -> bool { - self.bits_3 & (1 << 3) != 0 - } - pub fn configurableWepAttr20(&self) -> bool { - self.bits_3 & (1 << 4) != 0 - } - pub fn configurableWepAttr21(&self) -> bool { - self.bits_3 & (1 << 5) != 0 - } - pub fn configurableWepAttr22(&self) -> bool { - self.bits_3 & (1 << 6) != 0 - } - pub fn configurableWepAttr23(&self) -> bool { - self.bits_3 & (1 << 7) != 0 - } - pub fn isDiscard(&self) -> bool { - self.bits_4 & (1 << 0) != 0 - } - pub fn isDrop(&self) -> bool { - self.bits_4 & (1 << 1) != 0 - } - pub fn isDeposit(&self) -> bool { - self.bits_4 & (1 << 2) != 0 - } - pub fn disableMultiDropShare(&self) -> bool { - self.bits_4 & (1 << 3) != 0 - } - pub fn showDialogCondType(&self) -> bool { - self.bits_4 & (1 << 4) != 0 - } - pub fn showLogCondType(&self) -> bool { - self.bits_4 & (1 << 6) != 0 - } - pub fn pad(&self) -> bool { - self.bits_4 & (1 << 7) != 0 - } - pub fn canMountWep_Dagger(&self) -> bool { - self.bits_5 & (1 << 0) != 0 - } - pub fn canMountWep_SwordNormal(&self) -> bool { - self.bits_5 & (1 << 1) != 0 - } - pub fn canMountWep_SwordLarge(&self) -> bool { - self.bits_5 & (1 << 2) != 0 - } - pub fn canMountWep_SwordGigantic(&self) -> bool { - self.bits_5 & (1 << 3) != 0 - } - pub fn canMountWep_SaberNormal(&self) -> bool { - self.bits_5 & (1 << 4) != 0 - } - pub fn canMountWep_SaberLarge(&self) -> bool { - self.bits_5 & (1 << 5) != 0 - } - pub fn canMountWep_katana(&self) -> bool { - self.bits_5 & (1 << 6) != 0 - } - pub fn canMountWep_SwordDoubleEdge(&self) -> bool { - self.bits_5 & (1 << 7) != 0 - } - pub fn canMountWep_SwordPierce(&self) -> bool { - self.bits_6 & (1 << 0) != 0 - } - pub fn canMountWep_RapierHeavy(&self) -> bool { - self.bits_6 & (1 << 1) != 0 - } - pub fn canMountWep_AxeNormal(&self) -> bool { - self.bits_6 & (1 << 2) != 0 - } - pub fn canMountWep_AxeLarge(&self) -> bool { - self.bits_6 & (1 << 3) != 0 - } - pub fn canMountWep_HammerNormal(&self) -> bool { - self.bits_6 & (1 << 4) != 0 - } - pub fn canMountWep_HammerLarge(&self) -> bool { - self.bits_6 & (1 << 5) != 0 - } - pub fn canMountWep_Flail(&self) -> bool { - self.bits_6 & (1 << 6) != 0 - } - pub fn canMountWep_SpearNormal(&self) -> bool { - self.bits_6 & (1 << 7) != 0 - } - pub fn canMountWep_SpearLarge(&self) -> bool { - self.bits_7 & (1 << 0) != 0 - } - pub fn canMountWep_SpearHeavy(&self) -> bool { - self.bits_7 & (1 << 1) != 0 - } - pub fn canMountWep_SpearAxe(&self) -> bool { - self.bits_7 & (1 << 2) != 0 - } - pub fn canMountWep_Sickle(&self) -> bool { - self.bits_7 & (1 << 3) != 0 - } - pub fn canMountWep_Knuckle(&self) -> bool { - self.bits_7 & (1 << 4) != 0 - } - pub fn canMountWep_Claw(&self) -> bool { - self.bits_7 & (1 << 5) != 0 - } - pub fn canMountWep_Whip(&self) -> bool { - self.bits_7 & (1 << 6) != 0 - } - pub fn canMountWep_AxhammerLarge(&self) -> bool { - self.bits_7 & (1 << 7) != 0 - } - pub fn canMountWep_BowSmall(&self) -> bool { - self.bits_8 & (1 << 0) != 0 - } - pub fn canMountWep_BowNormal(&self) -> bool { - self.bits_8 & (1 << 1) != 0 - } - pub fn canMountWep_BowLarge(&self) -> bool { - self.bits_8 & (1 << 2) != 0 - } - pub fn canMountWep_ClossBow(&self) -> bool { - self.bits_8 & (1 << 3) != 0 - } - pub fn canMountWep_Ballista(&self) -> bool { - self.bits_8 & (1 << 4) != 0 - } - pub fn canMountWep_Staff(&self) -> bool { - self.bits_8 & (1 << 5) != 0 - } - pub fn canMountWep_Sorcery(&self) -> bool { - self.bits_8 & (1 << 6) != 0 - } - pub fn canMountWep_Talisman(&self) -> bool { - self.bits_8 & (1 << 7) != 0 - } - pub fn canMountWep_ShieldSmall(&self) -> bool { - self.bits_9 & (1 << 0) != 0 - } - pub fn canMountWep_ShieldNormal(&self) -> bool { - self.bits_9 & (1 << 1) != 0 - } - pub fn canMountWep_ShieldLarge(&self) -> bool { - self.bits_9 & (1 << 2) != 0 - } - pub fn canMountWep_Torch(&self) -> bool { - self.bits_9 & (1 << 3) != 0 - } - pub fn reserved_canMountWep(&self) -> bool { - self.bits_9 & (1 << 4) != 0 - } -} -impl Default for EQUIP_PARAM_GEM_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - iconId: 0, - rank: 0, - sortGroupId: 255, - spEffectId0: -1, - spEffectId1: -1, - spEffectId2: -1, - itemGetTutorialFlagId: 0, - swordArtsParamId: -1, - mountValue: 0, - sellValue: 0, - saleValue: -1, - sortId: 0, - compTrophySedId: -1, - trophySeqId: -1, - bits_1: 0, - bits_2: 0, - rarity: 0, - bits_3: 0, - bits_4: 0, - defaultWepAttr: 0, - pad2: [0;2], - bits_5: 0, - bits_6: 0, - bits_7: 0, - bits_8: 0, - bits_9: 0, - reserved2_canMountWep: [0;3], - spEffectMsgId0: -1, - spEffectMsgId1: -1, - spEffectId_forAtk0: -1, - spEffectId_forAtk1: -1, - spEffectId_forAtk2: -1, - mountWepTextId: -1, - pad6: [0;8], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct EQUIP_PARAM_GOODS_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub refId_default: i32, - pub sfxVariationId: i32, - pub weight: f32, - pub basicPrice: i32, - pub sellValue: i32, - pub behaviorId: i32, - pub replaceItemId: i32, - pub sortId: i32, - pub appearanceReplaceItemId: i32, - pub yesNoDialogMessageId: i32, - pub useEnableSpEffectType: i16, - pub potGroupId: i8, - pub pad: [u8;1], - pub iconId: i16, - pub modelId: i16, - pub shopLv: i16, - pub compTrophySedId: i16, - pub trophySeqId: i16, - pub maxNum: i16, - pub consumeHeroPoint: u8, - pub overDexterity: u8, - pub goodsType: u8, - pub refCategory: u8, - pub spEffectCategory: u8, - pub pad3: [u8;1], - pub goodsUseAnim: u8, - pub opmeMenuType: u8, - pub useLimitCategory: u8, - pub replaceCategory: u8, - pub reserve4: [u8;2], - bits_1: u8, - bits_2: u8, - bits_3: u8, - pub syncNumVaryId: u8, - pub refId_1: i32, - pub refVirtualWepId: i32, - pub vagrantItemLotId: i32, - pub vagrantBonusEneDropItemLotId: i32, - pub vagrantItemEneDropItemLotId: i32, - pub castSfxId: i32, - pub fireSfxId: i32, - pub effectSfxId: i32, - bits_4: u8, - pub suppleType: u8, - pub autoReplenishType: u8, - bits_5: u8, - pub maxRepositoryNum: i16, - pub sortGroupId: u8, - bits_6: u8, - pub saleValue: i32, - pub rarity: u8, - pub useLimitSummonBuddy: u8, - pub useLimitSpEffectType: i16, - pub aiUseJudgeId: i32, - pub consumeMP: i16, - pub consumeHP: i16, - pub reinforceGoodsId: i32, - pub reinforceMaterialId: i32, - pub reinforcePrice: i32, - pub useLevel_vowType0: i8, - pub useLevel_vowType1: i8, - pub useLevel_vowType2: i8, - pub useLevel_vowType3: i8, - pub useLevel_vowType4: i8, - pub useLevel_vowType5: i8, - pub useLevel_vowType6: i8, - pub useLevel_vowType7: i8, - pub useLevel_vowType8: i8, - pub useLevel_vowType9: i8, - pub useLevel_vowType10: i8, - pub useLevel_vowType11: i8, - pub useLevel_vowType12: i8, - pub useLevel_vowType13: i8, - pub useLevel_vowType14: i8, - pub useLevel_vowType15: i8, - pub useLevel: i16, - pub reserve5: [u8;2], - pub itemGetTutorialFlagId: i32, - pub reserve3: [u8;8], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl EQUIP_PARAM_GOODS_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } - pub fn enable_live(&self) -> bool { - self.bits_1 & (1 << 0) != 0 - } - pub fn enable_gray(&self) -> bool { - self.bits_1 & (1 << 1) != 0 - } - pub fn enable_white(&self) -> bool { - self.bits_1 & (1 << 2) != 0 - } - pub fn enable_black(&self) -> bool { - self.bits_1 & (1 << 3) != 0 - } - pub fn enable_multi(&self) -> bool { - self.bits_1 & (1 << 4) != 0 - } - pub fn disable_offline(&self) -> bool { - self.bits_1 & (1 << 5) != 0 - } - pub fn isEquip(&self) -> bool { - self.bits_1 & (1 << 6) != 0 - } - pub fn isConsume(&self) -> bool { - self.bits_1 & (1 << 7) != 0 - } - pub fn isAutoEquip(&self) -> bool { - self.bits_2 & (1 << 0) != 0 - } - pub fn isEstablishment(&self) -> bool { - self.bits_2 & (1 << 1) != 0 - } - pub fn isOnlyOne(&self) -> bool { - self.bits_2 & (1 << 2) != 0 - } - pub fn isDiscard(&self) -> bool { - self.bits_2 & (1 << 3) != 0 - } - pub fn isDeposit(&self) -> bool { - self.bits_2 & (1 << 4) != 0 - } - pub fn isDisableHand(&self) -> bool { - self.bits_2 & (1 << 5) != 0 - } - pub fn isRemoveItem_forGameClear(&self) -> bool { - self.bits_2 & (1 << 6) != 0 - } - pub fn isSuppleItem(&self) -> bool { - self.bits_2 & (1 << 7) != 0 - } - pub fn isFullSuppleItem(&self) -> bool { - self.bits_3 & (1 << 0) != 0 - } - pub fn isEnhance(&self) -> bool { - self.bits_3 & (1 << 1) != 0 - } - pub fn isFixItem(&self) -> bool { - self.bits_3 & (1 << 2) != 0 - } - pub fn disableMultiDropShare(&self) -> bool { - self.bits_3 & (1 << 3) != 0 - } - pub fn disableUseAtColiseum(&self) -> bool { - self.bits_3 & (1 << 4) != 0 - } - pub fn disableUseAtOutOfColiseum(&self) -> bool { - self.bits_3 & (1 << 5) != 0 - } - pub fn isEnableFastUseItem(&self) -> bool { - self.bits_3 & (1 << 6) != 0 - } - pub fn isApplySpecialEffect(&self) -> bool { - self.bits_3 & (1 << 7) != 0 - } - pub fn enable_ActiveBigRune(&self) -> bool { - self.bits_4 & (1 << 0) != 0 - } - pub fn isBonfireWarpItem(&self) -> bool { - self.bits_4 & (1 << 1) != 0 - } - pub fn enable_Ladder(&self) -> bool { - self.bits_4 & (1 << 2) != 0 - } - pub fn isUseMultiPlayPreparation(&self) -> bool { - self.bits_4 & (1 << 3) != 0 - } - pub fn canMultiUse(&self) -> bool { - self.bits_4 & (1 << 4) != 0 - } - pub fn isShieldEnchant(&self) -> bool { - self.bits_4 & (1 << 5) != 0 - } - pub fn isWarpProhibited(&self) -> bool { - self.bits_4 & (1 << 6) != 0 - } - pub fn isUseMultiPenaltyOnly(&self) -> bool { - self.bits_4 & (1 << 7) != 0 - } - pub fn isDrop(&self) -> bool { - self.bits_5 & (1 << 0) != 0 - } - pub fn showLogCondType(&self) -> bool { - self.bits_5 & (1 << 1) != 0 - } - pub fn isSummonHorse(&self) -> bool { - self.bits_5 & (1 << 2) != 0 - } - pub fn showDialogCondType(&self) -> bool { - self.bits_5 & (1 << 3) != 0 - } - pub fn isSleepCollectionItem(&self) -> bool { - self.bits_5 & (1 << 5) != 0 - } - pub fn enableRiding(&self) -> bool { - self.bits_5 & (1 << 6) != 0 - } - pub fn disableRiding(&self) -> bool { - self.bits_5 & (1 << 7) != 0 - } - pub fn isUseNoAttackRegion(&self) -> bool { - self.bits_6 & (1 << 0) != 0 - } - pub fn pad1(&self) -> bool { - self.bits_6 & (1 << 1) != 0 - } -} -impl Default for EQUIP_PARAM_GOODS_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - refId_default: -1, - sfxVariationId: -1, - weight: 1., - basicPrice: 0, - sellValue: 0, - behaviorId: 0, - replaceItemId: -1, - sortId: 0, - appearanceReplaceItemId: -1, - yesNoDialogMessageId: -1, - useEnableSpEffectType: 0, - potGroupId: -1, - pad: [0;1], - iconId: 0, - modelId: 0, - shopLv: 0, - compTrophySedId: -1, - trophySeqId: -1, - maxNum: 0, - consumeHeroPoint: 0, - overDexterity: 0, - goodsType: 0, - refCategory: 0, - spEffectCategory: 0, - pad3: [0;1], - goodsUseAnim: 0, - opmeMenuType: 0, - useLimitCategory: 0, - replaceCategory: 0, - reserve4: [0;2], - bits_1: 0, - bits_2: 0, - bits_3: 0, - syncNumVaryId: 0, - refId_1: -1, - refVirtualWepId: -1, - vagrantItemLotId: 0, - vagrantBonusEneDropItemLotId: 0, - vagrantItemEneDropItemLotId: 0, - castSfxId: -1, - fireSfxId: -1, - effectSfxId: -1, - bits_4: 0, - suppleType: 0, - autoReplenishType: 0, - bits_5: 0, - maxRepositoryNum: 0, - sortGroupId: 255, - bits_6: 1, - saleValue: -1, - rarity: 0, - useLimitSummonBuddy: 0, - useLimitSpEffectType: 0, - aiUseJudgeId: -1, - consumeMP: 0, - consumeHP: -1, - reinforceGoodsId: -1, - reinforceMaterialId: -1, - reinforcePrice: 0, - useLevel_vowType0: 0, - useLevel_vowType1: 0, - useLevel_vowType2: 0, - useLevel_vowType3: 0, - useLevel_vowType4: 0, - useLevel_vowType5: 0, - useLevel_vowType6: 0, - useLevel_vowType7: 0, - useLevel_vowType8: 0, - useLevel_vowType9: 0, - useLevel_vowType10: 0, - useLevel_vowType11: 0, - useLevel_vowType12: 0, - useLevel_vowType13: 0, - useLevel_vowType14: 0, - useLevel_vowType15: 0, - useLevel: 0, - reserve5: [0;2], - itemGetTutorialFlagId: 0, - reserve3: [0;8], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct EQUIP_PARAM_PROTECTOR_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub sortId: i32, - pub wanderingEquipId: i32, - pub resistSleep: i16, - pub resistMadness: i16, - pub saDurability: f32, - pub toughnessCorrectRate: f32, - pub fixPrice: i32, - pub basicPrice: i32, - pub sellValue: i32, - pub weight: f32, - pub residentSpEffectId: i32, - pub residentSpEffectId2: i32, - pub residentSpEffectId3: i32, - pub materialSetId: i32, - pub partsDamageRate: f32, - pub corectSARecover: f32, - pub originEquipPro: i32, - pub originEquipPro1: i32, - pub originEquipPro2: i32, - pub originEquipPro3: i32, - pub originEquipPro4: i32, - pub originEquipPro5: i32, - pub originEquipPro6: i32, - pub originEquipPro7: i32, - pub originEquipPro8: i32, - pub originEquipPro9: i32, - pub originEquipPro10: i32, - pub originEquipPro11: i32, - pub originEquipPro12: i32, - pub originEquipPro13: i32, - pub originEquipPro14: i32, - pub originEquipPro15: i32, - pub faceScaleM_ScaleX: f32, - pub faceScaleM_ScaleZ: f32, - pub faceScaleM_MaxX: f32, - pub faceScaleM_MaxZ: f32, - pub faceScaleF_ScaleX: f32, - pub faceScaleF_ScaleZ: f32, - pub faceScaleF_MaxX: f32, - pub faceScaleF_MaxZ: f32, - pub qwcId: i32, - pub equipModelId: i16, - pub iconIdM: i16, - pub iconIdF: i16, - pub knockBack: i16, - pub knockbackBounceRate: i16, - pub durability: i16, - pub durabilityMax: i16, - pub pad03: [u8;2], - pub defFlickPower: i16, - pub defensePhysics: i16, - pub defenseMagic: i16, - pub defenseFire: i16, - pub defenseThunder: i16, - pub defenseSlash: i16, - pub defenseBlow: i16, - pub defenseThrust: i16, - pub resistPoison: i16, - pub resistDisease: i16, - pub resistBlood: i16, - pub resistCurse: i16, - pub reinforceTypeId: i16, - pub trophySGradeId: i16, - pub shopLv: i16, - pub knockbackParamId: u8, - pub flickDamageCutRate: u8, - pub equipModelCategory: u8, - pub equipModelGender: u8, - pub protectorCategory: u8, - pub rarity: u8, - pub sortGroupId: u8, - pub partsDmgType: u8, - pub pad04: [u8;2], - bits_1: u8, - pub defenseMaterialVariationValue_Weak: u8, - pub autoFootEffectDecalBaseId2: i16, - pub autoFootEffectDecalBaseId3: i16, - pub defenseMaterialVariationValue: u8, - bits_2: u8, - pub neutralDamageCutRate: f32, - pub slashDamageCutRate: f32, - pub blowDamageCutRate: f32, - pub thrustDamageCutRate: f32, - pub magicDamageCutRate: f32, - pub fireDamageCutRate: f32, - pub thunderDamageCutRate: f32, - pub defenseMaterialSfx1: i16, - pub defenseMaterialSfx_Weak1: i16, - pub defenseMaterial1: i16, - pub defenseMaterial_Weak1: i16, - pub defenseMaterialSfx2: i16, - pub defenseMaterialSfx_Weak2: i16, - pub footMaterialSe: i16, - pub defenseMaterial_Weak2: i16, - pub autoFootEffectDecalBaseId1: i32, - pub toughnessDamageCutRate: f32, - pub toughnessRecoverCorrection: f32, - pub darkDamageCutRate: f32, - pub defenseDark: i16, - bits_3: u8, - bits_4: u8, - bits_5: u8, - bits_6: u8, - bits_7: u8, - pub postureControlId: u8, - pub pad2: [u8;4], - pub saleValue: i32, - pub resistFreeze: i16, - pub invisibleFlag_SexVer00: u8, - pub invisibleFlag_SexVer01: u8, - pub invisibleFlag_SexVer02: u8, - pub invisibleFlag_SexVer03: u8, - pub invisibleFlag_SexVer04: u8, - pub invisibleFlag_SexVer05: u8, - pub invisibleFlag_SexVer06: u8, - pub invisibleFlag_SexVer07: u8, - pub invisibleFlag_SexVer08: u8, - pub invisibleFlag_SexVer09: u8, - pub invisibleFlag_SexVer10: u8, - pub invisibleFlag_SexVer11: u8, - pub invisibleFlag_SexVer12: u8, - pub invisibleFlag_SexVer13: u8, - pub invisibleFlag_SexVer14: u8, - pub invisibleFlag_SexVer15: u8, - pub invisibleFlag_SexVer16: u8, - pub invisibleFlag_SexVer17: u8, - pub invisibleFlag_SexVer18: u8, - pub invisibleFlag_SexVer19: u8, - pub invisibleFlag_SexVer20: u8, - pub invisibleFlag_SexVer21: u8, - pub invisibleFlag_SexVer22: u8, - pub invisibleFlag_SexVer23: u8, - pub invisibleFlag_SexVer24: u8, - pub invisibleFlag_SexVer25: u8, - pub invisibleFlag_SexVer26: u8, - pub invisibleFlag_SexVer27: u8, - pub invisibleFlag_SexVer28: u8, - pub invisibleFlag_SexVer29: u8, - pub invisibleFlag_SexVer30: u8, - pub invisibleFlag_SexVer31: u8, - pub invisibleFlag_SexVer32: u8, - pub invisibleFlag_SexVer33: u8, - pub invisibleFlag_SexVer34: u8, - pub invisibleFlag_SexVer35: u8, - pub invisibleFlag_SexVer36: u8, - pub invisibleFlag_SexVer37: u8, - pub invisibleFlag_SexVer38: u8, - pub invisibleFlag_SexVer39: u8, - pub invisibleFlag_SexVer40: u8, - pub invisibleFlag_SexVer41: u8, - pub invisibleFlag_SexVer42: u8, - pub invisibleFlag_SexVer43: u8, - pub invisibleFlag_SexVer44: u8, - pub invisibleFlag_SexVer45: u8, - pub invisibleFlag_SexVer46: u8, - pub invisibleFlag_SexVer47: u8, - pub invisibleFlag_SexVer48: u8, - pub invisibleFlag_SexVer49: u8, - pub invisibleFlag_SexVer50: u8, - pub invisibleFlag_SexVer51: u8, - pub invisibleFlag_SexVer52: u8, - pub invisibleFlag_SexVer53: u8, - pub invisibleFlag_SexVer54: u8, - pub invisibleFlag_SexVer55: u8, - pub invisibleFlag_SexVer56: u8, - pub invisibleFlag_SexVer57: u8, - pub invisibleFlag_SexVer58: u8, - pub invisibleFlag_SexVer59: u8, - pub invisibleFlag_SexVer60: u8, - pub invisibleFlag_SexVer61: u8, - pub invisibleFlag_SexVer62: u8, - pub invisibleFlag_SexVer63: u8, - pub invisibleFlag_SexVer64: u8, - pub invisibleFlag_SexVer65: u8, - pub invisibleFlag_SexVer66: u8, - pub invisibleFlag_SexVer67: u8, - pub invisibleFlag_SexVer68: u8, - pub invisibleFlag_SexVer69: u8, - pub invisibleFlag_SexVer70: u8, - pub invisibleFlag_SexVer71: u8, - pub invisibleFlag_SexVer72: u8, - pub invisibleFlag_SexVer73: u8, - pub invisibleFlag_SexVer74: u8, - pub invisibleFlag_SexVer75: u8, - pub invisibleFlag_SexVer76: u8, - pub invisibleFlag_SexVer77: u8, - pub invisibleFlag_SexVer78: u8, - pub invisibleFlag_SexVer79: u8, - pub invisibleFlag_SexVer80: u8, - pub invisibleFlag_SexVer81: u8, - pub invisibleFlag_SexVer82: u8, - pub invisibleFlag_SexVer83: u8, - pub invisibleFlag_SexVer84: u8, - pub invisibleFlag_SexVer85: u8, - pub invisibleFlag_SexVer86: u8, - pub invisibleFlag_SexVer87: u8, - pub invisibleFlag_SexVer88: u8, - pub invisibleFlag_SexVer89: u8, - pub invisibleFlag_SexVer90: u8, - pub invisibleFlag_SexVer91: u8, - pub invisibleFlag_SexVer92: u8, - pub invisibleFlag_SexVer93: u8, - pub invisibleFlag_SexVer94: u8, - pub invisibleFlag_SexVer95: u8, - pub pad404: [u8;14], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl EQUIP_PARAM_PROTECTOR_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } - pub fn isDeposit(&self) -> bool { - self.bits_1 & (1 << 0) != 0 - } - pub fn headEquip(&self) -> bool { - self.bits_1 & (1 << 1) != 0 - } - pub fn bodyEquip(&self) -> bool { - self.bits_1 & (1 << 2) != 0 - } - pub fn armEquip(&self) -> bool { - self.bits_1 & (1 << 3) != 0 - } - pub fn legEquip(&self) -> bool { - self.bits_1 & (1 << 4) != 0 - } - pub fn useFaceScale(&self) -> bool { - self.bits_1 & (1 << 5) != 0 - } - pub fn isSkipWeakDamageAnim(&self) -> bool { - self.bits_1 & (1 << 6) != 0 - } - pub fn pad06(&self) -> bool { - self.bits_1 & (1 << 7) != 0 - } - pub fn isDiscard(&self) -> bool { - self.bits_2 & (1 << 0) != 0 - } - pub fn isDrop(&self) -> bool { - self.bits_2 & (1 << 1) != 0 - } - pub fn disableMultiDropShare(&self) -> bool { - self.bits_2 & (1 << 2) != 0 - } - pub fn simpleModelForDlc(&self) -> bool { - self.bits_2 & (1 << 3) != 0 - } - pub fn showLogCondType(&self) -> bool { - self.bits_2 & (1 << 4) != 0 - } - pub fn showDialogCondType(&self) -> bool { - self.bits_2 & (1 << 5) != 0 - } - pub fn pad(&self) -> bool { - self.bits_2 & (1 << 7) != 0 - } - pub fn invisibleFlag48(&self) -> bool { - self.bits_3 & (1 << 0) != 0 - } - pub fn invisibleFlag49(&self) -> bool { - self.bits_3 & (1 << 1) != 0 - } - pub fn invisibleFlag50(&self) -> bool { - self.bits_3 & (1 << 2) != 0 - } - pub fn invisibleFlag51(&self) -> bool { - self.bits_3 & (1 << 3) != 0 - } - pub fn invisibleFlag52(&self) -> bool { - self.bits_3 & (1 << 4) != 0 - } - pub fn invisibleFlag53(&self) -> bool { - self.bits_3 & (1 << 5) != 0 - } - pub fn invisibleFlag54(&self) -> bool { - self.bits_3 & (1 << 6) != 0 - } - pub fn invisibleFlag55(&self) -> bool { - self.bits_3 & (1 << 7) != 0 - } - pub fn invisibleFlag56(&self) -> bool { - self.bits_4 & (1 << 0) != 0 - } - pub fn invisibleFlag57(&self) -> bool { - self.bits_4 & (1 << 1) != 0 - } - pub fn invisibleFlag58(&self) -> bool { - self.bits_4 & (1 << 2) != 0 - } - pub fn invisibleFlag59(&self) -> bool { - self.bits_4 & (1 << 3) != 0 - } - pub fn invisibleFlag60(&self) -> bool { - self.bits_4 & (1 << 4) != 0 - } - pub fn invisibleFlag61(&self) -> bool { - self.bits_4 & (1 << 5) != 0 - } - pub fn invisibleFlag62(&self) -> bool { - self.bits_4 & (1 << 6) != 0 - } - pub fn invisibleFlag63(&self) -> bool { - self.bits_4 & (1 << 7) != 0 - } - pub fn invisibleFlag64(&self) -> bool { - self.bits_5 & (1 << 0) != 0 - } - pub fn invisibleFlag65(&self) -> bool { - self.bits_5 & (1 << 1) != 0 - } - pub fn invisibleFlag66(&self) -> bool { - self.bits_5 & (1 << 2) != 0 - } - pub fn invisibleFlag67(&self) -> bool { - self.bits_5 & (1 << 3) != 0 - } - pub fn invisibleFlag68(&self) -> bool { - self.bits_5 & (1 << 4) != 0 - } - pub fn invisibleFlag69(&self) -> bool { - self.bits_5 & (1 << 5) != 0 - } - pub fn invisibleFlag70(&self) -> bool { - self.bits_5 & (1 << 6) != 0 - } - pub fn invisibleFlag71(&self) -> bool { - self.bits_5 & (1 << 7) != 0 - } - pub fn invisibleFlag72(&self) -> bool { - self.bits_6 & (1 << 0) != 0 - } - pub fn invisibleFlag73(&self) -> bool { - self.bits_6 & (1 << 1) != 0 - } - pub fn invisibleFlag74(&self) -> bool { - self.bits_6 & (1 << 2) != 0 - } - pub fn invisibleFlag75(&self) -> bool { - self.bits_6 & (1 << 3) != 0 - } - pub fn invisibleFlag76(&self) -> bool { - self.bits_6 & (1 << 4) != 0 - } - pub fn invisibleFlag77(&self) -> bool { - self.bits_6 & (1 << 5) != 0 - } - pub fn invisibleFlag78(&self) -> bool { - self.bits_6 & (1 << 6) != 0 - } - pub fn invisibleFlag79(&self) -> bool { - self.bits_6 & (1 << 7) != 0 - } - pub fn invisibleFlag80(&self) -> bool { - self.bits_7 & (1 << 0) != 0 - } - pub fn padbit(&self) -> bool { - self.bits_7 & (1 << 1) != 0 - } -} -impl Default for EQUIP_PARAM_PROTECTOR_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - sortId: 0, - wanderingEquipId: 0, - resistSleep: 0, - resistMadness: 0, - saDurability: 0., - toughnessCorrectRate: 0., - fixPrice: 0, - basicPrice: 0, - sellValue: 0, - weight: 1., - residentSpEffectId: 0, - residentSpEffectId2: 0, - residentSpEffectId3: 0, - materialSetId: -1, - partsDamageRate: 1., - corectSARecover: 0., - originEquipPro: -1, - originEquipPro1: -1, - originEquipPro2: -1, - originEquipPro3: -1, - originEquipPro4: -1, - originEquipPro5: -1, - originEquipPro6: -1, - originEquipPro7: -1, - originEquipPro8: -1, - originEquipPro9: -1, - originEquipPro10: -1, - originEquipPro11: -1, - originEquipPro12: -1, - originEquipPro13: -1, - originEquipPro14: -1, - originEquipPro15: -1, - faceScaleM_ScaleX: 1., - faceScaleM_ScaleZ: 1., - faceScaleM_MaxX: 1., - faceScaleM_MaxZ: 1., - faceScaleF_ScaleX: 1., - faceScaleF_ScaleZ: 1., - faceScaleF_MaxX: 1., - faceScaleF_MaxZ: 1., - qwcId: -1, - equipModelId: 0, - iconIdM: 0, - iconIdF: 0, - knockBack: 0, - knockbackBounceRate: 0, - durability: 100, - durabilityMax: 100, - pad03: [0;2], - defFlickPower: 0, - defensePhysics: 100, - defenseMagic: 100, - defenseFire: 100, - defenseThunder: 100, - defenseSlash: 0, - defenseBlow: 0, - defenseThrust: 0, - resistPoison: 100, - resistDisease: 100, - resistBlood: 100, - resistCurse: 100, - reinforceTypeId: 0, - trophySGradeId: -1, - shopLv: 0, - knockbackParamId: 0, - flickDamageCutRate: 0, - equipModelCategory: 1, - equipModelGender: 0, - protectorCategory: 0, - rarity: 0, - sortGroupId: 255, - partsDmgType: 0, - pad04: [0;2], - bits_1: 0, - defenseMaterialVariationValue_Weak: 0, - autoFootEffectDecalBaseId2: -1, - autoFootEffectDecalBaseId3: -1, - defenseMaterialVariationValue: 0, - bits_2: 0, - neutralDamageCutRate: 1., - slashDamageCutRate: 1., - blowDamageCutRate: 1., - thrustDamageCutRate: 1., - magicDamageCutRate: 1., - fireDamageCutRate: 1., - thunderDamageCutRate: 1., - defenseMaterialSfx1: 50, - defenseMaterialSfx_Weak1: 50, - defenseMaterial1: 50, - defenseMaterial_Weak1: 50, - defenseMaterialSfx2: 50, - defenseMaterialSfx_Weak2: 50, - footMaterialSe: 139, - defenseMaterial_Weak2: 50, - autoFootEffectDecalBaseId1: -1, - toughnessDamageCutRate: 1., - toughnessRecoverCorrection: 0., - darkDamageCutRate: 1., - defenseDark: 100, - bits_3: 0, - bits_4: 0, - bits_5: 0, - bits_6: 0, - bits_7: 0, - postureControlId: 0, - pad2: [0;4], - saleValue: -1, - resistFreeze: 0, - invisibleFlag_SexVer00: 0, - invisibleFlag_SexVer01: 0, - invisibleFlag_SexVer02: 0, - invisibleFlag_SexVer03: 0, - invisibleFlag_SexVer04: 0, - invisibleFlag_SexVer05: 0, - invisibleFlag_SexVer06: 0, - invisibleFlag_SexVer07: 0, - invisibleFlag_SexVer08: 0, - invisibleFlag_SexVer09: 0, - invisibleFlag_SexVer10: 0, - invisibleFlag_SexVer11: 0, - invisibleFlag_SexVer12: 0, - invisibleFlag_SexVer13: 0, - invisibleFlag_SexVer14: 0, - invisibleFlag_SexVer15: 0, - invisibleFlag_SexVer16: 0, - invisibleFlag_SexVer17: 0, - invisibleFlag_SexVer18: 0, - invisibleFlag_SexVer19: 0, - invisibleFlag_SexVer20: 0, - invisibleFlag_SexVer21: 0, - invisibleFlag_SexVer22: 0, - invisibleFlag_SexVer23: 0, - invisibleFlag_SexVer24: 0, - invisibleFlag_SexVer25: 0, - invisibleFlag_SexVer26: 0, - invisibleFlag_SexVer27: 0, - invisibleFlag_SexVer28: 0, - invisibleFlag_SexVer29: 0, - invisibleFlag_SexVer30: 0, - invisibleFlag_SexVer31: 0, - invisibleFlag_SexVer32: 0, - invisibleFlag_SexVer33: 0, - invisibleFlag_SexVer34: 0, - invisibleFlag_SexVer35: 0, - invisibleFlag_SexVer36: 0, - invisibleFlag_SexVer37: 0, - invisibleFlag_SexVer38: 0, - invisibleFlag_SexVer39: 0, - invisibleFlag_SexVer40: 0, - invisibleFlag_SexVer41: 0, - invisibleFlag_SexVer42: 0, - invisibleFlag_SexVer43: 0, - invisibleFlag_SexVer44: 0, - invisibleFlag_SexVer45: 0, - invisibleFlag_SexVer46: 0, - invisibleFlag_SexVer47: 0, - invisibleFlag_SexVer48: 0, - invisibleFlag_SexVer49: 0, - invisibleFlag_SexVer50: 0, - invisibleFlag_SexVer51: 0, - invisibleFlag_SexVer52: 0, - invisibleFlag_SexVer53: 0, - invisibleFlag_SexVer54: 0, - invisibleFlag_SexVer55: 0, - invisibleFlag_SexVer56: 0, - invisibleFlag_SexVer57: 0, - invisibleFlag_SexVer58: 0, - invisibleFlag_SexVer59: 0, - invisibleFlag_SexVer60: 0, - invisibleFlag_SexVer61: 0, - invisibleFlag_SexVer62: 0, - invisibleFlag_SexVer63: 0, - invisibleFlag_SexVer64: 0, - invisibleFlag_SexVer65: 0, - invisibleFlag_SexVer66: 0, - invisibleFlag_SexVer67: 0, - invisibleFlag_SexVer68: 0, - invisibleFlag_SexVer69: 0, - invisibleFlag_SexVer70: 0, - invisibleFlag_SexVer71: 0, - invisibleFlag_SexVer72: 0, - invisibleFlag_SexVer73: 0, - invisibleFlag_SexVer74: 0, - invisibleFlag_SexVer75: 0, - invisibleFlag_SexVer76: 0, - invisibleFlag_SexVer77: 0, - invisibleFlag_SexVer78: 0, - invisibleFlag_SexVer79: 0, - invisibleFlag_SexVer80: 0, - invisibleFlag_SexVer81: 0, - invisibleFlag_SexVer82: 0, - invisibleFlag_SexVer83: 0, - invisibleFlag_SexVer84: 0, - invisibleFlag_SexVer85: 0, - invisibleFlag_SexVer86: 0, - invisibleFlag_SexVer87: 0, - invisibleFlag_SexVer88: 0, - invisibleFlag_SexVer89: 0, - invisibleFlag_SexVer90: 0, - invisibleFlag_SexVer91: 0, - invisibleFlag_SexVer92: 0, - invisibleFlag_SexVer93: 0, - invisibleFlag_SexVer94: 0, - invisibleFlag_SexVer95: 0, - pad404: [0;14], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct EQUIP_PARAM_WEAPON_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub behaviorVariationId: i32, - pub sortId: i32, - pub wanderingEquipId: i32, - pub weight: f32, - pub weaponWeightRate: f32, - pub fixPrice: i32, - pub reinforcePrice: i32, - pub sellValue: i32, - pub correctStrength: f32, - pub correctAgility: f32, - pub correctMagic: f32, - pub correctFaith: f32, - pub physGuardCutRate: f32, - pub magGuardCutRate: f32, - pub fireGuardCutRate: f32, - pub thunGuardCutRate: f32, - pub spEffectBehaviorId0: i32, - pub spEffectBehaviorId1: i32, - pub spEffectBehaviorId2: i32, - pub residentSpEffectId: i32, - pub residentSpEffectId1: i32, - pub residentSpEffectId2: i32, - pub materialSetId: i32, - pub originEquipWep: i32, - pub originEquipWep1: i32, - pub originEquipWep2: i32, - pub originEquipWep3: i32, - pub originEquipWep4: i32, - pub originEquipWep5: i32, - pub originEquipWep6: i32, - pub originEquipWep7: i32, - pub originEquipWep8: i32, - pub originEquipWep9: i32, - pub originEquipWep10: i32, - pub originEquipWep11: i32, - pub originEquipWep12: i32, - pub originEquipWep13: i32, - pub originEquipWep14: i32, - pub originEquipWep15: i32, - pub weakA_DamageRate: f32, - pub weakB_DamageRate: f32, - pub weakC_DamageRate: f32, - pub weakD_DamageRate: f32, - pub sleepGuardResist_MaxCorrect: f32, - pub madnessGuardResist_MaxCorrect: f32, - pub saWeaponDamage: f32, - pub equipModelId: i16, - pub iconId: i16, - pub durability: i16, - pub durabilityMax: i16, - pub attackThrowEscape: i16, - pub parryDamageLife: i16, - pub attackBasePhysics: i16, - pub attackBaseMagic: i16, - pub attackBaseFire: i16, - pub attackBaseThunder: i16, - pub attackBaseStamina: i16, - pub guardAngle: i16, - pub saDurability: f32, - pub staminaGuardDef: i16, - pub reinforceTypeId: i16, - pub trophySGradeId: i16, - pub trophySeqId: i16, - pub throwAtkRate: i16, - pub bowDistRate: i16, - pub equipModelCategory: u8, - pub equipModelGender: u8, - pub weaponCategory: u8, - pub wepmotionCategory: u8, - pub guardmotionCategory: u8, - pub atkMaterial: u8, - pub defSeMaterial1: i16, - pub correctType_Physics: u8, - pub spAttribute: u8, - pub spAtkcategory: i16, - pub wepmotionOneHandId: u8, - pub wepmotionBothHandId: u8, - pub properStrength: u8, - pub properAgility: u8, - pub properMagic: u8, - pub properFaith: u8, - pub overStrength: u8, - pub attackBaseParry: u8, - pub defenseBaseParry: u8, - pub guardBaseRepel: u8, - pub attackBaseRepel: u8, - pub guardCutCancelRate: i8, - pub guardLevel: i8, - pub slashGuardCutRate: i8, - pub blowGuardCutRate: i8, - pub thrustGuardCutRate: i8, - pub poisonGuardResist: i8, - pub diseaseGuardResist: i8, - pub bloodGuardResist: i8, - pub curseGuardResist: i8, - pub atkAttribute: u8, - bits_1: u8, - bits_2: u8, - bits_3: u8, - bits_4: u8, - bits_5: u8, - pub defSfxMaterial1: i16, - pub wepCollidableType0: u8, - pub wepCollidableType1: u8, - pub postureControlId_Right: u8, - pub postureControlId_Left: u8, - pub traceSfxId0: i32, - pub traceDmyIdHead0: i32, - pub traceDmyIdTail0: i32, - pub traceSfxId1: i32, - pub traceDmyIdHead1: i32, - pub traceDmyIdTail1: i32, - pub traceSfxId2: i32, - pub traceDmyIdHead2: i32, - pub traceDmyIdTail2: i32, - pub traceSfxId3: i32, - pub traceDmyIdHead3: i32, - pub traceDmyIdTail3: i32, - pub traceSfxId4: i32, - pub traceDmyIdHead4: i32, - pub traceDmyIdTail4: i32, - pub traceSfxId5: i32, - pub traceDmyIdHead5: i32, - pub traceDmyIdTail5: i32, - pub traceSfxId6: i32, - pub traceDmyIdHead6: i32, - pub traceDmyIdTail6: i32, - pub traceSfxId7: i32, - pub traceDmyIdHead7: i32, - pub traceDmyIdTail7: i32, - pub defSfxMaterial2: i16, - pub defSeMaterial2: i16, - pub absorpParamId: i32, - pub toughnessCorrectRate: f32, - bits_6: u8, - pub correctType_Magic: u8, - pub correctType_Fire: u8, - pub correctType_Thunder: u8, - pub weakE_DamageRate: f32, - pub weakF_DamageRate: f32, - pub darkGuardCutRate: f32, - pub attackBaseDark: i16, - pub correctType_Dark: u8, - pub correctType_Poison: u8, - pub sortGroupId: u8, - pub atkAttribute2: u8, - pub sleepGuardResist: i8, - pub madnessGuardResist: i8, - pub correctType_Blood: u8, - pub properLuck: u8, - pub freezeGuardResist: i8, - pub autoReplenishType: u8, - pub swordArtsParamId: i32, - pub correctLuck: f32, - pub arrowBoltEquipId: i32, - pub DerivationLevelType: u8, - pub enchantSfxSize: u8, - pub wepType: i16, - pub physGuardCutRate_MaxCorrect: f32, - pub magGuardCutRate_MaxCorrect: f32, - pub fireGuardCutRate_MaxCorrect: f32, - pub thunGuardCutRate_MaxCorrect: f32, - pub darkGuardCutRate_MaxCorrect: f32, - pub poisonGuardResist_MaxCorrect: f32, - pub diseaseGuardResist_MaxCorrect: f32, - pub bloodGuardResist_MaxCorrect: f32, - pub curseGuardResist_MaxCorrect: f32, - pub freezeGuardResist_MaxCorrect: f32, - pub staminaGuardDef_MaxCorrect: f32, - pub residentSfxId_1: i32, - pub residentSfxId_2: i32, - pub residentSfxId_3: i32, - pub residentSfxId_4: i32, - pub residentSfx_DmyId_1: i32, - pub residentSfx_DmyId_2: i32, - pub residentSfx_DmyId_3: i32, - pub residentSfx_DmyId_4: i32, - pub staminaConsumptionRate: f32, - pub vsPlayerDmgCorrectRate_Physics: f32, - pub vsPlayerDmgCorrectRate_Magic: f32, - pub vsPlayerDmgCorrectRate_Fire: f32, - pub vsPlayerDmgCorrectRate_Thunder: f32, - pub vsPlayerDmgCorrectRate_Dark: f32, - pub vsPlayerDmgCorrectRate_Poison: f32, - pub vsPlayerDmgCorrectRate_Blood: f32, - pub vsPlayerDmgCorrectRate_Freeze: f32, - pub attainmentWepStatusStr: i32, - pub attainmentWepStatusDex: i32, - pub attainmentWepStatusMag: i32, - pub attainmentWepStatusFai: i32, - pub attainmentWepStatusLuc: i32, - pub attackElementCorrectId: i32, - pub saleValue: i32, - pub reinforceShopCategory: u8, - pub maxArrowQuantity: u8, - bits_7: u8, - pub wepSeIdOffset: i8, - pub baseChangePrice: i32, - pub levelSyncCorrectId: i16, - pub correctType_Sleep: u8, - pub correctType_Madness: u8, - pub rarity: u8, - pub gemMountType: u8, - pub wepRegainHp: i16, - pub spEffectMsgId0: i32, - pub spEffectMsgId1: i32, - pub spEffectMsgId2: i32, - pub originEquipWep16: i32, - pub originEquipWep17: i32, - pub originEquipWep18: i32, - pub originEquipWep19: i32, - pub originEquipWep20: i32, - pub originEquipWep21: i32, - pub originEquipWep22: i32, - pub originEquipWep23: i32, - pub originEquipWep24: i32, - pub originEquipWep25: i32, - pub vsPlayerDmgCorrectRate_Sleep: f32, - pub vsPlayerDmgCorrectRate_Madness: f32, - pub saGuardCutRate: f32, - pub defMaterialVariationValue: u8, - pub spAttributeVariationValue: u8, - pub stealthAtkRate: i16, - pub vsPlayerDmgCorrectRate_Disease: f32, - pub vsPlayerDmgCorrectRate_Curse: f32, - pub pad: [u8;8], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl EQUIP_PARAM_WEAPON_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } - pub fn rightHandEquipable(&self) -> bool { - self.bits_1 & (1 << 0) != 0 - } - pub fn leftHandEquipable(&self) -> bool { - self.bits_1 & (1 << 1) != 0 - } - pub fn bothHandEquipable(&self) -> bool { - self.bits_1 & (1 << 2) != 0 - } - pub fn arrowSlotEquipable(&self) -> bool { - self.bits_1 & (1 << 3) != 0 - } - pub fn boltSlotEquipable(&self) -> bool { - self.bits_1 & (1 << 4) != 0 - } - pub fn enableGuard(&self) -> bool { - self.bits_1 & (1 << 5) != 0 - } - pub fn enableParry(&self) -> bool { - self.bits_1 & (1 << 6) != 0 - } - pub fn enableMagic(&self) -> bool { - self.bits_1 & (1 << 7) != 0 - } - pub fn enableSorcery(&self) -> bool { - self.bits_2 & (1 << 0) != 0 - } - pub fn enableMiracle(&self) -> bool { - self.bits_2 & (1 << 1) != 0 - } - pub fn enableVowMagic(&self) -> bool { - self.bits_2 & (1 << 2) != 0 - } - pub fn isNormalAttackType(&self) -> bool { - self.bits_2 & (1 << 3) != 0 - } - pub fn isBlowAttackType(&self) -> bool { - self.bits_2 & (1 << 4) != 0 - } - pub fn isSlashAttackType(&self) -> bool { - self.bits_2 & (1 << 5) != 0 - } - pub fn isThrustAttackType(&self) -> bool { - self.bits_2 & (1 << 6) != 0 - } - pub fn isEnhance(&self) -> bool { - self.bits_2 & (1 << 7) != 0 - } - pub fn isHeroPointCorrect(&self) -> bool { - self.bits_3 & (1 << 0) != 0 - } - pub fn isCustom(&self) -> bool { - self.bits_3 & (1 << 1) != 0 - } - pub fn disableBaseChangeReset(&self) -> bool { - self.bits_3 & (1 << 2) != 0 - } - pub fn disableRepair(&self) -> bool { - self.bits_3 & (1 << 3) != 0 - } - pub fn isDarkHand(&self) -> bool { - self.bits_3 & (1 << 4) != 0 - } - pub fn simpleModelForDlc(&self) -> bool { - self.bits_3 & (1 << 5) != 0 - } - pub fn lanternWep(&self) -> bool { - self.bits_3 & (1 << 6) != 0 - } - pub fn isVersusGhostWep(&self) -> bool { - self.bits_3 & (1 << 7) != 0 - } - pub fn baseChangeCategory(&self) -> bool { - self.bits_4 & (1 << 0) != 0 - } - pub fn isDragonSlayer(&self) -> bool { - self.bits_4 & (1 << 6) != 0 - } - pub fn isDeposit(&self) -> bool { - self.bits_4 & (1 << 7) != 0 - } - pub fn disableMultiDropShare(&self) -> bool { - self.bits_5 & (1 << 0) != 0 - } - pub fn isDiscard(&self) -> bool { - self.bits_5 & (1 << 1) != 0 - } - pub fn isDrop(&self) -> bool { - self.bits_5 & (1 << 2) != 0 - } - pub fn showLogCondType(&self) -> bool { - self.bits_5 & (1 << 3) != 0 - } - pub fn enableThrow(&self) -> bool { - self.bits_5 & (1 << 4) != 0 - } - pub fn showDialogCondType(&self) -> bool { - self.bits_5 & (1 << 5) != 0 - } - pub fn disableGemAttr(&self) -> bool { - self.bits_5 & (1 << 7) != 0 - } - pub fn isValidTough_ProtSADmg(&self) -> bool { - self.bits_6 & (1 << 0) != 0 - } - pub fn isDualBlade(&self) -> bool { - self.bits_6 & (1 << 1) != 0 - } - pub fn isAutoEquip(&self) -> bool { - self.bits_6 & (1 << 2) != 0 - } - pub fn isEnableEmergencyStep(&self) -> bool { - self.bits_6 & (1 << 3) != 0 - } - pub fn invisibleOnRemo(&self) -> bool { - self.bits_6 & (1 << 4) != 0 - } - pub fn unk1(&self) -> bool { - self.bits_6 & (1 << 5) != 0 - } - pub fn residentSfx_1_IsVisibleForHang(&self) -> bool { - self.bits_7 & (1 << 0) != 0 - } - pub fn residentSfx_2_IsVisibleForHang(&self) -> bool { - self.bits_7 & (1 << 1) != 0 - } - pub fn residentSfx_3_IsVisibleForHang(&self) -> bool { - self.bits_7 & (1 << 2) != 0 - } - pub fn residentSfx_4_IsVisibleForHang(&self) -> bool { - self.bits_7 & (1 << 3) != 0 - } - pub fn isSoulParamIdChange_model0(&self) -> bool { - self.bits_7 & (1 << 4) != 0 - } - pub fn isSoulParamIdChange_model1(&self) -> bool { - self.bits_7 & (1 << 5) != 0 - } - pub fn isSoulParamIdChange_model2(&self) -> bool { - self.bits_7 & (1 << 6) != 0 - } - pub fn isSoulParamIdChange_model3(&self) -> bool { - self.bits_7 & (1 << 7) != 0 - } -} -impl Default for EQUIP_PARAM_WEAPON_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - behaviorVariationId: 0, - sortId: 0, - wanderingEquipId: 0, - weight: 1., - weaponWeightRate: 0., - fixPrice: 0, - reinforcePrice: 0, - sellValue: 0, - correctStrength: 0., - correctAgility: 0., - correctMagic: 0., - correctFaith: 0., - physGuardCutRate: 0., - magGuardCutRate: 0., - fireGuardCutRate: 0., - thunGuardCutRate: 0., - spEffectBehaviorId0: -1, - spEffectBehaviorId1: -1, - spEffectBehaviorId2: -1, - residentSpEffectId: -1, - residentSpEffectId1: -1, - residentSpEffectId2: -1, - materialSetId: -1, - originEquipWep: -1, - originEquipWep1: -1, - originEquipWep2: -1, - originEquipWep3: -1, - originEquipWep4: -1, - originEquipWep5: -1, - originEquipWep6: -1, - originEquipWep7: -1, - originEquipWep8: -1, - originEquipWep9: -1, - originEquipWep10: -1, - originEquipWep11: -1, - originEquipWep12: -1, - originEquipWep13: -1, - originEquipWep14: -1, - originEquipWep15: -1, - weakA_DamageRate: 1., - weakB_DamageRate: 1., - weakC_DamageRate: 1., - weakD_DamageRate: 1., - sleepGuardResist_MaxCorrect: 0., - madnessGuardResist_MaxCorrect: 0., - saWeaponDamage: 0., - equipModelId: 0, - iconId: 0, - durability: 100, - durabilityMax: 100, - attackThrowEscape: 0, - parryDamageLife: -1, - attackBasePhysics: 100, - attackBaseMagic: 100, - attackBaseFire: 100, - attackBaseThunder: 100, - attackBaseStamina: 100, - guardAngle: 0, - saDurability: 0., - staminaGuardDef: 0, - reinforceTypeId: 0, - trophySGradeId: -1, - trophySeqId: -1, - throwAtkRate: 0, - bowDistRate: 0, - equipModelCategory: 7, - equipModelGender: 0, - weaponCategory: 0, - wepmotionCategory: 0, - guardmotionCategory: 0, - atkMaterial: 0, - defSeMaterial1: 0, - correctType_Physics: 0, - spAttribute: 0, - spAtkcategory: 0, - wepmotionOneHandId: 0, - wepmotionBothHandId: 0, - properStrength: 0, - properAgility: 0, - properMagic: 0, - properFaith: 0, - overStrength: 0, - attackBaseParry: 0, - defenseBaseParry: 0, - guardBaseRepel: 0, - attackBaseRepel: 0, - guardCutCancelRate: 0, - guardLevel: 0, - slashGuardCutRate: 0, - blowGuardCutRate: 0, - thrustGuardCutRate: 0, - poisonGuardResist: 0, - diseaseGuardResist: 0, - bloodGuardResist: 0, - curseGuardResist: 0, - atkAttribute: 0, - bits_1: 0, - bits_2: 0, - bits_3: 0, - bits_4: 0, - bits_5: 0, - defSfxMaterial1: 0, - wepCollidableType0: 1, - wepCollidableType1: 1, - postureControlId_Right: 0, - postureControlId_Left: 0, - traceSfxId0: -1, - traceDmyIdHead0: -1, - traceDmyIdTail0: -1, - traceSfxId1: -1, - traceDmyIdHead1: -1, - traceDmyIdTail1: -1, - traceSfxId2: -1, - traceDmyIdHead2: -1, - traceDmyIdTail2: -1, - traceSfxId3: -1, - traceDmyIdHead3: -1, - traceDmyIdTail3: -1, - traceSfxId4: -1, - traceDmyIdHead4: -1, - traceDmyIdTail4: -1, - traceSfxId5: -1, - traceDmyIdHead5: -1, - traceDmyIdTail5: -1, - traceSfxId6: -1, - traceDmyIdHead6: -1, - traceDmyIdTail6: -1, - traceSfxId7: -1, - traceDmyIdHead7: -1, - traceDmyIdTail7: -1, - defSfxMaterial2: 0, - defSeMaterial2: 0, - absorpParamId: -1, - toughnessCorrectRate: 0., - bits_6: 0, - correctType_Magic: 0, - correctType_Fire: 0, - correctType_Thunder: 0, - weakE_DamageRate: 1., - weakF_DamageRate: 1., - darkGuardCutRate: 0., - attackBaseDark: 0, - correctType_Dark: 0, - correctType_Poison: 0, - sortGroupId: 255, - atkAttribute2: 0, - sleepGuardResist: 0, - madnessGuardResist: 0, - correctType_Blood: 0, - properLuck: 0, - freezeGuardResist: 0, - autoReplenishType: 0, - swordArtsParamId: 0, - correctLuck: 0., - arrowBoltEquipId: 0, - DerivationLevelType: 0, - enchantSfxSize: 0, - wepType: 0, - physGuardCutRate_MaxCorrect: 0., - magGuardCutRate_MaxCorrect: 0., - fireGuardCutRate_MaxCorrect: 0., - thunGuardCutRate_MaxCorrect: 0., - darkGuardCutRate_MaxCorrect: 0., - poisonGuardResist_MaxCorrect: 0., - diseaseGuardResist_MaxCorrect: 0., - bloodGuardResist_MaxCorrect: 0., - curseGuardResist_MaxCorrect: 0., - freezeGuardResist_MaxCorrect: 0., - staminaGuardDef_MaxCorrect: 0., - residentSfxId_1: -1, - residentSfxId_2: -1, - residentSfxId_3: -1, - residentSfxId_4: -1, - residentSfx_DmyId_1: -1, - residentSfx_DmyId_2: -1, - residentSfx_DmyId_3: -1, - residentSfx_DmyId_4: -1, - staminaConsumptionRate: 1., - vsPlayerDmgCorrectRate_Physics: 1., - vsPlayerDmgCorrectRate_Magic: 1., - vsPlayerDmgCorrectRate_Fire: 1., - vsPlayerDmgCorrectRate_Thunder: 1., - vsPlayerDmgCorrectRate_Dark: 1., - vsPlayerDmgCorrectRate_Poison: 1., - vsPlayerDmgCorrectRate_Blood: 1., - vsPlayerDmgCorrectRate_Freeze: 1., - attainmentWepStatusStr: -1, - attainmentWepStatusDex: -1, - attainmentWepStatusMag: -1, - attainmentWepStatusFai: -1, - attainmentWepStatusLuc: -1, - attackElementCorrectId: 0, - saleValue: -1, - reinforceShopCategory: 0, - maxArrowQuantity: 1, - bits_7: 0, - wepSeIdOffset: 0, - baseChangePrice: 0, - levelSyncCorrectId: -1, - correctType_Sleep: 0, - correctType_Madness: 0, - rarity: 0, - gemMountType: 0, - wepRegainHp: 0, - spEffectMsgId0: -1, - spEffectMsgId1: -1, - spEffectMsgId2: -1, - originEquipWep16: -1, - originEquipWep17: -1, - originEquipWep18: -1, - originEquipWep19: -1, - originEquipWep20: -1, - originEquipWep21: -1, - originEquipWep22: -1, - originEquipWep23: -1, - originEquipWep24: -1, - originEquipWep25: -1, - vsPlayerDmgCorrectRate_Sleep: 1., - vsPlayerDmgCorrectRate_Madness: 1., - saGuardCutRate: 0., - defMaterialVariationValue: 0, - spAttributeVariationValue: 0, - stealthAtkRate: 0, - vsPlayerDmgCorrectRate_Disease: 1., - vsPlayerDmgCorrectRate_Curse: 1., - pad: [0;8], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct ESTUS_FLASK_RECOVERY_PARAM_ST { - pub host: u8, - pub invadeOrb_None: u8, - pub invadeOrb_Umbasa: u8, - pub invadeOrb_Berserker: u8, - pub invadeOrb_Sinners: u8, - pub invadeSign_None: u8, - pub invadeSign_Umbasa: u8, - pub invadeSign_Berserker: u8, - pub invadeSign_Sinners: u8, - pub invadeRing_Sinners: u8, - pub invadeRing_Rosalia: u8, - pub invadeRing_Forest: u8, - pub coopSign_None: u8, - pub coopSign_Umbasa: u8, - pub coopSign_Berserker: u8, - pub coopSign_Sinners: u8, - pub coopRing_RedHunter: u8, - pub invadeRing_Anor: u8, - pub paramReplaceRate: i16, - pub paramReplaceId: i32, - pub pad: [u8;8], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl ESTUS_FLASK_RECOVERY_PARAM_ST { -} -impl Default for ESTUS_FLASK_RECOVERY_PARAM_ST { - fn default() -> Self { - Self { - host: 0, - invadeOrb_None: 0, - invadeOrb_Umbasa: 0, - invadeOrb_Berserker: 0, - invadeOrb_Sinners: 0, - invadeSign_None: 0, - invadeSign_Umbasa: 0, - invadeSign_Berserker: 0, - invadeSign_Sinners: 0, - invadeRing_Sinners: 0, - invadeRing_Rosalia: 0, - invadeRing_Forest: 0, - coopSign_None: 0, - coopSign_Umbasa: 0, - coopSign_Berserker: 0, - coopSign_Sinners: 0, - coopRing_RedHunter: 0, - invadeRing_Anor: 0, - paramReplaceRate: 0, - paramReplaceId: -1, - pad: [0;8], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct EVENT_FLAG_USAGE_PARAM_ST { - pub usageType: u8, - pub playlogCategory: u8, - pub padding1: [u8;2], - pub flagNum: i32, - pub padding2: [u8;24], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl EVENT_FLAG_USAGE_PARAM_ST { -} -impl Default for EVENT_FLAG_USAGE_PARAM_ST { - fn default() -> Self { - Self { - usageType: 0, - playlogCategory: 0, - padding1: [0;2], - flagNum: 1, - padding2: [0;24], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct FACE_PARAM_ST { - pub face_partsId: u8, - pub skin_color_R: u8, - pub skin_color_G: u8, - pub skin_color_B: u8, - pub skin_gloss: u8, - pub skin_pores: u8, - pub face_beard: u8, - pub face_aroundEye: u8, - pub face_aroundEyeColor_R: u8, - pub face_aroundEyeColor_G: u8, - pub face_aroundEyeColor_B: u8, - pub face_cheek: u8, - pub face_cheekColor_R: u8, - pub face_cheekColor_G: u8, - pub face_cheekColor_B: u8, - pub face_eyeLine: u8, - pub face_eyeLineColor_R: u8, - pub face_eyeLineColor_G: u8, - pub face_eyeLineColor_B: u8, - pub face_eyeShadowDown: u8, - pub face_eyeShadowDownColor_R: u8, - pub face_eyeShadowDownColor_G: u8, - pub face_eyeShadowDownColor_B: u8, - pub face_eyeShadowUp: u8, - pub face_eyeShadowUpColor_R: u8, - pub face_eyeShadowUpColor_G: u8, - pub face_eyeShadowUpColor_B: u8, - pub face_lip: u8, - pub face_lipColor_R: u8, - pub face_lipColor_G: u8, - pub face_lipColor_B: u8, - pub body_hair: u8, - pub body_hairColor_R: u8, - pub body_hairColor_G: u8, - pub body_hairColor_B: u8, - pub eye_partsId: u8, - pub eyeR_irisColor_R: u8, - pub eyeR_irisColor_G: u8, - pub eyeR_irisColor_B: u8, - pub eyeR_irisScale: u8, - pub eyeR_cataract: u8, - pub eyeR_cataractColor_R: u8, - pub eyeR_cataractColor_G: u8, - pub eyeR_cataractColor_B: u8, - pub eyeR_scleraColor_R: u8, - pub eyeR_scleraColor_G: u8, - pub eyeR_scleraColor_B: u8, - pub eyeR_irisDistance: u8, - pub eyeL_irisColor_R: u8, - pub eyeL_irisColor_G: u8, - pub eyeL_irisColor_B: u8, - pub eyeL_irisScale: u8, - pub eyeL_cataract: u8, - pub eyeL_cataractColor_R: u8, - pub eyeL_cataractColor_G: u8, - pub eyeL_cataractColor_B: u8, - pub eyeL_scleraColor_R: u8, - pub eyeL_scleraColor_G: u8, - pub eyeL_scleraColor_B: u8, - pub eyeL_irisDistance: u8, - pub hair_partsId: u8, - pub hair_color_R: u8, - pub hair_color_G: u8, - pub hair_color_B: u8, - pub hair_shininess: u8, - pub hair_rootBlack: u8, - pub hair_whiteDensity: u8, - pub beard_partsId: u8, - pub beard_color_R: u8, - pub beard_color_G: u8, - pub beard_color_B: u8, - pub beard_shininess: u8, - pub beard_rootBlack: u8, - pub beard_whiteDensity: u8, - pub eyebrow_partsId: u8, - pub eyebrow_color_R: u8, - pub eyebrow_color_G: u8, - pub eyebrow_color_B: u8, - pub eyebrow_shininess: u8, - pub eyebrow_rootBlack: u8, - pub eyebrow_whiteDensity: u8, - pub eyelash_partsId: u8, - pub eyelash_color_R: u8, - pub eyelash_color_G: u8, - pub eyelash_color_B: u8, - pub accessories_partsId: u8, - pub accessories_color_R: u8, - pub accessories_color_G: u8, - pub accessories_color_B: u8, - pub decal_partsId: u8, - pub decal_posX: u8, - pub decal_posY: u8, - pub decal_angle: u8, - pub decal_scale: u8, - pub decal_color_R: u8, - pub decal_color_G: u8, - pub decal_color_B: u8, - pub decal_gloss: u8, - pub decal_mirror: u8, - pub chrBodyScaleHead: u8, - pub chrBodyScaleBreast: u8, - pub chrBodyScaleAbdomen: u8, - pub chrBodyScaleRArm: u8, - pub chrBodyScaleRLeg: u8, - pub chrBodyScaleLArm: u8, - pub chrBodyScaleLLeg: u8, - pub burn_scar: u8, - bits_0: u8, - pub pad: [u8;5], - pub age: u8, - pub gender: u8, - pub caricatureGeometry: u8, - pub caricatureTexture: u8, - pub faceGeoData00: u8, - pub faceGeoData01: u8, - pub faceGeoData02: u8, - pub faceGeoData03: u8, - pub faceGeoData04: u8, - pub faceGeoData05: u8, - pub faceGeoData06: u8, - pub faceGeoData07: u8, - pub faceGeoData08: u8, - pub faceGeoData09: u8, - pub faceGeoData10: u8, - pub faceGeoData11: u8, - pub faceGeoData12: u8, - pub faceGeoData13: u8, - pub faceGeoData14: u8, - pub faceGeoData15: u8, - pub faceGeoData16: u8, - pub faceGeoData17: u8, - pub faceGeoData18: u8, - pub faceGeoData19: u8, - pub faceGeoData20: u8, - pub faceGeoData21: u8, - pub faceGeoData22: u8, - pub faceGeoData23: u8, - pub faceGeoData24: u8, - pub faceGeoData25: u8, - pub faceGeoData26: u8, - pub faceGeoData27: u8, - pub faceGeoData28: u8, - pub faceGeoData29: u8, - pub faceGeoData30: u8, - pub faceGeoData31: u8, - pub faceGeoData32: u8, - pub faceGeoData33: u8, - pub faceGeoData34: u8, - pub faceGeoData35: u8, - pub faceGeoData36: u8, - pub faceGeoData37: u8, - pub faceGeoData38: u8, - pub faceGeoData39: u8, - pub faceGeoData40: u8, - pub faceGeoData41: u8, - pub faceGeoData42: u8, - pub faceGeoData43: u8, - pub faceGeoData44: u8, - pub faceGeoData45: u8, - pub faceGeoData46: u8, - pub faceGeoData47: u8, - pub faceGeoData48: u8, - pub faceGeoData49: u8, - pub faceGeoData50: u8, - pub faceGeoData51: u8, - pub faceGeoData52: u8, - pub faceGeoData53: u8, - pub faceGeoData54: u8, - pub faceGeoData55: u8, - pub faceGeoData56: u8, - pub faceGeoData57: u8, - pub faceGeoData58: u8, - pub faceGeoData59: u8, - pub faceGeoData60: u8, - pub faceTexData00: u8, - pub faceTexData01: u8, - pub faceTexData02: u8, - pub faceTexData03: u8, - pub faceTexData04: u8, - pub faceTexData05: u8, - pub faceTexData06: u8, - pub faceTexData07: u8, - pub faceTexData08: u8, - pub faceTexData09: u8, - pub faceTexData10: u8, - pub faceTexData11: u8, - pub faceTexData12: u8, - pub faceTexData13: u8, - pub faceTexData14: u8, - pub faceTexData15: u8, - pub faceTexData16: u8, - pub faceTexData17: u8, - pub faceTexData18: u8, - pub faceTexData19: u8, - pub faceTexData20: u8, - pub faceTexData21: u8, - pub faceTexData22: u8, - pub faceTexData23: u8, - pub faceTexData24: u8, - pub faceTexData25: u8, - pub faceTexData26: u8, - pub faceTexData27: u8, - pub faceTexData28: u8, - pub faceTexData29: u8, - pub faceTexData30: u8, - pub faceTexData31: u8, - pub faceTexData32: u8, - pub faceTexData33: u8, - pub faceTexData34: u8, - pub faceTexData35: u8, - pub faceGeoAsymData00: u8, - pub faceGeoAsymData01: u8, - pub faceGeoAsymData02: u8, - pub faceGeoAsymData03: u8, - pub faceGeoAsymData04: u8, - pub faceGeoAsymData05: u8, - pub faceGeoAsymData06: u8, - pub faceGeoAsymData07: u8, - pub faceGeoAsymData08: u8, - pub faceGeoAsymData09: u8, - pub faceGeoAsymData10: u8, - pub faceGeoAsymData11: u8, - pub faceGeoAsymData12: u8, - pub faceGeoAsymData13: u8, - pub faceGeoAsymData14: u8, - pub faceGeoAsymData15: u8, - pub faceGeoAsymData16: u8, - pub faceGeoAsymData17: u8, - pub faceGeoAsymData18: u8, - pub faceGeoAsymData19: u8, - pub faceGeoAsymData20: u8, - pub faceGeoAsymData21: u8, - pub faceGeoAsymData22: u8, - pub faceGeoAsymData23: u8, - pub faceGeoAsymData24: u8, - pub faceGeoAsymData25: u8, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl FACE_PARAM_ST { - pub fn override_eye_partsId(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn override_eye_irisColor(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } - pub fn override_eye_cataract(&self) -> bool { - self.bits_0 & (1 << 2) != 0 - } - pub fn override_eye_cataractColor(&self) -> bool { - self.bits_0 & (1 << 3) != 0 - } - pub fn override_eye_scleraColor(&self) -> bool { - self.bits_0 & (1 << 4) != 0 - } - pub fn override_burn_scar(&self) -> bool { - self.bits_0 & (1 << 5) != 0 - } - pub fn pad2(&self) -> bool { - self.bits_0 & (1 << 6) != 0 - } -} -impl Default for FACE_PARAM_ST { - fn default() -> Self { - Self { - face_partsId: 0, - skin_color_R: 128, - skin_color_G: 128, - skin_color_B: 128, - skin_gloss: 128, - skin_pores: 128, - face_beard: 128, - face_aroundEye: 128, - face_aroundEyeColor_R: 128, - face_aroundEyeColor_G: 128, - face_aroundEyeColor_B: 128, - face_cheek: 128, - face_cheekColor_R: 128, - face_cheekColor_G: 128, - face_cheekColor_B: 128, - face_eyeLine: 128, - face_eyeLineColor_R: 128, - face_eyeLineColor_G: 128, - face_eyeLineColor_B: 128, - face_eyeShadowDown: 128, - face_eyeShadowDownColor_R: 128, - face_eyeShadowDownColor_G: 128, - face_eyeShadowDownColor_B: 128, - face_eyeShadowUp: 128, - face_eyeShadowUpColor_R: 128, - face_eyeShadowUpColor_G: 128, - face_eyeShadowUpColor_B: 128, - face_lip: 128, - face_lipColor_R: 128, - face_lipColor_G: 128, - face_lipColor_B: 128, - body_hair: 128, - body_hairColor_R: 128, - body_hairColor_G: 128, - body_hairColor_B: 128, - eye_partsId: 0, - eyeR_irisColor_R: 128, - eyeR_irisColor_G: 128, - eyeR_irisColor_B: 128, - eyeR_irisScale: 128, - eyeR_cataract: 128, - eyeR_cataractColor_R: 128, - eyeR_cataractColor_G: 128, - eyeR_cataractColor_B: 128, - eyeR_scleraColor_R: 128, - eyeR_scleraColor_G: 128, - eyeR_scleraColor_B: 128, - eyeR_irisDistance: 128, - eyeL_irisColor_R: 128, - eyeL_irisColor_G: 128, - eyeL_irisColor_B: 128, - eyeL_irisScale: 128, - eyeL_cataract: 128, - eyeL_cataractColor_R: 128, - eyeL_cataractColor_G: 128, - eyeL_cataractColor_B: 128, - eyeL_scleraColor_R: 128, - eyeL_scleraColor_G: 128, - eyeL_scleraColor_B: 128, - eyeL_irisDistance: 128, - hair_partsId: 0, - hair_color_R: 128, - hair_color_G: 128, - hair_color_B: 128, - hair_shininess: 128, - hair_rootBlack: 128, - hair_whiteDensity: 128, - beard_partsId: 0, - beard_color_R: 128, - beard_color_G: 128, - beard_color_B: 128, - beard_shininess: 128, - beard_rootBlack: 128, - beard_whiteDensity: 128, - eyebrow_partsId: 0, - eyebrow_color_R: 128, - eyebrow_color_G: 128, - eyebrow_color_B: 128, - eyebrow_shininess: 128, - eyebrow_rootBlack: 128, - eyebrow_whiteDensity: 128, - eyelash_partsId: 0, - eyelash_color_R: 128, - eyelash_color_G: 128, - eyelash_color_B: 128, - accessories_partsId: 0, - accessories_color_R: 128, - accessories_color_G: 128, - accessories_color_B: 128, - decal_partsId: 0, - decal_posX: 0, - decal_posY: 0, - decal_angle: 0, - decal_scale: 0, - decal_color_R: 128, - decal_color_G: 128, - decal_color_B: 128, - decal_gloss: 128, - decal_mirror: 0, - chrBodyScaleHead: 128, - chrBodyScaleBreast: 128, - chrBodyScaleAbdomen: 128, - chrBodyScaleRArm: 128, - chrBodyScaleRLeg: 128, - chrBodyScaleLArm: 128, - chrBodyScaleLLeg: 128, - burn_scar: 0, - bits_0: 0, - pad: [0;5], - age: 128, - gender: 128, - caricatureGeometry: 128, - caricatureTexture: 128, - faceGeoData00: 128, - faceGeoData01: 128, - faceGeoData02: 128, - faceGeoData03: 128, - faceGeoData04: 128, - faceGeoData05: 128, - faceGeoData06: 128, - faceGeoData07: 128, - faceGeoData08: 128, - faceGeoData09: 128, - faceGeoData10: 128, - faceGeoData11: 128, - faceGeoData12: 128, - faceGeoData13: 128, - faceGeoData14: 128, - faceGeoData15: 128, - faceGeoData16: 128, - faceGeoData17: 128, - faceGeoData18: 128, - faceGeoData19: 128, - faceGeoData20: 128, - faceGeoData21: 128, - faceGeoData22: 128, - faceGeoData23: 128, - faceGeoData24: 128, - faceGeoData25: 128, - faceGeoData26: 128, - faceGeoData27: 128, - faceGeoData28: 128, - faceGeoData29: 128, - faceGeoData30: 128, - faceGeoData31: 128, - faceGeoData32: 128, - faceGeoData33: 128, - faceGeoData34: 128, - faceGeoData35: 128, - faceGeoData36: 128, - faceGeoData37: 128, - faceGeoData38: 128, - faceGeoData39: 128, - faceGeoData40: 128, - faceGeoData41: 128, - faceGeoData42: 128, - faceGeoData43: 128, - faceGeoData44: 128, - faceGeoData45: 128, - faceGeoData46: 128, - faceGeoData47: 128, - faceGeoData48: 128, - faceGeoData49: 128, - faceGeoData50: 128, - faceGeoData51: 128, - faceGeoData52: 128, - faceGeoData53: 128, - faceGeoData54: 128, - faceGeoData55: 128, - faceGeoData56: 128, - faceGeoData57: 128, - faceGeoData58: 128, - faceGeoData59: 128, - faceGeoData60: 128, - faceTexData00: 128, - faceTexData01: 128, - faceTexData02: 128, - faceTexData03: 128, - faceTexData04: 128, - faceTexData05: 128, - faceTexData06: 128, - faceTexData07: 128, - faceTexData08: 128, - faceTexData09: 128, - faceTexData10: 128, - faceTexData11: 128, - faceTexData12: 128, - faceTexData13: 128, - faceTexData14: 128, - faceTexData15: 128, - faceTexData16: 128, - faceTexData17: 128, - faceTexData18: 128, - faceTexData19: 128, - faceTexData20: 128, - faceTexData21: 128, - faceTexData22: 128, - faceTexData23: 128, - faceTexData24: 128, - faceTexData25: 128, - faceTexData26: 128, - faceTexData27: 128, - faceTexData28: 128, - faceTexData29: 128, - faceTexData30: 128, - faceTexData31: 128, - faceTexData32: 128, - faceTexData33: 128, - faceTexData34: 128, - faceTexData35: 128, - faceGeoAsymData00: 128, - faceGeoAsymData01: 128, - faceGeoAsymData02: 128, - faceGeoAsymData03: 128, - faceGeoAsymData04: 128, - faceGeoAsymData05: 128, - faceGeoAsymData06: 128, - faceGeoAsymData07: 128, - faceGeoAsymData08: 128, - faceGeoAsymData09: 128, - faceGeoAsymData10: 128, - faceGeoAsymData11: 128, - faceGeoAsymData12: 128, - faceGeoAsymData13: 128, - faceGeoAsymData14: 128, - faceGeoAsymData15: 128, - faceGeoAsymData16: 128, - faceGeoAsymData17: 128, - faceGeoAsymData18: 128, - faceGeoAsymData19: 128, - faceGeoAsymData20: 128, - faceGeoAsymData21: 128, - faceGeoAsymData22: 128, - faceGeoAsymData23: 128, - faceGeoAsymData24: 128, - faceGeoAsymData25: 128, - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct FACE_RANGE_PARAM_ST { - pub face_partsId: f32, - pub skin_color_R: f32, - pub skin_color_G: f32, - pub skin_color_B: f32, - pub skin_gloss: f32, - pub skin_pores: f32, - pub face_beard: f32, - pub face_aroundEye: f32, - pub face_aroundEyeColor_R: f32, - pub face_aroundEyeColor_G: f32, - pub face_aroundEyeColor_B: f32, - pub face_cheek: f32, - pub face_cheekColor_R: f32, - pub face_cheekColor_G: f32, - pub face_cheekColor_B: f32, - pub face_eyeLine: f32, - pub face_eyeLineColor_R: f32, - pub face_eyeLineColor_G: f32, - pub face_eyeLineColor_B: f32, - pub face_eyeShadowDown: f32, - pub face_eyeShadowDownColor_R: f32, - pub face_eyeShadowDownColor_G: f32, - pub face_eyeShadowDownColor_B: f32, - pub face_eyeShadowUp: f32, - pub face_eyeShadowUpColor_R: f32, - pub face_eyeShadowUpColor_G: f32, - pub face_eyeShadowUpColor_B: f32, - pub face_lip: f32, - pub face_lipColor_R: f32, - pub face_lipColor_G: f32, - pub face_lipColor_B: f32, - pub body_hair: f32, - pub body_hairColor_R: f32, - pub body_hairColor_G: f32, - pub body_hairColor_B: f32, - pub eye_partsId: f32, - pub eyeR_irisColor_R: f32, - pub eyeR_irisColor_G: f32, - pub eyeR_irisColor_B: f32, - pub eyeR_irisScale: f32, - pub eyeR_cataract: f32, - pub eyeR_cataractColor_R: f32, - pub eyeR_cataractColor_G: f32, - pub eyeR_cataractColor_B: f32, - pub eyeR_scleraColor_R: f32, - pub eyeR_scleraColor_G: f32, - pub eyeR_scleraColor_B: f32, - pub eyeR_irisDistance: f32, - pub eyeL_irisColor_R: f32, - pub eyeL_irisColor_G: f32, - pub eyeL_irisColor_B: f32, - pub eyeL_irisScale: f32, - pub eyeL_cataract: f32, - pub eyeL_cataractColor_R: f32, - pub eyeL_cataractColor_G: f32, - pub eyeL_cataractColor_B: f32, - pub eyeL_scleraColor_R: f32, - pub eyeL_scleraColor_G: f32, - pub eyeL_scleraColor_B: f32, - pub eyeL_irisDistance: f32, - pub hair_partsId: f32, - pub hair_color_R: f32, - pub hair_color_G: f32, - pub hair_color_B: f32, - pub hair_shininess: f32, - pub hair_rootBlack: f32, - pub hair_whiteDensity: f32, - pub beard_partsId: f32, - pub beard_color_R: f32, - pub beard_color_G: f32, - pub beard_color_B: f32, - pub beard_shininess: f32, - pub beard_rootBlack: f32, - pub beard_whiteDensity: f32, - pub eyebrow_partsId: f32, - pub eyebrow_color_R: f32, - pub eyebrow_color_G: f32, - pub eyebrow_color_B: f32, - pub eyebrow_shininess: f32, - pub eyebrow_rootBlack: f32, - pub eyebrow_whiteDensity: f32, - pub eyelash_partsId: f32, - pub eyelash_color_R: f32, - pub eyelash_color_G: f32, - pub eyelash_color_B: f32, - pub accessories_partsId: f32, - pub accessories_color_R: f32, - pub accessories_color_G: f32, - pub accessories_color_B: f32, - pub decal_partsId: f32, - pub decal_posX: f32, - pub decal_posY: f32, - pub decal_angle: f32, - pub decal_scale: f32, - pub decal_color_R: f32, - pub decal_color_G: f32, - pub decal_color_B: f32, - pub decal_gloss: f32, - pub decal_mirror: f32, - pub chrBodyScaleHead: f32, - pub chrBodyScaleBreast: f32, - pub chrBodyScaleAbdomen: f32, - pub chrBodyScaleArm: f32, - pub chrBodyScaleLeg: f32, - pub age: f32, - pub gender: f32, - pub caricatureGeometry: f32, - pub caricatureTexture: f32, - pub faceGeoData00: f32, - pub faceGeoData01: f32, - pub faceGeoData02: f32, - pub faceGeoData03: f32, - pub faceGeoData04: f32, - pub faceGeoData05: f32, - pub faceGeoData06: f32, - pub faceGeoData07: f32, - pub faceGeoData08: f32, - pub faceGeoData09: f32, - pub faceGeoData10: f32, - pub faceGeoData11: f32, - pub faceGeoData12: f32, - pub faceGeoData13: f32, - pub faceGeoData14: f32, - pub faceGeoData15: f32, - pub faceGeoData16: f32, - pub faceGeoData17: f32, - pub faceGeoData18: f32, - pub faceGeoData19: f32, - pub faceGeoData20: f32, - pub faceGeoData21: f32, - pub faceGeoData22: f32, - pub faceGeoData23: f32, - pub faceGeoData24: f32, - pub faceGeoData25: f32, - pub faceGeoData26: f32, - pub faceGeoData27: f32, - pub faceGeoData28: f32, - pub faceGeoData29: f32, - pub faceGeoData30: f32, - pub faceGeoData31: f32, - pub faceGeoData32: f32, - pub faceGeoData33: f32, - pub faceGeoData34: f32, - pub faceGeoData35: f32, - pub faceGeoData36: f32, - pub faceGeoData37: f32, - pub faceGeoData38: f32, - pub faceGeoData39: f32, - pub faceGeoData40: f32, - pub faceGeoData41: f32, - pub faceGeoData42: f32, - pub faceGeoData43: f32, - pub faceGeoData44: f32, - pub faceGeoData45: f32, - pub faceGeoData46: f32, - pub faceGeoData47: f32, - pub faceGeoData48: f32, - pub faceGeoData49: f32, - pub faceGeoData50: f32, - pub faceGeoData51: f32, - pub faceGeoData52: f32, - pub faceGeoData53: f32, - pub faceGeoData54: f32, - pub faceGeoData55: f32, - pub faceGeoData56: f32, - pub faceGeoData57: f32, - pub faceGeoData58: f32, - pub faceGeoData59: f32, - pub faceGeoData60: f32, - pub faceTexData00: f32, - pub faceTexData01: f32, - pub faceTexData02: f32, - pub faceTexData03: f32, - pub faceTexData04: f32, - pub faceTexData05: f32, - pub faceTexData06: f32, - pub faceTexData07: f32, - pub faceTexData08: f32, - pub faceTexData09: f32, - pub faceTexData10: f32, - pub faceTexData11: f32, - pub faceTexData12: f32, - pub faceTexData13: f32, - pub faceTexData14: f32, - pub faceTexData15: f32, - pub faceTexData16: f32, - pub faceTexData17: f32, - pub faceTexData18: f32, - pub faceTexData19: f32, - pub faceTexData20: f32, - pub faceTexData21: f32, - pub faceTexData22: f32, - pub faceTexData23: f32, - pub faceTexData24: f32, - pub faceTexData25: f32, - pub faceTexData26: f32, - pub faceTexData27: f32, - pub faceTexData28: f32, - pub faceTexData29: f32, - pub faceTexData30: f32, - pub faceTexData31: f32, - pub faceTexData32: f32, - pub faceTexData33: f32, - pub faceTexData34: f32, - pub faceTexData35: f32, - pub burn_scar: f32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl FACE_RANGE_PARAM_ST { -} -impl Default for FACE_RANGE_PARAM_ST { - fn default() -> Self { - Self { - face_partsId: 0., - skin_color_R: 0., - skin_color_G: 0., - skin_color_B: 0., - skin_gloss: 0., - skin_pores: 0., - face_beard: 0., - face_aroundEye: 0., - face_aroundEyeColor_R: 0., - face_aroundEyeColor_G: 0., - face_aroundEyeColor_B: 0., - face_cheek: 0., - face_cheekColor_R: 0., - face_cheekColor_G: 0., - face_cheekColor_B: 0., - face_eyeLine: 0., - face_eyeLineColor_R: 0., - face_eyeLineColor_G: 0., - face_eyeLineColor_B: 0., - face_eyeShadowDown: 0., - face_eyeShadowDownColor_R: 0., - face_eyeShadowDownColor_G: 0., - face_eyeShadowDownColor_B: 0., - face_eyeShadowUp: 0., - face_eyeShadowUpColor_R: 0., - face_eyeShadowUpColor_G: 0., - face_eyeShadowUpColor_B: 0., - face_lip: 0., - face_lipColor_R: 0., - face_lipColor_G: 0., - face_lipColor_B: 0., - body_hair: 0., - body_hairColor_R: 0., - body_hairColor_G: 0., - body_hairColor_B: 0., - eye_partsId: 0., - eyeR_irisColor_R: 0., - eyeR_irisColor_G: 0., - eyeR_irisColor_B: 0., - eyeR_irisScale: 0., - eyeR_cataract: 0., - eyeR_cataractColor_R: 0., - eyeR_cataractColor_G: 0., - eyeR_cataractColor_B: 0., - eyeR_scleraColor_R: 0., - eyeR_scleraColor_G: 0., - eyeR_scleraColor_B: 0., - eyeR_irisDistance: 0., - eyeL_irisColor_R: 0., - eyeL_irisColor_G: 0., - eyeL_irisColor_B: 0., - eyeL_irisScale: 0., - eyeL_cataract: 0., - eyeL_cataractColor_R: 0., - eyeL_cataractColor_G: 0., - eyeL_cataractColor_B: 0., - eyeL_scleraColor_R: 0., - eyeL_scleraColor_G: 0., - eyeL_scleraColor_B: 0., - eyeL_irisDistance: 0., - hair_partsId: 0., - hair_color_R: 0., - hair_color_G: 0., - hair_color_B: 0., - hair_shininess: 0., - hair_rootBlack: 0., - hair_whiteDensity: 0., - beard_partsId: 0., - beard_color_R: 0., - beard_color_G: 0., - beard_color_B: 0., - beard_shininess: 0., - beard_rootBlack: 0., - beard_whiteDensity: 0., - eyebrow_partsId: 0., - eyebrow_color_R: 0., - eyebrow_color_G: 0., - eyebrow_color_B: 0., - eyebrow_shininess: 0., - eyebrow_rootBlack: 0., - eyebrow_whiteDensity: 0., - eyelash_partsId: 0., - eyelash_color_R: 0., - eyelash_color_G: 0., - eyelash_color_B: 0., - accessories_partsId: 0., - accessories_color_R: 0., - accessories_color_G: 0., - accessories_color_B: 0., - decal_partsId: 0., - decal_posX: 0., - decal_posY: 0., - decal_angle: 0., - decal_scale: 0., - decal_color_R: 0., - decal_color_G: 0., - decal_color_B: 0., - decal_gloss: 0., - decal_mirror: 0., - chrBodyScaleHead: 0., - chrBodyScaleBreast: 0., - chrBodyScaleAbdomen: 0., - chrBodyScaleArm: 0., - chrBodyScaleLeg: 0., - age: 0., - gender: 0., - caricatureGeometry: 0., - caricatureTexture: 0., - faceGeoData00: 0., - faceGeoData01: 0., - faceGeoData02: 0., - faceGeoData03: 0., - faceGeoData04: 0., - faceGeoData05: 0., - faceGeoData06: 0., - faceGeoData07: 0., - faceGeoData08: 0., - faceGeoData09: 0., - faceGeoData10: 0., - faceGeoData11: 0., - faceGeoData12: 0., - faceGeoData13: 0., - faceGeoData14: 0., - faceGeoData15: 0., - faceGeoData16: 0., - faceGeoData17: 0., - faceGeoData18: 0., - faceGeoData19: 0., - faceGeoData20: 0., - faceGeoData21: 0., - faceGeoData22: 0., - faceGeoData23: 0., - faceGeoData24: 0., - faceGeoData25: 0., - faceGeoData26: 0., - faceGeoData27: 0., - faceGeoData28: 0., - faceGeoData29: 0., - faceGeoData30: 0., - faceGeoData31: 0., - faceGeoData32: 0., - faceGeoData33: 0., - faceGeoData34: 0., - faceGeoData35: 0., - faceGeoData36: 0., - faceGeoData37: 0., - faceGeoData38: 0., - faceGeoData39: 0., - faceGeoData40: 0., - faceGeoData41: 0., - faceGeoData42: 0., - faceGeoData43: 0., - faceGeoData44: 0., - faceGeoData45: 0., - faceGeoData46: 0., - faceGeoData47: 0., - faceGeoData48: 0., - faceGeoData49: 0., - faceGeoData50: 0., - faceGeoData51: 0., - faceGeoData52: 0., - faceGeoData53: 0., - faceGeoData54: 0., - faceGeoData55: 0., - faceGeoData56: 0., - faceGeoData57: 0., - faceGeoData58: 0., - faceGeoData59: 0., - faceGeoData60: 0., - faceTexData00: 0., - faceTexData01: 0., - faceTexData02: 0., - faceTexData03: 0., - faceTexData04: 0., - faceTexData05: 0., - faceTexData06: 0., - faceTexData07: 0., - faceTexData08: 0., - faceTexData09: 0., - faceTexData10: 0., - faceTexData11: 0., - faceTexData12: 0., - faceTexData13: 0., - faceTexData14: 0., - faceTexData15: 0., - faceTexData16: 0., - faceTexData17: 0., - faceTexData18: 0., - faceTexData19: 0., - faceTexData20: 0., - faceTexData21: 0., - faceTexData22: 0., - faceTexData23: 0., - faceTexData24: 0., - faceTexData25: 0., - faceTexData26: 0., - faceTexData27: 0., - faceTexData28: 0., - faceTexData29: 0., - faceTexData30: 0., - faceTexData31: 0., - faceTexData32: 0., - faceTexData33: 0., - faceTexData34: 0., - faceTexData35: 0., - burn_scar: 0., - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct FE_TEXT_EFFECT_PARAM_ST { - pub resId: i16, - pub pad1: [u8;2], - pub textId: i32, - pub seId: i32, - bits_0: u8, - pub pad2: [u8;19], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl FE_TEXT_EFFECT_PARAM_ST { - pub fn canMixMapName(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn pad3(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } -} -impl Default for FE_TEXT_EFFECT_PARAM_ST { - fn default() -> Self { - Self { - resId: 0, - pad1: [0;2], - textId: -1, - seId: -1, - bits_0: 0, - pad2: [0;19], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct FINAL_DAMAGE_RATE_PARAM_ST { - pub physRate: f32, - pub magRate: f32, - pub fireRate: f32, - pub thunRate: f32, - pub darkRate: f32, - pub staminaRate: f32, - pub saRate: f32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl FINAL_DAMAGE_RATE_PARAM_ST { -} -impl Default for FINAL_DAMAGE_RATE_PARAM_ST { - fn default() -> Self { - Self { - physRate: 0., - magRate: 0., - fireRate: 0., - thunRate: 0., - darkRate: 0., - staminaRate: 0., - saRate: 0., - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct FOOT_SFX_PARAM_ST { - pub sfxId_00: i32, - pub sfxId_01: i32, - pub sfxId_02: i32, - pub sfxId_03: i32, - pub sfxId_04: i32, - pub sfxId_05: i32, - pub sfxId_06: i32, - pub sfxId_07: i32, - pub sfxId_08: i32, - pub sfxId_09: i32, - pub sfxId_10: i32, - pub sfxId_11: i32, - pub sfxId_12: i32, - pub sfxId_13: i32, - pub sfxId_14: i32, - pub sfxId_15: i32, - pub sfxId_16: i32, - pub sfxId_17: i32, - pub sfxId_18: i32, - pub sfxId_19: i32, - pub sfxId_20: i32, - pub sfxId_21: i32, - pub sfxId_22: i32, - pub sfxId_23: i32, - pub sfxId_24: i32, - pub sfxId_25: i32, - pub sfxId_26: i32, - pub sfxId_27: i32, - pub sfxId_28: i32, - pub sfxId_29: i32, - pub sfxId_30: i32, - pub sfxId_31: i32, - pub sfxId_32: i32, - pub sfxId_33: i32, - pub sfxId_34: i32, - pub sfxId_35: i32, - pub sfxId_36: i32, - pub sfxId_37: i32, - pub sfxId_38: i32, - pub sfxId_39: i32, - pub sfxId_40: i32, - pub sfxId_41: i32, - pub sfxId_42: i32, - pub sfxId_43: i32, - pub sfxId_44: i32, - pub sfxId_45: i32, - pub sfxId_46: i32, - pub sfxId_47: i32, - pub sfxId_48: i32, - pub sfxId_49: i32, - pub sfxId_50: i32, - pub sfxId_51: i32, - pub sfxId_52: i32, - pub sfxId_53: i32, - pub sfxId_54: i32, - pub sfxId_55: i32, - pub sfxId_56: i32, - pub sfxId_57: i32, - pub sfxId_58: i32, - pub sfxId_59: i32, - pub sfxId_60: i32, - pub sfxId_61: i32, - pub sfxId_62: i32, - pub sfxId_63: i32, - pub sfxId_64: i32, - pub sfxId_65: i32, - pub sfxId_66: i32, - pub sfxId_67: i32, - pub sfxId_68: i32, - pub sfxId_69: i32, - pub sfxId_70: i32, - pub sfxId_71: i32, - pub sfxId_72: i32, - pub sfxId_73: i32, - pub sfxId_74: i32, - pub sfxId_75: i32, - pub sfxId_76: i32, - pub sfxId_77: i32, - pub sfxId_78: i32, - pub sfxId_79: i32, - pub sfxId_80: i32, - pub sfxId_81: i32, - pub sfxId_82: i32, - pub sfxId_83: i32, - pub sfxId_84: i32, - pub sfxId_85: i32, - pub sfxId_86: i32, - pub sfxId_87: i32, - pub sfxId_88: i32, - pub sfxId_89: i32, - pub sfxId_90: i32, - pub sfxId_91: i32, - pub sfxId_92: i32, - pub sfxId_93: i32, - pub sfxId_94: i32, - pub sfxId_95: i32, - pub sfxId_96: i32, - pub sfxId_97: i32, - pub sfxId_98: i32, - pub sfxId_99: i32, - pub sfxId_100: i32, - pub sfxId_101: i32, - pub sfxId_102: i32, - pub sfxId_103: i32, - pub sfxId_104: i32, - pub sfxId_105: i32, - pub sfxId_106: i32, - pub sfxId_107: i32, - pub sfxId_108: i32, - pub sfxId_109: i32, - pub sfxId_110: i32, - pub sfxId_111: i32, - pub sfxId_112: i32, - pub sfxId_113: i32, - pub sfxId_114: i32, - pub sfxId_115: i32, - pub sfxId_116: i32, - pub sfxId_117: i32, - pub sfxId_118: i32, - pub sfxId_119: i32, - pub sfxId_120: i32, - pub sfxId_121: i32, - pub sfxId_122: i32, - pub sfxId_123: i32, - pub sfxId_124: i32, - pub sfxId_125: i32, - pub sfxId_126: i32, - pub sfxId_127: i32, - pub sfxId_128: i32, - pub sfxId_129: i32, - pub sfxId_130: i32, - pub sfxId_131: i32, - pub sfxId_132: i32, - pub sfxId_133: i32, - pub sfxId_134: i32, - pub sfxId_135: i32, - pub sfxId_136: i32, - pub sfxId_137: i32, - pub sfxId_138: i32, - pub sfxId_139: i32, - pub sfxId_140: i32, - pub sfxId_141: i32, - pub sfxId_142: i32, - pub sfxId_143: i32, - pub sfxId_144: i32, - pub sfxId_145: i32, - pub sfxId_146: i32, - pub sfxId_147: i32, - pub sfxId_148: i32, - pub sfxId_149: i32, - pub sfxId_150: i32, - pub sfxId_151: i32, - pub sfxId_152: i32, - pub sfxId_153: i32, - pub sfxId_154: i32, - pub sfxId_155: i32, - pub sfxId_156: i32, - pub sfxId_157: i32, - pub sfxId_158: i32, - pub sfxId_159: i32, - pub sfxId_160: i32, - pub sfxId_161: i32, - pub sfxId_162: i32, - pub sfxId_163: i32, - pub sfxId_164: i32, - pub sfxId_165: i32, - pub sfxId_166: i32, - pub sfxId_167: i32, - pub sfxId_168: i32, - pub sfxId_169: i32, - pub sfxId_170: i32, - pub sfxId_171: i32, - pub sfxId_172: i32, - pub sfxId_173: i32, - pub sfxId_174: i32, - pub sfxId_175: i32, - pub sfxId_176: i32, - pub sfxId_177: i32, - pub sfxId_178: i32, - pub sfxId_179: i32, - pub sfxId_180: i32, - pub sfxId_181: i32, - pub sfxId_182: i32, - pub sfxId_183: i32, - pub sfxId_184: i32, - pub sfxId_185: i32, - pub sfxId_186: i32, - pub sfxId_187: i32, - pub sfxId_188: i32, - pub sfxId_189: i32, - pub sfxId_190: i32, - pub sfxId_191: i32, - pub sfxId_192: i32, - pub sfxId_193: i32, - pub sfxId_194: i32, - pub sfxId_195: i32, - pub sfxId_196: i32, - pub sfxId_197: i32, - pub sfxId_198: i32, - pub sfxId_199: i32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl FOOT_SFX_PARAM_ST { -} -impl Default for FOOT_SFX_PARAM_ST { - fn default() -> Self { - Self { - sfxId_00: 0, - sfxId_01: 0, - sfxId_02: 0, - sfxId_03: 0, - sfxId_04: 0, - sfxId_05: 0, - sfxId_06: 0, - sfxId_07: 0, - sfxId_08: 0, - sfxId_09: 0, - sfxId_10: 0, - sfxId_11: 0, - sfxId_12: 0, - sfxId_13: 0, - sfxId_14: 0, - sfxId_15: 0, - sfxId_16: 0, - sfxId_17: 0, - sfxId_18: 0, - sfxId_19: 0, - sfxId_20: 0, - sfxId_21: 0, - sfxId_22: 0, - sfxId_23: 0, - sfxId_24: 0, - sfxId_25: 0, - sfxId_26: 0, - sfxId_27: 0, - sfxId_28: 0, - sfxId_29: 0, - sfxId_30: 0, - sfxId_31: 0, - sfxId_32: 0, - sfxId_33: 0, - sfxId_34: 0, - sfxId_35: 0, - sfxId_36: 0, - sfxId_37: 0, - sfxId_38: 0, - sfxId_39: 0, - sfxId_40: 0, - sfxId_41: 0, - sfxId_42: 0, - sfxId_43: 0, - sfxId_44: 0, - sfxId_45: 0, - sfxId_46: 0, - sfxId_47: 0, - sfxId_48: 0, - sfxId_49: 0, - sfxId_50: 0, - sfxId_51: 0, - sfxId_52: 0, - sfxId_53: 0, - sfxId_54: 0, - sfxId_55: 0, - sfxId_56: 0, - sfxId_57: 0, - sfxId_58: 0, - sfxId_59: 0, - sfxId_60: 0, - sfxId_61: 0, - sfxId_62: 0, - sfxId_63: 0, - sfxId_64: 0, - sfxId_65: 0, - sfxId_66: 0, - sfxId_67: 0, - sfxId_68: 0, - sfxId_69: 0, - sfxId_70: 0, - sfxId_71: 0, - sfxId_72: 0, - sfxId_73: 0, - sfxId_74: 0, - sfxId_75: 0, - sfxId_76: 0, - sfxId_77: 0, - sfxId_78: 0, - sfxId_79: 0, - sfxId_80: 0, - sfxId_81: 0, - sfxId_82: 0, - sfxId_83: 0, - sfxId_84: 0, - sfxId_85: 0, - sfxId_86: 0, - sfxId_87: 0, - sfxId_88: 0, - sfxId_89: 0, - sfxId_90: 0, - sfxId_91: 0, - sfxId_92: 0, - sfxId_93: 0, - sfxId_94: 0, - sfxId_95: 0, - sfxId_96: 0, - sfxId_97: 0, - sfxId_98: 0, - sfxId_99: 0, - sfxId_100: 0, - sfxId_101: 0, - sfxId_102: 0, - sfxId_103: 0, - sfxId_104: 0, - sfxId_105: 0, - sfxId_106: 0, - sfxId_107: 0, - sfxId_108: 0, - sfxId_109: 0, - sfxId_110: 0, - sfxId_111: 0, - sfxId_112: 0, - sfxId_113: 0, - sfxId_114: 0, - sfxId_115: 0, - sfxId_116: 0, - sfxId_117: 0, - sfxId_118: 0, - sfxId_119: 0, - sfxId_120: 0, - sfxId_121: 0, - sfxId_122: 0, - sfxId_123: 0, - sfxId_124: 0, - sfxId_125: 0, - sfxId_126: 0, - sfxId_127: 0, - sfxId_128: 0, - sfxId_129: 0, - sfxId_130: 0, - sfxId_131: 0, - sfxId_132: 0, - sfxId_133: 0, - sfxId_134: 0, - sfxId_135: 0, - sfxId_136: 0, - sfxId_137: 0, - sfxId_138: 0, - sfxId_139: 0, - sfxId_140: 0, - sfxId_141: 0, - sfxId_142: 0, - sfxId_143: 0, - sfxId_144: 0, - sfxId_145: 0, - sfxId_146: 0, - sfxId_147: 0, - sfxId_148: 0, - sfxId_149: 0, - sfxId_150: 0, - sfxId_151: 0, - sfxId_152: 0, - sfxId_153: 0, - sfxId_154: 0, - sfxId_155: 0, - sfxId_156: 0, - sfxId_157: 0, - sfxId_158: 0, - sfxId_159: 0, - sfxId_160: 0, - sfxId_161: 0, - sfxId_162: 0, - sfxId_163: 0, - sfxId_164: 0, - sfxId_165: 0, - sfxId_166: 0, - sfxId_167: 0, - sfxId_168: 0, - sfxId_169: 0, - sfxId_170: 0, - sfxId_171: 0, - sfxId_172: 0, - sfxId_173: 0, - sfxId_174: 0, - sfxId_175: 0, - sfxId_176: 0, - sfxId_177: 0, - sfxId_178: 0, - sfxId_179: 0, - sfxId_180: 0, - sfxId_181: 0, - sfxId_182: 0, - sfxId_183: 0, - sfxId_184: 0, - sfxId_185: 0, - sfxId_186: 0, - sfxId_187: 0, - sfxId_188: 0, - sfxId_189: 0, - sfxId_190: 0, - sfxId_191: 0, - sfxId_192: 0, - sfxId_193: 0, - sfxId_194: 0, - sfxId_195: 0, - sfxId_196: 0, - sfxId_197: 0, - sfxId_198: 0, - sfxId_199: 0, - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct GAME_AREA_PARAM_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub bonusSoul_single: i32, - pub bonusSoul_multi: i32, - pub humanityPointCountFlagIdTop: i32, - pub humanityDropPoint1: i16, - pub humanityDropPoint2: i16, - pub humanityDropPoint3: i16, - pub humanityDropPoint4: i16, - pub humanityDropPoint5: i16, - pub humanityDropPoint6: i16, - pub humanityDropPoint7: i16, - pub humanityDropPoint8: i16, - pub humanityDropPoint9: i16, - pub humanityDropPoint10: i16, - pub soloBreakInPoint_Min: i32, - pub soloBreakInPoint_Max: i32, - pub defeatBossFlagId_forSignAimList: i32, - pub displayAimFlagId: i32, - pub foundBossFlagId: i32, - pub foundBossTextId: i32, - pub notFindBossTextId: i32, - pub bossChallengeFlagId: i32, - pub defeatBossFlagId: i32, - pub bossPosX: f32, - pub bossPosY: f32, - pub bossPosZ: f32, - pub bossMapAreaNo: u8, - pub bossMapBlockNo: u8, - pub bossMapMapNo: u8, - pub reserve: [u8;9], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl GAME_AREA_PARAM_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } -} -impl Default for GAME_AREA_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - bonusSoul_single: 0, - bonusSoul_multi: 0, - humanityPointCountFlagIdTop: 0, - humanityDropPoint1: 0, - humanityDropPoint2: 0, - humanityDropPoint3: 0, - humanityDropPoint4: 0, - humanityDropPoint5: 0, - humanityDropPoint6: 0, - humanityDropPoint7: 0, - humanityDropPoint8: 0, - humanityDropPoint9: 0, - humanityDropPoint10: 0, - soloBreakInPoint_Min: 0, - soloBreakInPoint_Max: 10000, - defeatBossFlagId_forSignAimList: 0, - displayAimFlagId: 0, - foundBossFlagId: 0, - foundBossTextId: -1, - notFindBossTextId: -1, - bossChallengeFlagId: 0, - defeatBossFlagId: 0, - bossPosX: 0., - bossPosY: 0., - bossPosZ: 0., - bossMapAreaNo: 0, - bossMapBlockNo: 0, - bossMapMapNo: 0, - reserve: [0;9], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct GAME_INFO_PARAM { - pub titleMsgId: i32, - pub contentMsgId: i32, - pub value: i32, - pub sortId: i32, - pub eventId: i32, - pub Pad: [u8;12], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl GAME_INFO_PARAM { -} -impl Default for GAME_INFO_PARAM { - fn default() -> Self { - Self { - titleMsgId: 0, - contentMsgId: 0, - value: 0, - sortId: 0, - eventId: 0, - Pad: [0;12], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct GAME_SYSTEM_COMMON_PARAM_ST { - pub baseToughnessRecoverTime: f32, - pub chrEventTrun_byLeft90: i32, - pub chrEventTrun_byRight90: i32, - pub chrEventTrun_byLeft180: i32, - pub chrEventTrun_byRight180: i32, - pub chrEventTrun_90TurnStartAngle: i16, - pub chrEventTrun_180TurnStartAngle: i16, - pub stealthAtkDamageRate: f32, - pub flickDamageCutRateSuccessGurad: f32, - pub npcTalkAnimBeginDiffAngle: f32, - pub npcTalkAnimEndDiffAngle: f32, - pub sleepCollectorItemActionButtonParamId: i32, - pub allowUseBuddyItem_sfxInterval: f32, - pub allowUseBuddyItem_sfxDmyPolyId: i32, - pub allowUseBuddyItem_sfxDmyPolyId_horse: i32, - pub allowUseBuddyItem_sfxId: i32, - pub onBuddySummon_inActivateRange_sfxInterval: f32, - pub onBuddySummon_inActivateRange_sfxDmyPolyId: i32, - pub onBuddySummon_inActivateRange_sfxDmyPolyId_horse: i32, - pub onBuddySummon_inActivateRange_sfxId: i32, - pub onBuddySummon_inActivateRange_spEffectId_pc: i32, - pub onBuddySummon_inWarnRange_spEffectId_pc: i32, - pub onBuddySummon_atBuddyUnsummon_spEffectId_pc: i32, - pub onBuddySummon_inWarnRange_spEffectId_buddy: i32, - pub morningIngameHour: u8, - pub morningIngameMinute: u8, - pub morningIngameSecond: u8, - pub noonIngameHour: u8, - pub noonIngameMinute: u8, - pub noonIngameSecond: u8, - pub nightIngameHour: u8, - pub nightIngameMinute: u8, - pub nightIngameSecond: u8, - pub aiSightRateStart_Morning_Hour: u8, - pub aiSightRateStart_Morning_Minute: u8, - pub aiSightRateStart_Noon_Hour: u8, - pub aiSightRateStart_Noon_Minute: u8, - pub aiSightRateStart_Evening_Hour: u8, - pub aiSightRateStart_Evening_Minute: u8, - pub aiSightRateStart_Night_Hour: u8, - pub aiSightRateStart_Night_Minute: u8, - pub aiSightRateStart_Midnight_Hour: u8, - pub aiSightRateStart_Midnight_Minute: u8, - pub saLargeDamageHitSfx_Threshold: u8, - pub saLargeDamageHitSfx_SfxId: i32, - pub signCreatableDistFromSafePos: f32, - pub guestResummonDist: f32, - pub guestLeavingMessageDistMax: f32, - pub guestLeavingMessageDistMin: f32, - pub guestLeaveSessionDist: f32, - pub retryPointAreaRadius: f32, - pub sleepCollectorSpEffectId: i32, - pub recoverBelowMaxHpCompletionNoticeSpEffectId: i32, - pub estusFlaskRecovery_AbsorptionProductionSfxId_byHp: i32, - pub estusFlaskRecovery_AbsorptionProductionSfxId_byMp: i32, - pub respawnSpecialEffectActiveCheckerSpEffectId: i32, - pub onBuddySummon_inActivateRange_spEffectId_buddy: i32, - pub estusFlaskRecovery_AddEstusTime: f32, - pub defeatMultiModeEnemyOfSoulCorrectRate_byHost: f32, - pub defeatMultiModeEnemyOfSoulCorrectRate_byTeamGhost: f32, - pub defeatMultiModeBossOfSoulCorrectRate_byHost: f32, - pub defeatMultiModeBossOfSoulCorrectRate_byTeamGhost: f32, - pub enemyHpGaugeScreenOffset_byUp: i16, - pub playRegionCollectDist: i16, - pub enemyDetectionSpEffect_ShootBulletDummypolyId: i16, - pub bigRuneGreaterDemonBreakInGoodsNum: i16, - pub bigRuneGreaterDemonBreakInGoodsId: i32, - pub rideJumpRegionDefaultSfxId: i32, - pub saAttackRate_forVsRideAtk: f32, - pub enemySpEffectIdAfterSleepCollectorItemLot: i32, - pub afterEndingMapUid: i32, - pub afterEndingReturnPointEntityId: i32, - pub enemyDetectionSpEffect_BulletId_byCoopRing_RedHunter: i32, - pub enemyDetectionSpEffect_BulletId_byInvadeOrb_None: i32, - pub tutorialFlagOnAccessDistView: i32, - pub tutorialFlagOnAccessRetryPoint: i32, - pub tutorialFlagOnGetGroupReward: i32, - pub tutorialFlagOnEnterRideJumpRegion: i32, - pub tutorialCheckRideJumpRegionExpandRange: f32, - pub retryPointActivatedPcAnimId: i32, - pub retryPointActivatedDialogDelayTime: f32, - pub retryPointActivatedDialogTextId: i32, - pub signPuddleOpenPcAnimId: i32, - pub signPuddleOpenDialogDelayTime: f32, - pub activityOfDeadSpEffect_BulletId: i32, - pub activityOfDeadSpEffect_ShootBulletDummypolyId: i32, - pub activityOfDeadSpEffect_DeadFadeOutTime: f32, - pub ignorNetStateSyncTime_ForThrow: f32, - pub netPenaltyPointLanDisconnect: i16, - pub netPenaltyPointProfileSignout: i16, - pub netPenaltyPointReboot: i16, - pub netPnaltyPointSuspend: i16, - pub netPenaltyForgiveItemLimitTime: f32, - pub netPenaltyPointThreshold: i16, - pub uncontrolledMoveThresholdTime: i16, - pub enemyDetectionSpEffect_BulletId_byNpcEnemy: i32, - pub activityOfDeadTargetSearchSpEffect_OnHitSpEffect: i32, - pub activityOfDeadTargetSearchSpEffect_MaxLength: f32, - pub sightRangeLowerPromiseRate: f32, - pub saLargeDamageHitSfx_MinDamage: i16, - pub saLargeDamageHitSfx_ForceDamage: i16, - pub soloBreakInMaxPoint: i32, - pub npcTalkTimeOutThreshold: f32, - pub sendPlayLogIntervalTime: f32, - pub item370_MaxSfxNum: u8, - pub chrActivateDist_forLeavePC: u8, - pub summonDataCoopMatchingLevelUpperAbs: i16, - pub summonDataCoopMatchingLevelUpperRel: i16, - pub summonDataCoopMatchingWepLevelMul: i16, - pub pickUpBerserkerSignSpEffectBulletId: i32, - pub succeedBerserkerSelfKillingEffectId: i32, - pub machingLevelWhiteSignUpperRel: u8, - pub machingLevelWhiteSignUpperAbs: u8, - pub machingLevelRedSignUpperRel: u8, - pub machingLevelRedSignUpperAbs: u8, - pub machingWeaponLevelUpperWhiteSign_0: u8, - pub machingWeaponLevelUpperWhiteSign_1: u8, - pub machingWeaponLevelUpperWhiteSign_2: u8, - pub machingWeaponLevelUpperWhiteSign_3: u8, - pub machingWeaponLevelUpperWhiteSign_4: u8, - pub machingWeaponLevelUpperWhiteSign_5: u8, - pub machingWeaponLevelUpperWhiteSign_6: u8, - pub machingWeaponLevelUpperWhiteSign_7: u8, - pub machingWeaponLevelUpperWhiteSign_8: u8, - pub machingWeaponLevelUpperWhiteSign_9: u8, - pub machingWeaponLevelUpperWhiteSign_10: u8, - pub machingWeaponLevelUpperRedSign_0: u8, - pub machingWeaponLevelUpperRedSign_1: u8, - pub machingWeaponLevelUpperRedSign_2: u8, - pub machingWeaponLevelUpperRedSign_3: u8, - pub machingWeaponLevelUpperRedSign_4: u8, - pub machingWeaponLevelUpperRedSign_5: u8, - pub machingWeaponLevelUpperRedSign_6: u8, - pub machingWeaponLevelUpperRedSign_7: u8, - pub machingWeaponLevelUpperRedSign_8: u8, - pub machingWeaponLevelUpperRedSign_9: u8, - pub machingWeaponLevelUpperRedSign_10: u8, - pub autoInvadePoint_generateDist: u8, - pub autoInvadePoint_cancelDist: u8, - pub sendGlobalEventLogIntervalTime: f32, - pub addSoloBreakInPoint_White: i16, - pub addSoloBreakInPoint_Black: i16, - pub addSoloBreakInPoint_ForceJoin: i16, - pub addSoloBreakInPoint_VisitorGuardian: i16, - pub addSoloBreakInPoint_VisitorRedHunter: i16, - pub invincibleTimer_forNetPC_initSync: u8, - pub invincibleTimer_forNetPC: u8, - pub redHunter_HostBossAreaGetSoulRate: f32, - pub ghostFootprintDecalParamId: i32, - pub leaveAroundHostWarningTime: f32, - pub hostModeCostItemId: i32, - pub aIJump_DecelerateParam: f32, - pub buddyDisappearDelaySec: f32, - pub aIJump_AnimYMoveCorrectRate_onJumpOff: f32, - pub stealthSystemSightRate_NotInStealthRigid_NotSightHide_StealthMode: f32, - pub stealthSystemSightRate_NotInStealthRigid_SightHide_NotStealthMode: f32, - pub stealthSystemSightRate_NotInStealthRigid_SightHide_StealthMode: f32, - pub stealthSystemSightRate_InStealthRigid_NotSightHide_NotStealthMode: f32, - pub stealthSystemSightRate_InStealthRigid_NotSightHide_StealthMode: f32, - pub stealthSystemSightRate_InStealthRigid_SightHide_NotStealthMode: f32, - pub stealthSystemSightRate_InStealthRigid_SightHide_StealthMode: f32, - pub msbEventGeomTreasureInfo_actionButtonParamId_corpse: i32, - pub msbEventGeomTreasureInfo_itemGetAnimId_corpse: i32, - pub msbEventGeomTreasureInfo_actionButtonParamId_box: i32, - pub msbEventGeomTreasureInfo_itemGetAnimId_box: i32, - pub msbEventGeomTreasureInfo_actionButtonParamId_shine: i32, - pub msbEventGeomTreasureInfo_itemGetAnimId_shine: i32, - pub signPuddleAssetId: i32, - pub signPuddleAppearDmypolyId0: i32, - pub signPuddleAppearDmypolyId1: i32, - pub signPuddleAppearDmypolyId2: i32, - pub signPuddleAppearDmypolyId3: i32, - pub fallDamageRate_forRidePC: f32, - pub fallDamageRate_forRideNPC: f32, - pub OldMonkOfYellow_CreateSignSpEffectId: i32, - pub StragglerActivateDist: f32, - pub SpEffectId_EnableUseItem_StragglerActivate: i32, - pub SpEffectId_StragglerWakeUp: i32, - pub SpEffectId_StragglerTarget: i32, - pub SpEffectId_StragglerOppose: i32, - pub buddyWarp_TriggerTimeRayBlocked: f32, - pub buddyWarp_TriggerDistToPlayer: f32, - pub buddyWarp_ThresholdTimePathStacked: f32, - pub buddyWarp_ThresholdRangePathStacked: f32, - pub aiSightRate_morning: f32, - pub aiSightRate_noonA: f32, - pub buddyPassThroughTriggerTime: f32, - pub aiSightRate_evening: f32, - pub aiSightRate_night: f32, - pub aiSightRate_midnightA: f32, - pub reserve4_2: [u8;4], - pub aiSightRate_sunloss_light: f32, - pub aiSightRate_sunloss_dark: f32, - pub aiSightRate_sunloss_veryDark: f32, - pub stealthSystemSightAngleReduceRate_NotInStealthRigid_NotSightHide_StealthMode: f32, - pub stealthSystemSightAngleReduceRate_NotInStealthRigid_SightHide_NotStealthMode: f32, - pub stealthSystemSightAngleReduceRate_NotInStealthRigid_SightHide_StealthMode: f32, - pub stealthSystemSightAngleReduceRate_InStealthRigid_NotSightHide_NotStealthMode: f32, - pub stealthSystemSightAngleReduceRate_InStealthRigid_NotSightHide_StealthMode: f32, - pub stealthSystemSightAngleReduceRate_InStealthRigid_SightHide_NotStealthMode: f32, - pub stealthSystemSightAngleReduceRate_InStealthRigid_SightHide_StealthMode: f32, - pub weatherLotConditionStart_Morning_Hour: u8, - pub weatherLotConditionStart_Morning_Minute: u8, - pub weatherLotConditionStart_Day_Hour: u8, - pub weatherLotConditionStart_Day_Minute: u8, - pub weatherLotConditionStart_Evening_Hour: u8, - pub weatherLotConditionStart_Evening_Minute: u8, - pub weatherLotConditionStart_Night_Hour: u8, - pub weatherLotConditionStart_Night_Minute: u8, - pub weatherLotConditionStart_DayBreak_Hour: u8, - pub weatherLotConditionStart_DayBreak_Minute: u8, - pub weatherLotCondition_reserved: [u8;2], - pub pclightScaleChangeStart_Hour: u8, - pub pclightScaleChangeStart_Minute: u8, - pub pclightScaleChangeEnd_Hour: u8, - pub pclightScaleChangeEnd_Minute: u8, - pub pclightScaleByTimezone: f32, - pub bigRuneGreaterDemon_SummonBuddySpecialEffectId_Buddy: i32, - pub bigRuneGreaterDemon_SummonBuddySpecialEffectId_Pc: i32, - pub homeBonfireParamId: i32, - pub machingWeaponLevelUpperWhiteSign_11: u8, - pub machingWeaponLevelUpperWhiteSign_12: u8, - pub machingWeaponLevelUpperWhiteSign_13: u8, - pub machingWeaponLevelUpperWhiteSign_14: u8, - pub machingWeaponLevelUpperWhiteSign_15: u8, - pub machingWeaponLevelUpperWhiteSign_16: u8, - pub machingWeaponLevelUpperWhiteSign_17: u8, - pub machingWeaponLevelUpperWhiteSign_18: u8, - pub machingWeaponLevelUpperWhiteSign_19: u8, - pub machingWeaponLevelUpperWhiteSign_20: u8, - pub machingWeaponLevelUpperWhiteSign_21: u8, - pub machingWeaponLevelUpperWhiteSign_22: u8, - pub machingWeaponLevelUpperWhiteSign_23: u8, - pub machingWeaponLevelUpperWhiteSign_24: u8, - pub machingWeaponLevelUpperWhiteSign_25: u8, - pub machingWeaponLevelUpperRedSign_11: u8, - pub machingWeaponLevelUpperRedSign_12: u8, - pub machingWeaponLevelUpperRedSign_13: u8, - pub machingWeaponLevelUpperRedSign_14: u8, - pub machingWeaponLevelUpperRedSign_15: u8, - pub machingWeaponLevelUpperRedSign_16: u8, - pub machingWeaponLevelUpperRedSign_17: u8, - pub machingWeaponLevelUpperRedSign_18: u8, - pub machingWeaponLevelUpperRedSign_19: u8, - pub machingWeaponLevelUpperRedSign_20: u8, - pub machingWeaponLevelUpperRedSign_21: u8, - pub machingWeaponLevelUpperRedSign_22: u8, - pub machingWeaponLevelUpperRedSign_23: u8, - pub machingWeaponLevelUpperRedSign_24: u8, - pub machingWeaponLevelUpperRedSign_25: u8, - pub menuTimezoneStart_Morning_Hour: u8, - pub menuTimezoneStart_Morning_Minute: u8, - pub menuTimezoneStart_Day1_Hour: u8, - pub menuTimezoneStart_Day1_Minute: u8, - pub menuTimezoneStart_Day2_Hour: u8, - pub menuTimezoneStart_Day2_Minute: u8, - pub menuTimezoneStart_Evening_Hour: u8, - pub menuTimezoneStart_Evening_Minute: u8, - pub menuTimezoneStart_Night_Hour: u8, - pub menuTimezoneStart_Night_Minute: u8, - pub menuTimezoneStart_Midnight_Hour: u8, - pub menuTimezoneStart_Midnight_Minute: u8, - pub remotePlayerThreatLvNotify_ThreatLv: i16, - pub remotePlayerThreatLvNotify_NotifyDist: f32, - pub remotePlayerThreatLvNotify_EndNotifyDist: f32, - pub worldMapPointDiscoveryExpandRange: f32, - pub worldMapPointReentryExpandRange: f32, - pub remotePlayerThreatLvNotify_NotifyTime: i16, - pub breakIn_A_rebreakInGoodsNum: i16, - pub breakIn_A_rebreakInGoodsId: i32, - pub rideJumpoff_SfxId: i32, - pub rideJumpoff_SfxHeightOffset: f32, - pub rideJumpoff_SpEffectId: i32, - pub rideJumpoff_SpEffectIdPc: i32, - pub unlockExchangeMenuEventFlagId: i32, - pub unlockMessageMenuEventFlagId: i32, - pub breakInOnce_A_rebreakInGoodsNum: i16, - pub breakIn_B_rebreakInGoodsNum: i16, - pub breakInOnce_A_rebreakInGoodsId: i32, - pub breakIn_B_rebreakInGoodsId: i32, - pub actionButtonInputCancelTime: f32, - pub blockClearBonusDelayTime: f32, - pub bonfireCheckEnemyRange: f32, - pub reserved_124: [u8;48], - pub reserved_124_1: [u8;32], - pub unkR00: f32, - pub unkR04: f32, - pub unkR08: f32, - pub unkR12: f32, - pub unkR16: f32, - pub unkR20: f32, - pub unkR24: f32, - pub unkR28: f32, - pub unkR32: f32, - pub unkR36: f32, - pub unkR40: f32, - pub unkR44: f32, - pub unkR48: f32, - pub unkR52: f32, - pub reserved_124_2: [u8;40], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl GAME_SYSTEM_COMMON_PARAM_ST { -} -impl Default for GAME_SYSTEM_COMMON_PARAM_ST { - fn default() -> Self { - Self { - baseToughnessRecoverTime: 0., - chrEventTrun_byLeft90: 0, - chrEventTrun_byRight90: 0, - chrEventTrun_byLeft180: 0, - chrEventTrun_byRight180: 0, - chrEventTrun_90TurnStartAngle: 0, - chrEventTrun_180TurnStartAngle: 0, - stealthAtkDamageRate: 0., - flickDamageCutRateSuccessGurad: 0., - npcTalkAnimBeginDiffAngle: 0., - npcTalkAnimEndDiffAngle: 0., - sleepCollectorItemActionButtonParamId: -1, - allowUseBuddyItem_sfxInterval: 0., - allowUseBuddyItem_sfxDmyPolyId: -1, - allowUseBuddyItem_sfxDmyPolyId_horse: -1, - allowUseBuddyItem_sfxId: -1, - onBuddySummon_inActivateRange_sfxInterval: 0., - onBuddySummon_inActivateRange_sfxDmyPolyId: -1, - onBuddySummon_inActivateRange_sfxDmyPolyId_horse: -1, - onBuddySummon_inActivateRange_sfxId: -1, - onBuddySummon_inActivateRange_spEffectId_pc: -1, - onBuddySummon_inWarnRange_spEffectId_pc: -1, - onBuddySummon_atBuddyUnsummon_spEffectId_pc: -1, - onBuddySummon_inWarnRange_spEffectId_buddy: -1, - morningIngameHour: 0, - morningIngameMinute: 0, - morningIngameSecond: 0, - noonIngameHour: 0, - noonIngameMinute: 0, - noonIngameSecond: 0, - nightIngameHour: 0, - nightIngameMinute: 0, - nightIngameSecond: 0, - aiSightRateStart_Morning_Hour: 0, - aiSightRateStart_Morning_Minute: 0, - aiSightRateStart_Noon_Hour: 0, - aiSightRateStart_Noon_Minute: 0, - aiSightRateStart_Evening_Hour: 0, - aiSightRateStart_Evening_Minute: 0, - aiSightRateStart_Night_Hour: 0, - aiSightRateStart_Night_Minute: 0, - aiSightRateStart_Midnight_Hour: 0, - aiSightRateStart_Midnight_Minute: 0, - saLargeDamageHitSfx_Threshold: 0, - saLargeDamageHitSfx_SfxId: 0, - signCreatableDistFromSafePos: 0., - guestResummonDist: 0., - guestLeavingMessageDistMax: 0., - guestLeavingMessageDistMin: 0., - guestLeaveSessionDist: 0., - retryPointAreaRadius: -1., - sleepCollectorSpEffectId: -1, - recoverBelowMaxHpCompletionNoticeSpEffectId: 0, - estusFlaskRecovery_AbsorptionProductionSfxId_byHp: 0, - estusFlaskRecovery_AbsorptionProductionSfxId_byMp: 0, - respawnSpecialEffectActiveCheckerSpEffectId: 0, - onBuddySummon_inActivateRange_spEffectId_buddy: -1, - estusFlaskRecovery_AddEstusTime: 0., - defeatMultiModeEnemyOfSoulCorrectRate_byHost: 0., - defeatMultiModeEnemyOfSoulCorrectRate_byTeamGhost: 0., - defeatMultiModeBossOfSoulCorrectRate_byHost: 0., - defeatMultiModeBossOfSoulCorrectRate_byTeamGhost: 0., - enemyHpGaugeScreenOffset_byUp: 0, - playRegionCollectDist: 0, - enemyDetectionSpEffect_ShootBulletDummypolyId: 0, - bigRuneGreaterDemonBreakInGoodsNum: 0, - bigRuneGreaterDemonBreakInGoodsId: -1, - rideJumpRegionDefaultSfxId: 0, - saAttackRate_forVsRideAtk: 1., - enemySpEffectIdAfterSleepCollectorItemLot: -1, - afterEndingMapUid: 0, - afterEndingReturnPointEntityId: 0, - enemyDetectionSpEffect_BulletId_byCoopRing_RedHunter: 0, - enemyDetectionSpEffect_BulletId_byInvadeOrb_None: 0, - tutorialFlagOnAccessDistView: 0, - tutorialFlagOnAccessRetryPoint: 0, - tutorialFlagOnGetGroupReward: 0, - tutorialFlagOnEnterRideJumpRegion: 0, - tutorialCheckRideJumpRegionExpandRange: 0., - retryPointActivatedPcAnimId: -1, - retryPointActivatedDialogDelayTime: 0., - retryPointActivatedDialogTextId: -1, - signPuddleOpenPcAnimId: -1, - signPuddleOpenDialogDelayTime: 0., - activityOfDeadSpEffect_BulletId: 0, - activityOfDeadSpEffect_ShootBulletDummypolyId: 0, - activityOfDeadSpEffect_DeadFadeOutTime: 0., - ignorNetStateSyncTime_ForThrow: 0., - netPenaltyPointLanDisconnect: 0, - netPenaltyPointProfileSignout: 0, - netPenaltyPointReboot: 0, - netPnaltyPointSuspend: 0, - netPenaltyForgiveItemLimitTime: 0., - netPenaltyPointThreshold: 0, - uncontrolledMoveThresholdTime: 0, - enemyDetectionSpEffect_BulletId_byNpcEnemy: 0, - activityOfDeadTargetSearchSpEffect_OnHitSpEffect: 0, - activityOfDeadTargetSearchSpEffect_MaxLength: 0., - sightRangeLowerPromiseRate: 0., - saLargeDamageHitSfx_MinDamage: -1, - saLargeDamageHitSfx_ForceDamage: -1, - soloBreakInMaxPoint: 0, - npcTalkTimeOutThreshold: 0., - sendPlayLogIntervalTime: 0., - item370_MaxSfxNum: 0, - chrActivateDist_forLeavePC: 0, - summonDataCoopMatchingLevelUpperAbs: 0, - summonDataCoopMatchingLevelUpperRel: 0, - summonDataCoopMatchingWepLevelMul: 0, - pickUpBerserkerSignSpEffectBulletId: 0, - succeedBerserkerSelfKillingEffectId: 0, - machingLevelWhiteSignUpperRel: 0, - machingLevelWhiteSignUpperAbs: 0, - machingLevelRedSignUpperRel: 0, - machingLevelRedSignUpperAbs: 0, - machingWeaponLevelUpperWhiteSign_0: 0, - machingWeaponLevelUpperWhiteSign_1: 0, - machingWeaponLevelUpperWhiteSign_2: 0, - machingWeaponLevelUpperWhiteSign_3: 0, - machingWeaponLevelUpperWhiteSign_4: 0, - machingWeaponLevelUpperWhiteSign_5: 0, - machingWeaponLevelUpperWhiteSign_6: 0, - machingWeaponLevelUpperWhiteSign_7: 0, - machingWeaponLevelUpperWhiteSign_8: 0, - machingWeaponLevelUpperWhiteSign_9: 0, - machingWeaponLevelUpperWhiteSign_10: 0, - machingWeaponLevelUpperRedSign_0: 0, - machingWeaponLevelUpperRedSign_1: 0, - machingWeaponLevelUpperRedSign_2: 0, - machingWeaponLevelUpperRedSign_3: 0, - machingWeaponLevelUpperRedSign_4: 0, - machingWeaponLevelUpperRedSign_5: 0, - machingWeaponLevelUpperRedSign_6: 0, - machingWeaponLevelUpperRedSign_7: 0, - machingWeaponLevelUpperRedSign_8: 0, - machingWeaponLevelUpperRedSign_9: 0, - machingWeaponLevelUpperRedSign_10: 0, - autoInvadePoint_generateDist: 40, - autoInvadePoint_cancelDist: 20, - sendGlobalEventLogIntervalTime: 0., - addSoloBreakInPoint_White: 0, - addSoloBreakInPoint_Black: 0, - addSoloBreakInPoint_ForceJoin: 0, - addSoloBreakInPoint_VisitorGuardian: 0, - addSoloBreakInPoint_VisitorRedHunter: 0, - invincibleTimer_forNetPC_initSync: 0, - invincibleTimer_forNetPC: 10, - redHunter_HostBossAreaGetSoulRate: 0., - ghostFootprintDecalParamId: 0, - leaveAroundHostWarningTime: 0., - hostModeCostItemId: 0, - aIJump_DecelerateParam: 0., - buddyDisappearDelaySec: 0., - aIJump_AnimYMoveCorrectRate_onJumpOff: 0., - stealthSystemSightRate_NotInStealthRigid_NotSightHide_StealthMode: 1., - stealthSystemSightRate_NotInStealthRigid_SightHide_NotStealthMode: 1., - stealthSystemSightRate_NotInStealthRigid_SightHide_StealthMode: 1., - stealthSystemSightRate_InStealthRigid_NotSightHide_NotStealthMode: 1., - stealthSystemSightRate_InStealthRigid_NotSightHide_StealthMode: 1., - stealthSystemSightRate_InStealthRigid_SightHide_NotStealthMode: 1., - stealthSystemSightRate_InStealthRigid_SightHide_StealthMode: 1., - msbEventGeomTreasureInfo_actionButtonParamId_corpse: 0, - msbEventGeomTreasureInfo_itemGetAnimId_corpse: 0, - msbEventGeomTreasureInfo_actionButtonParamId_box: 0, - msbEventGeomTreasureInfo_itemGetAnimId_box: 0, - msbEventGeomTreasureInfo_actionButtonParamId_shine: 0, - msbEventGeomTreasureInfo_itemGetAnimId_shine: 0, - signPuddleAssetId: 0, - signPuddleAppearDmypolyId0: 0, - signPuddleAppearDmypolyId1: 0, - signPuddleAppearDmypolyId2: 0, - signPuddleAppearDmypolyId3: 0, - fallDamageRate_forRidePC: 1., - fallDamageRate_forRideNPC: 1., - OldMonkOfYellow_CreateSignSpEffectId: 0, - StragglerActivateDist: 0., - SpEffectId_EnableUseItem_StragglerActivate: -1, - SpEffectId_StragglerWakeUp: -1, - SpEffectId_StragglerTarget: -1, - SpEffectId_StragglerOppose: -1, - buddyWarp_TriggerTimeRayBlocked: 10., - buddyWarp_TriggerDistToPlayer: 25., - buddyWarp_ThresholdTimePathStacked: 5., - buddyWarp_ThresholdRangePathStacked: 1., - aiSightRate_morning: 1., - aiSightRate_noonA: 1., - buddyPassThroughTriggerTime: 0.5, - aiSightRate_evening: 1., - aiSightRate_night: 1., - aiSightRate_midnightA: 1., - reserve4_2: [0;4], - aiSightRate_sunloss_light: 1., - aiSightRate_sunloss_dark: 1., - aiSightRate_sunloss_veryDark: 1., - stealthSystemSightAngleReduceRate_NotInStealthRigid_NotSightHide_StealthMode: 0., - stealthSystemSightAngleReduceRate_NotInStealthRigid_SightHide_NotStealthMode: 0., - stealthSystemSightAngleReduceRate_NotInStealthRigid_SightHide_StealthMode: 0., - stealthSystemSightAngleReduceRate_InStealthRigid_NotSightHide_NotStealthMode: 0., - stealthSystemSightAngleReduceRate_InStealthRigid_NotSightHide_StealthMode: 0., - stealthSystemSightAngleReduceRate_InStealthRigid_SightHide_NotStealthMode: 0., - stealthSystemSightAngleReduceRate_InStealthRigid_SightHide_StealthMode: 0., - weatherLotConditionStart_Morning_Hour: 7, - weatherLotConditionStart_Morning_Minute: 0, - weatherLotConditionStart_Day_Hour: 12, - weatherLotConditionStart_Day_Minute: 0, - weatherLotConditionStart_Evening_Hour: 17, - weatherLotConditionStart_Evening_Minute: 0, - weatherLotConditionStart_Night_Hour: 19, - weatherLotConditionStart_Night_Minute: 0, - weatherLotConditionStart_DayBreak_Hour: 5, - weatherLotConditionStart_DayBreak_Minute: 0, - weatherLotCondition_reserved: [0;2], - pclightScaleChangeStart_Hour: 18, - pclightScaleChangeStart_Minute: 0, - pclightScaleChangeEnd_Hour: 5, - pclightScaleChangeEnd_Minute: 0, - pclightScaleByTimezone: 1., - bigRuneGreaterDemon_SummonBuddySpecialEffectId_Buddy: -1, - bigRuneGreaterDemon_SummonBuddySpecialEffectId_Pc: -1, - homeBonfireParamId: 0, - machingWeaponLevelUpperWhiteSign_11: 0, - machingWeaponLevelUpperWhiteSign_12: 0, - machingWeaponLevelUpperWhiteSign_13: 0, - machingWeaponLevelUpperWhiteSign_14: 0, - machingWeaponLevelUpperWhiteSign_15: 0, - machingWeaponLevelUpperWhiteSign_16: 0, - machingWeaponLevelUpperWhiteSign_17: 0, - machingWeaponLevelUpperWhiteSign_18: 0, - machingWeaponLevelUpperWhiteSign_19: 0, - machingWeaponLevelUpperWhiteSign_20: 0, - machingWeaponLevelUpperWhiteSign_21: 0, - machingWeaponLevelUpperWhiteSign_22: 0, - machingWeaponLevelUpperWhiteSign_23: 0, - machingWeaponLevelUpperWhiteSign_24: 0, - machingWeaponLevelUpperWhiteSign_25: 0, - machingWeaponLevelUpperRedSign_11: 0, - machingWeaponLevelUpperRedSign_12: 0, - machingWeaponLevelUpperRedSign_13: 0, - machingWeaponLevelUpperRedSign_14: 0, - machingWeaponLevelUpperRedSign_15: 0, - machingWeaponLevelUpperRedSign_16: 0, - machingWeaponLevelUpperRedSign_17: 0, - machingWeaponLevelUpperRedSign_18: 0, - machingWeaponLevelUpperRedSign_19: 0, - machingWeaponLevelUpperRedSign_20: 0, - machingWeaponLevelUpperRedSign_21: 0, - machingWeaponLevelUpperRedSign_22: 0, - machingWeaponLevelUpperRedSign_23: 0, - machingWeaponLevelUpperRedSign_24: 0, - machingWeaponLevelUpperRedSign_25: 0, - menuTimezoneStart_Morning_Hour: 7, - menuTimezoneStart_Morning_Minute: 0, - menuTimezoneStart_Day1_Hour: 12, - menuTimezoneStart_Day1_Minute: 0, - menuTimezoneStart_Day2_Hour: 12, - menuTimezoneStart_Day2_Minute: 0, - menuTimezoneStart_Evening_Hour: 17, - menuTimezoneStart_Evening_Minute: 0, - menuTimezoneStart_Night_Hour: 19, - menuTimezoneStart_Night_Minute: 0, - menuTimezoneStart_Midnight_Hour: 5, - menuTimezoneStart_Midnight_Minute: 0, - remotePlayerThreatLvNotify_ThreatLv: 0, - remotePlayerThreatLvNotify_NotifyDist: 0., - remotePlayerThreatLvNotify_EndNotifyDist: 0., - worldMapPointDiscoveryExpandRange: 0., - worldMapPointReentryExpandRange: 0., - remotePlayerThreatLvNotify_NotifyTime: 0, - breakIn_A_rebreakInGoodsNum: 0, - breakIn_A_rebreakInGoodsId: -1, - rideJumpoff_SfxId: -1, - rideJumpoff_SfxHeightOffset: 0., - rideJumpoff_SpEffectId: -1, - rideJumpoff_SpEffectIdPc: -1, - unlockExchangeMenuEventFlagId: 0, - unlockMessageMenuEventFlagId: 0, - breakInOnce_A_rebreakInGoodsNum: 0, - breakIn_B_rebreakInGoodsNum: 0, - breakInOnce_A_rebreakInGoodsId: -1, - breakIn_B_rebreakInGoodsId: -1, - actionButtonInputCancelTime: -1., - blockClearBonusDelayTime: 7., - bonfireCheckEnemyRange: -1., - reserved_124: [0;48], - reserved_124_1: [0;32], - unkR00: 0., - unkR04: 0., - unkR08: 0., - unkR12: 0., - unkR16: 0., - unkR20: 0., - unkR24: 0., - unkR28: 0., - unkR32: 0., - unkR36: 0., - unkR40: 0., - unkR44: 0., - unkR48: 0., - unkR52: 0., - reserved_124_2: [0;40], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct CS_AA_QUALITY_DETAIL { - pub enabled: u8, - pub forceFXAA2: u8, - pub dmy: [u8;2], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl CS_AA_QUALITY_DETAIL { -} -impl Default for CS_AA_QUALITY_DETAIL { - fn default() -> Self { - Self { - enabled: 0, - forceFXAA2: 0, - dmy: [0;2], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct CS_DECAL_QUALITY_DETAIL { - pub enabled: u8, - pub dmy: [u8;3], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl CS_DECAL_QUALITY_DETAIL { -} -impl Default for CS_DECAL_QUALITY_DETAIL { - fn default() -> Self { - Self { - enabled: 1, - dmy: [0;3], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct CS_DOF_QUALITY_DETAIL { - pub enabled: u8, - pub dmy: [u8;3], - pub forceHiResoBlur: i32, - pub maxBlurLevel: i32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl CS_DOF_QUALITY_DETAIL { -} -impl Default for CS_DOF_QUALITY_DETAIL { - fn default() -> Self { - Self { - enabled: 1, - dmy: [0;3], - forceHiResoBlur: -1, - maxBlurLevel: 1, - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct CS_EFFECT_QUALITY_DETAIL { - pub softParticleEnabled: u8, - pub glowEnabled: u8, - pub distortionEnable: u8, - pub cs_upScaleEnabledType: u8, - pub fNumOnceEmitsScale: f32, - pub fEmitSpanScale: f32, - pub fLodDistance1Scale: f32, - pub fLodDistance2Scale: f32, - pub fLodDistance3Scale: f32, - pub fLodDistance4Scale: f32, - pub fScaleRenderDistanceScale: f32, - pub dmy: [u8;4], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl CS_EFFECT_QUALITY_DETAIL { -} -impl Default for CS_EFFECT_QUALITY_DETAIL { - fn default() -> Self { - Self { - softParticleEnabled: 1, - glowEnabled: 1, - distortionEnable: 1, - cs_upScaleEnabledType: 0, - fNumOnceEmitsScale: 0.9, - fEmitSpanScale: 1.1, - fLodDistance1Scale: 0.9, - fLodDistance2Scale: 0.9, - fLodDistance3Scale: 0.9, - fLodDistance4Scale: 0.9, - fScaleRenderDistanceScale: 1.2, - dmy: [0;4], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct CS_LIGHTING_QUALITY_DETAIL { - pub localLightDistFactor: f32, - pub localLightShadowEnabled: u8, - pub forwardPassLightingEnabled: u8, - pub localLightShadowSpecLevelMax: u8, - pub dmy: [u8;1], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl CS_LIGHTING_QUALITY_DETAIL { -} -impl Default for CS_LIGHTING_QUALITY_DETAIL { - fn default() -> Self { - Self { - localLightDistFactor: 0.75, - localLightShadowEnabled: 1, - forwardPassLightingEnabled: 1, - localLightShadowSpecLevelMax: 1, - dmy: [0;1], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct CS_MOTION_BLUR_QUALITY_DETAIL { - pub enabled: u8, - pub ombEnabled: u8, - pub forceScaleVelocityBuffer: u8, - pub cheapFilterMode: u8, - pub sampleCountBias: i32, - pub recurrenceCountBias: i32, - pub blurMaxLengthScale: f32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl CS_MOTION_BLUR_QUALITY_DETAIL { -} -impl Default for CS_MOTION_BLUR_QUALITY_DETAIL { - fn default() -> Self { - Self { - enabled: 1, - ombEnabled: 1, - forceScaleVelocityBuffer: 1, - cheapFilterMode: 0, - sampleCountBias: -2, - recurrenceCountBias: 0, - blurMaxLengthScale: 0.75, - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct CS_RAYTRACING_QUALITY_DETAIL { - pub enableRaytraceAO: u8, - pub enableRaytraceShadows: u8, - pub Unk0x02: u8, - pub Unk0x03: u8, - pub UnkFloat0x04: f32, - pub Unk0x08: i32, - pub UnkFloat0x0C: f32, - pub Unk0x10: i32, - pub UnkFloat0x14: f32, - pub UnkFloat0x18: f32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl CS_RAYTRACING_QUALITY_DETAIL { -} -impl Default for CS_RAYTRACING_QUALITY_DETAIL { - fn default() -> Self { - Self { - enableRaytraceAO: 0, - enableRaytraceShadows: 0, - Unk0x02: 0, - Unk0x03: 0, - UnkFloat0x04: 0., - Unk0x08: 0, - UnkFloat0x0C: 0., - Unk0x10: 0, - UnkFloat0x14: 0., - UnkFloat0x18: 0., - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct CS_REFLECTION_QUALITY_DETAIL { - pub enabled: u8, - pub localLightEnabled: u8, - pub localLightForceEnabled: u8, - pub dmy: [u8;1], - pub resolutionDivider: i32, - pub ssrEnabled: u8, - pub ssrGaussianBlurEnabled: u8, - pub dmy2: [u8;2], - pub ssrDepthRejectThresholdScale: f32, - pub ssrRayTraceStepScale: f32, - pub ssrFadeToViewerBias: f32, - pub ssrFresnelRejectBias: f32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl CS_REFLECTION_QUALITY_DETAIL { -} -impl Default for CS_REFLECTION_QUALITY_DETAIL { - fn default() -> Self { - Self { - enabled: 1, - localLightEnabled: 1, - localLightForceEnabled: 0, - dmy: [0;1], - resolutionDivider: 2, - ssrEnabled: 1, - ssrGaussianBlurEnabled: 1, - dmy2: [0;2], - ssrDepthRejectThresholdScale: 1., - ssrRayTraceStepScale: 1., - ssrFadeToViewerBias: 0., - ssrFresnelRejectBias: 0., - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct CS_SHADER_QUALITY_DETAIL { - pub sssEnabled: u8, - pub tessellationEnabled: u8, - pub highPrecisionNormalEnabled: u8, - pub dmy: [u8;1], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl CS_SHADER_QUALITY_DETAIL { -} -impl Default for CS_SHADER_QUALITY_DETAIL { - fn default() -> Self { - Self { - sssEnabled: 1, - tessellationEnabled: 0, - highPrecisionNormalEnabled: 0, - dmy: [0;1], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct CS_SHADOW_QUALITY_DETAIL { - pub enabled: u8, - pub maxFilterLevel: u8, - pub dmy: [u8;2], - pub textureSizeScaler: i32, - pub textureSizeDivider: i32, - pub textureMinSize: i32, - pub textureMaxSize: i32, - pub blurCountBias: i32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl CS_SHADOW_QUALITY_DETAIL { -} -impl Default for CS_SHADOW_QUALITY_DETAIL { - fn default() -> Self { - Self { - enabled: 1, - maxFilterLevel: 1, - dmy: [0;2], - textureSizeScaler: 1, - textureSizeDivider: 2, - textureMinSize: 128, - textureMaxSize: 1024, - blurCountBias: -1, - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct CS_SSAO_QUALITY_DETAIL { - pub enabled: u8, - pub cs_reprojEnabledType: u8, - pub cs_upScaleEnabledType: u8, - pub cs_useNormalEnabledType: u8, - pub dmy: [u8;1], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl CS_SSAO_QUALITY_DETAIL { -} -impl Default for CS_SSAO_QUALITY_DETAIL { - fn default() -> Self { - Self { - enabled: 1, - cs_reprojEnabledType: 1, - cs_upScaleEnabledType: 0, - cs_useNormalEnabledType: 1, - dmy: [0;1], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct CS_TEXTURE_FILTER_QUALITY_DETAIL { - pub filter: u8, - pub dmy: [u8;3], - pub maxAnisoLevel: i32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl CS_TEXTURE_FILTER_QUALITY_DETAIL { -} -impl Default for CS_TEXTURE_FILTER_QUALITY_DETAIL { - fn default() -> Self { - Self { - filter: 3, - dmy: [0;3], - maxAnisoLevel: 4, - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct CS_VOLUMETRIC_EFFECT_QUALITY_DETAIL { - pub fogEnabled: u8, - pub fogShadowEnabled: u8, - pub dmy: [u8;2], - pub fogShadowSampleCountBias: i32, - pub fogLocalLightDistScale: f32, - pub fogVolueSizeScaler: i32, - pub fogVolueSizeDivider: i32, - pub fogVolumeDepthScaler: i32, - pub fogVolumeDepthDivider: i32, - pub fogVolumeEnabled: u8, - pub fogVolumeUpScaleType: u8, - pub fogVolumeEdgeCorrectionLevel: u8, - pub fogVolumeRayMarcingSampleCountOffset: i8, - pub fogVolumeShadowEnabled: u8, - pub fogVolumeForceShadowing: u8, - pub fogVolumeResolution: u8, - pub pad2: [u8;1], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl CS_VOLUMETRIC_EFFECT_QUALITY_DETAIL { -} -impl Default for CS_VOLUMETRIC_EFFECT_QUALITY_DETAIL { - fn default() -> Self { - Self { - fogEnabled: 1, - fogShadowEnabled: 1, - dmy: [0;2], - fogShadowSampleCountBias: 0, - fogLocalLightDistScale: 0., - fogVolueSizeScaler: 1, - fogVolueSizeDivider: 1, - fogVolumeDepthScaler: 1, - fogVolumeDepthDivider: 1, - fogVolumeEnabled: 1, - fogVolumeUpScaleType: 1, - fogVolumeEdgeCorrectionLevel: 2, - fogVolumeRayMarcingSampleCountOffset: 0, - fogVolumeShadowEnabled: 1, - fogVolumeForceShadowing: 0, - fogVolumeResolution: 0, - pad2: [0;1], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct CS_WATER_QUALITY_DETAIL { - pub interactionEnabled: u8, - pub dmy: [u8;3], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl CS_WATER_QUALITY_DETAIL { -} -impl Default for CS_WATER_QUALITY_DETAIL { - fn default() -> Self { - Self { - interactionEnabled: 1, - dmy: [0;3], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct GESTURE_PARAM_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub itemId: i32, - pub msgAnimId: i32, - bits_1: u8, - pub pad1: [u8;3], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl GESTURE_PARAM_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } - pub fn cannotUseRiding(&self) -> bool { - self.bits_1 & (1 << 0) != 0 - } - pub fn pad2(&self) -> bool { - self.bits_1 & (1 << 1) != 0 - } -} -impl Default for GESTURE_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - itemId: 0, - msgAnimId: 0, - bits_1: 0, - pad1: [0;3], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct GPARAM_GRID_REGION_INFO_PARAM_ST { - pub GparamGridRegionId: i32, - pub Reserve: [u8;28], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl GPARAM_GRID_REGION_INFO_PARAM_ST { -} -impl Default for GPARAM_GRID_REGION_INFO_PARAM_ST { - fn default() -> Self { - Self { - GparamGridRegionId: 0, - Reserve: [0;28], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct GPARAM_REF_SETTINGS_PARAM_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub RefTargetMapId: i32, - pub Reserve: [u8;24], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl GPARAM_REF_SETTINGS_PARAM_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } -} -impl Default for GPARAM_REF_SETTINGS_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - RefTargetMapId: -1, - Reserve: [0;24], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct GRAPHICS_COMMON_PARAM_ST { - pub hitBulletDecalOffset_HitIns: f32, - pub reserved02: [u8;8], - pub charaWetDecalFadeRange: f32, - pub reserved04: [u8;240], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl GRAPHICS_COMMON_PARAM_ST { -} -impl Default for GRAPHICS_COMMON_PARAM_ST { - fn default() -> Self { - Self { - hitBulletDecalOffset_HitIns: 0.05, - reserved02: [0;8], - charaWetDecalFadeRange: 0.6, - reserved04: [0;240], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct CS_GRAPHICS_CONFIG_PARAM_ST { - pub m_textureFilterQuality: u8, - pub m_aaQuality: u8, - pub m_ssaoQuality: u8, - pub m_dofQuality: u8, - pub m_motionBlurQuality: u8, - pub m_shadowQuality: u8, - pub m_lightingQuality: u8, - pub m_effectQuality: u8, - pub m_decalQuality: u8, - pub m_reflectionQuality: u8, - pub m_waterQuality: u8, - pub m_shaderQuality: u8, - pub m_volumetricEffectQuality: u8, - pub m_dummy: [u8;3], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl CS_GRAPHICS_CONFIG_PARAM_ST { -} -impl Default for CS_GRAPHICS_CONFIG_PARAM_ST { - fn default() -> Self { - Self { - m_textureFilterQuality: 2, - m_aaQuality: 3, - m_ssaoQuality: 3, - m_dofQuality: 3, - m_motionBlurQuality: 3, - m_shadowQuality: 3, - m_lightingQuality: 3, - m_effectQuality: 3, - m_decalQuality: 3, - m_reflectionQuality: 3, - m_waterQuality: 3, - m_shaderQuality: 3, - m_volumetricEffectQuality: 3, - m_dummy: [0;3], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct GRASS_LOD_RANGE_PARAM_ST { - pub LOD0_range: f32, - pub LOD0_play: f32, - pub LOD1_range: f32, - pub LOD1_play: f32, - pub LOD2_range: f32, - pub LOD2_play: f32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl GRASS_LOD_RANGE_PARAM_ST { -} -impl Default for GRASS_LOD_RANGE_PARAM_ST { - fn default() -> Self { - Self { - LOD0_range: 0., - LOD0_play: 0., - LOD1_range: 0., - LOD1_play: 0., - LOD2_range: 0., - LOD2_play: 0., - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct GRASS_MAP_SETTINGS_PARAM_ST { - pub grassType0: i32, - pub grassType1: i32, - pub grassType2: i32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl GRASS_MAP_SETTINGS_PARAM_ST { -} -impl Default for GRASS_MAP_SETTINGS_PARAM_ST { - fn default() -> Self { - Self { - grassType0: 0, - grassType1: 0, - grassType2: 0, - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct GRASS_TYPE_PARAM_ST { - pub lodRange: i16, - pub lod0ClusterType: u8, - pub lod1ClusterType: u8, - pub lod2ClusterType: u8, - pub pad0: [u8;2], - pub distributionType: u8, - pub baseDensity: f32, - pub model0Name: [u8;16], - pub flatTextureName: [u8;32], - pub billboardTextureName: [u8;32], - pub normalInfluence: u8, - pub inclinationMax: u8, - pub inclinationJitter: u8, - pub scaleBaseMin: u8, - pub scaleBaseMax: u8, - pub scaleHeightMin: u8, - pub scaleHeightMax: u8, - pub colorShade1_r: u8, - pub colorShade1_g: u8, - pub colorShade1_b: u8, - pub colorShade2_r: u8, - pub colorShade2_g: u8, - pub colorShade2_b: u8, - pub flatSplitType: u8, - pub flatBladeCount: u8, - pub flatSlant: i8, - pub flatRadius: f32, - pub castShadow: u8, - pub windAmplitude: u8, - pub pad1: [u8;1], - pub windCycle: u8, - pub orientationAngle: f32, - pub orientationRange: f32, - pub spacing: f32, - pub dithering: u8, - pub pad: [u8;3], - pub simpleModelName: [u8;16], - pub model1Name: [u8;16], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl GRASS_TYPE_PARAM_ST { -} -impl Default for GRASS_TYPE_PARAM_ST { - fn default() -> Self { - Self { - lodRange: 0, - lod0ClusterType: 0, - lod1ClusterType: 0, - lod2ClusterType: 0, - pad0: [0;2], - distributionType: 0, - baseDensity: 1., - model0Name: [0;16], - flatTextureName: [0;32], - billboardTextureName: [0;32], - normalInfluence: 0, - inclinationMax: 90, - inclinationJitter: 0, - scaleBaseMin: 100, - scaleBaseMax: 100, - scaleHeightMin: 100, - scaleHeightMax: 100, - colorShade1_r: 255, - colorShade1_g: 255, - colorShade1_b: 255, - colorShade2_r: 255, - colorShade2_g: 255, - colorShade2_b: 255, - flatSplitType: 0, - flatBladeCount: 2, - flatSlant: 0, - flatRadius: 0., - castShadow: 1, - windAmplitude: 80, - pad1: [0;1], - windCycle: 40, - orientationAngle: -1., - orientationRange: -1., - spacing: 0., - dithering: 0, - pad: [0;3], - simpleModelName: [0;16], - model1Name: [0;16], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct HIT_EFFECT_SE_PARAM_ST { - pub Iron_Slash_S: i32, - pub Iron_Slash_L: i32, - pub Iron_Slash_LL: i32, - pub Iron_Thrust_S: i32, - pub Iron_Thrust_L: i32, - pub Iron_Thrust_LL: i32, - pub Iron_Blow_S: i32, - pub Iron_Blow_L: i32, - pub Iron_Blow_LL: i32, - pub Fire_Slash_S: i32, - pub Fire_Slash_L: i32, - pub Fire_Slash_LL: i32, - pub Fire_Thrust_S: i32, - pub Fire_Thrust_L: i32, - pub Fire_Thrust_LL: i32, - pub Fire_Blow_S: i32, - pub Fire_Blow_L: i32, - pub Fire_Blow_LL: i32, - pub Wood_Slash_S: i32, - pub Wood_Slash_L: i32, - pub Wood_Slash_LL: i32, - pub Wood_Thrust_S: i32, - pub Wood_Thrust_L: i32, - pub Wood_Thrust_LL: i32, - pub Wood_Blow_S: i32, - pub Wood_Blow_L: i32, - pub Wood_Blow_LL: i32, - pub Body_Slash_S: i32, - pub Body_Slash_L: i32, - pub Body_Slash_LL: i32, - pub Body_Thrust_S: i32, - pub Body_Thrust_L: i32, - pub Body_Thrust_LL: i32, - pub Body_Blow_S: i32, - pub Body_Blow_L: i32, - pub Body_Blow_LL: i32, - pub Eclipse_Slash_S: i32, - pub Eclipse_Slash_L: i32, - pub Eclipse_Slash_LL: i32, - pub Eclipse_Thrust_S: i32, - pub Eclipse_Thrust_L: i32, - pub Eclipse_Thrust_LL: i32, - pub Eclipse_Blow_S: i32, - pub Eclipse_Blow_L: i32, - pub Eclipse_Blow_LL: i32, - pub Energy_Slash_S: i32, - pub Energy_Slash_L: i32, - pub Energy_Slash_LL: i32, - pub Energy_Thrust_S: i32, - pub Energy_Thrust_L: i32, - pub Energy_Thrust_LL: i32, - pub Energy_Blow_S: i32, - pub Energy_Blow_L: i32, - pub Energy_Blow_LL: i32, - pub None_Slash_S: i32, - pub None_Slash_L: i32, - pub None_Slash_LL: i32, - pub None_Thrust_S: i32, - pub None_Thrust_L: i32, - pub None_Thrust_LL: i32, - pub None_Blow_S: i32, - pub None_Blow_L: i32, - pub None_Blow_LL: i32, - pub Dmy1_Slash_S: i32, - pub Dmy1_Slash_L: i32, - pub Dmy1_Slash_LL: i32, - pub Dmy1_Thrust_S: i32, - pub Dmy1_Thrust_L: i32, - pub Dmy1_Thrust_LL: i32, - pub Dmy1_Blow_S: i32, - pub Dmy1_Blow_L: i32, - pub Dmy1_Blow_LL: i32, - pub Dmy2_Slash_S: i32, - pub Dmy2_Slash_L: i32, - pub Dmy2_Slash_LL: i32, - pub Dmy2_Thrust_S: i32, - pub Dmy2_Thrust_L: i32, - pub Dmy2_Thrust_LL: i32, - pub Dmy2_Blow_S: i32, - pub Dmy2_Blow_L: i32, - pub Dmy2_Blow_LL: i32, - pub Dmy3_Slash_S: i32, - pub Dmy3_Slash_L: i32, - pub Dmy3_Slash_LL: i32, - pub Dmy3_Thrust_S: i32, - pub Dmy3_Thrust_L: i32, - pub Dmy3_Thrust_LL: i32, - pub Dmy3_Blow_S: i32, - pub Dmy3_Blow_L: i32, - pub Dmy3_Blow_LL: i32, - pub Maggot_Slash_S: i32, - pub Maggot_Slash_L: i32, - pub Maggot_Slash_LL: i32, - pub Maggot_Thrust_S: i32, - pub Maggot_Thrust_L: i32, - pub Maggot_Thrust_LL: i32, - pub Maggot_Blow_S: i32, - pub Maggot_Blow_L: i32, - pub Maggot_Blow_LL: i32, - pub Wax_Slash_S: i32, - pub Wax_Slash_L: i32, - pub Wax_Slash_LL: i32, - pub Wax_Thrust_S: i32, - pub Wax_Thrust_L: i32, - pub Wax_Thrust_LL: i32, - pub Wax_Blow_S: i32, - pub Wax_Blow_L: i32, - pub Wax_Blow_LL: i32, - pub FireFlame_Slash_S: i32, - pub FireFlame_Slash_L: i32, - pub FireFlame_Slash_LL: i32, - pub FireFlame_Thrust_S: i32, - pub FireFlame_Thrust_L: i32, - pub FireFlame_Thrust_LL: i32, - pub FireFlame_Blow_S: i32, - pub FireFlame_Blow_L: i32, - pub FireFlame_Blow_LL: i32, - pub EclipseGas_Slash_S: i32, - pub EclipseGas_Slash_L: i32, - pub EclipseGas_Slash_LL: i32, - pub EclipseGas_Thrust_S: i32, - pub EclipseGas_Thrust_L: i32, - pub EclipseGas_Thrust_LL: i32, - pub EclipseGas_Blow_S: i32, - pub EclipseGas_Blow_L: i32, - pub EclipseGas_Blow_LL: i32, - pub EnergyStrong_Slash_S: i32, - pub EnergyStrong_Slash_L: i32, - pub EnergyStrong_Slash_LL: i32, - pub EnergyStrong_Thrust_S: i32, - pub EnergyStrong_Thrust_L: i32, - pub EnergyStrong_Thrust_LL: i32, - pub EnergyStrong_Blow_S: i32, - pub EnergyStrong_Blow_L: i32, - pub EnergyStrong_Blow_LL: i32, - pub reserve: [u8;100], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl HIT_EFFECT_SE_PARAM_ST { -} -impl Default for HIT_EFFECT_SE_PARAM_ST { - fn default() -> Self { - Self { - Iron_Slash_S: 0, - Iron_Slash_L: 0, - Iron_Slash_LL: 0, - Iron_Thrust_S: 0, - Iron_Thrust_L: 0, - Iron_Thrust_LL: 0, - Iron_Blow_S: 0, - Iron_Blow_L: 0, - Iron_Blow_LL: 0, - Fire_Slash_S: 0, - Fire_Slash_L: 0, - Fire_Slash_LL: 0, - Fire_Thrust_S: 0, - Fire_Thrust_L: 0, - Fire_Thrust_LL: 0, - Fire_Blow_S: 0, - Fire_Blow_L: 0, - Fire_Blow_LL: 0, - Wood_Slash_S: 0, - Wood_Slash_L: 0, - Wood_Slash_LL: 0, - Wood_Thrust_S: 0, - Wood_Thrust_L: 0, - Wood_Thrust_LL: 0, - Wood_Blow_S: 0, - Wood_Blow_L: 0, - Wood_Blow_LL: 0, - Body_Slash_S: 0, - Body_Slash_L: 0, - Body_Slash_LL: 0, - Body_Thrust_S: 0, - Body_Thrust_L: 0, - Body_Thrust_LL: 0, - Body_Blow_S: 0, - Body_Blow_L: 0, - Body_Blow_LL: 0, - Eclipse_Slash_S: 0, - Eclipse_Slash_L: 0, - Eclipse_Slash_LL: 0, - Eclipse_Thrust_S: 0, - Eclipse_Thrust_L: 0, - Eclipse_Thrust_LL: 0, - Eclipse_Blow_S: 0, - Eclipse_Blow_L: 0, - Eclipse_Blow_LL: 0, - Energy_Slash_S: 0, - Energy_Slash_L: 0, - Energy_Slash_LL: 0, - Energy_Thrust_S: 0, - Energy_Thrust_L: 0, - Energy_Thrust_LL: 0, - Energy_Blow_S: 0, - Energy_Blow_L: 0, - Energy_Blow_LL: 0, - None_Slash_S: 0, - None_Slash_L: 0, - None_Slash_LL: 0, - None_Thrust_S: 0, - None_Thrust_L: 0, - None_Thrust_LL: 0, - None_Blow_S: 0, - None_Blow_L: 0, - None_Blow_LL: 0, - Dmy1_Slash_S: 0, - Dmy1_Slash_L: 0, - Dmy1_Slash_LL: 0, - Dmy1_Thrust_S: 0, - Dmy1_Thrust_L: 0, - Dmy1_Thrust_LL: 0, - Dmy1_Blow_S: 0, - Dmy1_Blow_L: 0, - Dmy1_Blow_LL: 0, - Dmy2_Slash_S: 0, - Dmy2_Slash_L: 0, - Dmy2_Slash_LL: 0, - Dmy2_Thrust_S: 0, - Dmy2_Thrust_L: 0, - Dmy2_Thrust_LL: 0, - Dmy2_Blow_S: 0, - Dmy2_Blow_L: 0, - Dmy2_Blow_LL: 0, - Dmy3_Slash_S: 0, - Dmy3_Slash_L: 0, - Dmy3_Slash_LL: 0, - Dmy3_Thrust_S: 0, - Dmy3_Thrust_L: 0, - Dmy3_Thrust_LL: 0, - Dmy3_Blow_S: 0, - Dmy3_Blow_L: 0, - Dmy3_Blow_LL: 0, - Maggot_Slash_S: 0, - Maggot_Slash_L: 0, - Maggot_Slash_LL: 0, - Maggot_Thrust_S: 0, - Maggot_Thrust_L: 0, - Maggot_Thrust_LL: 0, - Maggot_Blow_S: 0, - Maggot_Blow_L: 0, - Maggot_Blow_LL: 0, - Wax_Slash_S: 0, - Wax_Slash_L: 0, - Wax_Slash_LL: 0, - Wax_Thrust_S: 0, - Wax_Thrust_L: 0, - Wax_Thrust_LL: 0, - Wax_Blow_S: 0, - Wax_Blow_L: 0, - Wax_Blow_LL: 0, - FireFlame_Slash_S: 0, - FireFlame_Slash_L: 0, - FireFlame_Slash_LL: 0, - FireFlame_Thrust_S: 0, - FireFlame_Thrust_L: 0, - FireFlame_Thrust_LL: 0, - FireFlame_Blow_S: 0, - FireFlame_Blow_L: 0, - FireFlame_Blow_LL: 0, - EclipseGas_Slash_S: 0, - EclipseGas_Slash_L: 0, - EclipseGas_Slash_LL: 0, - EclipseGas_Thrust_S: 0, - EclipseGas_Thrust_L: 0, - EclipseGas_Thrust_LL: 0, - EclipseGas_Blow_S: 0, - EclipseGas_Blow_L: 0, - EclipseGas_Blow_LL: 0, - EnergyStrong_Slash_S: 0, - EnergyStrong_Slash_L: 0, - EnergyStrong_Slash_LL: 0, - EnergyStrong_Thrust_S: 0, - EnergyStrong_Thrust_L: 0, - EnergyStrong_Thrust_LL: 0, - EnergyStrong_Blow_S: 0, - EnergyStrong_Blow_L: 0, - EnergyStrong_Blow_LL: 0, - reserve: [0;100], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct HIT_EFFECT_SFX_CONCEPT_PARAM_ST { - pub atkIron_1: i16, - pub atkIron_2: i16, - pub atkLeather_1: i16, - pub atkLeather_2: i16, - pub atkWood_1: i16, - pub atkWood_2: i16, - pub atkBody_1: i16, - pub atkBody_2: i16, - pub atkStone_1: i16, - pub atkStone_2: i16, - pub pad: [u8;4], - pub atkNone_1: i16, - pub atkNone_2: i16, - pub reserve: [u8;52], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl HIT_EFFECT_SFX_CONCEPT_PARAM_ST { -} -impl Default for HIT_EFFECT_SFX_CONCEPT_PARAM_ST { - fn default() -> Self { - Self { - atkIron_1: 0, - atkIron_2: 0, - atkLeather_1: 0, - atkLeather_2: 0, - atkWood_1: 0, - atkWood_2: 0, - atkBody_1: 0, - atkBody_2: 0, - atkStone_1: 0, - atkStone_2: 0, - pad: [0;4], - atkNone_1: 0, - atkNone_2: 0, - reserve: [0;52], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct HIT_EFFECT_SFX_PARAM_ST { - pub Slash_Normal: i32, - pub Slash_S: i32, - pub Slash_L: i32, - pub Slash_Specific1: i32, - pub Slash_Specific2: i32, - pub Blow_Normal: i32, - pub Blow_S: i32, - pub Blow_L: i32, - pub Blow_Specific1: i32, - pub Blow_Specific2: i32, - pub Thrust_Normal: i32, - pub Thrust_S: i32, - pub Thrust_L: i32, - pub Thrust_Specific1: i32, - pub Thrust_Specific2: i32, - pub Neutral_Normal: i32, - pub Neutral_S: i32, - pub Neutral_L: i32, - pub Neutral_Specific1: i32, - pub Neutral_Specific2: i32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl HIT_EFFECT_SFX_PARAM_ST { -} -impl Default for HIT_EFFECT_SFX_PARAM_ST { - fn default() -> Self { - Self { - Slash_Normal: 0, - Slash_S: 0, - Slash_L: 0, - Slash_Specific1: 0, - Slash_Specific2: 0, - Blow_Normal: 0, - Blow_S: 0, - Blow_L: 0, - Blow_Specific1: 0, - Blow_Specific2: 0, - Thrust_Normal: 0, - Thrust_S: 0, - Thrust_L: 0, - Thrust_Specific1: 0, - Thrust_Specific2: 0, - Neutral_Normal: 0, - Neutral_S: 0, - Neutral_L: 0, - Neutral_Specific1: 0, - Neutral_Specific2: 0, - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct HIT_MTRL_PARAM_ST { - pub aiVolumeRate: f32, - pub spEffectIdOnHit0: i32, - pub spEffectIdOnHit1: i32, - bits_0: u8, - pub hardnessType: u8, - pub pad2: [u8;6], - pub spEffectIdOnHit0_ClearCount_2: i32, - pub spEffectIdOnHit0_ClearCount_3: i32, - pub spEffectIdOnHit0_ClearCount_4: i32, - pub spEffectIdOnHit0_ClearCount_5: i32, - pub spEffectIdOnHit0_ClearCount_6: i32, - pub spEffectIdOnHit0_ClearCount_7: i32, - pub spEffectIdOnHit0_ClearCount_8: i32, - pub spEffectIdOnHit1_ClearCount_2: i32, - pub spEffectIdOnHit1_ClearCount_3: i32, - pub spEffectIdOnHit1_ClearCount_4: i32, - pub spEffectIdOnHit1_ClearCount_5: i32, - pub spEffectIdOnHit1_ClearCount_6: i32, - pub spEffectIdOnHit1_ClearCount_7: i32, - pub spEffectIdOnHit1_ClearCount_8: i32, - pub replaceMateiralId_Rain: i16, - pub pad4: [u8;2], - pub spEffectId_forWet00: i32, - pub spEffectId_forWet01: i32, - pub spEffectId_forWet02: i32, - pub spEffectId_forWet03: i32, - pub spEffectId_forWet04: i32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl HIT_MTRL_PARAM_ST { - pub fn footEffectHeightType(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn footEffectDirType(&self) -> bool { - self.bits_0 & (1 << 2) != 0 - } - pub fn floorHeightType(&self) -> bool { - self.bits_0 & (1 << 4) != 0 - } - pub fn disableFallDamage(&self) -> bool { - self.bits_0 & (1 << 6) != 0 - } - pub fn isHardnessForSoundReverb(&self) -> bool { - self.bits_0 & (1 << 7) != 0 - } -} -impl Default for HIT_MTRL_PARAM_ST { - fn default() -> Self { - Self { - aiVolumeRate: 1., - spEffectIdOnHit0: -1, - spEffectIdOnHit1: -1, - bits_0: 0, - hardnessType: 0, - pad2: [0;6], - spEffectIdOnHit0_ClearCount_2: -1, - spEffectIdOnHit0_ClearCount_3: -1, - spEffectIdOnHit0_ClearCount_4: -1, - spEffectIdOnHit0_ClearCount_5: -1, - spEffectIdOnHit0_ClearCount_6: -1, - spEffectIdOnHit0_ClearCount_7: -1, - spEffectIdOnHit0_ClearCount_8: -1, - spEffectIdOnHit1_ClearCount_2: -1, - spEffectIdOnHit1_ClearCount_3: -1, - spEffectIdOnHit1_ClearCount_4: -1, - spEffectIdOnHit1_ClearCount_5: -1, - spEffectIdOnHit1_ClearCount_6: -1, - spEffectIdOnHit1_ClearCount_7: -1, - spEffectIdOnHit1_ClearCount_8: -1, - replaceMateiralId_Rain: -1, - pad4: [0;2], - spEffectId_forWet00: -1, - spEffectId_forWet01: -1, - spEffectId_forWet02: -1, - spEffectId_forWet03: -1, - spEffectId_forWet04: -1, - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct ITEMLOT_PARAM_ST { - pub lotItemId01: i32, - pub lotItemId02: i32, - pub lotItemId03: i32, - pub lotItemId04: i32, - pub lotItemId05: i32, - pub lotItemId06: i32, - pub lotItemId07: i32, - pub lotItemId08: i32, - pub lotItemCategory01: i32, - pub lotItemCategory02: i32, - pub lotItemCategory03: i32, - pub lotItemCategory04: i32, - pub lotItemCategory05: i32, - pub lotItemCategory06: i32, - pub lotItemCategory07: i32, - pub lotItemCategory08: i32, - pub lotItemBasePoint01: i16, - pub lotItemBasePoint02: i16, - pub lotItemBasePoint03: i16, - pub lotItemBasePoint04: i16, - pub lotItemBasePoint05: i16, - pub lotItemBasePoint06: i16, - pub lotItemBasePoint07: i16, - pub lotItemBasePoint08: i16, - pub cumulateLotPoint01: i16, - pub cumulateLotPoint02: i16, - pub cumulateLotPoint03: i16, - pub cumulateLotPoint04: i16, - pub cumulateLotPoint05: i16, - pub cumulateLotPoint06: i16, - pub cumulateLotPoint07: i16, - pub cumulateLotPoint08: i16, - pub getItemFlagId01: i32, - pub getItemFlagId02: i32, - pub getItemFlagId03: i32, - pub getItemFlagId04: i32, - pub getItemFlagId05: i32, - pub getItemFlagId06: i32, - pub getItemFlagId07: i32, - pub getItemFlagId08: i32, - pub getItemFlagId: i32, - pub cumulateNumFlagId: i32, - pub cumulateNumMax: u8, - pub lotItem_Rarity: i8, - pub lotItemNum01: u8, - pub lotItemNum02: u8, - pub lotItemNum03: u8, - pub lotItemNum04: u8, - pub lotItemNum05: u8, - pub lotItemNum06: u8, - pub lotItemNum07: u8, - pub lotItemNum08: u8, - bits_0: i16, - pub GameClearOffset: i8, - bits_1: u8, - pub PAD2: i16, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl ITEMLOT_PARAM_ST { - pub fn enableLuck01(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn enableLuck02(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } - pub fn enableLuck03(&self) -> bool { - self.bits_0 & (1 << 2) != 0 - } - pub fn enableLuck04(&self) -> bool { - self.bits_0 & (1 << 3) != 0 - } - pub fn enableLuck05(&self) -> bool { - self.bits_0 & (1 << 4) != 0 - } - pub fn enableLuck06(&self) -> bool { - self.bits_0 & (1 << 5) != 0 - } - pub fn enableLuck07(&self) -> bool { - self.bits_0 & (1 << 6) != 0 - } - pub fn enableLuck08(&self) -> bool { - self.bits_0 & (1 << 7) != 0 - } - pub fn cumulateReset01(&self) -> bool { - self.bits_0 & (1 << 8) != 0 - } - pub fn cumulateReset02(&self) -> bool { - self.bits_0 & (1 << 9) != 0 - } - pub fn cumulateReset03(&self) -> bool { - self.bits_0 & (1 << 10) != 0 - } - pub fn cumulateReset04(&self) -> bool { - self.bits_0 & (1 << 11) != 0 - } - pub fn cumulateReset05(&self) -> bool { - self.bits_0 & (1 << 12) != 0 - } - pub fn cumulateReset06(&self) -> bool { - self.bits_0 & (1 << 13) != 0 - } - pub fn cumulateReset07(&self) -> bool { - self.bits_0 & (1 << 14) != 0 - } - pub fn cumulateReset08(&self) -> bool { - self.bits_0 & (1 << 15) != 0 - } - pub fn canExecByFriendlyGhost(&self) -> bool { - self.bits_1 & (1 << 0) != 0 - } - pub fn canExecByHostileGhost(&self) -> bool { - self.bits_1 & (1 << 1) != 0 - } - pub fn PAD1(&self) -> bool { - self.bits_1 & (1 << 2) != 0 - } -} -impl Default for ITEMLOT_PARAM_ST { - fn default() -> Self { - Self { - lotItemId01: 0, - lotItemId02: 0, - lotItemId03: 0, - lotItemId04: 0, - lotItemId05: 0, - lotItemId06: 0, - lotItemId07: 0, - lotItemId08: 0, - lotItemCategory01: 0, - lotItemCategory02: 0, - lotItemCategory03: 0, - lotItemCategory04: 0, - lotItemCategory05: 0, - lotItemCategory06: 0, - lotItemCategory07: 0, - lotItemCategory08: 0, - lotItemBasePoint01: 0, - lotItemBasePoint02: 0, - lotItemBasePoint03: 0, - lotItemBasePoint04: 0, - lotItemBasePoint05: 0, - lotItemBasePoint06: 0, - lotItemBasePoint07: 0, - lotItemBasePoint08: 0, - cumulateLotPoint01: 0, - cumulateLotPoint02: 0, - cumulateLotPoint03: 0, - cumulateLotPoint04: 0, - cumulateLotPoint05: 0, - cumulateLotPoint06: 0, - cumulateLotPoint07: 0, - cumulateLotPoint08: 0, - getItemFlagId01: 0, - getItemFlagId02: 0, - getItemFlagId03: 0, - getItemFlagId04: 0, - getItemFlagId05: 0, - getItemFlagId06: 0, - getItemFlagId07: 0, - getItemFlagId08: 0, - getItemFlagId: 0, - cumulateNumFlagId: 0, - cumulateNumMax: 0, - lotItem_Rarity: -1, - lotItemNum01: 0, - lotItemNum02: 0, - lotItemNum03: 0, - lotItemNum04: 0, - lotItemNum05: 0, - lotItemNum06: 0, - lotItemNum07: 0, - lotItemNum08: 0, - bits_0: 0, - GameClearOffset: -1, - bits_1: 0, - PAD2: 0, - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct CS_KEY_ASSIGN_MENUITEM_PARAM { - pub textID: i32, - pub key: i32, - pub enableUnassign: u8, - pub enablePadConfig: u8, - pub enableMouseConfig: u8, - pub group: u8, - pub mappingTextID: i32, - pub viewPad: u8, - pub viewKeyboardMouse: u8, - pub padding: [u8;6], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl CS_KEY_ASSIGN_MENUITEM_PARAM { -} -impl Default for CS_KEY_ASSIGN_MENUITEM_PARAM { - fn default() -> Self { - Self { - textID: 0, - key: -1, - enableUnassign: 1, - enablePadConfig: 1, - enableMouseConfig: 1, - group: 0, - mappingTextID: 0, - viewPad: 1, - viewKeyboardMouse: 1, - padding: [0;6], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct KEY_ASSIGN_PARAM_ST { - pub padKeyId: i32, - pub keyboardModifyKey: i32, - pub keyboardKeyId: i32, - pub mouseModifyKey: i32, - pub mouseKeyId: i32, - pub reserved: [u8;12], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl KEY_ASSIGN_PARAM_ST { -} -impl Default for KEY_ASSIGN_PARAM_ST { - fn default() -> Self { - Self { - padKeyId: -1, - keyboardModifyKey: 0, - keyboardKeyId: -1, - mouseModifyKey: 0, - mouseKeyId: 0, - reserved: [0;12], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct KNOCKBACK_PARAM_ST { - pub damage_Min_ContTime: f32, - pub damage_S_ContTime: f32, - pub damage_M_ContTime: f32, - pub damage_L_ContTime: f32, - pub damage_BlowS_ContTime: f32, - pub damage_BlowM_ContTime: f32, - pub damage_Strike_ContTime: f32, - pub damage_Uppercut_ContTime: f32, - pub damage_Push_ContTime: f32, - pub damage_Breath_ContTime: f32, - pub damage_HeadShot_ContTime: f32, - pub guard_S_ContTime: f32, - pub guard_L_ContTime: f32, - pub guard_LL_ContTime: f32, - pub guardBrake_ContTime: f32, - pub damage_Min_DecTime: f32, - pub damage_S_DecTime: f32, - pub damage_M_DecTime: f32, - pub damage_L_DecTime: f32, - pub damage_BlowS_DecTime: f32, - pub damage_BlowM_DecTime: f32, - pub damage_Strike_DecTime: f32, - pub damage_Uppercut_DecTime: f32, - pub damage_Push_DecTime: f32, - pub damage_Breath_DecTime: f32, - pub damage_HeadShot_DecTime: f32, - pub guard_S_DecTime: f32, - pub guard_L_DecTime: f32, - pub guard_LL_DecTime: f32, - pub guardBrake_DecTime: f32, - pub pad: [u8;8], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl KNOCKBACK_PARAM_ST { -} -impl Default for KNOCKBACK_PARAM_ST { - fn default() -> Self { - Self { - damage_Min_ContTime: 0., - damage_S_ContTime: 0., - damage_M_ContTime: 0., - damage_L_ContTime: 0., - damage_BlowS_ContTime: 0., - damage_BlowM_ContTime: 0., - damage_Strike_ContTime: 0., - damage_Uppercut_ContTime: 0., - damage_Push_ContTime: 0., - damage_Breath_ContTime: 0., - damage_HeadShot_ContTime: 0., - guard_S_ContTime: 0., - guard_L_ContTime: 0., - guard_LL_ContTime: 0., - guardBrake_ContTime: 0., - damage_Min_DecTime: 0., - damage_S_DecTime: 0., - damage_M_DecTime: 0., - damage_L_DecTime: 0., - damage_BlowS_DecTime: 0., - damage_BlowM_DecTime: 0., - damage_Strike_DecTime: 0., - damage_Uppercut_DecTime: 0., - damage_Push_DecTime: 0., - damage_Breath_DecTime: 0., - damage_HeadShot_DecTime: 0., - guard_S_DecTime: 0., - guard_L_DecTime: 0., - guard_LL_DecTime: 0., - guardBrake_DecTime: 0., - pad: [0;8], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct KNOWLEDGE_LOADSCREEN_ITEM_PARAM_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub unlockFlagId: i32, - pub invalidFlagId: i32, - pub msgId: i32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl KNOWLEDGE_LOADSCREEN_ITEM_PARAM_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } -} -impl Default for KNOWLEDGE_LOADSCREEN_ITEM_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - unlockFlagId: 0, - invalidFlagId: 0, - msgId: 0, - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct LEGACY_DISTANT_VIEW_PARTS_REPLACE_PARAM { - pub TargetMapId: i32, - pub TargetEventId: i32, - pub SrcAssetId: i32, - pub SrcAssetPartsNo: i32, - pub DstAssetId: i32, - pub DstAssetPartsNo: i32, - pub SrcAssetIdRangeMin: i32, - pub SrcAssetIdRangeMax: i32, - pub DstAssetIdRangeMin: i32, - pub DstAssetIdRangeMax: i32, - pub LimitedMapRegionId0: i8, - pub LimitedMapRegionId1: i8, - pub LimitedMapRegionId2: i8, - pub LimitedMapRegionId3: i8, - pub reserve: [u8;4], - pub LimitedMapRegionAssetId: i32, - pub LimitedMapRegioAssetPartsNo: i32, - pub LimitedMapRegioAssetIdRangeMin: i32, - pub LimitedMapRegioAssetIdRangeMax: i32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl LEGACY_DISTANT_VIEW_PARTS_REPLACE_PARAM { -} -impl Default for LEGACY_DISTANT_VIEW_PARTS_REPLACE_PARAM { - fn default() -> Self { - Self { - TargetMapId: -1, - TargetEventId: 0, - SrcAssetId: -1, - SrcAssetPartsNo: -1, - DstAssetId: -1, - DstAssetPartsNo: -1, - SrcAssetIdRangeMin: -1, - SrcAssetIdRangeMax: -1, - DstAssetIdRangeMin: -1, - DstAssetIdRangeMax: -1, - LimitedMapRegionId0: -1, - LimitedMapRegionId1: -1, - LimitedMapRegionId2: -1, - LimitedMapRegionId3: -1, - reserve: [0;4], - LimitedMapRegionAssetId: -1, - LimitedMapRegioAssetPartsNo: -1, - LimitedMapRegioAssetIdRangeMin: -1, - LimitedMapRegioAssetIdRangeMax: -1, - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct LOAD_BALANCER_DRAW_DIST_SCALE_PARAM_ST { - pub Lv00: f32, - pub Lv01: f32, - pub Lv02: f32, - pub Lv03: f32, - pub Lv04: f32, - pub Lv05: f32, - pub Lv06: f32, - pub Lv07: f32, - pub Lv08: f32, - pub Lv09: f32, - pub Lv10: f32, - pub Lv11: f32, - pub Lv12: f32, - pub Lv13: f32, - pub Lv14: f32, - pub Lv15: f32, - pub Lv16: f32, - pub Lv17: f32, - pub Lv18: f32, - pub Lv19: f32, - pub Lv20: f32, - pub reserve: [u8;44], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl LOAD_BALANCER_DRAW_DIST_SCALE_PARAM_ST { -} -impl Default for LOAD_BALANCER_DRAW_DIST_SCALE_PARAM_ST { - fn default() -> Self { - Self { - Lv00: 1., - Lv01: 1., - Lv02: 1., - Lv03: 1., - Lv04: 1., - Lv05: 1., - Lv06: 1., - Lv07: 1., - Lv08: 1., - Lv09: 1., - Lv10: 1., - Lv11: 1., - Lv12: 1., - Lv13: 1., - Lv14: 1., - Lv15: 1., - Lv16: 1., - Lv17: 1., - Lv18: 1., - Lv19: 1., - Lv20: 1., - reserve: [0;44], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct LOAD_BALANCER_NEW_DRAW_DIST_SCALE_PARAM_ST { - pub DrawDist_LvBegin: u8, - pub DrawDist_LvEnd: u8, - pub reserve0: [u8;2], - pub DrawDist_ScaleBegin: f32, - pub DrawDist_ScaleEnd: f32, - pub ShadwDrawDist_LvBegin: u8, - pub ShadwDrawDist_LvEnd: u8, - pub reserve1: [u8;2], - pub ShadwDrawDist_ScaleBegin: f32, - pub ShadwDrawDist_ScaleEnd: f32, - pub reserve2: [u8;24], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl LOAD_BALANCER_NEW_DRAW_DIST_SCALE_PARAM_ST { -} -impl Default for LOAD_BALANCER_NEW_DRAW_DIST_SCALE_PARAM_ST { - fn default() -> Self { - Self { - DrawDist_LvBegin: 21, - DrawDist_LvEnd: 21, - reserve0: [0;2], - DrawDist_ScaleBegin: 1., - DrawDist_ScaleEnd: 1., - ShadwDrawDist_LvBegin: 21, - ShadwDrawDist_LvEnd: 21, - reserve1: [0;2], - ShadwDrawDist_ScaleBegin: 1., - ShadwDrawDist_ScaleEnd: 1., - reserve2: [0;24], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct LOAD_BALANCER_PARAM_ST { - pub lowerFpsThreshold: f32, - pub upperFpsThreshold: f32, - pub lowerFpsContinousCount: i32, - pub upperFpsContinousCount: i32, - pub downAfterChangeSleep: i32, - pub upAfterChangeSleep: i32, - pub postProcessLightShaft: u8, - pub postProcessBloom: u8, - pub postProcessGlow: u8, - pub postProcessAA: u8, - pub postProcessSSAO: u8, - pub postProcessDOF: u8, - pub postProcessMotionBlur: u8, - pub postProcessMotionBlurIteration: u8, - pub reserve0: [u8;1], - pub shadowBlur: u8, - pub sfxParticleHalf: u8, - pub sfxReflection: u8, - pub sfxWaterInteraction: u8, - pub sfxGlow: u8, - pub sfxDistortion: u8, - pub sftSoftSprite: u8, - pub sfxLightShaft: u8, - pub sfxScaleRenderDistanceScale: u8, - pub dynamicResolution: u8, - pub shadowCascade0ResolutionHalf: u8, - pub shadowCascade1ResolutionHalf: u8, - pub chrWetDisablePlayer: u8, - pub chrWetDisableRemotePlayer: u8, - pub chrWetDisableEnemy: u8, - pub dynamicResolutionPercentageMin: u8, - pub dynamicResolutionPercentageMax: u8, - pub reserve1: [u8;30], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl LOAD_BALANCER_PARAM_ST { -} -impl Default for LOAD_BALANCER_PARAM_ST { - fn default() -> Self { - Self { - lowerFpsThreshold: 23., - upperFpsThreshold: 27., - lowerFpsContinousCount: 5, - upperFpsContinousCount: 20, - downAfterChangeSleep: 30, - upAfterChangeSleep: 10, - postProcessLightShaft: 20, - postProcessBloom: 20, - postProcessGlow: 20, - postProcessAA: 20, - postProcessSSAO: 20, - postProcessDOF: 20, - postProcessMotionBlur: 20, - postProcessMotionBlurIteration: 20, - reserve0: [0;1], - shadowBlur: 20, - sfxParticleHalf: 20, - sfxReflection: 20, - sfxWaterInteraction: 20, - sfxGlow: 20, - sfxDistortion: 20, - sftSoftSprite: 20, - sfxLightShaft: 20, - sfxScaleRenderDistanceScale: 20, - dynamicResolution: 1, - shadowCascade0ResolutionHalf: 0, - shadowCascade1ResolutionHalf: 13, - chrWetDisablePlayer: 21, - chrWetDisableRemotePlayer: 21, - chrWetDisableEnemy: 21, - dynamicResolutionPercentageMin: 100, - dynamicResolutionPercentageMax: 100, - reserve1: [0;30], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct LOCK_CAM_PARAM_ST { - pub camDistTarget: f32, - pub rotRangeMinX: f32, - pub lockRotXShiftRatio: f32, - pub chrOrgOffset_Y: f32, - pub chrLockRangeMaxRadius: f32, - pub camFovY: f32, - pub chrLockRangeMaxRadius_forD: f32, - pub chrLockRangeMaxRadius_forPD: f32, - pub closeMaxHeight: f32, - pub closeMinHeight: f32, - pub closeAngRange: f32, - pub closeMaxRadius: f32, - pub closeMaxRadius_forD: f32, - pub closeMaxRadius_forPD: f32, - pub bulletMaxRadius: f32, - pub bulletMaxRadius_forD: f32, - pub bulletMaxRadius_forPD: f32, - pub bulletAngRange: f32, - pub lockTgtKeepTime: f32, - pub chrTransChaseRateForNormal: f32, - pub pad: [u8;48], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl LOCK_CAM_PARAM_ST { -} -impl Default for LOCK_CAM_PARAM_ST { - fn default() -> Self { - Self { - camDistTarget: 4., - rotRangeMinX: -40., - lockRotXShiftRatio: 0.6, - chrOrgOffset_Y: 1.42, - chrLockRangeMaxRadius: 15., - camFovY: 43., - chrLockRangeMaxRadius_forD: -1., - chrLockRangeMaxRadius_forPD: -1., - closeMaxHeight: 0., - closeMinHeight: 0., - closeAngRange: 0., - closeMaxRadius: 0., - closeMaxRadius_forD: 0., - closeMaxRadius_forPD: 0., - bulletMaxRadius: 0., - bulletMaxRadius_forD: 0., - bulletMaxRadius_forPD: 0., - bulletAngRange: 0., - lockTgtKeepTime: 2., - chrTransChaseRateForNormal: -1., - pad: [0;48], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct MAGIC_PARAM_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub yesNoDialogMessageId: i32, - pub limitCancelSpEffectId: i32, - pub sortId: i16, - pub requirementLuck: u8, - pub aiNotifyType: u8, - pub mp: i16, - pub stamina: i16, - pub iconId: i16, - pub behaviorId: i16, - pub mtrlItemId: i16, - pub replaceMagicId: i16, - pub maxQuantity: i16, - pub refCategory1: u8, - pub overDexterity: u8, - pub refCategory2: u8, - pub slotLength: u8, - pub requirementIntellect: u8, - pub requirementFaith: u8, - pub analogDexterityMin: u8, - pub analogDexterityMax: u8, - pub ezStateBehaviorType: u8, - pub refCategory3: u8, - pub spEffectCategory: u8, - pub refType: u8, - pub opmeMenuType: u8, - pub refCategory4: u8, - pub hasSpEffectType: i16, - pub replaceCategory: u8, - pub useLimitCategory: u8, - bits_1: u8, - bits_2: u8, - bits_3: u8, - bits_4: u8, - pub castSfxId: i32, - pub fireSfxId: i32, - pub effectSfxId: i32, - pub toughnessCorrectRate: f32, - pub ReplacementStatusType: u8, - pub ReplacementStatus1: i8, - pub ReplacementStatus2: i8, - pub ReplacementStatus3: i8, - pub ReplacementStatus4: i8, - pub refCategory5: u8, - pub consumeSA: i16, - pub ReplacementMagic1: i32, - pub ReplacementMagic2: i32, - pub ReplacementMagic3: i32, - pub ReplacementMagic4: i32, - pub mp_charge: i16, - pub stamina_charge: i16, - pub createLimitGroupId: u8, - pub refCategory6: u8, - pub subCategory1: u8, - pub subCategory2: u8, - pub refCategory7: u8, - pub refCategory8: u8, - pub refCategory9: u8, - pub refCategory10: u8, - pub refId1: i32, - pub refId2: i32, - pub refId3: i32, - pub aiUseJudgeId: i32, - pub refId4: i32, - pub refId5: i32, - pub refId6: i32, - pub refId7: i32, - pub refId8: i32, - pub refId9: i32, - pub refId10: i32, - pub consumeType1: u8, - pub consumeType2: u8, - pub consumeType3: u8, - pub consumeType4: u8, - pub consumeType5: u8, - pub consumeType6: u8, - pub consumeType7: u8, - pub consumeType8: u8, - pub consumeType9: u8, - pub consumeType10: u8, - pub consumeLoopMP_forMenu: i16, - pub pad: [u8;8], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl MAGIC_PARAM_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } - pub fn vowType0(&self) -> bool { - self.bits_1 & (1 << 0) != 0 - } - pub fn vowType1(&self) -> bool { - self.bits_1 & (1 << 1) != 0 - } - pub fn vowType2(&self) -> bool { - self.bits_1 & (1 << 2) != 0 - } - pub fn vowType3(&self) -> bool { - self.bits_1 & (1 << 3) != 0 - } - pub fn vowType4(&self) -> bool { - self.bits_1 & (1 << 4) != 0 - } - pub fn vowType5(&self) -> bool { - self.bits_1 & (1 << 5) != 0 - } - pub fn vowType6(&self) -> bool { - self.bits_1 & (1 << 6) != 0 - } - pub fn vowType7(&self) -> bool { - self.bits_1 & (1 << 7) != 0 - } - pub fn enable_multi(&self) -> bool { - self.bits_2 & (1 << 0) != 0 - } - pub fn enable_multi_only(&self) -> bool { - self.bits_2 & (1 << 1) != 0 - } - pub fn isEnchant(&self) -> bool { - self.bits_2 & (1 << 2) != 0 - } - pub fn isShieldEnchant(&self) -> bool { - self.bits_2 & (1 << 3) != 0 - } - pub fn enable_live(&self) -> bool { - self.bits_2 & (1 << 4) != 0 - } - pub fn enable_gray(&self) -> bool { - self.bits_2 & (1 << 5) != 0 - } - pub fn enable_white(&self) -> bool { - self.bits_2 & (1 << 6) != 0 - } - pub fn enable_black(&self) -> bool { - self.bits_2 & (1 << 7) != 0 - } - pub fn disableOffline(&self) -> bool { - self.bits_3 & (1 << 0) != 0 - } - pub fn castResonanceMagic(&self) -> bool { - self.bits_3 & (1 << 1) != 0 - } - pub fn isValidTough_ProtSADmg(&self) -> bool { - self.bits_3 & (1 << 2) != 0 - } - pub fn isWarpMagic(&self) -> bool { - self.bits_3 & (1 << 3) != 0 - } - pub fn enableRiding(&self) -> bool { - self.bits_3 & (1 << 4) != 0 - } - pub fn disableRiding(&self) -> bool { - self.bits_3 & (1 << 5) != 0 - } - pub fn isUseNoAttackRegion(&self) -> bool { - self.bits_3 & (1 << 6) != 0 - } - pub fn pad_1(&self) -> bool { - self.bits_3 & (1 << 7) != 0 - } - pub fn vowType8(&self) -> bool { - self.bits_4 & (1 << 0) != 0 - } - pub fn vowType9(&self) -> bool { - self.bits_4 & (1 << 1) != 0 - } - pub fn vowType10(&self) -> bool { - self.bits_4 & (1 << 2) != 0 - } - pub fn vowType11(&self) -> bool { - self.bits_4 & (1 << 3) != 0 - } - pub fn vowType12(&self) -> bool { - self.bits_4 & (1 << 4) != 0 - } - pub fn vowType13(&self) -> bool { - self.bits_4 & (1 << 5) != 0 - } - pub fn vowType14(&self) -> bool { - self.bits_4 & (1 << 6) != 0 - } - pub fn vowType15(&self) -> bool { - self.bits_4 & (1 << 7) != 0 - } -} -impl Default for MAGIC_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - yesNoDialogMessageId: 0, - limitCancelSpEffectId: -1, - sortId: 0, - requirementLuck: 0, - aiNotifyType: 0, - mp: 0, - stamina: 0, - iconId: 0, - behaviorId: 0, - mtrlItemId: -1, - replaceMagicId: -1, - maxQuantity: 0, - refCategory1: 0, - overDexterity: 0, - refCategory2: 0, - slotLength: 0, - requirementIntellect: 0, - requirementFaith: 0, - analogDexterityMin: 0, - analogDexterityMax: 0, - ezStateBehaviorType: 0, - refCategory3: 0, - spEffectCategory: 0, - refType: 0, - opmeMenuType: 0, - refCategory4: 0, - hasSpEffectType: 0, - replaceCategory: 0, - useLimitCategory: 0, - bits_1: 0, - bits_2: 0, - bits_3: 0, - bits_4: 0, - castSfxId: -1, - fireSfxId: -1, - effectSfxId: -1, - toughnessCorrectRate: 0., - ReplacementStatusType: 0, - ReplacementStatus1: -1, - ReplacementStatus2: -1, - ReplacementStatus3: -1, - ReplacementStatus4: -1, - refCategory5: 0, - consumeSA: 0, - ReplacementMagic1: -1, - ReplacementMagic2: -1, - ReplacementMagic3: -1, - ReplacementMagic4: -1, - mp_charge: 0, - stamina_charge: 0, - createLimitGroupId: 0, - refCategory6: 0, - subCategory1: 0, - subCategory2: 0, - refCategory7: 0, - refCategory8: 0, - refCategory9: 0, - refCategory10: 0, - refId1: -1, - refId2: -1, - refId3: -1, - aiUseJudgeId: -1, - refId4: -1, - refId5: -1, - refId6: -1, - refId7: -1, - refId8: -1, - refId9: -1, - refId10: -1, - consumeType1: 0, - consumeType2: 0, - consumeType3: 0, - consumeType4: 0, - consumeType5: 0, - consumeType6: 0, - consumeType7: 0, - consumeType8: 0, - consumeType9: 0, - consumeType10: 0, - consumeLoopMP_forMenu: -1, - pad: [0;8], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct MAP_DEFAULT_INFO_PARAM_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub EnableFastTravelEventFlagId: i32, - pub WeatherLotTimeOffsetIngameSeconds: i32, - pub WeatherCreateAssetLimitId: i8, - pub MapAiSightType: u8, - pub SoundIndoorType: u8, - pub ReverbDefaultType: i8, - pub BgmPlaceInfo: i16, - pub EnvPlaceInfo: i16, - pub MapAdditionalSoundBankId: i32, - pub MapHeightForSound: i16, - pub IsEnableBlendTimezoneEnvmap: u8, - pub OverrideGIResolution_XSS: i8, - pub MapLoHiChangeBorderDist_XZ: f32, - pub MapLoHiChangeBorderDist_Y: f32, - pub MapLoHiChangePlayDist: f32, - pub MapAutoDrawGroupBackFacePixelNum: i32, - pub PlayerLigntScale: f32, - pub IsEnableTimezonnePlayerLigntScale: u8, - pub isDisableAutoCliffWind: u8, - pub OpenChrActivateThreshold: i16, - pub MapMimicryEstablishmentParamId: i32, - pub OverrideGIResolution_XSX: i8, - pub Reserve: [u8;7], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl MAP_DEFAULT_INFO_PARAM_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } -} -impl Default for MAP_DEFAULT_INFO_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - EnableFastTravelEventFlagId: 0, - WeatherLotTimeOffsetIngameSeconds: 0, - WeatherCreateAssetLimitId: -1, - MapAiSightType: 0, - SoundIndoorType: 0, - ReverbDefaultType: -1, - BgmPlaceInfo: 0, - EnvPlaceInfo: 0, - MapAdditionalSoundBankId: -1, - MapHeightForSound: 0, - IsEnableBlendTimezoneEnvmap: 1, - OverrideGIResolution_XSS: -1, - MapLoHiChangeBorderDist_XZ: 40., - MapLoHiChangeBorderDist_Y: 40., - MapLoHiChangePlayDist: 5., - MapAutoDrawGroupBackFacePixelNum: 32400, - PlayerLigntScale: 1., - IsEnableTimezonnePlayerLigntScale: 1, - isDisableAutoCliffWind: 0, - OpenChrActivateThreshold: -1, - MapMimicryEstablishmentParamId: -1, - OverrideGIResolution_XSX: -1, - Reserve: [0;7], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct MAP_GD_REGION_DRAW_PARAM { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub overrideIVLocalLightScale: f32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl MAP_GD_REGION_DRAW_PARAM { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } -} -impl Default for MAP_GD_REGION_DRAW_PARAM { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - overrideIVLocalLightScale: -1., - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct MAP_GD_REGION_ID_PARAM_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub mapRegionId: i32, - pub Reserve: [u8;24], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl MAP_GD_REGION_ID_PARAM_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } -} -impl Default for MAP_GD_REGION_ID_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - mapRegionId: 0, - Reserve: [0;24], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct MAP_GRID_CREATE_HEIGHT_LIMIT_INFO_PARAM_ST { - pub GridEnableCreateHeightMin: f32, - pub GridEnableCreateHeightMax: f32, - pub Reserve: [u8;24], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl MAP_GRID_CREATE_HEIGHT_LIMIT_INFO_PARAM_ST { -} -impl Default for MAP_GRID_CREATE_HEIGHT_LIMIT_INFO_PARAM_ST { - fn default() -> Self { - Self { - GridEnableCreateHeightMin: -99999., - GridEnableCreateHeightMax: 99999., - Reserve: [0;24], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct MAP_MIMICRY_ESTABLISHMENT_PARAM_ST { - pub mimicryEstablishment0: f32, - pub mimicryEstablishment1: f32, - pub mimicryEstablishment2: f32, - pub mimicryBeginSfxId0: i32, - pub mimicrySfxId0: i32, - pub mimicryEndSfxId0: i32, - pub mimicryBeginSfxId1: i32, - pub mimicrySfxId1: i32, - pub mimicryEndSfxId1: i32, - pub mimicryBeginSfxId2: i32, - pub mimicrySfxId2: i32, - pub mimicryEndSfxId2: i32, - pub pad1: [u8;16], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl MAP_MIMICRY_ESTABLISHMENT_PARAM_ST { -} -impl Default for MAP_MIMICRY_ESTABLISHMENT_PARAM_ST { - fn default() -> Self { - Self { - mimicryEstablishment0: -1., - mimicryEstablishment1: -1., - mimicryEstablishment2: -1., - mimicryBeginSfxId0: -1, - mimicrySfxId0: -1, - mimicryEndSfxId0: -1, - mimicryBeginSfxId1: -1, - mimicrySfxId1: -1, - mimicryEndSfxId1: -1, - mimicryBeginSfxId2: -1, - mimicrySfxId2: -1, - mimicryEndSfxId2: -1, - pad1: [0;16], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct MAP_NAME_TEX_PARAM_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub srcR: u8, - pub srcG: u8, - pub srcB: u8, - pub pad1: [u8;1], - pub mapNameId: i32, - pub pad2: [u8;4], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl MAP_NAME_TEX_PARAM_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } -} -impl Default for MAP_NAME_TEX_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - srcR: 0, - srcG: 0, - srcB: 0, - pad1: [0;1], - mapNameId: 0, - pad2: [0;4], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct MAP_PIECE_TEX_PARAM_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub srcR: u8, - pub srcG: u8, - pub srcB: u8, - pub pad1: [u8;1], - pub saveMapNameId: i32, - pub multiPlayAreaId: i32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl MAP_PIECE_TEX_PARAM_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } -} -impl Default for MAP_PIECE_TEX_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - srcR: 0, - srcG: 0, - srcB: 0, - pad1: [0;1], - saveMapNameId: -1, - multiPlayAreaId: -1, - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct MATERIAL_EX_PARAM_ST { - pub paramName: [u8;32], - pub materialId: i32, - pub materialParamValue0: f32, - pub materialParamValue1: f32, - pub materialParamValue2: f32, - pub materialParamValue3: f32, - pub materialParamValue4: f32, - pub pad: [u8;8], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl MATERIAL_EX_PARAM_ST { -} -impl Default for MATERIAL_EX_PARAM_ST { - fn default() -> Self { - Self { - paramName: [0;32], - materialId: -1, - materialParamValue0: 0., - materialParamValue1: 0., - materialParamValue2: 0., - materialParamValue3: 0., - materialParamValue4: 1., - pad: [0;8], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct MENU_COMMON_PARAM_ST { - pub soloPlayDeath_ToFadeOutTime: f32, - pub partyGhostDeath_ToFadeOutTime: f32, - pub playerMaxHpLimit: i32, - pub playerMaxMpLimit: i32, - pub playerMaxSpLimit: i32, - pub actionPanelChangeThreshold_Vel: f32, - pub actionPanelChangeThreshold_PassTime: f32, - pub kgIconVspace: i32, - pub worldMapCursorSelectRadius: f32, - pub reserved8: [u8;4], - pub decalPosOffsetX: i32, - pub decalPosOffsetY: i32, - pub targetStateSearchDurationTime: f32, - pub targetStateBattleDurationTime: f32, - pub worldMapCursorSpeed: f32, - pub worldMapCursorFirstDistance: f32, - pub worldMapCursorFirstDelay: f32, - pub worldMapCursorWaitTime: f32, - pub worldMapCursorSnapRadius: f32, - pub worldMapCursorSnapTime: f32, - pub itemGetLogAliveTime: f32, - pub playerMaxSaLimit: i32, - pub worldMap_IsChangeableLayerEventFlagId: i32, - pub worldMap_TravelMargin: f32, - pub systemAnnounceScrollBufferTime: f32, - pub systemAnnounceScrollSpeed: i32, - pub systemAnnounceNoScrollWaitTime: f32, - pub systemAnnounceScrollCount: u8, - pub reserved17: [u8;3], - pub compassMemoDispDistance: f32, - pub compassBonfireDispDistance: f32, - pub markerGoalThreshold: f32, - pub svSliderStep: f32, - pub preOpeningMovie_WaitSec: f32, - pub kgIconScale: f32, - pub kgIconScale_forTable: f32, - pub kgIconVspace_forTable: i32, - pub kgIconScale_forConfig: f32, - pub kgIconVspace_forConfig: i32, - pub worldMap_SearchRadius: f32, - pub tutorialDisplayTime: f32, - pub compassFriendHostInnerDistance: f32, - pub compassEnemyHostInnerDistance: f32, - pub compassFriendGuestInnerDistance: f32, - pub cutsceneKeyGuideAliveTime: f32, - pub autoHideHpThresholdRatio: f32, - pub autoHideHpThresholdValue: i32, - pub autoHideMpThresholdRatio: f32, - pub autoHideMpThresholdValue: i32, - pub autoHideSpThresholdRatio: f32, - pub autoHideSpThresholdValue: i32, - pub worldMapZoomAnimationTime: f32, - pub worldMapIconScaleMin: f32, - pub worldMap_TravelMargin_Point: f32, - pub enemyTagSafeLeft: i16, - pub enemyTagSafeRight: i16, - pub enemyTagSafeTop: i16, - pub enemyTagSafeBottom: i16, - pub pcHorseHpRecoverDispThreshold: i32, - pub reserved33: [u8;32], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl MENU_COMMON_PARAM_ST { -} -impl Default for MENU_COMMON_PARAM_ST { - fn default() -> Self { - Self { - soloPlayDeath_ToFadeOutTime: 0., - partyGhostDeath_ToFadeOutTime: 0., - playerMaxHpLimit: 0, - playerMaxMpLimit: 0, - playerMaxSpLimit: 0, - actionPanelChangeThreshold_Vel: 0., - actionPanelChangeThreshold_PassTime: 0., - kgIconVspace: 0, - worldMapCursorSelectRadius: 0.1, - reserved8: [0;4], - decalPosOffsetX: 0, - decalPosOffsetY: 0, - targetStateSearchDurationTime: 0., - targetStateBattleDurationTime: 0., - worldMapCursorSpeed: 1., - worldMapCursorFirstDistance: 1., - worldMapCursorFirstDelay: 0.01, - worldMapCursorWaitTime: 0., - worldMapCursorSnapRadius: 0.1, - worldMapCursorSnapTime: 0.01, - itemGetLogAliveTime: 0.01, - playerMaxSaLimit: 0, - worldMap_IsChangeableLayerEventFlagId: 0, - worldMap_TravelMargin: 0., - systemAnnounceScrollBufferTime: 0., - systemAnnounceScrollSpeed: 100, - systemAnnounceNoScrollWaitTime: 0., - systemAnnounceScrollCount: 1, - reserved17: [0;3], - compassMemoDispDistance: 50., - compassBonfireDispDistance: 50., - markerGoalThreshold: 0., - svSliderStep: 10., - preOpeningMovie_WaitSec: 0., - kgIconScale: 100., - kgIconScale_forTable: 100., - kgIconVspace_forTable: 0, - kgIconScale_forConfig: 100., - kgIconVspace_forConfig: 0, - worldMap_SearchRadius: 256., - tutorialDisplayTime: 3., - compassFriendHostInnerDistance: 0., - compassEnemyHostInnerDistance: 0., - compassFriendGuestInnerDistance: 0., - cutsceneKeyGuideAliveTime: 5., - autoHideHpThresholdRatio: -1., - autoHideHpThresholdValue: -1, - autoHideMpThresholdRatio: -1., - autoHideMpThresholdValue: -1, - autoHideSpThresholdRatio: -1., - autoHideSpThresholdValue: -1, - worldMapZoomAnimationTime: 0.5, - worldMapIconScaleMin: 1., - worldMap_TravelMargin_Point: 0., - enemyTagSafeLeft: 0, - enemyTagSafeRight: 1920, - enemyTagSafeTop: 0, - enemyTagSafeBottom: 1080, - pcHorseHpRecoverDispThreshold: 0, - reserved33: [0;32], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct MENU_OFFSCR_REND_PARAM_ST { - pub camAtPosX: f32, - pub camAtPosY: f32, - pub camAtPosZ: f32, - pub camDist: f32, - pub camRotX: f32, - pub camRotY: f32, - pub camFov: f32, - pub camDistMin: f32, - pub camDistMax: f32, - pub camRotXMin: f32, - pub camRotXMax: f32, - pub GparamID: i32, - pub envTexId: i32, - pub Grapm_ID_forPS4: i32, - pub Grapm_ID_forXB1: i32, - pub pad: [u8;4], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl MENU_OFFSCR_REND_PARAM_ST { -} -impl Default for MENU_OFFSCR_REND_PARAM_ST { - fn default() -> Self { - Self { - camAtPosX: 0., - camAtPosY: 0., - camAtPosZ: 0., - camDist: 10., - camRotX: 0., - camRotY: 0., - camFov: 49., - camDistMin: 0., - camDistMax: 100., - camRotXMin: -89., - camRotXMax: 89., - GparamID: 10, - envTexId: 10, - Grapm_ID_forPS4: 10, - Grapm_ID_forXB1: 10, - pad: [0;4], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct MENU_PARAM_COLOR_TABLE_ST { - pub lerpMode: u8, - pub pad1: [u8;3], - pub h: i16, - pub pad2: [u8;2], - pub s1: f32, - pub v1: f32, - pub s2: f32, - pub v2: f32, - pub s3: f32, - pub v3: f32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl MENU_PARAM_COLOR_TABLE_ST { -} -impl Default for MENU_PARAM_COLOR_TABLE_ST { - fn default() -> Self { - Self { - lerpMode: 0, - pad1: [0;3], - h: 0, - pad2: [0;2], - s1: 1., - v1: 1., - s2: 1., - v2: 1., - s3: 1., - v3: 1., - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct MENUPROPERTY_LAYOUT { - pub LayoutPath: [u8;16], - pub PropertyID: i32, - pub CaptionTextID: i32, - pub HelpTextID: i32, - pub reserved: [u8;4], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl MENUPROPERTY_LAYOUT { -} -impl Default for MENUPROPERTY_LAYOUT { - fn default() -> Self { - Self { - LayoutPath: [0;16], - PropertyID: 0, - CaptionTextID: 0, - HelpTextID: 0, - reserved: [0;4], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct MENUPROPERTY_SPEC { - pub CaptionTextID: i32, - pub IconID: i32, - pub RequiredPropertyID: i32, - pub CompareType: i8, - pub pad2: [u8;1], - pub FormatType: i16, - pub pad: [u8;16], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl MENUPROPERTY_SPEC { -} -impl Default for MENUPROPERTY_SPEC { - fn default() -> Self { - Self { - CaptionTextID: 0, - IconID: 0, - RequiredPropertyID: 0, - CompareType: 0, - pad2: [0;1], - FormatType: 0, - pad: [0;16], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct MENU_VALUE_TABLE_SPEC { - pub value: i32, - pub textId: i32, - pub compareType: i8, - pub padding: [u8;3], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl MENU_VALUE_TABLE_SPEC { -} -impl Default for MENU_VALUE_TABLE_SPEC { - fn default() -> Self { - Self { - value: 0, - textId: 0, - compareType: 0, - padding: [0;3], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct MIMICRY_ESTABLISHMENT_TEX_PARAM_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub srcR: u8, - pub srcG: u8, - pub srcB: u8, - pub pad1: [u8;1], - pub mimicryEstablishmentParamId: i32, - pub pad2: [u8;4], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl MIMICRY_ESTABLISHMENT_TEX_PARAM_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } -} -impl Default for MIMICRY_ESTABLISHMENT_TEX_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - srcR: 0, - srcG: 0, - srcB: 0, - pad1: [0;1], - mimicryEstablishmentParamId: -1, - pad2: [0;4], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct MISSILE_PARAM_ST { - pub FFXID: i32, - pub LifeTime: i16, - pub HitSphereRadius: i16, - pub HitDamage: i16, - pub reserve0: [u8;6], - pub InitVelocity: f32, - pub distance: f32, - pub gravityInRange: f32, - pub gravityOutRange: f32, - pub mp: i32, - pub accelInRange: f32, - pub accelOutRange: f32, - pub reserve1: [u8;20], - pub HitMissileID: i16, - pub DiedNaturaly: u8, - pub ExplosionDie: u8, - pub behaviorId: i32, - pub reserve_last: [u8;56], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl MISSILE_PARAM_ST { -} -impl Default for MISSILE_PARAM_ST { - fn default() -> Self { - Self { - FFXID: 0, - LifeTime: 0, - HitSphereRadius: 0, - HitDamage: 0, - reserve0: [0;6], - InitVelocity: 0., - distance: 0., - gravityInRange: 0., - gravityOutRange: 0., - mp: 0, - accelInRange: 0., - accelOutRange: 0., - reserve1: [0;20], - HitMissileID: 0, - DiedNaturaly: 0, - ExplosionDie: 0, - behaviorId: 0, - reserve_last: [0;56], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct MODEL_SFX_PARAM_ST { - pub sfxId_0: i32, - pub dmypolyId_0: i32, - pub reserve_0: [u8;8], - pub sfxId_1: i32, - pub dmypolyId_1: i32, - pub reserve_1: [u8;8], - pub sfxId_2: i32, - pub dmypolyId_2: i32, - pub reserve_2: [u8;8], - pub sfxId_3: i32, - pub dmypolyId_3: i32, - pub reserve_3: [u8;8], - pub sfxId_4: i32, - pub dmypolyId_4: i32, - pub reserve_4: [u8;8], - pub sfxId_5: i32, - pub dmypolyId_5: i32, - pub reserve_5: [u8;8], - pub sfxId_6: i32, - pub dmypolyId_6: i32, - pub reserve_6: [u8;8], - pub sfxId_7: i32, - pub dmypolyId_7: i32, - pub reserve_7: [u8;8], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl MODEL_SFX_PARAM_ST { -} -impl Default for MODEL_SFX_PARAM_ST { - fn default() -> Self { - Self { - sfxId_0: -1, - dmypolyId_0: -1, - reserve_0: [0;8], - sfxId_1: -1, - dmypolyId_1: -1, - reserve_1: [0;8], - sfxId_2: -1, - dmypolyId_2: -1, - reserve_2: [0;8], - sfxId_3: -1, - dmypolyId_3: -1, - reserve_3: [0;8], - sfxId_4: -1, - dmypolyId_4: -1, - reserve_4: [0;8], - sfxId_5: -1, - dmypolyId_5: -1, - reserve_5: [0;8], - sfxId_6: -1, - dmypolyId_6: -1, - reserve_6: [0;8], - sfxId_7: -1, - dmypolyId_7: -1, - reserve_7: [0;8], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct MOVE_PARAM_ST { - pub stayId: i32, - pub walkF: i32, - pub walkB: i32, - pub walkL: i32, - pub walkR: i32, - pub dashF: i32, - pub dashB: i32, - pub dashL: i32, - pub dashR: i32, - pub superDash: i32, - pub escapeF: i32, - pub escapeB: i32, - pub escapeL: i32, - pub escapeR: i32, - pub turnL: i32, - pub trunR: i32, - pub largeTurnL: i32, - pub largeTurnR: i32, - pub stepMove: i32, - pub flyStay: i32, - pub flyWalkF: i32, - pub flyWalkFL: i32, - pub flyWalkFR: i32, - pub flyWalkFL2: i32, - pub flyWalkFR2: i32, - pub flyDashF: i32, - pub flyDashFL: i32, - pub flyDashFR: i32, - pub flyDashFL2: i32, - pub flyDashFR2: i32, - pub dashEscapeF: i32, - pub dashEscapeB: i32, - pub dashEscapeL: i32, - pub dashEscapeR: i32, - pub analogMoveParamId: i32, - pub turnNoAnimAngle: u8, - pub turn45Angle: u8, - pub turn90Angle: u8, - pub turnWaitNoAnimAngle: u8, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl MOVE_PARAM_ST { -} -impl Default for MOVE_PARAM_ST { - fn default() -> Self { - Self { - stayId: -1, - walkF: -1, - walkB: -1, - walkL: -1, - walkR: -1, - dashF: -1, - dashB: -1, - dashL: -1, - dashR: -1, - superDash: -1, - escapeF: -1, - escapeB: -1, - escapeL: -1, - escapeR: -1, - turnL: -1, - trunR: -1, - largeTurnL: -1, - largeTurnR: -1, - stepMove: -1, - flyStay: -1, - flyWalkF: -1, - flyWalkFL: -1, - flyWalkFR: -1, - flyWalkFL2: -1, - flyWalkFR2: -1, - flyDashF: -1, - flyDashFL: -1, - flyDashFR: -1, - flyDashFL2: -1, - flyDashFR2: -1, - dashEscapeF: -1, - dashEscapeB: -1, - dashEscapeL: -1, - dashEscapeR: -1, - analogMoveParamId: -1, - turnNoAnimAngle: 0, - turn45Angle: 0, - turn90Angle: 0, - turnWaitNoAnimAngle: 0, - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct MULTI_ESTUS_FLASK_BONUS_PARAM_ST { - pub host: u8, - pub WhiteGhost_None: u8, - pub WhiteGhost_Umbasa: u8, - pub WhiteGhost_Berserker: u8, - pub BlackGhost_None_Sign: u8, - pub BlackGhost_Umbasa_Sign: u8, - pub BlackGhost_Berserker_Sign: u8, - pub BlackGhost_None_Invade: u8, - pub BlackGhost_Umbasa_Invade: u8, - pub BlackGhost_Berserker_Invade: u8, - pub RedHunter1: u8, - pub RedHunter2: u8, - pub GuardianOfForest: u8, - pub GuardianOfAnor: u8, - pub BattleRoyal: u8, - pub YellowMonk: u8, - pub pad1: [u8;48], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl MULTI_ESTUS_FLASK_BONUS_PARAM_ST { -} -impl Default for MULTI_ESTUS_FLASK_BONUS_PARAM_ST { - fn default() -> Self { - Self { - host: 0, - WhiteGhost_None: 0, - WhiteGhost_Umbasa: 0, - WhiteGhost_Berserker: 0, - BlackGhost_None_Sign: 0, - BlackGhost_Umbasa_Sign: 0, - BlackGhost_Berserker_Sign: 0, - BlackGhost_None_Invade: 0, - BlackGhost_Umbasa_Invade: 0, - BlackGhost_Berserker_Invade: 0, - RedHunter1: 0, - RedHunter2: 0, - GuardianOfForest: 0, - GuardianOfAnor: 0, - BattleRoyal: 0, - YellowMonk: 0, - pad1: [0;48], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct MULTI_PLAY_CORRECTION_PARAM_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub client1SpEffectId: i32, - pub client2SpEffectId: i32, - pub client3SpEffectId: i32, - pub bOverrideSpEffect: u8, - pub pad3: [u8;15], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl MULTI_PLAY_CORRECTION_PARAM_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } -} -impl Default for MULTI_PLAY_CORRECTION_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - client1SpEffectId: -1, - client2SpEffectId: -1, - client3SpEffectId: -1, - bOverrideSpEffect: 0, - pad3: [0;15], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct MULTI_SOUL_BONUS_RATE_PARAM_ST { - pub host: f32, - pub WhiteGhost_None: f32, - pub WhiteGhost_Umbasa: f32, - pub WhiteGhost_Berserker: f32, - pub BlackGhost_None_Sign: f32, - pub BlackGhost_Umbasa_Sign: f32, - pub BlackGhost_Berserker_Sign: f32, - pub BlackGhost_None_Invade: f32, - pub BlackGhost_Umbasa_Invade: f32, - pub BlackGhost_Berserker_Invade: f32, - pub RedHunter1: f32, - pub RedHunter2: f32, - pub GuardianOfForest: f32, - pub GuardianOfAnor: f32, - pub BattleRoyal: f32, - pub YellowMonk: f32, - pub pad1: [u8;64], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl MULTI_SOUL_BONUS_RATE_PARAM_ST { -} -impl Default for MULTI_SOUL_BONUS_RATE_PARAM_ST { - fn default() -> Self { - Self { - host: 0., - WhiteGhost_None: 0., - WhiteGhost_Umbasa: 0., - WhiteGhost_Berserker: 0., - BlackGhost_None_Sign: 0., - BlackGhost_Umbasa_Sign: 0., - BlackGhost_Berserker_Sign: 0., - BlackGhost_None_Invade: 0., - BlackGhost_Umbasa_Invade: 0., - BlackGhost_Berserker_Invade: 0., - RedHunter1: 0., - RedHunter2: 0., - GuardianOfForest: 0., - GuardianOfAnor: 0., - BattleRoyal: 0., - YellowMonk: 0., - pad1: [0;64], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct NETWORK_AREA_PARAM_ST { - pub cellSizeX: f32, - pub cellSizeY: f32, - pub cellSizeZ: f32, - pub cellOffsetX: f32, - pub cellOffsetY: f32, - pub cellOffsetZ: f32, - bits_0: u8, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl NETWORK_AREA_PARAM_ST { - pub fn enableBloodstain(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn enableBloodMessage(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } - pub fn enableGhost(&self) -> bool { - self.bits_0 & (1 << 2) != 0 - } - pub fn enableMultiPlay(&self) -> bool { - self.bits_0 & (1 << 3) != 0 - } - pub fn enableRingSearch(&self) -> bool { - self.bits_0 & (1 << 4) != 0 - } - pub fn enableBreakInSearch(&self) -> bool { - self.bits_0 & (1 << 5) != 0 - } -} -impl Default for NETWORK_AREA_PARAM_ST { - fn default() -> Self { - Self { - cellSizeX: 30., - cellSizeY: 8., - cellSizeZ: 30., - cellOffsetX: 0., - cellOffsetY: 0., - cellOffsetZ: 0., - bits_0: 0, - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct NETWORK_MSG_PARAM_ST { - pub priority: i16, - pub forcePlay: u8, - pub pad1: [u8;1], - pub normalWhite: i32, - pub umbasaWhite: i32, - pub berserkerWhite: i32, - pub sinnerHeroWhite: i32, - pub normalBlack: i32, - pub umbasaBlack: i32, - pub berserkerBlack: i32, - pub forceJoinBlack: i32, - pub forceJoinUmbasaBlack: i32, - pub forceJoinBerserkerBlack: i32, - pub sinnerHunterVisitor: i32, - pub redHunterVisitor: i32, - pub guardianOfBossVisitor: i32, - pub guardianOfForestMapVisitor: i32, - pub guardianOfAnolisVisitor: i32, - pub rosaliaBlack: i32, - pub forceJoinRosaliaBlack: i32, - pub redHunterVisitor2: i32, - pub npc1: i32, - pub npc2: i32, - pub npc3: i32, - pub npc4: i32, - pub battleRoyal: i32, - pub npc5: i32, - pub npc6: i32, - pub npc7: i32, - pub npc8: i32, - pub npc9: i32, - pub npc10: i32, - pub npc11: i32, - pub npc12: i32, - pub npc13: i32, - pub npc14: i32, - pub npc15: i32, - pub npc16: i32, - pub forceJoinBlack_B: i32, - pub normalWhite_Npc: i32, - pub forceJoinBlack_Npc: i32, - pub forceJoinBlack_B_Npc: i32, - pub forceJoinBlack_C_Npc: i32, - pub pad2: [u8;28], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl NETWORK_MSG_PARAM_ST { -} -impl Default for NETWORK_MSG_PARAM_ST { - fn default() -> Self { - Self { - priority: 0, - forcePlay: 0, - pad1: [0;1], - normalWhite: -1, - umbasaWhite: -1, - berserkerWhite: -1, - sinnerHeroWhite: -1, - normalBlack: -1, - umbasaBlack: -1, - berserkerBlack: -1, - forceJoinBlack: -1, - forceJoinUmbasaBlack: -1, - forceJoinBerserkerBlack: -1, - sinnerHunterVisitor: -1, - redHunterVisitor: -1, - guardianOfBossVisitor: -1, - guardianOfForestMapVisitor: -1, - guardianOfAnolisVisitor: -1, - rosaliaBlack: -1, - forceJoinRosaliaBlack: -1, - redHunterVisitor2: -1, - npc1: -1, - npc2: -1, - npc3: -1, - npc4: -1, - battleRoyal: -1, - npc5: -1, - npc6: -1, - npc7: -1, - npc8: -1, - npc9: -1, - npc10: -1, - npc11: -1, - npc12: -1, - npc13: -1, - npc14: -1, - npc15: -1, - npc16: -1, - forceJoinBlack_B: -1, - normalWhite_Npc: -1, - forceJoinBlack_Npc: -1, - forceJoinBlack_B_Npc: -1, - forceJoinBlack_C_Npc: -1, - pad2: [0;28], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct NETWORK_PARAM_ST { - pub signVerticalOffset: f32, - pub maxSignPosCorrectionRange: f32, - pub summonTimeoutTime: f32, - pub pad_0: [u8;4], - pub signPuddleActiveMessageIntervalSec: f32, - pub keyGuideHeight_0: f32, - pub reloadSignIntervalTime1: f32, - pub reloadSignIntervalTime2: f32, - pub reloadSignTotalCount_0: i32, - pub reloadSignCellCount_0: i32, - pub updateSignIntervalTime: f32, - pub basicExclusiveRange_0: f32, - pub basicExclusiveHeight_0: f32, - pub previewChrWaitingTime: f32, - pub signVisibleRange_0: f32, - pub cellGroupHorizontalRange_0: i32, - pub cellGroupTopRange_0: i32, - pub cellGroupBottomRange_0: i32, - pub minWhitePhantomLimitTimeScale: f32, - pub minSmallPhantomLimitTimeScale: f32, - pub whiteKeywordLimitTimeScale: f32, - pub smallKeywordLimitTimeScale: f32, - pub blackKeywordLimitTimeScale: f32, - pub dragonKeywordLimitTimeScale: f32, - pub singGetMax: i32, - pub signDownloadSpan: f32, - pub signUpdateSpan: f32, - pub signPad: [u8;4], - pub maxBreakInTargetListCount: i32, - pub breakInRequestIntervalTimeSec: f32, - pub breakInRequestTimeOutSec: f32, - pub pad_1: [u8;4], - pub keyGuideRange: f32, - pub keyGuideHeight_1: f32, - pub reloadSignTotalCount_1: i32, - pub reloadNewSignCellCount: i32, - pub reloadRandomSignCellCount: i32, - pub maxSignTotalCount_0: i32, - pub maxSignCellCount_0: i32, - pub basicExclusiveRange_1: f32, - pub basicExclusiveHeight_1: f32, - pub signVisibleRange_1: f32, - pub maxWriteSignCount: i32, - pub maxReadSignCount: i32, - pub reloadSignIntervalTime_0: f32, - pub cellGroupHorizontalRange_1: i32, - pub cellGroupTopRange_1: i32, - pub cellGroupBottomRange_1: i32, - pub lifeTime_0: i32, - pub downloadSpan_0: f32, - pub downloadEvaluationSpan: f32, - pub pad_2: [u8;4], - pub deadingGhostStartPosThreshold: f32, - pub keyGuideHeight_2: f32, - pub keyGuideRangePlayer: f32, - pub keyGuideHeightPlayer: f32, - pub reloadSignTotalCount_2: i32, - pub reloadSignCellCount_1: i32, - pub maxSignTotalCount_1: i32, - pub maxSignCellCount_1: i32, - pub reloadSignIntervalTime_1: f32, - pub signVisibleRange_2: f32, - pub basicExclusiveRange_2: f32, - pub basicExclusiveHeight_2: f32, - pub cellGroupHorizontalRange_2: i32, - pub cellGroupTopRange_2: i32, - pub cellGroupBottomRange_2: i32, - pub lifeTime_1: i32, - pub recordDeadingGhostTotalTime: f32, - pub recordDeadingGhostMinTime: f32, - pub downloadSpan_1: f32, - pub statueCreatableDistance: f32, - pub reloadGhostTotalCount: i32, - pub reloadGhostCellCount: i32, - pub maxGhostTotalCount: i32, - pub distanceOfBeginRecordVersus: f32, - pub distanceOfEndRecordVersus: f32, - pub updateWanderGhostIntervalTime: f32, - pub updateVersusGhostIntervalTime: f32, - pub recordWanderingGhostTime: f32, - pub recordWanderingGhostMinTime: f32, - pub updateBonfireGhostIntervalTime: f32, - pub replayGhostRangeOnView: f32, - pub replayGhostRangeOutView: f32, - pub replayBonfireGhostTime: f32, - pub minBonfireGhostValidRange: f32, - pub maxBonfireGhostValidRange: f32, - pub minReplayIntervalTime: f32, - pub maxReplayIntervalTime: f32, - pub reloadGhostIntervalTime: f32, - pub cellGroupHorizontalRange_3: i32, - pub cellGroupTopRange_3: i32, - pub replayBonfirePhantomParamIdForCodename: i32, - pub replayBonfireModeRange: f32, - pub replayBonfirePhantomParamId: i32, - pub ghostpad: [u8;4], - pub reloadVisitListCoolTime: f32, - pub maxCoopBlueSummonCount: i32, - pub maxBellGuardSummonCount: i32, - pub maxVisitListCount: i32, - pub reloadSearch_CoopBlue_Min: f32, - pub reloadSearch_CoopBlue_Max: f32, - pub reloadSearch_BellGuard_Min: f32, - pub reloadSearch_BellGuard_Max: f32, - pub reloadSearch_RatKing_Min: f32, - pub reloadSearch_RatKing_Max: f32, - pub visitpad00: [u8;8], - pub srttMaxLimit: f32, - pub srttMeanLimit: f32, - pub srttMeanDeviationLimit: f32, - pub darkPhantomLimitBoostTime: f32, - pub darkPhantomLimitBoostScale: f32, - pub multiplayDisableLifeTime: f32, - pub abyssMultiplayLimit: u8, - pub phantomWarpMinimumTime: u8, - pub phantomReturnDelayTime: u8, - pub terminateTimeoutTime: u8, - pub penaltyPointLanDisconnect: i16, - pub penaltyPointSignout: i16, - pub penaltyPointReboot: i16, - pub penaltyPointBeginPenalize: i16, - pub penaltyForgiveItemLimitTime: f32, - pub allAreaSearchRate_CoopBlue: u8, - pub allAreaSearchRate_VsBlue: u8, - pub allAreaSearchRate_BellGuard: u8, - pub bloodMessageEvalHealRate: u8, - pub smallGoldSuccessHostRewardId: i32, - pub doorInvalidPlayAreaExtents: f32, - pub signDisplayMax: u8, - pub bloodStainDisplayMax: u8, - pub bloodMessageDisplayMax: u8, - pub pad00: [u8;9], - pub pad10: [u8;32], - pub summonMessageInterval: f32, - pub hostRegisterUpdateTime: f32, - pub hostTimeOutTime: f32, - pub guestUpdateTime: f32, - pub guestPlayerNoTimeOutTime: f32, - pub hostPlayerNoTimeOutTime: f32, - pub requestSearchQuickMatchLimit: i32, - pub AvatarMatchSearchMax: i32, - pub BattleRoyalMatchSearchMin: i32, - pub BattleRoyalMatchSearchMax: i32, - pub pad11: [u8;8], - pub VisitorListMax: i32, - pub VisitorTimeOutTime: f32, - pub DownloadSpan_2: f32, - pub VisitorGuestRequestMessageIntervalSec: f32, - pub wanderGhostIntervalLifeTime: f32, - pub pad13: [u8;12], - pub YellowMonkTimeOutTime: f32, - pub YellowMonkDownloadSpan: f32, - pub YellowMonkOverallFlowTimeOutTime: f32, - pub pad14_0: [u8;4], - pub pad14_1: [u8;8], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl NETWORK_PARAM_ST { -} -impl Default for NETWORK_PARAM_ST { - fn default() -> Self { - Self { - signVerticalOffset: 0., - maxSignPosCorrectionRange: 0., - summonTimeoutTime: 0., - pad_0: [0;4], - signPuddleActiveMessageIntervalSec: 1., - keyGuideHeight_0: 1., - reloadSignIntervalTime1: 1., - reloadSignIntervalTime2: 1., - reloadSignTotalCount_0: 1, - reloadSignCellCount_0: 1, - updateSignIntervalTime: 1., - basicExclusiveRange_0: 1., - basicExclusiveHeight_0: 1., - previewChrWaitingTime: 1., - signVisibleRange_0: 1., - cellGroupHorizontalRange_0: 1, - cellGroupTopRange_0: 1, - cellGroupBottomRange_0: 1, - minWhitePhantomLimitTimeScale: 1., - minSmallPhantomLimitTimeScale: 1., - whiteKeywordLimitTimeScale: 1., - smallKeywordLimitTimeScale: 1., - blackKeywordLimitTimeScale: 1., - dragonKeywordLimitTimeScale: 1., - singGetMax: 1, - signDownloadSpan: 1., - signUpdateSpan: 1., - signPad: [0;4], - maxBreakInTargetListCount: 1, - breakInRequestIntervalTimeSec: 4., - breakInRequestTimeOutSec: 20., - pad_1: [0;4], - keyGuideRange: 1., - keyGuideHeight_1: 1., - reloadSignTotalCount_1: 1, - reloadNewSignCellCount: 1, - reloadRandomSignCellCount: 1, - maxSignTotalCount_0: 1, - maxSignCellCount_0: 1, - basicExclusiveRange_1: 1., - basicExclusiveHeight_1: 1., - signVisibleRange_1: 1., - maxWriteSignCount: 1, - maxReadSignCount: 1, - reloadSignIntervalTime_0: 1., - cellGroupHorizontalRange_1: 1, - cellGroupTopRange_1: 1, - cellGroupBottomRange_1: 1, - lifeTime_0: 1, - downloadSpan_0: 0., - downloadEvaluationSpan: 0., - pad_2: [0;4], - deadingGhostStartPosThreshold: 1., - keyGuideHeight_2: 1., - keyGuideRangePlayer: 1., - keyGuideHeightPlayer: 1., - reloadSignTotalCount_2: 1, - reloadSignCellCount_1: 1, - maxSignTotalCount_1: 1, - maxSignCellCount_1: 1, - reloadSignIntervalTime_1: 1., - signVisibleRange_2: 1., - basicExclusiveRange_2: 1., - basicExclusiveHeight_2: 1., - cellGroupHorizontalRange_2: 1, - cellGroupTopRange_2: 1, - cellGroupBottomRange_2: 1, - lifeTime_1: 1, - recordDeadingGhostTotalTime: 0., - recordDeadingGhostMinTime: 5., - downloadSpan_1: 0., - statueCreatableDistance: 80., - reloadGhostTotalCount: 1, - reloadGhostCellCount: 1, - maxGhostTotalCount: 1, - distanceOfBeginRecordVersus: 1., - distanceOfEndRecordVersus: 1., - updateWanderGhostIntervalTime: 1., - updateVersusGhostIntervalTime: 1., - recordWanderingGhostTime: 1., - recordWanderingGhostMinTime: 5., - updateBonfireGhostIntervalTime: 1., - replayGhostRangeOnView: 1., - replayGhostRangeOutView: 1., - replayBonfireGhostTime: 1., - minBonfireGhostValidRange: 1., - maxBonfireGhostValidRange: 1., - minReplayIntervalTime: 1., - maxReplayIntervalTime: 1., - reloadGhostIntervalTime: 1., - cellGroupHorizontalRange_3: 1, - cellGroupTopRange_3: 1, - replayBonfirePhantomParamIdForCodename: 0, - replayBonfireModeRange: 1., - replayBonfirePhantomParamId: 0, - ghostpad: [0;4], - reloadVisitListCoolTime: 1., - maxCoopBlueSummonCount: 1, - maxBellGuardSummonCount: 1, - maxVisitListCount: 1, - reloadSearch_CoopBlue_Min: 0., - reloadSearch_CoopBlue_Max: 0., - reloadSearch_BellGuard_Min: 0., - reloadSearch_BellGuard_Max: 0., - reloadSearch_RatKing_Min: 0., - reloadSearch_RatKing_Max: 0., - visitpad00: [0;8], - srttMaxLimit: 1000., - srttMeanLimit: 1000., - srttMeanDeviationLimit: 1000., - darkPhantomLimitBoostTime: 1000., - darkPhantomLimitBoostScale: 1000., - multiplayDisableLifeTime: 1., - abyssMultiplayLimit: 10, - phantomWarpMinimumTime: 5, - phantomReturnDelayTime: 5, - terminateTimeoutTime: 30, - penaltyPointLanDisconnect: 0, - penaltyPointSignout: 0, - penaltyPointReboot: 0, - penaltyPointBeginPenalize: 0, - penaltyForgiveItemLimitTime: 0., - allAreaSearchRate_CoopBlue: 0, - allAreaSearchRate_VsBlue: 0, - allAreaSearchRate_BellGuard: 0, - bloodMessageEvalHealRate: 100, - smallGoldSuccessHostRewardId: 0, - doorInvalidPlayAreaExtents: 1., - signDisplayMax: 10, - bloodStainDisplayMax: 7, - bloodMessageDisplayMax: 3, - pad00: [0;9], - pad10: [0;32], - summonMessageInterval: 1., - hostRegisterUpdateTime: 1., - hostTimeOutTime: 1., - guestUpdateTime: 1., - guestPlayerNoTimeOutTime: 1., - hostPlayerNoTimeOutTime: 1., - requestSearchQuickMatchLimit: 1, - AvatarMatchSearchMax: 1, - BattleRoyalMatchSearchMin: 1, - BattleRoyalMatchSearchMax: 1, - pad11: [0;8], - VisitorListMax: 1, - VisitorTimeOutTime: 1., - DownloadSpan_2: 1., - VisitorGuestRequestMessageIntervalSec: 1., - wanderGhostIntervalLifeTime: 40., - pad13: [0;12], - YellowMonkTimeOutTime: 1., - YellowMonkDownloadSpan: 1., - YellowMonkOverallFlowTimeOutTime: 1., - pad14_0: [0;4], - pad14_1: [0;8], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct NPC_AI_ACTION_PARAM_ST { - pub moveDir: u8, - pub key1: u8, - pub key2: u8, - pub key3: u8, - pub bMoveDirHold: u8, - pub bKeyHold1: u8, - pub bKeyHold2: u8, - pub bKeyHold3: u8, - pub gestureId: i32, - pub bLifeEndSuccess: u8, - pub pad1: [u8;3], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl NPC_AI_ACTION_PARAM_ST { -} -impl Default for NPC_AI_ACTION_PARAM_ST { - fn default() -> Self { - Self { - moveDir: 0, - key1: 0, - key2: 0, - key3: 0, - bMoveDirHold: 0, - bKeyHold1: 0, - bKeyHold2: 0, - bKeyHold3: 0, - gestureId: 0, - bLifeEndSuccess: 0, - pad1: [0;3], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct NPC_AI_BEHAVIOR_PROBABILITY_PARAM_ST { - pub param000: i16, - pub param001: i16, - pub param002: i16, - pub param003: i16, - pub param004: i16, - pub param005: i16, - pub param006: i16, - pub param007: i16, - pub param008: i16, - pub param009: i16, - pub param010: i16, - pub param011: i16, - pub param012: i16, - pub param013: i16, - pub param014: i16, - pub param015: i16, - pub param016: i16, - pub param017: i16, - pub param018: i16, - pub param019: i16, - pub param020: i16, - pub param021: i16, - pub param022: i16, - pub param023: i16, - pub param024: i16, - pub param025: i16, - pub param026: i16, - pub param027: i16, - pub param028: i16, - pub param029: i16, - pub param030: i16, - pub param031: i16, - pub param032: i16, - pub param033: i16, - pub param034: i16, - pub param035: i16, - pub param036: i16, - pub param037: i16, - pub param038: i16, - pub param039: i16, - pub param040: i16, - pub param041: i16, - pub param042: i16, - pub param043: i16, - pub param044: i16, - pub param045: i16, - pub param046: i16, - pub param047: i16, - pub param048: i16, - pub param049: i16, - pub param050: i16, - pub param051: i16, - pub param052: i16, - pub param053: i16, - pub param054: i16, - pub param055: i16, - pub param056: i16, - pub param057: i16, - pub param058: i16, - pub param059: i16, - pub param060: i16, - pub param061: i16, - pub param062: i16, - pub param063: i16, - pub param064: i16, - pub param065: i16, - pub param066: i16, - pub param067: i16, - pub param068: i16, - pub param069: i16, - pub param070: i16, - pub param071: i16, - pub param072: i16, - pub param073: i16, - pub param074: i16, - pub param075: i16, - pub param076: i16, - pub param077: i16, - pub param078: i16, - pub param079: i16, - pub param080: i16, - pub param081: i16, - pub param082: i16, - pub param083: i16, - pub param084: i16, - pub param085: i16, - pub param086: i16, - pub param087: i16, - pub param088: i16, - pub param089: i16, - pub param090: i16, - pub param091: i16, - pub param092: i16, - pub param093: i16, - pub param094: i16, - pub param095: i16, - pub param096: i16, - pub param097: i16, - pub param098: i16, - pub param099: i16, - pub param100: i16, - pub param101: i16, - pub param102: i16, - pub param103: i16, - pub param104: i16, - pub param105: i16, - pub param106: i16, - pub param107: i16, - pub param108: i16, - pub param109: i16, - pub param110: i16, - pub param111: i16, - pub param112: i16, - pub param113: i16, - pub param114: i16, - pub param115: i16, - pub param116: i16, - pub param117: i16, - pub param118: i16, - pub param119: i16, - pub param120: i16, - pub param121: i16, - pub param122: i16, - pub param123: i16, - pub param124: i16, - pub param125: i16, - pub param126: i16, - pub param127: i16, - pub param128: i16, - pub param129: i16, - pub param130: i16, - pub param131: i16, - pub param132: i16, - pub param133: i16, - pub param134: i16, - pub param135: i16, - pub param136: i16, - pub param137: i16, - pub param138: i16, - pub param139: i16, - pub param140: i16, - pub param141: i16, - pub param142: i16, - pub param143: i16, - pub param144: i16, - pub param145: i16, - pub param146: i16, - pub param147: i16, - pub param148: i16, - pub param149: i16, - pub param150: i16, - pub param151: i16, - pub param152: i16, - pub param153: i16, - pub param154: i16, - pub param155: i16, - pub param156: i16, - pub param157: i16, - pub param158: i16, - pub param159: i16, - pub param160: i16, - pub param161: i16, - pub param162: i16, - pub param163: i16, - pub param164: i16, - pub param165: i16, - pub param166: i16, - pub param167: i16, - pub param168: i16, - pub param169: i16, - pub param170: i16, - pub param171: i16, - pub param172: i16, - pub param173: i16, - pub param174: i16, - pub param175: i16, - pub param176: i16, - pub param177: i16, - pub param178: i16, - pub param179: i16, - pub param180: i16, - pub param181: i16, - pub param182: i16, - pub param183: i16, - pub param184: i16, - pub param185: i16, - pub param186: i16, - pub param187: i16, - pub param188: i16, - pub param189: i16, - pub param190: i16, - pub param191: i16, - pub param192: i16, - pub param193: i16, - pub param194: i16, - pub param195: i16, - pub param196: i16, - pub param197: i16, - pub param198: i16, - pub param199: i16, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl NPC_AI_BEHAVIOR_PROBABILITY_PARAM_ST { -} -impl Default for NPC_AI_BEHAVIOR_PROBABILITY_PARAM_ST { - fn default() -> Self { - Self { - param000: 0, - param001: 0, - param002: 0, - param003: 0, - param004: 0, - param005: 0, - param006: 0, - param007: 0, - param008: 0, - param009: 0, - param010: 0, - param011: 0, - param012: 0, - param013: 0, - param014: 0, - param015: 0, - param016: 0, - param017: 0, - param018: 0, - param019: 0, - param020: 0, - param021: 0, - param022: 0, - param023: 0, - param024: 0, - param025: 0, - param026: 0, - param027: 0, - param028: 0, - param029: 0, - param030: 0, - param031: 0, - param032: 0, - param033: 0, - param034: 0, - param035: 0, - param036: 0, - param037: 0, - param038: 0, - param039: 0, - param040: 0, - param041: 0, - param042: 0, - param043: 0, - param044: 0, - param045: 0, - param046: 0, - param047: 0, - param048: 0, - param049: 0, - param050: 0, - param051: 0, - param052: 0, - param053: 0, - param054: 0, - param055: 0, - param056: 0, - param057: 0, - param058: 0, - param059: 0, - param060: 0, - param061: 0, - param062: 0, - param063: 0, - param064: 0, - param065: 0, - param066: 0, - param067: 0, - param068: 0, - param069: 0, - param070: 0, - param071: 0, - param072: 0, - param073: 0, - param074: 0, - param075: 0, - param076: 0, - param077: 0, - param078: 0, - param079: 0, - param080: 0, - param081: 0, - param082: 0, - param083: 0, - param084: 0, - param085: 0, - param086: 0, - param087: 0, - param088: 0, - param089: 0, - param090: 0, - param091: 0, - param092: 0, - param093: 0, - param094: 0, - param095: 0, - param096: 0, - param097: 0, - param098: 0, - param099: 0, - param100: 0, - param101: 0, - param102: 0, - param103: 0, - param104: 0, - param105: 0, - param106: 0, - param107: 0, - param108: 0, - param109: 0, - param110: 0, - param111: 0, - param112: 0, - param113: 0, - param114: 0, - param115: 0, - param116: 0, - param117: 0, - param118: 0, - param119: 0, - param120: 0, - param121: 0, - param122: 0, - param123: 0, - param124: 0, - param125: 0, - param126: 0, - param127: 0, - param128: 0, - param129: 0, - param130: 0, - param131: 0, - param132: 0, - param133: 0, - param134: 0, - param135: 0, - param136: 0, - param137: 0, - param138: 0, - param139: 0, - param140: 0, - param141: 0, - param142: 0, - param143: 0, - param144: 0, - param145: 0, - param146: 0, - param147: 0, - param148: 0, - param149: 0, - param150: 0, - param151: 0, - param152: 0, - param153: 0, - param154: 0, - param155: 0, - param156: 0, - param157: 0, - param158: 0, - param159: 0, - param160: 0, - param161: 0, - param162: 0, - param163: 0, - param164: 0, - param165: 0, - param166: 0, - param167: 0, - param168: 0, - param169: 0, - param170: 0, - param171: 0, - param172: 0, - param173: 0, - param174: 0, - param175: 0, - param176: 0, - param177: 0, - param178: 0, - param179: 0, - param180: 0, - param181: 0, - param182: 0, - param183: 0, - param184: 0, - param185: 0, - param186: 0, - param187: 0, - param188: 0, - param189: 0, - param190: 0, - param191: 0, - param192: 0, - param193: 0, - param194: 0, - param195: 0, - param196: 0, - param197: 0, - param198: 0, - param199: 0, - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct NPC_PARAM_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub behaviorVariationId: i32, - pub resistCorrectId_poison: i32, - pub nameId: i32, - pub turnVellocity: f32, - pub hitHeight: f32, - pub hitRadius: f32, - pub weight: i32, - pub hitYOffset: f32, - pub hp: i32, - pub mp: i32, - pub getSoul: i32, - pub itemLotId_enemy: i32, - pub itemLotId_map: i32, - pub maxAnkleRollAngle: f32, - pub chrHitGroupAndNavimesh: u8, - pub faceIconId: u8, - pub deactivateDist: i16, - pub chrActivateConditionParamId: i32, - pub footIkErrorHeightLimit: f32, - pub humanityLotId: i32, - pub spEffectID0: i32, - pub spEffectID1: i32, - pub spEffectID2: i32, - pub spEffectID3: i32, - pub spEffectID4: i32, - pub spEffectID5: i32, - pub spEffectID6: i32, - pub spEffectID7: i32, - pub GameClearSpEffectID: i32, - pub physGuardCutRate: f32, - pub magGuardCutRate: f32, - pub fireGuardCutRate: f32, - pub thunGuardCutRate: f32, - pub animIdOffset: i32, - pub lockGazePoint0: i16, - pub lockGazePoint1: i16, - pub lockGazePoint2: i16, - pub lockGazePoint3: i16, - pub lockGazePoint4: i16, - pub lockGazePoint5: i16, - pub networkWarpDist: f32, - pub dbgBehaviorR1: i32, - pub dbgBehaviorL1: i32, - pub dbgBehaviorR2: i32, - pub dbgBehaviorL2: i32, - pub dbgBehaviorRL: i32, - pub dbgBehaviorRR: i32, - pub dbgBehaviorRD: i32, - pub dbgBehaviorRU: i32, - pub dbgBehaviorLL: i32, - pub dbgBehaviorLR: i32, - pub dbgBehaviorLD: i32, - pub dbgBehaviorLU: i32, - pub animIdOffset2: i32, - pub partsDamageRate1: f32, - pub partsDamageRate2: f32, - pub partsDamageRate3: f32, - pub partsDamageRate4: f32, - pub partsDamageRate5: f32, - pub partsDamageRate6: f32, - pub partsDamageRate7: f32, - pub partsDamageRate8: f32, - pub weakPartsDamageRate: f32, - pub superArmorRecoverCorrection: f32, - pub superArmorBrakeKnockbackDist: f32, - pub stamina: i16, - pub staminaRecoverBaseVel: i16, - pub def_phys: i16, - pub def_slash: i16, - pub def_blow: i16, - pub def_thrust: i16, - pub def_mag: i16, - pub def_fire: i16, - pub def_thunder: i16, - pub defFlickPower: i16, - pub resist_poison: i16, - pub resist_desease: i16, - pub resist_blood: i16, - pub resist_curse: i16, - pub ghostModelId: i16, - pub normalChangeResouceId: i16, - pub guardAngle: i16, - pub slashGuardCutRate: i16, - pub blowGuardCutRate: i16, - pub thrustGuardCutRate: i16, - pub lockGazePoint6: i16, - pub normalChangeTexChrId: i16, - pub dropType: i16, - pub knockbackRate: u8, - pub knockbackParamId: u8, - pub fallDamageDump: u8, - pub staminaGuardDef: u8, - pub resist_sleep: i16, - pub resist_madness: i16, - pub sleepGuardResist: i8, - pub madnessGuardResist: i8, - pub lockGazePoint7: i16, - pub mpRecoverBaseVel: u8, - pub flickDamageCutRate: u8, - pub defaultLodParamId: i8, - pub drawType: i8, - pub npcType: u8, - pub teamType: u8, - pub moveType: u8, - pub lockDist: u8, - pub materialSe_Weak1: i16, - pub materialSfx_Weak1: i16, - pub partsDamageType: u8, - pub vowType: u8, - pub guardLevel: i8, - pub burnSfxType: u8, - pub poisonGuardResist: i8, - pub diseaseGuardResist: i8, - pub bloodGuardResist: i8, - pub curseGuardResist: i8, - pub parryAttack: u8, - pub parryDefence: u8, - pub sfxSize: u8, - pub pushOutCamRegionRadius: u8, - pub hitStopType: u8, - pub ladderEndChkOffsetTop: u8, - pub ladderEndChkOffsetLow: u8, - bits_1: u8, - bits_2: u8, - bits_3: u8, - bits_4: u8, - bits_5: u8, - bits_6: u8, - bits_7: u8, - pub itemSearchRadius: f32, - pub chrHitHeight: f32, - pub chrHitRadius: f32, - pub specialTurnType: u8, - bits_8: u8, - pub def_dark: i16, - pub threatLv: i32, - pub specialTurnDistanceThreshold: f32, - pub autoFootEffectSfxId: i32, - pub materialSe1: i16, - pub materialSfx1: i16, - pub materialSe_Weak2: i16, - pub materialSfx_Weak2: i16, - pub materialSe2: i16, - pub materialSfx2: i16, - pub spEffectID8: i32, - pub spEffectID9: i32, - pub spEffectID10: i32, - pub spEffectID11: i32, - pub spEffectID12: i32, - pub spEffectID13: i32, - pub spEffectID14: i32, - pub spEffectID15: i32, - pub autoFootEffectDecalBaseId1: i32, - pub toughness: i32, - pub toughnessRecoverCorrection: f32, - pub neutralDamageCutRate: f32, - pub slashDamageCutRate: f32, - pub blowDamageCutRate: f32, - pub thrustDamageCutRate: f32, - pub magicDamageCutRate: f32, - pub fireDamageCutRate: f32, - pub thunderDamageCutRate: f32, - pub darkDamageCutRate: f32, - pub darkGuardCutRate: f32, - pub clothUpdateOffset: i8, - pub npcPlayerWeightType: u8, - pub normalChangeModelId: i16, - pub normalChangeAnimChrId: i16, - pub paintRenderTargetSize: i16, - pub resistCorrectId_disease: i32, - pub phantomShaderId: i32, - pub multiPlayCorrectionParamId: i32, - pub maxAnklePitchAngle: f32, - pub resist_freeze: i16, - pub freezeGuardResist: i8, - pub pad1: [u8;1], - pub lockCameraParamId: i32, - pub spEffectID16: i32, - pub spEffectID17: i32, - pub spEffectID18: i32, - pub spEffectID19: i32, - pub spEffectID20: i32, - pub spEffectID21: i32, - pub spEffectID22: i32, - pub spEffectID23: i32, - pub spEffectID24: i32, - pub spEffectID25: i32, - pub spEffectID26: i32, - pub spEffectID27: i32, - pub spEffectID28: i32, - pub spEffectID29: i32, - pub spEffectID30: i32, - pub spEffectID31: i32, - pub disableLockOnAng: f32, - pub clothOffLodLevel: i8, - bits_9: u8, - pub estusFlaskRecoveryParamId: i16, - pub roleNameId: i32, - pub estusFlaskLotPoint: i16, - pub hpEstusFlaskLotPoint: i16, - pub mpEstusFlaskLotPoint: i16, - pub estusFlaskRecovery_failedLotPointAdd: i16, - pub hpEstusFlaskRecovery_failedLotPointAdd: i16, - pub mpEstusFlaskRecovery_failedLotPointAdd: i16, - pub WanderGhostPhantomId: i32, - pub hearingHeadSize: f32, - pub SoundBankId: i16, - pub forwardUndulationLimit: u8, - pub sideUndulationLimit: u8, - pub deactiveMoveSpeed: f32, - pub deactiveMoveDist: f32, - pub enableSoundObjDist: f32, - pub undulationCorrectGain: f32, - pub autoFootEffectDecalBaseId2: i16, - pub autoFootEffectDecalBaseId3: i16, - pub RetargetReferenceChrId: i16, - pub SfxResBankId: i16, - pub updateActivatePriolity: f32, - pub chrNavimeshFlag_Alive: u8, - pub chrNavimeshFlag_Dead: u8, - pub pad7: [u8;1], - pub wheelRotType: u8, - pub wheelRotRadius: f32, - pub retargetMoveRate: f32, - pub ladderWarpOffset: f32, - pub loadAssetId: i32, - pub overlapCameraDmypolyId: i32, - pub residentMaterialExParamId00: i32, - pub residentMaterialExParamId01: i32, - pub residentMaterialExParamId02: i32, - pub residentMaterialExParamId03: i32, - pub residentMaterialExParamId04: i32, - pub sleepCollectorItemLotId_enemy: i32, - pub sleepCollectorItemLotId_map: i32, - pub footIkErrorOnGain: f32, - pub footIkErrorOffGain: f32, - pub SoundAddBankId: i16, - pub materialVariationValue: u8, - pub materialVariationValue_Weak: u8, - pub superArmorDurability: f32, - pub saRecoveryRate: f32, - pub saGuardCutRate: f32, - pub resistCorrectId_blood: i32, - pub resistCorrectId_curse: i32, - pub resistCorrectId_freeze: i32, - pub resistCorrectId_sleep: i32, - pub resistCorrectId_madness: i32, - pub chrDeadTutorialFlagId: i32, - pub stepDispInterpolateTime: f32, - pub stepDispInterpolateTriggerValue: f32, - pub lockScoreOffset: f32, - pub pad12: [u8;8], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl NPC_PARAM_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } - pub fn useRagdollCamHit(&self) -> bool { - self.bits_1 & (1 << 0) != 0 - } - pub fn disableClothRigidHit(&self) -> bool { - self.bits_1 & (1 << 1) != 0 - } - pub fn useUndulationAddAnimFB(&self) -> bool { - self.bits_1 & (1 << 2) != 0 - } - pub fn isWeakA(&self) -> bool { - self.bits_1 & (1 << 3) != 0 - } - pub fn isGhost(&self) -> bool { - self.bits_1 & (1 << 4) != 0 - } - pub fn isNoDamageMotion(&self) -> bool { - self.bits_1 & (1 << 5) != 0 - } - pub fn isUnduration(&self) -> bool { - self.bits_1 & (1 << 6) != 0 - } - pub fn isChangeWanderGhost(&self) -> bool { - self.bits_1 & (1 << 7) != 0 - } - pub fn modelDispMask0(&self) -> bool { - self.bits_2 & (1 << 0) != 0 - } - pub fn modelDispMask1(&self) -> bool { - self.bits_2 & (1 << 1) != 0 - } - pub fn modelDispMask2(&self) -> bool { - self.bits_2 & (1 << 2) != 0 - } - pub fn modelDispMask3(&self) -> bool { - self.bits_2 & (1 << 3) != 0 - } - pub fn modelDispMask4(&self) -> bool { - self.bits_2 & (1 << 4) != 0 - } - pub fn modelDispMask5(&self) -> bool { - self.bits_2 & (1 << 5) != 0 - } - pub fn modelDispMask6(&self) -> bool { - self.bits_2 & (1 << 6) != 0 - } - pub fn modelDispMask7(&self) -> bool { - self.bits_2 & (1 << 7) != 0 - } - pub fn modelDispMask8(&self) -> bool { - self.bits_3 & (1 << 0) != 0 - } - pub fn modelDispMask9(&self) -> bool { - self.bits_3 & (1 << 1) != 0 - } - pub fn modelDispMask10(&self) -> bool { - self.bits_3 & (1 << 2) != 0 - } - pub fn modelDispMask11(&self) -> bool { - self.bits_3 & (1 << 3) != 0 - } - pub fn modelDispMask12(&self) -> bool { - self.bits_3 & (1 << 4) != 0 - } - pub fn modelDispMask13(&self) -> bool { - self.bits_3 & (1 << 5) != 0 - } - pub fn modelDispMask14(&self) -> bool { - self.bits_3 & (1 << 6) != 0 - } - pub fn modelDispMask15(&self) -> bool { - self.bits_3 & (1 << 7) != 0 - } - pub fn isEnableNeckTurn(&self) -> bool { - self.bits_4 & (1 << 0) != 0 - } - pub fn disableRespawn(&self) -> bool { - self.bits_4 & (1 << 1) != 0 - } - pub fn isMoveAnimWait(&self) -> bool { - self.bits_4 & (1 << 2) != 0 - } - pub fn isCrowd(&self) -> bool { - self.bits_4 & (1 << 3) != 0 - } - pub fn isWeakB(&self) -> bool { - self.bits_4 & (1 << 4) != 0 - } - pub fn isWeakC(&self) -> bool { - self.bits_4 & (1 << 5) != 0 - } - pub fn isWeakD(&self) -> bool { - self.bits_4 & (1 << 6) != 0 - } - pub fn doesAlwaysUseSpecialTurn(&self) -> bool { - self.bits_4 & (1 << 7) != 0 - } - pub fn isRideAtkTarget(&self) -> bool { - self.bits_5 & (1 << 0) != 0 - } - pub fn isEnableStepDispInterpolate(&self) -> bool { - self.bits_5 & (1 << 1) != 0 - } - pub fn isStealthTarget(&self) -> bool { - self.bits_5 & (1 << 2) != 0 - } - pub fn disableInitializeDead(&self) -> bool { - self.bits_5 & (1 << 3) != 0 - } - pub fn isHitRumble(&self) -> bool { - self.bits_5 & (1 << 4) != 0 - } - pub fn isSmoothTurn(&self) -> bool { - self.bits_5 & (1 << 5) != 0 - } - pub fn isWeakE(&self) -> bool { - self.bits_5 & (1 << 6) != 0 - } - pub fn isWeakF(&self) -> bool { - self.bits_5 & (1 << 7) != 0 - } - pub fn modelDispMask16(&self) -> bool { - self.bits_6 & (1 << 0) != 0 - } - pub fn modelDispMask17(&self) -> bool { - self.bits_6 & (1 << 1) != 0 - } - pub fn modelDispMask18(&self) -> bool { - self.bits_6 & (1 << 2) != 0 - } - pub fn modelDispMask19(&self) -> bool { - self.bits_6 & (1 << 3) != 0 - } - pub fn modelDispMask20(&self) -> bool { - self.bits_6 & (1 << 4) != 0 - } - pub fn modelDispMask21(&self) -> bool { - self.bits_6 & (1 << 5) != 0 - } - pub fn modelDispMask22(&self) -> bool { - self.bits_6 & (1 << 6) != 0 - } - pub fn modelDispMask23(&self) -> bool { - self.bits_6 & (1 << 7) != 0 - } - pub fn modelDispMask24(&self) -> bool { - self.bits_7 & (1 << 0) != 0 - } - pub fn modelDispMask25(&self) -> bool { - self.bits_7 & (1 << 1) != 0 - } - pub fn modelDispMask26(&self) -> bool { - self.bits_7 & (1 << 2) != 0 - } - pub fn modelDispMask27(&self) -> bool { - self.bits_7 & (1 << 3) != 0 - } - pub fn modelDispMask28(&self) -> bool { - self.bits_7 & (1 << 4) != 0 - } - pub fn modelDispMask29(&self) -> bool { - self.bits_7 & (1 << 5) != 0 - } - pub fn modelDispMask30(&self) -> bool { - self.bits_7 & (1 << 6) != 0 - } - pub fn modelDispMask31(&self) -> bool { - self.bits_7 & (1 << 7) != 0 - } - pub fn isSoulGetByBoss(&self) -> bool { - self.bits_8 & (1 << 0) != 0 - } - pub fn isBulletOwner_byObject(&self) -> bool { - self.bits_8 & (1 << 1) != 0 - } - pub fn isUseLowHitFootIk(&self) -> bool { - self.bits_8 & (1 << 2) != 0 - } - pub fn isCalculatePvPDamage(&self) -> bool { - self.bits_8 & (1 << 3) != 0 - } - pub fn isHostSyncChr(&self) -> bool { - self.bits_8 & (1 << 4) != 0 - } - pub fn isSkipWeakDamageAnim(&self) -> bool { - self.bits_8 & (1 << 5) != 0 - } - pub fn isKeepHitOnRide(&self) -> bool { - self.bits_8 & (1 << 6) != 0 - } - pub fn isSpCollide(&self) -> bool { - self.bits_8 & (1 << 7) != 0 - } - pub fn isUseFootIKNormalByUnduration(&self) -> bool { - self.bits_9 & (1 << 0) != 0 - } - pub fn attachHitInitializeDead(&self) -> bool { - self.bits_9 & (1 << 1) != 0 - } - pub fn excludeGroupRewardCheck(&self) -> bool { - self.bits_9 & (1 << 2) != 0 - } - pub fn enableAILockDmyPoly_212(&self) -> bool { - self.bits_9 & (1 << 3) != 0 - } - pub fn enableAILockDmyPoly_213(&self) -> bool { - self.bits_9 & (1 << 4) != 0 - } - pub fn enableAILockDmyPoly_214(&self) -> bool { - self.bits_9 & (1 << 5) != 0 - } - pub fn disableActivateOpen_xb1(&self) -> bool { - self.bits_9 & (1 << 6) != 0 - } - pub fn disableActivateLegacy_xb1(&self) -> bool { - self.bits_9 & (1 << 7) != 0 - } -} -impl Default for NPC_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - behaviorVariationId: 0, - resistCorrectId_poison: -1, - nameId: -1, - turnVellocity: 0., - hitHeight: 0., - hitRadius: 0., - weight: 0, - hitYOffset: 0., - hp: 0, - mp: 0, - getSoul: 0, - itemLotId_enemy: -1, - itemLotId_map: -1, - maxAnkleRollAngle: -1., - chrHitGroupAndNavimesh: 0, - faceIconId: 0, - deactivateDist: -1, - chrActivateConditionParamId: 0, - footIkErrorHeightLimit: 0., - humanityLotId: -1, - spEffectID0: -1, - spEffectID1: -1, - spEffectID2: -1, - spEffectID3: -1, - spEffectID4: -1, - spEffectID5: -1, - spEffectID6: -1, - spEffectID7: -1, - GameClearSpEffectID: -1, - physGuardCutRate: 0., - magGuardCutRate: 0., - fireGuardCutRate: 0., - thunGuardCutRate: 0., - animIdOffset: 0, - lockGazePoint0: -1, - lockGazePoint1: -1, - lockGazePoint2: -1, - lockGazePoint3: -1, - lockGazePoint4: -1, - lockGazePoint5: -1, - networkWarpDist: 0., - dbgBehaviorR1: -1, - dbgBehaviorL1: -1, - dbgBehaviorR2: -1, - dbgBehaviorL2: -1, - dbgBehaviorRL: -1, - dbgBehaviorRR: -1, - dbgBehaviorRD: -1, - dbgBehaviorRU: -1, - dbgBehaviorLL: -1, - dbgBehaviorLR: -1, - dbgBehaviorLD: -1, - dbgBehaviorLU: -1, - animIdOffset2: 0, - partsDamageRate1: 1., - partsDamageRate2: 1., - partsDamageRate3: 1., - partsDamageRate4: 1., - partsDamageRate5: 1., - partsDamageRate6: 1., - partsDamageRate7: 1., - partsDamageRate8: 1., - weakPartsDamageRate: 1., - superArmorRecoverCorrection: 0., - superArmorBrakeKnockbackDist: 0., - stamina: 0, - staminaRecoverBaseVel: 0, - def_phys: 0, - def_slash: 0, - def_blow: 0, - def_thrust: 0, - def_mag: 0, - def_fire: 0, - def_thunder: 0, - defFlickPower: 0, - resist_poison: 0, - resist_desease: 0, - resist_blood: 0, - resist_curse: 0, - ghostModelId: -1, - normalChangeResouceId: -1, - guardAngle: 0, - slashGuardCutRate: 0, - blowGuardCutRate: 0, - thrustGuardCutRate: 0, - lockGazePoint6: -1, - normalChangeTexChrId: -1, - dropType: 0, - knockbackRate: 0, - knockbackParamId: 0, - fallDamageDump: 0, - staminaGuardDef: 0, - resist_sleep: 0, - resist_madness: 0, - sleepGuardResist: 0, - madnessGuardResist: 0, - lockGazePoint7: -1, - mpRecoverBaseVel: 0, - flickDamageCutRate: 0, - defaultLodParamId: -1, - drawType: 0, - npcType: 0, - teamType: 0, - moveType: 0, - lockDist: 0, - materialSe_Weak1: 0, - materialSfx_Weak1: 0, - partsDamageType: 0, - vowType: 0, - guardLevel: 0, - burnSfxType: 0, - poisonGuardResist: 0, - diseaseGuardResist: 0, - bloodGuardResist: 0, - curseGuardResist: 0, - parryAttack: 0, - parryDefence: 0, - sfxSize: 0, - pushOutCamRegionRadius: 12, - hitStopType: 0, - ladderEndChkOffsetTop: 15, - ladderEndChkOffsetLow: 8, - bits_1: 0, - bits_2: 0, - bits_3: 0, - bits_4: 0, - bits_5: 0, - bits_6: 0, - bits_7: 0, - itemSearchRadius: 0., - chrHitHeight: 0., - chrHitRadius: 0., - specialTurnType: 0, - bits_8: 0, - def_dark: 0, - threatLv: 1, - specialTurnDistanceThreshold: 4., - autoFootEffectSfxId: -1, - materialSe1: 0, - materialSfx1: 0, - materialSe_Weak2: 0, - materialSfx_Weak2: 0, - materialSe2: 0, - materialSfx2: 0, - spEffectID8: -1, - spEffectID9: -1, - spEffectID10: -1, - spEffectID11: -1, - spEffectID12: -1, - spEffectID13: -1, - spEffectID14: -1, - spEffectID15: -1, - autoFootEffectDecalBaseId1: -1, - toughness: 0, - toughnessRecoverCorrection: 0., - neutralDamageCutRate: 1., - slashDamageCutRate: 1., - blowDamageCutRate: 1., - thrustDamageCutRate: 1., - magicDamageCutRate: 1., - fireDamageCutRate: 1., - thunderDamageCutRate: 1., - darkDamageCutRate: 1., - darkGuardCutRate: 0., - clothUpdateOffset: 0, - npcPlayerWeightType: 0, - normalChangeModelId: -1, - normalChangeAnimChrId: -1, - paintRenderTargetSize: 256, - resistCorrectId_disease: -1, - phantomShaderId: -1, - multiPlayCorrectionParamId: -1, - maxAnklePitchAngle: -1., - resist_freeze: 0, - freezeGuardResist: 0, - pad1: [0;1], - lockCameraParamId: -1, - spEffectID16: -1, - spEffectID17: -1, - spEffectID18: -1, - spEffectID19: -1, - spEffectID20: -1, - spEffectID21: -1, - spEffectID22: -1, - spEffectID23: -1, - spEffectID24: -1, - spEffectID25: -1, - spEffectID26: -1, - spEffectID27: -1, - spEffectID28: -1, - spEffectID29: -1, - spEffectID30: -1, - spEffectID31: -1, - disableLockOnAng: 0., - clothOffLodLevel: -1, - bits_9: 0, - estusFlaskRecoveryParamId: -1, - roleNameId: -1, - estusFlaskLotPoint: 0, - hpEstusFlaskLotPoint: 0, - mpEstusFlaskLotPoint: 0, - estusFlaskRecovery_failedLotPointAdd: 0, - hpEstusFlaskRecovery_failedLotPointAdd: 0, - mpEstusFlaskRecovery_failedLotPointAdd: 0, - WanderGhostPhantomId: -1, - hearingHeadSize: -1., - SoundBankId: -1, - forwardUndulationLimit: 0, - sideUndulationLimit: 0, - deactiveMoveSpeed: 0., - deactiveMoveDist: 0., - enableSoundObjDist: 48., - undulationCorrectGain: 0.1, - autoFootEffectDecalBaseId2: -1, - autoFootEffectDecalBaseId3: -1, - RetargetReferenceChrId: -1, - SfxResBankId: -1, - updateActivatePriolity: 1., - chrNavimeshFlag_Alive: 0, - chrNavimeshFlag_Dead: 0, - pad7: [0;1], - wheelRotType: 0, - wheelRotRadius: 0., - retargetMoveRate: 1., - ladderWarpOffset: 0., - loadAssetId: -1, - overlapCameraDmypolyId: -1, - residentMaterialExParamId00: -1, - residentMaterialExParamId01: -1, - residentMaterialExParamId02: -1, - residentMaterialExParamId03: -1, - residentMaterialExParamId04: -1, - sleepCollectorItemLotId_enemy: -1, - sleepCollectorItemLotId_map: -1, - footIkErrorOnGain: 0.1, - footIkErrorOffGain: 0.4, - SoundAddBankId: -1, - materialVariationValue: 0, - materialVariationValue_Weak: 0, - superArmorDurability: 0., - saRecoveryRate: 1., - saGuardCutRate: 0., - resistCorrectId_blood: -1, - resistCorrectId_curse: -1, - resistCorrectId_freeze: -1, - resistCorrectId_sleep: -1, - resistCorrectId_madness: -1, - chrDeadTutorialFlagId: 0, - stepDispInterpolateTime: 0.5, - stepDispInterpolateTriggerValue: 0.6, - lockScoreOffset: 0., - pad12: [0;8], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct NPC_THINK_PARAM_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub logicId: i32, - pub battleGoalID: i32, - pub searchEye_dist: i16, - pub searchEye_angY: u8, - bits_1: u8, - pub spEffectId_RangedAttack: i32, - pub searchTargetLv1ForgetTime: f32, - pub searchTargetLv2ForgetTime: f32, - pub BackHomeLife_OnHitEneWal: f32, - pub SightTargetForgetTime: f32, - pub idAttackCannotMove: i32, - pub ear_dist: f32, - pub callHelp_ActionAnimId: i32, - pub callHelp_CallActionId: i32, - pub eye_dist: i16, - pub isGuard_Act: u8, - pub pad6: [u8;1], - pub ear_soundcut_dist: i16, - pub nose_dist: i16, - pub maxBackhomeDist: i16, - pub backhomeDist: i16, - pub backhomeBattleDist: i16, - pub nonBattleActLife: i16, - pub BackHome_LookTargetTime: i16, - pub BackHome_LookTargetDist: i16, - pub SoundTargetForgetTime: f32, - pub BattleStartDist: i16, - pub callHelp_MyPeerId: i16, - pub callHelp_CallPeerId: i16, - pub targetSys_DmgEffectRate: i16, - pub TeamAttackEffectivity: u8, - pub eye_angX: u8, - pub eye_angY: u8, - pub disableDark: u8, - pub caravanRole: u8, - pub callHelp_CallValidMinDistTarget: u8, - pub callHelp_CallValidRange: u8, - pub callHelp_ForgetTimeByArrival: u8, - pub callHelp_MinWaitTime: u8, - pub callHelp_MaxWaitTime: u8, - pub goalAction_ToCaution: u8, - pub ear_listenLevel: u8, - pub callHelp_ReplyBehaviorType: u8, - pub disablePathMove: u8, - pub skipArrivalVisibleCheck: u8, - pub thinkAttr_doAdmirer: u8, - bits_2: u8, - pub enableNaviFlg_reserve1: [u8;3], - pub searchThreshold_Lv0toLv1: i32, - pub searchThreshold_Lv1toLv2: i32, - pub platoonReplyTime: f32, - pub platoonReplyAddRandomTime: f32, - pub searchEye_angX: u8, - pub isUpdateBattleSight: u8, - pub battleEye_updateDist: i16, - pub battleEye_updateAngX: u8, - pub battleEye_updateAngY: u8, - pub pad4: [u8;16], - pub eye_BackOffsetDist: i16, - pub eye_BeginDist: i16, - pub actTypeOnFailedPath: u8, - pub goalAction_ToCautionImportant: u8, - pub shiftAnimeId_RangedAttack: i32, - pub actTypeOnNonBtlFailedPath: u8, - pub isBuddyAI: u8, - pub goalAction_ToSearchLv1: u8, - pub goalAction_ToSearchLv2: u8, - pub enableJumpMove: u8, - pub disableLocalSteering: u8, - pub goalAction_ToDisappear: u8, - pub changeStateAction_ToNormal: u8, - pub MemoryTargetForgetTime: f32, - pub rangedAttackId: i32, - pub useFall_onNormalCaution: u8, - pub useFall_onSearchBattle: u8, - pub enableJumpMove_onBattle: u8, - pub backToHomeStuckAct: u8, - pub pad3: [u8;4], - pub soundBehaviorId01: i32, - pub soundBehaviorId02: i32, - pub soundBehaviorId03: i32, - pub soundBehaviorId04: i32, - pub soundBehaviorId05: i32, - pub soundBehaviorId06: i32, - pub soundBehaviorId07: i32, - pub soundBehaviorId08: i32, - pub weaponOffSpecialEffectId: i32, - pub weaponOnSpecialEffectId: i32, - pub weaponOffAnimId: i32, - pub weaponOnAnimId: i32, - pub surpriseAnimId: i32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl NPC_THINK_PARAM_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } - pub fn isNoAvoidHugeEnemy(&self) -> bool { - self.bits_1 & (1 << 0) != 0 - } - pub fn enableWeaponOnOff(&self) -> bool { - self.bits_1 & (1 << 1) != 0 - } - pub fn targetAILockDmyPoly(&self) -> bool { - self.bits_1 & (1 << 2) != 0 - } - pub fn pad8(&self) -> bool { - self.bits_1 & (1 << 3) != 0 - } - pub fn enableNaviFlg_Edge(&self) -> bool { - self.bits_2 & (1 << 0) != 0 - } - pub fn enableNaviFlg_LargeSpace(&self) -> bool { - self.bits_2 & (1 << 1) != 0 - } - pub fn enableNaviFlg_Ladder(&self) -> bool { - self.bits_2 & (1 << 2) != 0 - } - pub fn enableNaviFlg_Hole(&self) -> bool { - self.bits_2 & (1 << 3) != 0 - } - pub fn enableNaviFlg_Door(&self) -> bool { - self.bits_2 & (1 << 4) != 0 - } - pub fn enableNaviFlg_InSideWall(&self) -> bool { - self.bits_2 & (1 << 5) != 0 - } - pub fn enableNaviFlg_Lava(&self) -> bool { - self.bits_2 & (1 << 6) != 0 - } - pub fn enableNaviFlg_Edge_Ordinary(&self) -> bool { - self.bits_2 & (1 << 7) != 0 - } -} -impl Default for NPC_THINK_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - logicId: -1, - battleGoalID: -1, - searchEye_dist: 0, - searchEye_angY: 0, - bits_1: 0, - spEffectId_RangedAttack: -1, - searchTargetLv1ForgetTime: 5., - searchTargetLv2ForgetTime: 8., - BackHomeLife_OnHitEneWal: 5., - SightTargetForgetTime: 600., - idAttackCannotMove: 0, - ear_dist: 0., - callHelp_ActionAnimId: -1, - callHelp_CallActionId: -1, - eye_dist: 0, - isGuard_Act: 0, - pad6: [0;1], - ear_soundcut_dist: 0, - nose_dist: 0, - maxBackhomeDist: 0, - backhomeDist: 0, - backhomeBattleDist: 0, - nonBattleActLife: 0, - BackHome_LookTargetTime: 3, - BackHome_LookTargetDist: 10, - SoundTargetForgetTime: 3., - BattleStartDist: 0, - callHelp_MyPeerId: 0, - callHelp_CallPeerId: 0, - targetSys_DmgEffectRate: 100, - TeamAttackEffectivity: 25, - eye_angX: 0, - eye_angY: 0, - disableDark: 0, - caravanRole: 0, - callHelp_CallValidMinDistTarget: 5, - callHelp_CallValidRange: 15, - callHelp_ForgetTimeByArrival: 0, - callHelp_MinWaitTime: 0, - callHelp_MaxWaitTime: 0, - goalAction_ToCaution: 0, - ear_listenLevel: 128, - callHelp_ReplyBehaviorType: 0, - disablePathMove: 0, - skipArrivalVisibleCheck: 0, - thinkAttr_doAdmirer: 0, - bits_2: 1, - enableNaviFlg_reserve1: [0;3], - searchThreshold_Lv0toLv1: 10, - searchThreshold_Lv1toLv2: 70, - platoonReplyTime: 0., - platoonReplyAddRandomTime: 0., - searchEye_angX: 0, - isUpdateBattleSight: 0, - battleEye_updateDist: 0, - battleEye_updateAngX: 0, - battleEye_updateAngY: 0, - pad4: [0;16], - eye_BackOffsetDist: 0, - eye_BeginDist: 0, - actTypeOnFailedPath: 0, - goalAction_ToCautionImportant: 0, - shiftAnimeId_RangedAttack: -1, - actTypeOnNonBtlFailedPath: 0, - isBuddyAI: 0, - goalAction_ToSearchLv1: 0, - goalAction_ToSearchLv2: 0, - enableJumpMove: 0, - disableLocalSteering: 0, - goalAction_ToDisappear: 0, - changeStateAction_ToNormal: 0, - MemoryTargetForgetTime: 150., - rangedAttackId: -1, - useFall_onNormalCaution: 2, - useFall_onSearchBattle: 2, - enableJumpMove_onBattle: 0, - backToHomeStuckAct: 0, - pad3: [0;4], - soundBehaviorId01: -1, - soundBehaviorId02: -1, - soundBehaviorId03: -1, - soundBehaviorId04: -1, - soundBehaviorId05: -1, - soundBehaviorId06: -1, - soundBehaviorId07: -1, - soundBehaviorId08: -1, - weaponOffSpecialEffectId: -1, - weaponOnSpecialEffectId: -1, - weaponOffAnimId: -1, - weaponOnAnimId: -1, - surpriseAnimId: -1, - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct OBJ_ACT_PARAM_ST { - pub actionEnableMsgId: i32, - pub actionFailedMsgId: i32, - pub spQualifiedPassEventFlag: i32, - pub playerAnimId: i32, - pub chrAnimId: i32, - pub validDist: i16, - pub spQualifiedId: i16, - pub spQualifiedId2: i16, - pub objDummyId: u8, - pub isEventKickSync: u8, - pub objAnimId: i32, - pub validPlayerAngle: u8, - pub spQualifiedType: u8, - pub spQualifiedType2: u8, - pub validObjAngle: u8, - pub chrSorbType: u8, - pub eventKickTiming: u8, - pub pad1: [u8;2], - pub actionButtonParamId: i32, - pub enableTreasureDelaySec: f32, - pub preActionSfxDmypolyId: i32, - pub preActionSfxId: i32, - pub pad2: [u8;40], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl OBJ_ACT_PARAM_ST { -} -impl Default for OBJ_ACT_PARAM_ST { - fn default() -> Self { - Self { - actionEnableMsgId: -1, - actionFailedMsgId: -1, - spQualifiedPassEventFlag: 0, - playerAnimId: 0, - chrAnimId: 0, - validDist: 150, - spQualifiedId: 0, - spQualifiedId2: 0, - objDummyId: 0, - isEventKickSync: 0, - objAnimId: 0, - validPlayerAngle: 30, - spQualifiedType: 0, - spQualifiedType2: 0, - validObjAngle: 30, - chrSorbType: 0, - eventKickTiming: 0, - pad1: [0;2], - actionButtonParamId: -1, - enableTreasureDelaySec: 0., - preActionSfxDmypolyId: -1, - preActionSfxId: -1, - pad2: [0;40], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct OBJECT_MATERIAL_SFX_PARAM_ST { - pub sfxId_00: i32, - pub sfxId_01: i32, - pub sfxId_02: i32, - pub sfxId_03: i32, - pub sfxId_04: i32, - pub sfxId_05: i32, - pub sfxId_06: i32, - pub sfxId_07: i32, - pub sfxId_08: i32, - pub sfxId_09: i32, - pub sfxId_10: i32, - pub sfxId_11: i32, - pub sfxId_12: i32, - pub sfxId_13: i32, - pub sfxId_14: i32, - pub sfxId_15: i32, - pub sfxId_16: i32, - pub sfxId_17: i32, - pub sfxId_18: i32, - pub sfxId_19: i32, - pub sfxId_20: i32, - pub sfxId_21: i32, - pub sfxId_22: i32, - pub sfxId_23: i32, - pub sfxId_24: i32, - pub sfxId_25: i32, - pub sfxId_26: i32, - pub sfxId_27: i32, - pub sfxId_28: i32, - pub sfxId_29: i32, - pub sfxId_30: i32, - pub sfxId_31: i32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl OBJECT_MATERIAL_SFX_PARAM_ST { -} -impl Default for OBJECT_MATERIAL_SFX_PARAM_ST { - fn default() -> Self { - Self { - sfxId_00: 0, - sfxId_01: 0, - sfxId_02: 0, - sfxId_03: 0, - sfxId_04: 0, - sfxId_05: 0, - sfxId_06: 0, - sfxId_07: 0, - sfxId_08: 0, - sfxId_09: 0, - sfxId_10: 0, - sfxId_11: 0, - sfxId_12: 0, - sfxId_13: 0, - sfxId_14: 0, - sfxId_15: 0, - sfxId_16: 0, - sfxId_17: 0, - sfxId_18: 0, - sfxId_19: 0, - sfxId_20: 0, - sfxId_21: 0, - sfxId_22: 0, - sfxId_23: 0, - sfxId_24: 0, - sfxId_25: 0, - sfxId_26: 0, - sfxId_27: 0, - sfxId_28: 0, - sfxId_29: 0, - sfxId_30: 0, - sfxId_31: 0, - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct OBJECT_PARAM_ST { - pub hp: i16, - pub defense: i16, - pub extRefTexId: i16, - pub materialId: i16, - pub animBreakIdMax: u8, - bits_0: u8, - bits_1: u8, - pub defaultLodParamId: i8, - pub breakSfxId: i32, - pub breakSfxCpId: i32, - pub breakBulletBehaviorId: i32, - pub breakBulletCpId: i32, - pub breakFallHeight: u8, - pub windEffectType_0: u8, - pub windEffectType_1: u8, - pub camAvoidType: u8, - pub windEffectRate_0: f32, - pub windEffectRate_1: f32, - pub breakStopTime: f32, - pub burnTime: f32, - pub burnBraekRate: f32, - pub burnSfxId: i32, - pub burnSfxId_1: i32, - pub burnSfxId_2: i32, - pub burnSfxId_3: i32, - pub burnBulletBehaviorId: i32, - pub burnBulletBehaviorId_1: i32, - pub burnBulletBehaviorId_2: i32, - pub burnBulletBehaviorId_3: i32, - pub burnBulletInterval: i16, - pub navimeshFlag: u8, - pub collisionType: u8, - pub burnBulletDelayTime: f32, - pub burnSfxDelayTimeMin: f32, - pub burnSfxDelayTimeMin_1: f32, - pub burnSfxDelayTimeMin_2: f32, - pub burnSfxDelayTimeMin_3: f32, - pub burnSfxDelayTimeMax: f32, - pub burnSfxDelayTimeMax_1: f32, - pub burnSfxDelayTimeMax_2: f32, - pub burnSfxDelayTimeMax_3: f32, - pub BreakAiSoundID: i32, - pub FragmentInvisibleWaitTime: f32, - pub FragmentInvisibleTime: f32, - pub pad_3: [u8;16], - pub RigidPenetrationScale_Soft: f32, - pub RigidPenetrationScale_Normal: f32, - pub RigidPenetrationScale_Hard: f32, - pub LandTouchSfxId: i32, - bits_2: u8, - pub paintDecalTargetTextureSize: i16, - pub lifeTime_forDC: f32, - pub clothUpdateDist: f32, - pub contactSeId: i32, - pub breakLandingSfxId: i32, - pub waypointDummyPolyId_0: i32, - pub waypointParamId_0: i32, - pub soundBankId: i32, - pub refDrawParamId: i32, - pub autoCreateDynamicOffsetHeight: f32, - pub reserved0: i32, - pub soundBreakSEId: i32, - pub pad_5: [u8;40], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl OBJECT_PARAM_ST { - pub fn isCamHit(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn isBreakByPlayerCollide(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } - pub fn isAnimBreak(&self) -> bool { - self.bits_0 & (1 << 2) != 0 - } - pub fn isPenetrationBulletHit(&self) -> bool { - self.bits_0 & (1 << 3) != 0 - } - pub fn isChrHit(&self) -> bool { - self.bits_0 & (1 << 4) != 0 - } - pub fn isAttackBacklash(&self) -> bool { - self.bits_0 & (1 << 5) != 0 - } - pub fn isDisableBreakForFirstAppear(&self) -> bool { - self.bits_0 & (1 << 6) != 0 - } - pub fn isLadder(&self) -> bool { - self.bits_0 & (1 << 7) != 0 - } - pub fn isAnimPauseOnRemoPlay(&self) -> bool { - self.bits_1 & (1 << 0) != 0 - } - pub fn isDamageNoHit(&self) -> bool { - self.bits_1 & (1 << 1) != 0 - } - pub fn isMoveObj(&self) -> bool { - self.bits_1 & (1 << 2) != 0 - } - pub fn isRopeBridge(&self) -> bool { - self.bits_1 & (1 << 3) != 0 - } - pub fn isAddRigidImpulse_ByDamage(&self) -> bool { - self.bits_1 & (1 << 4) != 0 - } - pub fn isBreak_ByChrRide(&self) -> bool { - self.bits_1 & (1 << 5) != 0 - } - pub fn isBurn(&self) -> bool { - self.bits_1 & (1 << 6) != 0 - } - pub fn isBreakByEnemyCollide(&self) -> bool { - self.bits_1 & (1 << 7) != 0 - } - pub fn isDamageCover(&self) -> bool { - self.bits_2 & (1 << 0) != 0 - } -} -impl Default for OBJECT_PARAM_ST { - fn default() -> Self { - Self { - hp: -1, - defense: 0, - extRefTexId: -1, - materialId: -1, - animBreakIdMax: 0, - bits_0: 0, - bits_1: 0, - defaultLodParamId: -1, - breakSfxId: -1, - breakSfxCpId: -1, - breakBulletBehaviorId: -1, - breakBulletCpId: -1, - breakFallHeight: 0, - windEffectType_0: 0, - windEffectType_1: 0, - camAvoidType: 1, - windEffectRate_0: 0.5, - windEffectRate_1: 0.5, - breakStopTime: 0., - burnTime: 0., - burnBraekRate: 0.5, - burnSfxId: -1, - burnSfxId_1: -1, - burnSfxId_2: -1, - burnSfxId_3: -1, - burnBulletBehaviorId: -1, - burnBulletBehaviorId_1: -1, - burnBulletBehaviorId_2: -1, - burnBulletBehaviorId_3: -1, - burnBulletInterval: 30, - navimeshFlag: 0, - collisionType: 0, - burnBulletDelayTime: 0., - burnSfxDelayTimeMin: 0., - burnSfxDelayTimeMin_1: 0., - burnSfxDelayTimeMin_2: 0., - burnSfxDelayTimeMin_3: 0., - burnSfxDelayTimeMax: 0., - burnSfxDelayTimeMax_1: 0., - burnSfxDelayTimeMax_2: 0., - burnSfxDelayTimeMax_3: 0., - BreakAiSoundID: 0, - FragmentInvisibleWaitTime: 0., - FragmentInvisibleTime: 0., - pad_3: [0;16], - RigidPenetrationScale_Soft: 0., - RigidPenetrationScale_Normal: 0., - RigidPenetrationScale_Hard: 0., - LandTouchSfxId: -1, - bits_2: 0, - paintDecalTargetTextureSize: 256, - lifeTime_forDC: 0., - clothUpdateDist: 0., - contactSeId: -1, - breakLandingSfxId: -1, - waypointDummyPolyId_0: -1, - waypointParamId_0: -1, - soundBankId: -1, - refDrawParamId: -1, - autoCreateDynamicOffsetHeight: 0.1, - reserved0: -1, - soundBreakSEId: -1, - pad_5: [0;40], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct PARTS_DRAW_PARAM_ST { - pub lv01_BorderDist: f32, - pub lv01_PlayDist: f32, - pub lv12_BorderDist: f32, - pub lv12_PlayDist: f32, - pub lv23_BorderDist: f32, - pub lv23_PlayDist: f32, - pub lv34_BorderDist: f32, - pub lv34_PlayDist: f32, - pub lv45_BorderDist: f32, - pub lv45_PlayDist: f32, - pub tex_lv01_BorderDist: f32, - pub tex_lv01_PlayDist: f32, - bits_0: i32, - pub drawFadeRange: f32, - pub shadowDrawDist: f32, - pub shadowFadeRange: f32, - pub motionBlur_BorderDist: f32, - pub isPointLightShadowSrc: i8, - pub isDirLightShadowSrc: i8, - pub isShadowDst: i8, - pub isShadowOnly: i8, - pub drawByReflectCam: i8, - pub drawOnlyReflectCam: i8, - pub IncludeLodMapLv: i8, - pub isNoFarClipDraw: u8, - pub lodType: u8, - pub shadowDrawLodOffset: i8, - pub isTraceCameraXZ: u8, - pub isSkydomeDrawPhase: u8, - pub DistantViewModel_BorderDist: f32, - pub DistantViewModel_PlayDist: f32, - pub LimtedActivate_BorderDist_forGrid: f32, - pub LimtedActivate_PlayDist_forGrid: f32, - pub zSortOffsetForNoFarClipDraw: f32, - pub shadowDrawAlphaTestDist: f32, - pub fowardDrawEnvmapBlendType: u8, - pub LBDrawDistScaleParamID: u8, - pub resereve: [u8;34], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl PARTS_DRAW_PARAM_ST { - pub fn enableCrossFade(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } -} -impl Default for PARTS_DRAW_PARAM_ST { - fn default() -> Self { - Self { - lv01_BorderDist: 5., - lv01_PlayDist: 1., - lv12_BorderDist: 20., - lv12_PlayDist: 2., - lv23_BorderDist: 30., - lv23_PlayDist: 0., - lv34_BorderDist: 9999., - lv34_PlayDist: 0., - lv45_BorderDist: 9999., - lv45_PlayDist: 0., - tex_lv01_BorderDist: 30., - tex_lv01_PlayDist: 1., - bits_0: 0, - drawFadeRange: 0., - shadowDrawDist: 9999., - shadowFadeRange: 0., - motionBlur_BorderDist: 20., - isPointLightShadowSrc: 0, - isDirLightShadowSrc: 0, - isShadowDst: 0, - isShadowOnly: 0, - drawByReflectCam: 0, - drawOnlyReflectCam: 0, - IncludeLodMapLv: -1, - isNoFarClipDraw: 0, - lodType: 0, - shadowDrawLodOffset: 0, - isTraceCameraXZ: 0, - isSkydomeDrawPhase: 0, - DistantViewModel_BorderDist: 30., - DistantViewModel_PlayDist: 5., - LimtedActivate_BorderDist_forGrid: -1., - LimtedActivate_PlayDist_forGrid: 10., - zSortOffsetForNoFarClipDraw: 0., - shadowDrawAlphaTestDist: 9999., - fowardDrawEnvmapBlendType: 0, - LBDrawDistScaleParamID: 0, - resereve: [0;34], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct PERFORMANCE_CHECK_PARAM { - pub workTag: u8, - pub categoryTag: u8, - pub compareType: u8, - pub dummy1: [u8;1], - pub compareValue: f32, - pub dummy2: [u8;8], - pub userTag: [u8;16], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl PERFORMANCE_CHECK_PARAM { -} -impl Default for PERFORMANCE_CHECK_PARAM { - fn default() -> Self { - Self { - workTag: 0, - categoryTag: 0, - compareType: 0, - dummy1: [0;1], - compareValue: 0., - dummy2: [0;8], - userTag: [0;16], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct PHANTOM_PARAM_ST { - pub edgeColorA: f32, - pub frontColorA: f32, - pub diffMulColorA: f32, - pub specMulColorA: f32, - pub lightColorA: f32, - pub edgeColorR: u8, - pub edgeColorG: u8, - pub edgeColorB: u8, - pub frontColorR: u8, - pub frontColorG: u8, - pub frontColorB: u8, - pub diffMulColorR: u8, - pub diffMulColorG: u8, - pub diffMulColorB: u8, - pub specMulColorR: u8, - pub specMulColorG: u8, - pub specMulColorB: u8, - pub lightColorR: u8, - pub lightColorG: u8, - pub lightColorB: u8, - pub reserve: [u8;1], - pub alpha: f32, - pub blendRate: f32, - pub blendType: u8, - pub isEdgeSubtract: u8, - pub isFrontSubtract: u8, - pub isNo2Pass: u8, - pub edgePower: f32, - pub glowScale: f32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl PHANTOM_PARAM_ST { -} -impl Default for PHANTOM_PARAM_ST { - fn default() -> Self { - Self { - edgeColorA: 1., - frontColorA: 0., - diffMulColorA: 1., - specMulColorA: 1., - lightColorA: 0., - edgeColorR: 255, - edgeColorG: 255, - edgeColorB: 255, - frontColorR: 0, - frontColorG: 0, - frontColorB: 0, - diffMulColorR: 255, - diffMulColorG: 255, - diffMulColorB: 255, - specMulColorR: 255, - specMulColorG: 255, - specMulColorB: 255, - lightColorR: 0, - lightColorG: 0, - lightColorB: 0, - reserve: [0;1], - alpha: 1., - blendRate: 1., - blendType: 0, - isEdgeSubtract: 0, - isFrontSubtract: 0, - isNo2Pass: 0, - edgePower: 1., - glowScale: 0., - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct PLAYER_COMMON_PARAM_ST { - pub playerFootEffect_bySFX: i32, - pub snipeModeDrawAlpha_FadeTime: f32, - pub toughnessRecoverCorrection: f32, - pub baseMagicSlotSize: u8, - pub baseAccSlotNum: u8, - pub reserved02: [u8;2], - pub animeID_DropItemPick: i32, - pub resistRecoverPoint_Sleep_Player: f32, - pub flareOverrideHomingAngle: i32, - pub flareOverrideHomingStopRange: f32, - pub animeID_SleepCollectorItemPick: i32, - pub unlockEventFlagBaseId_forWepAttr: i32, - pub systemEnchant_BigRune: i32, - pub lowStatus_AtkPowDown: f32, - pub lowStatus_ConsumeStaminaRate: f32, - pub lowStatus_AtkGuardBreak: i16, - pub guardStatusCorrect_MaxStatusVal: i16, - pub unlockEventFlagStepNum_forWepAttr: i16, - pub retributionMagic_damageCountNum: i16, - pub retributionMagic_damageCountRemainTime: i16, - pub retributionMagic_burstDmypolyId: i16, - pub retributionMagic_burstMagicParamId: i32, - pub chrAimCam_rideOffsetHeight: f32, - pub reserved23: [u8;4], - pub arrowCaseWepBindDmypolyId: i32, - pub boltPouchWepBindDmypolyId: i32, - pub estusFlaskAllocateRate: f32, - pub reserved38: [u8;2], - pub kickAcceptanceDeg: u8, - pub npcPlayerAnalogWeightRate_Light: u8, - pub npcPlayerAnalogWeightRate_Normal: u8, - pub npcPlayerAnalogWeightRate_Heavy: u8, - pub npcPlayerAnalogWeightRate_WeightOver: u8, - pub npcPlayerAnalogWeightRate_SuperLight: u8, - pub reserved45: [u8;4], - pub clearCountCorrectBaseSpEffectId: i32, - pub arrowBoltModelIdOffset: i32, - pub arrowBoltRemainingNumModelMaskThreshold1: i8, - pub arrowBoltRemainingNumModelMaskThreshold2: i8, - pub reserved27: [u8;2], - pub resistRecoverPoint_Poision_Player: f32, - pub resistRecoverPoint_Desease_Player: f32, - pub resistRecoverPoint_Blood_Player: f32, - pub resistRecoverPoint_Curse_Player: f32, - pub resistRecoverPoint_Freeze_Player: f32, - pub resistRecoverPoint_Poision_Enemy: f32, - pub resistRecoverPoint_Desease_Enemy: f32, - pub resistRecoverPoint_Blood_Enemy: f32, - pub resistRecoverPoint_Curse_Enemy: f32, - pub resistRecoverPoint_Freeze_Enemy: f32, - pub requestTimeLeftBothHand: f32, - pub resistRecoverPoint_Madness_Player: f32, - pub animeID_MaterialItemPick: i32, - pub hpEstusFlaskAllocateRateForYellowMonk: f32, - pub hpEstusFlaskAllocateOffsetForYellowMonk: i32, - pub mpEstusFlaskAllocateRateForYellowMonk: f32, - pub mpEstusFlaskAllocateOffsetForYellowMonk: i32, - pub resistRecoverPoint_Sleep_Enemy: f32, - pub resistRecoverPoint_Madness_Enemy: f32, - pub resistCurseItemId: i32, - pub resistCurseItemMaxNum: u8, - pub reserved_123: [u8;3], - pub resistCurseItemSpEffectBaseId: i32, - pub resistCurseItemLotParamId_map: i32, - pub reserved41: [u8;52], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl PLAYER_COMMON_PARAM_ST { -} -impl Default for PLAYER_COMMON_PARAM_ST { - fn default() -> Self { - Self { - playerFootEffect_bySFX: 0, - snipeModeDrawAlpha_FadeTime: 0., - toughnessRecoverCorrection: 0., - baseMagicSlotSize: 0, - baseAccSlotNum: 0, - reserved02: [0;2], - animeID_DropItemPick: 0, - resistRecoverPoint_Sleep_Player: 0., - flareOverrideHomingAngle: -1, - flareOverrideHomingStopRange: -1., - animeID_SleepCollectorItemPick: 0, - unlockEventFlagBaseId_forWepAttr: 0, - systemEnchant_BigRune: 0, - lowStatus_AtkPowDown: 0., - lowStatus_ConsumeStaminaRate: 0., - lowStatus_AtkGuardBreak: 0, - guardStatusCorrect_MaxStatusVal: 0, - unlockEventFlagStepNum_forWepAttr: 1, - retributionMagic_damageCountNum: 0, - retributionMagic_damageCountRemainTime: 0, - retributionMagic_burstDmypolyId: 0, - retributionMagic_burstMagicParamId: -1, - chrAimCam_rideOffsetHeight: 0., - reserved23: [0;4], - arrowCaseWepBindDmypolyId: 0, - boltPouchWepBindDmypolyId: 0, - estusFlaskAllocateRate: 0., - reserved38: [0;2], - kickAcceptanceDeg: 0, - npcPlayerAnalogWeightRate_Light: 0, - npcPlayerAnalogWeightRate_Normal: 0, - npcPlayerAnalogWeightRate_Heavy: 0, - npcPlayerAnalogWeightRate_WeightOver: 0, - npcPlayerAnalogWeightRate_SuperLight: 0, - reserved45: [0;4], - clearCountCorrectBaseSpEffectId: 0, - arrowBoltModelIdOffset: 0, - arrowBoltRemainingNumModelMaskThreshold1: 0, - arrowBoltRemainingNumModelMaskThreshold2: 0, - reserved27: [0;2], - resistRecoverPoint_Poision_Player: 0., - resistRecoverPoint_Desease_Player: 0., - resistRecoverPoint_Blood_Player: 0., - resistRecoverPoint_Curse_Player: 0., - resistRecoverPoint_Freeze_Player: 0., - resistRecoverPoint_Poision_Enemy: 0., - resistRecoverPoint_Desease_Enemy: 0., - resistRecoverPoint_Blood_Enemy: 0., - resistRecoverPoint_Curse_Enemy: 0., - resistRecoverPoint_Freeze_Enemy: 0., - requestTimeLeftBothHand: 0., - resistRecoverPoint_Madness_Player: 0., - animeID_MaterialItemPick: 0, - hpEstusFlaskAllocateRateForYellowMonk: 0., - hpEstusFlaskAllocateOffsetForYellowMonk: 0, - mpEstusFlaskAllocateRateForYellowMonk: 0., - mpEstusFlaskAllocateOffsetForYellowMonk: 0, - resistRecoverPoint_Sleep_Enemy: 0., - resistRecoverPoint_Madness_Enemy: 0., - resistCurseItemId: -1, - resistCurseItemMaxNum: 0, - reserved_123: [0;3], - resistCurseItemSpEffectBaseId: -1, - resistCurseItemLotParamId_map: -1, - reserved41: [0;52], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct PLAY_REGION_PARAM_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub matchAreaId: i32, - pub multiPlayStartLimitEventFlagId: i32, - pub otherDisableDistance: f32, - pub pcPositionSaveLimitEventFlagId: i32, - pub bossAreaId: i32, - pub cultNpcWhiteGhostEntityId_byFree: i16, - pub bMapGuradianRegion: u8, - bits_1: u8, - pub warpItemUsePermitBonfireId_1: i32, - pub warpItemUsePermitBonfireId_2: i32, - pub warpItemUsePermitBonfireId_3: i32, - pub warpItemUsePermitBonfireId_4: i32, - pub warpItemUsePermitBonfireId_5: i32, - pub warpItemProhibitionEventFlagId_1: i32, - pub warpItemProhibitionEventFlagId_2: i32, - pub warpItemProhibitionEventFlagId_3: i32, - pub warpItemProhibitionEventFlagId_4: i32, - pub warpItemProhibitionEventFlagId_5: i32, - bits_2: u8, - bits_3: u8, - pub pad2: [u8;2], - pub multiPlayHASHostLimitEventFlagId: i32, - pub otherMaxDistance: f32, - pub signPuddleOpenEventFlagId: i32, - pub areaNo: u8, - pub gridXNo: u8, - pub gridZNo: u8, - pub pad4: [u8;1], - pub posX: f32, - pub posY: f32, - pub posZ: f32, - pub breakInLimitEventFlagId_1: i32, - pub whiteSignLimitEventFlagId_1: i32, - pub matchAreaSignCreateLimitEventFlagId: i32, - pub signAimId_1: i32, - pub signAimId_2: i32, - pub signAimId_3: i32, - pub signAimId_4: i32, - pub signAimId_5: i32, - pub signAimId_6: i32, - pub signAimId_7: i32, - pub signAimId_8: i32, - pub redSignLimitEventFlagId_1: i32, - pub breakInLimitEventFlagId_2: i32, - pub breakInLimitEventFlagId_3: i32, - pub whiteSignLimitEventFlagId_2: i32, - pub whiteSignLimitEventFlagId_3: i32, - pub redSignLimitEventFlagId_2: i32, - pub redSignLimitEventFlagId_3: i32, - pub bossId_1: i32, - pub bossId_2: i32, - pub bossId_3: i32, - pub bossId_4: i32, - pub bossId_5: i32, - pub bossId_6: i32, - pub bossId_7: i32, - pub bossId_8: i32, - pub bossId_9: i32, - pub bossId_10: i32, - pub bossId_11: i32, - pub bossId_12: i32, - pub bossId_13: i32, - pub bossId_14: i32, - pub bossId_15: i32, - pub bossId_16: i32, - pub mapMenuUnlockEventId: i32, - pub pad5: [u8;32], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl PLAY_REGION_PARAM_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } - pub fn bYellowCostumeRegion(&self) -> bool { - self.bits_1 & (1 << 0) != 0 - } - pub fn multiPlayStartLimitEventFlagId_targetFlagState(&self) -> bool { - self.bits_1 & (1 << 1) != 0 - } - pub fn breakInLimitEventFlagId_1_targetFlagState(&self) -> bool { - self.bits_1 & (1 << 2) != 0 - } - pub fn whiteSignLimitEventFlagId_1_targetFlagState(&self) -> bool { - self.bits_1 & (1 << 3) != 0 - } - pub fn redSignLimitEventFlagId_1_targetFlagState(&self) -> bool { - self.bits_1 & (1 << 4) != 0 - } - pub fn breakInLimitEventFlagId_2_targetFlagState(&self) -> bool { - self.bits_1 & (1 << 5) != 0 - } - pub fn breakInLimitEventFlagId_3_targetFlagState(&self) -> bool { - self.bits_1 & (1 << 6) != 0 - } - pub fn whiteSignLimitEventFlagId_2_targetFlagState(&self) -> bool { - self.bits_1 & (1 << 7) != 0 - } - pub fn enableBloodstain(&self) -> bool { - self.bits_2 & (1 << 0) != 0 - } - pub fn enableBloodMessage(&self) -> bool { - self.bits_2 & (1 << 1) != 0 - } - pub fn enableGhost(&self) -> bool { - self.bits_2 & (1 << 2) != 0 - } - pub fn dispMask00(&self) -> bool { - self.bits_2 & (1 << 3) != 0 - } - pub fn dispMask01(&self) -> bool { - self.bits_2 & (1 << 4) != 0 - } - pub fn whiteSignLimitEventFlagId_3_targetFlagState(&self) -> bool { - self.bits_2 & (1 << 5) != 0 - } - pub fn redSignLimitEventFlagId_2_targetFlagState(&self) -> bool { - self.bits_2 & (1 << 6) != 0 - } - pub fn redSignLimitEventFlagId_3_targetFlagState(&self) -> bool { - self.bits_2 & (1 << 7) != 0 - } - pub fn isAutoIntrudePoint(&self) -> bool { - self.bits_3 & (1 << 0) != 0 - } - pub fn pad1(&self) -> bool { - self.bits_3 & (1 << 1) != 0 - } -} -impl Default for PLAY_REGION_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - matchAreaId: 0, - multiPlayStartLimitEventFlagId: 0, - otherDisableDistance: 0., - pcPositionSaveLimitEventFlagId: 0, - bossAreaId: 0, - cultNpcWhiteGhostEntityId_byFree: -1, - bMapGuradianRegion: 0, - bits_1: 0, - warpItemUsePermitBonfireId_1: 0, - warpItemUsePermitBonfireId_2: 0, - warpItemUsePermitBonfireId_3: 0, - warpItemUsePermitBonfireId_4: 0, - warpItemUsePermitBonfireId_5: 0, - warpItemProhibitionEventFlagId_1: 0, - warpItemProhibitionEventFlagId_2: 0, - warpItemProhibitionEventFlagId_3: 0, - warpItemProhibitionEventFlagId_4: 0, - warpItemProhibitionEventFlagId_5: 0, - bits_2: 1, - bits_3: 0, - pad2: [0;2], - multiPlayHASHostLimitEventFlagId: 0, - otherMaxDistance: 1000., - signPuddleOpenEventFlagId: 0, - areaNo: 0, - gridXNo: 0, - gridZNo: 0, - pad4: [0;1], - posX: 0., - posY: 0., - posZ: 0., - breakInLimitEventFlagId_1: 0, - whiteSignLimitEventFlagId_1: 0, - matchAreaSignCreateLimitEventFlagId: 0, - signAimId_1: 0, - signAimId_2: 0, - signAimId_3: 0, - signAimId_4: 0, - signAimId_5: 0, - signAimId_6: 0, - signAimId_7: 0, - signAimId_8: 0, - redSignLimitEventFlagId_1: 0, - breakInLimitEventFlagId_2: 0, - breakInLimitEventFlagId_3: 0, - whiteSignLimitEventFlagId_2: 0, - whiteSignLimitEventFlagId_3: 0, - redSignLimitEventFlagId_2: 0, - redSignLimitEventFlagId_3: 0, - bossId_1: 0, - bossId_2: 0, - bossId_3: 0, - bossId_4: 0, - bossId_5: 0, - bossId_6: 0, - bossId_7: 0, - bossId_8: 0, - bossId_9: 0, - bossId_10: 0, - bossId_11: 0, - bossId_12: 0, - bossId_13: 0, - bossId_14: 0, - bossId_15: 0, - bossId_16: 0, - mapMenuUnlockEventId: 0, - pad5: [0;32], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct POSTURE_CONTROL_PARAM_GENDER_ST { - pub a000_rightElbowIO: i16, - pub a000_leftElbowIO: i16, - pub a000_bothLegsIO: i16, - pub a002_rightElbowIO: i16, - pub a002_leftElbowIO: i16, - pub a002_bothLegsIO: i16, - pub a003_rightElbowIO: i16, - pub a003_leftElbowIO: i16, - pub a003_bothLegsIO: i16, - pub a010_rightElbowIO: i16, - pub a010_leftElbowIO: i16, - pub a010_bothLegsIO: i16, - pub a012_rightElbowIO: i16, - pub a012_leftElbowIO: i16, - pub a012_bothLegsIO: i16, - pub a013_rightElbowIO: i16, - pub a013_leftElbowIO: i16, - pub a013_bothLegsIO: i16, - pub a014_rightElbowIO: i16, - pub a014_leftElbowIO: i16, - pub a014_bothLegsIO: i16, - pub a015_rightElbowIO: i16, - pub a015_leftElbowIO: i16, - pub a015_bothLegsIO: i16, - pub a016_rightElbowIO: i16, - pub a016_leftElbowIO: i16, - pub a016_bothLegsIO: i16, - pub pad: [u8;10], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl POSTURE_CONTROL_PARAM_GENDER_ST { -} -impl Default for POSTURE_CONTROL_PARAM_GENDER_ST { - fn default() -> Self { - Self { - a000_rightElbowIO: 0, - a000_leftElbowIO: 0, - a000_bothLegsIO: 0, - a002_rightElbowIO: 0, - a002_leftElbowIO: 0, - a002_bothLegsIO: 0, - a003_rightElbowIO: 0, - a003_leftElbowIO: 0, - a003_bothLegsIO: 0, - a010_rightElbowIO: 0, - a010_leftElbowIO: 0, - a010_bothLegsIO: 0, - a012_rightElbowIO: 0, - a012_leftElbowIO: 0, - a012_bothLegsIO: 0, - a013_rightElbowIO: 0, - a013_leftElbowIO: 0, - a013_bothLegsIO: 0, - a014_rightElbowIO: 0, - a014_leftElbowIO: 0, - a014_bothLegsIO: 0, - a015_rightElbowIO: 0, - a015_leftElbowIO: 0, - a015_bothLegsIO: 0, - a016_rightElbowIO: 0, - a016_leftElbowIO: 0, - a016_bothLegsIO: 0, - pad: [0;10], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct POSTURE_CONTROL_PARAM_PRO_ST { - pub a000_rightArmIO: i16, - pub a000_rightArmFB: i16, - pub a000_leftArmIO: i16, - pub a000_leftArmFB: i16, - pub a002_rightArmIO: i16, - pub a002_rightArmFB: i16, - pub a002_leftArmIO: i16, - pub a002_leftArmFB: i16, - pub a003_rightArmIO: i16, - pub a003_rightArmFB: i16, - pub a003_leftArmIO: i16, - pub a003_leftArmFB: i16, - pub a010_rightArmIO: i16, - pub a010_rightArmFB: i16, - pub a010_leftArmIO: i16, - pub a010_leftArmFB: i16, - pub a012_rightArmIO: i16, - pub a012_rightArmFB: i16, - pub a012_leftArmIO: i16, - pub a012_leftArmFB: i16, - pub a013_rightArmIO: i16, - pub a013_rightArmFB: i16, - pub a013_leftArmIO: i16, - pub a013_leftArmFB: i16, - pub a014_rightArmIO: i16, - pub a014_rightArmFB: i16, - pub a014_leftArmIO: i16, - pub a014_leftArmFB: i16, - pub a015_rightArmIO: i16, - pub a015_rightArmFB: i16, - pub a015_leftArmIO: i16, - pub a015_leftArmFB: i16, - pub a016_rightArmIO: i16, - pub a016_rightArmFB: i16, - pub a016_leftArmIO: i16, - pub a016_leftArmFB: i16, - pub pad: [u8;8], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl POSTURE_CONTROL_PARAM_PRO_ST { -} -impl Default for POSTURE_CONTROL_PARAM_PRO_ST { - fn default() -> Self { - Self { - a000_rightArmIO: 0, - a000_rightArmFB: 0, - a000_leftArmIO: 0, - a000_leftArmFB: 0, - a002_rightArmIO: 0, - a002_rightArmFB: 0, - a002_leftArmIO: 0, - a002_leftArmFB: 0, - a003_rightArmIO: 0, - a003_rightArmFB: 0, - a003_leftArmIO: 0, - a003_leftArmFB: 0, - a010_rightArmIO: 0, - a010_rightArmFB: 0, - a010_leftArmIO: 0, - a010_leftArmFB: 0, - a012_rightArmIO: 0, - a012_rightArmFB: 0, - a012_leftArmIO: 0, - a012_leftArmFB: 0, - a013_rightArmIO: 0, - a013_rightArmFB: 0, - a013_leftArmIO: 0, - a013_leftArmFB: 0, - a014_rightArmIO: 0, - a014_rightArmFB: 0, - a014_leftArmIO: 0, - a014_leftArmFB: 0, - a015_rightArmIO: 0, - a015_rightArmFB: 0, - a015_leftArmIO: 0, - a015_leftArmFB: 0, - a016_rightArmIO: 0, - a016_rightArmFB: 0, - a016_leftArmIO: 0, - a016_leftArmFB: 0, - pad: [0;8], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct POSTURE_CONTROL_PARAM_WEP_LEFT_ST { - pub a000_leftArmFB: i16, - pub a000_leftWristFB: i16, - pub a000_leftWristIO: i16, - pub a002_leftArmFB: i16, - pub a002_leftWristFB: i16, - pub a002_leftWristIO: i16, - pub a003_leftArmFB: i16, - pub a003_leftWristFB: i16, - pub a003_leftWristIO: i16, - pub pad: [u8;14], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl POSTURE_CONTROL_PARAM_WEP_LEFT_ST { -} -impl Default for POSTURE_CONTROL_PARAM_WEP_LEFT_ST { - fn default() -> Self { - Self { - a000_leftArmFB: 0, - a000_leftWristFB: 0, - a000_leftWristIO: 0, - a002_leftArmFB: 0, - a002_leftWristFB: 0, - a002_leftWristIO: 0, - a003_leftArmFB: 0, - a003_leftWristFB: 0, - a003_leftWristIO: 0, - pad: [0;14], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct POSTURE_CONTROL_PARAM_WEP_RIGHT_ST { - pub a000_rightArmFB: i16, - pub a000_rightWristFB: i16, - pub a000_rightWristIO: i16, - pub a000_leftArmFB: i16, - pub a000_leftWristFB: i16, - pub a000_leftWristIO: i16, - pub a002_rightArmFB: i16, - pub a002_rightWristFB: i16, - pub a002_rightWristIO: i16, - pub a002_leftArmFB: i16, - pub a002_leftWristFB: i16, - pub a002_leftWristIO: i16, - pub a003_rightArmFB: i16, - pub a003_rightWristFB: i16, - pub a003_rightWristIO: i16, - pub a003_leftArmFB: i16, - pub a003_leftWristFB: i16, - pub a003_leftWristIO: i16, - pub a010_rightArmFB: i16, - pub a010_rightWristFB: i16, - pub a010_rightWristIO: i16, - pub a010_leftArmFB: i16, - pub a010_leftWristFB: i16, - pub a010_leftWristIO: i16, - pub a012_rightArmFB: i16, - pub a012_rightWristFB: i16, - pub a012_rightWristIO: i16, - pub a012_leftArmFB: i16, - pub a012_leftWristFB: i16, - pub a012_leftWristIO: i16, - pub a013_rightArmFB: i16, - pub a013_rightWristFB: i16, - pub a013_rightWristIO: i16, - pub a013_leftArmFB: i16, - pub a013_leftWristFB: i16, - pub a013_leftWristIO: i16, - pub a014_rightArmFB: i16, - pub a014_rightWristFB: i16, - pub a014_rightWristIO: i16, - pub a014_leftArmFB: i16, - pub a014_leftWristFB: i16, - pub a014_leftWristIO: i16, - pub a015_rightArmFB: i16, - pub a015_rightWristFB: i16, - pub a015_rightWristIO: i16, - pub a015_leftArmFB: i16, - pub a015_leftWristFB: i16, - pub a015_leftWristIO: i16, - pub a016_rightArmFB: i16, - pub a016_rightWristFB: i16, - pub a016_rightWristIO: i16, - pub a016_leftArmFB: i16, - pub a016_leftWristFB: i16, - pub a016_leftWristIO: i16, - pub pad: [u8;4], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl POSTURE_CONTROL_PARAM_WEP_RIGHT_ST { -} -impl Default for POSTURE_CONTROL_PARAM_WEP_RIGHT_ST { - fn default() -> Self { - Self { - a000_rightArmFB: 0, - a000_rightWristFB: 0, - a000_rightWristIO: 0, - a000_leftArmFB: 0, - a000_leftWristFB: 0, - a000_leftWristIO: 0, - a002_rightArmFB: 0, - a002_rightWristFB: 0, - a002_rightWristIO: 0, - a002_leftArmFB: 0, - a002_leftWristFB: 0, - a002_leftWristIO: 0, - a003_rightArmFB: 0, - a003_rightWristFB: 0, - a003_rightWristIO: 0, - a003_leftArmFB: 0, - a003_leftWristFB: 0, - a003_leftWristIO: 0, - a010_rightArmFB: 0, - a010_rightWristFB: 0, - a010_rightWristIO: 0, - a010_leftArmFB: 0, - a010_leftWristFB: 0, - a010_leftWristIO: 0, - a012_rightArmFB: 0, - a012_rightWristFB: 0, - a012_rightWristIO: 0, - a012_leftArmFB: 0, - a012_leftWristFB: 0, - a012_leftWristIO: 0, - a013_rightArmFB: 0, - a013_rightWristFB: 0, - a013_rightWristIO: 0, - a013_leftArmFB: 0, - a013_leftWristFB: 0, - a013_leftWristIO: 0, - a014_rightArmFB: 0, - a014_rightWristFB: 0, - a014_rightWristIO: 0, - a014_leftArmFB: 0, - a014_leftWristFB: 0, - a014_leftWristIO: 0, - a015_rightArmFB: 0, - a015_rightWristFB: 0, - a015_rightWristIO: 0, - a015_leftArmFB: 0, - a015_leftWristFB: 0, - a015_leftWristIO: 0, - a016_rightArmFB: 0, - a016_rightWristFB: 0, - a016_rightWristIO: 0, - a016_leftArmFB: 0, - a016_leftWristFB: 0, - a016_leftWristIO: 0, - pad: [0;4], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct RANDOM_APPEAR_EDIT_PARAM_ST { - pub appearNum: i32, - pub paramId1: i32, - pub rate1: i32, - pub paramId2: i32, - pub rate2: i32, - pub paramId3: i32, - pub rate3: i32, - pub paramId4: i32, - pub rate4: i32, - pub paramId5: i32, - pub rate5: i32, - pub paramId6: i32, - pub rate6: i32, - pub paramId7: i32, - pub rate7: i32, - pub paramId8: i32, - pub rate8: i32, - pub paramId9: i32, - pub rate9: i32, - pub paramId10: i32, - pub rate10: i32, - pub paramId11: i32, - pub rate11: i32, - pub paramId12: i32, - pub rate12: i32, - pub paramId13: i32, - pub rate13: i32, - pub paramId14: i32, - pub rate14: i32, - pub paramId15: i32, - pub rate15: i32, - pub paramId16: i32, - pub rate16: i32, - pub paramId17: i32, - pub rate17: i32, - pub paramId18: i32, - pub rate18: i32, - pub paramId19: i32, - pub rate19: i32, - pub paramId20: i32, - pub rate20: i32, - pub paramId21: i32, - pub rate21: i32, - pub paramId22: i32, - pub rate22: i32, - pub paramId23: i32, - pub rate23: i32, - pub paramId24: i32, - pub rate24: i32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl RANDOM_APPEAR_EDIT_PARAM_ST { -} -impl Default for RANDOM_APPEAR_EDIT_PARAM_ST { - fn default() -> Self { - Self { - appearNum: 0, - paramId1: -1, - rate1: 0, - paramId2: -1, - rate2: 0, - paramId3: -1, - rate3: 0, - paramId4: -1, - rate4: 0, - paramId5: -1, - rate5: 0, - paramId6: -1, - rate6: 0, - paramId7: -1, - rate7: 0, - paramId8: -1, - rate8: 0, - paramId9: -1, - rate9: 0, - paramId10: -1, - rate10: 0, - paramId11: -1, - rate11: 0, - paramId12: -1, - rate12: 0, - paramId13: -1, - rate13: 0, - paramId14: -1, - rate14: 0, - paramId15: -1, - rate15: 0, - paramId16: -1, - rate16: 0, - paramId17: -1, - rate17: 0, - paramId18: -1, - rate18: 0, - paramId19: -1, - rate19: 0, - paramId20: -1, - rate20: 0, - paramId21: -1, - rate21: 0, - paramId22: -1, - rate22: 0, - paramId23: -1, - rate23: 0, - paramId24: -1, - rate24: 0, - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct RANDOM_APPEAR_PARAM_ST { - bits_0: u8, - bits_1: u8, - bits_2: u8, - bits_3: u8, - bits_4: u8, - bits_5: u8, - bits_6: u8, - bits_7: u8, - bits_8: u8, - bits_9: u8, - bits_10: u8, - bits_11: u8, - bits_12: u8, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl RANDOM_APPEAR_PARAM_ST { - pub fn slot0(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn slot1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } - pub fn slot2(&self) -> bool { - self.bits_0 & (1 << 2) != 0 - } - pub fn slot3(&self) -> bool { - self.bits_0 & (1 << 3) != 0 - } - pub fn slot4(&self) -> bool { - self.bits_0 & (1 << 4) != 0 - } - pub fn slot5(&self) -> bool { - self.bits_0 & (1 << 5) != 0 - } - pub fn slot6(&self) -> bool { - self.bits_0 & (1 << 6) != 0 - } - pub fn slot7(&self) -> bool { - self.bits_0 & (1 << 7) != 0 - } - pub fn slot8(&self) -> bool { - self.bits_1 & (1 << 0) != 0 - } - pub fn slot9(&self) -> bool { - self.bits_1 & (1 << 1) != 0 - } - pub fn slot10(&self) -> bool { - self.bits_1 & (1 << 2) != 0 - } - pub fn slot11(&self) -> bool { - self.bits_1 & (1 << 3) != 0 - } - pub fn slot12(&self) -> bool { - self.bits_1 & (1 << 4) != 0 - } - pub fn slot13(&self) -> bool { - self.bits_1 & (1 << 5) != 0 - } - pub fn slot14(&self) -> bool { - self.bits_1 & (1 << 6) != 0 - } - pub fn slot15(&self) -> bool { - self.bits_1 & (1 << 7) != 0 - } - pub fn slot16(&self) -> bool { - self.bits_2 & (1 << 0) != 0 - } - pub fn slot17(&self) -> bool { - self.bits_2 & (1 << 1) != 0 - } - pub fn slot18(&self) -> bool { - self.bits_2 & (1 << 2) != 0 - } - pub fn slot19(&self) -> bool { - self.bits_2 & (1 << 3) != 0 - } - pub fn slot20(&self) -> bool { - self.bits_2 & (1 << 4) != 0 - } - pub fn slot21(&self) -> bool { - self.bits_2 & (1 << 5) != 0 - } - pub fn slot22(&self) -> bool { - self.bits_2 & (1 << 6) != 0 - } - pub fn slot23(&self) -> bool { - self.bits_2 & (1 << 7) != 0 - } - pub fn slot24(&self) -> bool { - self.bits_3 & (1 << 0) != 0 - } - pub fn slot25(&self) -> bool { - self.bits_3 & (1 << 1) != 0 - } - pub fn slot26(&self) -> bool { - self.bits_3 & (1 << 2) != 0 - } - pub fn slot27(&self) -> bool { - self.bits_3 & (1 << 3) != 0 - } - pub fn slot28(&self) -> bool { - self.bits_3 & (1 << 4) != 0 - } - pub fn slot29(&self) -> bool { - self.bits_3 & (1 << 5) != 0 - } - pub fn slot30(&self) -> bool { - self.bits_3 & (1 << 6) != 0 - } - pub fn slot31(&self) -> bool { - self.bits_3 & (1 << 7) != 0 - } - pub fn slot32(&self) -> bool { - self.bits_4 & (1 << 0) != 0 - } - pub fn slot33(&self) -> bool { - self.bits_4 & (1 << 1) != 0 - } - pub fn slot34(&self) -> bool { - self.bits_4 & (1 << 2) != 0 - } - pub fn slot35(&self) -> bool { - self.bits_4 & (1 << 3) != 0 - } - pub fn slot36(&self) -> bool { - self.bits_4 & (1 << 4) != 0 - } - pub fn slot37(&self) -> bool { - self.bits_4 & (1 << 5) != 0 - } - pub fn slot38(&self) -> bool { - self.bits_4 & (1 << 6) != 0 - } - pub fn slot39(&self) -> bool { - self.bits_4 & (1 << 7) != 0 - } - pub fn slot40(&self) -> bool { - self.bits_5 & (1 << 0) != 0 - } - pub fn slot41(&self) -> bool { - self.bits_5 & (1 << 1) != 0 - } - pub fn slot42(&self) -> bool { - self.bits_5 & (1 << 2) != 0 - } - pub fn slot43(&self) -> bool { - self.bits_5 & (1 << 3) != 0 - } - pub fn slot44(&self) -> bool { - self.bits_5 & (1 << 4) != 0 - } - pub fn slot45(&self) -> bool { - self.bits_5 & (1 << 5) != 0 - } - pub fn slot46(&self) -> bool { - self.bits_5 & (1 << 6) != 0 - } - pub fn slot47(&self) -> bool { - self.bits_5 & (1 << 7) != 0 - } - pub fn slot48(&self) -> bool { - self.bits_6 & (1 << 0) != 0 - } - pub fn slot49(&self) -> bool { - self.bits_6 & (1 << 1) != 0 - } - pub fn slot50(&self) -> bool { - self.bits_6 & (1 << 2) != 0 - } - pub fn slot51(&self) -> bool { - self.bits_6 & (1 << 3) != 0 - } - pub fn slot52(&self) -> bool { - self.bits_6 & (1 << 4) != 0 - } - pub fn slot53(&self) -> bool { - self.bits_6 & (1 << 5) != 0 - } - pub fn slot54(&self) -> bool { - self.bits_6 & (1 << 6) != 0 - } - pub fn slot55(&self) -> bool { - self.bits_6 & (1 << 7) != 0 - } - pub fn slot56(&self) -> bool { - self.bits_7 & (1 << 0) != 0 - } - pub fn slot57(&self) -> bool { - self.bits_7 & (1 << 1) != 0 - } - pub fn slot58(&self) -> bool { - self.bits_7 & (1 << 2) != 0 - } - pub fn slot59(&self) -> bool { - self.bits_7 & (1 << 3) != 0 - } - pub fn slot60(&self) -> bool { - self.bits_7 & (1 << 4) != 0 - } - pub fn slot61(&self) -> bool { - self.bits_7 & (1 << 5) != 0 - } - pub fn slot62(&self) -> bool { - self.bits_7 & (1 << 6) != 0 - } - pub fn slot63(&self) -> bool { - self.bits_7 & (1 << 7) != 0 - } - pub fn slot64(&self) -> bool { - self.bits_8 & (1 << 0) != 0 - } - pub fn slot65(&self) -> bool { - self.bits_8 & (1 << 1) != 0 - } - pub fn slot66(&self) -> bool { - self.bits_8 & (1 << 2) != 0 - } - pub fn slot67(&self) -> bool { - self.bits_8 & (1 << 3) != 0 - } - pub fn slot68(&self) -> bool { - self.bits_8 & (1 << 4) != 0 - } - pub fn slot69(&self) -> bool { - self.bits_8 & (1 << 5) != 0 - } - pub fn slot70(&self) -> bool { - self.bits_8 & (1 << 6) != 0 - } - pub fn slot71(&self) -> bool { - self.bits_8 & (1 << 7) != 0 - } - pub fn slot72(&self) -> bool { - self.bits_9 & (1 << 0) != 0 - } - pub fn slot73(&self) -> bool { - self.bits_9 & (1 << 1) != 0 - } - pub fn slot74(&self) -> bool { - self.bits_9 & (1 << 2) != 0 - } - pub fn slot75(&self) -> bool { - self.bits_9 & (1 << 3) != 0 - } - pub fn slot76(&self) -> bool { - self.bits_9 & (1 << 4) != 0 - } - pub fn slot77(&self) -> bool { - self.bits_9 & (1 << 5) != 0 - } - pub fn slot78(&self) -> bool { - self.bits_9 & (1 << 6) != 0 - } - pub fn slot79(&self) -> bool { - self.bits_9 & (1 << 7) != 0 - } - pub fn slot80(&self) -> bool { - self.bits_10 & (1 << 0) != 0 - } - pub fn slot81(&self) -> bool { - self.bits_10 & (1 << 1) != 0 - } - pub fn slot82(&self) -> bool { - self.bits_10 & (1 << 2) != 0 - } - pub fn slot83(&self) -> bool { - self.bits_10 & (1 << 3) != 0 - } - pub fn slot84(&self) -> bool { - self.bits_10 & (1 << 4) != 0 - } - pub fn slot85(&self) -> bool { - self.bits_10 & (1 << 5) != 0 - } - pub fn slot86(&self) -> bool { - self.bits_10 & (1 << 6) != 0 - } - pub fn slot87(&self) -> bool { - self.bits_10 & (1 << 7) != 0 - } - pub fn slot88(&self) -> bool { - self.bits_11 & (1 << 0) != 0 - } - pub fn slot89(&self) -> bool { - self.bits_11 & (1 << 1) != 0 - } - pub fn slot90(&self) -> bool { - self.bits_11 & (1 << 2) != 0 - } - pub fn slot91(&self) -> bool { - self.bits_11 & (1 << 3) != 0 - } - pub fn slot92(&self) -> bool { - self.bits_11 & (1 << 4) != 0 - } - pub fn slot93(&self) -> bool { - self.bits_11 & (1 << 5) != 0 - } - pub fn slot94(&self) -> bool { - self.bits_11 & (1 << 6) != 0 - } - pub fn slot95(&self) -> bool { - self.bits_11 & (1 << 7) != 0 - } - pub fn slot96(&self) -> bool { - self.bits_12 & (1 << 0) != 0 - } - pub fn slot97(&self) -> bool { - self.bits_12 & (1 << 1) != 0 - } - pub fn slot98(&self) -> bool { - self.bits_12 & (1 << 2) != 0 - } - pub fn slot99(&self) -> bool { - self.bits_12 & (1 << 3) != 0 - } - pub fn pad(&self) -> bool { - self.bits_12 & (1 << 4) != 0 - } -} -impl Default for RANDOM_APPEAR_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 0, - bits_1: 0, - bits_2: 0, - bits_3: 0, - bits_4: 0, - bits_5: 0, - bits_6: 0, - bits_7: 0, - bits_8: 0, - bits_9: 0, - bits_10: 0, - bits_11: 0, - bits_12: 0, - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct REINFORCE_PARAM_PROTECTOR_ST { - pub physicsDefRate: f32, - pub magicDefRate: f32, - pub fireDefRate: f32, - pub thunderDefRate: f32, - pub slashDefRate: f32, - pub blowDefRate: f32, - pub thrustDefRate: f32, - pub resistPoisonRate: f32, - pub resistDiseaseRate: f32, - pub resistBloodRate: f32, - pub resistCurseRate: f32, - pub residentSpEffectId1: u8, - pub residentSpEffectId2: u8, - pub residentSpEffectId3: u8, - pub materialSetId: u8, - pub darkDefRate: f32, - pub resistFreezeRate: f32, - pub resistSleepRate: f32, - pub resistMadnessRate: f32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl REINFORCE_PARAM_PROTECTOR_ST { -} -impl Default for REINFORCE_PARAM_PROTECTOR_ST { - fn default() -> Self { - Self { - physicsDefRate: 1., - magicDefRate: 1., - fireDefRate: 1., - thunderDefRate: 1., - slashDefRate: 1., - blowDefRate: 1., - thrustDefRate: 1., - resistPoisonRate: 1., - resistDiseaseRate: 1., - resistBloodRate: 1., - resistCurseRate: 1., - residentSpEffectId1: 0, - residentSpEffectId2: 0, - residentSpEffectId3: 0, - materialSetId: 0, - darkDefRate: 1., - resistFreezeRate: 1., - resistSleepRate: 1., - resistMadnessRate: 1., - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct REINFORCE_PARAM_WEAPON_ST { - pub physicsAtkRate: f32, - pub magicAtkRate: f32, - pub fireAtkRate: f32, - pub thunderAtkRate: f32, - pub staminaAtkRate: f32, - pub saWeaponAtkRate: f32, - pub saDurabilityRate: f32, - pub correctStrengthRate: f32, - pub correctAgilityRate: f32, - pub correctMagicRate: f32, - pub correctFaithRate: f32, - pub physicsGuardCutRate: f32, - pub magicGuardCutRate: f32, - pub fireGuardCutRate: f32, - pub thunderGuardCutRate: f32, - pub poisonGuardResistRate: f32, - pub diseaseGuardResistRate: f32, - pub bloodGuardResistRate: f32, - pub curseGuardResistRate: f32, - pub staminaGuardDefRate: f32, - pub spEffectId1: u8, - pub spEffectId2: u8, - pub spEffectId3: u8, - pub residentSpEffectId1: u8, - pub residentSpEffectId2: u8, - pub residentSpEffectId3: u8, - pub materialSetId: u8, - pub maxReinforceLevel: u8, - pub darkAtkRate: f32, - pub darkGuardCutRate: f32, - pub correctLuckRate: f32, - pub freezeGuardDefRate: f32, - pub reinforcePriceRate: f32, - pub baseChangePriceRate: f32, - pub enableGemRank: i8, - pub pad2: [u8;3], - pub sleepGuardDefRate: f32, - pub madnessGuardDefRate: f32, - pub baseAtkRate: f32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl REINFORCE_PARAM_WEAPON_ST { -} -impl Default for REINFORCE_PARAM_WEAPON_ST { - fn default() -> Self { - Self { - physicsAtkRate: 1., - magicAtkRate: 1., - fireAtkRate: 1., - thunderAtkRate: 1., - staminaAtkRate: 1., - saWeaponAtkRate: 1., - saDurabilityRate: 1., - correctStrengthRate: 1., - correctAgilityRate: 1., - correctMagicRate: 1., - correctFaithRate: 1., - physicsGuardCutRate: 1., - magicGuardCutRate: 1., - fireGuardCutRate: 1., - thunderGuardCutRate: 1., - poisonGuardResistRate: 1., - diseaseGuardResistRate: 1., - bloodGuardResistRate: 1., - curseGuardResistRate: 1., - staminaGuardDefRate: 1., - spEffectId1: 0, - spEffectId2: 0, - spEffectId3: 0, - residentSpEffectId1: 0, - residentSpEffectId2: 0, - residentSpEffectId3: 0, - materialSetId: 0, - maxReinforceLevel: 0, - darkAtkRate: 1., - darkGuardCutRate: 1., - correctLuckRate: 1., - freezeGuardDefRate: 1., - reinforcePriceRate: 1., - baseChangePriceRate: 1., - enableGemRank: 0, - pad2: [0;3], - sleepGuardDefRate: 1., - madnessGuardDefRate: 1., - baseAtkRate: 1., - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct RESIST_CORRECT_PARAM_ST { - pub addPoint1: f32, - pub addPoint2: f32, - pub addPoint3: f32, - pub addPoint4: f32, - pub addPoint5: f32, - pub addRate1: f32, - pub addRate2: f32, - pub addRate3: f32, - pub addRate4: f32, - pub addRate5: f32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl RESIST_CORRECT_PARAM_ST { -} -impl Default for RESIST_CORRECT_PARAM_ST { - fn default() -> Self { - Self { - addPoint1: 0., - addPoint2: 0., - addPoint3: 0., - addPoint4: 0., - addPoint5: 0., - addRate1: 1., - addRate2: 1., - addRate3: 1., - addRate4: 1., - addRate5: 1., - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct REVERB_AUX_SEND_BUS_PARAM_ST { - pub ReverbAuxSendBusName: [u8;32], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl REVERB_AUX_SEND_BUS_PARAM_ST { -} -impl Default for REVERB_AUX_SEND_BUS_PARAM_ST { - fn default() -> Self { - Self { - ReverbAuxSendBusName: [0;32], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct RIDE_PARAM_ST { - pub atkChrId: i32, - pub defChrId: i32, - pub rideCamParamId: i32, - pub atkChrAnimId: i32, - pub defChrAnimId: i32, - pub defAdjustDmyId: i32, - pub defCheckDmyId: i32, - pub diffAngMyToDef: f32, - pub dist: f32, - pub upperYRange: f32, - pub lowerYRange: f32, - pub diffAngMin: f32, - pub diffAngMax: f32, - pub pad: [u8;12], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl RIDE_PARAM_ST { -} -impl Default for RIDE_PARAM_ST { - fn default() -> Self { - Self { - atkChrId: 0, - defChrId: 0, - rideCamParamId: -1, - atkChrAnimId: 0, - defChrAnimId: 0, - defAdjustDmyId: -1, - defCheckDmyId: -1, - diffAngMyToDef: 0., - dist: 0., - upperYRange: 0., - lowerYRange: 0., - diffAngMin: 0., - diffAngMax: 0., - pad: [0;12], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct ROLE_PARAM_ST { - pub teamType: u8, - pub pad10: [u8;3], - pub phantomParamId: i32, - pub spEffectID0: i32, - pub spEffectID1: i32, - pub spEffectID2: i32, - pub spEffectID3: i32, - pub spEffectID4: i32, - pub spEffectID5: i32, - pub spEffectID6: i32, - pub spEffectID7: i32, - pub spEffectID8: i32, - pub spEffectID9: i32, - pub sosSignSfxId: i32, - pub mySosSignSfxId: i32, - pub summonStartAnimId: i32, - pub itemlotParamId: i32, - pub voiceChatGroup: u8, - pub roleNameColor: u8, - pub pad1: [u8;2], - pub roleNameId: i32, - pub threatLv: i32, - pub phantomParamId_vowRank1: i32, - pub phantomParamId_vowRank2: i32, - pub phantomParamId_vowRank3: i32, - pub spEffectID_vowRank0: i32, - pub spEffectID_vowRank1: i32, - pub spEffectID_vowRank2: i32, - pub spEffectID_vowRank3: i32, - pub signPhantomId: i32, - pub nonPlayerSummonStartAnimId: i32, - pub pad2: [u8;16], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl ROLE_PARAM_ST { -} -impl Default for ROLE_PARAM_ST { - fn default() -> Self { - Self { - teamType: 0, - pad10: [0;3], - phantomParamId: -1, - spEffectID0: -1, - spEffectID1: -1, - spEffectID2: -1, - spEffectID3: -1, - spEffectID4: -1, - spEffectID5: -1, - spEffectID6: -1, - spEffectID7: -1, - spEffectID8: -1, - spEffectID9: -1, - sosSignSfxId: 0, - mySosSignSfxId: 0, - summonStartAnimId: 0, - itemlotParamId: -1, - voiceChatGroup: 0, - roleNameColor: 0, - pad1: [0;2], - roleNameId: 0, - threatLv: 0, - phantomParamId_vowRank1: -1, - phantomParamId_vowRank2: -1, - phantomParamId_vowRank3: -1, - spEffectID_vowRank0: -1, - spEffectID_vowRank1: -1, - spEffectID_vowRank2: -1, - spEffectID_vowRank3: -1, - signPhantomId: -1, - nonPlayerSummonStartAnimId: 0, - pad2: [0;16], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct ROLLING_OBJ_LOT_PARAM_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub AssetId_0: i32, - pub AssetId_1: i32, - pub AssetId_2: i32, - pub AssetId_3: i32, - pub AssetId_4: i32, - pub AssetId_5: i32, - pub AssetId_6: i32, - pub AssetId_7: i32, - pub CreateWeight_0: u8, - pub CreateWeight_1: u8, - pub CreateWeight_2: u8, - pub CreateWeight_3: u8, - pub CreateWeight_4: u8, - pub CreateWeight_5: u8, - pub CreateWeight_6: u8, - pub CreateWeight_7: u8, - pub Reserve_0: [u8;20], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl ROLLING_OBJ_LOT_PARAM_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } -} -impl Default for ROLLING_OBJ_LOT_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - AssetId_0: -1, - AssetId_1: -1, - AssetId_2: -1, - AssetId_3: -1, - AssetId_4: -1, - AssetId_5: -1, - AssetId_6: -1, - AssetId_7: -1, - CreateWeight_0: 0, - CreateWeight_1: 0, - CreateWeight_2: 0, - CreateWeight_3: 0, - CreateWeight_4: 0, - CreateWeight_5: 0, - CreateWeight_6: 0, - CreateWeight_7: 0, - Reserve_0: [0;20], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct RUNTIME_BONE_CONTROL_PARAM_ST { - pub chrId: i32, - pub ctrlType: u8, - pub pad: [u8;11], - pub applyBone: [u8;32], - pub targetBone1: [u8;32], - pub targetBone2: [u8;32], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl RUNTIME_BONE_CONTROL_PARAM_ST { -} -impl Default for RUNTIME_BONE_CONTROL_PARAM_ST { - fn default() -> Self { - Self { - chrId: 0, - ctrlType: 0, - pad: [0;11], - applyBone: [0;32], - targetBone1: [0;32], - targetBone2: [0;32], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct SE_ACTIVATION_RANGE_PARAM_ST { - pub activateRange: f32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl SE_ACTIVATION_RANGE_PARAM_ST { -} -impl Default for SE_ACTIVATION_RANGE_PARAM_ST { - fn default() -> Self { - Self { - activateRange: 0., - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct SE_MATERIAL_CONVERT_PARAM_ST { - pub seMaterialId: u8, - pub pad: [u8;3], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl SE_MATERIAL_CONVERT_PARAM_ST { -} -impl Default for SE_MATERIAL_CONVERT_PARAM_ST { - fn default() -> Self { - Self { - seMaterialId: 0, - pad: [0;3], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct SFX_BLOCK_RES_SHARE_PARAM { - pub shareBlockRsMapUidVal: i32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl SFX_BLOCK_RES_SHARE_PARAM { -} -impl Default for SFX_BLOCK_RES_SHARE_PARAM { - fn default() -> Self { - Self { - shareBlockRsMapUidVal: 0, - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct SHOP_LINEUP_PARAM { - pub equipId: i32, - pub value: i32, - pub mtrlId: i32, - pub eventFlag_forStock: i32, - pub eventFlag_forRelease: i32, - pub sellQuantity: i16, - pub pad3: [u8;1], - pub equipType: u8, - pub costType: u8, - pub pad1: [u8;1], - pub setNum: i16, - pub value_Add: i32, - pub value_Magnification: f32, - pub iconId: i32, - pub nameMsgId: i32, - pub menuTitleMsgId: i32, - pub menuIconId: i16, - pub pad2: [u8;2], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl SHOP_LINEUP_PARAM { -} -impl Default for SHOP_LINEUP_PARAM { - fn default() -> Self { - Self { - equipId: 0, - value: -1, - mtrlId: -1, - eventFlag_forStock: 0, - eventFlag_forRelease: 0, - sellQuantity: -1, - pad3: [0;1], - equipType: 0, - costType: 0, - pad1: [0;1], - setNum: 1, - value_Add: 0, - value_Magnification: 1., - iconId: -1, - nameMsgId: -1, - menuTitleMsgId: -1, - menuIconId: -1, - pad2: [0;2], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct SIGN_PUDDLE_PARAM_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub matchAreaId: i32, - pub pad1: [u8;24], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl SIGN_PUDDLE_PARAM_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } -} -impl Default for SIGN_PUDDLE_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - matchAreaId: 0, - pad1: [0;24], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct SOUND_ASSET_SOUND_OBJ_ENABLE_DIST_PARAM_ST { - pub SoundObjEnableDist: f32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl SOUND_ASSET_SOUND_OBJ_ENABLE_DIST_PARAM_ST { -} -impl Default for SOUND_ASSET_SOUND_OBJ_ENABLE_DIST_PARAM_ST { - fn default() -> Self { - Self { - SoundObjEnableDist: -1., - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct SOUND_AUTO_ENV_SOUND_GROUP_PARAM_ST { - pub SoundNo: i32, - pub ExpandRange: f32, - pub FollowSpeed: f32, - pub FollowRate: f32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl SOUND_AUTO_ENV_SOUND_GROUP_PARAM_ST { -} -impl Default for SOUND_AUTO_ENV_SOUND_GROUP_PARAM_ST { - fn default() -> Self { - Self { - SoundNo: -1, - ExpandRange: 100., - FollowSpeed: 0.1, - FollowRate: 0.015, - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct SOUND_AUTO_REVERB_EVALUATION_DIST_PARAM_ST { - pub NoHitDist: f32, - pub isCollectNoHitPoint: u8, - pub isCollectOutdoorPoint: u8, - pub isCollectFloorPoint: u8, - pub distValCalcType: u8, - pub enableLifeTime: f32, - pub maxDistRecordNum: i32, - pub ignoreDistNumForMax: i32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl SOUND_AUTO_REVERB_EVALUATION_DIST_PARAM_ST { -} -impl Default for SOUND_AUTO_REVERB_EVALUATION_DIST_PARAM_ST { - fn default() -> Self { - Self { - NoHitDist: -1., - isCollectNoHitPoint: 0, - isCollectOutdoorPoint: 0, - isCollectFloorPoint: 0, - distValCalcType: 0, - enableLifeTime: -1., - maxDistRecordNum: 20, - ignoreDistNumForMax: 0, - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct SOUND_AUTO_REVERB_SELECT_PARAM_ST { - pub reverbType: i32, - pub AreaNo: i32, - pub IndoorOutdoor: i8, - pub useDistNoA: i8, - pub useDistNoB: i8, - pub pad0: [u8;1], - pub DistMinA: f32, - pub DistMaxA: f32, - pub DistMinB: f32, - pub DistMaxB: f32, - pub NoHitNumMin: i32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl SOUND_AUTO_REVERB_SELECT_PARAM_ST { -} -impl Default for SOUND_AUTO_REVERB_SELECT_PARAM_ST { - fn default() -> Self { - Self { - reverbType: 0, - AreaNo: -1, - IndoorOutdoor: -1, - useDistNoA: -1, - useDistNoB: -1, - pad0: [0;1], - DistMinA: -1., - DistMaxA: -1., - DistMinB: -1., - DistMaxB: -1., - NoHitNumMin: -1, - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct SOUND_CHR_PHYSICS_SE_PARAM_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub ContactLandSeId: i32, - pub ContactLandAddSeId: i32, - pub ContactLandPlayNum: i32, - pub IsEnablePlayCountPerRigid: u8, - pub pad: [u8;3], - pub ContactLandMinImpuse: f32, - pub ContactLandMinSpeed: f32, - pub ContactPlayerSeId: i32, - pub ContactPlayerMinImpuse: f32, - pub ContactPlayerMinSpeed: f32, - pub ContactCheckRigidIdx0: i8, - pub ContactCheckRigidIdx1: i8, - pub ContactCheckRigidIdx2: i8, - pub ContactCheckRigidIdx3: i8, - pub ContactCheckRigidIdx4: i8, - pub ContactCheckRigidIdx5: i8, - pub ContactCheckRigidIdx6: i8, - pub ContactCheckRigidIdx7: i8, - pub ContactCheckRigidIdx8: i8, - pub ContactCheckRigidIdx9: i8, - pub ContactCheckRigidIdx10: i8, - pub ContactCheckRigidIdx11: i8, - pub ContactCheckRigidIdx12: i8, - pub ContactCheckRigidIdx13: i8, - pub ContactCheckRigidIdx14: i8, - pub ContactCheckRigidIdx15: i8, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl SOUND_CHR_PHYSICS_SE_PARAM_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } -} -impl Default for SOUND_CHR_PHYSICS_SE_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - ContactLandSeId: -1, - ContactLandAddSeId: -1, - ContactLandPlayNum: 1, - IsEnablePlayCountPerRigid: 0, - pad: [0;3], - ContactLandMinImpuse: 20., - ContactLandMinSpeed: 0., - ContactPlayerSeId: -1, - ContactPlayerMinImpuse: 20., - ContactPlayerMinSpeed: 0., - ContactCheckRigidIdx0: -1, - ContactCheckRigidIdx1: -1, - ContactCheckRigidIdx2: -1, - ContactCheckRigidIdx3: -1, - ContactCheckRigidIdx4: -1, - ContactCheckRigidIdx5: -1, - ContactCheckRigidIdx6: -1, - ContactCheckRigidIdx7: -1, - ContactCheckRigidIdx8: -1, - ContactCheckRigidIdx9: -1, - ContactCheckRigidIdx10: -1, - ContactCheckRigidIdx11: -1, - ContactCheckRigidIdx12: -1, - ContactCheckRigidIdx13: -1, - ContactCheckRigidIdx14: -1, - ContactCheckRigidIdx15: -1, - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct SOUND_COMMON_INGAME_PARAM_ST { - pub ParamKeyStr: [u8;32], - pub ParamValueStr: [u8;32], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl SOUND_COMMON_INGAME_PARAM_ST { -} -impl Default for SOUND_COMMON_INGAME_PARAM_ST { - fn default() -> Self { - Self { - ParamKeyStr: [0;32], - ParamValueStr: [0;32], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct SOUND_COMMON_SYSTEM_PARAM_ST { - pub ParamKeyStr: [u8;32], - pub ParamValueStr: [u8;32], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl SOUND_COMMON_SYSTEM_PARAM_ST { -} -impl Default for SOUND_COMMON_SYSTEM_PARAM_ST { - fn default() -> Self { - Self { - ParamKeyStr: [0;32], - ParamValueStr: [0;32], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct SOUND_CUTSCENE_PARAM_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub ReverbType: u8, - pub pad0: [u8;3], - pub BgmBehaviorTypeOnStart: i16, - pub OneShotBgmBehaviorOnStart: i16, - pub PostPlaySeId: i32, - pub PostPlaySeIdForSkip: i32, - pub EnterMapMuteStopTimeOnDrawCutscene: f32, - pub reserved: [u8;8], - pub reserved2: [u8;4], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl SOUND_CUTSCENE_PARAM_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } -} -impl Default for SOUND_CUTSCENE_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - ReverbType: 0, - pad0: [0;3], - BgmBehaviorTypeOnStart: 0, - OneShotBgmBehaviorOnStart: 0, - PostPlaySeId: -1, - PostPlaySeIdForSkip: -1, - EnterMapMuteStopTimeOnDrawCutscene: -1., - reserved: [0;8], - reserved2: [0;4], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct SPEEDTREE_MODEL_PARAM_ST { - pub MinFadeLeaf: f32, - pub MinFadeFrond: f32, - pub MinFadeBranch: f32, - pub MinTranslucencyLeaf: f32, - pub MaxTranslucencyLeaf: f32, - pub MinTranslucencyFrond: f32, - pub MaxTranslucencyFrond: f32, - pub MinTranslucencyBranch: f32, - pub MaxTranslucencyBranch: f32, - pub BillboardBackSpecularWeakenParam: f32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl SPEEDTREE_MODEL_PARAM_ST { -} -impl Default for SPEEDTREE_MODEL_PARAM_ST { - fn default() -> Self { - Self { - MinFadeLeaf: 0., - MinFadeFrond: 0., - MinFadeBranch: 0., - MinTranslucencyLeaf: 0., - MaxTranslucencyLeaf: 5., - MinTranslucencyFrond: 0., - MaxTranslucencyFrond: 5., - MinTranslucencyBranch: 0., - MaxTranslucencyBranch: 5., - BillboardBackSpecularWeakenParam: 1., - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct SP_EFFECT_PARAM_ST { - pub iconId: i32, - pub conditionHp: f32, - pub effectEndurance: f32, - pub motionInterval: f32, - pub maxHpRate: f32, - pub maxMpRate: f32, - pub maxStaminaRate: f32, - pub slashDamageCutRate: f32, - pub blowDamageCutRate: f32, - pub thrustDamageCutRate: f32, - pub neutralDamageCutRate: f32, - pub magicDamageCutRate: f32, - pub fireDamageCutRate: f32, - pub thunderDamageCutRate: f32, - pub physicsAttackRate: f32, - pub magicAttackRate: f32, - pub fireAttackRate: f32, - pub thunderAttackRate: f32, - pub physicsAttackPowerRate: f32, - pub magicAttackPowerRate: f32, - pub fireAttackPowerRate: f32, - pub thunderAttackPowerRate: f32, - pub physicsAttackPower: i32, - pub magicAttackPower: i32, - pub fireAttackPower: i32, - pub thunderAttackPower: i32, - pub physicsDiffenceRate: f32, - pub magicDiffenceRate: f32, - pub fireDiffenceRate: f32, - pub thunderDiffenceRate: f32, - pub physicsDiffence: i32, - pub magicDiffence: i32, - pub fireDiffence: i32, - pub thunderDiffence: i32, - pub NoGuardDamageRate: f32, - pub vitalSpotChangeRate: f32, - pub normalSpotChangeRate: f32, - pub lookAtTargetPosOffset: f32, - pub behaviorId: i32, - pub changeHpRate: f32, - pub changeHpPoint: i32, - pub changeMpRate: f32, - pub changeMpPoint: i32, - pub mpRecoverChangeSpeed: i32, - pub changeStaminaRate: f32, - pub changeStaminaPoint: i32, - pub staminaRecoverChangeSpeed: i32, - pub magicEffectTimeChange: f32, - pub insideDurability: i32, - pub maxDurability: i32, - pub staminaAttackRate: f32, - pub poizonAttackPower: i32, - pub diseaseAttackPower: i32, - pub bloodAttackPower: i32, - pub curseAttackPower: i32, - pub fallDamageRate: f32, - pub soulRate: f32, - pub equipWeightChangeRate: f32, - pub allItemWeightChangeRate: f32, - pub soul: i32, - pub animIdOffset: i32, - pub haveSoulRate: f32, - pub targetPriority: f32, - pub sightSearchEnemyRate: f32, - pub hearingSearchEnemyRate: f32, - pub grabityRate: f32, - pub registPoizonChangeRate: f32, - pub registDiseaseChangeRate: f32, - pub registBloodChangeRate: f32, - pub registCurseChangeRate: f32, - pub soulStealRate: f32, - pub lifeReductionRate: f32, - pub hpRecoverRate: f32, - pub replaceSpEffectId: i32, - pub cycleOccurrenceSpEffectId: i32, - pub atkOccurrenceSpEffectId: i32, - pub guardDefFlickPowerRate: f32, - pub guardStaminaCutRate: f32, - pub rayCastPassedTime: i16, - pub magicSubCategoryChange1: u8, - pub magicSubCategoryChange2: u8, - pub bowDistRate: i16, - pub spCategory: i16, - pub categoryPriority: u8, - pub saveCategory: i8, - pub changeMagicSlot: u8, - pub changeMiracleSlot: u8, - pub heroPointDamage: i8, - pub defFlickPower: u8, - pub flickDamageCutRate: u8, - pub bloodDamageRate: u8, - pub dmgLv_None: i8, - pub dmgLv_S: i8, - pub dmgLv_M: i8, - pub dmgLv_L: i8, - pub dmgLv_BlowM: i8, - pub dmgLv_Push: i8, - pub dmgLv_Strike: i8, - pub dmgLv_BlowS: i8, - pub dmgLv_Min: i8, - pub dmgLv_Uppercut: i8, - pub dmgLv_BlowLL: i8, - pub dmgLv_Breath: i8, - pub atkAttribute: u8, - pub spAttribute: u8, - pub stateInfo: i16, - pub wepParamChange: u8, - pub moveType: u8, - pub lifeReductionType: i16, - pub throwCondition: u8, - pub addBehaviorJudgeId_condition: i8, - pub freezeDamageRate: u8, - bits_0: u8, - bits_1: u8, - bits_2: u8, - bits_3: u8, - bits_4: u8, - bits_5: u8, - bits_6: u8, - bits_7: u8, - pub repAtkDmgLv: i8, - pub sightSearchRate: f32, - bits_8: u8, - pub changeTeamType: i8, - pub dmypolyId: i16, - pub vfxId: i32, - pub accumuOverFireId: i32, - pub accumuOverVal: i32, - pub accumuUnderFireId: i32, - pub accumuUnderVal: i32, - pub accumuVal: i32, - pub eye_angX: u8, - pub eye_angY: u8, - pub addDeceasedLv: i16, - pub vfxId1: i32, - pub vfxId2: i32, - pub vfxId3: i32, - pub vfxId4: i32, - pub vfxId5: i32, - pub vfxId6: i32, - pub vfxId7: i32, - pub freezeAttackPower: i32, - pub AppearAiSoundId: i32, - pub addFootEffectSfxId: i16, - pub dexterityCancelSystemOnlyAddDexterity: i8, - pub teamOffenseEffectivity: i8, - pub toughnessDamageCutRate: f32, - pub weakDmgRateA: f32, - pub weakDmgRateB: f32, - pub weakDmgRateC: f32, - pub weakDmgRateD: f32, - pub weakDmgRateE: f32, - pub weakDmgRateF: f32, - pub darkDamageCutRate: f32, - pub darkDiffenceRate: f32, - pub darkDiffence: i32, - pub darkAttackRate: f32, - pub darkAttackPowerRate: f32, - pub darkAttackPower: i32, - pub antiDarkSightRadius: f32, - pub antiDarkSightDmypolyId: i32, - pub conditionHpRate: f32, - pub consumeStaminaRate: f32, - pub itemDropRate: f32, - pub changePoisonResistPoint: i32, - pub changeDiseaseResistPoint: i32, - pub changeBloodResistPoint: i32, - pub changeCurseResistPoint: i32, - pub changeFreezeResistPoint: i32, - pub slashAttackRate: f32, - pub blowAttackRate: f32, - pub thrustAttackRate: f32, - pub neutralAttackRate: f32, - pub slashAttackPowerRate: f32, - pub blowAttackPowerRate: f32, - pub thrustAttackPowerRate: f32, - pub neutralAttackPowerRate: f32, - pub slashAttackPower: i32, - pub blowAttackPower: i32, - pub thrustAttackPower: i32, - pub neutralAttackPower: i32, - pub changeStrengthPoint: i32, - pub changeAgilityPoint: i32, - pub changeMagicPoint: i32, - pub changeFaithPoint: i32, - pub changeLuckPoint: i32, - pub recoverArtsPoint_Str: i8, - pub recoverArtsPoint_Dex: i8, - pub recoverArtsPoint_Magic: i8, - pub recoverArtsPoint_Miracle: i8, - pub madnessDamageRate: u8, - bits_9: u8, - pub addBehaviorJudgeId_add: i16, - pub saReceiveDamageRate: f32, - pub defPlayerDmgCorrectRate_Physics: f32, - pub defPlayerDmgCorrectRate_Magic: f32, - pub defPlayerDmgCorrectRate_Fire: f32, - pub defPlayerDmgCorrectRate_Thunder: f32, - pub defPlayerDmgCorrectRate_Dark: f32, - pub defEnemyDmgCorrectRate_Physics: f32, - pub defEnemyDmgCorrectRate_Magic: f32, - pub defEnemyDmgCorrectRate_Fire: f32, - pub defEnemyDmgCorrectRate_Thunder: f32, - pub defEnemyDmgCorrectRate_Dark: f32, - pub defObjDmgCorrectRate: f32, - pub atkPlayerDmgCorrectRate_Physics: f32, - pub atkPlayerDmgCorrectRate_Magic: f32, - pub atkPlayerDmgCorrectRate_Fire: f32, - pub atkPlayerDmgCorrectRate_Thunder: f32, - pub atkPlayerDmgCorrectRate_Dark: f32, - pub atkEnemyDmgCorrectRate_Physics: f32, - pub atkEnemyDmgCorrectRate_Magic: f32, - pub atkEnemyDmgCorrectRate_Fire: f32, - pub atkEnemyDmgCorrectRate_Thunder: f32, - pub atkEnemyDmgCorrectRate_Dark: f32, - pub registFreezeChangeRate: f32, - pub invocationConditionsStateChange1: i16, - pub invocationConditionsStateChange2: i16, - pub invocationConditionsStateChange3: i16, - pub hearingAiSoundLevel: i16, - pub chrProxyHeightRate: f32, - pub addAwarePointCorrectValue_forMe: f32, - pub addAwarePointCorrectValue_forTarget: f32, - pub sightSearchEnemyAdd: f32, - pub sightSearchAdd: f32, - pub hearingSearchAdd: f32, - pub hearingSearchRate: f32, - pub hearingSearchEnemyAdd: f32, - pub value_Magnification: f32, - pub artsConsumptionRate: f32, - pub magicConsumptionRate: f32, - pub shamanConsumptionRate: f32, - pub miracleConsumptionRate: f32, - pub changeHpEstusFlaskRate: i32, - pub changeHpEstusFlaskPoint: i32, - pub changeMpEstusFlaskRate: i32, - pub changeMpEstusFlaskPoint: i32, - pub changeHpEstusFlaskCorrectRate: f32, - pub changeMpEstusFlaskCorrectRate: f32, - pub applyIdOnGetSoul: i32, - pub extendLifeRate: f32, - pub contractLifeRate: f32, - pub defObjectAttackPowerRate: f32, - pub effectEndDeleteDecalGroupId: i16, - pub addLifeForceStatus: i8, - pub addWillpowerStatus: i8, - pub addEndureStatus: i8, - pub addVitalityStatus: i8, - pub addStrengthStatus: i8, - pub addDexterityStatus: i8, - pub addMagicStatus: i8, - pub addFaithStatus: i8, - pub addLuckStatus: i8, - pub deleteCriteriaDamage: u8, - pub magicSubCategoryChange3: u8, - pub spAttributeVariationValue: u8, - pub atkFlickPower: u8, - pub wetConditionDepth: u8, - pub changeSaRecoveryVelocity: f32, - pub regainRate: f32, - pub saAttackPowerRate: f32, - pub sleepAttackPower: i32, - pub madnessAttackPower: i32, - pub registSleepChangeRate: f32, - pub registMadnessChangeRate: f32, - pub changeSleepResistPoint: i32, - pub changeMadnessResistPoint: i32, - pub sleepDamageRate: u8, - pub applyPartsGroup: u8, - bits_10: u8, - pub changeSuperArmorPoint: f32, - pub changeSaPoint: f32, - pub hugeEnemyPickupHeightOverwrite: f32, - pub poisonDefDamageRate: f32, - pub diseaseDefDamageRate: f32, - pub bloodDefDamageRate: f32, - pub curseDefDamageRate: f32, - pub freezeDefDamageRate: f32, - pub sleepDefDamageRate: f32, - pub madnessDefDamageRate: f32, - pub overwrite_maxBackhomeDist: i16, - pub overwrite_backhomeDist: i16, - pub overwrite_backhomeBattleDist: i16, - pub overwrite_BackHome_LookTargetDist: i16, - pub goodsConsumptionRate: f32, - pub guardStaminaMult: f32, - pub unk3: [u8;4], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl SP_EFFECT_PARAM_ST { - pub fn effectTargetSelf(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn effectTargetFriend(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } - pub fn effectTargetEnemy(&self) -> bool { - self.bits_0 & (1 << 2) != 0 - } - pub fn effectTargetPlayer(&self) -> bool { - self.bits_0 & (1 << 3) != 0 - } - pub fn effectTargetAI(&self) -> bool { - self.bits_0 & (1 << 4) != 0 - } - pub fn effectTargetLive(&self) -> bool { - self.bits_0 & (1 << 5) != 0 - } - pub fn effectTargetGhost(&self) -> bool { - self.bits_0 & (1 << 6) != 0 - } - pub fn disableSleep(&self) -> bool { - self.bits_0 & (1 << 7) != 0 - } - pub fn disableMadness(&self) -> bool { - self.bits_1 & (1 << 0) != 0 - } - pub fn effectTargetAttacker(&self) -> bool { - self.bits_1 & (1 << 1) != 0 - } - pub fn dispIconNonactive(&self) -> bool { - self.bits_1 & (1 << 2) != 0 - } - pub fn regainGaugeDamage(&self) -> bool { - self.bits_1 & (1 << 3) != 0 - } - pub fn bAdjustMagicAblity(&self) -> bool { - self.bits_1 & (1 << 4) != 0 - } - pub fn bAdjustFaithAblity(&self) -> bool { - self.bits_1 & (1 << 5) != 0 - } - pub fn bGameClearBonus(&self) -> bool { - self.bits_1 & (1 << 6) != 0 - } - pub fn magParamChange(&self) -> bool { - self.bits_1 & (1 << 7) != 0 - } - pub fn miracleParamChange(&self) -> bool { - self.bits_2 & (1 << 0) != 0 - } - pub fn clearSoul(&self) -> bool { - self.bits_2 & (1 << 1) != 0 - } - pub fn requestSOS(&self) -> bool { - self.bits_2 & (1 << 2) != 0 - } - pub fn requestBlackSOS(&self) -> bool { - self.bits_2 & (1 << 3) != 0 - } - pub fn requestForceJoinBlackSOS(&self) -> bool { - self.bits_2 & (1 << 4) != 0 - } - pub fn requestKickSession(&self) -> bool { - self.bits_2 & (1 << 5) != 0 - } - pub fn requestLeaveSession(&self) -> bool { - self.bits_2 & (1 << 6) != 0 - } - pub fn requestNpcInveda(&self) -> bool { - self.bits_2 & (1 << 7) != 0 - } - pub fn noDead(&self) -> bool { - self.bits_3 & (1 << 0) != 0 - } - pub fn bCurrHPIndependeMaxHP(&self) -> bool { - self.bits_3 & (1 << 1) != 0 - } - pub fn corrosionIgnore(&self) -> bool { - self.bits_3 & (1 << 2) != 0 - } - pub fn sightSearchCutIgnore(&self) -> bool { - self.bits_3 & (1 << 3) != 0 - } - pub fn hearingSearchCutIgnore(&self) -> bool { - self.bits_3 & (1 << 4) != 0 - } - pub fn antiMagicIgnore(&self) -> bool { - self.bits_3 & (1 << 5) != 0 - } - pub fn fakeTargetIgnore(&self) -> bool { - self.bits_3 & (1 << 6) != 0 - } - pub fn fakeTargetIgnoreUndead(&self) -> bool { - self.bits_3 & (1 << 7) != 0 - } - pub fn fakeTargetIgnoreAnimal(&self) -> bool { - self.bits_4 & (1 << 0) != 0 - } - pub fn grabityIgnore(&self) -> bool { - self.bits_4 & (1 << 1) != 0 - } - pub fn disablePoison(&self) -> bool { - self.bits_4 & (1 << 2) != 0 - } - pub fn disableDisease(&self) -> bool { - self.bits_4 & (1 << 3) != 0 - } - pub fn disableBlood(&self) -> bool { - self.bits_4 & (1 << 4) != 0 - } - pub fn disableCurse(&self) -> bool { - self.bits_4 & (1 << 5) != 0 - } - pub fn enableCharm(&self) -> bool { - self.bits_4 & (1 << 6) != 0 - } - pub fn enableLifeTime(&self) -> bool { - self.bits_4 & (1 << 7) != 0 - } - pub fn bAdjustStrengthAblity(&self) -> bool { - self.bits_5 & (1 << 0) != 0 - } - pub fn bAdjustAgilityAblity(&self) -> bool { - self.bits_5 & (1 << 1) != 0 - } - pub fn eraseOnBonfireRecover(&self) -> bool { - self.bits_5 & (1 << 2) != 0 - } - pub fn throwAttackParamChange(&self) -> bool { - self.bits_5 & (1 << 3) != 0 - } - pub fn requestLeaveColiseumSession(&self) -> bool { - self.bits_5 & (1 << 4) != 0 - } - pub fn isExtendSpEffectLife(&self) -> bool { - self.bits_5 & (1 << 5) != 0 - } - pub fn hasTarget(&self) -> bool { - self.bits_5 & (1 << 6) != 0 - } - pub fn replanningOnFire(&self) -> bool { - self.bits_5 & (1 << 7) != 0 - } - pub fn vowType0(&self) -> bool { - self.bits_6 & (1 << 0) != 0 - } - pub fn vowType1(&self) -> bool { - self.bits_6 & (1 << 1) != 0 - } - pub fn vowType2(&self) -> bool { - self.bits_6 & (1 << 2) != 0 - } - pub fn vowType3(&self) -> bool { - self.bits_6 & (1 << 3) != 0 - } - pub fn vowType4(&self) -> bool { - self.bits_6 & (1 << 4) != 0 - } - pub fn vowType5(&self) -> bool { - self.bits_6 & (1 << 5) != 0 - } - pub fn vowType6(&self) -> bool { - self.bits_6 & (1 << 6) != 0 - } - pub fn vowType7(&self) -> bool { - self.bits_6 & (1 << 7) != 0 - } - pub fn vowType8(&self) -> bool { - self.bits_7 & (1 << 0) != 0 - } - pub fn vowType9(&self) -> bool { - self.bits_7 & (1 << 1) != 0 - } - pub fn vowType10(&self) -> bool { - self.bits_7 & (1 << 2) != 0 - } - pub fn vowType11(&self) -> bool { - self.bits_7 & (1 << 3) != 0 - } - pub fn vowType12(&self) -> bool { - self.bits_7 & (1 << 4) != 0 - } - pub fn vowType13(&self) -> bool { - self.bits_7 & (1 << 5) != 0 - } - pub fn vowType14(&self) -> bool { - self.bits_7 & (1 << 6) != 0 - } - pub fn vowType15(&self) -> bool { - self.bits_7 & (1 << 7) != 0 - } - pub fn effectTargetOpposeTarget(&self) -> bool { - self.bits_8 & (1 << 0) != 0 - } - pub fn effectTargetFriendlyTarget(&self) -> bool { - self.bits_8 & (1 << 1) != 0 - } - pub fn effectTargetSelfTarget(&self) -> bool { - self.bits_8 & (1 << 2) != 0 - } - pub fn effectTargetPcHorse(&self) -> bool { - self.bits_8 & (1 << 3) != 0 - } - pub fn effectTargetPcDeceased(&self) -> bool { - self.bits_8 & (1 << 4) != 0 - } - pub fn isContractSpEffectLife(&self) -> bool { - self.bits_8 & (1 << 5) != 0 - } - pub fn isWaitModeDelete(&self) -> bool { - self.bits_8 & (1 << 6) != 0 - } - pub fn isIgnoreNoDamage(&self) -> bool { - self.bits_8 & (1 << 7) != 0 - } - pub fn isUseStatusAilmentAtkPowerCorrect(&self) -> bool { - self.bits_9 & (1 << 0) != 0 - } - pub fn isUseAtkParamAtkPowerCorrect(&self) -> bool { - self.bits_9 & (1 << 1) != 0 - } - pub fn dontDeleteOnDead(&self) -> bool { - self.bits_9 & (1 << 2) != 0 - } - pub fn disableFreeze(&self) -> bool { - self.bits_9 & (1 << 3) != 0 - } - pub fn isDisableNetSync(&self) -> bool { - self.bits_9 & (1 << 4) != 0 - } - pub fn shamanParamChange(&self) -> bool { - self.bits_9 & (1 << 5) != 0 - } - pub fn isStopSearchedNotify(&self) -> bool { - self.bits_9 & (1 << 6) != 0 - } - pub fn isCheckAboveShadowTest(&self) -> bool { - self.bits_9 & (1 << 7) != 0 - } - pub fn clearTarget(&self) -> bool { - self.bits_10 & (1 << 0) != 0 - } - pub fn fakeTargetIgnoreAjin(&self) -> bool { - self.bits_10 & (1 << 1) != 0 - } - pub fn fakeTargetIgnoreMirageArts(&self) -> bool { - self.bits_10 & (1 << 2) != 0 - } - pub fn requestForceJoinBlackSOS_B(&self) -> bool { - self.bits_10 & (1 << 3) != 0 - } - pub fn isDestinedDeathHpMult(&self) -> bool { - self.bits_10 & (1 << 4) != 0 - } -} -impl Default for SP_EFFECT_PARAM_ST { - fn default() -> Self { - Self { - iconId: -1, - conditionHp: -1., - effectEndurance: 0., - motionInterval: 0., - maxHpRate: 1., - maxMpRate: 1., - maxStaminaRate: 1., - slashDamageCutRate: 1., - blowDamageCutRate: 1., - thrustDamageCutRate: 1., - neutralDamageCutRate: 1., - magicDamageCutRate: 1., - fireDamageCutRate: 1., - thunderDamageCutRate: 1., - physicsAttackRate: 1., - magicAttackRate: 1., - fireAttackRate: 1., - thunderAttackRate: 1., - physicsAttackPowerRate: 1., - magicAttackPowerRate: 1., - fireAttackPowerRate: 1., - thunderAttackPowerRate: 1., - physicsAttackPower: 0, - magicAttackPower: 0, - fireAttackPower: 0, - thunderAttackPower: 0, - physicsDiffenceRate: 1., - magicDiffenceRate: 1., - fireDiffenceRate: 1., - thunderDiffenceRate: 1., - physicsDiffence: 0, - magicDiffence: 0, - fireDiffence: 0, - thunderDiffence: 0, - NoGuardDamageRate: 1., - vitalSpotChangeRate: -1., - normalSpotChangeRate: -1., - lookAtTargetPosOffset: 0., - behaviorId: -1, - changeHpRate: 0., - changeHpPoint: 0, - changeMpRate: 0., - changeMpPoint: 0, - mpRecoverChangeSpeed: 0, - changeStaminaRate: 0., - changeStaminaPoint: 0, - staminaRecoverChangeSpeed: 0, - magicEffectTimeChange: 0., - insideDurability: 0, - maxDurability: 0, - staminaAttackRate: 1., - poizonAttackPower: 0, - diseaseAttackPower: 0, - bloodAttackPower: 0, - curseAttackPower: 0, - fallDamageRate: 0., - soulRate: 0., - equipWeightChangeRate: 0., - allItemWeightChangeRate: 0., - soul: 0, - animIdOffset: -1, - haveSoulRate: 1., - targetPriority: 0., - sightSearchEnemyRate: 1., - hearingSearchEnemyRate: 1., - grabityRate: 1., - registPoizonChangeRate: 1., - registDiseaseChangeRate: 1., - registBloodChangeRate: 1., - registCurseChangeRate: 1., - soulStealRate: 0., - lifeReductionRate: 0., - hpRecoverRate: 0., - replaceSpEffectId: -1, - cycleOccurrenceSpEffectId: -1, - atkOccurrenceSpEffectId: -1, - guardDefFlickPowerRate: 1., - guardStaminaCutRate: 1., - rayCastPassedTime: -1, - magicSubCategoryChange1: 0, - magicSubCategoryChange2: 0, - bowDistRate: 0, - spCategory: 0, - categoryPriority: 0, - saveCategory: -1, - changeMagicSlot: 0, - changeMiracleSlot: 0, - heroPointDamage: 0, - defFlickPower: 0, - flickDamageCutRate: 0, - bloodDamageRate: 100, - dmgLv_None: 0, - dmgLv_S: 0, - dmgLv_M: 0, - dmgLv_L: 0, - dmgLv_BlowM: 0, - dmgLv_Push: 0, - dmgLv_Strike: 0, - dmgLv_BlowS: 0, - dmgLv_Min: 0, - dmgLv_Uppercut: 0, - dmgLv_BlowLL: 0, - dmgLv_Breath: 0, - atkAttribute: 254, - spAttribute: 254, - stateInfo: 0, - wepParamChange: 0, - moveType: 0, - lifeReductionType: 0, - throwCondition: 0, - addBehaviorJudgeId_condition: -1, - freezeDamageRate: 100, - bits_0: 0, - bits_1: 0, - bits_2: 0, - bits_3: 0, - bits_4: 0, - bits_5: 0, - bits_6: 0, - bits_7: 0, - repAtkDmgLv: 0, - sightSearchRate: 1., - bits_8: 0, - changeTeamType: -1, - dmypolyId: -1, - vfxId: -1, - accumuOverFireId: -1, - accumuOverVal: -1, - accumuUnderFireId: -1, - accumuUnderVal: -1, - accumuVal: 0, - eye_angX: 0, - eye_angY: 0, - addDeceasedLv: 0, - vfxId1: -1, - vfxId2: -1, - vfxId3: -1, - vfxId4: -1, - vfxId5: -1, - vfxId6: -1, - vfxId7: -1, - freezeAttackPower: 0, - AppearAiSoundId: 0, - addFootEffectSfxId: -1, - dexterityCancelSystemOnlyAddDexterity: 0, - teamOffenseEffectivity: -1, - toughnessDamageCutRate: 1., - weakDmgRateA: 1., - weakDmgRateB: 1., - weakDmgRateC: 1., - weakDmgRateD: 1., - weakDmgRateE: 1., - weakDmgRateF: 1., - darkDamageCutRate: 1., - darkDiffenceRate: 1., - darkDiffence: 0, - darkAttackRate: 1., - darkAttackPowerRate: 1., - darkAttackPower: 0, - antiDarkSightRadius: 0., - antiDarkSightDmypolyId: -1, - conditionHpRate: -1., - consumeStaminaRate: 1., - itemDropRate: 0., - changePoisonResistPoint: 0, - changeDiseaseResistPoint: 0, - changeBloodResistPoint: 0, - changeCurseResistPoint: 0, - changeFreezeResistPoint: 0, - slashAttackRate: 1., - blowAttackRate: 1., - thrustAttackRate: 1., - neutralAttackRate: 1., - slashAttackPowerRate: 1., - blowAttackPowerRate: 1., - thrustAttackPowerRate: 1., - neutralAttackPowerRate: 1., - slashAttackPower: 0, - blowAttackPower: 0, - thrustAttackPower: 0, - neutralAttackPower: 0, - changeStrengthPoint: 0, - changeAgilityPoint: 0, - changeMagicPoint: 0, - changeFaithPoint: 0, - changeLuckPoint: 0, - recoverArtsPoint_Str: 0, - recoverArtsPoint_Dex: 0, - recoverArtsPoint_Magic: 0, - recoverArtsPoint_Miracle: 0, - madnessDamageRate: 100, - bits_9: 0, - addBehaviorJudgeId_add: 0, - saReceiveDamageRate: 1., - defPlayerDmgCorrectRate_Physics: 1., - defPlayerDmgCorrectRate_Magic: 1., - defPlayerDmgCorrectRate_Fire: 1., - defPlayerDmgCorrectRate_Thunder: 1., - defPlayerDmgCorrectRate_Dark: 1., - defEnemyDmgCorrectRate_Physics: 1., - defEnemyDmgCorrectRate_Magic: 1., - defEnemyDmgCorrectRate_Fire: 1., - defEnemyDmgCorrectRate_Thunder: 1., - defEnemyDmgCorrectRate_Dark: 1., - defObjDmgCorrectRate: 1., - atkPlayerDmgCorrectRate_Physics: 1., - atkPlayerDmgCorrectRate_Magic: 1., - atkPlayerDmgCorrectRate_Fire: 1., - atkPlayerDmgCorrectRate_Thunder: 1., - atkPlayerDmgCorrectRate_Dark: 1., - atkEnemyDmgCorrectRate_Physics: 1., - atkEnemyDmgCorrectRate_Magic: 1., - atkEnemyDmgCorrectRate_Fire: 1., - atkEnemyDmgCorrectRate_Thunder: 1., - atkEnemyDmgCorrectRate_Dark: 1., - registFreezeChangeRate: 1., - invocationConditionsStateChange1: 0, - invocationConditionsStateChange2: 0, - invocationConditionsStateChange3: 0, - hearingAiSoundLevel: -1, - chrProxyHeightRate: 1., - addAwarePointCorrectValue_forMe: 0., - addAwarePointCorrectValue_forTarget: 0., - sightSearchEnemyAdd: 0., - sightSearchAdd: 0., - hearingSearchAdd: 0., - hearingSearchRate: 1., - hearingSearchEnemyAdd: 0., - value_Magnification: 1., - artsConsumptionRate: 1., - magicConsumptionRate: 1., - shamanConsumptionRate: 1., - miracleConsumptionRate: 1., - changeHpEstusFlaskRate: 0, - changeHpEstusFlaskPoint: 0, - changeMpEstusFlaskRate: 0, - changeMpEstusFlaskPoint: 0, - changeHpEstusFlaskCorrectRate: 1., - changeMpEstusFlaskCorrectRate: 1., - applyIdOnGetSoul: 0, - extendLifeRate: 1., - contractLifeRate: 1., - defObjectAttackPowerRate: 1., - effectEndDeleteDecalGroupId: -1, - addLifeForceStatus: 0, - addWillpowerStatus: 0, - addEndureStatus: 0, - addVitalityStatus: 0, - addStrengthStatus: 0, - addDexterityStatus: 0, - addMagicStatus: 0, - addFaithStatus: 0, - addLuckStatus: 0, - deleteCriteriaDamage: 0, - magicSubCategoryChange3: 0, - spAttributeVariationValue: 0, - atkFlickPower: 0, - wetConditionDepth: 0, - changeSaRecoveryVelocity: 1., - regainRate: 1., - saAttackPowerRate: 1., - sleepAttackPower: 0, - madnessAttackPower: 0, - registSleepChangeRate: 1., - registMadnessChangeRate: 1., - changeSleepResistPoint: 0, - changeMadnessResistPoint: 0, - sleepDamageRate: 100, - applyPartsGroup: 0, - bits_10: 0, - changeSuperArmorPoint: 0., - changeSaPoint: 0., - hugeEnemyPickupHeightOverwrite: 0., - poisonDefDamageRate: 1., - diseaseDefDamageRate: 1., - bloodDefDamageRate: 1., - curseDefDamageRate: 1., - freezeDefDamageRate: 1., - sleepDefDamageRate: 1., - madnessDefDamageRate: 1., - overwrite_maxBackhomeDist: 0, - overwrite_backhomeDist: 0, - overwrite_backhomeBattleDist: 0, - overwrite_BackHome_LookTargetDist: 0, - goodsConsumptionRate: 1., - guardStaminaMult: 1., - unk3: [0;4], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct SP_EFFECT_SET_PARAM_ST { - pub spEffectId1: i32, - pub spEffectId2: i32, - pub spEffectId3: i32, - pub spEffectId4: i32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl SP_EFFECT_SET_PARAM_ST { -} -impl Default for SP_EFFECT_SET_PARAM_ST { - fn default() -> Self { - Self { - spEffectId1: -1, - spEffectId2: -1, - spEffectId3: -1, - spEffectId4: -1, - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct SP_EFFECT_VFX_PARAM_ST { - pub midstSfxId: i32, - pub midstSeId: i32, - pub initSfxId: i32, - pub initSeId: i32, - pub finishSfxId: i32, - pub finishSeId: i32, - pub camouflageBeginDist: f32, - pub camouflageEndDist: f32, - pub transformProtectorId: i32, - pub midstDmyId: i16, - pub initDmyId: i16, - pub finishDmyId: i16, - pub effectType: u8, - pub soulParamIdForWepEnchant: u8, - pub playCategory: u8, - pub playPriority: u8, - bits_0: u8, - bits_1: u8, - pub decalId1: i32, - pub decalId2: i32, - pub footEffectPriority: u8, - pub footEffectOffset: u8, - pub traceSfxIdOffsetType: u8, - pub forceDeceasedType: u8, - pub enchantStartDmyId_0: i32, - pub enchantEndDmyId_0: i32, - pub enchantStartDmyId_1: i32, - pub enchantEndDmyId_1: i32, - pub enchantStartDmyId_2: i32, - pub enchantEndDmyId_2: i32, - pub enchantStartDmyId_3: i32, - pub enchantEndDmyId_3: i32, - pub enchantStartDmyId_4: i32, - pub enchantEndDmyId_4: i32, - pub enchantStartDmyId_5: i32, - pub enchantEndDmyId_5: i32, - pub enchantStartDmyId_6: i32, - pub enchantEndDmyId_6: i32, - pub enchantStartDmyId_7: i32, - pub enchantEndDmyId_7: i32, - pub SfxIdOffsetType: u8, - pub phantomParamOverwriteType: u8, - pub camouflageMinAlpha: u8, - pub wetAspectType: u8, - pub phantomParamOverwriteId: i32, - pub materialParamId: i32, - pub materialParamInitValue: f32, - pub materialParamTargetValue: f32, - pub materialParamFadeTime: f32, - pub footDecalMaterialOffsetOverwriteId: i16, - pub pad: [u8;14], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl SP_EFFECT_VFX_PARAM_ST { - pub fn existEffectForLarge(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn existEffectForSoul(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } - pub fn effectInvisibleAtCamouflage(&self) -> bool { - self.bits_0 & (1 << 2) != 0 - } - pub fn useCamouflage(&self) -> bool { - self.bits_0 & (1 << 3) != 0 - } - pub fn invisibleAtFriendCamouflage(&self) -> bool { - self.bits_0 & (1 << 4) != 0 - } - pub fn isHideFootEffect_forCamouflage(&self) -> bool { - self.bits_0 & (1 << 5) != 0 - } - pub fn halfCamouflage(&self) -> bool { - self.bits_0 & (1 << 6) != 0 - } - pub fn isFullBodyTransformProtectorId(&self) -> bool { - self.bits_0 & (1 << 7) != 0 - } - pub fn isInvisibleWeapon(&self) -> bool { - self.bits_1 & (1 << 0) != 0 - } - pub fn isSilence(&self) -> bool { - self.bits_1 & (1 << 1) != 0 - } - pub fn isMidstFullbody(&self) -> bool { - self.bits_1 & (1 << 2) != 0 - } - pub fn isInitFullbody(&self) -> bool { - self.bits_1 & (1 << 3) != 0 - } - pub fn isFinishFullbody(&self) -> bool { - self.bits_1 & (1 << 4) != 0 - } - pub fn isVisibleDeadChr(&self) -> bool { - self.bits_1 & (1 << 5) != 0 - } - pub fn isUseOffsetEnchantSfxSize(&self) -> bool { - self.bits_1 & (1 << 6) != 0 - } - pub fn pad_1(&self) -> bool { - self.bits_1 & (1 << 7) != 0 - } -} -impl Default for SP_EFFECT_VFX_PARAM_ST { - fn default() -> Self { - Self { - midstSfxId: -1, - midstSeId: -1, - initSfxId: -1, - initSeId: -1, - finishSfxId: -1, - finishSeId: -1, - camouflageBeginDist: -1., - camouflageEndDist: -1., - transformProtectorId: -1, - midstDmyId: -1, - initDmyId: -1, - finishDmyId: -1, - effectType: 0, - soulParamIdForWepEnchant: 0, - playCategory: 0, - playPriority: 0, - bits_0: 0, - bits_1: 0, - decalId1: -1, - decalId2: -1, - footEffectPriority: 0, - footEffectOffset: 0, - traceSfxIdOffsetType: 0, - forceDeceasedType: 0, - enchantStartDmyId_0: -1, - enchantEndDmyId_0: -1, - enchantStartDmyId_1: -1, - enchantEndDmyId_1: -1, - enchantStartDmyId_2: -1, - enchantEndDmyId_2: -1, - enchantStartDmyId_3: -1, - enchantEndDmyId_3: -1, - enchantStartDmyId_4: -1, - enchantEndDmyId_4: -1, - enchantStartDmyId_5: -1, - enchantEndDmyId_5: -1, - enchantStartDmyId_6: -1, - enchantEndDmyId_6: -1, - enchantStartDmyId_7: -1, - enchantEndDmyId_7: -1, - SfxIdOffsetType: 0, - phantomParamOverwriteType: 0, - camouflageMinAlpha: 0, - wetAspectType: 0, - phantomParamOverwriteId: 0, - materialParamId: -1, - materialParamInitValue: 0., - materialParamTargetValue: 0., - materialParamFadeTime: 0., - footDecalMaterialOffsetOverwriteId: -1, - pad: [0;14], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct SWORD_ARTS_PARAM_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub swordArtsType: u8, - pub artsSpeedType: u8, - pub refStatus: i8, - bits_1: u8, - pub usePoint_L1: i8, - pub usePoint_L2: i8, - pub usePoint_R1: i8, - pub usePoint_R2: i8, - pub textId: i32, - pub useMagicPoint_L1: i16, - pub useMagicPoint_L2: i16, - pub useMagicPoint_R1: i16, - pub useMagicPoint_R2: i16, - pub shieldIconType: i8, - pub swordArtsTypeNew: u8, - pub pad: [u8;1], - pub iconId: i16, - pub aiUsageId: i32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl SWORD_ARTS_PARAM_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } - pub fn isRefRightArts(&self) -> bool { - self.bits_1 & (1 << 0) != 0 - } - pub fn isGrayoutLeftHand(&self) -> bool { - self.bits_1 & (1 << 1) != 0 - } - pub fn isGrayoutRightHand(&self) -> bool { - self.bits_1 & (1 << 2) != 0 - } - pub fn isGrayoutBothHand(&self) -> bool { - self.bits_1 & (1 << 3) != 0 - } - pub fn reserve2(&self) -> bool { - self.bits_1 & (1 << 4) != 0 - } -} -impl Default for SWORD_ARTS_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - swordArtsType: 0, - artsSpeedType: 0, - refStatus: 0, - bits_1: 0, - usePoint_L1: 0, - usePoint_L2: 0, - usePoint_R1: 0, - usePoint_R2: 0, - textId: 0, - useMagicPoint_L1: 0, - useMagicPoint_L2: 0, - useMagicPoint_R1: 0, - useMagicPoint_R2: 0, - shieldIconType: 0, - swordArtsTypeNew: 0, - pad: [0;1], - iconId: 0, - aiUsageId: -1, - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct TALK_PARAM_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub msgId: i32, - pub voiceId: i32, - pub spEffectId0: i32, - pub motionId0: i32, - pub spEffectId1: i32, - pub motionId1: i32, - pub returnPos: i32, - pub reactionId: i32, - pub eventId: i32, - pub msgId_female: i32, - pub voiceId_female: i32, - pub lipSyncStart: i16, - pub lipSyncTime: i16, - pub pad2: [u8;4], - pub timeout: f32, - pub talkAnimationId: i32, - bits_1: u8, - pub pad1: [u8;31], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl TALK_PARAM_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } - pub fn isForceDisp(&self) -> bool { - self.bits_1 & (1 << 0) != 0 - } - pub fn pad3(&self) -> bool { - self.bits_1 & (1 << 1) != 0 - } -} -impl Default for TALK_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - msgId: -1, - voiceId: -1, - spEffectId0: -1, - motionId0: -1, - spEffectId1: -1, - motionId1: -1, - returnPos: -1, - reactionId: -1, - eventId: -1, - msgId_female: -1, - voiceId_female: -1, - lipSyncStart: -1, - lipSyncTime: -1, - pad2: [0;4], - timeout: -1., - talkAnimationId: -1, - bits_1: 0, - pad1: [0;31], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct THROW_DIRECTION_SFX_PARAM_ST { - pub sfxId_00: i32, - pub sfxId_01: i32, - pub sfxId_02: i32, - pub sfxId_03: i32, - pub sfxId_04: i32, - pub sfxId_05: i32, - pub sfxId_06: i32, - pub sfxId_07: i32, - pub sfxId_08: i32, - pub sfxId_09: i32, - pub sfxId_10: i32, - pub sfxId_11: i32, - pub sfxId_12: i32, - pub sfxId_13: i32, - pub sfxId_14: i32, - pub sfxId_15: i32, - pub sfxId_16: i32, - pub sfxId_17: i32, - pub sfxId_18: i32, - pub sfxId_19: i32, - pub sfxId_20: i32, - pub sfxId_21: i32, - pub sfxId_22: i32, - pub sfxId_23: i32, - pub sfxId_24: i32, - pub sfxId_25: i32, - pub sfxId_26: i32, - pub sfxId_27: i32, - pub sfxId_28: i32, - pub sfxId_29: i32, - pub sfxId_30: i32, - pub pad1: [u8;20], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl THROW_DIRECTION_SFX_PARAM_ST { -} -impl Default for THROW_DIRECTION_SFX_PARAM_ST { - fn default() -> Self { - Self { - sfxId_00: 0, - sfxId_01: 0, - sfxId_02: 0, - sfxId_03: 0, - sfxId_04: 0, - sfxId_05: 0, - sfxId_06: 0, - sfxId_07: 0, - sfxId_08: 0, - sfxId_09: 0, - sfxId_10: 0, - sfxId_11: 0, - sfxId_12: 0, - sfxId_13: 0, - sfxId_14: 0, - sfxId_15: 0, - sfxId_16: 0, - sfxId_17: 0, - sfxId_18: 0, - sfxId_19: 0, - sfxId_20: 0, - sfxId_21: 0, - sfxId_22: 0, - sfxId_23: 0, - sfxId_24: 0, - sfxId_25: 0, - sfxId_26: 0, - sfxId_27: 0, - sfxId_28: 0, - sfxId_29: 0, - sfxId_30: 0, - pad1: [0;20], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct THROW_PARAM_ST { - pub AtkChrId: i32, - pub DefChrId: i32, - pub Dist: f32, - pub DiffAngMin: f32, - pub DiffAngMax: f32, - pub upperYRange: f32, - pub lowerYRange: f32, - pub diffAngMyToDef: f32, - pub throwTypeId: i32, - pub atkAnimId: i32, - pub defAnimId: i32, - pub escHp: i16, - pub selfEscCycleTime: i16, - pub sphereCastRadiusRateTop: i16, - pub sphereCastRadiusRateLow: i16, - pub PadType: u8, - pub AtkEnableState: u8, - pub throwFollowingType: u8, - pub pad2: [u8;1], - pub throwType: u8, - pub selfEscCycleCnt: u8, - pub dmyHasChrDirType: u8, - bits_0: u8, - pub atkSorbDmyId: i16, - pub defSorbDmyId: i16, - pub Dist_start: f32, - pub DiffAngMin_start: f32, - pub DiffAngMax_start: f32, - pub upperYRange_start: f32, - pub lowerYRange_start: f32, - pub diffAngMyToDef_start: f32, - pub judgeRangeBasePosDmyId1: i32, - pub judgeRangeBasePosDmyId2: i32, - pub adsrobModelPosInterpolationTime: f32, - pub throwFollowingEndEasingTime: f32, - pub pad1: [u8;24], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl THROW_PARAM_ST { - pub fn isTurnAtker(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn isSkipWepCate(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } - pub fn isSkipSphereCast(&self) -> bool { - self.bits_0 & (1 << 2) != 0 - } - pub fn isEnableCorrectPos_forThrowAdjust(&self) -> bool { - self.bits_0 & (1 << 3) != 0 - } - pub fn isEnableThrowFollowingFallAssist(&self) -> bool { - self.bits_0 & (1 << 4) != 0 - } - pub fn isEnableThrowFollowingFeedback(&self) -> bool { - self.bits_0 & (1 << 5) != 0 - } - pub fn pad0(&self) -> bool { - self.bits_0 & (1 << 6) != 0 - } -} -impl Default for THROW_PARAM_ST { - fn default() -> Self { - Self { - AtkChrId: 0, - DefChrId: 0, - Dist: 0., - DiffAngMin: 0., - DiffAngMax: 0., - upperYRange: 0.2, - lowerYRange: 0.2, - diffAngMyToDef: 60., - throwTypeId: 0, - atkAnimId: 0, - defAnimId: 0, - escHp: 0, - selfEscCycleTime: 0, - sphereCastRadiusRateTop: 80, - sphereCastRadiusRateLow: 80, - PadType: 1, - AtkEnableState: 0, - throwFollowingType: 0, - pad2: [0;1], - throwType: 0, - selfEscCycleCnt: 0, - dmyHasChrDirType: 0, - bits_0: 0, - atkSorbDmyId: 0, - defSorbDmyId: 0, - Dist_start: 0., - DiffAngMin_start: 0., - DiffAngMax_start: 0., - upperYRange_start: 0., - lowerYRange_start: 0., - diffAngMyToDef_start: 0., - judgeRangeBasePosDmyId1: -1, - judgeRangeBasePosDmyId2: -1, - adsrobModelPosInterpolationTime: 0.5, - throwFollowingEndEasingTime: 0.5, - pad1: [0;24], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct TOUGHNESS_PARAM_ST { - pub correctionRate: f32, - pub minToughness: i16, - pub isNonEffectiveCorrectionForMin: u8, - pub pad2: [u8;1], - pub spEffectId: i32, - pub proCorrectionRate: f32, - pub unk1: f32, - pub unk2: f32, - pub pad1: [u8;8], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl TOUGHNESS_PARAM_ST { -} -impl Default for TOUGHNESS_PARAM_ST { - fn default() -> Self { - Self { - correctionRate: 1., - minToughness: 0, - isNonEffectiveCorrectionForMin: 0, - pad2: [0;1], - spEffectId: -1, - proCorrectionRate: 1., - unk1: 1., - unk2: 1., - pad1: [0;8], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct TUTORIAL_PARAM_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub menuType: u8, - pub triggerType: u8, - pub repeatType: u8, - pub pad1: [u8;1], - pub imageId: i16, - pub pad2: [u8;2], - pub unlockEventFlagId: i32, - pub textId: i32, - pub displayMinTime: f32, - pub displayTime: f32, - pub pad3: [u8;4], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl TUTORIAL_PARAM_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } -} -impl Default for TUTORIAL_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - menuType: 0, - triggerType: 0, - repeatType: 0, - pad1: [0;1], - imageId: 0, - pad2: [0;2], - unlockEventFlagId: 0, - textId: -1, - displayMinTime: 1., - displayTime: 3., - pad3: [0;4], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct WAYPOINT_PARAM_ST { - pub attribute1: i16, - pub attribute2: i16, - pub attribute3: i16, - pub attribute4: i16, - pub padding4: [u8;8], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl WAYPOINT_PARAM_ST { -} -impl Default for WAYPOINT_PARAM_ST { - fn default() -> Self { - Self { - attribute1: -1, - attribute2: -1, - attribute3: -1, - attribute4: -1, - padding4: [0;8], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct WEATHER_ASSET_CREATE_PARAM_ST { - pub AssetId: i32, - pub SlotNo: i32, - pub CreateConditionType: u8, - pub padding0: [u8;3], - pub TransitionSrcWeather: i16, - pub TransitionDstWeather: i16, - pub ElapsedTimeCheckweather: i16, - pub padding1: [u8;2], - pub ElapsedTime: f32, - pub CreateDelayTime: f32, - pub CreateProbability: i32, - pub LifeTime: f32, - pub FadeTime: f32, - pub EnableCreateTimeMin: f32, - pub EnableCreateTimeMax: f32, - pub CreatePoint0: i16, - pub CreatePoint1: i16, - pub CreatePoint2: i16, - pub CreatePoint3: i16, - pub CreateAssetLimitId0: i8, - pub CreateAssetLimitId1: i8, - pub CreateAssetLimitId2: i8, - pub CreateAssetLimitId3: i8, - pub Reserved2: [u8;4], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl WEATHER_ASSET_CREATE_PARAM_ST { -} -impl Default for WEATHER_ASSET_CREATE_PARAM_ST { - fn default() -> Self { - Self { - AssetId: 0, - SlotNo: 0, - CreateConditionType: 0, - padding0: [0;3], - TransitionSrcWeather: 0, - TransitionDstWeather: 0, - ElapsedTimeCheckweather: 0, - padding1: [0;2], - ElapsedTime: 0., - CreateDelayTime: -1., - CreateProbability: 100, - LifeTime: 600., - FadeTime: 1., - EnableCreateTimeMin: -1., - EnableCreateTimeMax: -1., - CreatePoint0: -1, - CreatePoint1: -1, - CreatePoint2: -1, - CreatePoint3: -1, - CreateAssetLimitId0: -1, - CreateAssetLimitId1: -1, - CreateAssetLimitId2: -1, - CreateAssetLimitId3: -1, - Reserved2: [0;4], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct WEATHER_ASSET_REPLACE_PARAM_ST { - pub mapId: i32, - pub TransitionSrcWeather: i16, - pub padding0: [u8;2], - pub isFireAsh: u8, - pub padding1: [u8;3], - pub reserved2: i32, - pub AssetId0: i32, - pub AssetId1: i32, - pub AssetId2: i32, - pub AssetId3: i32, - pub AssetId4: i32, - pub AssetId5: i32, - pub AssetId6: i32, - pub AssetId7: i32, - pub reserved0: [u8;8], - pub CreateAssetLimitId0: i8, - pub CreateAssetLimitId1: i8, - pub CreateAssetLimitId2: i8, - pub CreateAssetLimitId3: i8, - pub reserved1: [u8;4], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl WEATHER_ASSET_REPLACE_PARAM_ST { -} -impl Default for WEATHER_ASSET_REPLACE_PARAM_ST { - fn default() -> Self { - Self { - mapId: 0, - TransitionSrcWeather: 0, - padding0: [0;2], - isFireAsh: 0, - padding1: [0;3], - reserved2: 0, - AssetId0: -1, - AssetId1: -1, - AssetId2: -1, - AssetId3: -1, - AssetId4: -1, - AssetId5: -1, - AssetId6: -1, - AssetId7: -1, - reserved0: [0;8], - CreateAssetLimitId0: -1, - CreateAssetLimitId1: -1, - CreateAssetLimitId2: -1, - CreateAssetLimitId3: -1, - reserved1: [0;4], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct WEATHER_LOT_PARAM_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub weatherType0: i16, - pub weatherType1: i16, - pub weatherType2: i16, - pub weatherType3: i16, - pub weatherType4: i16, - pub weatherType5: i16, - pub weatherType6: i16, - pub weatherType7: i16, - pub weatherType8: i16, - pub weatherType9: i16, - pub weatherType10: i16, - pub weatherType11: i16, - pub weatherType12: i16, - pub weatherType13: i16, - pub weatherType14: i16, - pub weatherType15: i16, - pub lotteryWeight0: i16, - pub lotteryWeight1: i16, - pub lotteryWeight2: i16, - pub lotteryWeight3: i16, - pub lotteryWeight4: i16, - pub lotteryWeight5: i16, - pub lotteryWeight6: i16, - pub lotteryWeight7: i16, - pub lotteryWeight8: i16, - pub lotteryWeight9: i16, - pub lotteryWeight10: i16, - pub lotteryWeight11: i16, - pub lotteryWeight12: i16, - pub lotteryWeight13: i16, - pub lotteryWeight14: i16, - pub lotteryWeight15: i16, - pub timezoneLimit: u8, - pub timezoneStartHour: u8, - pub timezoneStartMinute: u8, - pub timezoneEndHour: u8, - pub timezoneEndMinute: u8, - pub reserve: [u8;9], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl WEATHER_LOT_PARAM_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } -} -impl Default for WEATHER_LOT_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - weatherType0: -1, - weatherType1: -1, - weatherType2: -1, - weatherType3: -1, - weatherType4: -1, - weatherType5: -1, - weatherType6: -1, - weatherType7: -1, - weatherType8: -1, - weatherType9: -1, - weatherType10: -1, - weatherType11: -1, - weatherType12: -1, - weatherType13: -1, - weatherType14: -1, - weatherType15: -1, - lotteryWeight0: 0, - lotteryWeight1: 0, - lotteryWeight2: 0, - lotteryWeight3: 0, - lotteryWeight4: 0, - lotteryWeight5: 0, - lotteryWeight6: 0, - lotteryWeight7: 0, - lotteryWeight8: 0, - lotteryWeight9: 0, - lotteryWeight10: 0, - lotteryWeight11: 0, - lotteryWeight12: 0, - lotteryWeight13: 0, - lotteryWeight14: 0, - lotteryWeight15: 0, - timezoneLimit: 0, - timezoneStartHour: 0, - timezoneStartMinute: 0, - timezoneEndHour: 0, - timezoneEndMinute: 0, - reserve: [0;9], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct WEATHER_LOT_TEX_PARAM_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub srcR: u8, - pub srcG: u8, - pub srcB: u8, - pub pad1: [u8;1], - pub weatherLogId: i32, - pub pad2: [u8;4], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl WEATHER_LOT_TEX_PARAM_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } -} -impl Default for WEATHER_LOT_TEX_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - srcR: 0, - srcG: 0, - srcB: 0, - pad1: [0;1], - weatherLogId: -1, - pad2: [0;4], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct WEATHER_PARAM_ST { - pub SfxId: i32, - pub WindSfxId: i32, - pub GroundHitSfxId: i32, - pub SoundId: i32, - pub WetTime: f32, - pub GparamId: i32, - pub NextLotIngameSecondsMin: i32, - pub NextLotIngameSecondsMax: i32, - pub WetSpEffectId00: i32, - pub WetSpEffectId01: i32, - pub WetSpEffectId02: i32, - pub WetSpEffectId03: i32, - pub WetSpEffectId04: i32, - pub SfxIdInoor: i32, - pub SfxIdOutdoor: i32, - pub aiSightRate: f32, - pub DistViewWeatherGparamOverrideWeight: f32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl WEATHER_PARAM_ST { -} -impl Default for WEATHER_PARAM_ST { - fn default() -> Self { - Self { - SfxId: -1, - WindSfxId: -1, - GroundHitSfxId: -1, - SoundId: -1, - WetTime: -1., - GparamId: 0, - NextLotIngameSecondsMin: 3600, - NextLotIngameSecondsMax: 7200, - WetSpEffectId00: -1, - WetSpEffectId01: -1, - WetSpEffectId02: -1, - WetSpEffectId03: -1, - WetSpEffectId04: -1, - SfxIdInoor: -1, - SfxIdOutdoor: -1, - aiSightRate: 1., - DistViewWeatherGparamOverrideWeight: -1., - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct WEP_ABSORP_POS_PARAM_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub hangPosType: u8, - pub isSkeletonBind: u8, - pub pad0: [u8;2], - pub right_0: i16, - pub left_0: i16, - pub both_0: i16, - pub leftHang_0: i16, - pub rightHang_0: i16, - pub right_1: i16, - pub left_1: i16, - pub both_1: i16, - pub leftHang_1: i16, - pub rightHang_1: i16, - pub right_2: i16, - pub left_2: i16, - pub both_2: i16, - pub leftHang_2: i16, - pub rightHang_2: i16, - pub right_3: i16, - pub left_3: i16, - pub both_3: i16, - pub leftHang_3: i16, - pub rightHang_3: i16, - pub wepInvisibleType_0: u8, - pub wepInvisibleType_1: u8, - pub wepInvisibleType_2: u8, - pub wepInvisibleType_3: u8, - pub leftBoth_0: i16, - pub leftBoth_1: i16, - pub leftBoth_2: i16, - pub leftBoth_3: i16, - pub dispPosType_right_0: u8, - pub dispPosType_left_0: u8, - pub dispPosType_rightBoth_0: u8, - pub dispPosType_leftBoth_0: u8, - pub dispPosType_rightHang_0: u8, - pub dispPosType_leftHang_0: u8, - pub dispPosType_right_1: u8, - pub dispPosType_left_1: u8, - pub dispPosType_rightBoth_1: u8, - pub dispPosType_leftBoth_1: u8, - pub dispPosType_rightHang_1: u8, - pub dispPosType_leftHang_1: u8, - pub dispPosType_right_2: u8, - pub dispPosType_left_2: u8, - pub dispPosType_rightBoth_2: u8, - pub dispPosType_leftBoth_2: u8, - pub dispPosType_rightHang_2: u8, - pub dispPosType_leftHang_2: u8, - pub dispPosType_right_3: u8, - pub dispPosType_left_3: u8, - pub dispPosType_rightBoth_3: u8, - pub dispPosType_leftBoth_3: u8, - pub dispPosType_rightHang_3: u8, - pub dispPosType_leftHang_3: u8, - pub reserve: [u8;12], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl WEP_ABSORP_POS_PARAM_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } -} -impl Default for WEP_ABSORP_POS_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - hangPosType: 0, - isSkeletonBind: 0, - pad0: [0;2], - right_0: 0, - left_0: 0, - both_0: 0, - leftHang_0: 0, - rightHang_0: 0, - right_1: 0, - left_1: 0, - both_1: 0, - leftHang_1: 0, - rightHang_1: 0, - right_2: 0, - left_2: 0, - both_2: 0, - leftHang_2: 0, - rightHang_2: 0, - right_3: 0, - left_3: 0, - both_3: 0, - leftHang_3: 0, - rightHang_3: 0, - wepInvisibleType_0: 0, - wepInvisibleType_1: 0, - wepInvisibleType_2: 0, - wepInvisibleType_3: 0, - leftBoth_0: 0, - leftBoth_1: 0, - leftBoth_2: 0, - leftBoth_3: 0, - dispPosType_right_0: 0, - dispPosType_left_0: 0, - dispPosType_rightBoth_0: 0, - dispPosType_leftBoth_0: 0, - dispPosType_rightHang_0: 0, - dispPosType_leftHang_0: 0, - dispPosType_right_1: 0, - dispPosType_left_1: 0, - dispPosType_rightBoth_1: 0, - dispPosType_leftBoth_1: 0, - dispPosType_rightHang_1: 0, - dispPosType_leftHang_1: 0, - dispPosType_right_2: 0, - dispPosType_left_2: 0, - dispPosType_rightBoth_2: 0, - dispPosType_leftBoth_2: 0, - dispPosType_rightHang_2: 0, - dispPosType_leftHang_2: 0, - dispPosType_right_3: 0, - dispPosType_left_3: 0, - dispPosType_rightBoth_3: 0, - dispPosType_leftBoth_3: 0, - dispPosType_rightHang_3: 0, - dispPosType_leftHang_3: 0, - reserve: [0;12], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct WET_ASPECT_PARAM_ST { - pub baseColorR: u8, - pub baseColorG: u8, - pub baseColorB: u8, - pub reserve_0: [u8;1], - pub baseColorA: f32, - pub metallic: u8, - pub reserve_1: [u8;1], - pub reserve_2: [u8;1], - pub reserve_3: [u8;1], - pub metallicRate: f32, - pub shininessRate: f32, - pub shininess: u8, - pub reserve_4: [u8;11], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl WET_ASPECT_PARAM_ST { -} -impl Default for WET_ASPECT_PARAM_ST { - fn default() -> Self { - Self { - baseColorR: 0, - baseColorG: 0, - baseColorB: 0, - reserve_0: [0;1], - baseColorA: 0., - metallic: 0, - reserve_1: [0;1], - reserve_2: [0;1], - reserve_3: [0;1], - metallicRate: 0., - shininessRate: 0., - shininess: 0, - reserve_4: [0;11], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct WHITE_SIGN_COOL_TIME_PARAM_ST { - pub limitationTime_Normal: f32, - pub limitationTime_NormalDriedFinger: f32, - pub limitationTime_Guardian: f32, - pub limitationTime_GuardianDriedFinger: f32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl WHITE_SIGN_COOL_TIME_PARAM_ST { -} -impl Default for WHITE_SIGN_COOL_TIME_PARAM_ST { - fn default() -> Self { - Self { - limitationTime_Normal: 0., - limitationTime_NormalDriedFinger: 0., - limitationTime_Guardian: 0., - limitationTime_GuardianDriedFinger: 0., - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct WORLD_MAP_LEGACY_CONV_PARAM_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub srcAreaNo: u8, - pub srcGridXNo: u8, - pub srcGridZNo: u8, - pub pad1: [u8;1], - pub srcPosX: f32, - pub srcPosY: f32, - pub srcPosZ: f32, - pub dstAreaNo: u8, - pub dstGridXNo: u8, - pub dstGridZNo: u8, - pub pad2: [u8;1], - pub dstPosX: f32, - pub dstPosY: f32, - pub dstPosZ: f32, - bits_1: u8, - pub pad4: [u8;11], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl WORLD_MAP_LEGACY_CONV_PARAM_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } - pub fn isBasePoint(&self) -> bool { - self.bits_1 & (1 << 0) != 0 - } - pub fn pad3(&self) -> bool { - self.bits_1 & (1 << 1) != 0 - } -} -impl Default for WORLD_MAP_LEGACY_CONV_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - srcAreaNo: 0, - srcGridXNo: 0, - srcGridZNo: 0, - pad1: [0;1], - srcPosX: 0., - srcPosY: 0., - srcPosZ: 0., - dstAreaNo: 0, - dstGridXNo: 0, - dstGridZNo: 0, - pad2: [0;1], - dstPosX: 0., - dstPosY: 0., - dstPosZ: 0., - bits_1: 0, - pad4: [0;11], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct WORLD_MAP_PIECE_PARAM_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub openEventFlagId: i32, - pub openTravelAreaLeft: f32, - pub openTravelAreaRight: f32, - pub openTravelAreaTop: f32, - pub openTravelAreaBottom: f32, - pub acquisitionEventFlagId: i32, - pub acquisitionEventScale: f32, - pub acquisitionEventCenterX: f32, - pub acquisitionEventCenterY: f32, - pub acquisitionEventResScale: f32, - pub acquisitionEventResOffsetX: f32, - pub acquisitionEventResOffsetY: f32, - pub pad: [u8;12], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl WORLD_MAP_PIECE_PARAM_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } -} -impl Default for WORLD_MAP_PIECE_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - openEventFlagId: 0, - openTravelAreaLeft: 0., - openTravelAreaRight: 0., - openTravelAreaTop: 0., - openTravelAreaBottom: 0., - acquisitionEventFlagId: 0, - acquisitionEventScale: 1., - acquisitionEventCenterX: 0., - acquisitionEventCenterY: 0., - acquisitionEventResScale: 1., - acquisitionEventResOffsetX: 0., - acquisitionEventResOffsetY: 0., - pad: [0;12], - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct WORLD_MAP_PLACE_NAME_PARAM_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub worldMapPieceId: i32, - pub textId: i32, - pub pad1: [u8;4], - pub areaNo: u8, - pub gridXNo: u8, - pub gridZNo: u8, - pub pad2: [u8;1], - pub posX: f32, - pub posY: f32, - pub posZ: f32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl WORLD_MAP_PLACE_NAME_PARAM_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } -} -impl Default for WORLD_MAP_PLACE_NAME_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - worldMapPieceId: -1, - textId: -1, - pad1: [0;4], - areaNo: 0, - gridXNo: 0, - gridZNo: 0, - pad2: [0;1], - posX: 0., - posY: 0., - posZ: 0., - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct WORLD_MAP_POINT_PARAM_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub eventFlagId: i32, - pub distViewEventFlagId: i32, - pub iconId: i16, - pub bgmPlaceType: i16, - bits_1: u8, - pub areaNo_forDistViewMark: u8, - pub gridXNo_forDistViewMark: u8, - pub gridZNo_forDistViewMark: u8, - pub clearedEventFlagId: i32, - bits_2: u8, - pub pad2: [u8;1], - pub distViewIconId: i16, - pub angle: f32, - pub areaNo: u8, - pub gridXNo: u8, - pub gridZNo: u8, - pub pad: [u8;1], - pub posX: f32, - pub posY: f32, - pub posZ: f32, - pub textId1: i32, - pub textEnableFlagId1: i32, - pub textDisableFlagId1: i32, - pub textId2: i32, - pub textEnableFlagId2: i32, - pub textDisableFlagId2: i32, - pub textId3: i32, - pub textEnableFlagId3: i32, - pub textDisableFlagId3: i32, - pub textId4: i32, - pub textEnableFlagId4: i32, - pub textDisableFlagId4: i32, - pub textId5: i32, - pub textEnableFlagId5: i32, - pub textDisableFlagId5: i32, - pub textId6: i32, - pub textEnableFlagId6: i32, - pub textDisableFlagId6: i32, - pub textId7: i32, - pub textEnableFlagId7: i32, - pub textDisableFlagId7: i32, - pub textId8: i32, - pub textEnableFlagId8: i32, - pub textDisableFlagId8: i32, - pub textType1: u8, - pub textType2: u8, - pub textType3: u8, - pub textType4: u8, - pub textType5: u8, - pub textType6: u8, - pub textType7: u8, - pub textType8: u8, - pub distViewId: i32, - pub posX_forDistViewMark: f32, - pub posY_forDistViewMark: f32, - pub posZ_forDistViewMark: f32, - pub distViewId1: i32, - pub distViewId2: i32, - pub distViewId3: i32, - pub dispMinZoomStep: u8, - pub selectMinZoomStep: u8, - pub entryFEType: u8, - pub pad4: [u8;9], - pub unkC0: i32, - pub unkC4: i32, - pub unkC8: i32, - pub unkCC: i32, - pub unkD0: i32, - pub unkD4: i32, - pub unkD8: i32, - pub unkDC: i32, - pub unkE0: i32, - pub unkE4: i32, - pub unkE8: i32, - pub unkEC: i32, - pub unkF0: i32, - pub unkF4: i32, - pub unkF8: i32, - pub unkFC: i32, -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl WORLD_MAP_POINT_PARAM_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } - pub fn isAreaIcon(&self) -> bool { - self.bits_1 & (1 << 0) != 0 - } - pub fn isOverrideDistViewMarkPos(&self) -> bool { - self.bits_1 & (1 << 1) != 0 - } - pub fn isEnableNoText(&self) -> bool { - self.bits_1 & (1 << 2) != 0 - } - pub fn pad3(&self) -> bool { - self.bits_1 & (1 << 3) != 0 - } - pub fn dispMask00(&self) -> bool { - self.bits_2 & (1 << 0) != 0 - } - pub fn dispMask01(&self) -> bool { - self.bits_2 & (1 << 1) != 0 - } - pub fn pad2_0(&self) -> bool { - self.bits_2 & (1 << 2) != 0 - } -} -impl Default for WORLD_MAP_POINT_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - eventFlagId: 0, - distViewEventFlagId: 0, - iconId: 0, - bgmPlaceType: 0, - bits_1: 0, - areaNo_forDistViewMark: 0, - gridXNo_forDistViewMark: 0, - gridZNo_forDistViewMark: 0, - clearedEventFlagId: 0, - bits_2: 0, - pad2: [0;1], - distViewIconId: 0, - angle: 0., - areaNo: 0, - gridXNo: 0, - gridZNo: 0, - pad: [0;1], - posX: 0., - posY: 0., - posZ: 0., - textId1: -1, - textEnableFlagId1: 0, - textDisableFlagId1: 0, - textId2: -1, - textEnableFlagId2: 0, - textDisableFlagId2: 0, - textId3: -1, - textEnableFlagId3: 0, - textDisableFlagId3: 0, - textId4: -1, - textEnableFlagId4: 0, - textDisableFlagId4: 0, - textId5: -1, - textEnableFlagId5: 0, - textDisableFlagId5: 0, - textId6: -1, - textEnableFlagId6: 0, - textDisableFlagId6: 0, - textId7: -1, - textEnableFlagId7: 0, - textDisableFlagId7: 0, - textId8: -1, - textEnableFlagId8: 0, - textDisableFlagId8: 0, - textType1: 0, - textType2: 0, - textType3: 0, - textType4: 0, - textType5: 0, - textType6: 0, - textType7: 0, - textType8: 0, - distViewId: -1, - posX_forDistViewMark: 0., - posY_forDistViewMark: 0., - posZ_forDistViewMark: 0., - distViewId1: -1, - distViewId2: -1, - distViewId3: -1, - dispMinZoomStep: 0, - selectMinZoomStep: 0, - entryFEType: 0, - pad4: [0;9], - unkC0: 0, - unkC4: 0, - unkC8: 0, - unkCC: 0, - unkD0: 0, - unkD4: 0, - unkD8: 0, - unkDC: 0, - unkE0: 0, - unkE4: 0, - unkE8: 0, - unkEC: 0, - unkF0: 0, - unkF4: 0, - unkF8: 0, - unkFC: 0, - } - } -} - -#[repr(C, packed)] -#[derive(Clone)] -#[allow(unused,non_snake_case, non_camel_case_types)] -pub struct WWISE_VALUE_TO_STR_CONVERT_PARAM_ST { - bits_0: u8, - pub disableParamReserve2: [u8;3], - pub ParamStr: [u8;32], -} -#[allow(unused,non_snake_case, non_camel_case_types)] -impl WWISE_VALUE_TO_STR_CONVERT_PARAM_ST { - pub fn disableParam_NT(&self) -> bool { - self.bits_0 & (1 << 0) != 0 - } - pub fn disableParamReserve1(&self) -> bool { - self.bits_0 & (1 << 1) != 0 - } -} -impl Default for WWISE_VALUE_TO_STR_CONVERT_PARAM_ST { - fn default() -> Self { - Self { - bits_0: 0, - disableParamReserve2: [0;3], - ParamStr: [0;32], - } - } -} - diff --git a/src/util/params.rs b/src/util/params.rs deleted file mode 100644 index f8d5295..0000000 --- a/src/util/params.rs +++ /dev/null @@ -1,601 +0,0 @@ -pub mod params { - use std::{io::Error, mem, str::FromStr}; - - use binary_reader::{BinaryReader, Endian}; - use crate::util::br_ext::br_ext::BinaryReaderExtensions as br_ext; - - #[allow(non_camel_case_types)] - #[derive(Clone, PartialEq, Hash, Eq)] - pub enum Param { - ActionButtonParam, - AiSoundParam, - AssetEnvironmentGeometryParam, - AssetMaterialSfxParam, - AssetModelSfxParam, - AtkParam_Npc, - AtkParam_Pc, - AttackElementCorrectParam, - AutoCreateEnvSoundParam, - BaseChrSelectMenuParam, - BehaviorParam, - BehaviorParam_PC, - BonfireWarpParam, - BonfireWarpSubCategoryParam, - BonfireWarpTabParam, - BuddyParam, - BuddyStoneParam, - BudgetParam, - Bullet, - BulletCreateLimitParam, - CalcCorrectGraph, - Ceremony, - CharaInitParam, - CharMakeMenuListItemParam, - CharMakeMenuTopParam, - ChrActivateConditionParam, - ChrEquipModelParam, - ChrModelParam, - ClearCountCorrectParam, - CoolTimeParam, - CutsceneGparamTimeParam, - CutsceneGparamWeatherParam, - CutsceneMapIdParam, - CutSceneTextureLoadParam, - CutsceneTimezoneConvertParam, - CutsceneWeatherOverrideGparamConvertParam, - DecalParam, - DirectionCameraParam, - EnemyCommonParam, - EnvObjLotParam, - EquipMtrlSetParam, - EquipParamAccessory, - EquipParamCustomWeapon, - EquipParamGem, - EquipParamGoods, - EquipParamProtector, - EquipParamWeapon, - FaceParam, - FaceRangeParam, - FeTextEffectParam, - FinalDamageRateParam, - FootSfxParam, - GameAreaParam, - GameSystemCommonParam, - GestureParam, - GparamRefSettings, - GraphicsCommonParam, - GraphicsConfig, - GrassLodRangeParam, - GrassTypeParam, - GrassTypeParam_Lv1, - GrassTypeParam_Lv2, - HitEffectSeParam, - HitEffectSfxConceptParam, - HitEffectSfxParam, - HitMtrlParam, - HPEstusFlaskRecoveryParam, - ItemLotParam_enemy, - ItemLotParam_map, - KeyAssignMenuItemParam, - KeyAssignParam_TypeA, - KeyAssignParam_TypeB, - KeyAssignParam_TypeC, - KnockBackParam, - KnowledgeLoadScreenItemParam, - LegacyDistantViewPartsReplaceParam, - LoadBalancerDrawDistScaleParam, - LoadBalancerDrawDistScaleParam_ps4, - LoadBalancerDrawDistScaleParam_ps5, - LoadBalancerDrawDistScaleParam_xb1, - LoadBalancerDrawDistScaleParam_xb1x, - LoadBalancerDrawDistScaleParam_xss, - LoadBalancerDrawDistScaleParam_xsx, - LoadBalancerNewDrawDistScaleParam_ps4, - LoadBalancerNewDrawDistScaleParam_ps5, - LoadBalancerNewDrawDistScaleParam_win64, - LoadBalancerNewDrawDistScaleParam_xb1, - LoadBalancerNewDrawDistScaleParam_xb1x, - LoadBalancerNewDrawDistScaleParam_xss, - LoadBalancerNewDrawDistScaleParam_xsx, - LoadBalancerParam, - LockCamParam, - Magic, - MapDefaultInfoParam, - MapGdRegionDrawParam, - MapGdRegionInfoParam, - MapGridCreateHeightDetailLimitInfo, - MapGridCreateHeightLimitInfoParam, - MapMimicryEstablishmentParam, - MapNameTexParam, - MapNameTexParam_m61, - MapPieceTexParam, - MapPieceTexParam_m61, - MaterialExParam, - MenuColorTableParam, - MenuCommonParam, - MenuOffscrRendParam, - MenuPropertyLayoutParam, - MenuPropertySpecParam, - MenuValueTableParam, - MimicryEstablishmentTexParam, - MimicryEstablishmentTexParam_m61, - MoveParam, - MPEstusFlaskRecoveryParam, - MultiHPEstusFlaskBonusParam, - MultiMPEstusFlaskBonusParam, - MultiPlayCorrectionParam, - MultiSoulBonusRateParam, - NetworkAreaParam, - NetworkMsgParam, - NetworkParam, - NpcAiActionParam, - NpcAiBehaviorProbability, - NpcParam, - NpcThinkParam, - ObjActParam, - PartsDrawParam, - PhantomParam, - PlayerCommonParam, - PlayRegionParam, - PostureControlParam_Gender, - PostureControlParam_Pro, - PostureControlParam_WepLeft, - PostureControlParam_WepRight, - RandomAppearParam, - ReinforceParamProtector, - ReinforceParamWeapon, - ResistCorrectParam, - RideParam, - RoleParam, - RollingObjLotParam, - RuntimeBoneControlParam, - SeActivationRangeParam, - SeMaterialConvertParam, - SfxBlockResShareParam, - ShopLineupParam, - ShopLineupParam_Recipe, - SignPuddleParam, - SignPuddleSubCategoryParam, - SignPuddleTabParam, - SoundAssetSoundObjEnableDistParam, - SoundAutoEnvSoundGroupParam, - SoundAutoReverbEvaluationDistParam, - SoundAutoReverbSelectParam, - SoundChrPhysicsSeParam, - SoundCommonIngameParam, - SoundCutsceneParam, - SpeedtreeParam, - SpEffectParam, - SpEffectSetParam, - SpEffectVfxParam, - SwordArtsParam, - TalkParam, - ThrowDirectionSfxParam, - ThrowParam, - ToughnessParam, - TutorialParam, - WaypointParam, - WeatherAssetCreateParam, - WeatherAssetReplaceParam, - WeatherLotParam, - WeatherLotTexParam, - WeatherLotTexParam_m61, - WeatherParam, - WepAbsorpPosParam, - WetAspectParam, - WhiteSignCoolTimeParam, - WorldMapLegacyConvParam, - WorldMapPieceParam, - WorldMapPlaceNameParam, - WorldMapPointParam, - WwiseValueToStrParam_BgmBossChrIdConv, - WwiseValueToStrParam_EnvPlaceType, - WwiseValueToStrParam_Switch_AttackStrength, - WwiseValueToStrParam_Switch_AttackType, - WwiseValueToStrParam_Switch_DamageAmount, - WwiseValueToStrParam_Switch_DeffensiveMaterial, - WwiseValueToStrParam_Switch_GrassHitType, - WwiseValueToStrParam_Switch_HitStop, - WwiseValueToStrParam_Switch_OffensiveMaterial, - WwiseValueToStrParam_Switch_PlayerEquipmentBottoms, - WwiseValueToStrParam_Switch_PlayerEquipmentTops, - WwiseValueToStrParam_Switch_PlayerShoes, - WwiseValueToStrParam_Switch_PlayerVoiceType, - } - impl FromStr for Param { - type Err = std::io::Error; - fn from_str(s: &str) -> Result { - match s { - "ActionButtonParam"=>Ok(Self::ActionButtonParam) , - "AiSoundParam"=>Ok(Self::AiSoundParam) , - "AssetEnvironmentGeometryParam"=>Ok(Self::AssetEnvironmentGeometryParam) , - "AssetMaterialSfxParam"=>Ok(Self::AssetMaterialSfxParam) , - "AssetModelSfxParam"=>Ok(Self::AssetModelSfxParam) , - "AtkParam_Npc"=>Ok(Self::AtkParam_Npc) , - "AtkParam_Pc"=>Ok(Self::AtkParam_Pc) , - "AttackElementCorrectParam"=>Ok(Self::AttackElementCorrectParam) , - "AutoCreateEnvSoundParam"=>Ok(Self::AutoCreateEnvSoundParam) , - "BaseChrSelectMenuParam"=>Ok(Self::BaseChrSelectMenuParam) , - "BehaviorParam"=>Ok(Self::BehaviorParam) , - "BehaviorParam_PC"=>Ok(Self::BehaviorParam_PC) , - "BonfireWarpParam"=>Ok(Self::BonfireWarpParam) , - "BonfireWarpSubCategoryParam"=>Ok(Self::BonfireWarpSubCategoryParam) , - "BonfireWarpTabParam"=>Ok(Self::BonfireWarpTabParam) , - "BuddyParam"=>Ok(Self::BuddyParam) , - "BuddyStoneParam"=>Ok(Self::BuddyStoneParam) , - "BudgetParam"=>Ok(Self::BudgetParam) , - "Bullet"=>Ok(Self::Bullet) , - "BulletCreateLimitParam"=>Ok(Self::BulletCreateLimitParam) , - "CalcCorrectGraph"=>Ok(Self::CalcCorrectGraph) , - "Ceremony"=>Ok(Self::Ceremony) , - "CharaInitParam"=>Ok(Self::CharaInitParam) , - "CharMakeMenuListItemParam"=>Ok(Self::CharMakeMenuListItemParam) , - "CharMakeMenuTopParam"=>Ok(Self::CharMakeMenuTopParam) , - "ChrActivateConditionParam"=>Ok(Self::ChrActivateConditionParam) , - "ChrEquipModelParam"=>Ok(Self::ChrEquipModelParam) , - "ChrModelParam"=>Ok(Self::ChrModelParam) , - "ClearCountCorrectParam"=>Ok(Self::ClearCountCorrectParam) , - "CoolTimeParam"=>Ok(Self::CoolTimeParam) , - "CutsceneGparamTimeParam"=>Ok(Self::CutsceneGparamTimeParam) , - "CutsceneGparamWeatherParam"=>Ok(Self::CutsceneGparamWeatherParam) , - "CutsceneMapIdParam"=>Ok(Self::CutsceneMapIdParam) , - "CutSceneTextureLoadParam"=>Ok(Self::CutSceneTextureLoadParam) , - "CutsceneTimezoneConvertParam"=>Ok(Self::CutsceneTimezoneConvertParam) , - "CutsceneWeatherOverrideGparamConvertParam"=>Ok(Self::CutsceneWeatherOverrideGparamConvertParam) , - "DecalParam"=>Ok(Self::DecalParam) , - "DirectionCameraParam"=>Ok(Self::DirectionCameraParam) , - "EnemyCommonParam"=>Ok(Self::EnemyCommonParam) , - "EnvObjLotParam"=>Ok(Self::EnvObjLotParam) , - "EquipMtrlSetParam"=>Ok(Self::EquipMtrlSetParam) , - "EquipParamAccessory"=>Ok(Self::EquipParamAccessory) , - "EquipParamCustomWeapon"=>Ok(Self::EquipParamCustomWeapon) , - "EquipParamGem"=>Ok(Self::EquipParamGem) , - "EquipParamGoods"=>Ok(Self::EquipParamGoods) , - "EquipParamProtector"=>Ok(Self::EquipParamProtector) , - "EquipParamWeapon"=>Ok(Self::EquipParamWeapon) , - "FaceParam"=>Ok(Self::FaceParam) , - "FaceRangeParam"=>Ok(Self::FaceRangeParam) , - "FeTextEffectParam"=>Ok(Self::FeTextEffectParam) , - "FinalDamageRateParam"=>Ok(Self::FinalDamageRateParam) , - "FootSfxParam"=>Ok(Self::FootSfxParam) , - "GameAreaParam"=>Ok(Self::GameAreaParam) , - "GameSystemCommonParam"=>Ok(Self::GameSystemCommonParam) , - "GestureParam"=>Ok(Self::GestureParam) , - "GparamRefSettings"=>Ok(Self::GparamRefSettings) , - "GraphicsCommonParam"=>Ok(Self::GraphicsCommonParam) , - "GraphicsConfig"=>Ok(Self::GraphicsConfig) , - "GrassLodRangeParam"=>Ok(Self::GrassLodRangeParam) , - "GrassTypeParam"=>Ok(Self::GrassTypeParam) , - "GrassTypeParam_Lv1"=>Ok(Self::GrassTypeParam_Lv1) , - "GrassTypeParam_Lv2"=>Ok(Self::GrassTypeParam_Lv2) , - "HitEffectSeParam"=>Ok(Self::HitEffectSeParam) , - "HitEffectSfxConceptParam"=>Ok(Self::HitEffectSfxConceptParam) , - "HitEffectSfxParam"=>Ok(Self::HitEffectSfxParam) , - "HitMtrlParam"=>Ok(Self::HitMtrlParam) , - "HPEstusFlaskRecoveryParam"=>Ok(Self::HPEstusFlaskRecoveryParam) , - "ItemLotParam_enemy"=>Ok(Self::ItemLotParam_enemy) , - "ItemLotParam_map"=>Ok(Self::ItemLotParam_map) , - "KeyAssignMenuItemParam"=>Ok(Self::KeyAssignMenuItemParam) , - "KeyAssignParam_TypeA"=>Ok(Self::KeyAssignParam_TypeA) , - "KeyAssignParam_TypeB"=>Ok(Self::KeyAssignParam_TypeB) , - "KeyAssignParam_TypeC"=>Ok(Self::KeyAssignParam_TypeC) , - "KnockBackParam"=>Ok(Self::KnockBackParam) , - "KnowledgeLoadScreenItemParam"=>Ok(Self::KnowledgeLoadScreenItemParam) , - "LegacyDistantViewPartsReplaceParam"=>Ok(Self::LegacyDistantViewPartsReplaceParam) , - "LoadBalancerDrawDistScaleParam"=>Ok(Self::LoadBalancerDrawDistScaleParam) , - "LoadBalancerDrawDistScaleParam_ps4"=>Ok(Self::LoadBalancerDrawDistScaleParam_ps4) , - "LoadBalancerDrawDistScaleParam_ps5"=>Ok(Self::LoadBalancerDrawDistScaleParam_ps5) , - "LoadBalancerDrawDistScaleParam_xb1"=>Ok(Self::LoadBalancerDrawDistScaleParam_xb1) , - "LoadBalancerDrawDistScaleParam_xb1x"=>Ok(Self::LoadBalancerDrawDistScaleParam_xb1x) , - "LoadBalancerDrawDistScaleParam_xss"=>Ok(Self::LoadBalancerDrawDistScaleParam_xss) , - "LoadBalancerDrawDistScaleParam_xsx"=>Ok(Self::LoadBalancerDrawDistScaleParam_xsx) , - "LoadBalancerNewDrawDistScaleParam_ps4"=>Ok(Self::LoadBalancerNewDrawDistScaleParam_ps4) , - "LoadBalancerNewDrawDistScaleParam_ps5"=>Ok(Self::LoadBalancerNewDrawDistScaleParam_ps5) , - "LoadBalancerNewDrawDistScaleParam_win64"=>Ok(Self::LoadBalancerNewDrawDistScaleParam_win64) , - "LoadBalancerNewDrawDistScaleParam_xb1"=>Ok(Self::LoadBalancerNewDrawDistScaleParam_xb1) , - "LoadBalancerNewDrawDistScaleParam_xb1x"=>Ok(Self::LoadBalancerNewDrawDistScaleParam_xb1x) , - "LoadBalancerNewDrawDistScaleParam_xss"=>Ok(Self::LoadBalancerNewDrawDistScaleParam_xss) , - "LoadBalancerNewDrawDistScaleParam_xsx"=>Ok(Self::LoadBalancerNewDrawDistScaleParam_xsx) , - "LoadBalancerParam"=>Ok(Self::LoadBalancerParam) , - "LockCamParam"=>Ok(Self::LockCamParam) , - "Magic"=>Ok(Self::Magic) , - "MapDefaultInfoParam"=>Ok(Self::MapDefaultInfoParam) , - "MapGdRegionDrawParam"=>Ok(Self::MapGdRegionDrawParam) , - "MapGdRegionInfoParam"=>Ok(Self::MapGdRegionInfoParam) , - "MapGridCreateHeightDetailLimitInfo"=>Ok(Self::MapGridCreateHeightDetailLimitInfo) , - "MapGridCreateHeightLimitInfoParam"=>Ok(Self::MapGridCreateHeightLimitInfoParam) , - "MapMimicryEstablishmentParam"=>Ok(Self::MapMimicryEstablishmentParam) , - "MapNameTexParam"=>Ok(Self::MapNameTexParam) , - "MapNameTexParam_m61"=>Ok(Self::MapNameTexParam_m61) , - "MapPieceTexParam"=>Ok(Self::MapPieceTexParam) , - "MapPieceTexParam_m61"=>Ok(Self::MapPieceTexParam_m61) , - "MaterialExParam"=>Ok(Self::MaterialExParam) , - "MenuColorTableParam"=>Ok(Self::MenuColorTableParam) , - "MenuCommonParam"=>Ok(Self::MenuCommonParam) , - "MenuOffscrRendParam"=>Ok(Self::MenuOffscrRendParam) , - "MenuPropertyLayoutParam"=>Ok(Self::MenuPropertyLayoutParam) , - "MenuPropertySpecParam"=>Ok(Self::MenuPropertySpecParam) , - "MenuValueTableParam"=>Ok(Self::MenuValueTableParam) , - "MimicryEstablishmentTexParam"=>Ok(Self::MimicryEstablishmentTexParam) , - "MimicryEstablishmentTexParam_m61"=>Ok(Self::MimicryEstablishmentTexParam_m61) , - "MoveParam"=>Ok(Self::MoveParam) , - "MPEstusFlaskRecoveryParam"=>Ok(Self::MPEstusFlaskRecoveryParam) , - "MultiHPEstusFlaskBonusParam"=>Ok(Self::MultiHPEstusFlaskBonusParam) , - "MultiMPEstusFlaskBonusParam"=>Ok(Self::MultiMPEstusFlaskBonusParam) , - "MultiPlayCorrectionParam"=>Ok(Self::MultiPlayCorrectionParam) , - "MultiSoulBonusRateParam"=>Ok(Self::MultiSoulBonusRateParam) , - "NetworkAreaParam"=>Ok(Self::NetworkAreaParam) , - "NetworkMsgParam"=>Ok(Self::NetworkMsgParam) , - "NetworkParam"=>Ok(Self::NetworkParam) , - "NpcAiActionParam"=>Ok(Self::NpcAiActionParam) , - "NpcAiBehaviorProbability"=>Ok(Self::NpcAiBehaviorProbability) , - "NpcParam"=>Ok(Self::NpcParam) , - "NpcThinkParam"=>Ok(Self::NpcThinkParam) , - "ObjActParam"=>Ok(Self::ObjActParam) , - "PartsDrawParam"=>Ok(Self::PartsDrawParam) , - "PhantomParam"=>Ok(Self::PhantomParam) , - "PlayerCommonParam"=>Ok(Self::PlayerCommonParam) , - "PlayRegionParam"=>Ok(Self::PlayRegionParam) , - "PostureControlParam_Gender"=>Ok(Self::PostureControlParam_Gender) , - "PostureControlParam_Pro"=>Ok(Self::PostureControlParam_Pro) , - "PostureControlParam_WepLeft"=>Ok(Self::PostureControlParam_WepLeft) , - "PostureControlParam_WepRight"=>Ok(Self::PostureControlParam_WepRight) , - "RandomAppearParam"=>Ok(Self::RandomAppearParam) , - "ReinforceParamProtector"=>Ok(Self::ReinforceParamProtector) , - "ReinforceParamWeapon"=>Ok(Self::ReinforceParamWeapon) , - "ResistCorrectParam"=>Ok(Self::ResistCorrectParam) , - "RideParam"=>Ok(Self::RideParam) , - "RoleParam"=>Ok(Self::RoleParam) , - "RollingObjLotParam"=>Ok(Self::RollingObjLotParam) , - "RuntimeBoneControlParam"=>Ok(Self::RuntimeBoneControlParam) , - "SeActivationRangeParam"=>Ok(Self::SeActivationRangeParam) , - "SeMaterialConvertParam"=>Ok(Self::SeMaterialConvertParam) , - "SfxBlockResShareParam"=>Ok(Self::SfxBlockResShareParam) , - "ShopLineupParam"=>Ok(Self::ShopLineupParam) , - "ShopLineupParam_Recipe"=>Ok(Self::ShopLineupParam_Recipe) , - "SignPuddleParam"=>Ok(Self::SignPuddleParam) , - "SignPuddleSubCategoryParam"=>Ok(Self::SignPuddleSubCategoryParam) , - "SignPuddleTabParam"=>Ok(Self::SignPuddleTabParam) , - "SoundAssetSoundObjEnableDistParam"=>Ok(Self::SoundAssetSoundObjEnableDistParam) , - "SoundAutoEnvSoundGroupParam"=>Ok(Self::SoundAutoEnvSoundGroupParam) , - "SoundAutoReverbEvaluationDistParam"=>Ok(Self::SoundAutoReverbEvaluationDistParam) , - "SoundAutoReverbSelectParam"=>Ok(Self::SoundAutoReverbSelectParam) , - "SoundChrPhysicsSeParam"=>Ok(Self::SoundChrPhysicsSeParam) , - "SoundCommonIngameParam"=>Ok(Self::SoundCommonIngameParam) , - "SoundCutsceneParam"=>Ok(Self::SoundCutsceneParam) , - "SpeedtreeParam"=>Ok(Self::SpeedtreeParam) , - "SpEffectParam"=>Ok(Self::SpEffectParam) , - "SpEffectSetParam"=>Ok(Self::SpEffectSetParam) , - "SpEffectVfxParam"=>Ok(Self::SpEffectVfxParam) , - "SwordArtsParam"=>Ok(Self::SwordArtsParam) , - "TalkParam"=>Ok(Self::TalkParam) , - "ThrowDirectionSfxParam"=>Ok(Self::ThrowDirectionSfxParam) , - "ThrowParam"=>Ok(Self::ThrowParam) , - "ToughnessParam"=>Ok(Self::ToughnessParam) , - "TutorialParam"=>Ok(Self::TutorialParam) , - "WaypointParam"=>Ok(Self::WaypointParam) , - "WeatherAssetCreateParam"=>Ok(Self::WeatherAssetCreateParam) , - "WeatherAssetReplaceParam"=>Ok(Self::WeatherAssetReplaceParam) , - "WeatherLotParam"=>Ok(Self::WeatherLotParam) , - "WeatherLotTexParam"=>Ok(Self::WeatherLotTexParam) , - "WeatherLotTexParam_m61"=>Ok(Self::WeatherLotTexParam_m61) , - "WeatherParam"=>Ok(Self::WeatherParam) , - "WepAbsorpPosParam"=>Ok(Self::WepAbsorpPosParam) , - "WetAspectParam"=>Ok(Self::WetAspectParam) , - "WhiteSignCoolTimeParam"=>Ok(Self::WhiteSignCoolTimeParam) , - "WorldMapLegacyConvParam"=>Ok(Self::WorldMapLegacyConvParam) , - "WorldMapPieceParam"=>Ok(Self::WorldMapPieceParam) , - "WorldMapPlaceNameParam"=>Ok(Self::WorldMapPlaceNameParam) , - "WorldMapPointParam"=>Ok(Self::WorldMapPointParam) , - "WwiseValueToStrParam_BgmBossChrIdConv"=>Ok(Self::WwiseValueToStrParam_BgmBossChrIdConv) , - "WwiseValueToStrParam_EnvPlaceType"=>Ok(Self::WwiseValueToStrParam_EnvPlaceType) , - "WwiseValueToStrParam_Switch_AttackStrength"=>Ok(Self::WwiseValueToStrParam_Switch_AttackStrength) , - "WwiseValueToStrParam_Switch_AttackType"=>Ok(Self::WwiseValueToStrParam_Switch_AttackType) , - "WwiseValueToStrParam_Switch_DamageAmount"=>Ok(Self::WwiseValueToStrParam_Switch_DamageAmount) , - "WwiseValueToStrParam_Switch_DeffensiveMaterial"=>Ok(Self::WwiseValueToStrParam_Switch_DeffensiveMaterial) , - "WwiseValueToStrParam_Switch_GrassHitType"=>Ok(Self::WwiseValueToStrParam_Switch_GrassHitType) , - "WwiseValueToStrParam_Switch_HitStop"=>Ok(Self::WwiseValueToStrParam_Switch_HitStop) , - "WwiseValueToStrParam_Switch_OffensiveMaterial"=>Ok(Self::WwiseValueToStrParam_Switch_OffensiveMaterial) , - "WwiseValueToStrParam_Switch_PlayerEquipmentBottoms"=>Ok(Self::WwiseValueToStrParam_Switch_PlayerEquipmentBottoms) , - "WwiseValueToStrParam_Switch_PlayerEquipmentTops"=>Ok(Self::WwiseValueToStrParam_Switch_PlayerEquipmentTops) , - "WwiseValueToStrParam_Switch_PlayerShoes"=>Ok(Self::WwiseValueToStrParam_Switch_PlayerShoes) , - "WwiseValueToStrParam_Switch_PlayerVoiceType"=>Ok(Self::WwiseValueToStrParam_Switch_PlayerVoiceType) , - _ => Err(std::io::Error::new(std::io::ErrorKind::InvalidData ,format!("Cannot recognize paramtype: {}", s))) - } - } - } - - // region: Row - #[derive(Default, Clone)] - pub struct Row where T: Default + Clone{ - pub id: u32, - pub name: String, - pub data: T, - pub data_offset: i64, - } - impl Row where T: Default + Clone{ - pub fn read(br: &mut BinaryReader, param: &PARAM , actual_string_offset:&mut i64) -> Result, Error> { - let mut row: Row = Row::default(); - let name_offset: i64; - if (param.format2d & FormatFlags1::LongDataOffset).as_u8() != 0 { - row.id = br.read_u32()?; - br.read_i32()?; - row.data_offset = br.read_i64()?; - name_offset = br.read_i64()?; - } - else { - row.id = br.read_u32()?; - row.data_offset = br.read_i32()? as i64; - name_offset = br.read_i32()? as i64; - } - - if name_offset != 0 { - if *actual_string_offset == 0 || name_offset < *actual_string_offset { - *actual_string_offset = name_offset; - } - - if (param.format2e & FormatFlags2::UnicodeRowNames).as_u8() != 0 { - - row.name = br_ext::get_utf_16(br, name_offset as usize)?; - } - else { - row.name = br_ext::get_shift_jis(br, name_offset as usize)?; - } - } - - let prev_pos = br.pos; - br.jmp(row.data_offset as usize); - let size = mem::size_of::(); - let bytes = br.read_bytes(size)?; - let (head, body, _tail) = unsafe { bytes.align_to::() }; - assert!(head.is_empty(), "Data was not aligned"); - row.data = body[0].clone(); - br.jmp(prev_pos); - - Ok(row) - } - } - // endregion - - // region: PARAM - bitflags::bitflags! { - #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] - pub struct FormatFlags1: u8{ - const None = 0; - const Flag01 = 0b0000_0001; - const IntDataOffset = 0b0000_0010; - const LongDataOffset = 0b0000_0100; - const Flag08 = 0b0000_1000; - const Flag10 = 0b0001_0000; - const Flag20 = 0b0010_0000; - const Flag40 = 0b0100_0000; - const OffsetParamType = 0b1000_0000; - } - } - #[allow(unused)] - impl FormatFlags1 { - pub fn as_u8(&self) -> u8 { - self.bits() - } - } - - bitflags::bitflags! { - #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] - pub struct FormatFlags2: u8{ - const None = 0; - const UnicodeRowNames = 0b0000_0001; - const Flag02 = 0b0000_0010; - const Flag04 = 0b0000_0100; - const Flag08 = 0b0000_1000; - const Flag10 = 0b0001_0000; - const Flag20 = 0b0010_0000; - const Flag40 = 0b0100_0000; - const Flag80 = 0b1000_0000; - } - } - #[allow(unused)] - impl FormatFlags2 { - pub fn as_u8(&self) -> u8 { - self.bits() - } - } - - #[derive(Clone)] - pub struct PARAM where T: Default + Clone{ - pub big_endian: bool, - pub format2d: FormatFlags1, - pub format2e: FormatFlags2, - pub paramdef_format_version: u8, - pub unk06: i16, - pub paramdef_data_version: i16, - pub param_type: String, - pub detected_size: i64, - pub rows: Vec>, - } - impl Default for PARAM where T: Default + Clone{ - fn default() -> Self { - Self { - big_endian: false, - format2d: FormatFlags1::None, - format2e: FormatFlags2::None, - paramdef_format_version: 0, - unk06: 0, - paramdef_data_version: 0, - param_type: String::new(), - detected_size: 0, - rows: Vec::new(), - } - } - } - impl PARAM where T: Default + Clone { - pub fn from_bytes(bytes: &[u8]) -> Result{ - let mut br = BinaryReader::from_u8(bytes); - Self::read(&mut br) - } - - pub fn read(br: &mut BinaryReader) -> Result { - let mut param = PARAM::default(); - - br.jmp(0x2c); - let big_endian = br.read_u8()?; - assert!(big_endian == 0 || big_endian == 0xFF); - param.big_endian = big_endian == 0xFF; - br.set_endian(if param.big_endian {Endian::Big} else {Endian::Little}); - param.format2d = FormatFlags1::from_bits_truncate(br.read_u8()?); - param.format2e = FormatFlags2::from_bits_truncate(br.read_u8()?); - param.paramdef_format_version = br.read_u8()?; - br.jmp(0); - - let mut actual_string_offset = 0; - let string_offset = br.read_u32()?; - if ((param.format2d & FormatFlags1::Flag01).as_u8() != 0) && ((param.format2d & FormatFlags1::IntDataOffset).as_u8() != 0) || ((param.format2d & FormatFlags1::LongDataOffset).as_u8() != 0) { - assert_eq!(br.read_i16()?, 0); - } - else { - br.read_i16()?; - } - param.unk06 = br.read_i16()?; - param.paramdef_data_version = br.read_i16()?; - - let row_count = br.read_i16()?; - if (param.format2d & FormatFlags1::OffsetParamType).as_u8() != 0 { - assert_eq!(br.read_i32()?, 0); - let param_type_offset = br.read_i64()?; - assert_eq!(br.read_bytes(0x14)?, [0x0; 0x14]); - param.param_type = br_ext::get_ascii(br, param_type_offset as usize)?; - actual_string_offset = param_type_offset; - } - else { - param.param_type = br_ext::read_fix_str(br, 0x20)?; - } - br.jmp(br.pos + 4); - - if (param.format2d & FormatFlags1::Flag01).as_u8() != 0 && (param.format2d & FormatFlags1::IntDataOffset).as_u8() != 0 { - br.read_i32()?; - assert_eq!(br.read_i32()?, 0); - assert_eq!(br.read_i32()?, 0); - assert_eq!(br.read_i32()?, 0); - } - else if (param.format2d & FormatFlags1::LongDataOffset).as_u8() != 0 { - br.read_i64()?; - assert_eq!(br.read_i64()?, 0); - } - - for _i in 0..row_count { - param.rows.push(Row::read(br, ¶m, &mut actual_string_offset)?); - } - - if param.rows.len() > 1 { - param.detected_size = param.rows[1].data_offset - param.rows[0].data_offset; - } - else if param.rows.len() == 1 { - param.detected_size = (if actual_string_offset == 0 {string_offset as i64} else {actual_string_offset}) - param.rows[0].data_offset; - } - else { - param.detected_size = -1; - } - Ok(param) - } - } - // endregion -} \ No newline at end of file diff --git a/src/util/regulation.rs b/src/util/regulation.rs deleted file mode 100644 index 4375c72..0000000 --- a/src/util/regulation.rs +++ /dev/null @@ -1,163 +0,0 @@ -use std::{collections::HashMap, io::Error, str::FromStr, sync::{Mutex, RwLock}}; - -use aes::cipher::{block_padding::NoPadding, BlockDecryptMut, KeyIvInit}; -use binary_reader::{BinaryReader, Endian}; -use once_cell::sync::{Lazy, OnceCell}; - -use crate::{db::{accessory_name::accessory_name::ACCESSORY_NAME, aow_name::aow_name::AOW_NAME, armor_name::armor_name::ARMOR_NAME, item_name::item_name::ITEM_NAME, weapon_name::weapon_name::WEAPON_NAME}, save::save::save::Save, util::{param_structs::{EQUIP_PARAM_ACCESSORY_ST, EQUIP_PARAM_GEM_ST, EQUIP_PARAM_GOODS_ST, EQUIP_PARAM_PROTECTOR_ST, EQUIP_PARAM_WEAPON_ST}, params::params::{Row, PARAM}}}; - -use super::{bnd4::bnd4::BND4, params::params::Param}; - -pub static PARAMS: Lazy>>> = Lazy::new(|| RwLock::new(Default::default())); - -pub struct Regulation; - -impl Regulation { - pub fn init_params(save: &Save) { - let res = Regulation::params_from_regulation(save.save_type.get_regulation()); - - - match res { - Ok(res) => *PARAMS.write().unwrap() = res, - Err(err) => println!("{err}"), - } - - - } - - pub fn equip_accessory_param_map() -> &'static HashMap> { - static ACCESSORY_PARAM_MAP: OnceCell>> = OnceCell::new(); - ACCESSORY_PARAM_MAP.get_or_init(|| { - let mut map = Self::get_param_map::(&Param::EquipParamAccessory); - Self::try_fill_names::(&mut map, &ACCESSORY_NAME); - map - }) - } - - pub fn equip_gem_param_map() -> &'static HashMap> { - static GEM_PARAM_MAP: OnceCell>> = OnceCell::new(); - GEM_PARAM_MAP.get_or_init(|| { - let mut map = Self::get_param_map::(&Param::EquipParamGem); - Self::try_fill_names::(&mut map, &AOW_NAME); - map - }) - } - - pub fn equip_goods_param_map() -> &'static HashMap> { - static GOOD_PARAM_MAP: OnceCell>> = OnceCell::new(); - GOOD_PARAM_MAP.get_or_init(|| { - let mut map = Self::get_param_map::(&Param::EquipParamGoods); - Self::try_fill_names::(&mut map, &ITEM_NAME); - map - }) - } - - pub fn equip_protectors_param_map() -> &'static HashMap> { - static PROTECTOR_PARAM_MAP: OnceCell>> = OnceCell::new(); - PROTECTOR_PARAM_MAP.get_or_init(|| { - let mut map = Self::get_param_map::(&Param::EquipParamProtector); - Self::try_fill_names::(&mut map, &ARMOR_NAME); - map - }) - } - - pub fn equip_weapon_params_map() -> &'static HashMap> { - static WEAPON_PARAM_MAP: OnceCell>> = OnceCell::new(); - WEAPON_PARAM_MAP.get_or_init(|| { - let mut map = Self::get_param_map::(&Param::EquipParamWeapon); - Self::try_fill_names::(&mut map, &WEAPON_NAME); - map - }) - } - - fn get_param_map(param: &Param) -> HashMap> where T: Default + Clone { - PARAM::::from_bytes(&PARAMS.read().unwrap()[param]) - .unwrap() - .rows.into_iter() - .map(|row| (row.id, row)) - .collect::>>() - } - - fn try_fill_names(rows: &mut HashMap>, map: &Lazy>>) where T: Default + Clone { - rows.iter_mut().for_each(|(_, entry)| { - entry.name = match map.lock().unwrap().get(&(entry.id)) { - Some(name) => if !name.is_empty() {name.to_string()} else {format!("[UNKOWN_{}]", entry.id)}, - None => format!("[UNKOWN_{}]", entry.id), - }; - }); - } - - pub fn params_from_regulation(bytes: &[u8]) -> Result>, Error>{ - let decrypted = Self::decrypt(&bytes)?; - let decompressed = Self::decompress(&decrypted)?; - let res = Self::unpack(&decompressed)?; - let mut params: HashMap> = HashMap::new(); - - for file in &res.files { - let file_name = &file.name.split("\\").last().expect("Could not locate file name").split(".").nth(0).expect("Could not locate file name without extension"); - let param_type = Param::from_str(file_name)?; - params.insert(param_type, file.bytes.to_vec()); - } - Ok(params) - } - - // Decrypt the regulation file (AES) - fn decrypt(cipher_text: &[u8]) -> Result, Error> { - type Aes256CbcDec = cbc::Decryptor; - let key = [0x99, 0xBF, 0xFC, 0x36, 0x6A, 0x6B, 0xC8, 0xC6, 0xF5, 0x82, 0x7D, 0x09, 0x36, 0x02, 0xD6, 0x76, 0xC4, 0x28, 0x92, 0xA0, 0x1C, 0x20, 0x7F, 0xB0, 0x24, 0xD3, 0xAF, 0x4E, 0x49, 0x3F, 0xEF, 0x99]; - let iv = &cipher_text[0..16]; - let mut buf = cipher_text[16..cipher_text.len()].to_vec(); - let pt: &[u8] = Aes256CbcDec::new(&key.into(), iv.into()) - .decrypt_padded_mut::(&mut buf) - .unwrap(); - Ok(pt.to_vec()) - } - - // Decompress the decrypted regulation file (compression_type: DCX_DFLT_11000_44_9_15) - fn decompress(bytes: &[u8]) -> Result, Error> { - let mut br = BinaryReader::from_u8(bytes); - br.endian = Endian::Big; - - assert_eq!(br.read_bytes(4)?, b"DCX\0"); - assert_eq!(br.read_i32()?,0x11000); - assert_eq!(br.read_i32()?, 0x18); - assert_eq!(br.read_i32()?, 0x24); - assert_eq!(br.read_i32()?, 0x44); - assert_eq!(br.read_i32()?, 0x4c); - - assert_eq!(br.read_bytes(4)?, b"DCS\0"); - let _decompressed_size = br.read_i32()?; - let compressed_size = br.read_i32()?; - - assert_eq!(br.read_bytes(4)?, b"DCP\0"); - assert_eq!(br.read_bytes(4)?, b"ZSTD"); - assert_eq!(br.read_i32()?, 0x20); - assert_eq!(br.read_u8()?, 0x15); - assert_eq!(br.read_u8()?, 0); - assert_eq!(br.read_u8()?, 0); - assert_eq!(br.read_u8()?, 0); - assert_eq!(br.read_i32()?, 0); - assert_eq!(br.read_u8()?, 0); - assert_eq!(br.read_u8()?, 0); - assert_eq!(br.read_u8()?, 0); - assert_eq!(br.read_u8()?, 0); - assert_eq!(br.read_i32()?, 0); - assert_eq!(br.read_i32()?, 0x00010100); - - assert_eq!(br.read_bytes(4)?, b"DCA\0"); - assert_eq!(br.read_i32()?, 8); - - let compressed = br.read_bytes(compressed_size as usize)?; - let res = zstd::decode_all(compressed); - - match res { - Ok(decompressed) => Ok(decompressed), - Err(msg) => { Err(std::io::Error::new(std::io::ErrorKind::Other, format!("{msg}"))) }, - } - } - - // Unpack the decrypted and decompressed regulation file (BND4) - fn unpack(bytes: &[u8]) -> Result{ - BND4::from_bytes(bytes) - } -} \ No newline at end of file diff --git a/src/util/validator.rs b/src/util/validator.rs deleted file mode 100644 index 03c6bd2..0000000 --- a/src/util/validator.rs +++ /dev/null @@ -1,239 +0,0 @@ -pub mod validator { - use std::collections::{HashMap, HashSet}; - use crate::{save::{common::save_slot::{EquipInventoryItem, GaItem}, save::save::Save}, util::{param_structs::EQUIP_PARAM_GEM_ST, params::params::Row, regulation::Regulation}, vm::{inventory::{InventoryGaitemType, InventoryItemType}, regulation::regulation_view_model::{GoodsType, ProtectorCategory, WepType}}}; - - pub struct Validator; - - impl Validator { - pub fn validate(save: &Save) -> bool { - // Get active characters - for (index, active) in save.save_type.active_slots().iter().enumerate() { - if *active { - if !Self::is_weapons_valid(save, index) {println!("is_weapons_valid"); return false; } - if !Self::is_items_valid(save, index) {println!("is_items_valid"); return false; } - if !Self::is_armor_valid(save, index) {println!("is_armor_valid"); return false; } - if !Self::is_physics_valid(save, index) {println!("is_physics_valid"); return false; } - if !Self::is_equipped_items_valid(save, index) {println!("is_equipped_items_valid"); return false; } - } - } - true - } - - fn is_weapons_valid(save: &Save, index: usize) -> bool { - let slot = save.save_type.get_slot(index); - let weapons = Regulation::equip_weapon_params_map(); - let gems = Regulation::equip_gem_param_map(); - - // Map weapons - let ga_item_weapons = &slot.ga_items.iter() - .filter(|gaitem| gaitem.gaitem_handle.to_le_bytes()[3] == 0) - .map(|g| g) - .collect::>(); - - // Map gems - let ga_item_gems = &slot.ga_items.iter() - .filter(|gaitem| gaitem.gaitem_handle.to_le_bytes()[3] == 0xC0) - .map(|g| (g.gaitem_handle, g)) - .collect::>(); - - for weapon_ga_item in ga_item_weapons { - let res_weapon = weapons.get(&weapon_ga_item.item_id); - - if res_weapon.is_none() && weapon_ga_item.item_id != 0xFFFFFFFF { - return false; - } - - // Get currently infused Ash Of War - let current_weapon_gem = weapon_ga_item.aow_gaitem_handle; - - // Skip rest of validation if there's no ash of war infused - if current_weapon_gem == u32::MAX || current_weapon_gem == 0 { - continue; - } - - // Look up the gem_param - let gem_ga_item = ga_item_gems[¤t_weapon_gem]; - let res_gem = gems.get(&gem_ga_item.item_id); - - // Check if gem_param exists, fail if it doesn't - if res_gem.is_none() { - return false; - } - - // Unwrap weapon and gem params - let weapon_param = res_weapon.unwrap(); - let gem_param = res_gem.unwrap(); - - // Ash of war on an item that doesn't support it. - if weapon_param.data.gemMountType == 0 { - return false; - } - - // Ash of war not valid - if !Self::validate_attached_gem(WepType::from(weapon_param.data.wepType), gem_param) { - return false - } - } - - true - } - - fn is_items_valid(save: &Save, index: usize) -> bool { - let inventory_common_items = &save.save_type.get_slot(index).equip_inventory_data.common_items; - let storage_common_items = &save.save_type.get_slot(index).storage_inventory_data.common_items; - Self::check_for_duplicate_items(inventory_common_items) && Self::check_for_duplicate_items(storage_common_items) - } - - fn is_armor_valid(save: &Save, index: usize) -> bool{ - let head_protector_id = save.save_type.get_slot(index).chr_asm.head; - let body_protector_id = save.save_type.get_slot(index).chr_asm.chest; - let arms_protector_id = save.save_type.get_slot(index).chr_asm.arms; - let legs_protector_id = save.save_type.get_slot(index).chr_asm.legs; - - if !Self::validate_armor_piece(head_protector_id, ProtectorCategory::Head) {return false;} - if !Self::validate_armor_piece(body_protector_id, ProtectorCategory::Body) {return false;} - if !Self::validate_armor_piece(arms_protector_id, ProtectorCategory::Arms) {return false;} - if !Self::validate_armor_piece(legs_protector_id, ProtectorCategory::Legs) {return false;} - - let head_protector_id = save.save_type.get_slot(index).equipped_items.head ^ InventoryItemType::ARMOR as u32; - let body_protector_id = save.save_type.get_slot(index).equipped_items.chest ^ InventoryItemType::ARMOR as u32; - let arms_protector_id = save.save_type.get_slot(index).equipped_items.arms ^ InventoryItemType::ARMOR as u32; - let legs_protector_id = save.save_type.get_slot(index).equipped_items.legs ^ InventoryItemType::ARMOR as u32; - - if !Self::validate_armor_piece(head_protector_id, ProtectorCategory::Head) {return false;} - if !Self::validate_armor_piece(body_protector_id, ProtectorCategory::Body) {return false;} - if !Self::validate_armor_piece(arms_protector_id, ProtectorCategory::Arms) {return false;} - if !Self::validate_armor_piece(legs_protector_id, ProtectorCategory::Legs) {return false;} - - true - } - - fn is_physics_valid(save: &Save, index: usize) -> bool { - let physics_slot1 = save.save_type.get_slot(index).equip_physics_data.slot1; - let physics_slot2 = save.save_type.get_slot(index).equip_physics_data.slot2; - - // Check if same tear is in the both slots - if physics_slot1 != u32::MAX && physics_slot2 != u32::MAX && physics_slot1 == physics_slot2 { return false; } - - // Check if physic slot 1 is of type wondrous physics - if physics_slot1 != u32::MAX { - let res_physics1_good = Regulation::equip_goods_param_map().get(&(physics_slot1 ^ InventoryGaitemType::ITEM as u32)); - if res_physics1_good.is_some_and(|p| GoodsType::from(p.data.goodsType) != GoodsType::WonderousPhysicsTears) { return false; } - } - - // Check if physic slot 2 is of type wondrous physics - if physics_slot2 != u32::MAX { - let res_physics2_good = Regulation::equip_goods_param_map().get(&(physics_slot2 ^ InventoryGaitemType::ITEM as u32)); - if res_physics2_good.is_some_and(|p| GoodsType::from(p.data.goodsType) != GoodsType::WonderousPhysicsTears) { return false; } - } - - true - } - - fn is_equipped_items_valid(save: &Save, index: usize) -> bool { - let quick_slot_items = &save.save_type.get_slot(index).equip_item_data.quick_slot_items; - let pouch_items = &save.save_type.get_slot(index).equip_item_data.pouch_items; - - // Check for invalid or duplicate quickslot items - let mut item_ids = HashSet::new(); - for item in quick_slot_items.iter() { - if item.item_id == 0 { continue; } - if Regulation::equip_goods_param_map().get(&(item.item_id ^ InventoryGaitemType::ITEM as u32)).is_none() { println!("Item {} not found", item.item_id); return false; } - if let Some(_existing_id) = item_ids.get(&item.item_id) { - println!("Duplicate item found: {}", _existing_id); - return false; - } else { - item_ids.insert(item.item_id); - } - } - - // Check for invalid or duplicate pouch items - let mut item_ids = HashSet::new(); - for item in pouch_items.iter() { - if item.item_id == 0 { continue; } - if Regulation::equip_goods_param_map().get(&(item.item_id ^ InventoryGaitemType::ITEM as u32)).is_none() { println!("Item {} not found", item.item_id); return false; } - if let Some(_existing_id) = item_ids.get(&item.item_id) { - println!("Duplicate item found: {}", _existing_id); - return false; - } else { - item_ids.insert(item.item_id); - } - } - true - } - - // region: utils - - fn validate_armor_piece(id: u32, protector_category: ProtectorCategory) -> bool { - let res_armor_piece = Regulation::equip_protectors_param_map().get(&id); - if res_armor_piece.is_none() { return false; } - let armor_piece = res_armor_piece.unwrap(); - let armor_piece_pc = ProtectorCategory::try_from(armor_piece.data.protectorCategory); - if armor_piece_pc.is_err() || armor_piece_pc.unwrap() != protector_category {return false;} - true - } - - // Validates the infsued gem against the weapon type by looking it up in the game params. - fn validate_attached_gem(wep_type: WepType, gem_param: &Row) -> bool { - match wep_type { - WepType::Dagger => gem_param.data.canMountWep_Dagger(), - WepType::StraightSword => gem_param.data.canMountWep_SwordNormal(), - WepType::Greatsword => gem_param.data.canMountWep_SwordLarge(), - WepType::ColossalSword => gem_param.data.canMountWep_SwordGigantic(), - WepType::CurvedSword => gem_param.data.canMountWep_SaberNormal(), - WepType::CurvedGreatsword => gem_param.data.canMountWep_SaberLarge(), - WepType::Katana => gem_param.data.canMountWep_katana(), - WepType::Twinblade => gem_param.data.canMountWep_SwordDoubleEdge(), - WepType::ThrustingSword => gem_param.data.canMountWep_SwordPierce(), - WepType::HeavyThrustingSword => gem_param.data.canMountWep_RapierHeavy(), - WepType::Axe => gem_param.data.canMountWep_AxeNormal(), - WepType::Greataxe => gem_param.data.canMountWep_AxeLarge(), - WepType::Hammer => gem_param.data.canMountWep_HammerNormal(), - WepType::GreatHammer => gem_param.data.canMountWep_HammerLarge(), - WepType::Flail => gem_param.data.canMountWep_Flail(), - WepType::Spear => gem_param.data.canMountWep_SpearNormal(), - WepType::HeavySpear => gem_param.data.canMountWep_SpearHeavy(), - WepType::Halberd => gem_param.data.canMountWep_SpearAxe(), - WepType::Scythe => gem_param.data.canMountWep_Sickle(), - WepType::Fist => gem_param.data.canMountWep_Knuckle(), - WepType::Claw => gem_param.data.canMountWep_Claw(), - WepType::Whip => gem_param.data.canMountWep_Whip(), - WepType::ColossalWeapon => gem_param.data.canMountWep_AxhammerLarge(), - WepType::LightBow => gem_param.data.canMountWep_BowSmall(), - WepType::Bow => gem_param.data.canMountWep_BowNormal(), - WepType::Greatbow => gem_param.data.canMountWep_BowLarge(), - WepType::Crossbow => gem_param.data.canMountWep_ClossBow(), - WepType::Ballista => gem_param.data.canMountWep_Ballista(), - WepType::Staff => gem_param.data.canMountWep_Staff(), - WepType::Seal => gem_param.data.canMountWep_Talisman(), - WepType::SmallShield => gem_param.data.canMountWep_ShieldSmall(), - WepType::MediumShield => gem_param.data.canMountWep_ShieldNormal(), - WepType::Greatshield => gem_param.data.canMountWep_ShieldLarge(), - WepType::Torch => gem_param.data.canMountWep_Torch(), - WepType::None | - WepType::Arrow | - WepType::Greatarrow | - WepType::Bolt | - WepType::BallistaBolt | - WepType::Unknown => { - false - }, - } - } - - // Check if inventory_common_items only has EquipInventoryItem with unique ids - fn check_for_duplicate_items(item_list: &Vec) -> bool { - let mut item_ids = HashSet::new(); - - for item in item_list.iter().filter(|i| i.ga_item_handle.to_le_bytes()[3] == 0xB0) { - if let Some(_existing_id) = item_ids.get(&item.ga_item_handle) { - return false; - } else { - item_ids.insert(item.ga_item_handle); - } - } - true - } - // endregion - } -} \ No newline at end of file diff --git a/src/vm/character.rs b/src/vm/character.rs new file mode 100644 index 0000000..897c405 --- /dev/null +++ b/src/vm/character.rs @@ -0,0 +1,36 @@ +use er_save_lib::{SaveApi, SaveApiError}; + +use super::{ + events::EventsViewModel, general::general_view_model::GeneralViewModel, + inventory::inventory::InventoryViewModel, regions::RegionsViewModel, stats::StatsViewModel, +}; + +#[derive(Default)] +pub struct CharacterViewModel { + pub general_vm: GeneralViewModel, + pub stats_vm: StatsViewModel, + // pub equipment_vm: EquipmentViewModel, + pub inventory_vm: InventoryViewModel, + pub events_vm: EventsViewModel, + pub regions_vm: RegionsViewModel, +} + +impl CharacterViewModel { + pub fn from_save(save_api: &SaveApi, index: usize) -> Result { + let general_vm = GeneralViewModel::from_save(index, save_api); + let stats_vm = StatsViewModel::from_save(index, save_api); + // let equipment_vm = EquipmentViewModel::from_save(slot); + let inventory_vm = InventoryViewModel::from_save(index, save_api)?; + let events_vm = EventsViewModel::from_save(index, save_api); + let regions_vm = RegionsViewModel::from_save(index, save_api); + + Ok(Self { + general_vm, + stats_vm, + // equipment_vm, + inventory_vm, + events_vm, + regions_vm, + }) + } +} diff --git a/src/vm/events.rs b/src/vm/events.rs index 8885fcc..a149bf4 100644 --- a/src/vm/events.rs +++ b/src/vm/events.rs @@ -1,107 +1,159 @@ -pub mod events_view_model { - use std::collections::BTreeMap; +use std::collections::BTreeMap; - use crate::{db::{bosses::bosses::{Boss, BOSSES}, colosseums::colosseums::{Colosseum, COLOSSEUMS}, cookbooks::books::{Cookbook, COOKBOKS}, event_flags::event_flags::EVENT_FLAGS, graces::maps::{Grace, GRACES}, map_name::map_name::{MapName, MAP_NAME}, maps::maps::{Map, MAPS}, summoning_pools::summoning_pools::{SummoningPool, SUMMONING_POOLS}, whetblades::whetblades::{Whetblade, WHETBLADES}}, save::common::save_slot::SaveSlot, util::bit::bit::get_bit}; +use er_save_lib::SaveApi; - #[derive(Clone)] - pub enum EventsRoute { - None, - SitesOfGrace, - Whetblades, - Cookboks, - Maps, - Bosses, - SummoningPools, - Colosseums, - } +use crate::db::{ + bosses::Boss, colosseums::Colosseum, cookbooks::Cookbook, graces::maps::Grace, + map_name::MapName, maps::Map, summoning_pools::SummoningPool, whetblades::Whetblade, +}; - #[derive(Clone)] - pub struct EventsViewModel { - pub current_route: EventsRoute, - pub grace_groups: BTreeMap>, - pub graces: BTreeMap, - pub whetblades: BTreeMap, - pub cookbooks: BTreeMap, - pub maps: BTreeMap, - pub bosses: BTreeMap, - pub summoning_pools: BTreeMap, - pub colosseums: BTreeMap, - } +#[derive(Clone)] +pub enum EventsRoute { + None, + SitesOfGrace, + Whetblades, + Cookboks, + Maps, + Bosses, + SummoningPools, + Colosseums, +} - impl Default for EventsViewModel { - fn default() -> Self { - Self { - current_route: EventsRoute::None, - grace_groups: MAP_NAME.lock().unwrap().iter().map(|m| (*m.0, Vec::new())).collect::>(), - graces: Default::default(), - whetblades: Default::default(), - cookbooks: Default::default(), - maps: Default::default(), - bosses: Default::default(), - summoning_pools: Default::default(), - colosseums: Default::default(), - } +#[derive(Clone)] +pub struct EventsViewModel { + pub current_route: EventsRoute, + pub grace_groups: BTreeMap>, + pub graces: BTreeMap, + pub whetblades: BTreeMap, + pub cookbooks: BTreeMap, + pub maps: BTreeMap, + pub bosses: BTreeMap, + pub summoning_pools: BTreeMap, + pub colosseums: BTreeMap, +} + +impl Default for EventsViewModel { + fn default() -> Self { + Self { + current_route: EventsRoute::None, + grace_groups: MapName::map_names() + .iter() + .map(|m| (*m.0, Vec::new())) + .collect::>(), + graces: Default::default(), + whetblades: Default::default(), + cookbooks: Default::default(), + maps: Default::default(), + bosses: Default::default(), + summoning_pools: Default::default(), + colosseums: Default::default(), } } +} - impl EventsViewModel { - pub fn from_save(slot:& SaveSlot) -> Self { - let mut events_vm = EventsViewModel::default(); +impl EventsViewModel { + pub fn from_save(index: usize, save_api: &SaveApi) -> Self { + let mut events_vm = EventsViewModel::default(); - let id_to_offset_lookup = EVENT_FLAGS.lock().unwrap(); + // let id_to_offset_lookup = EVENT_FLAGS.lock().unwrap(); - // Graces - for (key, value) in GRACES.lock().unwrap().iter() { - let event_flag_info = id_to_offset_lookup[&value.1]; - let on = get_bit(slot.event_flags.flags[event_flag_info.0 as usize], event_flag_info.1); - events_vm.graces.insert(*key, on); - events_vm.grace_groups.get_mut(&value.0).expect("").push(*key); - events_vm.grace_groups.get_mut(&value.0).expect("").sort(); - } - - // Whetblades - for (key, value) in WHETBLADES.lock().unwrap().iter() { - let event_flag_info = id_to_offset_lookup[&value.0]; - let on = get_bit(slot.event_flags.flags[event_flag_info.0 as usize], event_flag_info.1); - events_vm.whetblades.insert(*key, on); + // Graces + for (key, (map_name, event_id, _)) in Grace::graces().iter() { + let res = save_api.get_event_flag(*event_id, index); + match res { + Ok(is_on) => { + events_vm.graces.insert(*key, is_on); + events_vm + .grace_groups + .get_mut(&map_name) + .expect("") + .push(*key); + events_vm.grace_groups.get_mut(&map_name).expect("").sort(); + } + Err(err) => { + println!("{err}"); + } } + } - // Cookbooks - for (key, value) in COOKBOKS.lock().unwrap().iter() { - let event_flag_info = id_to_offset_lookup[&value.0]; - let on = get_bit(slot.event_flags.flags[event_flag_info.0 as usize], event_flag_info.1); - events_vm.cookbooks.insert(*key, on); + // Whetblades + for (key, (event_id, _)) in Whetblade::whetblades().iter() { + let res = save_api.get_event_flag(*event_id, index); + match res { + Ok(is_on) => { + events_vm.whetblades.insert(*key, is_on); + } + Err(err) => { + println!("{err}"); + } } + } - // Maps - for (key, value) in MAPS.lock().unwrap().iter() { - let event_flag_info = id_to_offset_lookup[&value.0]; - let on = get_bit(slot.event_flags.flags[event_flag_info.0 as usize], event_flag_info.1); - events_vm.maps.insert(*key, on); + // Cookbooks + for (key, (event_id, _)) in Cookbook::cookbooks().iter() { + let res = save_api.get_event_flag(*event_id, index); + match res { + Ok(is_on) => { + events_vm.cookbooks.insert(*key, is_on); + } + Err(err) => { + println!("{err}"); + } } + } - // Bosses - for (key, value) in BOSSES.lock().unwrap().iter() { - let event_flag_info = id_to_offset_lookup[&value.0]; - let on = get_bit(slot.event_flags.flags[event_flag_info.0 as usize], event_flag_info.1); - events_vm.bosses.insert(*key, on); + // Maps + for (key, (event_id, _)) in Map::maps().iter() { + let res = save_api.get_event_flag(*event_id, index); + match res { + Ok(is_on) => { + events_vm.maps.insert(*key, is_on); + } + Err(err) => { + println!("{err}"); + } } + } - // Summoning Pools - for (key, value) in SUMMONING_POOLS.lock().unwrap().iter() { - let event_flag_info = id_to_offset_lookup[&value.0]; - let on = get_bit(slot.event_flags.flags[event_flag_info.0 as usize], event_flag_info.1); - events_vm.summoning_pools.insert(*key, on); - } + // Bosses + for (boss, (event_id, _)) in Boss::bosses().iter() { + let res = save_api.get_event_flag(*event_id, index); + match res { + Ok(is_on) => { + events_vm.bosses.insert(*boss, is_on); + } + Err(err) => { + println!("{err}"); + } + }; + } - // Colosseums - for (key, value) in COLOSSEUMS.lock().unwrap().iter() { - let event_flag_info = id_to_offset_lookup[&value.0]; - let on = get_bit(slot.event_flags.flags[event_flag_info.0 as usize], event_flag_info.1); - events_vm.colosseums.insert(*key, on); - } + // Summoning Pools + for (key, (event_id, _)) in SummoningPool::summoning_pools().iter() { + let res = save_api.get_event_flag(*event_id, index); + match res { + Ok(is_on) => { + events_vm.summoning_pools.insert(*key, is_on); + } + Err(err) => { + println!("{err}"); + } + }; + } - events_vm + // Colosseums + for (key, (event_id, _)) in Colosseum::colusseums().iter() { + let res = save_api.get_event_flag(*event_id, index); + match res { + Ok(is_on) => { + events_vm.colosseums.insert(*key, is_on); + } + Err(err) => { + println!("{err}"); + } + }; } + + events_vm } -} \ No newline at end of file +} diff --git a/src/vm/general.rs b/src/vm/general.rs index 460825c..2dff674 100644 --- a/src/vm/general.rs +++ b/src/vm/general.rs @@ -1,5 +1,5 @@ pub mod general_view_model { - use crate::save::common::save_slot::SaveSlot; + use er_save_lib::SaveApi; #[derive(Default, Clone)] pub struct MapID { @@ -10,7 +10,10 @@ pub mod general_view_model { } impl ToString for MapID { fn to_string(&self) -> String { - format!("{:02}{:02}{:02}{:02}", self.area_id, self.block_id, self.region_id, self.index_id) + format!( + "{:02}{:02}{:02}{:02}", + self.area_id, self.block_id, self.region_id, self.index_id + ) } } @@ -18,55 +21,38 @@ pub mod general_view_model { pub enum Gender { Female, Male, - #[default]Uknown, + #[default] + Uknown, } - impl TryFrom for Gender { - type Error = (); - fn try_from(v: u8) -> Result { - match v { - x if x == Gender::Male as u8 => Ok(Gender::Male), - x if x == Gender::Female as u8 => Ok(Gender::Female), - _ => Err(()), + impl From for Gender { + fn from(value: u8) -> Self { + match value { + x if x == Gender::Male as u8 => Gender::Male, + x if x == Gender::Female as u8 => Gender::Female, + _ => Gender::Uknown, } } } #[derive(Default, Clone)] - pub struct GeneralViewModel { - pub steam_id: String, + pub struct GeneralViewModel { pub character_name: String, pub gender: Gender, - pub weapon_level: u8, } impl GeneralViewModel { - pub fn from_save(slot:& SaveSlot) -> Self { - - // Steam Id - let steam_id = slot.steam_id.to_string(); - + pub fn from_save(index: usize, save_api: &SaveApi) -> Self { // Character Name - let character_name = slot.player_game_data.character_name; - let mut character_name_trimmed: [u16; 0x10] = [0;0x10]; - for (i, char) in character_name.iter().enumerate() { - if *char == 0 { break; } - character_name_trimmed[i] = *char; - } - let character_name = String::from_utf16(&character_name_trimmed).expect(""); + let character_name = save_api.character_name(index); // Gender - let gender = Gender::try_from(slot.player_game_data.gender).expect(""); - - // Weapon Level - let weapon_level = slot.player_game_data.match_making_wpn_lvl; + let gender = Gender::from(save_api.gender(index)); Self { - steam_id, character_name, gender, - weapon_level, } } } -} \ No newline at end of file +} diff --git a/src/vm/importer.rs b/src/vm/importer.rs index ec54489..14aabc2 100644 --- a/src/vm/importer.rs +++ b/src/vm/importer.rs @@ -1,88 +1,75 @@ -pub mod general_view_model { - use crate::{save::save::save::Save, util::validator::validator::Validator, vm::{slot::slot_view_model::SlotViewModel, vm::vm::ViewModel}}; +use er_save_lib::{SaveApi, SaveApiError}; - #[derive(Default, Clone)] - pub struct Character { - pub active: bool, - pub index: usize, - pub name: String, - } - - - pub struct ImporterViewModel { - pub valid: bool, - pub selected_from_index: usize, - pub selected_to_index: usize, - pub from_list: [Character; 0x10], - pub to_list: [Character; 0x10], - from_save: Save, - } +use super::{character::CharacterViewModel, vm::ViewModel}; - impl Default for ImporterViewModel { - fn default() -> Self { - Self { - valid: false, - selected_from_index: 0, - selected_to_index: 0, - from_list: Default::default(), - to_list: Default::default(), - from_save: Save::default() - } +#[derive(Default, Clone)] +pub struct Profile { + pub active: bool, + pub name: String, +} +impl Profile { + pub(crate) fn new(name: impl Into) -> Self { + Profile { + active: true, + name: name.into(), } } +} - impl ImporterViewModel { - pub fn new(from: Save, vm: &ViewModel) -> Self { - let mut importer_view_model = ImporterViewModel::default(); - - importer_view_model.valid = Validator::validate(&from); - - if !importer_view_model.valid {return importer_view_model;} +#[derive(Default)] +pub struct ImporterViewModel { + pub valid: bool, + pub from_index: usize, + pub to_index: usize, + pub from_list: Vec, + pub to_list: Vec, + pub save_api: Option, +} - importer_view_model.from_save = from; - - for (i, active) in importer_view_model.from_save.save_type.active_slots().iter().enumerate() { - if *active { - // Character Name - let character_name = importer_view_model.from_save.save_type.get_slot(i).player_game_data.character_name; - let mut character_name_trimmed: [u16; 0x10] = [0;0x10]; - for (i, char) in character_name.iter().enumerate() { - if *char == 0 { break; } - character_name_trimmed[i] = *char; - } - let character_name: String = String::from_utf16(&character_name_trimmed).expect(""); - importer_view_model.from_list[i].active = true; - importer_view_model.from_list[i].index = i; - importer_view_model.from_list[i].name = character_name; - } +impl ImporterViewModel { + pub fn new(save_api: SaveApi, vm: &ViewModel) -> Self { + let mut from_profiles = Vec::new(); + for (index, active) in save_api.active_characters().iter().enumerate() { + if *active { + // Character Name + let character_name = save_api.character_name(index); + from_profiles.push(Profile::new(&character_name)); } + } - for i in 0..0xA { - if vm.profile_summary[i].active { - importer_view_model.to_list[i].active = true; - importer_view_model.to_list[i].index = i; - importer_view_model.to_list[i].name = vm.slots[i].general_vm.character_name.to_string(); - } - } + let mut to_profiles = Vec::new(); + for character in vm.characters.iter() { + to_profiles.push(Profile::new(&character.general_vm.character_name)); + } - importer_view_model + ImporterViewModel { + valid: true, + from_list: from_profiles, + to_list: to_profiles, + save_api: Some(save_api), + from_index: 0, + to_index: 0, } + } - pub fn import_character(&mut self, to_save: &mut Save, vm: &mut ViewModel) { + pub fn import_character( + &mut self, + app_save_api: &mut SaveApi, + vm: &mut ViewModel, + ) -> Result<(), SaveApiError> { + // Try to import character. Notify if there's error. + app_save_api.import_character( + self.to_index, + self.save_api.as_ref().unwrap(), + self.from_index, + )?; - // Retain slot version - let mut from_slot = self.from_save.save_type.get_slot(self.selected_from_index).clone(); - let to_slot = to_save.save_type.get_slot(self.selected_to_index); - from_slot.ver = to_slot.ver; + // Refresh view model + vm.characters[self.to_index] = CharacterViewModel::from_save(app_save_api, self.to_index)?; - // Save Slot - to_save.save_type.set_slot(self.selected_to_index, &from_slot); - - // Profile Summary - to_save.save_type.set_profile_summary(self.selected_to_index, self.from_save.save_type.get_profile_summary(self.selected_from_index)); + self.to_list[self.to_index] = + Profile::new(&vm.characters[self.to_index].general_vm.character_name); - // Refresh view model - vm.slots[self.selected_to_index] = SlotViewModel::from_save(to_save.save_type.get_slot(self.selected_to_index)); - } + Ok(()) } -} \ No newline at end of file +} diff --git a/src/vm/inventory/add/add.rs b/src/vm/inventory/add/add.rs new file mode 100644 index 0000000..97233bd --- /dev/null +++ b/src/vm/inventory/add/add.rs @@ -0,0 +1,261 @@ +use std::{borrow::Borrow, cell::RefCell, rc::Rc}; + +use er_save_lib::{ + EquipParamAccessory::EquipParamAccessory, EquipParamGem::EquipParamGem, + EquipParamGoods::EquipParamGoods, EquipParamProtector::EquipParamProtector, + EquipParamWeapon::EquipParamWeapon, ItemType, SaveApi, SaveApiError, +}; +use strsim::sorensen_dice; + +use super::{filter::ParamFilter, item_param::ItemParam}; + +#[derive(Default, PartialEq)] +pub(crate) enum AddTypeRoute { + #[default] + Single, + Bulk, +} + +#[derive(Default)] +pub(crate) struct ParamHeader { + pub(crate) item_id: Rc>, + pub(crate) item_name: Rc>, + pub(crate) is_dlc_item: Rc>, + pub(crate) item_type: ItemType, +} + +#[derive(Default)] +pub(crate) enum SelectedItem { + #[default] + None, + Weapon(Rc>>), + Armor(Rc>>), + Accessory(Rc>>), + Item(Rc>>), + Aow(Rc>>), +} + +#[derive(Default)] +pub(crate) struct AddViewModel { + // Navigation + pub(crate) current_type_route: AddTypeRoute, + pub(crate) current_sub_type_route: ItemType, + + // Selected + pub(crate) selected_header: Option>>, + pub(crate) selected_item: SelectedItem, + + // Add Adjustments + pub(crate) selected_item_quantity: i16, + pub(crate) selected_weapon_level: u8, + pub(crate) selected_gem: u8, + pub(crate) selected_infusion: usize, + + // Params + pub(crate) items: Vec>>>, + pub(crate) weapons: Vec>>>, + pub(crate) aows: Vec>>>, + pub(crate) armors: Vec>>>, + pub(crate) talismans: Vec>>>, + + // List used in view + pub(crate) current_list: Vec>>, + pub(crate) available_infusions: Vec>>, +} + +impl AddViewModel { + pub(crate) fn from_save(save_api: &SaveApi) -> Result { + let items = Self::prepare_items::(save_api, &ItemType::Item)?; + let weapons = Self::prepare_items::(save_api, &ItemType::Weapon)?; + let aows = Self::prepare_items::(save_api, &ItemType::Aow)?; + let armors = Self::prepare_items::(save_api, &ItemType::Armor)?; + let talismans = Self::prepare_items::(save_api, &ItemType::Accessory)?; + + Ok(Self { + items, + weapons, + aows, + armors, + talismans, + ..Default::default() + }) + } + + fn prepare_items( + save_api: &SaveApi, + item_type: &ItemType, + ) -> Result>>>, SaveApiError> { + Ok(save_api + .get_param::

()? + .rows + .into_iter() + .map(|(item_id, param)| { + let item_id = item_id as u32; + Rc::new(RefCell::new(ItemParam::

{ + header: Rc::new(RefCell::new(ParamHeader { + item_id: Rc::new(RefCell::new(item_id)), + item_name: Rc::new(RefCell::new( + if let Some(item_name) = SaveApi::get_item_name( + if item_type == &ItemType::Aow { + (item_id / 100) as u32 + } else { + item_id as u32 + }, + item_type, + ) { + item_name + } else { + format!("Unk_{}", item_id) + }, + )), + is_dlc_item: Rc::new(RefCell::new(SaveApi::is_dlc_item( + item_id, + &ItemType::Item, + ))), + item_type: item_type.clone(), + })), + param: param, + })) + }) + .collect()) + } + + pub(crate) fn to_route(&mut self, item_type: ItemType, filter_text: impl Into) { + self.selected_header = None; + self.selected_item = SelectedItem::None; + self.current_list = match item_type { + ItemType::None => Vec::new(), + ItemType::Weapon => { + // Filter out infused weapons + let weapons: Vec>>> = self + .weapons + .iter() + .filter(ParamFilter::not_infused) + .map(|item| item.clone()) + .collect(); + Self::init_list(weapons.iter(), filter_text) + } + ItemType::Armor => Self::init_list(self.armors.iter(), filter_text), + ItemType::Accessory => Self::init_list(self.talismans.iter(), filter_text), + ItemType::Item => Self::init_list(self.items.iter(), filter_text), + ItemType::Aow => Self::init_list(self.aows.iter(), filter_text), + }; + self.current_list.sort_by(|a, b| { + a.as_ref() + .borrow() + .item_name + .as_ref() + .borrow() + .cmp(&b.as_ref().borrow().item_name.as_ref().borrow()) + }); + self.current_sub_type_route = item_type; + } + + pub(crate) fn init_list( + iter: std::slice::Iter>>>, + filter_text: impl Into, + ) -> Vec>> { + let filter_text = filter_text.into(); + iter.filter(|param| { + if filter_text.is_empty() { + return true; + } + let distance = sorensen_dice( + ¶m + .as_ref() + .borrow() + .header + .as_ref() + .borrow() + .item_name + .as_ref() + .borrow() + .to_lowercase(), + &filter_text.to_lowercase(), + ); + + distance > 0.3 + }) + .map(|param| param.as_ref().borrow().header.clone()) + .collect() + } + + pub(crate) fn select_item(&mut self, param_header: Rc>) { + self.selected_header = Some(param_header.clone()); + match param_header.as_ref().borrow().item_type { + ItemType::None => self.selected_item = SelectedItem::None, + ItemType::Weapon => { + let weapon = Self::find_param_entry(¶m_header, &mut self.weapons.iter()); + self.available_infusions = self + .aows + .iter() + .filter(|aow| { + weapon + .as_ref() + .borrow() + .weapon_type() + .can_mount(&aow.as_ref().borrow().param) + }) + .filter(|aow| { + *aow.as_ref() + .borrow() + .header + .as_ref() + .borrow() + .item_id + .as_ref() + .borrow() + > 9999 + }) + .map(|aow| aow.as_ref().borrow().header.clone()) + .collect(); + self.available_infusions.insert( + 0, + Rc::new(RefCell::new(ParamHeader { + item_name: Rc::new(RefCell::new(String::from("-- None --"))), + item_type: ItemType::None, + ..Default::default() + })), + ); + self.available_infusions.sort_by(|a, b| { + a.as_ref() + .borrow() + .item_name + .cmp(&b.as_ref().borrow().item_name) + }); + self.selected_item = SelectedItem::Weapon(weapon); + } + ItemType::Armor => { + self.selected_item = SelectedItem::Armor(Self::find_param_entry( + ¶m_header, + &mut self.armors.iter(), + )) + } + ItemType::Accessory => { + self.selected_item = SelectedItem::Accessory(Self::find_param_entry( + ¶m_header, + &mut self.talismans.iter(), + )) + } + ItemType::Item => { + self.selected_item = SelectedItem::Item(Self::find_param_entry( + ¶m_header, + &mut self.items.iter(), + )) + } + ItemType::Aow => { + self.selected_item = + SelectedItem::Aow(Self::find_param_entry(¶m_header, &mut self.aows.iter())) + } + } + } + + fn find_param_entry( + param_header: &Rc>, + iter: &mut std::slice::Iter>>>, + ) -> Rc>> { + iter.find(|item| Rc::ptr_eq(&item.as_ref().borrow().header, param_header)) + .unwrap() + .clone() + } +} diff --git a/src/vm/inventory/add/filter.rs b/src/vm/inventory/add/filter.rs new file mode 100644 index 0000000..a02e30a --- /dev/null +++ b/src/vm/inventory/add/filter.rs @@ -0,0 +1,24 @@ +use std::{cell::RefCell, rc::Rc}; + +use er_save_lib::EquipParamWeapon::EquipParamWeapon; + +use super::item_param::ItemParam; + +pub(crate) struct ParamFilter; + +impl ParamFilter { + pub(crate) fn not_infused(weapon: &&Rc>>) -> bool { + weapon + .as_ref() + .borrow() + .header + .as_ref() + .borrow() + .item_id + .as_ref() + .borrow() + .to_owned() + % 10_000 + == 0 + } +} diff --git a/src/vm/inventory/add/item_param.rs b/src/vm/inventory/add/item_param.rs new file mode 100644 index 0000000..793adde --- /dev/null +++ b/src/vm/inventory/add/item_param.rs @@ -0,0 +1,21 @@ +use std::{cell::RefCell, rc::Rc}; + +use er_save_lib::EquipParamWeapon::EquipParamWeapon; + +use super::{add::ParamHeader, weapon_type::WeaponType}; + +#[derive(Default)] +pub(crate) struct ItemParam { + pub(crate) header: Rc>, + pub(crate) param: P::ParamType, +} + +impl ItemParam { + pub(crate) fn is_infusable(&self) -> bool { + self.param.gemMountType == 2 + } + + pub(crate) fn weapon_type(&self) -> WeaponType { + WeaponType::from(self.param.wepType) + } +} diff --git a/src/vm/inventory/add/mod.rs b/src/vm/inventory/add/mod.rs new file mode 100644 index 0000000..abbb6e3 --- /dev/null +++ b/src/vm/inventory/add/mod.rs @@ -0,0 +1,4 @@ +pub(crate) mod add; +pub(crate) mod filter; +pub(crate) mod item_param; +pub(crate) mod weapon_type; diff --git a/src/vm/inventory/add/weapon_type.rs b/src/vm/inventory/add/weapon_type.rs new file mode 100644 index 0000000..8321478 --- /dev/null +++ b/src/vm/inventory/add/weapon_type.rs @@ -0,0 +1,212 @@ +#[allow(unused)] +#[repr(i16)] +#[derive(Default)] +pub(crate) enum WeaponType { + #[default] + None = 0, + Dagger = 1, + StraightSword = 3, + Greatsword = 5, + ColossalSword = 7, + CurvedSword = 9, + CurvedGreatsword = 11, + Katana = 13, + Twinblade = 14, + ThrustingSword = 15, + HeavyThrustingSword = 16, + Axe = 17, + Greataxe = 19, + Hammer = 21, + GreatHammer = 23, + Flail = 24, + Spear = 25, + HeavySpear = 28, + Halberd = 29, + Scythe = 31, + Fist = 35, + Claw = 37, + Whip = 39, + ColossalWeapon = 41, + LightBow = 50, + Bow = 51, + Greatbow = 53, + Crossbow = 55, + Ballista = 56, + Staff = 57, + Seal = 61, + SmallShield = 65, + MediumShield = 67, + Greatshield = 69, + Arrow = 81, + Greatarrow = 83, + Bolt = 85, + BallistaBolt = 86, + Torch = 87, + HandToHand = 88, + ThrustingShield = 90, + ThowingBlade = 91, + ReverseHandBlade = 92, + LightGreatSword = 93, + GreatKatana = 94, + BeastClaw = 95, +} + +impl WeaponType { + pub(crate) fn can_mount( + &self, + gem_param: &::ParamType, + ) -> bool { + match self { + WeaponType::None => false, + WeaponType::Dagger => gem_param.canMountWep_Dagger == 1, + WeaponType::StraightSword => gem_param.canMountWep_SwordNormal == 1, + WeaponType::Greatsword => gem_param.canMountWep_SwordLarge == 1, + WeaponType::ColossalSword => gem_param.canMountWep_SwordGigantic == 1, + WeaponType::CurvedSword => gem_param.canMountWep_SaberNormal == 1, + WeaponType::CurvedGreatsword => gem_param.canMountWep_SaberLarge == 1, + WeaponType::Katana => gem_param.canMountWep_katana == 1, + WeaponType::Twinblade => gem_param.canMountWep_SwordDoubleEdge == 1, + WeaponType::ThrustingSword => gem_param.canMountWep_SwordPierce == 1, + WeaponType::HeavyThrustingSword => gem_param.canMountWep_RapierHeavy == 1, + WeaponType::Axe => gem_param.canMountWep_AxeNormal == 1, + WeaponType::Greataxe => gem_param.canMountWep_AxeLarge == 1, + WeaponType::Hammer => gem_param.canMountWep_HammerNormal == 1, + WeaponType::GreatHammer => gem_param.canMountWep_HammerLarge == 1, + WeaponType::Flail => gem_param.canMountWep_Flail == 1, + WeaponType::Spear => gem_param.canMountWep_SpearNormal == 1, + WeaponType::HeavySpear => gem_param.canMountWep_SpearHeavy == 1, + WeaponType::Halberd => gem_param.canMountWep_SpearAxe == 1, + WeaponType::Scythe => gem_param.canMountWep_Sickle == 1, + WeaponType::Fist => gem_param.canMountWep_Knuckle == 1, + WeaponType::Claw => gem_param.canMountWep_Claw == 1, + WeaponType::Whip => gem_param.canMountWep_Whip == 1, + WeaponType::ColossalWeapon => gem_param.canMountWep_AxhammerLarge == 1, + WeaponType::LightBow => gem_param.canMountWep_BowSmall == 1, + WeaponType::Bow => gem_param.canMountWep_BowNormal == 1, + WeaponType::Greatbow => gem_param.canMountWep_BowLarge == 1, + WeaponType::Crossbow => gem_param.canMountWep_ClossBow == 1, + WeaponType::Ballista => gem_param.canMountWep_Ballista == 1, + WeaponType::Staff => gem_param.canMountWep_Staff == 1, + WeaponType::Seal => gem_param.canMountWep_Talisman == 1, + WeaponType::SmallShield => gem_param.canMountWep_ShieldSmall == 1, + WeaponType::MediumShield => gem_param.canMountWep_ShieldNormal == 1, + WeaponType::Greatshield => gem_param.canMountWep_ShieldLarge == 1, + WeaponType::Torch => gem_param.canMountWep_Torch == 1, + WeaponType::HandToHand => gem_param.canMountWep_HandToHand == 1, + WeaponType::ThrustingShield => gem_param.canMountWep_ThrustingShield == 1, + WeaponType::ThowingBlade => gem_param.canMountWep_ThrowingWeapon == 1, + WeaponType::ReverseHandBlade => gem_param.canMountWep_ReverseHandSword == 1, + WeaponType::LightGreatSword => gem_param.canMountWep_LightGreatsword == 1, + WeaponType::GreatKatana => gem_param.canMountWep_GreatKatana == 1, + WeaponType::BeastClaw => gem_param.canMountWep_BeastClaw == 1, + _ => false, + } + } +} + +impl From for WeaponType { + fn from(value: i16) -> Self { + match value { + v if v == WeaponType::None as i16 => WeaponType::None, + v if v == WeaponType::Dagger as i16 => WeaponType::Dagger, + v if v == WeaponType::StraightSword as i16 => WeaponType::StraightSword, + v if v == WeaponType::Greatsword as i16 => WeaponType::Greatsword, + v if v == WeaponType::ColossalSword as i16 => WeaponType::ColossalSword, + v if v == WeaponType::CurvedSword as i16 => WeaponType::CurvedSword, + v if v == WeaponType::CurvedGreatsword as i16 => WeaponType::CurvedGreatsword, + v if v == WeaponType::Katana as i16 => WeaponType::Katana, + v if v == WeaponType::Twinblade as i16 => WeaponType::Twinblade, + v if v == WeaponType::ThrustingSword as i16 => WeaponType::ThrustingSword, + v if v == WeaponType::HeavyThrustingSword as i16 => WeaponType::HeavyThrustingSword, + v if v == WeaponType::Axe as i16 => WeaponType::Axe, + v if v == WeaponType::Greataxe as i16 => WeaponType::Greataxe, + v if v == WeaponType::Hammer as i16 => WeaponType::Hammer, + v if v == WeaponType::GreatHammer as i16 => WeaponType::GreatHammer, + v if v == WeaponType::Flail as i16 => WeaponType::Flail, + v if v == WeaponType::Spear as i16 => WeaponType::Spear, + v if v == WeaponType::HeavySpear as i16 => WeaponType::HeavySpear, + v if v == WeaponType::Halberd as i16 => WeaponType::Halberd, + v if v == WeaponType::Scythe as i16 => WeaponType::Scythe, + v if v == WeaponType::Fist as i16 => WeaponType::Fist, + v if v == WeaponType::Claw as i16 => WeaponType::Claw, + v if v == WeaponType::Whip as i16 => WeaponType::Whip, + v if v == WeaponType::ColossalWeapon as i16 => WeaponType::ColossalWeapon, + v if v == WeaponType::LightBow as i16 => WeaponType::LightBow, + v if v == WeaponType::Bow as i16 => WeaponType::Bow, + v if v == WeaponType::Greatbow as i16 => WeaponType::Greatbow, + v if v == WeaponType::Crossbow as i16 => WeaponType::Crossbow, + v if v == WeaponType::Ballista as i16 => WeaponType::Ballista, + v if v == WeaponType::Staff as i16 => WeaponType::Staff, + v if v == WeaponType::Seal as i16 => WeaponType::Seal, + v if v == WeaponType::SmallShield as i16 => WeaponType::SmallShield, + v if v == WeaponType::MediumShield as i16 => WeaponType::MediumShield, + v if v == WeaponType::Greatshield as i16 => WeaponType::Greatshield, + v if v == WeaponType::Arrow as i16 => WeaponType::Arrow, + v if v == WeaponType::Greatarrow as i16 => WeaponType::Greatarrow, + v if v == WeaponType::Bolt as i16 => WeaponType::Bolt, + v if v == WeaponType::BallistaBolt as i16 => WeaponType::BallistaBolt, + v if v == WeaponType::Torch as i16 => WeaponType::Torch, + v if v == WeaponType::HandToHand as i16 => WeaponType::HandToHand, + v if v == WeaponType::ThrustingShield as i16 => WeaponType::ThrustingShield, + v if v == WeaponType::ThowingBlade as i16 => WeaponType::ThowingBlade, + v if v == WeaponType::ReverseHandBlade as i16 => WeaponType::ReverseHandBlade, + v if v == WeaponType::LightGreatSword as i16 => WeaponType::LightGreatSword, + v if v == WeaponType::GreatKatana as i16 => WeaponType::GreatKatana, + v if v == WeaponType::BeastClaw as i16 => WeaponType::BeastClaw, + _ => WeaponType::None, + } + } +} + +impl ToString for WeaponType { + fn to_string(&self) -> String { + match self { + WeaponType::None => format!("None"), + WeaponType::Dagger => format!("Dagger"), + WeaponType::StraightSword => format!("Straight Sword"), + WeaponType::Greatsword => format!("Greatsword"), + WeaponType::ColossalSword => format!("Colossal Sword"), + WeaponType::CurvedSword => format!("Curved Sword"), + WeaponType::CurvedGreatsword => format!("Curved Greatsword"), + WeaponType::Katana => format!("Katana"), + WeaponType::Twinblade => format!("Twinblade"), + WeaponType::ThrustingSword => format!("Thrusting Sword"), + WeaponType::HeavyThrustingSword => format!("Heavy Thrusting Sword"), + WeaponType::Axe => format!("Axe"), + WeaponType::Greataxe => format!("Greataxe"), + WeaponType::Hammer => format!("Hammer"), + WeaponType::GreatHammer => format!("Great Hammer"), + WeaponType::Flail => format!("Flail"), + WeaponType::Spear => format!("Spear"), + WeaponType::HeavySpear => format!("HeavySpear"), + WeaponType::Halberd => format!("Halberd"), + WeaponType::Scythe => format!("Scythe"), + WeaponType::Fist => format!("Fist"), + WeaponType::Claw => format!("Claw"), + WeaponType::Whip => format!("Whip"), + WeaponType::ColossalWeapon => format!("Colossal Weapon"), + WeaponType::LightBow => format!("LightBow"), + WeaponType::Bow => format!("Bow"), + WeaponType::Greatbow => format!("Greatbow"), + WeaponType::Crossbow => format!("Crossbow"), + WeaponType::Ballista => format!("Ballista"), + WeaponType::Staff => format!("Staff"), + WeaponType::Seal => format!("Seal"), + WeaponType::SmallShield => format!("SmallShield"), + WeaponType::MediumShield => format!("MediumShield"), + WeaponType::Greatshield => format!("Greatshield"), + WeaponType::Arrow => format!("Arrow"), + WeaponType::Greatarrow => format!("Greatarrow"), + WeaponType::Bolt => format!("Bolt"), + WeaponType::BallistaBolt => format!("BallistaBolt"), + WeaponType::Torch => format!("Torch"), + WeaponType::HandToHand => format!("Hand-to-hand"), + WeaponType::ThrustingShield => format!("Thrusting Shield"), + WeaponType::ThowingBlade => format!("Thowing Blade"), + WeaponType::ReverseHandBlade => format!("Reverse-hand Blade"), + WeaponType::LightGreatSword => format!("Light GreatSword"), + WeaponType::GreatKatana => format!("Great Katana"), + WeaponType::BeastClaw => format!("Beast Claw"), + } + } +} diff --git a/src/vm/inventory/browse.rs b/src/vm/inventory/browse.rs new file mode 100644 index 0000000..33af4ca --- /dev/null +++ b/src/vm/inventory/browse.rs @@ -0,0 +1,86 @@ +use std::{cell::RefCell, rc::Rc}; + +use er_save_lib::{Item, ItemType}; +use strsim::sorensen_dice; + +#[derive(Default, PartialEq)] +pub(crate) enum BrowseTypeRoute { + #[default] + RegularItems, + KeyItems, +} + +#[derive(Default, PartialEq)] +pub(crate) enum BrowseStorageType { + #[default] + Held, + StorageBox, +} + +#[derive(Default, PartialEq)] +pub(crate) struct Storage { + pub(crate) regular_items: Vec>>, + pub(crate) key_items: Vec>>, +} + +#[derive(Default)] +pub(crate) struct InventoryBrowseViewModel { + // Navigation + pub(crate) current_type_route: BrowseTypeRoute, + pub(crate) current_sub_type_route: ItemType, + pub(crate) current_storage_type: BrowseStorageType, + + // Storage + pub(crate) inventory_held: Storage, + pub(crate) inventory_storage_box: Storage, + pub(crate) current_item_list: Vec>>, +} + +impl InventoryBrowseViewModel { + pub(crate) fn filter(&mut self, filter_text: impl Into) { + let filter_text = filter_text.into(); + let list = match (&self.current_storage_type, &self.current_type_route) { + (BrowseStorageType::Held, BrowseTypeRoute::RegularItems) => { + &self.inventory_held.regular_items + } + (BrowseStorageType::Held, BrowseTypeRoute::KeyItems) => &self.inventory_held.key_items, + (BrowseStorageType::StorageBox, BrowseTypeRoute::RegularItems) => { + &self.inventory_storage_box.regular_items + } + (BrowseStorageType::StorageBox, BrowseTypeRoute::KeyItems) => { + &self.inventory_storage_box.key_items + } + }; + self.current_item_list = list + .iter() + .filter(|item| item.as_ref().borrow().item_type == self.current_sub_type_route) + .filter(|item| { + if filter_text.is_empty() { + return true; + } + let distance = sorensen_dice( + &item.as_ref().borrow().item_name.to_lowercase(), + &filter_text.to_lowercase(), + ); + distance > 0.3 + }) + .map(|item| item.clone()) + .collect(); + } + + pub(crate) fn to_regular_items_route( + &mut self, + item_sub_type: ItemType, + filter_text: impl Into, + ) { + self.current_type_route = BrowseTypeRoute::RegularItems; + self.current_sub_type_route = item_sub_type; + self.filter(filter_text); + } + + pub(crate) fn to_key_items_route(&mut self, filter_text: impl Into) { + self.current_type_route = BrowseTypeRoute::KeyItems; + self.current_sub_type_route = ItemType::Item; + self.filter(filter_text); + } +} diff --git a/src/vm/inventory/inventory.rs b/src/vm/inventory/inventory.rs new file mode 100644 index 0000000..5a43af9 --- /dev/null +++ b/src/vm/inventory/inventory.rs @@ -0,0 +1,105 @@ +use std::{cell::RefCell, rc::Rc}; + +use er_save_lib::{Item, SaveApi, SaveApiError}; + +use super::{ + add::add::AddViewModel, + browse::{InventoryBrowseViewModel, Storage}, +}; + +#[derive(Default, PartialEq, Clone)] +pub(crate) enum InventoryRoute { + #[default] + None, + Add, + Browse, +} + +#[derive(Default)] +pub(crate) struct InventoryViewModel { + // Navigation + pub(crate) current_route: InventoryRoute, + + // Filter + pub(crate) filter_text: String, + + // Acquistion index counter + pub(crate) acquistion_index_counter: u32, + + // ViewModels + pub(crate) add_vm: AddViewModel, + pub(crate) browse_vm: InventoryBrowseViewModel, + + // Log + pub(crate) log: Vec, +} + +impl InventoryViewModel { + pub(crate) fn from_save(index: usize, save_api: &SaveApi) -> Result { + // Get regular items from the held inventory storage + let inventory_held_regular_items = Self::prepare_items(Box::new(save_api.get_inventory( + index, + er_save_lib::StorageType::Held, + er_save_lib::StorageItemType::Regular, + )?)); + + // Get key items from the held inventory storage + let inventory_held_key_items: Vec>> = + Self::prepare_items(Box::new(save_api.get_inventory( + index, + er_save_lib::StorageType::Held, + er_save_lib::StorageItemType::Key, + )?)); + + // Get regular items from the storage box inventory storage + let inventory_storage_box_regular_items: Vec>> = + Self::prepare_items(Box::new(save_api.get_inventory( + index, + er_save_lib::StorageType::StorageBox, + er_save_lib::StorageItemType::Regular, + )?)); + + // Get key items from the storage box inventory storage + let inventory_storage_box_key_items: Vec>> = + Self::prepare_items(Box::new(save_api.get_inventory( + index, + er_save_lib::StorageType::StorageBox, + er_save_lib::StorageItemType::Key, + )?)); + + // Create held inventory storage + let inventory_held = Storage { + regular_items: inventory_held_regular_items, + key_items: inventory_held_key_items, + }; + + // Create storage box inventory storage + let inventory_storage_box = Storage { + regular_items: inventory_storage_box_regular_items, + key_items: inventory_storage_box_key_items, + }; + + let add_vm = AddViewModel::from_save(save_api)?; + + // Browse View Model + let browse_vm = InventoryBrowseViewModel { + inventory_held, + inventory_storage_box, + ..Default::default() + }; + + Ok(Self { + add_vm, + browse_vm, + ..Default::default() + }) + } + + fn prepare_items(items: Box>) -> Vec>> { + let items = items + .into_iter() + .map(|item| Rc::new(RefCell::new(item))) + .collect::>>>(); + items + } +} diff --git a/src/vm/inventory/mod.rs b/src/vm/inventory/mod.rs index 8f613e6..57c93b2 100644 --- a/src/vm/inventory/mod.rs +++ b/src/vm/inventory/mod.rs @@ -1,557 +1,3 @@ -use std::{cmp::Ordering, collections::HashMap}; -use strsim::sorensen_dice; - -use crate::{ - db::{ - accessory_name::accessory_name::ACCESSORY_NAME, - aow_name::aow_name::AOW_NAME, - armor_name::armor_name::ARMOR_NAME, - item_name::item_name::ITEM_NAME, - weapon_name::weapon_name::WEAPON_NAME, - }, - save::common::save_slot::{ - EquipInventoryData, EquipInventoryItem, EquipProjectileData, GaItem, GaItemData, SaveSlot - }, - util::regulation::Regulation, vm::regulation::regulation_view_model::WepType -}; - -use super::regulation::regulation_view_model::GoodsType; - -#[derive(Default, Clone)] -pub enum InventoryRoute { - #[default] None, - Add, - Browse, -} - -#[derive(Default, Clone)] -pub enum InventoryTypeRoute { - #[default] CommonItems, - KeyItems, - Weapons, - Armors, - AshOfWar, - Talismans, -} - -#[derive(Default, PartialEq, Clone)] -pub enum InventorySubTypeRoute { - #[default] None, - WeaponLeft, - WeaponRight, - Head, - Body, - Arms, - Legs, - Arrow, - Bolt, - Talisman, - QuickItem, - Pouch -} - -#[derive(PartialEq, Clone, Default, Copy)] -pub enum InventoryItemType { - #[default] None = -1, - WEAPON = 0x0, - ARMOR = 0x10000000, - ACCESSORY = 0x20000000, - ITEM = 0x40000000, - AOW = 0x80000000, -} -impl From for InventoryItemType { - fn from(value: u8) -> Self { - match value { - 0x0 => InventoryItemType::WEAPON, - 0x10 => InventoryItemType::ARMOR, - 0x20 => InventoryItemType::ACCESSORY, - 0x40 => InventoryItemType::ITEM, - 0x80 => InventoryItemType::AOW, - _ => InventoryItemType::None, - } - } -} -impl ToString for InventoryItemType { - fn to_string(&self) -> String { - match self { - InventoryItemType::None => format!("None"), - InventoryItemType::WEAPON => format!("WEAPON"), - InventoryItemType::ARMOR => format!("ARMOR"), - InventoryItemType::ACCESSORY => format!("ACCESSORY"), - InventoryItemType::ITEM => format!("ITEM"), - InventoryItemType::AOW => format!("AOW"), - } - } -} - -#[derive(Default, Clone, PartialEq)] -pub enum InventoryGaitemType { - #[default] EMPTY = -1, - WEAPON = 0x80000000, - ARMOR = 0x90000000, - ACCESSORY = 0xa0000000, - ITEM = 0xb0000000, - AOW = 0xc0000000, -} -impl From for InventoryGaitemType { - fn from(value: u32) -> Self { - match value { - x if x == InventoryGaitemType::WEAPON as u32 => InventoryGaitemType::WEAPON, - x if x == InventoryGaitemType::ARMOR as u32 => InventoryGaitemType::ARMOR, - x if x == InventoryGaitemType::ACCESSORY as u32 => InventoryGaitemType::ACCESSORY, - x if x == InventoryGaitemType::ITEM as u32 => InventoryGaitemType::ITEM, - x if x == InventoryGaitemType::AOW as u32 => InventoryGaitemType::AOW, - _ => InventoryGaitemType::EMPTY, - } - } -} - -#[derive(Default, Clone)] -pub struct InventoryItemViewModel { - pub ga_item_handle: u32, - pub item_id: u32, - pub item_name: String, - pub quantity: u32, - pub inventory_index: u32, - pub equip_index: u32, - pub r#type: InventoryGaitemType, -} - -impl InventoryItemViewModel { - pub fn from_save(item_info: &EquipInventoryItem, equip_index: u32, gaitem: &GaItem, gaitem_type: InventoryGaitemType) -> Self { - let gaitem_handle = item_info.ga_item_handle; - let item_type_specific = match gaitem_type { - InventoryGaitemType::WEAPON => { - let id = (gaitem.item_id / 100)*100; - let upgrade_level = gaitem.item_id % 100; - (gaitem.item_id, match WEAPON_NAME.lock().unwrap().get(&id) { - Some(name) => if !name.is_empty() { - if upgrade_level > 0 {format!("{} +{}", name, upgrade_level)} else {name.to_string()} - } else {format!("[UNKOWN_{}]", id)}, - None => format!("[UNKOWN_{}]", id), - }) - }, - InventoryGaitemType::ARMOR => { - let id = gaitem.item_id ^ InventoryItemType::ARMOR as u32; - (id, match ARMOR_NAME.lock().unwrap().get(&id) { - Some(name) => if !name.is_empty() {name.to_string()} else {format!("[UNKOWN_{}]", id)}, - None => format!("[UNKOWN_{}]", id), - }) - }, - InventoryGaitemType::ACCESSORY => { - let id = gaitem_handle ^ InventoryGaitemType::ACCESSORY as u32; - (id, match ACCESSORY_NAME.lock().unwrap().get(&id) { - Some(name) => if !name.is_empty() {name.to_string()} else {format!("[UNKOWN_{}]", id)}, - None => format!("[UNKOWN_{}]", id), - }) - }, - InventoryGaitemType::ITEM => { - let id = gaitem_handle ^ InventoryGaitemType::ITEM as u32; - (id, match ITEM_NAME.lock().unwrap().get(&id) { - Some(name) => if !name.is_empty() {name.to_string()} else {format!("[UNKOWN_{}]", id)}, - None => format!("[UNKOWN_{}]", id), - }) - }, - InventoryGaitemType::AOW => { - let id = gaitem.item_id ^ InventoryItemType::AOW as u32; - (id, match AOW_NAME.lock().unwrap().get(&id) { - Some(name) => if !name.is_empty() {name.to_string()} else {format!("[UNKOWN_{}]", id)}, - None => format!("[UNKOWN_{}]", id), - }) - }, - InventoryGaitemType::EMPTY => panic!("We shouldn't reach this!"), - }; - - Self { - ga_item_handle: item_info.ga_item_handle, - item_id: item_type_specific.0, - item_name: item_type_specific.1, - quantity: item_info.quantity, - inventory_index: item_info.inventory_index, - equip_index: equip_index, - r#type: gaitem_type, - } - } -} - -#[derive(Default, Clone)] -pub struct InventoryStorage { - pub common_items: Vec, - pub key_items: Vec, - - pub filtered_items: Vec, - pub filtered_key_items: Vec, - pub filtered_weapons: Vec, - pub filtered_armors: Vec, - pub filtered_aows: Vec, - pub filtered_projectiles: Vec, - pub filtered_accessories: Vec, - - pub common_item_count: u32, - pub key_item_count: u32, - pub next_acquisition_sort_order_index: u32, - pub next_equip_index: u32, -} - -#[derive(Default, Clone)] -pub struct InventoryViewModel { - // Navigation - pub at_storage_box: bool, - pub at_single_items: bool, - pub current_route: InventoryRoute, - pub current_type_route: InventoryTypeRoute, - pub current_bulk_type_route: InventoryTypeRoute, - pub current_subtype_route: InventorySubTypeRoute, - - // Data - pub filter_text: String, - pub storage: Vec, - pub infusions: Vec<(i32, String)>, - pub gaitem_map: Vec, - pub projectile_list: EquipProjectileData, - pub gaitem_data: GaItemData, - pub bulk_items_selected: Vec>, - pub bulk_items_max_quantity: bool, - pub bulk_items_arrow_quantity: u32, - pub bulk_items_weapon_level: u32, - - // Used for unqeuipping weapon or armor - pub unarmed: InventoryItemViewModel, - pub naked_head: InventoryItemViewModel, - pub naked_body: InventoryItemViewModel, - pub naked_arms: InventoryItemViewModel, - pub naked_legs: InventoryItemViewModel, - - // Changed indicator - pub changed: bool, - - // Log - pub log: Vec, - - // Indexes for when adding items - next_gaitem_handle: u32, - part_gaitem_handle: u8, - next_aow_index: usize, - next_armament_or_armor_index: usize, -} - -impl InventoryViewModel { - pub fn from_save(slot:& SaveSlot) -> Self { - let mut inventory_vm = InventoryViewModel::default(); - inventory_vm.at_single_items = true; - inventory_vm.storage = vec![InventoryStorage::default(); 2]; - inventory_vm.replace_bulk_items_selected_map(InventoryTypeRoute::CommonItems); - - // Gaitem_map - inventory_vm.gaitem_map = slot.ga_items.clone(); - - // Gaitem_data - inventory_vm.gaitem_data = slot.ga_item_data.clone(); - - // Projectile list - inventory_vm.projectile_list = slot.equip_projectile_data.clone(); - - // Find the next gaitem_handle used when adding new weapon, armors or ashes of war - inventory_vm.gaitem_map.iter().enumerate().for_each(| (index, gaitem)| { - if (gaitem.gaitem_handle & 0xF0000000) == InventoryGaitemType::AOW as u32 { - inventory_vm.next_aow_index = index; - } - if (gaitem.gaitem_handle & 0xFFFF) > (inventory_vm.next_gaitem_handle) { - inventory_vm.next_gaitem_handle = gaitem.gaitem_handle & 0xFFFF; - inventory_vm.next_armament_or_armor_index = index; - } - }); - inventory_vm.part_gaitem_handle = ((inventory_vm.gaitem_map[0].gaitem_handle >> 16) & 0xFF) as u8; - - - inventory_vm.next_gaitem_handle = inventory_vm.next_gaitem_handle + 1; - inventory_vm.next_aow_index = inventory_vm.next_aow_index + 1; - inventory_vm.next_armament_or_armor_index = inventory_vm.next_armament_or_armor_index + 1; - - inventory_vm.fill_stroage_type(&slot.equip_inventory_data, slot.equip_inventory_data.next_acquisition_sort_id, slot.equip_inventory_data.next_equip_index,0); - inventory_vm.fill_stroage_type(&slot.storage_inventory_data, slot.storage_inventory_data.next_acquisition_sort_id, slot.storage_inventory_data.next_equip_index ,1); - - inventory_vm - } - - fn fill_stroage_type(&mut self, equip_inventory_data: &EquipInventoryData, next_acquisition_sort_id: u32, next_equip_index: u32, inventory_storage_index: usize) { - let inventory_storage = &mut self.storage[inventory_storage_index]; - - for (index, item) in equip_inventory_data.common_items.iter().enumerate() { - - // Determine item type from gaitem_handle - let inventory_gaitem_type = InventoryGaitemType::from(item.ga_item_handle & 0xf0000000); - - // Equip_index - let equip_index = (index as u32) + 0x180; - - match inventory_gaitem_type { - InventoryGaitemType::WEAPON => { - let gaitem = self.gaitem_map.iter().find(|gaitem| gaitem.gaitem_handle == item.ga_item_handle).unwrap(); - let inventory_item_vm = InventoryItemViewModel::from_save(&item, equip_index, &gaitem, InventoryGaitemType::WEAPON); - if inventory_item_vm.item_id == 110000 && self.unarmed.item_id != 110000 {self.unarmed = inventory_item_vm.clone();} - inventory_storage.common_items.push(inventory_item_vm.clone()); - inventory_storage.filtered_weapons.push(inventory_item_vm); - - }, - InventoryGaitemType::ARMOR => { - let gaitem = self.gaitem_map.iter().find(|gaitem| gaitem.gaitem_handle == item.ga_item_handle).unwrap(); - let inventory_item_vm = InventoryItemViewModel::from_save(&item, equip_index, &gaitem, InventoryGaitemType::ARMOR); - if inventory_item_vm.item_id == 10000 {self.naked_head = inventory_item_vm.clone();} - else if inventory_item_vm.item_id == 10100 {self.naked_body = inventory_item_vm.clone();} - else if inventory_item_vm.item_id == 10200 {self.naked_arms = inventory_item_vm.clone();} - else if inventory_item_vm.item_id == 10300 {self.naked_legs = inventory_item_vm.clone();} - inventory_storage.common_items.push(inventory_item_vm.clone()); - inventory_storage.filtered_armors.push( inventory_item_vm); - }, - InventoryGaitemType::ACCESSORY => { - let inventory_item_vm = InventoryItemViewModel::from_save(&item, equip_index, &GaItem::default(), InventoryGaitemType::ACCESSORY); - inventory_storage.common_items.push(inventory_item_vm.clone()); - inventory_storage.filtered_accessories.push( inventory_item_vm); - }, - InventoryGaitemType::ITEM => { - let inventory_item_vm = InventoryItemViewModel::from_save(&item, equip_index, &GaItem::default(), InventoryGaitemType::ITEM); - inventory_storage.common_items.push(inventory_item_vm.clone()); - inventory_storage.filtered_items.push( inventory_item_vm); - }, - InventoryGaitemType::AOW => { - let gaitem = self.gaitem_map.iter().find(|gaitem| gaitem.gaitem_handle == item.ga_item_handle).unwrap(); - let inventory_item_vm = InventoryItemViewModel::from_save(&item, equip_index, &gaitem, InventoryGaitemType::AOW); - inventory_storage.common_items.push(inventory_item_vm.clone()); - inventory_storage.filtered_aows.push( inventory_item_vm); - }, - InventoryGaitemType::EMPTY => { - inventory_storage.common_items.push(InventoryItemViewModel::default()); - }, - } - } - - for key_item in equip_inventory_data.key_items.iter() { - let inventory_item_vm = InventoryItemViewModel::from_save(key_item, 0, &GaItem::default(), InventoryGaitemType::ITEM); - inventory_storage.key_items.push(inventory_item_vm); - } - - inventory_storage.filtered_weapons.sort_by(|a, b| a.item_name.cmp(&b.item_name)); - inventory_storage.filtered_armors.sort_by(|a, b| a.item_name.cmp(&b.item_name)); - inventory_storage.filtered_accessories.sort_by(|a, b| a.item_name.cmp(&b.item_name)); - inventory_storage.filtered_items.sort_by(|a, b| a.item_name.cmp(&b.item_name)); - inventory_storage.filtered_key_items.sort_by(|a, b| a.item_name.cmp(&b.item_name)); - inventory_storage.filtered_aows.sort_by(|a, b| a.item_name.cmp(&b.item_name)); - - inventory_storage.common_item_count = equip_inventory_data.common_inventory_items_distinct_count; - inventory_storage.key_item_count = equip_inventory_data.key_inventory_items_distinct_count; - inventory_storage.next_acquisition_sort_order_index = next_acquisition_sort_id; - inventory_storage.next_equip_index = next_equip_index; - - } - - pub fn filter(&mut self) { - for inventory_storage in &mut self.storage { - inventory_storage.filtered_weapons = inventory_storage.common_items.iter() - .filter(|i | { - if i.r#type != InventoryGaitemType::WEAPON {return false;} - if self.filter_text.is_empty() { return true; } - let distance = sorensen_dice(&i.item_name.to_lowercase(), &self.filter_text.to_lowercase()); - distance > 0.3 - }).map(|i| i.clone()).collect(); - inventory_storage.filtered_armors = inventory_storage.common_items.iter() - .filter(|i | { - if i.r#type != InventoryGaitemType::ARMOR {return false;} - if self.filter_text.is_empty() { return true; } - let distance = sorensen_dice(&i.item_name.to_lowercase(), &self.filter_text.to_lowercase()); - distance > 0.3 - }).map(|i| i.clone()).collect(); - inventory_storage.filtered_accessories = inventory_storage.common_items.iter() - .filter(|i | { - if i.r#type != InventoryGaitemType::ACCESSORY {return false;} - if self.filter_text.is_empty() { return true; } - let distance = sorensen_dice(&i.item_name.to_lowercase(), &self.filter_text.to_lowercase()); - distance > 0.3 - }).map(|i| i.clone()).collect(); - inventory_storage.filtered_items = inventory_storage.common_items.iter() - .filter(|i | { - if i.r#type != InventoryGaitemType::ITEM {return false;} - if self.filter_text.is_empty() { return true; } - let distance = sorensen_dice(&i.item_name.to_lowercase(), &self.filter_text.to_lowercase()); - distance > 0.3 - }).map(|i| i.clone()).collect(); - inventory_storage.filtered_key_items = inventory_storage.key_items.iter() - .filter(|i | { - if i.quantity == 0 { return false; } - if self.filter_text.is_empty() { return true; } - let distance = sorensen_dice(&i.item_name.to_lowercase(), &self.filter_text.to_lowercase()); - distance > 0.3 - }).map(|i| i.clone()).collect(); - inventory_storage.filtered_aows = inventory_storage.common_items.iter() - .filter(|i | { - if i.r#type != InventoryGaitemType::AOW {return false;} - if self.filter_text.is_empty() { return true; } - let distance = sorensen_dice(&i.item_name.to_lowercase(), &self.filter_text.to_lowercase()); - distance > 0.3 - }).map(|i| i.clone()).collect(); - - inventory_storage.filtered_weapons.sort_by(|a, b| { - if self.filter_text.is_empty() {return a.item_name.cmp(&b.item_name);} - let distance_a = sorensen_dice(&a.item_name.to_lowercase(), &self.filter_text.to_lowercase()); - let distance_b = sorensen_dice(&b.item_name.to_lowercase(), &self.filter_text.to_lowercase()); - if distance_a < distance_b { return Ordering::Greater; } - else if distance_a > distance_b { return Ordering::Less; } - return Ordering::Equal; - }); - inventory_storage.filtered_armors.sort_by(|a, b| { - if self.filter_text.is_empty() {return a.item_name.cmp(&b.item_name);} - let distance_a = sorensen_dice(&a.item_name.to_lowercase(), &self.filter_text.to_lowercase()); - let distance_b = sorensen_dice(&b.item_name.to_lowercase(), &self.filter_text.to_lowercase()); - if distance_a < distance_b { return Ordering::Greater; } - else if distance_a > distance_b { return Ordering::Less; } - return Ordering::Equal; - }); - inventory_storage.filtered_accessories.sort_by(|a, b| { - if self.filter_text.is_empty() {return a.item_name.cmp(&b.item_name);} - let distance_a = sorensen_dice(&a.item_name.to_lowercase(), &self.filter_text.to_lowercase()); - let distance_b = sorensen_dice(&b.item_name.to_lowercase(), &self.filter_text.to_lowercase()); - if distance_a < distance_b { return Ordering::Greater; } - else if distance_a > distance_b { return Ordering::Less; } - return Ordering::Equal; - }); - inventory_storage.filtered_items.sort_by(|a, b| { - if self.filter_text.is_empty() {return a.item_name.cmp(&b.item_name);} - let distance_a = sorensen_dice(&a.item_name.to_lowercase(), &self.filter_text.to_lowercase()); - let distance_b = sorensen_dice(&b.item_name.to_lowercase(), &self.filter_text.to_lowercase()); - if distance_a < distance_b { return Ordering::Greater; } - else if distance_a > distance_b { return Ordering::Less; } - return Ordering::Equal; - }); - inventory_storage.filtered_key_items.sort_by(|a, b| { - if self.filter_text.is_empty() {return a.item_name.cmp(&b.item_name);} - let distance_a = sorensen_dice(&a.item_name.to_lowercase(), &self.filter_text.to_lowercase()); - let distance_b = sorensen_dice(&b.item_name.to_lowercase(), &self.filter_text.to_lowercase()); - if distance_a < distance_b { return Ordering::Greater; } - else if distance_a > distance_b { return Ordering::Less; } - return Ordering::Equal; - }); - inventory_storage.filtered_aows.sort_by(|a, b| { - if self.filter_text.is_empty() {return a.item_name.cmp(&b.item_name);} - let distance_a = sorensen_dice(&a.item_name.to_lowercase(), &self.filter_text.to_lowercase()); - let distance_b = sorensen_dice(&b.item_name.to_lowercase(), &self.filter_text.to_lowercase()); - if distance_a < distance_b { return Ordering::Greater; } - else if distance_a > distance_b { return Ordering::Less; } - return Ordering::Equal; - }); - } - } - - pub fn filter_with_subtype(&mut self) { - self.filter(); - match self.current_subtype_route { - InventorySubTypeRoute::None => {}, - InventorySubTypeRoute::WeaponLeft => { - self.current_type_route = InventoryTypeRoute::Weapons; - self.storage[0].filtered_weapons = self.storage[0].filtered_weapons - .iter() - .filter(|g| - Regulation::equip_weapon_params_map().get(&((g.item_id/100)*100)) - .is_some_and(|g| g.data.leftHandEquipable()) - ) - .map(|i| i.clone()) - .collect(); - }, - InventorySubTypeRoute::WeaponRight => { - self.current_type_route = InventoryTypeRoute::Weapons; - self.storage[0].filtered_weapons = self.storage[0].filtered_weapons - .iter() - .filter(|g| - Regulation::equip_weapon_params_map().get(&((g.item_id/100)*100)) - .is_some_and(|g| g.data.rightHandEquipable()) - ) - .map(|i| i.clone()) - .collect(); - }, - InventorySubTypeRoute::Head => { - self.current_type_route = InventoryTypeRoute::Armors; - self.storage[0].filtered_armors = self.storage[0].filtered_armors - .iter() - .filter(|g| - Regulation::equip_protectors_param_map().get(&g.item_id) - .is_some_and(|g| g.data.equipModelCategory == 5) - ) - .map(|i| i.clone()) - .collect(); - }, - InventorySubTypeRoute::Body => { - self.current_type_route = InventoryTypeRoute::Armors; - self.storage[0].filtered_armors = self.storage[0].filtered_armors - .iter() - .filter(|g| - Regulation::equip_protectors_param_map().get(&g.item_id) - .is_some_and(|g| g.data.equipModelCategory == 2) - ) - .map(|i| i.clone()) - .collect(); - }, - InventorySubTypeRoute::Arms => { - self.current_type_route = InventoryTypeRoute::Armors; - self.storage[0].filtered_armors = self.storage[0].filtered_armors - .iter() - .filter(|g| - Regulation::equip_protectors_param_map().get(&g.item_id) - .is_some_and(|g| g.data.equipModelCategory == 1) - ) - .map(|i| i.clone()) - .collect(); - }, - InventorySubTypeRoute::Legs => { - self.current_type_route = InventoryTypeRoute::Armors; - self.storage[0].filtered_armors = self.storage[0].filtered_armors - .iter() - .filter(|g| - Regulation::equip_protectors_param_map().get(&g.item_id) - .is_some_and(|g| g.data.equipModelCategory == 6) - ) - .map(|i| i.clone()) - .collect(); - }, - InventorySubTypeRoute::Arrow => { - self.current_type_route = InventoryTypeRoute::Weapons; - self.storage[0].filtered_weapons = self.storage[0].filtered_weapons - .iter() - .filter(|g| - Regulation::equip_weapon_params_map().get(&g.item_id) - .is_some_and(|g| WepType::from(g.data.wepType) == WepType::Arrow || WepType::from(g.data.wepType) == WepType::Greatarrow) - ) - .map(|i| i.clone()) - .collect(); - }, - InventorySubTypeRoute::Bolt => { - self.current_type_route = InventoryTypeRoute::Weapons; - self.storage[0].filtered_weapons = self.storage[0].filtered_weapons - .iter() - .filter(|g| - Regulation::equip_weapon_params_map().get(&g.item_id) - .is_some_and(|g| WepType::from(g.data.wepType) == WepType::Bolt || WepType::from(g.data.wepType) == WepType::BallistaBolt) - ) - .map(|i| i.clone()) - .collect(); - }, - InventorySubTypeRoute::Talisman => { - self.current_type_route = InventoryTypeRoute::Talismans; - }, - InventorySubTypeRoute::QuickItem | - InventorySubTypeRoute::Pouch => { - self.current_type_route = InventoryTypeRoute::CommonItems; - self.storage[0].filtered_items = self.storage[0].filtered_items - .iter() - .filter(|g| - Regulation::equip_goods_param_map().get(&g.item_id) - .is_some_and(|g| GoodsType::from(g.data.goodsType) == GoodsType::NormalItem) - ) - .map(|i| i.clone()) - .collect(); - }, - } - } -} - -// Splitting up inventory into multiple files -mod add_single; -mod add_bulk; \ No newline at end of file +pub(crate) mod add; +pub(crate) mod browse; +pub(crate) mod inventory; diff --git a/src/vm/inventory/add_bulk.rs b/src/vm/inventory_old/add_bulk.rs similarity index 100% rename from src/vm/inventory/add_bulk.rs rename to src/vm/inventory_old/add_bulk.rs diff --git a/src/vm/inventory/add_single.rs b/src/vm/inventory_old/add_single.rs similarity index 100% rename from src/vm/inventory/add_single.rs rename to src/vm/inventory_old/add_single.rs diff --git a/src/vm/inventory_old/mod.rs b/src/vm/inventory_old/mod.rs new file mode 100644 index 0000000..16f72d7 --- /dev/null +++ b/src/vm/inventory_old/mod.rs @@ -0,0 +1,886 @@ +use std::{cmp::Ordering, collections::HashMap}; +use strsim::sorensen_dice; + +use crate::{ + db::{ + accessory_name::accessory_name::ACCESSORY_NAME, aow_name::aow_name::AOW_NAME, + armor_name::armor_name::ARMOR_NAME, item_name::item_name::ITEM_NAME, + weapon_name::weapon_name::WEAPON_NAME, + }, + save::common::save_slot::{ + EquipInventoryData, EquipInventoryItem, EquipProjectileData, GaItem, GaItemData, SaveSlot, + }, + util::regulation::Regulation, + vm::regulation::regulation_view_model::WepType, +}; + +use super::regulation::regulation_view_model::GoodsType; + +#[derive(Default, Clone)] +pub enum InventoryRoute { + #[default] + None, + Add, + Browse, +} + +#[derive(Default, Clone)] +pub enum InventoryTypeRoute { + #[default] + CommonItems, + KeyItems, + Weapons, + Armors, + AshOfWar, + Talismans, +} + +#[derive(Default, PartialEq, Clone)] +pub enum InventorySubTypeRoute { + #[default] + None, + WeaponLeft, + WeaponRight, + Head, + Body, + Arms, + Legs, + Arrow, + Bolt, + Talisman, + QuickItem, + Pouch, +} + +#[derive(PartialEq, Clone, Default, Copy)] +pub enum InventoryItemType { + #[default] + None = -1, + WEAPON = 0x0, + ARMOR = 0x10000000, + ACCESSORY = 0x20000000, + ITEM = 0x40000000, + AOW = 0x80000000, +} +impl From for InventoryItemType { + fn from(value: u8) -> Self { + match value { + 0x0 => InventoryItemType::WEAPON, + 0x10 => InventoryItemType::ARMOR, + 0x20 => InventoryItemType::ACCESSORY, + 0x40 => InventoryItemType::ITEM, + 0x80 => InventoryItemType::AOW, + _ => InventoryItemType::None, + } + } +} +impl ToString for InventoryItemType { + fn to_string(&self) -> String { + match self { + InventoryItemType::None => format!("None"), + InventoryItemType::WEAPON => format!("WEAPON"), + InventoryItemType::ARMOR => format!("ARMOR"), + InventoryItemType::ACCESSORY => format!("ACCESSORY"), + InventoryItemType::ITEM => format!("ITEM"), + InventoryItemType::AOW => format!("AOW"), + } + } +} + +#[derive(Default, Clone, PartialEq)] +pub enum InventoryGaitemType { + #[default] + EMPTY = -1, + WEAPON = 0x80000000, + ARMOR = 0x90000000, + ACCESSORY = 0xa0000000, + ITEM = 0xb0000000, + AOW = 0xc0000000, +} +impl From for InventoryGaitemType { + fn from(value: u32) -> Self { + match value { + x if x == InventoryGaitemType::WEAPON as u32 => InventoryGaitemType::WEAPON, + x if x == InventoryGaitemType::ARMOR as u32 => InventoryGaitemType::ARMOR, + x if x == InventoryGaitemType::ACCESSORY as u32 => InventoryGaitemType::ACCESSORY, + x if x == InventoryGaitemType::ITEM as u32 => InventoryGaitemType::ITEM, + x if x == InventoryGaitemType::AOW as u32 => InventoryGaitemType::AOW, + _ => InventoryGaitemType::EMPTY, + } + } +} + +#[derive(Default, Clone)] +pub struct InventoryItemViewModel { + pub ga_item_handle: u32, + pub item_id: u32, + pub item_name: String, + pub quantity: u32, + pub inventory_index: u32, + pub equip_index: u32, + pub r#type: InventoryGaitemType, +} + +impl InventoryItemViewModel { + pub fn from_save( + item_info: &EquipInventoryItem, + equip_index: u32, + gaitem: &GaItem, + gaitem_type: InventoryGaitemType, + ) -> Self { + let gaitem_handle = item_info.ga_item_handle; + let item_type_specific = match gaitem_type { + InventoryGaitemType::WEAPON => { + let id = (gaitem.item_id / 100) * 100; + let upgrade_level = gaitem.item_id % 100; + ( + gaitem.item_id, + match WEAPON_NAME.lock().unwrap().get(&id) { + Some(name) => { + if !name.is_empty() { + if upgrade_level > 0 { + format!("{} +{}", name, upgrade_level) + } else { + name.to_string() + } + } else { + format!("[UNKOWN_{}]", id) + } + } + None => format!("[UNKOWN_{}]", id), + }, + ) + } + InventoryGaitemType::ARMOR => { + let id = gaitem.item_id ^ InventoryItemType::ARMOR as u32; + ( + id, + match ARMOR_NAME.lock().unwrap().get(&id) { + Some(name) => { + if !name.is_empty() { + name.to_string() + } else { + format!("[UNKOWN_{}]", id) + } + } + None => format!("[UNKOWN_{}]", id), + }, + ) + } + InventoryGaitemType::ACCESSORY => { + let id = gaitem_handle ^ InventoryGaitemType::ACCESSORY as u32; + ( + id, + match ACCESSORY_NAME.lock().unwrap().get(&id) { + Some(name) => { + if !name.is_empty() { + name.to_string() + } else { + format!("[UNKOWN_{}]", id) + } + } + None => format!("[UNKOWN_{}]", id), + }, + ) + } + InventoryGaitemType::ITEM => { + let id = gaitem_handle ^ InventoryGaitemType::ITEM as u32; + ( + id, + match ITEM_NAME.lock().unwrap().get(&id) { + Some(name) => { + if !name.is_empty() { + name.to_string() + } else { + format!("[UNKOWN_{}]", id) + } + } + None => format!("[UNKOWN_{}]", id), + }, + ) + } + InventoryGaitemType::AOW => { + let id = gaitem.item_id ^ InventoryItemType::AOW as u32; + ( + id, + match AOW_NAME.lock().unwrap().get(&id) { + Some(name) => { + if !name.is_empty() { + name.to_string() + } else { + format!("[UNKOWN_{}]", id) + } + } + None => format!("[UNKOWN_{}]", id), + }, + ) + } + InventoryGaitemType::EMPTY => panic!("We shouldn't reach this!"), + }; + + Self { + ga_item_handle: item_info.ga_item_handle, + item_id: item_type_specific.0, + item_name: item_type_specific.1, + quantity: item_info.quantity, + inventory_index: item_info.inventory_index, + equip_index: equip_index, + r#type: gaitem_type, + } + } +} + +#[derive(Default, Clone)] +pub struct InventoryStorage { + pub common_items: Vec, + pub key_items: Vec, + + pub filtered_items: Vec, + pub filtered_key_items: Vec, + pub filtered_weapons: Vec, + pub filtered_armors: Vec, + pub filtered_aows: Vec, + pub filtered_accessories: Vec, + + pub common_item_count: u32, + pub key_item_count: u32, + pub next_acquisition_sort_order_index: u32, + pub next_equip_index: u32, +} + +#[derive(Default, Clone)] +pub struct InventoryViewModel { + // Navigation + pub at_storage_box: bool, + pub at_single_items: bool, + pub current_route: InventoryRoute, + pub current_type_route: InventoryTypeRoute, + pub current_bulk_type_route: InventoryTypeRoute, + pub current_subtype_route: InventorySubTypeRoute, + + // Data + pub filter_text: String, + pub storage: Vec, + pub gaitem_map: Vec, + pub projectile_list: EquipProjectileData, + pub gaitem_data: GaItemData, + pub bulk_items_selected: Vec>, + pub bulk_items_max_quantity: bool, + pub bulk_items_arrow_quantity: u32, + pub bulk_items_weapon_level: u32, + + // Used for unqeuipping weapon or armor + pub unarmed: InventoryItemViewModel, + pub naked_head: InventoryItemViewModel, + pub naked_body: InventoryItemViewModel, + pub naked_arms: InventoryItemViewModel, + pub naked_legs: InventoryItemViewModel, + + // Changed indicator + pub changed: bool, + + // Log + pub log: Vec, + + // Indexes for when adding items + next_gaitem_handle: u32, + part_gaitem_handle: u8, + next_aow_index: usize, + next_armament_or_armor_index: usize, +} + +impl InventoryViewModel { + pub fn from_save(slot: &SaveSlot) -> Self { + let mut inventory_vm = InventoryViewModel::default(); + inventory_vm.at_single_items = true; + inventory_vm.storage = vec![InventoryStorage::default(); 2]; + inventory_vm.replace_bulk_items_selected_map(InventoryTypeRoute::CommonItems); + + // Gaitem_map + inventory_vm.gaitem_map = slot.ga_items.clone(); + + // Gaitem_data + inventory_vm.gaitem_data = slot.ga_item_data.clone(); + + // Projectile list + inventory_vm.projectile_list = slot.equip_projectile_data.clone(); + + // Find the next gaitem_handle used when adding new weapon, armors or ashes of war + inventory_vm + .gaitem_map + .iter() + .enumerate() + .for_each(|(index, gaitem)| { + if (gaitem.gaitem_handle & 0xF0000000) == InventoryGaitemType::AOW as u32 { + inventory_vm.next_aow_index = index; + } + if (gaitem.gaitem_handle & 0xFFFF) > (inventory_vm.next_gaitem_handle) { + inventory_vm.next_gaitem_handle = gaitem.gaitem_handle & 0xFFFF; + inventory_vm.next_armament_or_armor_index = index; + } + }); + inventory_vm.part_gaitem_handle = + ((inventory_vm.gaitem_map[0].gaitem_handle >> 16) & 0xFF) as u8; + + inventory_vm.next_gaitem_handle = inventory_vm.next_gaitem_handle + 1; + inventory_vm.next_aow_index = inventory_vm.next_aow_index + 1; + inventory_vm.next_armament_or_armor_index = inventory_vm.next_armament_or_armor_index + 1; + + inventory_vm.fill_stroage_type( + &slot.equip_inventory_data, + slot.equip_inventory_data.next_acquisition_sort_id, + slot.equip_inventory_data.next_equip_index, + 0, + ); + inventory_vm.fill_stroage_type( + &slot.storage_inventory_data, + slot.storage_inventory_data.next_acquisition_sort_id, + slot.storage_inventory_data.next_equip_index, + 1, + ); + + inventory_vm + } + + fn fill_stroage_type( + &mut self, + equip_inventory_data: &EquipInventoryData, + next_acquisition_sort_id: u32, + next_equip_index: u32, + inventory_storage_index: usize, + ) { + let inventory_storage = &mut self.storage[inventory_storage_index]; + + for (index, item) in equip_inventory_data.common_items.iter().enumerate() { + // Determine item type from gaitem_handle + let inventory_gaitem_type = InventoryGaitemType::from(item.ga_item_handle & 0xf0000000); + + // Equip_index + let equip_index = (index as u32) + 0x180; + + match inventory_gaitem_type { + InventoryGaitemType::WEAPON => { + let gaitem = self + .gaitem_map + .iter() + .find(|gaitem| gaitem.gaitem_handle == item.ga_item_handle) + .unwrap(); + let inventory_item_vm = InventoryItemViewModel::from_save( + &item, + equip_index, + &gaitem, + InventoryGaitemType::WEAPON, + ); + if inventory_item_vm.item_id == 110000 && self.unarmed.item_id != 110000 { + self.unarmed = inventory_item_vm.clone(); + } + inventory_storage + .common_items + .push(inventory_item_vm.clone()); + inventory_storage.filtered_weapons.push(inventory_item_vm); + } + InventoryGaitemType::ARMOR => { + let gaitem = self + .gaitem_map + .iter() + .find(|gaitem| gaitem.gaitem_handle == item.ga_item_handle) + .unwrap(); + let inventory_item_vm = InventoryItemViewModel::from_save( + &item, + equip_index, + &gaitem, + InventoryGaitemType::ARMOR, + ); + if inventory_item_vm.item_id == 10000 { + self.naked_head = inventory_item_vm.clone(); + } else if inventory_item_vm.item_id == 10100 { + self.naked_body = inventory_item_vm.clone(); + } else if inventory_item_vm.item_id == 10200 { + self.naked_arms = inventory_item_vm.clone(); + } else if inventory_item_vm.item_id == 10300 { + self.naked_legs = inventory_item_vm.clone(); + } + inventory_storage + .common_items + .push(inventory_item_vm.clone()); + inventory_storage.filtered_armors.push(inventory_item_vm); + } + InventoryGaitemType::ACCESSORY => { + let inventory_item_vm = InventoryItemViewModel::from_save( + &item, + equip_index, + &GaItem::default(), + InventoryGaitemType::ACCESSORY, + ); + inventory_storage + .common_items + .push(inventory_item_vm.clone()); + inventory_storage + .filtered_accessories + .push(inventory_item_vm); + } + InventoryGaitemType::ITEM => { + let inventory_item_vm = InventoryItemViewModel::from_save( + &item, + equip_index, + &GaItem::default(), + InventoryGaitemType::ITEM, + ); + inventory_storage + .common_items + .push(inventory_item_vm.clone()); + inventory_storage.filtered_items.push(inventory_item_vm); + } + InventoryGaitemType::AOW => { + let gaitem = self + .gaitem_map + .iter() + .find(|gaitem| gaitem.gaitem_handle == item.ga_item_handle) + .unwrap(); + let inventory_item_vm = InventoryItemViewModel::from_save( + &item, + equip_index, + &gaitem, + InventoryGaitemType::AOW, + ); + inventory_storage + .common_items + .push(inventory_item_vm.clone()); + inventory_storage.filtered_aows.push(inventory_item_vm); + } + InventoryGaitemType::EMPTY => { + inventory_storage + .common_items + .push(InventoryItemViewModel::default()); + } + } + } + + for key_item in equip_inventory_data.key_items.iter() { + let inventory_item_vm = InventoryItemViewModel::from_save( + key_item, + 0, + &GaItem::default(), + InventoryGaitemType::ITEM, + ); + inventory_storage.key_items.push(inventory_item_vm); + } + + inventory_storage + .filtered_weapons + .sort_by(|a, b| a.item_name.cmp(&b.item_name)); + inventory_storage + .filtered_armors + .sort_by(|a, b| a.item_name.cmp(&b.item_name)); + inventory_storage + .filtered_accessories + .sort_by(|a, b| a.item_name.cmp(&b.item_name)); + inventory_storage + .filtered_items + .sort_by(|a, b| a.item_name.cmp(&b.item_name)); + inventory_storage + .filtered_key_items + .sort_by(|a, b| a.item_name.cmp(&b.item_name)); + inventory_storage + .filtered_aows + .sort_by(|a, b| a.item_name.cmp(&b.item_name)); + + inventory_storage.common_item_count = + equip_inventory_data.common_inventory_items_distinct_count; + inventory_storage.key_item_count = equip_inventory_data.key_inventory_items_distinct_count; + inventory_storage.next_acquisition_sort_order_index = next_acquisition_sort_id; + inventory_storage.next_equip_index = next_equip_index; + } + + pub fn filter(&mut self) { + for inventory_storage in &mut self.storage { + inventory_storage.filtered_weapons = inventory_storage + .common_items + .iter() + .filter(|i| { + if i.r#type != InventoryGaitemType::WEAPON { + return false; + } + if self.filter_text.is_empty() { + return true; + } + let distance = sorensen_dice( + &i.item_name.to_lowercase(), + &self.filter_text.to_lowercase(), + ); + distance > 0.3 + }) + .map(|i| i.clone()) + .collect(); + inventory_storage.filtered_armors = inventory_storage + .common_items + .iter() + .filter(|i| { + if i.r#type != InventoryGaitemType::ARMOR { + return false; + } + if self.filter_text.is_empty() { + return true; + } + let distance = sorensen_dice( + &i.item_name.to_lowercase(), + &self.filter_text.to_lowercase(), + ); + distance > 0.3 + }) + .map(|i| i.clone()) + .collect(); + inventory_storage.filtered_accessories = inventory_storage + .common_items + .iter() + .filter(|i| { + if i.r#type != InventoryGaitemType::ACCESSORY { + return false; + } + if self.filter_text.is_empty() { + return true; + } + let distance = sorensen_dice( + &i.item_name.to_lowercase(), + &self.filter_text.to_lowercase(), + ); + distance > 0.3 + }) + .map(|i| i.clone()) + .collect(); + inventory_storage.filtered_items = inventory_storage + .common_items + .iter() + .filter(|i| { + if i.r#type != InventoryGaitemType::ITEM { + return false; + } + if self.filter_text.is_empty() { + return true; + } + let distance = sorensen_dice( + &i.item_name.to_lowercase(), + &self.filter_text.to_lowercase(), + ); + distance > 0.3 + }) + .map(|i| i.clone()) + .collect(); + inventory_storage.filtered_key_items = inventory_storage + .key_items + .iter() + .filter(|i| { + if i.quantity == 0 { + return false; + } + if self.filter_text.is_empty() { + return true; + } + let distance = sorensen_dice( + &i.item_name.to_lowercase(), + &self.filter_text.to_lowercase(), + ); + distance > 0.3 + }) + .map(|i| i.clone()) + .collect(); + inventory_storage.filtered_aows = inventory_storage + .common_items + .iter() + .filter(|i| { + if i.r#type != InventoryGaitemType::AOW { + return false; + } + if self.filter_text.is_empty() { + return true; + } + let distance = sorensen_dice( + &i.item_name.to_lowercase(), + &self.filter_text.to_lowercase(), + ); + distance > 0.3 + }) + .map(|i| i.clone()) + .collect(); + + inventory_storage.filtered_weapons.sort_by(|a, b| { + if self.filter_text.is_empty() { + return a.item_name.cmp(&b.item_name); + } + let distance_a = sorensen_dice( + &a.item_name.to_lowercase(), + &self.filter_text.to_lowercase(), + ); + let distance_b = sorensen_dice( + &b.item_name.to_lowercase(), + &self.filter_text.to_lowercase(), + ); + if distance_a < distance_b { + return Ordering::Greater; + } else if distance_a > distance_b { + return Ordering::Less; + } + return Ordering::Equal; + }); + inventory_storage.filtered_armors.sort_by(|a, b| { + if self.filter_text.is_empty() { + return a.item_name.cmp(&b.item_name); + } + let distance_a = sorensen_dice( + &a.item_name.to_lowercase(), + &self.filter_text.to_lowercase(), + ); + let distance_b = sorensen_dice( + &b.item_name.to_lowercase(), + &self.filter_text.to_lowercase(), + ); + if distance_a < distance_b { + return Ordering::Greater; + } else if distance_a > distance_b { + return Ordering::Less; + } + return Ordering::Equal; + }); + inventory_storage.filtered_accessories.sort_by(|a, b| { + if self.filter_text.is_empty() { + return a.item_name.cmp(&b.item_name); + } + let distance_a = sorensen_dice( + &a.item_name.to_lowercase(), + &self.filter_text.to_lowercase(), + ); + let distance_b = sorensen_dice( + &b.item_name.to_lowercase(), + &self.filter_text.to_lowercase(), + ); + if distance_a < distance_b { + return Ordering::Greater; + } else if distance_a > distance_b { + return Ordering::Less; + } + return Ordering::Equal; + }); + inventory_storage.filtered_items.sort_by(|a, b| { + if self.filter_text.is_empty() { + return a.item_name.cmp(&b.item_name); + } + let distance_a = sorensen_dice( + &a.item_name.to_lowercase(), + &self.filter_text.to_lowercase(), + ); + let distance_b = sorensen_dice( + &b.item_name.to_lowercase(), + &self.filter_text.to_lowercase(), + ); + if distance_a < distance_b { + return Ordering::Greater; + } else if distance_a > distance_b { + return Ordering::Less; + } + return Ordering::Equal; + }); + inventory_storage.filtered_key_items.sort_by(|a, b| { + if self.filter_text.is_empty() { + return a.item_name.cmp(&b.item_name); + } + let distance_a = sorensen_dice( + &a.item_name.to_lowercase(), + &self.filter_text.to_lowercase(), + ); + let distance_b = sorensen_dice( + &b.item_name.to_lowercase(), + &self.filter_text.to_lowercase(), + ); + if distance_a < distance_b { + return Ordering::Greater; + } else if distance_a > distance_b { + return Ordering::Less; + } + return Ordering::Equal; + }); + inventory_storage.filtered_aows.sort_by(|a, b| { + if self.filter_text.is_empty() { + return a.item_name.cmp(&b.item_name); + } + let distance_a = sorensen_dice( + &a.item_name.to_lowercase(), + &self.filter_text.to_lowercase(), + ); + let distance_b = sorensen_dice( + &b.item_name.to_lowercase(), + &self.filter_text.to_lowercase(), + ); + if distance_a < distance_b { + return Ordering::Greater; + } else if distance_a > distance_b { + return Ordering::Less; + } + return Ordering::Equal; + }); + } + } + + pub fn filter_with_subtype(&mut self) { + self.filter(); + match self.current_subtype_route { + InventorySubTypeRoute::None => {} + InventorySubTypeRoute::WeaponLeft => { + self.current_type_route = InventoryTypeRoute::Weapons; + self.storage[0].filtered_weapons = self.storage[0] + .filtered_weapons + .iter() + .filter(|g| { + Regulation::equip_weapon_params_map() + .get(&((g.item_id / 100) * 100)) + .is_some_and(|g| g.data.leftHandEquipable()) + }) + .map(|i| i.clone()) + .collect(); + } + InventorySubTypeRoute::WeaponRight => { + self.current_type_route = InventoryTypeRoute::Weapons; + self.storage[0].filtered_weapons = self.storage[0] + .filtered_weapons + .iter() + .filter(|g| { + Regulation::equip_weapon_params_map() + .get(&((g.item_id / 100) * 100)) + .is_some_and(|g| g.data.rightHandEquipable()) + }) + .map(|i| i.clone()) + .collect(); + } + InventorySubTypeRoute::Head => { + self.current_type_route = InventoryTypeRoute::Armors; + self.storage[0].filtered_armors = self.storage[0] + .filtered_armors + .iter() + .filter(|g| { + Regulation::equip_protectors_param_map() + .get(&g.item_id) + .is_some_and(|g| g.data.equipModelCategory == 5) + }) + .map(|i| i.clone()) + .collect(); + } + InventorySubTypeRoute::Body => { + self.current_type_route = InventoryTypeRoute::Armors; + self.storage[0].filtered_armors = self.storage[0] + .filtered_armors + .iter() + .filter(|g| { + Regulation::equip_protectors_param_map() + .get(&g.item_id) + .is_some_and(|g| g.data.equipModelCategory == 2) + }) + .map(|i| i.clone()) + .collect(); + } + InventorySubTypeRoute::Arms => { + self.current_type_route = InventoryTypeRoute::Armors; + self.storage[0].filtered_armors = self.storage[0] + .filtered_armors + .iter() + .filter(|g| { + Regulation::equip_protectors_param_map() + .get(&g.item_id) + .is_some_and(|g| g.data.equipModelCategory == 1) + }) + .map(|i| i.clone()) + .collect(); + } + InventorySubTypeRoute::Legs => { + self.current_type_route = InventoryTypeRoute::Armors; + self.storage[0].filtered_armors = self.storage[0] + .filtered_armors + .iter() + .filter(|g| { + Regulation::equip_protectors_param_map() + .get(&g.item_id) + .is_some_and(|g| g.data.equipModelCategory == 6) + }) + .map(|i| i.clone()) + .collect(); + } + InventorySubTypeRoute::Arrow => { + self.current_type_route = InventoryTypeRoute::Weapons; + self.storage[0].filtered_weapons = self.storage[0] + .filtered_weapons + .iter() + .filter(|g| { + Regulation::equip_weapon_params_map() + .get(&g.item_id) + .is_some_and(|g| { + WepType::from(g.data.wepType) == WepType::Arrow + || WepType::from(g.data.wepType) == WepType::Greatarrow + }) + }) + .map(|i| i.clone()) + .collect(); + } + InventorySubTypeRoute::Bolt => { + self.current_type_route = InventoryTypeRoute::Weapons; + self.storage[0].filtered_weapons = self.storage[0] + .filtered_weapons + .iter() + .filter(|g| { + Regulation::equip_weapon_params_map() + .get(&g.item_id) + .is_some_and(|g| { + WepType::from(g.data.wepType) == WepType::Bolt + || WepType::from(g.data.wepType) == WepType::BallistaBolt + }) + }) + .map(|i| i.clone()) + .collect(); + } + InventorySubTypeRoute::Talisman => { + self.current_type_route = InventoryTypeRoute::Talismans; + } + InventorySubTypeRoute::QuickItem | InventorySubTypeRoute::Pouch => { + self.current_type_route = InventoryTypeRoute::CommonItems; + self.storage[0].filtered_items = self.storage[0] + .filtered_items + .iter() + .filter(|g| { + Regulation::equip_goods_param_map() + .get(&g.item_id) + .is_some_and(|g| { + GoodsType::from(g.data.goodsType) == GoodsType::NormalItem + }) + }) + .map(|i| i.clone()) + .collect(); + } + } + } +} + +// Splitting up inventory into multiple files +mod add_bulk; +mod add_single; + +/* + let mut weaponId: u32 = 3180725; + + let uVar:u32 = 0xffffffff; + + if weaponId & 0xf0000000 == 0 { + let mut uVar2: u32 = 0xffffffff; + + if weaponId & uVar != uVar { + uVar2 = weaponId & uVar; + println!("uVar2: {:x}", uVar2); + } + + let mut uVar5: u32 = 0xffffffff; + + if weaponId >> 0x1c != 0xf { + uVar5 = weaponId >> 0x1c; + println!("uVar5: {:x}", uVar5); + } + + weaponId = (uVar2 / 10000) * 10000 & 0xfffffff | uVar5 << 0x1c; + println!("WeaponId: {}", weaponId); + } +*/ diff --git a/src/vm/mod.rs b/src/vm/mod.rs index 51bcd86..1cf31f5 100644 --- a/src/vm/mod.rs +++ b/src/vm/mod.rs @@ -1,11 +1,12 @@ -mod profile_summary; -mod slot; -pub mod general; -pub mod stats; +// pub mod equipment; pub mod events; +pub mod general; +pub mod importer; pub mod inventory; +pub mod notifications; +// mod profile_summary; pub mod regions; -pub mod importer; +// pub mod regulation; +mod character; +pub mod stats; pub mod vm; -pub mod regulation; -pub mod equipment; \ No newline at end of file diff --git a/src/vm/notifications.rs b/src/vm/notifications.rs new file mode 100644 index 0000000..f30dae2 --- /dev/null +++ b/src/vm/notifications.rs @@ -0,0 +1,55 @@ +use std::sync::RwLock; + +use eframe::egui::Context; + +use crate::vm::vm::ViewModel; + +#[allow(unused)] +#[derive(Default, Clone)] +pub enum NotificationType { + #[default] + Info, + Success, + Warning, + Error, +} + +pub static NOTIFICATIONS: RwLock> = RwLock::new(Vec::new()); + +type NotificationCallback = fn(ctx: &Context, vm: &mut ViewModel) -> (); +type NotificationCallbacks = Vec<(String, NotificationCallback)>; + +#[allow(unused)] +pub(crate) enum NotificationButtons> { + None, + Button((S, NotificationCallback)), + Group(Vec<(S, NotificationCallback)>), +} + +#[derive(Default, Clone)] +pub(crate) struct Notification { + pub notification_type: NotificationType, + pub text: String, + pub buttons: NotificationCallbacks, +} + +impl Notification { + pub(crate) fn new( + notification_type: NotificationType, + text: impl Into, + buttons: NotificationButtons>, + ) -> Self { + Notification { + notification_type, + text: text.into(), + buttons: match buttons { + NotificationButtons::None => Vec::new(), + NotificationButtons::Button(button) => vec![(button.0.into(), button.1)], + NotificationButtons::Group(buttons) => buttons + .into_iter() + .map(|(button_text, callback)| (button_text.into(), callback)) + .collect(), + }, + } + } +} diff --git a/src/vm/profile_summary.rs b/src/vm/profile_summary.rs index fe92f1d..af70a5b 100644 --- a/src/vm/profile_summary.rs +++ b/src/vm/profile_summary.rs @@ -1,7 +1,7 @@ pub mod slot_view_model { use crate::save::common::user_data_10::ProfileSummary; - + #[allow(unused)] #[derive(Clone)] pub struct ProfileSummaryViewModel { pub active: bool, diff --git a/src/vm/regions.rs b/src/vm/regions.rs index 763caf6..df28a09 100644 --- a/src/vm/regions.rs +++ b/src/vm/regions.rs @@ -1,44 +1,64 @@ -pub mod regions_view_model { - use std::collections::BTreeMap; +use std::collections::BTreeMap; - use crate::{db::{map_name::map_name::MapName, regions::regions::{Region, ID_TO_REGION, REGIONS}}, save::common::save_slot::SaveSlot}; +use er_save_lib::SaveApi; - #[derive(Clone)] - pub struct RegionsViewModel { - pub region_groups: BTreeMap>, - pub regions: BTreeMap, // (on/off, is_open_world, is_dungeon, is_boss) - } +use crate::db::{map_name::MapName, regions::Region}; + +#[derive(Clone)] +pub struct RegionsViewModel { + pub region_groups: BTreeMap>, + pub regions: BTreeMap, // (on/off, is_open_world, is_dungeon, is_boss) +} + +impl Default for RegionsViewModel { + fn default() -> Self { + let mut region_groups: BTreeMap> = Region::regions() + .iter() + .map(|r| (r.1 .2, Vec::new())) + .collect(); + let mut regions: BTreeMap = BTreeMap::new(); - impl Default for RegionsViewModel { - fn default() -> Self { - let mut region_groups: BTreeMap> = REGIONS.lock().unwrap().iter().map(|r| (r.1.2, Vec::new())).collect(); - let mut regions: BTreeMap = BTreeMap::new(); + for (region, (_, _, map, is_open_world, is_dungeon, is_boss)) in Region::regions().iter() { + regions.insert(*region, (false, *is_open_world, *is_dungeon, *is_boss)); - for (region, (_,_, map, is_open_world, is_dungeon, is_boss)) in REGIONS.lock().unwrap().iter() { - regions.insert(*region, (false, *is_open_world, *is_dungeon, *is_boss)); - region_groups.get_mut(&map).expect("").push(*region); - region_groups.get_mut(&map).expect("").sort(); + if let Some(region_groups) = region_groups.get_mut(&map) { + region_groups.push(*region); + region_groups.sort(); } + } - Self { region_groups, regions } + Self { + region_groups, + regions, } } +} + +impl RegionsViewModel { + pub fn from_save(index: usize, save_api: &SaveApi) -> Self { + let mut regions_vm = RegionsViewModel::default(); - impl RegionsViewModel { - pub fn from_save(slot:& SaveSlot) -> Self { - let mut regions_vm = RegionsViewModel::default(); - - for i in 0..slot.regions.unlocked_regions_count { - let key = &slot.regions.unlocked_regions[i as usize]; - let is_invadeable_region = ID_TO_REGION.lock().unwrap().contains_key(key); - - if is_invadeable_region { - let region = ID_TO_REGION.lock().unwrap()[key]; - regions_vm.regions.get_mut(®ion).expect("").0 = true; + let res = save_api.regions(index); + + match res { + Ok(regions) => { + for region in regions { + let invadeable_region = Region::from(*region); + + if invadeable_region != Region::NonInvadeableRegion { + if let Some((is_on, _, _, _)) = + regions_vm.regions.get_mut(&invadeable_region) + { + *is_on = true; + } + } } } - - regions_vm + Err(err) => { + eprintln!("{err}"); + } } + + regions_vm } -} \ No newline at end of file +} diff --git a/src/vm/regulation.rs b/src/vm/regulation.rs index 49c8211..437b508 100644 --- a/src/vm/regulation.rs +++ b/src/vm/regulation.rs @@ -1,456 +1,437 @@ -pub mod regulation_view_model { - use std::cmp::Ordering; - use strsim::sorensen_dice; - use crate::{util::regulation::Regulation, vm::inventory::{InventoryItemType, InventoryTypeRoute}}; - +use crate::{ + util::regulation::Regulation, + vm::inventory::{InventoryItemType, InventoryTypeRoute}, +}; +use std::cmp::Ordering; +use strsim::sorensen_dice; - #[derive(Clone, PartialEq)] - pub enum ProtectorCategory { - Head, - Body, - Arms, - Legs, - Hair, - } - impl TryFrom for ProtectorCategory { - type Error = String; - fn try_from(value: u8) -> Result { - match value { - 0 => Ok(ProtectorCategory::Head), - 1 => Ok(ProtectorCategory::Body), - 2 => Ok(ProtectorCategory::Arms), - 3 => Ok(ProtectorCategory::Legs), - 4 => Ok(ProtectorCategory::Hair), - _ => Err(format!("Cannot recognize protector category {}", value)) - } +#[derive(Clone, PartialEq)] +pub enum ProtectorCategory { + Head, + Body, + Arms, + Legs, + Hair, +} +impl TryFrom for ProtectorCategory { + type Error = String; + fn try_from(value: u8) -> Result { + match value { + 0 => Ok(ProtectorCategory::Head), + 1 => Ok(ProtectorCategory::Body), + 2 => Ok(ProtectorCategory::Arms), + 3 => Ok(ProtectorCategory::Legs), + 4 => Ok(ProtectorCategory::Hair), + _ => Err(format!("Cannot recognize protector category {}", value)), } - } - - #[derive(Clone, Default, PartialEq)] - pub enum WepType { - - #[default] None = 0, - Dagger = 1, - StraightSword = 3, - Greatsword = 5, - ColossalSword = 7, - CurvedSword = 9, - CurvedGreatsword = 11, - Katana = 13, - Twinblade = 14, - ThrustingSword = 15, - HeavyThrustingSword = 16, - Axe = 17, - Greataxe = 19, - Hammer = 21, - GreatHammer = 23, - Flail = 24, - Spear = 25, - HeavySpear = 28, - Halberd = 29, - Scythe = 31, - Fist = 35, - Claw = 37, - Whip = 39, - ColossalWeapon = 41, - LightBow = 50, - Bow = 51, - Greatbow = 53, - Crossbow = 55, - Ballista = 56, - Staff = 57, - Seal = 61, - SmallShield = 65, - MediumShield = 67, - Greatshield = 69, - Arrow = 81, - Greatarrow = 83, - Bolt = 85, - BallistaBolt = 86, - Torch = 87, - Unknown = 99 } - impl From for WepType { - fn from(value: i16) -> Self { - match value { - 0 => WepType::None, - 1 => WepType::Dagger, - 3 => WepType::StraightSword, - 5 => WepType::Greatsword, - 7 => WepType::ColossalSword, - 9 => WepType::CurvedSword, - 11 => WepType::CurvedGreatsword, - 13 => WepType::Katana, - 14 => WepType::Twinblade, - 15 => WepType::ThrustingSword, - 16 => WepType::HeavyThrustingSword, - 17 => WepType::Axe, - 19 => WepType::Greataxe, - 21 => WepType::Hammer, - 23 => WepType::GreatHammer, - 24 => WepType::Flail, - 25 => WepType::Spear, - 28 => WepType::HeavySpear, - 29 => WepType::Halberd, - 31 => WepType::Scythe, - 35 => WepType::Fist, - 37 => WepType::Claw, - 39 => WepType::Whip, - 41 => WepType::ColossalWeapon, - 50 => WepType::LightBow, - 51 => WepType::Bow, - 53 => WepType::Greatbow, - 55 => WepType::Crossbow, - 56 => WepType::Ballista, - 57 => WepType::Staff, - 61 => WepType::Seal, - 65 => WepType::SmallShield, - 67 => WepType::MediumShield, - 69 => WepType::Greatshield, - 81 => WepType::Arrow, - 83 => WepType::Greatarrow, - 85 => WepType::Bolt, - 86 => WepType::BallistaBolt, - 87 => WepType::Torch, - _ => WepType::Unknown - } +} + +#[derive(Clone, Default, PartialEq)] +pub enum WepType { + #[default] + None = 0, + Dagger = 1, + StraightSword = 3, + Greatsword = 5, + ColossalSword = 7, + CurvedSword = 9, + CurvedGreatsword = 11, + Katana = 13, + Twinblade = 14, + ThrustingSword = 15, + HeavyThrustingSword = 16, + Axe = 17, + Greataxe = 19, + Hammer = 21, + GreatHammer = 23, + Flail = 24, + Spear = 25, + HeavySpear = 28, + Halberd = 29, + Scythe = 31, + Fist = 35, + Claw = 37, + Whip = 39, + ColossalWeapon = 41, + LightBow = 50, + Bow = 51, + Greatbow = 53, + Crossbow = 55, + Ballista = 56, + Staff = 57, + Seal = 61, + SmallShield = 65, + MediumShield = 67, + Greatshield = 69, + Arrow = 81, + Greatarrow = 83, + Bolt = 85, + BallistaBolt = 86, + Torch = 87, + Unknown = 99, +} +impl From for WepType { + fn from(value: i16) -> Self { + match value { + 0 => WepType::None, + 1 => WepType::Dagger, + 3 => WepType::StraightSword, + 5 => WepType::Greatsword, + 7 => WepType::ColossalSword, + 9 => WepType::CurvedSword, + 11 => WepType::CurvedGreatsword, + 13 => WepType::Katana, + 14 => WepType::Twinblade, + 15 => WepType::ThrustingSword, + 16 => WepType::HeavyThrustingSword, + 17 => WepType::Axe, + 19 => WepType::Greataxe, + 21 => WepType::Hammer, + 23 => WepType::GreatHammer, + 24 => WepType::Flail, + 25 => WepType::Spear, + 28 => WepType::HeavySpear, + 29 => WepType::Halberd, + 31 => WepType::Scythe, + 35 => WepType::Fist, + 37 => WepType::Claw, + 39 => WepType::Whip, + 41 => WepType::ColossalWeapon, + 50 => WepType::LightBow, + 51 => WepType::Bow, + 53 => WepType::Greatbow, + 55 => WepType::Crossbow, + 56 => WepType::Ballista, + 57 => WepType::Staff, + 61 => WepType::Seal, + 65 => WepType::SmallShield, + 67 => WepType::MediumShield, + 69 => WepType::Greatshield, + 81 => WepType::Arrow, + 83 => WepType::Greatarrow, + 85 => WepType::Bolt, + 86 => WepType::BallistaBolt, + 87 => WepType::Torch, + _ => WepType::Unknown, } } +} - #[derive(Copy, Clone, Default)] - pub enum Affinity { - #[default]Standard = 0, - Heavy = 100, - Keen = 200, - Quality = 300, - Fire = 400, - FlameArt = 500, - Lightning = 600, - Sacred = 700, - Magic = 800, - Cold = 900, - Poison = 1000, - Blood = 1100, - Occult = 1200, - Unused13, - Unused14, - Unused15, - Unused16, - Unused17, - Unused18, - Unused19, - Unused20, - Unused21, - Unused22, - Unused23, +#[derive(Copy, Clone, Default)] +pub enum Affinity { + #[default] + Standard = 0, + Heavy = 100, + Keen = 200, + Quality = 300, + Fire = 400, + FlameArt = 500, + Lightning = 600, + Sacred = 700, + Magic = 800, + Cold = 900, + Poison = 1000, + Blood = 1100, + Occult = 1200, + Unused13, + Unused14, + Unused15, + Unused16, + Unused17, + Unused18, + Unused19, + Unused20, + Unused21, + Unused22, + Unused23, +} +impl Affinity { + pub fn as_i16(&self) -> i16 { + *self as i16 } - impl Affinity { - pub fn as_i16(&self) -> i16 { - *self as i16 - } - } - impl ToString for Affinity { - fn to_string(&self) -> String { - match self { - Affinity::Standard => "Standard".to_string(), - Affinity::Heavy => "Heavy".to_string(), - Affinity::Keen => "Keen".to_string(), - Affinity::Quality => "Quality".to_string(), - Affinity::Fire => "Fire".to_string(), - Affinity::FlameArt => "FlameArt".to_string(), - Affinity::Lightning => "Lightning".to_string(), - Affinity::Sacred => "Sacred".to_string(), - Affinity::Magic => "Magic".to_string(), - Affinity::Cold => "Cold".to_string(), - Affinity::Poison => "Poison".to_string(), - Affinity::Blood => "Blood".to_string(), - Affinity::Occult => "Occult".to_string(), - Affinity::Unused13 => "Unused13".to_string(), - Affinity::Unused14 => "Unused14".to_string(), - Affinity::Unused15 => "Unused15".to_string(), - Affinity::Unused16 => "Unused16".to_string(), - Affinity::Unused17 => "Unused17".to_string(), - Affinity::Unused18 => "Unused18".to_string(), - Affinity::Unused19 => "Unused19".to_string(), - Affinity::Unused20 => "Unused20".to_string(), - Affinity::Unused21 => "Unused21".to_string(), - Affinity::Unused22 => "Unused22".to_string(), - Affinity::Unused23 => "Unused23".to_string(), - } +} +impl ToString for Affinity { + fn to_string(&self) -> String { + match self { + Affinity::Standard => "Standard".to_string(), + Affinity::Heavy => "Heavy".to_string(), + Affinity::Keen => "Keen".to_string(), + Affinity::Quality => "Quality".to_string(), + Affinity::Fire => "Fire".to_string(), + Affinity::FlameArt => "FlameArt".to_string(), + Affinity::Lightning => "Lightning".to_string(), + Affinity::Sacred => "Sacred".to_string(), + Affinity::Magic => "Magic".to_string(), + Affinity::Cold => "Cold".to_string(), + Affinity::Poison => "Poison".to_string(), + Affinity::Blood => "Blood".to_string(), + Affinity::Occult => "Occult".to_string(), + Affinity::Unused13 => "Unused13".to_string(), + Affinity::Unused14 => "Unused14".to_string(), + Affinity::Unused15 => "Unused15".to_string(), + Affinity::Unused16 => "Unused16".to_string(), + Affinity::Unused17 => "Unused17".to_string(), + Affinity::Unused18 => "Unused18".to_string(), + Affinity::Unused19 => "Unused19".to_string(), + Affinity::Unused20 => "Unused20".to_string(), + Affinity::Unused21 => "Unused21".to_string(), + Affinity::Unused22 => "Unused22".to_string(), + Affinity::Unused23 => "Unused23".to_string(), } } +} - #[derive(PartialEq, Copy, Clone)] - pub enum GoodsType { - NormalItem, - KeyItem, - CraftingMaterial, - Rememberance, - Sorcery = 5, - SpiritSummonLesser = 7, - SpiritSummonGreater, - WonderousPhysics, - WonderousPhysicsTears, - RegenerativeMaterial, - InfoItem, - ReinforcementMaterial = 14, - GreatRune, - Incantation, - SelfBuffSorcery, - SelfBuffIncanation, - Unknown - } - impl From for GoodsType { - fn from(value: u8) -> Self { - match value { - 0 => GoodsType::NormalItem, - 1 => GoodsType::KeyItem, - 2 => GoodsType::CraftingMaterial, - 3 => GoodsType::Rememberance, - 5 => GoodsType::Sorcery, - 7 => GoodsType::SpiritSummonLesser, - 8 => GoodsType::SpiritSummonGreater, - 9 => GoodsType::WonderousPhysics, - 10 => GoodsType::WonderousPhysicsTears, - 11 => GoodsType::RegenerativeMaterial, - 12 => GoodsType::InfoItem, - 14 => GoodsType::ReinforcementMaterial, - 15 => GoodsType::GreatRune, - 16 => GoodsType::Incantation, - 17 => GoodsType::SelfBuffSorcery, - 18 => GoodsType::SelfBuffIncanation, - _ => GoodsType::Unknown - } +#[derive(PartialEq, Copy, Clone)] +pub enum GoodsType { + NormalItem, + KeyItem, + CraftingMaterial, + Rememberance, + Sorcery = 5, + SpiritSummonLesser = 7, + SpiritSummonGreater, + WonderousPhysics, + WonderousPhysicsTears, + RegenerativeMaterial, + InfoItem, + ReinforcementMaterial = 14, + GreatRune, + Incantation, + SelfBuffSorcery, + SelfBuffIncanation, + Unknown, +} +impl From for GoodsType { + fn from(value: u8) -> Self { + match value { + 0 => GoodsType::NormalItem, + 1 => GoodsType::KeyItem, + 2 => GoodsType::CraftingMaterial, + 3 => GoodsType::Rememberance, + 5 => GoodsType::Sorcery, + 7 => GoodsType::SpiritSummonLesser, + 8 => GoodsType::SpiritSummonGreater, + 9 => GoodsType::WonderousPhysics, + 10 => GoodsType::WonderousPhysicsTears, + 11 => GoodsType::RegenerativeMaterial, + 12 => GoodsType::InfoItem, + 14 => GoodsType::ReinforcementMaterial, + 15 => GoodsType::GreatRune, + 16 => GoodsType::Incantation, + 17 => GoodsType::SelfBuffSorcery, + 18 => GoodsType::SelfBuffIncanation, + _ => GoodsType::Unknown, } } - - #[derive(Default, Clone)] - pub struct RegulationItemViewModel { - pub id: u32, - pub name: String, - pub max_held: i16, - pub max_storage: i16, - pub infusable: bool, - pub is_key_item: bool, - pub item_type: InventoryItemType, - pub wep_type: Option, - pub quantity: Option, - pub upgrade: Option, - pub infusion: Option, - pub affinity: Option, - } +} - #[derive(Default, Clone)] - pub struct RegulationViewModel { - pub filtered_goods: Vec, - pub filtered_weapons: Vec, - pub filtered_protectors: Vec, - pub filtered_gems: Vec, - pub filtered_accessories: Vec, +#[allow(unused)] +#[derive(Default, Clone)] +pub struct RegulationItemViewModel { + pub id: u32, + pub name: String, + pub max_held: i16, + pub max_storage: i16, + pub infusable: bool, + pub is_key_item: bool, + pub item_type: InventoryItemType, + pub wep_type: Option, + pub quantity: Option, + pub upgrade: Option, + pub infusion: Option, + pub affinity: Option, +} - pub selected_item: RegulationItemViewModel, +#[derive(Default, Clone)] +pub struct RegulationViewModel { + pub filtered_goods: Vec, + pub filtered_weapons: Vec, + pub filtered_protectors: Vec, + pub filtered_gems: Vec, + pub filtered_accessories: Vec, - pub selected_infusion: usize, - pub available_infusions: Vec, + pub selected_item: RegulationItemViewModel, - pub selected_affinity: usize, - pub available_affinities: Vec, - } + pub selected_infusion: usize, + pub available_infusions: Vec, - impl RegulationViewModel { - pub fn update_available_infusions(&mut self){ - self.selected_infusion = 0; - self.available_infusions.clear(); - self.available_infusions.push(RegulationItemViewModel{ - id: u32::MAX, - name: "-".to_string(), - ..Default::default() - }); - if self.selected_item.wep_type.is_none() || !self.selected_item.infusable { - return; - } + pub selected_affinity: usize, + pub available_affinities: Vec, +} - let wep_type = self.selected_item.wep_type.as_ref(); - self.available_infusions.extend(Regulation::equip_gem_param_map() - .iter() - .filter(|(_, gem)|{ - match wep_type.unwrap() { - WepType::Dagger => { - gem.data.canMountWep_Dagger() - }, - WepType::StraightSword => { - gem.data.canMountWep_SwordNormal() - }, - WepType::Greatsword => { - gem.data.canMountWep_SwordLarge() - }, - WepType::ColossalSword => { - gem.data.canMountWep_SwordGigantic() - }, - WepType::CurvedSword => { - gem.data.canMountWep_SaberNormal() - }, - WepType::CurvedGreatsword => { - gem.data.canMountWep_SaberLarge() - }, - WepType::Katana => { - gem.data.canMountWep_katana() - }, - WepType::Twinblade => { - gem.data.canMountWep_SwordDoubleEdge() - }, - WepType::ThrustingSword => { - gem.data.canMountWep_SwordPierce() - }, - WepType::HeavyThrustingSword => { - gem.data.canMountWep_RapierHeavy() - }, - WepType::Axe => { - gem.data.canMountWep_AxeNormal() - }, - WepType::Greataxe => { - gem.data.canMountWep_AxeLarge() - }, - WepType::Hammer => { - gem.data.canMountWep_HammerNormal() - }, - WepType::GreatHammer => { - gem.data.canMountWep_HammerLarge() - }, - WepType::Flail => { - gem.data.canMountWep_Flail() - }, - WepType::Spear => { - gem.data.canMountWep_SpearNormal() - }, - WepType::HeavySpear => { - gem.data.canMountWep_SpearHeavy() - }, - WepType::Halberd => { - gem.data.canMountWep_SpearAxe() - }, - WepType::Scythe => { - gem.data.canMountWep_Sickle() - }, - WepType::Fist => { - gem.data.canMountWep_Knuckle() - }, - WepType::Claw => { - gem.data.canMountWep_Claw() - }, - WepType::Whip => { - gem.data.canMountWep_Whip() - }, - WepType::ColossalWeapon => { - gem.data.canMountWep_AxhammerLarge() - }, - WepType::LightBow => { - gem.data.canMountWep_BowSmall() - }, - WepType::Bow => { - gem.data.canMountWep_BowNormal() - }, - WepType::Greatbow => { - gem.data.canMountWep_BowLarge() - }, - WepType::Crossbow => { - gem.data.canMountWep_ClossBow() - }, - WepType::Ballista => { - gem.data.canMountWep_Ballista() - }, - WepType::Staff => { - gem.data.canMountWep_Staff() - }, - WepType::Seal => { - gem.data.canMountWep_Talisman() - }, - WepType::SmallShield => { - gem.data.canMountWep_ShieldSmall() - }, - WepType::MediumShield => { - gem.data.canMountWep_ShieldNormal() - }, - WepType::Greatshield => { - gem.data.canMountWep_ShieldLarge() - }, - WepType::Torch => { - gem.data.canMountWep_Torch() - }, - WepType::None | - WepType::Arrow | - WepType::Greatarrow | - WepType::Bolt | - WepType::BallistaBolt | - WepType::Unknown => { - false - }, - } - }) - .map(|(_, gem)| RegulationItemViewModel{ - id: gem.id, - name: gem.name.to_string(), - max_held: 1, - max_storage: 1, - ..Default::default() - }).filter(|gem|{ - gem.id > 10000 - }).collect::>()); +impl RegulationViewModel { + pub fn update_available_infusions(&mut self) { + self.selected_infusion = 0; + self.available_infusions.clear(); + self.available_infusions.push(RegulationItemViewModel { + id: u32::MAX, + name: "-".to_string(), + ..Default::default() + }); + if self.selected_item.wep_type.is_none() || !self.selected_item.infusable { + return; } - pub fn update_available_affinities(&mut self) { - self.available_affinities.clear(); - self.selected_affinity = 0; - if self.available_infusions.len() == 0 { - return; + let wep_type = self.selected_item.wep_type.as_ref(); + self.available_infusions.extend( + Regulation::equip_gem_param_map() + .iter() + .filter(|(_, gem)| match wep_type.unwrap() { + WepType::Dagger => gem.data.canMountWep_Dagger(), + WepType::StraightSword => gem.data.canMountWep_SwordNormal(), + WepType::Greatsword => gem.data.canMountWep_SwordLarge(), + WepType::ColossalSword => gem.data.canMountWep_SwordGigantic(), + WepType::CurvedSword => gem.data.canMountWep_SaberNormal(), + WepType::CurvedGreatsword => gem.data.canMountWep_SaberLarge(), + WepType::Katana => gem.data.canMountWep_katana(), + WepType::Twinblade => gem.data.canMountWep_SwordDoubleEdge(), + WepType::ThrustingSword => gem.data.canMountWep_SwordPierce(), + WepType::HeavyThrustingSword => gem.data.canMountWep_RapierHeavy(), + WepType::Axe => gem.data.canMountWep_AxeNormal(), + WepType::Greataxe => gem.data.canMountWep_AxeLarge(), + WepType::Hammer => gem.data.canMountWep_HammerNormal(), + WepType::GreatHammer => gem.data.canMountWep_HammerLarge(), + WepType::Flail => gem.data.canMountWep_Flail(), + WepType::Spear => gem.data.canMountWep_SpearNormal(), + WepType::HeavySpear => gem.data.canMountWep_SpearHeavy(), + WepType::Halberd => gem.data.canMountWep_SpearAxe(), + WepType::Scythe => gem.data.canMountWep_Sickle(), + WepType::Fist => gem.data.canMountWep_Knuckle(), + WepType::Claw => gem.data.canMountWep_Claw(), + WepType::Whip => gem.data.canMountWep_Whip(), + WepType::ColossalWeapon => gem.data.canMountWep_AxhammerLarge(), + WepType::LightBow => gem.data.canMountWep_BowSmall(), + WepType::Bow => gem.data.canMountWep_BowNormal(), + WepType::Greatbow => gem.data.canMountWep_BowLarge(), + WepType::Crossbow => gem.data.canMountWep_ClossBow(), + WepType::Ballista => gem.data.canMountWep_Ballista(), + WepType::Staff => gem.data.canMountWep_Staff(), + WepType::Seal => gem.data.canMountWep_Talisman(), + WepType::SmallShield => gem.data.canMountWep_ShieldSmall(), + WepType::MediumShield => gem.data.canMountWep_ShieldNormal(), + WepType::Greatshield => gem.data.canMountWep_ShieldLarge(), + WepType::Torch => gem.data.canMountWep_Torch(), + WepType::None + | WepType::Arrow + | WepType::Greatarrow + | WepType::Bolt + | WepType::BallistaBolt + | WepType::Unknown => false, + }) + .map(|(_, gem)| RegulationItemViewModel { + id: gem.id, + name: gem.name.to_string(), + max_held: 1, + max_storage: 1, + ..Default::default() + }) + .filter(|gem| gem.id > 10000) + .collect::>(), + ); + } + + pub fn update_available_affinities(&mut self) { + self.available_affinities.clear(); + self.selected_affinity = 0; + if self.available_infusions.len() == 0 { + return; + } + let res = Regulation::equip_gem_param_map() + .get(&self.available_infusions[self.selected_infusion].id); + if res.is_some() { + let gem = res.unwrap(); + if gem.data.configurableWepAttr00() { + self.available_affinities.push(Affinity::Standard); + } + if gem.data.configurableWepAttr01() { + self.available_affinities.push(Affinity::Heavy); + } + if gem.data.configurableWepAttr02() { + self.available_affinities.push(Affinity::Keen); + } + if gem.data.configurableWepAttr03() { + self.available_affinities.push(Affinity::Quality); + } + if gem.data.configurableWepAttr04() { + self.available_affinities.push(Affinity::Fire); + } + if gem.data.configurableWepAttr05() { + self.available_affinities.push(Affinity::FlameArt); + } + if gem.data.configurableWepAttr06() { + self.available_affinities.push(Affinity::Lightning); + } + if gem.data.configurableWepAttr07() { + self.available_affinities.push(Affinity::Sacred); + } + if gem.data.configurableWepAttr08() { + self.available_affinities.push(Affinity::Magic); + } + if gem.data.configurableWepAttr09() { + self.available_affinities.push(Affinity::Cold); + } + if gem.data.configurableWepAttr10() { + self.available_affinities.push(Affinity::Poison); + } + if gem.data.configurableWepAttr11() { + self.available_affinities.push(Affinity::Blood); + } + if gem.data.configurableWepAttr12() { + self.available_affinities.push(Affinity::Occult); + } + if gem.data.configurableWepAttr13() { + self.available_affinities.push(Affinity::Unused13); } - let res = Regulation::equip_gem_param_map().get(&self.available_infusions[self.selected_infusion].id); - if res.is_some() { - let gem = res.unwrap(); - if gem.data.configurableWepAttr00() {self.available_affinities.push(Affinity::Standard);} - if gem.data.configurableWepAttr01() {self.available_affinities.push(Affinity::Heavy);} - if gem.data.configurableWepAttr02() {self.available_affinities.push(Affinity::Keen);} - if gem.data.configurableWepAttr03() {self.available_affinities.push(Affinity::Quality);} - if gem.data.configurableWepAttr04() {self.available_affinities.push(Affinity::Fire);} - if gem.data.configurableWepAttr05() {self.available_affinities.push(Affinity::FlameArt);} - if gem.data.configurableWepAttr06() {self.available_affinities.push(Affinity::Lightning);} - if gem.data.configurableWepAttr07() {self.available_affinities.push(Affinity::Sacred);} - if gem.data.configurableWepAttr08() {self.available_affinities.push(Affinity::Magic);} - if gem.data.configurableWepAttr09() {self.available_affinities.push(Affinity::Cold);} - if gem.data.configurableWepAttr10() {self.available_affinities.push(Affinity::Poison);} - if gem.data.configurableWepAttr11() {self.available_affinities.push(Affinity::Blood);} - if gem.data.configurableWepAttr12() {self.available_affinities.push(Affinity::Occult);} - if gem.data.configurableWepAttr13() {self.available_affinities.push(Affinity::Unused13);} - if gem.data.configurableWepAttr14() {self.available_affinities.push(Affinity::Unused14);} - if gem.data.configurableWepAttr15() {self.available_affinities.push(Affinity::Unused15);} - if gem.data.configurableWepAttr16() {self.available_affinities.push(Affinity::Unused16);} - if gem.data.configurableWepAttr17() {self.available_affinities.push(Affinity::Unused17);} - if gem.data.configurableWepAttr18() {self.available_affinities.push(Affinity::Unused18);} - if gem.data.configurableWepAttr19() {self.available_affinities.push(Affinity::Unused19);} - if gem.data.configurableWepAttr20() {self.available_affinities.push(Affinity::Unused20);} - if gem.data.configurableWepAttr21() {self.available_affinities.push(Affinity::Unused21);} - if gem.data.configurableWepAttr22() {self.available_affinities.push(Affinity::Unused22);} - if gem.data.configurableWepAttr23() {self.available_affinities.push(Affinity::Unused23);} + if gem.data.configurableWepAttr14() { + self.available_affinities.push(Affinity::Unused14); + } + if gem.data.configurableWepAttr15() { + self.available_affinities.push(Affinity::Unused15); + } + if gem.data.configurableWepAttr16() { + self.available_affinities.push(Affinity::Unused16); + } + if gem.data.configurableWepAttr17() { + self.available_affinities.push(Affinity::Unused17); + } + if gem.data.configurableWepAttr18() { + self.available_affinities.push(Affinity::Unused18); + } + if gem.data.configurableWepAttr19() { + self.available_affinities.push(Affinity::Unused19); + } + if gem.data.configurableWepAttr20() { + self.available_affinities.push(Affinity::Unused20); + } + if gem.data.configurableWepAttr21() { + self.available_affinities.push(Affinity::Unused21); + } + if gem.data.configurableWepAttr22() { + self.available_affinities.push(Affinity::Unused22); + } + if gem.data.configurableWepAttr23() { + self.available_affinities.push(Affinity::Unused23); } } + } - pub fn filter(&mut self, inventory_type: &InventoryTypeRoute, filter_text: &str) { - match inventory_type { - InventoryTypeRoute::KeyItems | - InventoryTypeRoute::CommonItems => { - // Compiling a list of item replacement ids to avoid showing double items such as, tarnished furled finger + used tarnished furled finger. - let replacement_items = Regulation::equip_goods_param_map() + pub fn filter(&mut self, inventory_type: &InventoryTypeRoute, filter_text: &str) { + match inventory_type { + InventoryTypeRoute::KeyItems | InventoryTypeRoute::CommonItems => { + // Compiling a list of item replacement ids to avoid showing double items such as, tarnished furled finger + used tarnished furled finger. + let replacement_items = Regulation::equip_goods_param_map() .iter() .filter(|(_, good)| good.data.appearanceReplaceItemId != -1) .map(|(_, good)| good.data.appearanceReplaceItemId as u32) .collect::>(); - - self.filtered_goods = Regulation::equip_goods_param_map() + + self.filtered_goods = Regulation::equip_goods_param_map() .iter() .filter(|(_, good)| good.data.goodsUseAnim != 254) .filter(|(_, good)| good.id < 1001 || good.id > 1025) .filter(|(_, good)| good.id < 1051 || good.id > 1075) - .map(|(_, good)| RegulationItemViewModel{ + .map(|(_, good)| RegulationItemViewModel { id: good.id, name: good.name.to_string(), max_held: good.data.maxNum, @@ -460,33 +441,41 @@ pub mod regulation_view_model { is_key_item: GoodsType::from(good.data.goodsType) == GoodsType::KeyItem, item_type: InventoryItemType::ITEM, ..Default::default() - }).filter(|reg_item_vm|{ - if filter_text.is_empty() { return true; } - let distance = sorensen_dice(®_item_vm.name.to_lowercase(), &filter_text.to_lowercase()); - distance > 0.3 - }).filter(|reg_item_vm|{ - !replacement_items.contains(®_item_vm.id) }) - .filter(|reg_item_vm| - reg_item_vm.id > 9100 || reg_item_vm.id < 9000 - ) - .collect::>(); - - self.filtered_goods.sort_by(|a,b| { + .filter(|reg_item_vm| { if filter_text.is_empty() { - return a.name.cmp(&b.name); + return true; } - let distance_a = sorensen_dice(&a.name.to_lowercase(), &filter_text.to_lowercase()); - let distance_b = sorensen_dice(&b.name.to_lowercase(), &filter_text.to_lowercase()); - if distance_a < distance_b { return Ordering::Greater; } - else if distance_a > distance_b { return Ordering::Less; } - return Ordering::Equal; + let distance = sorensen_dice( + ®_item_vm.name.to_lowercase(), + &filter_text.to_lowercase(), + ); + distance > 0.3 }) - }, - InventoryTypeRoute::Weapons => { - self.filtered_weapons = Regulation::equip_weapon_params_map() + .filter(|reg_item_vm| !replacement_items.contains(®_item_vm.id)) + .filter(|reg_item_vm| reg_item_vm.id > 9100 || reg_item_vm.id < 9000) + .collect::>(); + + self.filtered_goods.sort_by(|a, b| { + if filter_text.is_empty() { + return a.name.cmp(&b.name); + } + let distance_a = + sorensen_dice(&a.name.to_lowercase(), &filter_text.to_lowercase()); + let distance_b = + sorensen_dice(&b.name.to_lowercase(), &filter_text.to_lowercase()); + if distance_a < distance_b { + return Ordering::Greater; + } else if distance_a > distance_b { + return Ordering::Less; + } + return Ordering::Equal; + }) + } + InventoryTypeRoute::Weapons => { + self.filtered_weapons = Regulation::equip_weapon_params_map() .iter() - .map(|(_,weapon)| RegulationItemViewModel{ + .map(|(_, weapon)| RegulationItemViewModel { id: weapon.id, name: weapon.name.to_string(), max_held: 1, @@ -495,118 +484,163 @@ pub mod regulation_view_model { item_type: InventoryItemType::WEAPON, upgrade: Some(0), wep_type: Some(WepType::from(weapon.data.wepType)), - quantity: if WepType::from(weapon.data.wepType) == WepType::Arrow - || WepType::from(weapon.data.wepType) == WepType::Greatarrow - || WepType::from(weapon.data.wepType) == WepType::Bolt - || WepType::from(weapon.data.wepType) == WepType::BallistaBolt { + quantity: if WepType::from(weapon.data.wepType) == WepType::Arrow + || WepType::from(weapon.data.wepType) == WepType::Greatarrow + || WepType::from(weapon.data.wepType) == WepType::Bolt + || WepType::from(weapon.data.wepType) == WepType::BallistaBolt + { Some(weapon.data.maxArrowQuantity as i16) - } else {None}, + } else { + None + }, ..Default::default() - }).filter(|i|{ - if filter_text.is_empty() { return true; } - let distance = sorensen_dice(&i.name.to_lowercase(), &filter_text.to_lowercase()); - distance > 0.3 - }).filter(|i|{ - i.id % 10_000 == 0 - }).collect::>(); - - self.filtered_weapons.sort_by(|a,b| { + }) + .filter(|i| { if filter_text.is_empty() { - return a.name.cmp(&b.name); + return true; } - let distance_a = sorensen_dice(&a.name.to_lowercase(), &filter_text.to_lowercase()); - let distance_b = sorensen_dice(&b.name.to_lowercase(), &filter_text.to_lowercase()); - if distance_a < distance_b { return Ordering::Greater; } - else if distance_a > distance_b { return Ordering::Less; } - return Ordering::Equal; + let distance = + sorensen_dice(&i.name.to_lowercase(), &filter_text.to_lowercase()); + distance > 0.3 }) - }, - InventoryTypeRoute::Armors => { - self.filtered_protectors = Regulation::equip_protectors_param_map() + .filter(|i| i.id % 10_000 == 0) + .collect::>(); + + self.filtered_weapons.sort_by(|a, b| { + if filter_text.is_empty() { + return a.name.cmp(&b.name); + } + let distance_a = + sorensen_dice(&a.name.to_lowercase(), &filter_text.to_lowercase()); + let distance_b = + sorensen_dice(&b.name.to_lowercase(), &filter_text.to_lowercase()); + if distance_a < distance_b { + return Ordering::Greater; + } else if distance_a > distance_b { + return Ordering::Less; + } + return Ordering::Equal; + }) + } + InventoryTypeRoute::Armors => { + self.filtered_protectors = Regulation::equip_protectors_param_map() .iter() - .map(|(_, protector)| RegulationItemViewModel{ + .map(|(_, protector)| RegulationItemViewModel { id: protector.id, name: protector.name.to_string(), max_held: 1, max_storage: 1, item_type: InventoryItemType::ARMOR, ..Default::default() - }).filter(|reg_item_vm|{ - if filter_text.is_empty() { return true; } - let distance = sorensen_dice(®_item_vm.name.to_lowercase(), &filter_text.to_lowercase()); - distance > 0.3 - }).filter(|reg_item_vm|{ - reg_item_vm.id > 40000 - }).collect::>(); - - self.filtered_protectors.sort_by(|a,b| { + }) + .filter(|reg_item_vm| { if filter_text.is_empty() { - return a.name.cmp(&b.name); + return true; } - let distance_a = sorensen_dice(&a.name.to_lowercase(), &filter_text.to_lowercase()); - let distance_b = sorensen_dice(&b.name.to_lowercase(), &filter_text.to_lowercase()); - if distance_a < distance_b { return Ordering::Greater; } - else if distance_a > distance_b { return Ordering::Less; } - return Ordering::Equal; + let distance = sorensen_dice( + ®_item_vm.name.to_lowercase(), + &filter_text.to_lowercase(), + ); + distance > 0.3 }) - }, - InventoryTypeRoute::AshOfWar => { - self.filtered_gems = Regulation::equip_gem_param_map() + .filter(|reg_item_vm| reg_item_vm.id > 40000) + .collect::>(); + + self.filtered_protectors.sort_by(|a, b| { + if filter_text.is_empty() { + return a.name.cmp(&b.name); + } + let distance_a = + sorensen_dice(&a.name.to_lowercase(), &filter_text.to_lowercase()); + let distance_b = + sorensen_dice(&b.name.to_lowercase(), &filter_text.to_lowercase()); + if distance_a < distance_b { + return Ordering::Greater; + } else if distance_a > distance_b { + return Ordering::Less; + } + return Ordering::Equal; + }) + } + InventoryTypeRoute::AshOfWar => { + self.filtered_gems = Regulation::equip_gem_param_map() .iter() - .map(|(_, gem)| RegulationItemViewModel{ + .map(|(_, gem)| RegulationItemViewModel { id: gem.id, name: gem.name.to_string(), max_held: 1, max_storage: 1, item_type: InventoryItemType::AOW, ..Default::default() - }).filter(|reg_item_vm|{ - if filter_text.is_empty() { return true; } - let distance = sorensen_dice(®_item_vm.name.to_lowercase(), &filter_text.to_lowercase()); - distance > 0.3 - }).filter(|reg_item_vm|{ - reg_item_vm.id > 10000 - }).collect::>(); - - self.filtered_gems.sort_by(|a,b| { + }) + .filter(|reg_item_vm| { if filter_text.is_empty() { - return a.name.cmp(&b.name); + return true; } - let distance_a = sorensen_dice(&a.name.to_lowercase(), &filter_text.to_lowercase()); - let distance_b = sorensen_dice(&b.name.to_lowercase(), &filter_text.to_lowercase()); - if distance_a < distance_b { return Ordering::Greater; } - else if distance_a > distance_b { return Ordering::Less; } - return Ordering::Equal; + let distance = sorensen_dice( + ®_item_vm.name.to_lowercase(), + &filter_text.to_lowercase(), + ); + distance > 0.3 }) - }, - InventoryTypeRoute::Talismans => { - self.filtered_accessories = Regulation::equip_accessory_param_map() + .filter(|reg_item_vm| reg_item_vm.id > 10000) + .collect::>(); + + self.filtered_gems.sort_by(|a, b| { + if filter_text.is_empty() { + return a.name.cmp(&b.name); + } + let distance_a = + sorensen_dice(&a.name.to_lowercase(), &filter_text.to_lowercase()); + let distance_b = + sorensen_dice(&b.name.to_lowercase(), &filter_text.to_lowercase()); + if distance_a < distance_b { + return Ordering::Greater; + } else if distance_a > distance_b { + return Ordering::Less; + } + return Ordering::Equal; + }) + } + InventoryTypeRoute::Talismans => { + self.filtered_accessories = Regulation::equip_accessory_param_map() .iter() - .map(|(_, accessory)| RegulationItemViewModel{ + .map(|(_, accessory)| RegulationItemViewModel { id: accessory.id, name: accessory.name.to_string(), max_held: 1, max_storage: 1, item_type: InventoryItemType::ACCESSORY, ..Default::default() - }).filter(|reg_item_vm|{ - if filter_text.is_empty() { return true; } - let distance = sorensen_dice(®_item_vm.name.to_lowercase(), &filter_text.to_lowercase()); - distance > 0.3 - }).collect::>(); - - self.filtered_accessories.sort_by(|a,b| { + }) + .filter(|reg_item_vm| { if filter_text.is_empty() { - return a.name.cmp(&b.name); + return true; } - let distance_a = sorensen_dice(&a.name.to_lowercase(), &filter_text.to_lowercase()); - let distance_b = sorensen_dice(&b.name.to_lowercase(), &filter_text.to_lowercase()); - if distance_a < distance_b { return Ordering::Greater; } - else if distance_a > distance_b { return Ordering::Less; } - return Ordering::Equal; + let distance = sorensen_dice( + ®_item_vm.name.to_lowercase(), + &filter_text.to_lowercase(), + ); + distance > 0.3 }) - }, + .collect::>(); + + self.filtered_accessories.sort_by(|a, b| { + if filter_text.is_empty() { + return a.name.cmp(&b.name); + } + let distance_a = + sorensen_dice(&a.name.to_lowercase(), &filter_text.to_lowercase()); + let distance_b = + sorensen_dice(&b.name.to_lowercase(), &filter_text.to_lowercase()); + if distance_a < distance_b { + return Ordering::Greater; + } else if distance_a > distance_b { + return Ordering::Less; + } + return Ordering::Equal; + }) } } } -} \ No newline at end of file +} diff --git a/src/vm/slot.rs b/src/vm/slot.rs deleted file mode 100644 index 04dc834..0000000 --- a/src/vm/slot.rs +++ /dev/null @@ -1,38 +0,0 @@ -pub mod slot_view_model { - use crate::{save::common::save_slot::SaveSlot, vm::{equipment::equipment_view_model::EquipmentViewModel, events::events_view_model::EventsViewModel, general::general_view_model::GeneralViewModel, inventory::InventoryViewModel, regions::regions_view_model::RegionsViewModel, stats::stats_view_model::StatsViewModel}}; - - - #[derive(Default, Clone)] - pub struct SlotViewModel { - pub active: bool, - pub general_vm : GeneralViewModel, - pub stats_vm: StatsViewModel, - pub equipment_vm: EquipmentViewModel, - pub inventory_vm: InventoryViewModel, - pub events_vm: EventsViewModel, - pub regions_vm: RegionsViewModel, - } - - impl SlotViewModel { - pub fn from_save(slot:&SaveSlot) -> Self { - let active = true; - - let general_vm = GeneralViewModel::from_save(slot); - let stats_vm = StatsViewModel::from_save(slot); - let equipment_vm = EquipmentViewModel::from_save(slot); - let inventory_vm = InventoryViewModel::from_save(slot); - let events_vm = EventsViewModel::from_save(slot); - let regions_vm = RegionsViewModel::from_save(slot); - - Self { - active, - general_vm, - stats_vm, - equipment_vm, - inventory_vm, - events_vm, - regions_vm, - } - } - } -} \ No newline at end of file diff --git a/src/vm/stats.rs b/src/vm/stats.rs index 2ad0ada..844c5e6 100644 --- a/src/vm/stats.rs +++ b/src/vm/stats.rs @@ -1,70 +1,49 @@ -pub mod stats_view_model { - use crate::{db::classes::classes::ArcheType, save::common::save_slot::SaveSlot}; +use er_save_lib::SaveApi; - #[derive(Clone)] - pub struct StatsViewModel { - pub arche_type: ArcheType, - pub vigor: u32, - pub mind: u32, - pub endurance: u32, - pub strength: u32, - pub dexterity: u32, - pub intelligence: u32, - pub faith: u32, - pub arcane: u32, - pub level: u32, - pub souls: u32, - pub soulsmemory: u32 - } +use crate::db::classes::ArcheType; - impl Default for StatsViewModel { - fn default() -> Self { - Self { - arche_type: ArcheType::Unknown, - vigor: Default::default(), - mind: Default::default(), - endurance: Default::default(), - strength: Default::default(), - dexterity: Default::default(), - intelligence: Default::default(), - faith: Default::default(), - arcane: Default::default(), - level: Default::default(), - souls: Default::default(), - soulsmemory: Default::default(), - } - } - } +#[allow(unused)] +#[derive(Clone, Default)] +pub struct StatsViewModel { + pub arche_type: ArcheType, + pub vigor: u32, + pub mind: u32, + pub endurance: u32, + pub strength: u32, + pub dexterity: u32, + pub intelligence: u32, + pub faith: u32, + pub arcane: u32, + pub runes: u32, + pub runes_memory: u32, +} - impl StatsViewModel { - pub fn from_save(slot:& SaveSlot) -> Self { - let arche_type = ArcheType::try_from(slot.player_game_data.arche_type).expect(""); - let vigor = slot.player_game_data.vigor; - let mind = slot.player_game_data.mind; - let endurance = slot.player_game_data.endurance; - let strength = slot.player_game_data.strength; - let dexterity = slot.player_game_data.dexterity; - let intelligence = slot.player_game_data.intelligence; - let faith = slot.player_game_data.faith; - let arcane = slot.player_game_data.arcane; - let level = slot.player_game_data.level; - let souls = slot.player_game_data.souls; - let soulsmemory = slot.player_game_data.soulsmemory; +impl StatsViewModel { + pub fn from_save(index: usize, save_api: &SaveApi) -> Self { + let arche_type = ArcheType::from(save_api.archetype(index)); + let vigor = save_api.vigor(index); + let mind = save_api.mind(index); + let endurance = save_api.endurance(index); + let strength = save_api.strength(index); + let dexterity = save_api.dexterity(index); + let intelligence = save_api.intelligence(index); + let faith = save_api.faith(index); + let arcane = save_api.arcane(index); + let runes = save_api.runes(index); + let runes_memory = save_api.runes_memory(index); - Self { - arche_type, - vigor, - mind, - endurance, - strength, - dexterity, - intelligence, - faith, - arcane, - level, - souls, - soulsmemory - } + Self { + arche_type, + vigor, + mind, + endurance, + strength, + dexterity, + intelligence, + faith, + arcane, + runes, + runes_memory, } } -} \ No newline at end of file +} diff --git a/src/vm/vm.rs b/src/vm/vm.rs index 489cf00..e256283 100644 --- a/src/vm/vm.rs +++ b/src/vm/vm.rs @@ -1,454 +1,534 @@ -pub mod vm { - use std::collections::HashMap; - - use crate::{ - db::{ - bosses::bosses::BOSSES, - colosseums::colosseums::COLOSSEUMS, - cookbooks::books::COOKBOKS, - event_flags::event_flags::EVENT_FLAGS, - graces::maps::GRACES, maps::maps::MAPS, - regions::regions::REGIONS, - stats::stats::{FP, HP, SP}, - summoning_pools::summoning_pools::SUMMONING_POOLS, - whetblades::whetblades::WHETBLADES - }, - save::{ - common::save_slot::{ - EquipInventoryData, - EquipInventoryItem - }, - save::save::{ - Save, SaveType - }}, util::{ - regulation::Regulation, - validator::validator::Validator - }, vm::{ - inventory::{ - InventoryGaitemType, InventoryItemType - }, - profile_summary::slot_view_model::ProfileSummaryViewModel, - regulation::regulation_view_model::RegulationViewModel, - slot::slot_view_model::SlotViewModel - }}; - - - #[derive(Clone)] - pub struct ViewModel { - pub active: Option, - pub index: usize, - pub steam_id: String, - pub profile_summary: [ProfileSummaryViewModel; 0xA], - pub slots: [SlotViewModel; 0xA], - pub regulation: RegulationViewModel, - } - - impl Default for ViewModel{ - fn default() -> Self { - Self { - active: Default::default(), - index: Default::default(), - steam_id: Default::default(), - slots: Default::default(), - profile_summary: Default::default(), - regulation: Default::default(), +use er_save_lib::{SaveApi, SaveApiError}; + +use crate::{ + db::{ + bosses::Boss, + colosseums::Colosseum, + cookbooks::Cookbook, + graces::maps::Grace, + maps::Map, + regions::Region, + stats::{FP, HP, SP}, + summoning_pools::SummoningPool, + whetblades::Whetblade, + }, + vm::character::CharacterViewModel, +}; + +#[derive(Default)] +pub struct ViewModel { + pub index: usize, + pub dlc: bool, // Flag for activating DLC items, locations, etc.. + pub steam_id: String, + pub characters: [CharacterViewModel; 10], + // pub regulation: RegulationViewModel, +} + +impl ViewModel { + pub fn from_save(save_api: &SaveApi) -> Result { + let mut vm = ViewModel::default(); + + // Steam Id + vm.steam_id = save_api.steam_id().to_string(); + + // Characters + for (i, active) in save_api.active_characters().iter().enumerate() { + if *active { + vm.characters[i] = CharacterViewModel::from_save(save_api, i)?; } } - } - - impl ViewModel { - pub fn from_save(save: &Save) -> Self { - let mut vm = ViewModel::default(); - - // Init params - Regulation::init_params(save); - - // Check for irregular data - vm.active = Some(Validator::validate(save)); - if vm.active.is_some_and(|v| !v) {return vm;} - - // Steam Id - vm.steam_id = save.save_type.get_global_steam_id().to_string(); - - // Regulation (Params) - vm.regulation = RegulationViewModel::default(); - // Get active characters - for (index, active) in save.save_type.active_slots().iter().enumerate() { - if *active { - vm.profile_summary[index] = ProfileSummaryViewModel::from_save(&save.save_type.get_profile_summary(index)); - vm.slots[index] = SlotViewModel::from_save(&save.save_type.get_slot(index)); - } - } + Ok(vm) + } - vm - } + pub fn update_save(&self, save_api: &mut SaveApi) -> Result<(), SaveApiError> { + let steam_id = self.steam_id.parse::().expect(""); - pub fn update_save(&self, save_type: &mut SaveType) { - let steam_id = self.steam_id.parse::().expect(""); - // Update SteamID for UserData10 - save_type.set_global_steam_id(steam_id); + // Update SteamID + save_api.set_steam_id(steam_id)?; - // Update data for each character - for (i, active) in save_type.active_slots().iter().enumerate() { - if *active { - // Update Steam ID - save_type.set_character_steam_id(i, steam_id); + // Update data for each character + for (i, active) in save_api.active_characters().iter().enumerate() { + if *active { + // Update Character name + save_api.set_character_name(i, &self.characters[i].general_vm.character_name)?; - // Update Character name - save_type.set_character_name(i, self.slots[i].general_vm.character_name.to_string()); - - // Update Gender - save_type.set_character_gender(i, self.slots[i].general_vm.gender as u8); + // Update Gender + save_api.set_gender(i, self.characters[i].general_vm.gender as u8)?; - // Update Character Weapon Match Making Level - self.update_weapon_match_making_level(save_type, i); + // // Update Character Weapon Match Making Level + // self.update_weapon_match_making_level(save_type, i); - // Update Inventory (Held + Storage Box) - self.update_inventory(save_type, i); + // // Update Inventory (Held + Storage Box) + // self.update_inventory(save_type, i); - // Update Stats - self.update_stats(save_type, i); + // Update Stats + self.update_stats(save_api, i)?; - // Update Equipment - self.update_equipment(save_type, i); + // // Update Equipment + // self.update_equipment(save_type, i); - // Update Events - self.update_events(save_type, i); + // Update Events + self.update_events(save_api, i)?; - // Update Regions - self.update_regions(save_type, i); - } + // // Update Regions + self.update_regions(save_api, i)?; } - } + Ok(()) + } - fn update_stats(&self, save_type: &mut SaveType, index: usize) { - let stats_vm = &self.slots[index].stats_vm; - - let level = - stats_vm.vigor + - stats_vm.mind + - stats_vm.endurance + - stats_vm.strength + - stats_vm.dexterity + - stats_vm.intelligence + - stats_vm.faith + - stats_vm.arcane - 79; - - save_type.set_character_health(index, HP[stats_vm.vigor as usize] as u32); - save_type.set_character_base_max_health(index, HP[stats_vm.vigor as usize] as u32); - - save_type.set_character_fp(index, FP[stats_vm.mind as usize] as u32); - save_type.set_character_base_max_fp(index, FP[stats_vm.mind as usize] as u32); - - save_type.set_character_sp(index, SP[stats_vm.endurance as usize] as u32); - save_type.set_character_base_max_sp(index, SP[stats_vm.endurance as usize] as u32); - - save_type.set_character_level(index, level); - save_type.set_character_vigor(index, stats_vm.vigor); - save_type.set_character_mind(index, stats_vm.mind); - save_type.set_character_endurance(index, stats_vm.endurance); - save_type.set_character_strength(index, stats_vm.strength); - save_type.set_character_dexterity(index, stats_vm.dexterity); - save_type.set_character_intelligence(index, stats_vm.intelligence); - save_type.set_character_faith(index, stats_vm.faith); - save_type.set_character_arcane(index, stats_vm.arcane); - - save_type.set_character_souls(index, stats_vm.souls); + fn update_stats(&self, save_api: &mut SaveApi, index: usize) -> Result<(), SaveApiError> { + let stats_vm = &self.characters[index].stats_vm; + + // Determine is the stats has changed + let has_changed = stats_vm.vigor != save_api.vigor(index) + || stats_vm.mind != save_api.mind(index) + || stats_vm.endurance != save_api.endurance(index) + || stats_vm.strength != save_api.strength(index) + || stats_vm.dexterity != save_api.dexterity(index) + || stats_vm.intelligence != save_api.intelligence(index) + || stats_vm.faith != save_api.faith(index) + || stats_vm.arcane != save_api.arcane(index) + || stats_vm.runes != save_api.runes(index); + + // Exit early if no stats have been changed + if !has_changed { + return Ok(()); } - fn update_weapon_match_making_level(&self, save_type: &mut SaveType, index: usize) { - let general_vm = &self.slots[index].general_vm; - let inventory_vm = &self.slots[index].inventory_vm; - - // Don't update savefile equipment if it has not been changed - if !inventory_vm.changed { - return; - } - - // Map somber to normal weapon upgrade - let somber_to_normal: HashMap = HashMap::from([ - (0, 0), (1, 0),(2, 5), (3, 7), (4, 10), (5, 12), - (6, 15), (7, 17), (8, 20), (9, 24), (10, 25), - ]); - - // Find the highest weapon upgrade in player inventory - let mut max_level: u8 = 0; - for (held_item, storage_item) in inventory_vm.storage[0].common_items.iter().zip(&inventory_vm.storage[1].common_items) { - let held_weapon_res = Regulation::equip_weapon_params_map().get(&((&held_item.item_id/100)*100)); - let storage_weapon_res = Regulation::equip_weapon_params_map().get(&((&storage_item.item_id/100)*100)); - // Check held inventory item - if held_item.r#type == InventoryGaitemType::WEAPON { - match held_weapon_res { - Some(weapon_param) => { - // Check if weapon is somber - let is_somber = weapon_param.data.reinforceTypeId != 0 && ( - weapon_param.data.reinforceTypeId % 2200 == 0 || - weapon_param.data.reinforceTypeId % 2400 == 0 || - weapon_param.data.reinforceTypeId % 3200 == 0 || - weapon_param.data.reinforceTypeId % 3300 == 0 || - weapon_param.data.reinforceTypeId % 8300 == 0 || - weapon_param.data.reinforceTypeId % 8500 == 0 - ); - - // Extract weapon level based on wether weapon is somber or not - let weapon_level = if is_somber{ - somber_to_normal[&((held_item.item_id % 100) as u8)] - } - else { - (held_item.item_id % 100) as u8 - }; - - // Update max weapon level if inventory weapon is higher - if weapon_level > max_level { - max_level = weapon_level; - } - }, - None => { - println!("Couldn't find param info for weapon {}|{:#x}", held_item.item_id, held_item.item_id); - }, - } - } + // Calculate the level from stats + let level = stats_vm.vigor + + stats_vm.mind + + stats_vm.endurance + + stats_vm.strength + + stats_vm.dexterity + + stats_vm.intelligence + + stats_vm.faith + + stats_vm.arcane + - 79; + + // Update hp from vigor + save_api.set_hp(index, HP[stats_vm.vigor as usize] as u32)?; + save_api.set_base_max_hp(index, HP[stats_vm.vigor as usize] as u32)?; + + // Update fp from mind + save_api.set_fp(index, FP[stats_vm.mind as usize] as u32)?; + save_api.set_base_max_fp(index, FP[stats_vm.mind as usize] as u32)?; + + // Update sp from endurance + save_api.set_sp(index, SP[stats_vm.endurance as usize] as u32)?; + save_api.set_base_max_sp(index, SP[stats_vm.endurance as usize] as u32)?; + + // Update the stats + save_api.set_level(index, level)?; + save_api.set_vigor(index, stats_vm.vigor)?; + save_api.set_mind(index, stats_vm.mind)?; + save_api.set_endurance(index, stats_vm.endurance)?; + save_api.set_strength(index, stats_vm.strength)?; + save_api.set_dexterity(index, stats_vm.dexterity)?; + save_api.set_intelligence(index, stats_vm.intelligence)?; + save_api.set_faith(index, stats_vm.faith)?; + save_api.set_arcane(index, stats_vm.arcane)?; + + // Update runes + save_api.set_runes(index, stats_vm.runes)?; + + // Max out runes memory to avoid ban for stat changing + save_api.set_runes_memory(index, u32::MAX)?; + + Ok(()) + } - // Check storage box item - if storage_item.r#type == InventoryGaitemType::WEAPON { - match storage_weapon_res { - Some(weapon_param) => { - // Check if weapon is somber - let is_somber = weapon_param.data.reinforceTypeId != 0 && ( - weapon_param.data.reinforceTypeId % 2200 == 0 || - weapon_param.data.reinforceTypeId % 2400 == 0 || - weapon_param.data.reinforceTypeId % 3200 == 0 || - weapon_param.data.reinforceTypeId % 3300 == 0 || - weapon_param.data.reinforceTypeId % 8300 == 0 || - weapon_param.data.reinforceTypeId % 8500 == 0 - ); - - // Extract weapon level based on wether weapon is somber or not - let weapon_level = if is_somber{ - somber_to_normal[&((storage_item.item_id % 100) as u8)] - } - else { - (storage_item.item_id % 100) as u8 - }; - - // Update max weapon level if inventory weapon is higher - if weapon_level > max_level { - max_level = weapon_level; - } - }, - None => { - println!("Couldn't find param info for weapon {}|{:#x}", held_item.item_id, held_item.item_id); - }, - } - } - } - // Update player match making level highest weapon upgrade is higher - if max_level > general_vm.weapon_level { - save_type.set_match_making_wpn_lvl(index, max_level); + // fn update_weapon_match_making_level(&self, save_type: &mut SaveType, index: usize) { + // let general_vm = &self.slots[index].general_vm; + // let inventory_vm = &self.slots[index].inventory_vm; + + // // Don't update savefile equipment if it has not been changed + // if !inventory_vm.changed { + // return; + // } + + // // Map somber to normal weapon upgrade + // let somber_to_normal: HashMap = HashMap::from([ + // (0, 0), + // (1, 0), + // (2, 5), + // (3, 7), + // (4, 10), + // (5, 12), + // (6, 15), + // (7, 17), + // (8, 20), + // (9, 24), + // (10, 25), + // ]); + + // // Find the highest weapon upgrade in player inventory + // let mut max_level: u8 = 0; + // for (held_item, storage_item) in inventory_vm.storage[0] + // .common_items + // .iter() + // .zip(&inventory_vm.storage[1].common_items) + // { + // let held_weapon_res = + // Regulation::equip_weapon_params_map().get(&((&held_item.item_id / 100) * 100)); + // let storage_weapon_res = Regulation::equip_weapon_params_map() + // .get(&((&storage_item.item_id / 100) * 100)); + // // Check held inventory item + // if held_item.r#type == InventoryGaitemType::WEAPON { + // match held_weapon_res { + // Some(weapon_param) => { + // // Check if weapon is somber + // let is_somber = weapon_param.data.reinforceTypeId != 0 + // && (weapon_param.data.reinforceTypeId % 2200 == 0 + // || weapon_param.data.reinforceTypeId % 2400 == 0 + // || weapon_param.data.reinforceTypeId % 3200 == 0 + // || weapon_param.data.reinforceTypeId % 3300 == 0 + // || weapon_param.data.reinforceTypeId % 8300 == 0 + // || weapon_param.data.reinforceTypeId % 8500 == 0); + + // // Extract weapon level based on wether weapon is somber or not + // let weapon_level = if is_somber { + // somber_to_normal[&((held_item.item_id % 100) as u8)] + // } else { + // (held_item.item_id % 100) as u8 + // }; + + // // Update max weapon level if inventory weapon is higher + // if weapon_level > max_level { + // max_level = weapon_level; + // } + // } + // None => { + // println!( + // "Couldn't find param info for weapon {}|{:#x}", + // held_item.item_id, held_item.item_id + // ); + // } + // } + // } + + // // Check storage box item + // if storage_item.r#type == InventoryGaitemType::WEAPON { + // match storage_weapon_res { + // Some(weapon_param) => { + // // Check if weapon is somber + // let is_somber = weapon_param.data.reinforceTypeId != 0 + // && (weapon_param.data.reinforceTypeId % 2200 == 0 + // || weapon_param.data.reinforceTypeId % 2400 == 0 + // || weapon_param.data.reinforceTypeId % 3200 == 0 + // || weapon_param.data.reinforceTypeId % 3300 == 0 + // || weapon_param.data.reinforceTypeId % 8300 == 0 + // || weapon_param.data.reinforceTypeId % 8500 == 0); + + // // Extract weapon level based on wether weapon is somber or not + // let weapon_level = if is_somber { + // somber_to_normal[&((storage_item.item_id % 100) as u8)] + // } else { + // (storage_item.item_id % 100) as u8 + // }; + + // // Update max weapon level if inventory weapon is higher + // if weapon_level > max_level { + // max_level = weapon_level; + // } + // } + // None => { + // println!( + // "Couldn't find param info for weapon {}|{:#x}", + // held_item.item_id, held_item.item_id + // ); + // } + // } + // } + // } + // // Update player match making level highest weapon upgrade is higher + // if max_level > general_vm.weapon_level { + // save_type.set_match_making_wpn_lvl(index, max_level); + // } + // } + + // fn update_equipment(&self, save_type: &mut SaveType, index: usize) { + // let equipment_vm = &self.slots[index].equipment_vm; + + // // Don't update savefile equipment if it has not been changed + // if !equipment_vm.changed { + // return; + // } + + // // (gaitem_handle, item_id, equipment_index) + // let mut quickslots = [(0, u32::MAX, u32::MAX); 10]; + // let mut pouch_items = [(0, u32::MAX, u32::MAX); 6]; + + // // Left hand armament + // for (weapon_slot_index, left_hand_armament) in + // equipment_vm.left_hand_armaments.iter().enumerate() + // { + // save_type.set_left_weapon_slot( + // index, + // weapon_slot_index, + // left_hand_armament.gaitem_handle, + // left_hand_armament.id, + // left_hand_armament.equip_index, + // ); + // } + + // // Right hand armament + // for (weapon_slot_index, right_hand_armament) in + // equipment_vm.right_hand_armaments.iter().enumerate() + // { + // save_type.set_right_weapon_slot( + // index, + // weapon_slot_index, + // right_hand_armament.gaitem_handle, + // right_hand_armament.id, + // right_hand_armament.equip_index, + // ); + // } + + // // Arrows + // for (arrow_slot_index, arrow) in equipment_vm.arrows.iter().enumerate() { + // save_type.set_arrow_slot( + // index, + // arrow_slot_index, + // arrow.gaitem_handle, + // arrow.id, + // arrow.equip_index, + // ); + // } + + // // Bolts + // for (bolt_slot_index, bolt) in equipment_vm.bolts.iter().enumerate() { + // save_type.set_bolt_slot( + // index, + // bolt_slot_index, + // bolt.gaitem_handle, + // bolt.id, + // bolt.equip_index, + // ); + // } + + // save_type.set_head_gear( + // index, + // equipment_vm.head.gaitem_handle, + // equipment_vm.head.id, + // equipment_vm.head.equip_index, + // ); + // save_type.set_chest_piece( + // index, + // equipment_vm.chest.gaitem_handle, + // equipment_vm.chest.id, + // equipment_vm.chest.equip_index, + // ); + // save_type.set_gauntlets( + // index, + // equipment_vm.arms.gaitem_handle, + // equipment_vm.arms.id, + // equipment_vm.arms.equip_index, + // ); + // save_type.set_leggings( + // index, + // equipment_vm.legs.gaitem_handle, + // equipment_vm.legs.id, + // equipment_vm.legs.equip_index, + // ); + + // // Talismans + // for (talisman_slot_index, talisman) in equipment_vm.talismans.iter().enumerate() { + // save_type.set_talisman_slot( + // index, + // talisman_slot_index, + // talisman.gaitem_handle, + // talisman.id, + // talisman.equip_index, + // ); + // } + + // // Quickitem + // for (index, quickitem) in equipment_vm.quickitems.iter().enumerate() { + // if quickitem.id != 0 { + // quickslots[index] = ( + // quickitem.id | InventoryGaitemType::ITEM as u32, + // quickitem.id | InventoryItemType::ITEM as u32, + // quickitem.equip_index, + // ) + // } + // } + // for (quickslot_index, quickslot) in quickslots.iter().enumerate() { + // save_type.set_quickslot_item( + // index, + // quickslot_index, + // quickslot.0, + // quickslot.1, + // quickslot.2, + // ); + // } + + // // Pouch + // for (index, pouch) in equipment_vm.pouch.iter().enumerate() { + // if pouch.id != 0 { + // pouch_items[index] = ( + // pouch.id | InventoryGaitemType::ITEM as u32, + // pouch.id | InventoryItemType::ITEM as u32, + // pouch.equip_index, + // ) + // } + // } + // for (pouch_index, pouch_item) in pouch_items.iter().enumerate() { + // save_type.set_pouch_item( + // index, + // pouch_index, + // pouch_item.0, + // pouch_item.1, + // pouch_item.2, + // ); + // } + // } + + fn update_events(&self, save_api: &mut SaveApi, index: usize) -> Result<(), SaveApiError> { + // Graces + for (grace, on) in self.characters[index].events_vm.graces.iter() { + if let Some((_, event_id, _)) = Grace::graces().get(grace) { + save_api.set_event_flag(*event_id, index, *on)?; } } - fn update_equipment(&self, save_type: &mut SaveType, index: usize) { - let equipment_vm = &self.slots[index].equipment_vm; - - // Don't update savefile equipment if it has not been changed - if !equipment_vm.changed { - return; + // Whetblades + for (whetblade, on) in self.characters[index].events_vm.whetblades.iter() { + if let Some((event_id, _)) = Whetblade::whetblades().get(&whetblade) { + save_api.set_event_flag(*event_id, index, *on)?; } - - // (gaitem_handle, item_id, equipment_index) - let mut quickslots = [(0, u32::MAX, u32::MAX); 10]; - let mut pouch_items = [(0, u32::MAX, u32::MAX); 6]; - - // Left hand armament - for (weapon_slot_index, left_hand_armament) in equipment_vm.left_hand_armaments.iter().enumerate() { - save_type.set_left_weapon_slot(index, weapon_slot_index, left_hand_armament.gaitem_handle, left_hand_armament.id, left_hand_armament.equip_index); - } - - // Right hand armament - for (weapon_slot_index, right_hand_armament) in equipment_vm.right_hand_armaments.iter().enumerate() { - save_type.set_right_weapon_slot(index, weapon_slot_index, right_hand_armament.gaitem_handle, right_hand_armament.id, right_hand_armament.equip_index); - } - - // Arrows - for (arrow_slot_index, arrow) in equipment_vm.arrows.iter().enumerate() { - save_type.set_arrow_slot(index, arrow_slot_index, arrow.gaitem_handle, arrow.id, arrow.equip_index); - } - - // Bolts - for (bolt_slot_index, bolt) in equipment_vm.bolts.iter().enumerate() { - save_type.set_bolt_slot(index, bolt_slot_index, bolt.gaitem_handle, bolt.id, bolt.equip_index); - } - - save_type.set_head_gear(index, equipment_vm.head.gaitem_handle, equipment_vm.head.id, equipment_vm.head.equip_index); - save_type.set_chest_piece(index, equipment_vm.chest.gaitem_handle, equipment_vm.chest.id, equipment_vm.chest.equip_index); - save_type.set_gauntlets(index, equipment_vm.arms.gaitem_handle, equipment_vm.arms.id, equipment_vm.arms.equip_index); - save_type.set_leggings(index, equipment_vm.legs.gaitem_handle, equipment_vm.legs.id, equipment_vm.legs.equip_index); - - // Talismans - for (talisman_slot_index, talisman) in equipment_vm.talismans.iter().enumerate() { - save_type.set_talisman_slot(index, talisman_slot_index, talisman.gaitem_handle, talisman.id, talisman.equip_index); - } - - // Quickitem - for (index, quickitem) in equipment_vm.quickitems.iter().enumerate() { - if quickitem.id != 0 { - quickslots[index] = (quickitem.id | InventoryGaitemType::ITEM as u32, quickitem.id | InventoryItemType::ITEM as u32, quickitem.equip_index) - } - } - for (quickslot_index, quickslot) in quickslots.iter().enumerate() { - save_type.set_quickslot_item(index, quickslot_index, quickslot.0, quickslot.1, quickslot.2); - } - - // Pouch - for (index, pouch) in equipment_vm.pouch.iter().enumerate() { - if pouch.id != 0 { - pouch_items[index] = (pouch.id | InventoryGaitemType::ITEM as u32, pouch.id | InventoryItemType::ITEM as u32, pouch.equip_index) - } - } - for (pouch_index, pouch_item) in pouch_items.iter().enumerate() { - save_type.set_pouch_item(index, pouch_index, pouch_item.0, pouch_item.1, pouch_item.2); - } - } - fn update_events(&self, save_type: &mut SaveType, index: usize) { - - for (grace, on) in self.slots[index].events_vm.graces.iter() { - let grace_info = GRACES.lock().unwrap()[&grace]; - let offset = EVENT_FLAGS.lock().unwrap()[&grace_info.1]; - save_type.set_character_event_flag(index, offset.0 as usize, offset.1, *on); - } - - // Whetblades - for (whetblade, on) in self.slots[index].events_vm.whetblades.iter() { - let whetblade_info = WHETBLADES.lock().unwrap()[&whetblade]; - let offset = EVENT_FLAGS.lock().unwrap()[&whetblade_info.0]; - save_type.set_character_event_flag(index, offset.0 as usize, offset.1, *on); - } - - // Cookbooks - for (cookbook, on) in self.slots[index].events_vm.cookbooks.iter() { - let cookbook_info = COOKBOKS.lock().unwrap()[&cookbook]; - let offset = EVENT_FLAGS.lock().unwrap()[&cookbook_info.0]; - save_type.set_character_event_flag(index, offset.0 as usize, offset.1, *on); - } - - // Maps - for (map, on) in self.slots[index].events_vm.maps.iter() { - let map_info = MAPS.lock().unwrap()[&map]; - let offset = EVENT_FLAGS.lock().unwrap()[&map_info.0]; - save_type.set_character_event_flag(index, offset.0 as usize, offset.1, *on); + // Cookbooks + for (cookbook, on) in self.characters[index].events_vm.cookbooks.iter() { + if let Some((event_id, _)) = Cookbook::cookbooks().get(&cookbook) { + save_api.set_event_flag(*event_id, index, *on)?; } + } - // Bosses - for (boss, on) in self.slots[index].events_vm.bosses.iter() { - let boss_info = BOSSES.lock().unwrap()[&boss]; - let offset = EVENT_FLAGS.lock().unwrap()[&boss_info.0]; - save_type.set_character_event_flag(index, offset.0 as usize, offset.1, *on); + // Maps + for (map, on) in self.characters[index].events_vm.maps.iter() { + if let Some((event_id, _)) = Map::maps().get(&map) { + save_api.set_event_flag(*event_id, index, *on)?; } + } - // Summoning Pools - for (summoning_pool, on) in self.slots[index].events_vm.summoning_pools.iter() { - let summoning_pool_info = SUMMONING_POOLS.lock().unwrap()[&summoning_pool]; - let offset = EVENT_FLAGS.lock().unwrap()[&summoning_pool_info.0]; - save_type.set_character_event_flag(index, offset.0 as usize, offset.1, *on); + // Bosses + for (boss, on) in self.characters[index].events_vm.bosses.iter() { + if let Some((event_id, _)) = Boss::bosses().get(&boss) { + save_api.set_event_flag(*event_id, index, *on)?; } + } - // Colosseums - for (colusseum, on) in self.slots[index].events_vm.colosseums.iter() { - let colusseum_info = COLOSSEUMS.lock().unwrap()[&colusseum]; - let offset = EVENT_FLAGS.lock().unwrap()[&colusseum_info.0]; - save_type.set_character_event_flag(index, offset.0 as usize, offset.1, *on); + // Summoning Pools + for (summoning_pool, on) in self.characters[index].events_vm.summoning_pools.iter() { + if let Some((event_id, _)) = SummoningPool::summoning_pools().get(&summoning_pool) { + save_api.set_event_flag(*event_id, index, *on)?; } } - fn update_regions(&self, save_type: &mut SaveType, index: usize) { - for (region, (activated, _, _,_)) in self.slots[index].regions_vm.regions.iter() { - let region_id = REGIONS.lock().unwrap()[region].0; - if *activated { - save_type.add_region(index, region_id); - } - else { - save_type.remove_region(index, region_id); - } + // Colosseums + for (colusseum, on) in self.characters[index].events_vm.colosseums.iter() { + if let Some((event_id, _)) = Colosseum::colusseums().get(&colusseum) { + save_api.set_event_flag(*event_id, index, *on)?; } } + Ok(()) + } - fn update_inventory(&self, save_type: &mut SaveType, index: usize) { - let inventory_vm = &self.slots[index].inventory_vm; - let inventory_held = &inventory_vm.storage[0]; - let inventory_storage_box = &inventory_vm.storage[1]; - - // Don't update savefile equipment if it has not been changed - if !inventory_vm.changed { - return; + fn update_regions(&self, save_api: &mut SaveApi, index: usize) -> Result<(), SaveApiError> { + for (region, (is_on, _, _, _)) in self.characters[index].regions_vm.regions.iter() { + if let Some((region_id, _, _, _, _, _)) = Region::regions().get(region) { + if *is_on { + save_api.add_region(index, *region_id)?; + } else { + save_api.remove_region(index, *region_id)?; + } } - - // Update gaitem map - save_type.set_gaitem_map(index, inventory_vm.gaitem_map.clone()); - - - // Update projectile list - save_type.set_equip_projectile_data(index, inventory_vm.projectile_list.clone()); - - let mut counter = 0; - // Update held inventory; - let held_inventory = EquipInventoryData{ - common_inventory_items_distinct_count: inventory_held.common_item_count, - common_items: inventory_held.common_items.iter().map(|item| { - EquipInventoryItem{ - ga_item_handle: item.ga_item_handle, - inventory_index: item.inventory_index, - quantity: item.quantity - } - }).collect::>(), - key_inventory_items_distinct_count: inventory_held.key_item_count, - key_items: inventory_held.key_items.iter().map(|item| { - counter = counter + 1; - EquipInventoryItem{ - ga_item_handle: item.ga_item_handle, - inventory_index: item.inventory_index, - quantity: item.quantity - } - }).collect::>(), - next_acquisition_sort_id: inventory_held.next_acquisition_sort_order_index, - next_equip_index: inventory_held.next_equip_index, - ..Default::default() - }; - save_type.set_held_inventory(index, held_inventory); - - // Update storage box inventory; - let storage_box_inventory = EquipInventoryData{ - common_inventory_items_distinct_count: inventory_storage_box.common_item_count, - common_items: inventory_storage_box.common_items.iter().map(|item| { - EquipInventoryItem{ - ga_item_handle: item.ga_item_handle, - inventory_index: item.inventory_index, - quantity: item.quantity - } - }).collect::>(), - key_inventory_items_distinct_count: inventory_storage_box.key_item_count, - key_items: inventory_storage_box.key_items.iter().map(|item| { - EquipInventoryItem{ - ga_item_handle: item.ga_item_handle, - inventory_index: item.inventory_index, - quantity: item.quantity - } - }).collect::>(), - next_acquisition_sort_id: inventory_storage_box.next_acquisition_sort_order_index, - next_equip_index: inventory_storage_box.next_equip_index, - ..Default::default() - }; - save_type.set_storage_box_inventory(index, storage_box_inventory); - - // Update gaitem item data - let gaitem_data = inventory_vm.gaitem_data.clone(); - save_type.set_gaitem_item_data(index, gaitem_data); - - } + Ok(()) } -} \ No newline at end of file + + // fn update_inventory(&self, save_type: &mut SaveType, index: usize) { + // let inventory_vm = &self.slots[index].inventory_vm; + // let inventory_held = &inventory_vm.storage[0]; + // let inventory_storage_box = &inventory_vm.storage[1]; + + // // Don't update savefile equipment if it has not been changed + // if !inventory_vm.changed { + // return; + // } + + // // Update gaitem map + // save_type.set_gaitem_map(index, inventory_vm.gaitem_map.clone()); + + // // Update projectile list + // save_type.set_equip_projectile_data(index, inventory_vm.projectile_list.clone()); + + // let mut counter = 0; + // // Update held inventory; + // let held_inventory = EquipInventoryData { + // common_inventory_items_distinct_count: inventory_held.common_item_count, + // common_items: inventory_held + // .common_items + // .iter() + // .map(|item| EquipInventoryItem { + // ga_item_handle: item.ga_item_handle, + // inventory_index: item.inventory_index, + // quantity: item.quantity, + // }) + // .collect::>(), + // key_inventory_items_distinct_count: inventory_held.key_item_count, + // key_items: inventory_held + // .key_items + // .iter() + // .map(|item| { + // counter = counter + 1; + // EquipInventoryItem { + // ga_item_handle: item.ga_item_handle, + // inventory_index: item.inventory_index, + // quantity: item.quantity, + // } + // }) + // .collect::>(), + // next_acquisition_sort_id: inventory_held.next_acquisition_sort_order_index, + // next_equip_index: inventory_held.next_equip_index, + // ..Default::default() + // }; + // save_type.set_held_inventory(index, held_inventory); + + // // Update storage box inventory; + // let storage_box_inventory = EquipInventoryData { + // common_inventory_items_distinct_count: inventory_storage_box.common_item_count, + // common_items: inventory_storage_box + // .common_items + // .iter() + // .map(|item| EquipInventoryItem { + // ga_item_handle: item.ga_item_handle, + // inventory_index: item.inventory_index, + // quantity: item.quantity, + // }) + // .collect::>(), + // key_inventory_items_distinct_count: inventory_storage_box.key_item_count, + // key_items: inventory_storage_box + // .key_items + // .iter() + // .map(|item| EquipInventoryItem { + // ga_item_handle: item.ga_item_handle, + // inventory_index: item.inventory_index, + // quantity: item.quantity, + // }) + // .collect::>(), + // next_acquisition_sort_id: inventory_storage_box.next_acquisition_sort_order_index, + // next_equip_index: inventory_storage_box.next_equip_index, + // ..Default::default() + // }; + // save_type.set_storage_box_inventory(index, storage_box_inventory); + + // // Update gaitem item data + // let gaitem_data = inventory_vm.gaitem_data.clone(); + // save_type.set_gaitem_item_data(index, gaitem_data); + // } +} diff --git a/src/write/mod.rs b/src/write/mod.rs deleted file mode 100644 index 4ce5b98..0000000 --- a/src/write/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod write; \ No newline at end of file diff --git a/src/write/write.rs b/src/write/write.rs deleted file mode 100644 index 9a20478..0000000 --- a/src/write/write.rs +++ /dev/null @@ -1,5 +0,0 @@ -use std::io; - -pub trait Write where Self: Sized { - fn write(&self) -> Result, io::Error>; -} \ No newline at end of file From 8ba5353aa404dc81c654303e4691d5a9d1f3f941 Mon Sep 17 00:00:00 2001 From: clayamore Date: Thu, 8 Aug 2024 00:44:40 +0200 Subject: [PATCH 02/12] switched cargo src --- Cargo.lock | 1 + Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 2437624..188575e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1534,6 +1534,7 @@ dependencies = [ [[package]] name = "er-save-lib" version = "0.1.0" +source = "git+https://github.com/ClayAmore/ER-Save-Lib.git#2753ac0a0734d2d5e9f87e803ef83c34b473792c" dependencies = [ "aes", "cbc", diff --git a/Cargo.toml b/Cargo.toml index 616e1d0..c43d48c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,7 +16,7 @@ rust-embed = "8.3.0" serde = { version = "1.0.198", features = ["derive"] } serde_json = "1.0.116" strsim = "0.11.0" -er-save-lib = {path = "../er-save-lib"} +er-save-lib = {git = "https://github.com/ClayAmore/ER-Save-Lib.git"} chrono = "0.4.38" [build-dependencies] From 6fc887c4db44fd4c122e173fd85f0f01aff1cd22 Mon Sep 17 00:00:00 2001 From: clayamore Date: Thu, 8 Aug 2024 22:39:29 +0200 Subject: [PATCH 03/12] Added affinity combo box to weapon add and filered aows add list --- src/db/armor_name.rs | 662 ------- src/db/item_name.rs | 1815 ------------------ src/db/weapon_name.rs | 2983 ------------------------------ src/main.rs | 4 - src/ui/inventory/add/single.rs | 21 +- src/vm/inventory/add/add.rs | 39 +- src/vm/inventory/add/affinity.rs | 160 ++ src/vm/inventory/add/filter.rs | 18 +- src/vm/inventory/add/mod.rs | 1 + 9 files changed, 229 insertions(+), 5474 deletions(-) delete mode 100644 src/db/armor_name.rs delete mode 100644 src/db/item_name.rs delete mode 100644 src/db/weapon_name.rs create mode 100644 src/vm/inventory/add/affinity.rs diff --git a/src/db/armor_name.rs b/src/db/armor_name.rs deleted file mode 100644 index 0bd2077..0000000 --- a/src/db/armor_name.rs +++ /dev/null @@ -1,662 +0,0 @@ -pub mod armor_name { - use std::{collections::HashMap, sync::Mutex}; - use once_cell::sync::Lazy; - - pub static ARMOR_NAME: Lazy>> = Lazy::new(|| { - Mutex::new(HashMap::from([ - (1000,"Type 1"), - (1100,"Type 2"), - (1200,"Type 3"), - (1300,"Type 4"), - (1400,"Type 5"), - (1500,"Type 6"), - (1600,"Type 7"), - (1700,"Type 8"), - (1800,"Type 9"), - (1900,"Type 10"), - (2000,"Type 11"), - (2100,"Type 12"), - (2200,"Type 13"), - (2300,"Type 14"), - (2400,"Type 15"), - (2500,"Type 16"), - (2600,"Type 17"), - (2700,"Type 18"), - (2800,"Type 19"), - (2900,"Type 20"), - (3000,"Type 1"), - (3100,"Type 2"), - (3200,"Type 3"), - (3300,"Type 4"), - (3400,"Type 5"), - (3500,"Type 6"), - (3600,"Type 7"), - (3700,"Type 8"), - (3800,"Type 9"), - (3900,"Type 10"), - (4000,"Type 11"), - (4100,"Type 12"), - (4200,"Type 13"), - (4300,"Type 14"), - (4400,"Type 15"), - (4500,"Type 16"), - (4600,"Type 17"), - (4700,"Type 18"), - (4800,"Type 19"), - (4900,"Type 20"), - (5000,"Travel Hairstyle"), - (10000,"Head"), - (10100,"Body"), - (10200,"Arms"), - (10300,"Legs"), - (40000,"Iron Helmet"), - (40100,"Scale Armor"), - (40200,"Iron Gauntlets"), - (40300,"Leather Trousers"), - (50000,"Kaiden Helm"), - (50100,"Kaiden Armor"), - (50200,"Kaiden Gauntlets"), - (50300,"Kaiden Trousers"), - (60000,"Drake Knight Helm"), - (60100,"Drake Knight Armor"), - (60200,"Drake Knight Gauntlets"), - (60300,"Drake Knight Greaves"), - (61000,"Drake Knight Helm (Altered)"), - (61100,"Drake Knight Armor (Altered)"), - (80000,"Scaled Helm"), - (80100,"Scaled Armor"), - (80200,"Scaled Gauntlets"), - (80300,"Scaled Greaves"), - (81100,"Scaled Armor (Altered)"), - (90000,"Perfumer Hood"), - (90100,"Perfumer Robe"), - (90200,"Perfumer Gloves"), - (90300,"Perfumer Sarong"), - (91100,"Perfumer Robe (Altered)"), - (100000,"Traveler's Hat"), - (100100,"Perfumer's Traveling Garb"), - (100200,"Traveler's Gloves"), - (100300,"Traveler's Slops"), - (101100,"Perfumer's Traveling Garb (Altered)"), - (120000,"Alberich's Pointed Hat"), - (120100,"Alberich's Robe"), - (120200,"Alberich's Bracers"), - (120300,"Alberich's Trousers"), - (121000,"Alberich's Pointed Hat (Altered)"), - (121100,"Alberich's Robe (Altered)"), - (130000,"Spellblade's Pointed Hat"), - (130100,"Spellblade's Traveling Attire"), - (130200,"Spellblade's Gloves"), - (130300,"Spellblade's Trousers"), - (131100,"Spellblade's Traveling Attire (Altered)"), - (140000,"Bull-Goat Helm"), - (140100,"Bull-Goat Armor"), - (140200,"Bull-Goat Gauntlets"), - (140300,"Bull-Goat Greaves"), - (150000,"Iron Kasa"), - (150100,"Ronin's Armor"), - (150200,"Ronin's Gauntlets"), - (150300,"Ronin's Greaves"), - (151100,"Ronin's Armor (Altered)"), - (160000,"Guilty Hood"), - (160100,"Cloth Garb"), - (160300,"Cloth Trousers"), - (170000,"Black Wolf Mask"), - (170100,"Blaidd's Armor"), - (170200,"Blaidd's Gauntlets"), - (170300,"Blaidd's Greaves"), - (171100,"Blaidd's Armor (Altered)"), - (180000,"Black Knife Hood"), - (180100,"Black Knife Armor"), - (180200,"Black Knife Gauntlets"), - (180300,"Black Knife Greaves"), - (181100,"Black Knife Armor (Altered)"), - (190000,"Exile Hood"), - (190100,"Exile Armor"), - (190200,"Exile Gauntlets"), - (190300,"Exile Greaves"), - (200000,"Banished Knight Helm"), - (200100,"Banished Knight Armor"), - (200200,"Banished Knight Gauntlets"), - (200300,"Banished Knight Greaves"), - (201000,"Banished Knight Helm (Altered)"), - (201100,"Banished Knight Armor (Altered)"), - (202100,""), - (210000,"Briar Helm"), - (210100,"Briar Armor"), - (210200,"Briar Gauntlets"), - (210300,"Briar Greaves"), - (211100,"Briar Armor (Altered)"), - (220000,"Page Hood"), - (220100,"Page Garb"), - (220300,"Page Trousers"), - (221100,"Page Garb (Altered)"), - (230000,"Night's Cavalry Helm"), - (230100,"Night's Cavalry Armor"), - (230200,"Night's Cavalry Gauntlets"), - (230300,"Night's Cavalry Greaves"), - (231000,"Night's Cavalry Helm (Altered)"), - (231100,"Night's Cavalry Armor (Altered)"), - (240000,"Blue Silver Mail Hood"), - (240100,"Blue Silver Mail Armor"), - (240200,"Blue Silver Bracelets"), - (240300,"Blue Silver Mail Skirt"), - (241100,"Blue Silver Mail Armor (Altered)"), - (250000,"Nomadic Merchant's Chapeau"), - (250100,"Nomadic Merchant's Finery"), - (250300,"Nomadic Merchant's Trousers"), - (251100,"Nomadic Merchant's Finery (Altered)"), - (260000,"Malformed Dragon Helm"), - (260100,"Malformed Dragon Armor"), - (260200,"Malformed Dragon Gauntlets"), - (260300,"Malformed Dragon Greaves"), - (270000,"Tree Sentinel Helm"), - (270100,"Tree Sentinel Armor"), - (270200,"Tree Sentinel Gauntlets"), - (270300,"Tree Sentinel Greaves"), - (271100,"Tree Sentinel Armor (Altered)"), - (280000,"Royal Knight Helm"), - (280100,"Royal Knight Armor"), - (280200,"Royal Knight Gauntlets"), - (280300,"Royal Knight Greaves"), - (281100,"Royal Knight Armor (Altered)"), - (290000,"Nox Monk Hood"), - (290100,"Nox Monk Armor"), - (290200,"Nox Bracelets"), - (290300,"Nox Greaves"), - (291000,"Nox Monk Hood (Altered)"), - (291100,"Nox Monk Armor (Altered)"), - (292000,"Nox Swordstress Crown"), - (292100,"Nox Swordstress Armor"), - (293000,"Night Maiden Twin Crown"), - (293100,"Night Maiden Armor"), - (294000,"Nox Swordstress Crown (Altered)"), - (294100,"Nox Swordstress Armor (Altered)"), - (300000,"Great Horned Headband"), - (300100,"Fur Raiment"), - (300300,"Fur Leggings"), - (301000,"Shining Horned Headband"), - (301100,"Shaman Furs"), - (301300,"Shaman Leggings"), - (310000,"Duelist Helm"), - (310100,"Gravekeeper Cloak"), - (310300,"Duelist Greaves"), - (311100,"Gravekeeper Cloak (Altered)"), - (320000,"Sanguine Noble Hood"), - (320100,"Sanguine Noble Robe"), - (320300,"Sanguine Noble Waistcloth"), - (330000,"Guardian Mask"), - (330100,"Guardian Garb (Full Bloom)"), - (330200,"Guardian Bracers"), - (330300,"Guardian Greaves"), - (331100,"Guardian Garb"), - (340000,"Cleanrot Helm"), - (340100,"Cleanrot Armor"), - (340200,"Cleanrot Gauntlets"), - (340300,"Cleanrot Greaves"), - (341000,"Cleanrot Helm (Altered)"), - (341100,"Cleanrot Armor (Altered)"), - (350000,"Fire Monk Hood"), - (350100,"Fire Monk Armor"), - (350200,"Fire Monk Gauntlets"), - (350300,"Fire Monk Greaves"), - (351000,"Blackflame Monk Hood"), - (351100,"Blackflame Monk Armor"), - (351200,"Blackflame Monk Gauntlets"), - (351300,"Blackflame Monk Greaves"), - (360000,"Fire Prelate Helm"), - (360100,"Fire Prelate Armor"), - (360200,"Fire Prelate Gauntlets"), - (360300,"Fire Prelate Greaves"), - (361100,"Fire Prelate Armor (Altered)"), - (370000,"Aristocrat Headband"), - (370100,"Aristocrat Garb"), - (370300,"Aristocrat Boots"), - (371100,"Aristocrat Garb (Altered)"), - (380000,"Aristocrat Hat"), - (380100,"Aristocrat Coat"), - (390000,"Old Aristocrat Cowl"), - (390100,"Old Aristocrat Gown"), - (390300,"Old Aristocrat Shoes"), - (420000,"Vulgar Militia Helm"), - (420100,"Vulgar Militia Armor"), - (420200,"Vulgar Militia Gauntlets"), - (420300,"Vulgar Militia Greaves"), - (430000,"Sage Hood"), - (430100,"Sage Robe"), - (430300,"Sage Trousers"), - (440000,"Pumpkin Helm"), - (460000,"Elden Lord Crown"), - (460100,"Elden Lord Armor"), - (460200,"Elden Lord Bracers"), - (460300,"Elden Lord Greaves"), - (461100,"Elden Lord Armor (Altered)"), - (470000,"Radahn's Redmane Helm"), - (470100,"Radahn's Lion Armor"), - (470200,"Radahn's Gauntlets"), - (470300,"Radahn's Greaves"), - (471100,"Radahn's Lion Armor (Altered)"), - (480100,"Lord of Blood's Robe"), - (481100,"Lord of Blood's Robe (Altered)"), - (510000,"Queen's Crescent Crown"), - (510100,"Queen's Robe"), - (510200,"Queen's Bracelets"), - (510300,"Queen's Leggings"), - (520000,"Godskin Apostle Hood"), - (520100,"Godskin Apostle Robe"), - (520200,"Godskin Apostle Bracelets"), - (520300,"Godskin Apostle Trousers"), - (530000,"Godskin Noble Hood"), - (530100,"Godskin Noble Robe"), - (530200,"Godskin Noble Bracelets"), - (530300,"Godskin Noble Trousers"), - (540000,"Depraved Perfumer Headscarf"), - (540100,"Depraved Perfumer Robe"), - (540200,"Depraved Perfumer Gloves"), - (540300,"Depraved Perfumer Trousers"), - (541100,"Depraved Perfumer Robe (Altered)"), - (570000,"Crucible Axe Helm"), - (570100,"Crucible Axe Armor"), - (570200,"Crucible Gauntlets"), - (570300,"Crucible Greaves"), - (571000,"Crucible Tree Helm"), - (571100,"Crucible Tree Armor"), - (572100,"Crucible Axe Armor (Altered)"), - (573100,"Crucible Tree Armor (Altered)"), - (580000,"Lusat's Glintstone Crown"), - (580100,"Lusat's Robe"), - (580200,"Lusat's Manchettes"), - (580300,"Old Sorcerer's Legwraps"), - (581000,"Azur's Glintstone Crown"), - (581100,"Azur's Glintstone Robe"), - (581200,"Azur's Manchettes"), - (590000,"All-Knowing Helm"), - (590100,"All-Knowing Armor"), - (590200,"All-Knowing Gauntlets"), - (590300,"All-Knowing Greaves"), - (591100,"All-Knowing Armor (Altered)"), - (600000,"Twinned Helm"), - (600100,"Twinned Armor"), - (600200,"Twinned Gauntlets"), - (600300,"Twinned Greaves"), - (601100,"Twinned Armor (Altered)"), - (610000,"Ragged Hat"), - (610100,"Ragged Armor"), - (610200,"Ragged Gloves"), - (610300,"Ragged Loincloth"), - (611000,"Ragged Hat (Altered)"), - (611100,"Ragged Armor (Altered)"), - (620000,"Prophet Blindfold"), - (620100,"Corhyn's Robe"), - (620300,"Prophet Trousers"), - (621100,"Prophet Robe (Altered)"), - (622100,"Prophet Robe"), - (630000,"Astrologer Hood"), - (630100,"Astrologer Robe"), - (630200,"Astrologer Gloves"), - (630300,"Astrologer Trousers"), - (631100,"Astrologer Robe (Altered)"), - (640000,"Lionel's Helm"), - (640100,"Lionel's Armor"), - (640200,"Lionel's Gauntlets"), - (640300,"Lionel's Greaves"), - (641100,"Lionel's Armor (Altered)"), - (650000,"Hoslow's Helm"), - (650100,"Hoslow's Armor"), - (650200,"Hoslow's Gauntlets"), - (650300,"Hoslow's Greaves"), - (651000,"Diallos's Mask"), - (652100,"Hoslow's Armor (Altered)"), - (660000,"Vagabond Knight Helm"), - (660100,"Vagabond Knight Armor"), - (660200,"Vagabond Knight Gauntlets"), - (660300,"Vagabond Knight Greaves"), - (661100,"Vagabond Knight Armor (Altered)"), - (670000,"Blue Cloth Cowl"), - (670100,"Blue Cloth Vest"), - (670200,"Warrior Gauntlets"), - (670300,"Warrior Greaves"), - (680000,"White Mask"), - (680100,"War Surgeon Gown"), - (680200,"War Surgeon Gloves"), - (680300,"War Surgeon Trousers"), - (681100,"War Surgeon Gown (Altered)"), - (690000,"Royal Remains Helm"), - (690100,"Royal Remains Armor"), - (690200,"Royal Remains Gauntlets"), - (690300,"Royal Remains Greaves"), - (700000,"Brave's Cord Circlet"), - (700100,"Brave's Battlewear"), - (700200,"Brave's Bracer"), - (700300,"Brave's Legwraps"), - (701000,"Brave's Leather Helm"), - (702000,"Brave's Battlewear (Altered)"), - (720000,"Beast Champion Helm"), - (720100,"Beast Champion Armor"), - (720200,"Beast Champion Gauntlets"), - (720300,"Beast Champion Greaves"), - (721100,"Beast Champion Armor (Altered)"), - (730000,"Champion Headband"), - (730100,"Champion Pauldron"), - (730200,"Champion Bracers"), - (730300,"Champion Gaiters"), - (740000,"Crimson Hood"), - (740100,"Noble's Traveling Garb"), - (740200,"Noble's Gloves"), - (740300,"Noble's Trousers"), - (741000,"Navy Hood"), - (742000,""), - (760000,"Maliketh's Helm"), - (760100,"Maliketh's Armor"), - (760200,"Maliketh's Gauntlets"), - (760300,"Maliketh's Greaves"), - (761100,"Maliketh's Armor (Altered)"), - (770000,"Malenia's Winged Helm"), - (770100,"Malenia's Armor"), - (770200,"Malenia's Gauntlet"), - (770300,"Malenia's Greaves"), - (771100,"Malenia's Armor (Altered)"), - (780000,"Veteran's Helm"), - (780100,"Veteran's Armor"), - (780200,"Veteran's Gauntlets"), - (780300,"Veteran's Greaves"), - (781100,"Veteran's Armor (Altered)"), - (790000,"Bloodhound Knight Helm"), - (790100,"Bloodhound Knight Armor"), - (790200,"Bloodhound Knight Gauntlets"), - (790300,"Bloodhound Knight Greaves"), - (791100,"Bloodhound Knight Armor (Altered)"), - (800000,"Festive Hood"), - (800100,"Festive Garb"), - (801000,"Festive Hood (Altered)"), - (801100,"Festive Garb (Altered)"), - (802000,"Blue Festive Hood"), - (802100,"Blue Festive Garb"), - (810000,"Commoner's Headband"), - (810100,"Commoner's Garb"), - (810300,"Commoner's Shoes"), - (811000,"Commoner's Headband (Altered)"), - (811100,"Commoner's Garb (Altered)"), - (812000,"Commoner's Simple Garb"), - (812100,"Commoner's Simple Garb (Altered)"), - (820000,"Envoy Crown"), - (830000,"Twinsage Glintstone Crown"), - (830100,"Raya Lucarian Robe"), - (830200,"Sorcerer Manchettes"), - (830300,"Sorcerer Leggings"), - (831000,"Olivinus Glintstone Crown"), - (832000,"Lazuli Glintstone Crown"), - (833000,"Karolos Glintstone Crown"), - (834000,"Witch's Glintstone Crown"), - (834100,""), - (835000,""), - (835100,""), - (835200,""), - (835300,""), - (836000,""), - (840000,"Marionette Soldier Helm"), - (840100,"Marionette Soldier Armor"), - (850000,"Marionette Soldier Birdhelm"), - (860000,"Raging Wolf Helm"), - (860100,"Raging Wolf Armor"), - (860200,"Raging Wolf Gauntlets"), - (860300,"Raging Wolf Greaves"), - (861100,"Raging Wolf Armor (Altered)"), - (870000,"Land of Reeds Helm"), - (870100,"Land of Reeds Armor"), - (870200,"Land of Reeds Gauntlets"), - (870300,"Land of Reeds Greaves"), - (871100,"Land of Reeds Armor (Altered)"), - (872000,"Okina Mask"), - (872100,"White Reed Armor"), - (872200,"White Reed Gauntlets"), - (872300,"White Reed Greaves"), - (873000,""), - (880000,"Confessor Hood"), - (880100,"Confessor Armor"), - (880200,"Confessor Gloves"), - (880300,"Confessor Boots"), - (881000,"Confessor Hood (Altered)"), - (881100,"Confessor Armor (Altered)"), - (890000,"Prisoner Iron Mask"), - (890100,"Prisoner Clothing"), - (890300,"Prisoner Trousers"), - (891000,"Blackguard's Iron Mask"), - (892100,""), - (900000,"Traveling Maiden Hood"), - (900100,"Traveling Maiden Robe"), - (900200,"Traveling Maiden Gloves"), - (900300,"Traveling Maiden Boots"), - (901100,"Traveling Maiden Robe (Altered)"), - (901200,""), - (901600,""), - (902000,"Finger Maiden Fillet"), - (902100,"Finger Maiden Robe"), - (902300,"Finger Maiden Shoes"), - (903100,"Finger Maiden Robe (Altered)"), - (904100,""), - (910000,"Preceptor's Big Hat"), - (910100,"Preceptor's Long Gown"), - (910200,"Preceptor's Gloves"), - (910300,"Preceptor's Trousers"), - (911000,"Mask of Confidence"), - (911100,"Preceptor's Long Gown (Altered)"), - (912000,""), - (912100,""), - (912200,""), - (912300,""), - (913000,""), - (920000,"Grass Hair Ornament"), - (930000,"Skeletal Mask"), - (930100,"Raptor's Black Feathers"), - (930200,"Bandit Manchettes"), - (930300,"Bandit Boots"), - (931100,"Bandit Garb"), - (940000,"Eccentric's Hood"), - (940100,"Eccentric's Armor"), - (940200,"Eccentric's Manchettes"), - (940300,"Eccentric's Breeches"), - (941000,"Eccentric's Hood (Altered)"), - (950000,"Fingerprint Helm"), - (950100,"Fingerprint Armor"), - (950200,"Fingerprint Gauntlets"), - (950300,"Fingerprint Greaves"), - (951100,"Fingerprint Armor (Altered)"), - (960000,"Consort's Mask"), - (960100,"Consort's Robe"), - (960300,"Consort's Trousers"), - (961000,"Ruler's Mask"), - (961100,"Ruler's Robe"), - (962100,"Upper-Class Robe"), - (963000,"Marais Mask"), - (963100,"Marais Robe"), - (963200,"Bloodsoaked Manchettes"), - (964000,"Bloodsoaked Mask"), - (964100,"Official's Attire"), - (965000,""), - (965100,""), - (965300,""), - (966000,""), - (967000,""), - (970000,"Omen Helm"), - (970100,"Omen Armor"), - (970200,"Omen Gauntlets"), - (970300,"Omen Greaves"), - (980000,"Carian Knight Helm"), - (980100,"Carian Knight Armor"), - (980200,"Carian Knight Gauntlets"), - (980300,"Carian Knight Greaves"), - (981100,"Carian Knight Armor (Altered)"), - (990000,"Hierodas Glintstone Crown"), - (990100,"Errant Sorcerer Robe"), - (990200,"Errant Sorcerer Manchettes"), - (990300,"Errant Sorcerer Boots"), - (991100,"Errant Sorcerer Robe (Altered)"), - (992000,""), - (1000000,"Haima Glintstone Crown"), - (1000100,"Battlemage Robe"), - (1000200,"Battlemage Manchettes"), - (1000300,"Battlemage Legwraps"), - (1010000,"Snow Witch Hat"), - (1010100,"Snow Witch Robe"), - (1010300,"Snow Witch Skirt"), - (1011100,"Snow Witch Robe (Altered)"), - (1020100,"Traveler's Clothes"), - (1020200,"Traveler's Manchettes"), - (1020300,"Traveler's Boots"), - (1030000,"Juvenile Scholar Cap"), - (1030100,"Juvenile Scholar Robe"), - (1040000,"Radiant Gold Mask"), - (1040100,"Goldmask's Rags"), - (1040200,"Gold Bracelets"), - (1040300,"Gold Waistwrap"), - (1050100,"Fell Omen Cloak"), - (1060000,"Albinauric Mask"), - (1060100,"Dirty Chainmail"), - (1070000,"Zamor Mask"), - (1070100,"Zamor Armor"), - (1070200,"Zamor Bracelets"), - (1070300,"Zamor Legwraps"), - (1080000,"Imp Head (Cat)"), - (1081000,"Imp Head (Fanged)"), - (1082000,"Imp Head (Long-Tongued)"), - (1083000,"Imp Head (Corpse)"), - (1084000,"Imp Head (Wolf)"), - (1085000,"Imp Head (Elder)"), - (1090000,"Silver Tear Mask"), - (1100000,"Chain Coif"), - (1100100,"Chain Armor"), - (1100200,"Chain Gauntlets"), - (1100300,"Chain Leggings"), - (1101000,"Greathelm"), - (1101100,"Eye Surcoat"), - (1102100,"Tree Surcoat"), - (1110000,"Octopus Head"), - (1120000,"Jar"), - (1130000,"Mushroom Head"), - (1130100,"Mushroom Body"), - (1130200,"Mushroom Arms"), - (1130300,"Mushroom Legs"), - (1300000,"Nox Mirrorhelm"), - (1301000,"Iji's Mirrorhelm"), - (1400000,"Black Hood"), - (1400100,"Leather Armor"), - (1400200,"Leather Gloves"), - (1400300,"Leather Boots"), - (1401000,"Bandit Mask"), - (1500000,"Knight Helm"), - (1500100,"Knight Armor"), - (1500200,"Knight Gauntlets"), - (1500300,"Knight Greaves"), - (1600000,"Greathood"), - (1610000,""), - (1700000,"Godrick Soldier Helm"), - (1700100,"Tree-and-Beast Surcoat"), - (1700200,"Godrick Soldier Gauntlets"), - (1700300,"Godrick Soldier Greaves"), - (1710000,"Raya Lucarian Helm"), - (1710100,"Cuckoo Surcoat"), - (1710200,"Raya Lucarian Gauntlets"), - (1710300,"Raya Lucarian Greaves"), - (1720000,"Leyndell Soldier Helm"), - (1720100,"Erdtree Surcoat"), - (1720200,"Leyndell Soldier Gauntlets"), - (1720300,"Leyndell Soldier Greaves"), - (1730000,"Radahn Soldier Helm"), - (1730100,"Redmane Surcoat"), - (1730200,"Radahn Soldier Gauntlets"), - (1730300,"Radahn Soldier Greaves"), - (1740100,"Mausoleum Surcoat"), - (1740200,"Mausoleum Gauntlets"), - (1740300,"Mausoleum Greaves"), - (1750000,"Haligtree Helm"), - (1750100,"Haligtree Crest Surcoat"), - (1750200,"Haligtree Gauntlets"), - (1750300,"Haligtree Greaves"), - (1760000,"Gelmir Knight Helm"), - (1760100,"Gelmir Knight Armor"), - (1760200,"Gelmir Knight Gauntlets"), - (1760300,"Gelmir Knight Greaves"), - (1761100,"Gelmir Knight Armor (Altered)"), - (1770000,"Godrick Knight Helm"), - (1770100,"Godrick Knight Armor"), - (1770200,"Godrick Knight Gauntlets"), - (1770300,"Godrick Knight Greaves"), - (1771100,"Godrick Knight Armor (Altered)"), - (1780000,"Cuckoo Knight Helm"), - (1780100,"Cuckoo Knight Armor"), - (1780200,"Cuckoo Knight Gauntlets"), - (1780300,"Cuckoo Knight Greaves"), - (1781100,"Cuckoo Knight Armor (Altered)"), - (1790000,"Leyndell Knight Helm"), - (1790100,"Leyndell Knight Armor"), - (1790200,"Leyndell Knight Gauntlets"), - (1790300,"Leyndell Knight Greaves"), - (1791100,"Leyndell Knight Armor (Altered)"), - (1800000,"Redmane Knight Helm"), - (1800100,"Redmane Knight Armor"), - (1800200,"Redmane Knight Gauntlets"), - (1800300,"Redmane Knight Greaves"), - (1801100,"Redmane Knight Armor (Altered)"), - (1810100,"Mausoleum Knight Armor"), - (1810200,"Mausoleum Knight Gauntlets"), - (1810300,"Mausoleum Knight Greaves"), - (1811100,"Mausoleum Knight Armor (Altered)"), - (1820000,"Haligtree Knight Helm"), - (1820100,"Haligtree Knight Armor"), - (1820200,"Haligtree Knight Gauntlets"), - (1820300,"Haligtree Knight Greaves"), - (1821100,"Haligtree Knight Armor (Altered)"), - (1830000,"Foot Soldier Cap"), - (1830100,"Chain-Draped Tabard"), - (1830200,"Foot Soldier Gauntlets"), - (1830300,"Foot Soldier Greaves"), - (1840000,"Foot Soldier Helmet"), - (1840100,"Foot Soldier Tabard"), - (1850000,"Gilded Foot Soldier Cap"), - (1850100,"Leather-Draped Tabard"), - (1860000,"Foot Soldier Helm"), - (1860100,"Scarlet Tabard"), - (1870100,"Bloodsoaked Tabard"), - (1880000,"Sacred Crown Helm"), - (1880100,"Ivory-Draped Tabard"), - (1890000,"Omensmirk Mask"), - (1890100,"Omenkiller Robe"), - (1890200,"Omenkiller Long Gloves"), - (1890300,"Omenkiller Boots"), - (1900000,"Ash-of-War Scarab"), - (1901000,"Incantation Scarab"), - (1902000,"Glintstone Scarab"), - (1910000,"Crimson Tear Scarab"), - (1920000,"Cerulean Tear Scarab"), - (1930100,"Deathbed Dress"), - (1930300,"Deathbed Smalls"), - (1932100,""), - (1940000,"Fia's Hood"), - (1940100,"Fia's Robe"), - (1941100,"Fia's Robe (Altered)"), - (1950100,"Millicent's Robe"), - (1950200,"Millicent's Gloves"), - (1950300,"Millicent's Boots"), - (1960100,""), - (1960200,""), - (1970100,"Millicent's Tunic"), - (1970200,"Golden Prosthetic"), - (1971100,""), - (1971200,""), - (1980000,"Highwayman Hood"), - (1980100,"Highwayman Cloth Armor"), - (1980200,"Highwayman Gauntlets"), - (1990000,"High Page Hood"), - (1990100,"High Page Clothes"), - (1991100,"High Page Clothes (Altered)"), - (2000000,"Rotten Duelist Helm"), - (2000100,"Rotten Gravekeeper Cloak"), - (2000300,"Rotten Duelist Greaves"), - (2001100,"Rotten Gravekeeper Cloak (Altered)"), - (2010000,"Mushroom Crown"), - (2020000,"Black Dumpling"), - (2030000,"Lazuli Robe"), - ])) - }); -} \ No newline at end of file diff --git a/src/db/item_name.rs b/src/db/item_name.rs deleted file mode 100644 index f454907..0000000 --- a/src/db/item_name.rs +++ /dev/null @@ -1,1815 +0,0 @@ -pub mod item_name { - use std::{collections::HashMap, sync::Mutex}; - pub static ITEM_NAME: Lazy>> = Lazy::new(|| { - Mutex::new(HashMap::from([ - (0, "Empty"), - (10, ""), - (11, ""), - (12, ""), - (13, ""), - (14, ""), - (15, ""), - (16, ""), - (20, ""), - (21, ""), - (22, ""), - (23, ""), - (24, ""), - (25, ""), - (26, ""), - (27, ""), - (28, ""), - (29, ""), - (30, ""), - (31, ""), - (35, ""), - (40, ""), - (41, ""), - (42, ""), - (43, ""), - (44, ""), - (60, ""), - (61, ""), - (62, ""), - (63, ""), - (64, ""), - (65, ""), - (66, ""), - (67, ""), - (68, ""), - (69, ""), - (70, ""), - (71, ""), - (72, ""), - (73, ""), - (74, ""), - (75, ""), - (76, ""), - (77, ""), - (78, ""), - (79, ""), - (90, ""), - (91, ""), - (92, ""), - (93, ""), - (94, ""), - (98, ""), - (99, ""), - (100, "Tarnished's Furled Finger"), - (101, "Duelist's Furled Finger"), - (102, "Bloody Finger"), - (103, "Finger Severer"), - (104, "White Cipher Ring"), - (105, "Blue Cipher Ring"), - (106, "Tarnished's Wizened Finger"), - (107, "Phantom Bloody Finger"), - (108, "Taunter's Tongue"), - (109, "Small Golden Effigy"), - (110, "Small Red Effigy"), - (111, "Festering Bloody Finger"), - (112, "Recusant Finger"), - (113, "Phantom Bloody Finger"), - (114, "Phantom Recusant Finger"), - (115, "Memory of Grace"), - (130, "Spectral Steed Whistle"), - (135, "Phantom Great Rune"), - (150, "Furlcalling Finger Remedy"), - (166, ""), - (170, "Tarnished's Furled Finger"), - (171, "Duelist's Furled Finger"), - (172, "Bloody Finger"), - (174, "White Cipher Ring"), - (175, "Blue Cipher Ring"), - (178, "Taunter's Tongue"), - (179, "Small Golden Effigy"), - (180, "Small Red Effigy"), - (181, "Spectral Steed Whistle"), - (182, "Furlcalling Finger Remedy"), - (183, "Festering Bloody Finger"), - (184, "Recusant Finger"), - (190, "Rune Arc"), - (191, "Godrick's Great Rune"), - (192, "Radahn's Great Rune"), - (193, "Morgott's Great Rune"), - (194, "Rykard's Great Rune"), - (195, "Mohg's Great Rune"), - (196, "Malenia's Great Rune"), - (250, "Flask of Wondrous Physick"), - (251, "Flask of Wondrous Physick"), - (300, "Fire Pot"), - (301, "Redmane Fire Pot"), - (302, "Giantsflame Fire Pot"), - (320, "Lightning Pot"), - (321, "Ancient Dragonbolt Pot"), - (330, "Fetid Pot"), - (340, "Swarm Pot"), - (350, "Holy Water Pot"), - (351, "Sacred Order Pot"), - (360, "Freezing Pot"), - (370, "Poison Pot"), - (380, "Oil Pot"), - (390, "Alluring Pot"), - (391, "Beastlure Pot"), - (400, "Roped Fire Pot"), - (420, "Roped Lightning Pot"), - (430, "Roped Fetid Pot"), - (440, "Roped Poison Pot"), - (450, "Roped Oil Pot"), - (460, "Roped Magic Pot"), - (470, "Roped Fly Pot"), - (480, "Roped Freezing Pot"), - (490, "Roped Volcano Pot"), - (510, "Roped Holy Water Pot"), - (600, "Volcano Pot"), - (610, "Albinauric Pot"), - (630, "Cursed-Blood Pot"), - (640, "Sleep Pot"), - (650, "Rancor Pot"), - (660, "Magic Pot"), - (661, "Academy Magic Pot"), - (670, "Rot Pot"), - (810, "Rowa Raisin"), - (811, "Sweet Raisin"), - (812, "Frozen Raisin"), - (820, "Boiled Crab"), - (830, "Boiled Prawn"), - (900, "Neutralizing Boluses"), - (910, "Stanching Boluses"), - (920, "Thawfrost Boluses"), - (930, "Stimulating Boluses"), - (940, "Preserving Boluses"), - (950, "Rejuvenating Boluses"), - (960, "Clarifying Boluses"), - (1000, "Flask of Crimson Tears"), - (1001, "Flask of Crimson Tears"), - (1002, "Flask of Crimson Tears +1"), - (1003, "Flask of Crimson Tears +1"), - (1004, "Flask of Crimson Tears +2"), - (1005, "Flask of Crimson Tears +2"), - (1006, "Flask of Crimson Tears +3"), - (1007, "Flask of Crimson Tears +3"), - (1008, "Flask of Crimson Tears +4"), - (1009, "Flask of Crimson Tears +4"), - (1010, "Flask of Crimson Tears +5"), - (1011, "Flask of Crimson Tears +5"), - (1012, "Flask of Crimson Tears +6"), - (1013, "Flask of Crimson Tears +6"), - (1014, "Flask of Crimson Tears +7"), - (1015, "Flask of Crimson Tears +7"), - (1016, "Flask of Crimson Tears +8"), - (1017, "Flask of Crimson Tears +8"), - (1018, "Flask of Crimson Tears +9"), - (1019, "Flask of Crimson Tears +9"), - (1020, "Flask of Crimson Tears +10"), - (1021, "Flask of Crimson Tears +10"), - (1022, "Flask of Crimson Tears +11"), - (1023, "Flask of Crimson Tears +11"), - (1024, "Flask of Crimson Tears +12"), - (1025, "Flask of Crimson Tears +12"), - (1050, "Flask of Cerulean Tears"), - (1051, "Flask of Cerulean Tears"), - (1052, "Flask of Cerulean Tears +1"), - (1053, "Flask of Cerulean Tears +1"), - (1054, "Flask of Cerulean Tears +2"), - (1055, "Flask of Cerulean Tears +2"), - (1056, "Flask of Cerulean Tears +3"), - (1057, "Flask of Cerulean Tears +3"), - (1058, "Flask of Cerulean Tears +4"), - (1059, "Flask of Cerulean Tears +4"), - (1060, "Flask of Cerulean Tears +5"), - (1061, "Flask of Cerulean Tears +5"), - (1062, "Flask of Cerulean Tears +6"), - (1063, "Flask of Cerulean Tears +6"), - (1064, "Flask of Cerulean Tears +7"), - (1065, "Flask of Cerulean Tears +7"), - (1066, "Flask of Cerulean Tears +8"), - (1067, "Flask of Cerulean Tears +8"), - (1068, "Flask of Cerulean Tears +9"), - (1069, "Flask of Cerulean Tears +9"), - (1070, "Flask of Cerulean Tears +10"), - (1071, "Flask of Cerulean Tears +10"), - (1072, "Flask of Cerulean Tears +11"), - (1073, "Flask of Cerulean Tears +11"), - (1074, "Flask of Cerulean Tears +12"), - (1075, "Flask of Cerulean Tears +12"), - (1100, "Pickled Turtle Neck"), - (1110, "Immunizing Cured Meat"), - (1120, "Invigorating Cured Meat"), - (1130, "Clarifying Cured Meat"), - (1140, "Dappled Cured Meat"), - (1150, "Spellproof Dried Liver"), - (1160, "Fireproof Dried Liver"), - (1170, "Lightningproof Dried Liver"), - (1180, "Holyproof Dried Liver"), - (1190, "Silver-Pickled Fowl Foot"), - (1200, "Gold-Pickled Fowl Foot"), - (1210, "Exalted Flesh"), - (1220, "Deathsbane Jerky"), - (1235, "Raw Meat Dumpling"), - (1240, "Shabriri Grape"), - (1290, "Starlight Shards"), - (1310, "Immunizing White Cured Meat"), - (1320, "Invigorating White Cured Meat"), - (1330, "Clarifying White Cured Meat"), - (1340, "Dappled White Cured Meat"), - (1350, "Deathsbane White Jerky"), - (1400, "Fire Grease"), - (1410, "Lightning Grease"), - (1420, "Magic Grease"), - (1430, "Holy Grease"), - (1440, "Blood Grease"), - (1450, "Soporific Grease"), - (1460, "Poison Grease"), - (1470, "Freezing Grease"), - (1480, "Dragonwound Grease"), - (1490, "Rot Grease"), - (1500, "Drawstring Fire Grease"), - (1510, "Drawstring Lightning Grease"), - (1520, "Drawstring Magic Grease"), - (1530, "Drawstring Holy Grease"), - (1540, "Drawstring Blood Grease"), - (1550, "Drawstring Soporific Grease"), - (1560, "Drawstring Poison Grease"), - (1570, "Drawstring Freezing Grease"), - (1590, "Drawstring Rot Grease"), - (1690, "Shield Grease"), - (1700, "Throwing Dagger"), - (1710, "Bone Dart"), - (1720, "Poisonbone Dart"), - (1730, "Kukri"), - (1740, "Crystal Dart"), - (1750, "Fan Daggers"), - (1760, "Ruin Fragment"), - (1830, "Explosive Stone"), - (1831, "Explosive Stone Clump"), - (1840, "Poisoned Stone"), - (1841, "Poisoned Stone Clump"), - (2020, "Rainbow Stone"), - (2030, "Glowstone"), - (2040, "Telescope"), - (2050, "Grace Mimic"), - (2070, "Lantern"), - (2080, "Blasphemous Claw"), - (2090, "Deathroot"), - (2100, "Soft Cotton"), - (2120, "Soap"), - (2130, "Celestial Dew"), - (2140, "Margit's Shackle"), - (2150, "Mohg's Shackle"), - (2160, "Pureblood Knight's Medal"), - (2190, "Miquella's Needle"), - (2200, "Prattling Pate 'Hello'"), - (2201, "Prattling Pate 'Thank you'"), - (2202, "Prattling Pate 'Apologies'"), - (2203, "Prattling Pate 'Wonderful'"), - (2204, "Prattling Pate 'Please help'"), - (2205, "Prattling Pate 'My beloved'"), - (2206, "Prattling Pate 'Let's get to it'"), - (2207, "Prattling Pate 'You're beautiful'"), - (2900, "Golden Rune [1]"), - (2901, "Golden Rune [2]"), - (2902, "Golden Rune [3]"), - (2903, "Golden Rune [4]"), - (2904, "Golden Rune [5]"), - (2905, "Golden Rune [6]"), - (2906, "Golden Rune [7]"), - (2907, "Golden Rune [8]"), - (2908, "Golden Rune [9]"), - (2909, "Golden Rune [10]"), - (2910, "Golden Rune [11]"), - (2911, "Golden Rune [12]"), - (2912, "Golden Rune [13]"), - (2913, "Numen's Rune"), - (2914, "Hero's Rune [1]"), - (2915, "Hero's Rune [2]"), - (2916, "Hero's Rune [3]"), - (2917, "Hero's Rune [4]"), - (2918, "Hero's Rune [5]"), - (2919, "Lord's Rune"), - (2950, "Remembrance of the Grafted"), - (2951, "Remembrance of the Starscourge"), - (2952, "Remembrance of the Omen King"), - (2953, "Remembrance of the Blasphemous"), - (2954, "Remembrance of the Rot Goddess"), - (2955, "Remembrance of the Blood Lord"), - (2956, "Remembrance of the Black Blade"), - (2957, "Remembrance of Hoarah Loux"), - (2958, "Remembrance of the Dragonlord"), - (2959, "Remembrance of the Full Moon Queen"), - (2960, "Remembrance of the Lichdragon"), - (2961, "Remembrance of the Fire Giant"), - (2962, "Remembrance of the Regal Ancestor"), - (2963, "Elden Remembrance"), - (2964, "Remembrance of the Naturalborn"), - (2990, "Lands Between Rune"), - (3000, "Ancestral Infant's Head"), - (3010, "Omen Bairn"), - (3011, "Regal Omen Bairn"), - (3020, "Miranda's Prayer"), - (3030, "Cuckoo Glintstone"), - (3040, "Mimic's Veil"), - (3050, "Glintstone Scrap"), - (3051, "Large Glintstone Scrap"), - (3060, "Gravity Stone Fan"), - (3070, "Gravity Stone Chunk"), - (3080, "Wraith Calling Bell"), - (3300, "Holy Water Grease"), - (3310, "Warming Stone"), - (3311, "Frenzyflame Stone"), - (3320, "Scriptstone"), - (3350, "Bewitching Branch"), - (3360, "Baldachin's Blessing"), - (3361, "Radiant Baldachin's Blessing"), - (3500, "Uplifting Aromatic"), - (3510, "Spark Aromatic"), - (3520, "Ironjar Aromatic"), - (3550, "Bloodboil Aromatic"), - (3580, "Poison Spraymist"), - (3610, "Acid Spraymist"), - (4000, "[Sorcery] Glintstone Pebble"), - (4001, "[Sorcery] Great Glintstone Shard"), - (4010, "[Sorcery] Swift Glintstone Shard"), - (4020, "[Sorcery] Glintstone Cometshard"), - (4021, "[Sorcery] Comet"), - (4030, "[Sorcery] Shard Spiral"), - (4040, "[Sorcery] Glintstone Stars"), - (4050, "[Sorcery] Star Shower"), - (4060, "[Sorcery] Crystal Barrage"), - (4070, "[Sorcery] Glintstone Arc"), - (4080, "[Sorcery] Cannon of Haima"), - (4090, "[Sorcery] Crystal Burst"), - (4100, "[Sorcery] Shatter Earth"), - (4110, "[Sorcery] Rock Blaster"), - (4120, "[Sorcery] Gavel of Haima"), - (4130, "[Sorcery] Terra Magicus"), - (4140, "[Sorcery] Starlight"), - (4200, "[Sorcery] Comet Azur"), - (4210, "[Sorcery] Founding Rain of Stars"), - (4220, "[Sorcery] Stars of Ruin"), - (4300, "[Sorcery] Glintblade Phalanx"), - (4301, "[Sorcery] Carian Phalanx"), - (4302, "[Sorcery] Greatblade Phalanx"), - (4360, "[Sorcery] Rennala's Full Moon"), - (4361, "[Sorcery] Ranni's Dark Moon"), - (4370, "[Sorcery] Magic Downpour"), - (4380, "[Sorcery] Loretta's Greatbow"), - (4381, "[Sorcery] Loretta's Mastery"), - (4390, "[Sorcery] Magic Glintblade"), - (4400, "[Sorcery] Glintstone Icecrag"), - (4410, "[Sorcery] Zamor Ice Storm"), - (4420, "[Sorcery] Freezing Mist"), - (4430, "[Sorcery] Carian Greatsword"), - (4431, "[Sorcery] Adula's Moonblade"), - (4440, "[Sorcery] Carian Slicer"), - (4450, "[Sorcery] Carian Piercer"), - (4460, "[Sorcery] Scholar's Armament"), - (4470, "[Sorcery] Scholar's Shield"), - (4480, "[Sorcery] Lucidity"), - (4490, "[Sorcery] Frozen Armament"), - (4500, "[Sorcery] Shattering Crystal"), - (4510, "[Sorcery] Crystal Release"), - (4520, "[Sorcery] Crystal Torrent"), - (4600, "[Sorcery] Ambush Shard"), - (4610, "[Sorcery] Night Shard"), - (4620, "[Sorcery] Night Comet"), - (4630, "[Sorcery] Thops's Barrier"), - (4640, "[Sorcery] Carian Retaliation"), - (4650, "[Sorcery] Eternal Darkness"), - (4660, "[Sorcery] Unseen Blade"), - (4670, "[Sorcery] Unseen Form"), - (4700, "[Sorcery] Meteorite"), - (4701, "[Sorcery] Meteorite of Astel"), - (4710, "[Sorcery] Rock Sling"), - (4720, "[Sorcery] Gravity Well"), - (4721, "[Sorcery] Collapsing Stars"), - (4800, "[Sorcery] Magma Shot"), - (4810, "[Sorcery] Gelmir's Fury"), - (4820, "[Sorcery] Roiling Magma"), - (4830, "[Sorcery] Rykard's Rancor"), - (4900, "[Sorcery] Briars of Sin"), - (4910, "[Sorcery] Briars of Punishment"), - (5000, "[Sorcery] Rancorcall"), - (5001, "[Sorcery] Ancient Death Rancor"), - (5010, "[Sorcery] Explosive Ghostflame"), - (5020, "[Sorcery] Fia's Mist"), - (5030, "[Sorcery] Tibia's Summons"), - (5040, "[Sorcery] Death Lightning"), - (5100, "[Sorcery] Oracle Bubbles"), - (5110, "[Sorcery] Great Oracular Bubble"), - (6000, "[Incantation] Catch Flame"), - (6001, "[Incantation] O- Flame!"), - (6010, "[Incantation] Flame Sling"), - (6020, "[Incantation] Flame- Fall Upon Them"), - (6030, "[Incantation] Whirl- O Flame!"), - (6040, "[Incantation] Flame- Cleanse Me"), - (6050, "[Incantation] Flame- Grant Me Strength"), - (6060, "[Incantation] Flame- Protect Me"), - (6100, "[Incantation] Giantsflame Take Thee"), - (6110, "[Incantation] Flame of the Fell God"), - (6120, "[Incantation] Burn- O Flame!"), - (6210, "[Incantation] Black Flame"), - (6220, "[Incantation] Surge- O Flame!"), - (6230, "[Incantation] Scouring Black Flame"), - (6240, "[Incantation] Black Flame Ritual"), - (6250, "[Incantation] Black Flame Blade"), - (6260, "[Incantation] Black Flame's Protection"), - (6270, "[Incantation] Noble Presence"), - (6300, "[Incantation] Bloodflame Talons"), - (6310, "[Incantation] Bloodboon"), - (6320, "[Incantation] Bloodflame Blade"), - (6330, "[Incantation] Barrier of Gold"), - (6340, "[Incantation] Protection of the Erdtree"), - (6400, "[Incantation] Rejection"), - (6410, "[Incantation] Wrath of Gold"), - (6420, "[Incantation] Urgent Heal"), - (6421, "[Incantation] Heal"), - (6422, "[Incantation] Great Heal"), - (6423, "[Incantation] Lord's Heal"), - (6424, "[Incantation] Erdtree Heal"), - (6430, "[Incantation] Blessing's Boon"), - (6431, "[Incantation] Blessing of the Erdtree"), - (6440, "[Incantation] Cure Poison"), - (6441, "[Incantation] Lord's Aid"), - (6450, "[Incantation] Flame Fortification"), - (6460, "[Incantation] Magic Fortification"), - (6470, "[Incantation] Lightning Fortification"), - (6480, "[Incantation] Divine Fortification"), - (6490, "[Incantation] Lord's Divine Fortification"), - (6500, "[Incantation] Night Maiden's Mist"), - (6510, "[Incantation] Assassin's Approach"), - (6520, "[Incantation] Shadow Bait"), - (6530, "[Incantation] Darkness"), - (6600, "[Incantation] Golden Vow"), - (6700, "[Incantation] Discus of Light"), - (6701, "[Incantation] Triple Rings of Light"), - (6710, "[Incantation] Radagon's Rings of Light"), - (6720, "[Incantation] Elden Stars"), - (6730, "[Incantation] Law of Regression"), - (6740, "[Incantation] Immutable Shield"), - (6750, "[Incantation] Litany of Proper Death"), - (6760, "[Incantation] Law of Causality"), - (6770, "[Incantation] Order's Blade"), - (6780, "[Incantation] Order Healing"), - (6800, "[Incantation] Bestial Sling"), - (6810, "[Incantation] Stone of Gurranq"), - (6820, "[Incantation] Beast Claw"), - (6830, "[Incantation] Gurranq's Beast Claw"), - (6840, "[Incantation] Bestial Vitality"), - (6850, "[Incantation] Bestial Constitution"), - (6900, "[Incantation] Lightning Spear"), - (6910, "[Incantation] Ancient Dragons' Lightning Strike"), - (6920, "[Incantation] Lightning Strike"), - (6921, "[Incantation] Frozen Lightning Spear"), - (6930, "[Incantation] Honed Bolt"), - (6940, "[Incantation] Ancient Dragons' Lightning Spear"), - (6941, "[Incantation] Fortissax's Lightning Spear"), - (6950, "[Incantation] Lansseax's Glaive"), - (6960, "[Incantation] Electrify Armament"), - (6970, "[Incantation] Vyke's Dragonbolt"), - (6971, "[Incantation] Dragonbolt Blessing"), - (7000, "[Incantation] Dragonfire"), - (7001, "[Incantation] Agheel's Flame"), - (7010, "[Incantation] Magma Breath"), - (7011, "[Incantation] Theodorix's Magma"), - (7020, "[Incantation] Dragonice"), - (7021, "[Incantation] Borealis's Mist"), - (7030, "[Incantation] Rotten Breath"), - (7031, "[Incantation] Ekzykes's Decay"), - (7040, "[Incantation] Glintstone Breath"), - (7041, "[Incantation] Smarag's Glintstone Breath"), - (7050, "[Incantation] Placidusax's Ruin"), - (7060, "[Incantation] Dragonclaw"), - (7080, "[Incantation] Dragonmaw"), - (7090, "[Incantation] Greyoll's Roar"), - (7200, "[Incantation] Pest Threads"), - (7210, "[Incantation] Swarm of Flies"), - (7220, "[Incantation] Poison Mist"), - (7230, "[Incantation] Poison Armament"), - (7240, "[Incantation] Scarlet Aeonia"), - (7300, "[Incantation] Inescapable Frenzy"), - (7310, "[Incantation] The Flame of Frenzy"), - (7311, "[Incantation] Unendurable Frenzy"), - (7320, "[Incantation] Frenzied Burst"), - (7330, "[Incantation] Howl of Shabriri"), - (7500, "[Incantation] Aspects of the Crucible: Tail"), - (7510, "[Incantation] Aspects of the Crucible: Horns"), - (7520, "[Incantation] Aspects of the Crucible: Breath"), - (7530, "[Incantation] Black Blade"), - (7900, "[Incantation] Fire's Deadly Sin"), - (7903, "[Incantation] Golden Lightning Fortification"), - (8000, "Stonesword Key"), - (8010, "Rusty Key"), - (8102, "Lucent Baldachin's Blessing"), - (8105, "Dectus Medallion (Left)"), - (8106, "Dectus Medallion (Right)"), - (8107, "Rold Medallion"), - (8109, "Academy Glintstone Key"), - (8111, "Carian Inverted Statue"), - (8121, "Dark Moon Ring"), - (8126, "Fingerprint Grape"), - (8127, "Letter from Volcano Manor"), - (8128, "Tonic of Forgetfulness"), - (8129, "Serpent's Amnion"), - (8130, "Rya's Necklace"), - (8131, "Irina's Letter"), - (8132, "Letter from Volcano Manor"), - (8133, "Red Letter"), - (8134, "Drawing-Room Key"), - (8136, "Rya's Necklace"), - (8137, "Volcano Manor Invitation"), - (8142, "Amber Starlight"), - (8143, "Seluvis's Introduction"), - (8144, "Sellen's Primal Glintstone"), - (8146, "Miniature Ranni"), - (8147, "Asimi- Silver Tear"), - (8148, "Godrick's Great Rune"), - (8149, "Radahn's Great Rune"), - (8150, "Morgott's Great Rune"), - (8151, "Rykard's Great Rune"), - (8152, "Mohg's Great Rune"), - (8153, "Malenia's Great Rune"), - (8154, "Lord of Blood's Favor"), - (8155, "Lord of Blood's Favor"), - (8156, "Burial Crow's Letter"), - (8158, "Spirit Calling Bell"), - (8159, "Fingerslayer Blade"), - (8161, "Sewing Needle"), - (8162, "Gold Sewing Needle"), - (8163, "Tailoring Tools"), - (8164, "Seluvis's Potion"), - (8165, ""), - (8166, "Amber Draught"), - (8167, "Letter to Patches"), - (8168, "Dancer's Castanets"), - (8169, "Sellian Sealbreaker"), - (8171, "Chrysalids' Memento"), - (8172, "Black Knifeprint"), - (8173, "Letter to Bernahl"), - (8174, "Academy Glintstone Key"), - (8175, "Haligtree Secret Medallion (Left)"), - (8176, "Haligtree Secret Medallion (Right)"), - (8181, "Burial Crow's Letter"), - (8182, "Mending Rune of Perfect Order"), - (8183, "Mending Rune of the Death-Prince"), - (8184, "Mending Rune of the Fell Curse"), - (8185, "Larval Tear"), - (8186, "Imbued Sword Key"), - (8187, "Miniature Ranni"), - (8188, "Golden Tailoring Tools"), - (8189, "Iji's Confession"), - (8190, "Knifeprint Clue"), - (8191, "Cursemark of Death"), - (8192, "Asimi's Husk"), - (8193, "Seedbed Curse"), - (8194, "The Stormhawk King"), - (8195, "Asimi- Silver Chrysalid"), - (8196, "Unalloyed Gold Needle"), - (8197, "Sewer-Gaol Key"), - (8198, "Meeting Place Map"), - (8199, "Discarded Palace Key"), - (8200, "'Homing Instinct' Painting"), - (8201, "'Resurrection' Painting"), - (8202, "'Champion's Song' Painting"), - (8203, "'Sorcerer' Painting"), - (8204, "'Prophecy' Painting"), - (8205, "'Flightless Bird' Painting"), - (8206, "'Redmane' Painting"), - (8221, "Zorayas's Letter"), - (8222, "Alexander's Innards"), - (8223, "Rogier's Letter"), - (8224, "Note: The Preceptor's Secrets"), - (8225, "Weathered Map"), - (8226, "Note: The Preceptor's Secret"), - (8227, "Weathered Map"), - (8500, "Crafting Kit"), - (8590, "Whetstone Knife"), - (8600, "Map: Limgrave- West"), - (8601, "Map: Weeping Peninsula"), - (8602, "Map: Limgrave- East"), - (8603, "Map: Liurnia- East"), - (8604, "Map: Liurnia- North"), - (8605, "Map: Liurnia- West"), - (8606, "Map: Altus Plateau"), - (8607, "Map: Leyndell- Royal Capital"), - (8608, "Map: Mt. Gelmir"), - (8609, "Map: Caelid"), - (8610, "Map: Dragonbarrow"), - (8611, "Map: Mountaintops of the Giants- West"), - (8612, "Map: Mountaintops of the Giants- East"), - (8613, "Map: Ainsel River"), - (8614, "Map: Lake of Rot"), - (8615, "Map: Siofra River"), - (8616, "Map: Mohgwyn Palace"), - (8617, "Map: Deeproot Depths"), - (8618, "Map: Consecrated Snowfield"), - (8660, "Mirage Riddle"), - (8700, "Note: Hidden Cave"), - (8701, "Note: Imp Shades"), - (8702, "Note: Flask of Wondrous Physick"), - (8703, "Note: Stonedigger Trolls"), - (8704, "Note: Walking Mausoleum"), - (8705, "Note: Unseen Assassins"), - (8706, "Note: Great Coffins"), - (8707, "Note: Flame Chariots"), - (8708, "Note: Demi-human Mobs"), - (8709, "Note: Land Squirts"), - (8710, "Note: Gravity's Advantage"), - (8711, "Note: Revenants"), - (8712, "Note: Waypoint Ruins"), - (8713, "Note: Gateway"), - (8714, "Note: Miquella's Needle"), - (8715, "Note: Frenzied Flame Village"), - (8716, "Note: The Lord of Frenzied Flame"), - (8717, "Note: Below the Capital"), - (8750, "Note: Hidden Cave"), - (8751, "Note: Imp Shades"), - (8752, "Note: Flask of Wondrous Physick"), - (8753, "Note: Stonedigger Trolls"), - (8754, "Note: Walking Mausoleum"), - (8755, "Note: Unseen Assassins"), - (8756, "Note: Great Coffins"), - (8757, "Note: Flame Chariots"), - (8758, "Note: Demi-human Mobs"), - (8759, "Note: Land Squirts"), - (8760, "Note: Gravity's Advantage"), - (8761, "Note: Revenants"), - (8762, "Note: Waypoint Ruins"), - (8763, "Note: Gateway"), - (8765, "Note: Frenzied Flame Village"), - (8767, "Note: Below the Capital"), - (8850, "Conspectus Scroll"), - (8851, "Royal House Scroll"), - (8852, ""), - (8853, ""), - (8854, ""), - (8855, "Fire Monks' Prayerbook"), - (8856, "Giant's Prayerbook"), - (8857, "Godskin Prayerbook"), - (8858, "Two Fingers' Prayerbook"), - (8859, "Assassin's Prayerbook"), - (8860, "Erdtree Prayerbook"), - (8861, "Erdtree Codex"), - (8862, "Golden Order Principia"), - (8863, "Golden Order Principles"), - (8864, "Dragon Cult Prayerbook"), - (8865, "Ancient Dragon Prayerbook"), - (8866, "Academy Scroll"), - (8910, "Pidia's Bell Bearing"), - (8911, "Seluvis's Bell Bearing"), - (8912, "Patches' Bell Bearing"), - (8913, "Sellen's Bell Bearing"), - (8914, ""), - (8915, "D's Bell Bearing"), - (8916, "Bernahl's Bell Bearing"), - (8917, "Miriel's Bell Bearing"), - (8918, "Gostoc's Bell Bearing"), - (8919, "Thops's Bell Bearing"), - (8920, "Kalé's Bell Bearing"), - (8921, "Nomadic Merchant's Bell Bearing [1]"), - (8922, "Nomadic Merchant's Bell Bearing [2]"), - (8923, "Nomadic Merchant's Bell Bearing [3]"), - (8924, "Nomadic Merchant's Bell Bearing [4]"), - (8925, "Nomadic Merchant's Bell Bearing [5]"), - (8926, "Isolated Merchant's Bell Bearing [1]"), - (8927, "Isolated Merchant's Bell Bearing [2]"), - (8928, "Nomadic Merchant's Bell Bearing [6]"), - (8929, "Hermit Merchant's Bell Bearing [1]"), - (8930, "Nomadic Merchant's Bell Bearing [7]"), - (8931, "Nomadic Merchant's Bell Bearing [8]"), - (8932, "Nomadic Merchant's Bell Bearing [9]"), - (8933, "Nomadic Merchant's Bell Bearing [10]"), - (8934, "Nomadic Merchant's Bell Bearing [11]"), - (8935, "Isolated Merchant's Bell Bearing [3]"), - (8936, "Hermit Merchant's Bell Bearing [2]"), - (8937, "Abandoned Merchant's Bell Bearing"), - (8938, "Hermit Merchant's Bell Bearing [3]"), - (8939, "Imprisoned Merchant's Bell Bearing"), - (8940, "Iji's Bell Bearing"), - (8941, "Rogier's Bell Bearing"), - (8942, "Blackguard's Bell Bearing"), - (8943, "Corhyn's Bell Bearing"), - (8944, "Gowry's Bell Bearing"), - (8945, "Bone Peddler's Bell Bearing"), - (8946, "Meat Peddler's Bell Bearing"), - (8947, "Medicine Peddler's Bell Bearing"), - (8948, "Gravity Stone Peddler's Bell Bearing"), - (8949, ""), - (8950, ""), - (8951, "Smithing-Stone Miner's Bell Bearing [1]"), - (8952, "Smithing-Stone Miner's Bell Bearing [2]"), - (8953, "Smithing-Stone Miner's Bell Bearing [3]"), - (8954, "Smithing-Stone Miner's Bell Bearing [4]"), - (8955, "Somberstone Miner's Bell Bearing [1]"), - (8956, "Somberstone Miner's Bell Bearing [2]"), - (8957, "Somberstone Miner's Bell Bearing [3]"), - (8958, "Somberstone Miner's Bell Bearing [4]"), - (8959, "Somberstone Miner's Bell Bearing [5]"), - (8960, "Glovewort Picker's Bell Bearing [1]"), - (8961, "Glovewort Picker's Bell Bearing [2]"), - (8962, "Glovewort Picker's Bell Bearing [3]"), - (8963, "Ghost-Glovewort Picker's Bell Bearing [1]"), - (8964, "Ghost-Glovewort Picker's Bell Bearing [2]"), - (8965, "Ghost-Glovewort Picker's Bell Bearing [3]"), - (8970, "Iron Whetblade"), - (8971, "Red-Hot Whetblade"), - (8972, "Sanctified Whetblade"), - (8973, "Glintstone Whetblade"), - (8974, "Black Whetblade"), - (8975, "Unalloyed Gold Needle"), - (8976, "Unalloyed Gold Needle"), - (8977, "Valkyrie's Prosthesis"), - (8978, "Sellia's Secret"), - (8979, "Beast Eye"), - (8980, "Weathered Dagger"), - (9000, "Bow"), - (9001, "Polite Bow"), - (9002, "My Thanks"), - (9003, "Curtsy"), - (9004, "Reverential Bow"), - (9005, "My Lord"), - (9006, "Warm Welcome"), - (9007, "Wave"), - (9008, "Casual Greeting"), - (9009, "Strength!"), - (9010, "As You Wish"), - (9011, "Point Forwards"), - (9012, "Point Upwards"), - (9013, "Point Downwards"), - (9014, "Beckon"), - (9015, "Wait!"), - (9016, "Calm Down!"), - (9017, "Nod In Thought"), - (9018, "Extreme Repentance"), - (9019, "Grovel For Mercy"), - (9020, "Rallying Cry"), - (9021, "Heartening Cry"), - (9022, "By My Sword"), - (9023, "Hoslow's Oath"), - (9024, "Fire Spur Me"), - (9026, "Bravo!"), - (9027, "Jump for Joy"), - (9028, "Triumphant Delight"), - (9029, "Fancy Spin"), - (9030, "Finger Snap"), - (9031, "Dejection"), - (9032, "Patches' Crouch"), - (9033, "Crossed Legs"), - (9034, "Rest"), - (9035, "Sitting Sideways"), - (9036, "Dozing Cross-Legged"), - (9037, "Spread Out"), - (9039, "Balled Up"), - (9040, "What Do You Want?"), - (9041, "Prayer"), - (9042, "Desperate Prayer"), - (9043, "Rapture"), - (9045, "Erudition"), - (9046, "Outer Order"), - (9047, "Inner Order"), - (9048, "Golden Order Totality"), - (9049, "The Ring"), - (9050, "The Ring"), - (9100, "About Sites of Grace"), - (9101, "About Sorceries and Incantations"), - (9102, "About Bows"), - (9103, "About Crouching"), - (9104, "About Stance-Breaking"), - (9105, "About Stakes of Marika"), - (9106, "About Guard Counters"), - (9107, "About the Map"), - (9108, "About Guidance of Grace"), - (9109, "About Horseback Riding"), - (9110, "About Death"), - (9111, "About Summoning Spirits"), - (9112, "About Guarding"), - (9113, "About Item Crafting"), - (9115, "About Flask of Wondrous Physick"), - (9116, "About Adding Skills"), - (9117, "About Birdseye Telescopes"), - (9118, "About Spiritspring Jumping"), - (9119, "About Vanquishing Enemy Groups"), - (9120, "About Teardrop Scarabs"), - (9121, "About Summoning Other Players"), - (9122, "About Cooperative Multiplayer"), - (9123, "About Competitive Multiplayer"), - (9124, "About Invasion Multiplayer"), - (9125, "About Hunter Multiplayer"), - (9126, "About Summoning Pools"), - (9127, "About Monument Icon"), - (9128, "About Requesting Help from Hunters"), - (9129, "About Skills"), - (9130, "About Fast Travel to Sites of Grace"), - (9131, "About Strengthening Armaments"), - (9132, "About Roundtable Hold"), - (9134, "About Materials"), - (9135, "About Containers"), - (9136, "About Adding Affinities"), - (9137, "About Pouches"), - (9138, "About Dodging"), - (9140, "About Wielding Armaments"), - (9141, "About Great Runes"), - (9142, ""), - (9150, ""), - (9151, ""), - (9152, ""), - (9153, ""), - (9195, "About Multiplayer"), - (9300, "Nomadic Warrior's Cookbook [1]"), - (9301, "Nomadic Warrior's Cookbook [3]"), - (9302, "Nomadic Warrior's Cookbook [6]"), - (9303, "Nomadic Warrior's Cookbook [10]"), - (9304, "Fugitive Warrior's Recipe [5]"), - (9305, "Nomadic Warrior's Cookbook [7]"), - (9306, "Nomadic Warrior's Cookbook [12]"), - (9307, "Nomadic Warrior's Cookbook [19]"), - (9308, "Nomadic Warrior's Cookbook [13]"), - (9309, "Nomadic Warrior's Cookbook [23]"), - (9310, "Nomadic Warrior's Cookbook [17]"), - (9311, "Nomadic Warrior's Cookbook [2]"), - (9312, "Nomadic Warrior's Cookbook [21]"), - (9313, "Missionary's Cookbook [6]"), - (9314, ""), - (9315, ""), - (9316, ""), - (9317, ""), - (9318, ""), - (9319, ""), - (9320, "Armorer's Cookbook [1]"), - (9321, "Armorer's Cookbook [2]"), - (9322, "Nomadic Warrior's Cookbook [11]"), - (9323, "Nomadic Warrior's Cookbook [20]"), - (9324, "Armorer's Cookbook (5)"), - (9325, "Armorer's Cookbook [7]"), - (9326, "Armorer's Cookbook [4]"), - (9327, "Nomadic Warrior's Cookbook [18]"), - (9328, "Armorer's Cookbook [3]"), - (9329, "Nomadic Warrior's Cookbook [16]"), - (9330, "Armorer's Cookbook [6]"), - (9331, "Armorer's Cookbook [5]"), - (9332, ""), - (9333, ""), - (9334, ""), - (9335, ""), - (9336, ""), - (9337, ""), - (9338, ""), - (9339, ""), - (9340, "Glintstone Craftsman's Cookbook [4]"), - (9341, "Glintstone Craftsman's Cookbook [1]"), - (9342, "Glintstone Craftsman's Cookbook [5]"), - (9343, "Nomadic Warrior's Cookbook [9]"), - (9344, "Glintstone Craftsman's Cookbook [8]"), - (9345, "Glintstone Craftsman's Cookbook [2]"), - (9346, "Glintstone Craftsman's Cookbook [6]"), - (9347, "Glintstone Craftsman's Cookbook [7]"), - (9348, "Glintstone Craftsman's Cookbook [3]"), - (9349, ""), - (9350, ""), - (9351, ""), - (9352, ""), - (9353, ""), - (9354, ""), - (9355, ""), - (9356, ""), - (9357, ""), - (9358, ""), - (9359, ""), - (9360, "Missionary's Cookbook [2]"), - (9361, "Missionary's Cookbook [1]"), - (9362, "Missionary's Cookbook (3)"), - (9363, "Missionary's Cookbook [5]"), - (9364, "Missionary's Cookbook [4]"), - (9365, "Missionary's Cookbook [3]"), - (9366, ""), - (9367, ""), - (9368, ""), - (9369, ""), - (9370, ""), - (9380, "Nomadic Warrior's Cookbook [4]"), - (9381, "Perfumer's Cookbook (1)"), - (9382, "Perfumer's Cookbook (2)"), - (9383, "Nomadic Warrior's Cookbook [5]"), - (9384, "Perfumer's Cookbook [1]"), - (9385, "Perfumer's Cookbook [2]"), - (9386, "Perfumer's Cookbook [3]"), - (9387, "Nomadic Warrior's Cookbook [14]"), - (9388, "Nomadic Warrior's Cookbook [8]"), - (9389, "Nomadic Warrior's Cookbook [22]"), - (9390, "Nomadic Warrior's Cookbook [15]"), - (9391, "Nomadic Warrior's Cookbook [24]"), - (9392, "Perfumer's Cookbook [4]"), - (9393, "Perfumer's Cookbook (13)"), - (9394, ""), - (9395, ""), - (9396, ""), - (9397, ""), - (9398, ""), - (9399, ""), - (9400, "Ancient Dragon Apostle's Cookbook [1]"), - (9401, "Ancient Dragon Apostle's Cookbook [2]"), - (9402, "Ancient Dragon Apostle's Cookbook [4]"), - (9403, "Ancient Dragon Apostle's Cookbook [3]"), - (9404, ""), - (9405, ""), - (9406, ""), - (9407, ""), - (9408, ""), - (9409, ""), - (9410, ""), - (9420, "Fevor's Cookbook [1]"), - (9421, "Fevor's Cookbook [3]"), - (9422, "Fevor's Cookbook [2]"), - (9423, "Missionary's Cookbook [7]"), - (9424, ""), - (9425, ""), - (9426, ""), - (9427, ""), - (9428, ""), - (9429, ""), - (9430, ""), - (9440, "Frenzied's Cookbook [1]"), - (9441, "Frenzied's Cookbook [2]"), - (9442, ""), - (9443, ""), - (9444, ""), - (9445, ""), - (9446, ""), - (9447, ""), - (9448, ""), - (9449, ""), - (9450, ""), - (9500, "Cracked Pot"), - (9501, "Ritual Pot"), - (9510, "Perfume Bottle"), - (10000, "Glass Shard"), - (10010, "Golden Seed"), - (10020, "Sacred Tear"), - (10030, "Memory Stone"), - (10040, "Talisman Pouch"), - (10060, "Dragon Heart"), - (10070, "Lost Ashes of War"), - (10080, "Great Rune of the Unborn"), - (10100, "Smithing Stone [1]"), - (10101, "Smithing Stone [2]"), - (10102, "Smithing Stone [3]"), - (10103, "Smithing Stone [4]"), - (10104, "Smithing Stone [5]"), - (10105, "Smithing Stone [6]"), - (10106, "Smithing Stone [7]"), - (10107, "Smithing Stone [8]"), - (10140, "Ancient Dragon Smithing Stone"), - (10160, "Somber Smithing Stone [1]"), - (10161, "Somber Smithing Stone [2]"), - (10162, "Somber Smithing Stone [3]"), - (10163, "Somber Smithing Stone [4]"), - (10164, "Somber Smithing Stone [5]"), - (10165, "Somber Smithing Stone [6]"), - (10166, "Somber Smithing Stone [7]"), - (10167, "Somber Smithing Stone [8]"), - (10168, "Somber Ancient Dragon Smithing Stone"), - (10200, "Somber Smithing Stone [9]"), - (10900, "Grave Glovewort [1]"), - (10901, "Grave Glovewort [2]"), - (10902, "Grave Glovewort [3]"), - (10903, "Grave Glovewort [4]"), - (10904, "Grave Glovewort [5]"), - (10905, "Grave Glovewort [6]"), - (10906, "Grave Glovewort [7]"), - (10907, "Grave Glovewort [8]"), - (10908, "Grave Glovewort [9]"), - (10909, "Great Grave Glovewort"), - (10910, "Ghost Glovewort [1]"), - (10911, "Ghost Glovewort [2]"), - (10912, "Ghost Glovewort [3]"), - (10913, "Ghost Glovewort [4]"), - (10914, "Ghost Glovewort [5]"), - (10915, "Ghost Glovewort [6]"), - (10916, "Ghost Glovewort [7]"), - (10917, "Ghost Glovewort [8]"), - (10918, "Ghost Glovewort [9]"), - (10919, "Great Ghost Glovewort"), - (11000, "Crimsonspill Crystal Tear"), - (11001, "Greenspill Crystal Tear"), - (11002, "Crimson Crystal Tear"), - (11003, "Crimson Crystal Tear"), - (11004, "Cerulean Crystal Tear"), - (11005, "Cerulean Crystal Tear"), - (11006, "Speckled Hardtear"), - (11007, "Crimson Bubbletear"), - (11008, "Opaline Bubbletear"), - (11009, "Crimsonburst Crystal Tear"), - (11010, "Greenburst Crystal Tear"), - (11011, "Opaline Hardtear"), - (11012, "Winged Crystal Tear"), - (11013, "Thorny Cracked Tear"), - (11014, "Spiked Cracked Tear"), - (11015, "Windy Crystal Tear"), - (11016, "Ruptured Crystal Tear"), - (11017, "Ruptured Crystal Tear"), - (11018, "Leaden Hardtear"), - (11019, "Twiggy Cracked Tear"), - (11020, "Crimsonwhorl Bubbletear"), - (11021, "Strength-knot Crystal Tear"), - (11022, "Dexterity-knot Crystal Tear"), - (11023, "Intelligence-knot Crystal Tear"), - (11024, "Faith-knot Crystal Tear"), - (11025, "Cerulean Hidden Tear"), - (11026, "Stonebarb Cracked Tear"), - (11027, "Purifying Crystal Tear"), - (11028, "Flame-Shrouding Cracked Tear"), - (11029, "Magic-Shrouding Cracked Tear"), - (11030, "Lightning-Shrouding Cracked Tear"), - (11031, "Holy-Shrouding Cracked Tear"), - (15000, "Sliver of Meat"), - (15010, "Beast Liver"), - (15020, "Lump of Flesh"), - (15030, "Beast Blood"), - (15040, "Old Fang"), - (15050, "Budding Horn"), - (15060, "Flight Pinion"), - (15080, "Four-Toed Fowl Foot"), - (15090, "Turtle Neck Meat"), - (15100, "Human Bone Shard"), - (15110, "Great Dragonfly Head"), - (15120, "Slumbering Egg"), - (15130, "Crab Eggs"), - (15140, "Land Octopus Ovary"), - (15150, "Miranda Powder"), - (15160, "Strip of White Flesh"), - (15340, "Thin Beast Bones"), - (15341, "Hefty Beast Bone"), - (15400, "String"), - (15410, "Living Jar Shard"), - (15420, "Albinauric Bloodclot"), - (15430, "Stormhawk Feather"), - (20650, "Poisonbloom"), - (20651, "Trina's Lily"), - (20652, "Fulgurbloom"), - (20653, "Miquella's Lily"), - (20654, "Grave Violet"), - (20660, "Faded Erdleaf Flower"), - (20680, "Erdleaf Flower"), - (20681, "Altus Bloom"), - (20682, "Fire Blossom"), - (20683, "Golden Sunflower"), - (20685, "Tarnished Golden Sunflower"), - (20690, "Herba"), - (20691, "Arteria Leaf"), - (20710, "Dewkissed Herba"), - (20720, "Rowa Fruit"), - (20721, "Golden Rowa"), - (20722, "Rimed Rowa"), - (20723, "Bloodrose"), - (20740, "Eye of Yelough"), - (20750, "Crystal Bud"), - (20751, "Rimed Crystal Bud"), - (20753, "Sacramental Bud"), - (20760, "Mushroom"), - (20761, "Melted Mushroom"), - (20770, "Toxic Mushroom"), - (20775, "Root Resin"), - (20780, "Cracked Crystal"), - (20795, "Sanctuary Stone"), - (20800, "Nascent Butterfly"), - (20801, "Aeonian Butterfly"), - (20802, "Smoldering Butterfly"), - (20810, "Silver Firefly"), - (20811, "Gold Firefly"), - (20812, "Glintstone Firefly"), - (20820, "Golden Centipede"), - (20825, "Silver Tear Husk"), - (20830, "Gold-Tinged Excrement"), - (20831, "Blood-Tainted Excrement"), - (20840, "Cave Moss"), - (20841, "Budding Cave Moss"), - (20842, "Crystal Cave Moss"), - (20845, "Yellow Ember"), - (20850, "Volcanic Stone"), - (20852, "Formic Rock"), - (20855, "Gravel Stone"), - (50200, ""), - (50201, ""), - (50202, ""), - (50203, ""), - (51760, ""), - (53090, ""), - (53230, ""), - (53400, ""), - (53630, ""), - (53650, ""), - (53651, ""), - (53652, ""), - (53653, ""), - (53654, ""), - (53655, ""), - (53656, ""), - (53657, ""), - (53658, ""), - (200000, "Black Knife Tiche"), - (200001, "Black Knife Tiche +1"), - (200002, "Black Knife Tiche +2"), - (200003, "Black Knife Tiche +3"), - (200004, "Black Knife Tiche +4"), - (200005, "Black Knife Tiche +5"), - (200006, "Black Knife Tiche +6"), - (200007, "Black Knife Tiche +7"), - (200008, "Black Knife Tiche +8"), - (200009, "Black Knife Tiche +9"), - (200010, "Black Knife Tiche +10"), - (201000, "Banished Knight Oleg"), - (201001, "Banished Knight Oleg +1"), - (201002, "Banished Knight Oleg +2"), - (201003, "Banished Knight Oleg +3"), - (201004, "Banished Knight Oleg +4"), - (201005, "Banished Knight Oleg +5"), - (201006, "Banished Knight Oleg +6"), - (201007, "Banished Knight Oleg +7"), - (201008, "Banished Knight Oleg +8"), - (201009, "Banished Knight Oleg +9"), - (201010, "Banished Knight Oleg +10"), - (202000, "Banished Knight Engvall"), - (202001, "Banished Knight Engvall +1"), - (202002, "Banished Knight Engvall +2"), - (202003, "Banished Knight Engvall +3"), - (202004, "Banished Knight Engvall +4"), - (202005, "Banished Knight Engvall +5"), - (202006, "Banished Knight Engvall +6"), - (202007, "Banished Knight Engvall +7"), - (202008, "Banished Knight Engvall +8"), - (202009, "Banished Knight Engvall +9"), - (202010, "Banished Knight Engvall +10"), - (203000, "Fanged Imp Ashes"), - (203001, "Fanged Imp Ashes +1"), - (203002, "Fanged Imp Ashes +2"), - (203003, "Fanged Imp Ashes +3"), - (203004, "Fanged Imp Ashes +4"), - (203005, "Fanged Imp Ashes +5"), - (203006, "Fanged Imp Ashes +6"), - (203007, "Fanged Imp Ashes +7"), - (203008, "Fanged Imp Ashes +8"), - (203009, "Fanged Imp Ashes +9"), - (203010, "Fanged Imp Ashes +10"), - (204000, "Latenna the Albinauric"), - (204001, "Latenna the Albinauric +1"), - (204002, "Latenna the Albinauric +2"), - (204003, "Latenna the Albinauric +3"), - (204004, "Latenna the Albinauric +4"), - (204005, "Latenna the Albinauric +5"), - (204006, "Latenna the Albinauric +6"), - (204007, "Latenna the Albinauric +7"), - (204008, "Latenna the Albinauric +8"), - (204009, "Latenna the Albinauric +9"), - (204010, "Latenna the Albinauric +10"), - (205000, "Nomad Ashes"), - (205001, "Nomad Ashes +1"), - (205002, "Nomad Ashes +2"), - (205003, "Nomad Ashes +3"), - (205004, "Nomad Ashes +4"), - (205005, "Nomad Ashes +5"), - (205006, "Nomad Ashes +6"), - (205007, "Nomad Ashes +7"), - (205008, "Nomad Ashes +8"), - (205009, "Nomad Ashes +9"), - (205010, "Nomad Ashes +10"), - (206000, "Nightmaiden & Swordstress Puppets"), - (206001, "Nightmaiden & Swordstress Puppets +1"), - (206002, "Nightmaiden & Swordstress Puppets +2"), - (206003, "Nightmaiden & Swordstress Puppets +3"), - (206004, "Nightmaiden & Swordstress Puppets +4"), - (206005, "Nightmaiden & Swordstress Puppets +5"), - (206006, "Nightmaiden & Swordstress Puppets +6"), - (206007, "Nightmaiden & Swordstress Puppets +7"), - (206008, "Nightmaiden & Swordstress Puppets +8"), - (206009, "Nightmaiden & Swordstress Puppets +9"), - (206010, "Nightmaiden & Swordstress Puppets +10"), - (207000, "Mimic Tear Ashes"), - (207001, "Mimic Tear Ashes +1"), - (207002, "Mimic Tear Ashes +2"), - (207003, "Mimic Tear Ashes +3"), - (207004, "Mimic Tear Ashes +4"), - (207005, "Mimic Tear Ashes +5"), - (207006, "Mimic Tear Ashes +6"), - (207007, "Mimic Tear Ashes +7"), - (207008, "Mimic Tear Ashes +8"), - (207009, "Mimic Tear Ashes +9"), - (207010, "Mimic Tear Ashes +10"), - (208000, "Crystalian Ashes"), - (208001, "Crystalian Ashes +1"), - (208002, "Crystalian Ashes +2"), - (208003, "Crystalian Ashes +3"), - (208004, "Crystalian Ashes +4"), - (208005, "Crystalian Ashes +5"), - (208006, "Crystalian Ashes +6"), - (208007, "Crystalian Ashes +7"), - (208008, "Crystalian Ashes +8"), - (208009, "Crystalian Ashes +9"), - (208010, "Crystalian Ashes +10"), - (209000, "Ancestral Follower Ashes"), - (209001, "Ancestral Follower Ashes +1"), - (209002, "Ancestral Follower Ashes +2"), - (209003, "Ancestral Follower Ashes +3"), - (209004, "Ancestral Follower Ashes +4"), - (209005, "Ancestral Follower Ashes +5"), - (209006, "Ancestral Follower Ashes +6"), - (209007, "Ancestral Follower Ashes +7"), - (209008, "Ancestral Follower Ashes +8"), - (209009, "Ancestral Follower Ashes +9"), - (209010, "Ancestral Follower Ashes +10"), - (210000, "Winged Misbegotten Ashes"), - (210001, "Winged Misbegotten Ashes + 1"), - (210002, "Winged Misbegotten Ashes + 2"), - (210003, "Winged Misbegotten Ashes + 3"), - (210004, "Winged Misbegotten Ashes + 4"), - (210005, "Winged Misbegotten Ashes + 5"), - (210006, "Winged Misbegotten Ashes + 6"), - (210007, "Winged Misbegotten Ashes + 7"), - (210008, "Winged Misbegotten Ashes + 8"), - (210009, "Winged Misbegotten Ashes + 9"), - (210010, "Winged Misbegotten Ashes + 10"), - (211000, "Albinauric Ashes"), - (211001, "Albinauric Ashes +1"), - (211002, "Albinauric Ashes +2"), - (211003, "Albinauric Ashes +3"), - (211004, "Albinauric Ashes +4"), - (211005, "Albinauric Ashes +5"), - (211006, "Albinauric Ashes +6"), - (211007, "Albinauric Ashes +7"), - (211008, "Albinauric Ashes +8"), - (211009, "Albinauric Ashes +9"), - (211010, "Albinauric Ashes +10"), - (212000, "Skeletal Militiaman Ashes"), - (212001, "Skeletal Militiaman Ashes +1"), - (212002, "Skeletal Militiaman Ashes +2"), - (212003, "Skeletal Militiaman Ashes +3"), - (212004, "Skeletal Militiaman Ashes +4"), - (212005, "Skeletal Militiaman Ashes +5"), - (212006, "Skeletal Militiaman Ashes +6"), - (212007, "Skeletal Militiaman Ashes +7"), - (212008, "Skeletal Militiaman Ashes +8"), - (212009, "Skeletal Militiaman Ashes +9"), - (212010, "Skeletal Militiaman Ashes +10"), - (213000, "Skeletal Bandit Ashes"), - (213001, "Skeletal Bandit Ashes +1"), - (213002, "Skeletal Bandit Ashes +2"), - (213003, "Skeletal Bandit Ashes +3"), - (213004, "Skeletal Bandit Ashes +4"), - (213005, "Skeletal Bandit Ashes +5"), - (213006, "Skeletal Bandit Ashes +6"), - (213007, "Skeletal Bandit Ashes +7"), - (213008, "Skeletal Bandit Ashes +8"), - (213009, "Skeletal Bandit Ashes +9"), - (213010, "Skeletal Bandit Ashes +10"), - (214000, "Oracle Envoy Ashes"), - (214001, "Oracle Envoy Ashes +1"), - (214002, "Oracle Envoy Ashes +2"), - (214003, "Oracle Envoy Ashes +3"), - (214004, "Oracle Envoy Ashes +4"), - (214005, "Oracle Envoy Ashes +5"), - (214006, "Oracle Envoy Ashes +6"), - (214007, "Oracle Envoy Ashes +7"), - (214008, "Oracle Envoy Ashes +8"), - (214009, "Oracle Envoy Ashes +9"), - (214010, "Oracle Envoy Ashes +10"), - (215000, "Putrid Corpse Ashes"), - (215001, "Putrid Corpse Ashes +1"), - (215002, "Putrid Corpse Ashes +2"), - (215003, "Putrid Corpse Ashes +3"), - (215004, "Putrid Corpse Ashes +4"), - (215005, "Putrid Corpse Ashes +5"), - (215006, "Putrid Corpse Ashes +6"), - (215007, "Putrid Corpse Ashes +7"), - (215008, "Putrid Corpse Ashes +8"), - (215009, "Putrid Corpse Ashes +9"), - (215010, "Putrid Corpse Ashes +10"), - (216000, "Depraved Perfumer Carmaan"), - (216001, "Depraved Perfumer Carmaan +1"), - (216002, "Depraved Perfumer Carmaan +2"), - (216003, "Depraved Perfumer Carmaan +3"), - (216004, "Depraved Perfumer Carmaan +4"), - (216005, "Depraved Perfumer Carmaan +5"), - (216006, "Depraved Perfumer Carmaan +6"), - (216007, "Depraved Perfumer Carmaan +7"), - (216008, "Depraved Perfumer Carmaan +8"), - (216009, "Depraved Perfumer Carmaan +9"), - (216010, "Depraved Perfumer Carmaan +10"), - (217000, "Perfumer Tricia"), - (217001, "Perfumer Tricia +1"), - (217002, "Perfumer Tricia +2"), - (217003, "Perfumer Tricia +3"), - (217004, "Perfumer Tricia +4"), - (217005, "Perfumer Tricia +5"), - (217006, "Perfumer Tricia +6"), - (217007, "Perfumer Tricia +7"), - (217008, "Perfumer Tricia +8"), - (217009, "Perfumer Tricia +9"), - (217010, "Perfumer Tricia +10"), - (218000, "Glintstone Sorcerer Ashes"), - (218001, "Glintstone Sorcerer Ashes +1"), - (218002, "Glintstone Sorcerer Ashes +2"), - (218003, "Glintstone Sorcerer Ashes +3"), - (218004, "Glintstone Sorcerer Ashes +4"), - (218005, "Glintstone Sorcerer Ashes +5"), - (218006, "Glintstone Sorcerer Ashes +6"), - (218007, "Glintstone Sorcerer Ashes +7"), - (218008, "Glintstone Sorcerer Ashes +8"), - (218009, "Glintstone Sorcerer Ashes +9"), - (218010, "Glintstone Sorcerer Ashes +10"), - (219000, "Twinsage Sorcerer Ashes"), - (219001, "Twinsage Sorcerer Ashes +1"), - (219002, "Twinsage Sorcerer Ashes +2"), - (219003, "Twinsage Sorcerer Ashes +3"), - (219004, "Twinsage Sorcerer Ashes +4"), - (219005, "Twinsage Sorcerer Ashes +5"), - (219006, "Twinsage Sorcerer Ashes +6"), - (219007, "Twinsage Sorcerer Ashes +7"), - (219008, "Twinsage Sorcerer Ashes +8"), - (219009, "Twinsage Sorcerer Ashes +9"), - (219010, "Twinsage Sorcerer Ashes +10"), - (220000, "Page Ashes"), - (220001, "Page Ashes +1"), - (220002, "Page Ashes +2"), - (220003, "Page Ashes +3"), - (220004, "Page Ashes +4"), - (220005, "Page Ashes +5"), - (220006, "Page Ashes +6"), - (220007, "Page Ashes +7"), - (220008, "Page Ashes +8"), - (220009, "Page Ashes +9"), - (220010, "Page Ashes +10"), - (221000, "Battlemage Hugues"), - (221001, "Battlemage Hugues +1"), - (221002, "Battlemage Hugues +2"), - (221003, "Battlemage Hugues +3"), - (221004, "Battlemage Hugues +4"), - (221005, "Battlemage Hugues +5"), - (221006, "Battlemage Hugues +6"), - (221007, "Battlemage Hugues +7"), - (221008, "Battlemage Hugues +8"), - (221009, "Battlemage Hugues +9"), - (221010, "Battlemage Hugues +10"), - (222000, "Clayman Ashes"), - (222001, "Clayman Ashes +1"), - (222002, "Clayman Ashes +2"), - (222003, "Clayman Ashes +3"), - (222004, "Clayman Ashes +4"), - (222005, "Clayman Ashes +5"), - (222006, "Clayman Ashes +6"), - (222007, "Clayman Ashes +7"), - (222008, "Clayman Ashes +8"), - (222009, "Clayman Ashes +9"), - (222010, "Clayman Ashes +10"), - (223000, "Cleanrot Knight Finlay"), - (223001, "Cleanrot Knight Finlay +1"), - (223002, "Cleanrot Knight Finlay +2"), - (223003, "Cleanrot Knight Finlay +3"), - (223004, "Cleanrot Knight Finlay +4"), - (223005, "Cleanrot Knight Finlay +5"), - (223006, "Cleanrot Knight Finlay +6"), - (223007, "Cleanrot Knight Finlay +7"), - (223008, "Cleanrot Knight Finlay +8"), - (223009, "Cleanrot Knight Finlay +9"), - (223010, "Cleanrot Knight Finlay +10"), - (224000, "Kindred of Rot Ashes"), - (224001, "Kindred of Rot Ashes +1"), - (224002, "Kindred of Rot Ashes +2"), - (224003, "Kindred of Rot Ashes +3"), - (224004, "Kindred of Rot Ashes +4"), - (224005, "Kindred of Rot Ashes +5"), - (224006, "Kindred of Rot Ashes +6"), - (224007, "Kindred of Rot Ashes +7"), - (224008, "Kindred of Rot Ashes +8"), - (224009, "Kindred of Rot Ashes +9"), - (224010, "Kindred of Rot Ashes +10"), - (225000, "Marionette Soldier Ashes"), - (225001, "Marionette Soldier Ashes +1"), - (225002, "Marionette Soldier Ashes +2"), - (225003, "Marionette Soldier Ashes +3"), - (225004, "Marionette Soldier Ashes +4"), - (225005, "Marionette Soldier Ashes +5"), - (225006, "Marionette Soldier Ashes +6"), - (225007, "Marionette Soldier Ashes +7"), - (225008, "Marionette Soldier Ashes +8"), - (225009, "Marionette Soldier Ashes +9"), - (225010, "Marionette Soldier Ashes +10"), - (226000, "Avionette Soldier Ashes"), - (226001, "Avionette Soldier Ashes +1"), - (226002, "Avionette Soldier Ashes +2"), - (226003, "Avionette Soldier Ashes +3"), - (226004, "Avionette Soldier Ashes +4"), - (226005, "Avionette Soldier Ashes +5"), - (226006, "Avionette Soldier Ashes +6"), - (226007, "Avionette Soldier Ashes +7"), - (226008, "Avionette Soldier Ashes +8"), - (226009, "Avionette Soldier Ashes +9"), - (226010, "Avionette Soldier Ashes +10"), - (227000, "Fire Monk Ashes"), - (227001, "Fire Monk Ashes +1"), - (227002, "Fire Monk Ashes +2"), - (227003, "Fire Monk Ashes +3"), - (227004, "Fire Monk Ashes +4"), - (227005, "Fire Monk Ashes +5"), - (227006, "Fire Monk Ashes +6"), - (227007, "Fire Monk Ashes +7"), - (227008, "Fire Monk Ashes +8"), - (227009, "Fire Monk Ashes +9"), - (227010, "Fire Monk Ashes +10"), - (228000, "Blackflame Monk Amon"), - (228001, "Blackflame Monk Amon +1"), - (228002, "Blackflame Monk Amon +2"), - (228003, "Blackflame Monk Amon +3"), - (228004, "Blackflame Monk Amon +4"), - (228005, "Blackflame Monk Amon +5"), - (228006, "Blackflame Monk Amon +6"), - (228007, "Blackflame Monk Amon +7"), - (228008, "Blackflame Monk Amon +8"), - (228009, "Blackflame Monk Amon +9"), - (228010, "Blackflame Monk Amon +10"), - (229000, "Man-Serpent Ashes"), - (229001, "Man-Serpent Ashes +1"), - (229002, "Man-Serpent Ashes +2"), - (229003, "Man-Serpent Ashes +3"), - (229004, "Man-Serpent Ashes +4"), - (229005, "Man-Serpent Ashes +5"), - (229006, "Man-Serpent Ashes +6"), - (229007, "Man-Serpent Ashes +7"), - (229008, "Man-Serpent Ashes +8"), - (229009, "Man-Serpent Ashes +9"), - (229010, "Man-Serpent Ashes +10"), - (230000, "Azula Beastman Ashes"), - (230001, "Azula Beastman Ashes +1"), - (230002, "Azula Beastman Ashes +2"), - (230003, "Azula Beastman Ashes +3"), - (230004, "Azula Beastman Ashes +4"), - (230005, "Azula Beastman Ashes +5"), - (230006, "Azula Beastman Ashes +6"), - (230007, "Azula Beastman Ashes +7"), - (230008, "Azula Beastman Ashes +8"), - (230009, "Azula Beastman Ashes +9"), - (230010, "Azula Beastman Ashes +10"), - (231000, "Kaiden Sellsword Ashes"), - (231001, "Kaiden Sellsword Ashes +1"), - (231002, "Kaiden Sellsword Ashes +2"), - (231003, "Kaiden Sellsword Ashes +3"), - (231004, "Kaiden Sellsword Ashes +4"), - (231005, "Kaiden Sellsword Ashes +5"), - (231006, "Kaiden Sellsword Ashes +6"), - (231007, "Kaiden Sellsword Ashes +7"), - (231008, "Kaiden Sellsword Ashes +8"), - (231009, "Kaiden Sellsword Ashes +9"), - (231010, "Kaiden Sellsword Ashes +10"), - (232000, "Lone Wolf Ashes"), - (232001, "Lone Wolf Ashes +1"), - (232002, "Lone Wolf Ashes +2"), - (232003, "Lone Wolf Ashes +3"), - (232004, "Lone Wolf Ashes +4"), - (232005, "Lone Wolf Ashes +5"), - (232006, "Lone Wolf Ashes +6"), - (232007, "Lone Wolf Ashes +7"), - (232008, "Lone Wolf Ashes +8"), - (232009, "Lone Wolf Ashes +9"), - (232010, "Lone Wolf Ashes +10"), - (233000, "Giant Rat Ashes"), - (233001, "Giant Rat Ashes +1"), - (233002, "Giant Rat Ashes +2"), - (233003, "Giant Rat Ashes +3"), - (233004, "Giant Rat Ashes +4"), - (233005, "Giant Rat Ashes +5"), - (233006, "Giant Rat Ashes +6"), - (233007, "Giant Rat Ashes +7"), - (233008, "Giant Rat Ashes +8"), - (233009, "Giant Rat Ashes +9"), - (233010, "Giant Rat Ashes +10"), - (234000, "Demi-Human Ashes"), - (234001, "Demi-Human Ashes +1"), - (234002, "Demi-Human Ashes +2"), - (234003, "Demi-Human Ashes +3"), - (234004, "Demi-Human Ashes +4"), - (234005, "Demi-Human Ashes +5"), - (234006, "Demi-Human Ashes +6"), - (234007, "Demi-Human Ashes +7"), - (234008, "Demi-Human Ashes +8"), - (234009, "Demi-Human Ashes +9"), - (234010, "Demi-Human Ashes +10"), - (235000, "Rotten Stray Ashes"), - (235001, "Rotten Stray Ashes +1"), - (235002, "Rotten Stray Ashes +2"), - (235003, "Rotten Stray Ashes +3"), - (235004, "Rotten Stray Ashes +4"), - (235005, "Rotten Stray Ashes +5"), - (235006, "Rotten Stray Ashes +6"), - (235007, "Rotten Stray Ashes +7"), - (235008, "Rotten Stray Ashes +8"), - (235009, "Rotten Stray Ashes +9"), - (235010, "Rotten Stray Ashes +10"), - (236000, "Spirit Jellyfish Ashes"), - (236001, "Spirit Jellyfish Ashes +1"), - (236002, "Spirit Jellyfish Ashes +2"), - (236003, "Spirit Jellyfish Ashes +3"), - (236004, "Spirit Jellyfish Ashes +4"), - (236005, "Spirit Jellyfish Ashes +5"), - (236006, "Spirit Jellyfish Ashes +6"), - (236007, "Spirit Jellyfish Ashes +7"), - (236008, "Spirit Jellyfish Ashes +8"), - (236009, "Spirit Jellyfish Ashes +9"), - (236010, "Spirit Jellyfish Ashes +10"), - (237000, "Warhawk Ashes"), - (237001, "Warhawk Ashes +1"), - (237002, "Warhawk Ashes +2"), - (237003, "Warhawk Ashes +3"), - (237004, "Warhawk Ashes +4"), - (237005, "Warhawk Ashes +5"), - (237006, "Warhawk Ashes +6"), - (237007, "Warhawk Ashes +7"), - (237008, "Warhawk Ashes +8"), - (237009, "Warhawk Ashes +9"), - (237010, "Warhawk Ashes +10"), - (238000, "Stormhawk Deenh"), - (238001, "Stormhawk Deenh +1"), - (238002, "Stormhawk Deenh +2"), - (238003, "Stormhawk Deenh +3"), - (238004, "Stormhawk Deenh +4"), - (238005, "Stormhawk Deenh +5"), - (238006, "Stormhawk Deenh +6"), - (238007, "Stormhawk Deenh +7"), - (238008, "Stormhawk Deenh +8"), - (238009, "Stormhawk Deenh +9"), - (238010, "Stormhawk Deenh +10"), - (239000, "Bloodhound Knight Floh"), - (239001, "Bloodhound Knight Floh +1"), - (239002, "Bloodhound Knight Floh +2"), - (239003, "Bloodhound Knight Floh +3"), - (239004, "Bloodhound Knight Floh +4"), - (239005, "Bloodhound Knight Floh +5"), - (239006, "Bloodhound Knight Floh +6"), - (239007, "Bloodhound Knight Floh +7"), - (239008, "Bloodhound Knight Floh +8"), - (239009, "Bloodhound Knight Floh +9"), - (239010, "Bloodhound Knight Floh +10"), - (240000, "Wandering Noble Ashes"), - (240001, "Wandering Noble Ashes +1"), - (240002, "Wandering Noble Ashes +2"), - (240003, "Wandering Noble Ashes +3"), - (240004, "Wandering Noble Ashes +4"), - (240005, "Wandering Noble Ashes +5"), - (240006, "Wandering Noble Ashes +6"), - (240007, "Wandering Noble Ashes +7"), - (240008, "Wandering Noble Ashes +8"), - (240009, "Wandering Noble Ashes +9"), - (240010, "Wandering Noble Ashes +10"), - (241000, "Noble Sorcerer Ashes"), - (241001, "Noble Sorcerer Ashes +1"), - (241002, "Noble Sorcerer Ashes +2"), - (241003, "Noble Sorcerer Ashes +3"), - (241004, "Noble Sorcerer Ashes +4"), - (241005, "Noble Sorcerer Ashes +5"), - (241006, "Noble Sorcerer Ashes +6"), - (241007, "Noble Sorcerer Ashes +7"), - (241008, "Noble Sorcerer Ashes +8"), - (241009, "Noble Sorcerer Ashes +9"), - (241010, "Noble Sorcerer Ashes +10"), - (242000, "Vulgar Militia Ashes"), - (242001, "Vulgar Militia Ashes +1"), - (242002, "Vulgar Militia Ashes +2"), - (242003, "Vulgar Militia Ashes +3"), - (242004, "Vulgar Militia Ashes +4"), - (242005, "Vulgar Militia Ashes +5"), - (242006, "Vulgar Militia Ashes +6"), - (242007, "Vulgar Militia Ashes +7"), - (242008, "Vulgar Militia Ashes +8"), - (242009, "Vulgar Militia Ashes +9"), - (242010, "Vulgar Militia Ashes +10"), - (243000, "Mad Pumpkin Head Ashes"), - (243001, "Mad Pumpkin Head Ashes +1"), - (243002, "Mad Pumpkin Head Ashes +2"), - (243003, "Mad Pumpkin Head Ashes +3"), - (243004, "Mad Pumpkin Head Ashes +4"), - (243005, "Mad Pumpkin Head Ashes +5"), - (243006, "Mad Pumpkin Head Ashes +6"), - (243007, "Mad Pumpkin Head Ashes +7"), - (243008, "Mad Pumpkin Head Ashes +8"), - (243009, "Mad Pumpkin Head Ashes +9"), - (243010, "Mad Pumpkin Head Ashes +10"), - (244000, "Land Squirt Ashes"), - (244001, "Land Squirt Ashes +1"), - (244002, "Land Squirt Ashes +2"), - (244003, "Land Squirt Ashes +3"), - (244004, "Land Squirt Ashes +4"), - (244005, "Land Squirt Ashes +5"), - (244006, "Land Squirt Ashes +6"), - (244007, "Land Squirt Ashes +7"), - (244008, "Land Squirt Ashes +8"), - (244009, "Land Squirt Ashes +9"), - (244010, "Land Squirt Ashes +10"), - (245000, "Miranda Sprout Ashes"), - (245001, "Miranda Sprout Ashes +1"), - (245002, "Miranda Sprout Ashes +2"), - (245003, "Miranda Sprout Ashes +3"), - (245004, "Miranda Sprout Ashes +4"), - (245005, "Miranda Sprout Ashes +5"), - (245006, "Miranda Sprout Ashes +6"), - (245007, "Miranda Sprout Ashes +7"), - (245008, "Miranda Sprout Ashes +8"), - (245009, "Miranda Sprout Ashes +9"), - (245010, "Miranda Sprout Ashes +10"), - (246000, "Soldjars of Fortune Ashes"), - (246001, "Soldjars of Fortune Ashes +1"), - (246002, "Soldjars of Fortune Ashes +2"), - (246003, "Soldjars of Fortune Ashes +3"), - (246004, "Soldjars of Fortune Ashes +4"), - (246005, "Soldjars of Fortune Ashes +5"), - (246006, "Soldjars of Fortune Ashes +6"), - (246007, "Soldjars of Fortune Ashes +7"), - (246008, "Soldjars of Fortune Ashes +8"), - (246009, "Soldjars of Fortune Ashes +9"), - (246010, "Soldjars of Fortune Ashes +10"), - (247000, "Omenkiller Rollo"), - (247001, "Omenkiller Rollo +1"), - (247002, "Omenkiller Rollo +2"), - (247003, "Omenkiller Rollo +3"), - (247004, "Omenkiller Rollo +4"), - (247005, "Omenkiller Rollo +5"), - (247006, "Omenkiller Rollo +6"), - (247007, "Omenkiller Rollo +7"), - (247008, "Omenkiller Rollo +8"), - (247009, "Omenkiller Rollo +9"), - (247010, "Omenkiller Rollo +10"), - (248000, "Greatshield Soldier Ashes"), - (248001, "Greatshield Soldier Ashes +1"), - (248002, "Greatshield Soldier Ashes +2"), - (248003, "Greatshield Soldier Ashes +3"), - (248004, "Greatshield Soldier Ashes +4"), - (248005, "Greatshield Soldier Ashes +5"), - (248006, "Greatshield Soldier Ashes +6"), - (248007, "Greatshield Soldier Ashes +7"), - (248008, "Greatshield Soldier Ashes +8"), - (248009, "Greatshield Soldier Ashes +9"), - (248010, "Greatshield Soldier Ashes +10"), - (249000, "Archer Ashes"), - (249001, "Archer Ashes +1"), - (249002, "Archer Ashes +2"), - (249003, "Archer Ashes +3"), - (249004, "Archer Ashes +4"), - (249005, "Archer Ashes +5"), - (249006, "Archer Ashes +6"), - (249007, "Archer Ashes +7"), - (249008, "Archer Ashes +8"), - (249009, "Archer Ashes +9"), - (249010, "Archer Ashes +10"), - (250000, "Godrick Soldier Ashes"), - (250001, "Godrick Soldier Ashes +1"), - (250002, "Godrick Soldier Ashes +2"), - (250003, "Godrick Soldier Ashes +3"), - (250004, "Godrick Soldier Ashes +4"), - (250005, "Godrick Soldier Ashes +5"), - (250006, "Godrick Soldier Ashes +6"), - (250007, "Godrick Soldier Ashes +7"), - (250008, "Godrick Soldier Ashes +8"), - (250009, "Godrick Soldier Ashes +9"), - (250010, "Godrick Soldier Ashes +10"), - (251000, "Raya Lucaria Soldier Ashes"), - (251001, "Raya Lucaria Soldier Ashes +1"), - (251002, "Raya Lucaria Soldier Ashes +2"), - (251003, "Raya Lucaria Soldier Ashes +3"), - (251004, "Raya Lucaria Soldier Ashes +4"), - (251005, "Raya Lucaria Soldier Ashes +5"), - (251006, "Raya Lucaria Soldier Ashes +6"), - (251007, "Raya Lucaria Soldier Ashes +7"), - (251008, "Raya Lucaria Soldier Ashes +8"), - (251009, "Raya Lucaria Soldier Ashes +9"), - (251010, "Raya Lucaria Soldier Ashes +10"), - (252000, "Leyndell Soldier Ashes"), - (252001, "Leyndell Soldier Ashes +1"), - (252002, "Leyndell Soldier Ashes +2"), - (252003, "Leyndell Soldier Ashes +3"), - (252004, "Leyndell Soldier Ashes +4"), - (252005, "Leyndell Soldier Ashes +5"), - (252006, "Leyndell Soldier Ashes +6"), - (252007, "Leyndell Soldier Ashes +7"), - (252008, "Leyndell Soldier Ashes +8"), - (252009, "Leyndell Soldier Ashes +9"), - (252010, "Leyndell Soldier Ashes +10"), - (253000, "Radahn Soldier Ashes"), - (253001, "Radahn Soldier Ashes +1"), - (253002, "Radahn Soldier Ashes +2"), - (253003, "Radahn Soldier Ashes +3"), - (253004, "Radahn Soldier Ashes +4"), - (253005, "Radahn Soldier Ashes +5"), - (253006, "Radahn Soldier Ashes +6"), - (253007, "Radahn Soldier Ashes +7"), - (253008, "Radahn Soldier Ashes +8"), - (253009, "Radahn Soldier Ashes +9"), - (253010, "Radahn Soldier Ashes +10"), - (254000, "Mausoleum Soldier Ashes"), - (254001, "Mausoleum Soldier Ashes +1"), - (254002, "Mausoleum Soldier Ashes +2"), - (254003, "Mausoleum Soldier Ashes +3"), - (254004, "Mausoleum Soldier Ashes +4"), - (254005, "Mausoleum Soldier Ashes +5"), - (254006, "Mausoleum Soldier Ashes +6"), - (254007, "Mausoleum Soldier Ashes +7"), - (254008, "Mausoleum Soldier Ashes +8"), - (254009, "Mausoleum Soldier Ashes +9"), - (254010, "Mausoleum Soldier Ashes +10"), - (255000, "Haligtree Soldier Ashes"), - (255001, "Haligtree Soldier Ashes +1"), - (255002, "Haligtree Soldier Ashes +2"), - (255003, "Haligtree Soldier Ashes +3"), - (255004, "Haligtree Soldier Ashes +4"), - (255005, "Haligtree Soldier Ashes +5"), - (255006, "Haligtree Soldier Ashes +6"), - (255007, "Haligtree Soldier Ashes +7"), - (255008, "Haligtree Soldier Ashes +8"), - (255009, "Haligtree Soldier Ashes +9"), - (255010, "Haligtree Soldier Ashes +10"), - (256000, "Ancient Dragon Knight Kristoff"), - (256001, "Ancient Dragon Knight Kristoff +1"), - (256002, "Ancient Dragon Knight Kristoff +2"), - (256003, "Ancient Dragon Knight Kristoff +3"), - (256004, "Ancient Dragon Knight Kristoff +4"), - (256005, "Ancient Dragon Knight Kristoff +5"), - (256006, "Ancient Dragon Knight Kristoff +6"), - (256007, "Ancient Dragon Knight Kristoff +7"), - (256008, "Ancient Dragon Knight Kristoff +8"), - (256009, "Ancient Dragon Knight Kristoff +9"), - (256010, "Ancient Dragon Knight Kristoff +10"), - (257000, "Redmane Knight Ogha"), - (257001, "Redmane Knight Ogha +1"), - (257002, "Redmane Knight Ogha +2"), - (257003, "Redmane Knight Ogha +3"), - (257004, "Redmane Knight Ogha +4"), - (257005, "Redmane Knight Ogha +5"), - (257006, "Redmane Knight Ogha +6"), - (257007, "Redmane Knight Ogha +7"), - (257008, "Redmane Knight Ogha +8"), - (257009, "Redmane Knight Ogha +9"), - (257010, "Redmane Knight Ogha +10"), - (258000, "Lhutel the Headless"), - (258001, "Lhutel the Headless +1"), - (258002, "Lhutel the Headless +2"), - (258003, "Lhutel the Headless +3"), - (258004, "Lhutel the Headless +4"), - (258005, "Lhutel the Headless +5"), - (258006, "Lhutel the Headless +6"), - (258007, "Lhutel the Headless +7"), - (258008, "Lhutel the Headless +8"), - (258009, "Lhutel the Headless +9"), - (258010, "Lhutel the Headless +10"), - (259000, "Nepheli Loux Puppet"), - (259001, "Nepheli Loux Puppet +1"), - (259002, "Nepheli Loux Puppet +2"), - (259003, "Nepheli Loux Puppet +3"), - (259004, "Nepheli Loux Puppet +4"), - (259005, "Nepheli Loux Puppet +5"), - (259006, "Nepheli Loux Puppet +6"), - (259007, "Nepheli Loux Puppet +7"), - (259008, "Nepheli Loux Puppet +8"), - (259009, "Nepheli Loux Puppet +9"), - (259010, "Nepheli Loux Puppet +10"), - (260000, "Dung Eater Puppet"), - (260001, "Dung Eater Puppet +1"), - (260002, "Dung Eater Puppet +2"), - (260003, "Dung Eater Puppet +3"), - (260004, "Dung Eater Puppet +4"), - (260005, "Dung Eater Puppet +5"), - (260006, "Dung Eater Puppet +6"), - (260007, "Dung Eater Puppet +7"), - (260008, "Dung Eater Puppet +8"), - (260009, "Dung Eater Puppet +9"), - (260010, "Dung Eater Puppet +10"), - (261000, "Finger Maiden Therolina Puppet"), - (261001, "Finger Maiden Therolina Puppet +1"), - (261002, "Finger Maiden Therolina Puppet +2"), - (261003, "Finger Maiden Therolina Puppet +3"), - (261004, "Finger Maiden Therolina Puppet +4"), - (261005, "Finger Maiden Therolina Puppet +5"), - (261006, "Finger Maiden Therolina Puppet +6"), - (261007, "Finger Maiden Therolina Puppet +7"), - (261008, "Finger Maiden Therolina Puppet +8"), - (261009, "Finger Maiden Therolina Puppet +9"), - (261010, "Finger Maiden Therolina Puppet +10"), - (262000, "Dolores the Sleeping Arrow Puppet"), - (262001, "Dolores the Sleeping Arrow Puppet +1"), - (262002, "Dolores the Sleeping Arrow Puppet +2"), - (262003, "Dolores the Sleeping Arrow Puppet +3"), - (262004, "Dolores the Sleeping Arrow Puppet +4"), - (262005, "Dolores the Sleeping Arrow Puppet +5"), - (262006, "Dolores the Sleeping Arrow Puppet +6"), - (262007, "Dolores the Sleeping Arrow Puppet +7"), - (262008, "Dolores the Sleeping Arrow Puppet +8"), - (262009, "Dolores the Sleeping Arrow Puppet +9"), - (262010, "Dolores the Sleeping Arrow Puppet +10"), - (263000, "Jarwight Puppet"), - (263001, "Jarwight Puppet +1"), - (263002, "Jarwight Puppet +2"), - (263003, "Jarwight Puppet +3"), - (263004, "Jarwight Puppet +4"), - (263005, "Jarwight Puppet +5"), - (263006, "Jarwight Puppet +6"), - (263007, "Jarwight Puppet +7"), - (263008, "Jarwight Puppet +8"), - (263009, "Jarwight Puppet +9"), - (263010, "Jarwight Puppet +10"), - (999999999, ""), - ])) - }); -} diff --git a/src/db/weapon_name.rs b/src/db/weapon_name.rs deleted file mode 100644 index 838436c..0000000 --- a/src/db/weapon_name.rs +++ /dev/null @@ -1,2983 +0,0 @@ -pub mod weapon_name { - use std::{collections::HashMap, sync::Mutex}; - use once_cell::sync::Lazy; - - pub static WEAPON_NAME: Lazy>> = Lazy::new(|| { - Mutex::new(HashMap::from([ - (0, ""), - (1000,""), - (1100,""), - (1200,""), - (1210,""), - (1220,""), - (1230,""), - (1240,""), - (1250,""), - (1260,""), - (1400,""), - (1410,""), - (1420,""), - (1430,""), - (1500,""), - (1600,""), - (1700,""), - (1800,""), - (1900,""), - (2000,""), - (2100,""), - (2200,""), - (11000,""), - (12000,""), - (13000,""), - (100000,""), - (100100,""), - (100200,""), - (100300,""), - (100400,""), - (100500,""), - (100600,""), - (100700,""), - (100800,""), - (100900,""), - (101000,""), - (110000,"Unarmed"), - (170000,"Throwing Dagger"), - (171000,"Bone Dart"), - (172000,"Poisonbone Dart"), - (173000,"Kukri"), - (174000,"Crystal Dart"), - (175000,"Fan Daggers"), - (176000,"Ruin Fragment"), - (183000,"Explosive Stone"), - (183100,"Explosive Stone Clump"), - (184000,"Poisoned Stone"), - (184100,"Poisoned Stone Clump"), - (300000,"Ancestral Infant's Head"), - (301000,"Omen Bairn"), - (301100,"Regal Omen Bairn"), - (302000,"Miranda's Prayer"), - (303000,"Cuckoo Glintstone"), - (305000,"Glintstone Scrap"), - (305100,"Large Glintstone Scrap"), - (306000,"Gravity Stone Fan"), - (307000,"Gravity Stone Chunk"), - (308000,"Wraith Calling Bell"), - (351000,"Spark Aromatic"), - (358000,"Poison Spraymist"), - (361000,"Acid Spraymist"), - (830000,"Fire Pot"), - (830100,"Redmane Fire Pot"), - (830200,"Giantsflame Fire Pot"), - (832000,"Lightning Pot"), - (832100,"Ancient Dragonbolt Pot"), - (833000,"Fetid Pot"), - (834000,"Swarm Pot"), - (835000,"Holy Water Pot"), - (835100,"Sacred Order Pot"), - (836000,""), - (837000,"Poison Pot"), - (840000,"Roped Fire Pot"), - (842000,"Roped Lightning Pot"), - (843000,"Roped Fetid Pot"), - (844000,"Roped Poison Pot"), - (846000,"Roped Magic Pot"), - (847000,"Roped Fly Pot"), - (848000,""), - (849000,"Roped Volcano Pot"), - (851000,"Roped Holy Water Pot"), - (860000,"Volcano Pot"), - (864000,"Sleep Pot"), - (865000,"Rancor Pot"), - (866000,"Magic Pot"), - (866100,"Academy Magic Pot"), - (867000,""), - (1000000,"Dagger"), - (1000100,"Heavy Dagger"), - (1000200,"Keen Dagger"), - (1000300,"Quality Dagger"), - (1000400,"Fire Dagger"), - (1000500,"Flame Art Dagger"), - (1000600,"Lightning Dagger"), - (1000700,"Sacred Dagger"), - (1000800,"Magic Dagger"), - (1000900,"Cold Dagger"), - (1001000,"Poison Dagger"), - (1001100,"Blood Dagger"), - (1001200,"Occult Dagger"), - (1010000,"Black Knife"), - (1020000,"Parrying Dagger"), - (1020100,"Heavy Parrying Dagger"), - (1020200,"Keen Parrying Dagger"), - (1020300,"Quality Parrying Dagger"), - (1020400,"Fire Parrying Dagger"), - (1020500,"Flame Art Parrying Dagger"), - (1020600,"Lightning Parrying Dagger"), - (1020700,"Sacred Parrying Dagger"), - (1020800,"Magic Parrying Dagger"), - (1020900,"Cold Parrying Dagger"), - (1021000,"Poison Parrying Dagger"), - (1021100,"Blood Parrying Dagger"), - (1021200,"Occult Parrying Dagger"), - (1030000,"Misericorde"), - (1030100,"Heavy Misericorde"), - (1030200,"Keen Misericorde"), - (1030300,"Quality Misericorde"), - (1030400,"Fire Misericorde"), - (1030500,"Flame Art Misericorde"), - (1030600,"Lightning Misericorde"), - (1030700,"Sacred Misericorde"), - (1030800,"Magic Misericorde"), - (1030900,"Cold Misericorde"), - (1031000,"Poison Misericorde"), - (1031100,"Blood Misericorde"), - (1031200,"Occult Misericorde"), - (1040000,"Reduvia"), - (1050000,"Crystal Knife"), - (1060000,"Celebrant's Sickle"), - (1060100,"Celebrant's Heavy Sickle"), - (1060200,"Celebrant's Keen Sickle"), - (1060300,"Celebrant's Quality Sickle"), - (1060400,"Celebrant's Fire Sickle"), - (1060500,"Celebrant's Flame Art Sickle"), - (1060600,"Celebrant's Lightning Sickle"), - (1060700,"Celebrant's Sacred Sickle"), - (1060800,"Celebrant's Magic Sickle"), - (1060900,"Celebrant's Cold Sickle"), - (1061000,"Celebrant's Poison Sickle"), - (1061100,"Celebrant's Blood Sickle"), - (1061200,"Celebrant's Occult Sickle"), - (1070000,"Glintstone Kris"), - (1080000,"Scorpion's Stinger"), - (1090000,"Great Knife"), - (1090100,"Heavy Great Knife"), - (1090200,"Keen Great Knife"), - (1090300,"Quality Great Knife"), - (1090400,"Fire Great Knife"), - (1090500,"Flame Art Great Knife"), - (1090600,"Lightning Great Knife"), - (1090700,"Sacred Great Knife"), - (1090800,"Magic Great Knife"), - (1090900,"Cold Great Knife"), - (1091000,"Poison Great Knife"), - (1091100,"Blood Great Knife"), - (1091200,"Occult Great Knife"), - (1100000,"Wakizashi"), - (1100100,"Heavy Wakizashi"), - (1100200,"Keen Wakizashi"), - (1100300,"Quality Wakizashi"), - (1100400,"Fire Wakizashi"), - (1100500,"Flame Art Wakizashi"), - (1100600,"Lightning Wakizashi"), - (1100700,"Sacred Wakizashi"), - (1100800,"Magic Wakizashi"), - (1100900,"Cold Wakizashi"), - (1101000,"Poison Wakizashi"), - (1101100,"Blood Wakizashi"), - (1101200,"Occult Wakizashi"), - (1110000,"Cinquedea"), - (1130000,"Ivory Sickle"), - (1140000,"Bloodstained Dagger"), - (1140100,"Heavy Bloodstained Dagger"), - (1140200,"Keen Bloodstained Dagger"), - (1140300,"Quality Bloodstained Dagger"), - (1140400,"Fire Bloodstained Dagger"), - (1140500,"Flame Art Bloodstained Dagger"), - (1140600,"Lightning Bloodstained Dagger"), - (1140700,"Sacred Bloodstained Dagger"), - (1140800,"Magic Bloodstained Dagger"), - (1140900,"Cold Bloodstained Dagger"), - (1141000,"Poison Bloodstained Dagger"), - (1141100,"Blood Bloodstained Dagger"), - (1141200,"Occult Bloodstained Dagger"), - (1150000,"Erdsteel Dagger"), - (1150100,"Heavy Erdsteel Dagger"), - (1150200,"Keen Erdsteel Dagger"), - (1150300,"Quality Erdsteel Dagger"), - (1150400,"Fire Erdsteel Dagger"), - (1150500,"Flame Art Erdsteel Dagger"), - (1150600,"Lightning Erdsteel Dagger"), - (1150700,"Sacred Erdsteel Dagger"), - (1150800,"Magic Erdsteel Dagger"), - (1150900,"Cold Erdsteel Dagger"), - (1151000,"Poison Erdsteel Dagger"), - (1151100,"Blood Erdsteel Dagger"), - (1151200,"Occult Erdsteel Dagger"), - (1160000,"Blade of Calling"), - (1190000,""), - (1910000,""), - (2000000,"Longsword"), - (2000100,"Heavy Longsword"), - (2000200,"Keen Longsword"), - (2000300,"Quality Longsword"), - (2000400,"Fire Longsword"), - (2000500,"Flame Art Longsword"), - (2000600,"Lightning Longsword"), - (2000700,"Sacred Longsword"), - (2000800,"Magic Longsword"), - (2000900,"Cold Longsword"), - (2001000,"Poison Longsword"), - (2001100,"Bloody Longsword"), - (2001200,"Occult Longsword"), - (2010000,"Short Sword"), - (2010100,"Heavy Short Sword"), - (2010200,"Keen Short Sword"), - (2010300,"Quality Short Sword"), - (2010400,"Fire Short Sword"), - (2010500,"Flame Art Short Sword"), - (2010600,"Lightning Short Sword"), - (2010700,"Sacred Short Sword"), - (2010800,"Magic Short Sword"), - (2010900,"Cold Short Sword"), - (2011000,"Poison Short Sword"), - (2011100,"Blood Short Sword"), - (2011200,"Occult Short Sword"), - (2020000,"Broadsword"), - (2020100,"Heavy Broadsword"), - (2020200,"Keen Broadsword"), - (2020300,"Quality Broadsword"), - (2020400,"Fire Broadsword"), - (2020500,"Flame Art Broadsword"), - (2020600,"Lightning Broadsword"), - (2020700,"Sacred Broadsword"), - (2020800,"Magic Broadsword"), - (2020900,"Cold Broadsword"), - (2021000,"Poison Broadsword"), - (2021100,"Blood Broadsword"), - (2021200,"Occult Broadsword"), - (2040000,"Lordsworn's Straight Sword"), - (2040100,"Lordsworn's Heavy Straight Sword"), - (2040200,"Lordsworn's Keen Straight Sword"), - (2040300,"Lordsworn's Quality Straight Sword"), - (2040400,"Lordsworn's Fire Straight Sword"), - (2040500,"Lordsworn's Flame Art Straight Sword"), - (2040600,"Lordsworn's Lightning Straight Sword"), - (2040700,"Lordsworn's Sacred Straight Sword"), - (2040800,"Lordsworn's Magic Straight Sword"), - (2040900,"Lordsworn's Cold Straight Sword"), - (2041000,"Lordsworn's Poison Straight Sword"), - (2041100,"Lordsworn's Blood Straight Sword"), - (2041200,"Lordsworn's Occult Straight Sword"), - (2050000,"Weathered Straight Sword"), - (2050100,"Weathered Heavy Straight Sword"), - (2050200,"Weathered Keen Straight Sword"), - (2050300,"Weathered Quality Straight Sword"), - (2050400,"Weathered Fire Straight Sword"), - (2050500,"Weathered Flame Art Straight Sword"), - (2050600,"Weathered Lightning Straight Sword"), - (2050700,"Weathered Sacred Straight Sword"), - (2050800,"Weathered Magic Straight Sword"), - (2050900,"Weathered Cold Straight Sword"), - (2051000,"Weathered Poison Straight Sword"), - (2051100,"Weathered Blood Straight Sword"), - (2051200,"Weathered Occult Straight Sword"), - (2060000,"Ornamental Straight Sword"), - (2070000,"Golden Epitaph"), - (2080000,"Nox Flowing Sword"), - (2090000,"Inseparable Sword"), - (2092000,""), - (2110000,"Coded Sword"), - (2140000,"Sword of Night and Flame"), - (2150000,"Crystal Sword"), - (2180000,"Carian Knight's Sword"), - (2190000,"Sword of St. Trina"), - (2200000,"Miquellan Knight's Sword"), - (2210000,"Cane Sword"), - (2210100,"Heavy Cane Sword"), - (2210200,"Keen Cane Sword"), - (2210300,"Quality Cane Sword"), - (2210400,"Fire Cane Sword"), - (2210500,"Flame Art Cane Sword"), - (2210600,"Lightning Cane Sword"), - (2210700,"Sacred Cane Sword"), - (2210800,"Magic Cane Sword"), - (2210900,"Cold Cane Sword"), - (2211000,"Poison Cane Sword"), - (2211100,"Blood Cane Sword"), - (2211200,"Occult Cane Sword"), - (2220000,"Regalia of Eochaid"), - (2230000,"Noble's Slender Sword"), - (2230100,"Noble's Heavy Slender Sword"), - (2230200,"Noble's Keen Slender Sword"), - (2230300,"Noble's Quality Slender Sword"), - (2230400,"Noble's Fire Slender Sword"), - (2230500,"Noble's Flame Art Slender Sword"), - (2230600,"Noble's Lightning Slender Sword"), - (2230700,"Noble's Sacred Slender Sword"), - (2230800,"Noble's Magic Slender Sword"), - (2230900,"Noble's Cold Slender Sword"), - (2231000,"Noble's Poison Slender Sword"), - (2231100,"Noble's Blood Slender Sword"), - (2231200,"Noble's Occult Slender Sword"), - (2240000,"Warhawk's Talon"), - (2240100,"Warhawk's Heavy Talon"), - (2240200,"Warhawk's Keen Talon"), - (2240300,"Warhawk's Quality Talon"), - (2240400,"Warhawk's Fire Talon"), - (2240500,"Warhawk's Flame Art Talon"), - (2240600,"Warhawk's Lightning Talon"), - (2240700,"Warhawk's Sacred Talon"), - (2240800,"Warhawk's Magic Talon"), - (2240900,"Warhawk's Cold Talon"), - (2241000,"Warhawk's Poison Talon"), - (2241100,"Warhawk's Blood Talon"), - (2241200,"Warhawk's Occult Talon"), - (2250000,"Lazuli Glintstone Sword"), - (2260000,"Rotten Crystal Sword"), - (3000000,"Bastard Sword"), - (3000100,"Heavy Bastard Sword"), - (3000200,"Keen Bastard Sword"), - (3000300,"Quality Bastard Sword"), - (3000400,"Fire Bastard Sword"), - (3000500,"Flame Art Bastard Sword"), - (3000600,"Lightning Bastard Sword"), - (3000700,"Sacred Bastard Sword"), - (3000800,"Magic Bastard Sword"), - (3000900,"Cold Bastard Sword"), - (3001000,"Poison Bastard Sword"), - (3001100,"Bloody Bastard Sword"), - (3001200,"Occult Bastard Sword"), - (3010000,"Forked Greatsword"), - (3010100,"Heavy Forked Greatsword"), - (3010200,"Keen Forked Greatsword"), - (3010300,"Quality Forked Greatsword"), - (3010400,"Fire Forked Greatsword"), - (3010500,"Flame Art Forked Greatsword"), - (3010600,"Lightning Forked Greatsword"), - (3010700,"Sacred Forked Greatsword"), - (3010800,"Magic Forked Greatsword"), - (3010900,"Cold Forked Greatsword"), - (3011000,"Poison Forked Greatsword"), - (3011100,"Blood Forked Greatsword"), - (3011200,"Occult Forked Greatsword"), - (3020000,"Iron Greatsword"), - (3020100,"Heavy Iron Greatsword"), - (3020200,"Keen Iron Greatsword"), - (3020300,"Quality Iron Greatsword"), - (3020400,"Fire Iron Greatsword"), - (3020500,"Flame Art Iron Greatsword"), - (3020600,"Lightning Iron Greatsword"), - (3020700,"Sacred Iron Greatsword"), - (3020800,"Magic Iron Greatsword"), - (3020900,"Cold Iron Greatsword"), - (3021000,"Poison Iron Greatsword"), - (3021100,"Blood Iron Greatsword"), - (3021200,"Occult Iron Greatsword"), - (3030000,"Lordsworn's Greatsword"), - (3030100,"Lordsworn's Heavy Greatsword"), - (3030200,"Lordsworn's Keen Greatsword"), - (3030300,"Lordsworn's Quality Greatsword"), - (3030400,"Lordsworn's Fire Greatsword"), - (3030500,"Lordsworn's Flame Art Greatsword"), - (3030600,"Lordsworn's Lightning Greatsword"), - (3030700,"Lordsworn's Sacred Greatsword"), - (3030800,"Lordsworn's Magic Greatsword"), - (3030900,"Lordsworn's Cold Greatsword"), - (3031000,"Lordsworn's Poison Greatsword"), - (3031100,"Lordsworn's Blood Greatsword"), - (3031200,"Lordsworn's Occult Greatsword"), - (3040000,"Knight's Greatsword"), - (3040100,"Knight's Heavy Greatsword"), - (3040200,"Knight's Keen Greatsword"), - (3040300,"Knight's Quality Greatsword"), - (3040400,"Knight's Fire Greatsword"), - (3040500,"Knight's Flame Art Greatsword"), - (3040600,"Knight's Lightning Greatsword"), - (3040700,"Knight's Sacred Greatsword"), - (3040800,"Knight's Magic Greatsword"), - (3040900,"Knight's Cold Greatsword"), - (3041000,"Knight's Poison Greatsword"), - (3041100,"Knight's Blood Greatsword"), - (3041200,"Knight's Occult Greatsword"), - (3050000,"Flamberge"), - (3050100,"Heavy Flamberge"), - (3050200,"Keen Flamberge"), - (3050300,"Quality Flamberge"), - (3050400,"Fire Flamberge"), - (3050500,"Flame Art Flamberge"), - (3050600,"Lightning Flamberge"), - (3050700,"Sacred Flamberge"), - (3050800,"Magic Flamberge"), - (3050900,"Cold Flamberge"), - (3051000,"Poison Flamberge"), - (3051100,"Blood Flamberge"), - (3051200,"Occult Flamberge"), - (3060000,"Ordovis's Greatsword"), - (3070000,"Alabaster Lord's Sword"), - (3080000,"Banished Knight's Greatsword"), - (3080100,"Banished Knight's Heavy Greatsword"), - (3080200,"Banished Knight's Keen Greatsword"), - (3080300,"Banished Knight's Quality Greatsword"), - (3080400,"Banished Knight's Fire Greatsword"), - (3080500,"Banished Knight's Flame Art Greatsword"), - (3080600,"Banished Knight's Lightning Greatsword"), - (3080700,"Banished Knight's Sacred Greatsword"), - (3080800,"Banished Knight's Magic Greatsword"), - (3080900,"Banished Knight's Cold Greatsword"), - (3081000,"Banished Knight's Poison Greatsword"), - (3081100,"Banished Knight's Blood Greatsword"), - (3081200,"Banished Knight's Occult Greatsword"), - (3090000,"Dark Moon Greatsword"), - (3100000,"Sacred Relic Sword"), - (3130000,"Helphen's Steeple"), - (3140000,"Blasphemous Blade"), - (3150000,"Marais Executioner's Sword"), - (3160000,"Sword of Milos"), - (3170000,"Golden Order Greatsword"), - (3180000,"Claymore"), - (3180100,"Heavy Claymore"), - (3180200,"Keen Claymore"), - (3180300,"Quality Claymore"), - (3180400,"Fire Claymore"), - (3180500,"Flame Art Claymore"), - (3180600,"Lightning Claymore"), - (3180700,"Sacred Claymore"), - (3180800,"Magic Claymore"), - (3180900,"Cold Claymore"), - (3181000,"Poison Claymore"), - (3181100,"Blood Claymore"), - (3181200,"Occult Claymore"), - (3190000,"Gargoyle's Greatsword"), - (3190100,"Gargoyle's Heavy Greatsword"), - (3190200,"Gargoyle's Keen Greatsword"), - (3190300,"Gargoyle's Quality Greatsword"), - (3190400,"Gargoyle's Fire Greatsword"), - (3190500,"Gargoyle's Flame Art Greatsword"), - (3190600,"Gargoyle's Lightning Greatsword"), - (3190700,"Gargoyle's Sacred Greatsword"), - (3190800,"Gargoyle's Magic Greatsword"), - (3190900,"Gargoyle's Cold Greatsword"), - (3191000,"Gargoyle's Poison Greatsword"), - (3191100,"Gargoyle's Blood Greatsword"), - (3191200,"Gargoyle's Occult Greatsword"), - (3200000,"Death's Poker"), - (3210000,"Gargoyle's Blackblade"), - (3220000,""), - (3900000,""), - (4000000,"Greatsword"), - (4000100,"Heavy Greatsword"), - (4000200,"Keen Greatsword"), - (4000300,"Quality Greatsword"), - (4000400,"Fire Greatsword"), - (4000500,"Flame Art Greatsword"), - (4000600,"Lightning Greatsword"), - (4000700,"Sacred Greatsword"), - (4000800,"Magic Greatsword"), - (4000900,"Cold Greatsword"), - (4001000,"Poison Greatsword"), - (4001100,"Blood Greatsword"), - (4001200,"Occult Greatsword"), - (4010000,"Watchdog's Greatsword"), - (4010100,"Watchdog's Heavy Greatsword"), - (4010200,"Watchdog's Keen Greatsword"), - (4010300,"Watchdog's Quality Greatsword"), - (4010400,"Watchdog's Fire Greatsword"), - (4010500,"Watchdog's Flame Art Greatsword"), - (4010600,"Watchdog's Lightning Greatsword"), - (4010700,"Watchdog's Sacred Greatsword"), - (4010800,"Watchdog's Magic Greatsword"), - (4010900,"Watchdog's Cold Greatsword"), - (4011000,"Watchdog's Poison Greatsword"), - (4011100,"Watchdog's Blood Greatsword"), - (4011200,"Watchdog's Occult Greatsword"), - (4020000,"Maliketh's Black Blade"), - (4030000,"Troll's Golden Sword"), - (4030100,"Troll's Golden Heavy Sword"), - (4030200,"Troll's Golden Keen Sword"), - (4030300,"Troll's Golden Quality Sword"), - (4030400,"Troll's Golden Fire Sword"), - (4030500,"Troll's Golden Flame Art Sword"), - (4030600,"Troll's Golden Lightning Sword"), - (4030700,"Troll's Golden Sacred Sword"), - (4030800,"Troll's Golden Magic Sword"), - (4030900,"Troll's Golden Cold Sword"), - (4031000,"Troll's Golden Poison Sword"), - (4031100,"Troll's Golden Blood Sword"), - (4031200,"Troll's Golden Occult Sword"), - (4040000,"Zweihander"), - (4040100,"Heavy Zweihander"), - (4040200,"Keen Zweihander"), - (4040300,"Quality Zweihander"), - (4040400,"Fire Zweihander"), - (4040500,"Flame Art Zweihander"), - (4040600,"Lightning Zweihander"), - (4040700,"Sacred Zweihander"), - (4040800,"Magic Zweihander"), - (4040900,"Cold Zweihander"), - (4041000,"Poison Zweihander"), - (4041100,"Blood Zweihander"), - (4041200,"Occult Zweihander"), - (4050000,"Starscourge Greatsword"), - (4060000,"Royal Greatsword"), - (4070000,"Godslayer's Greatsword"), - (4080000,"Ruins Greatsword"), - (4100000,"Grafted Blade Greatsword"), - (4110000,"Troll Knight's Sword"), - (4900000,""), - (4910000,""), - (5000000,"Estoc"), - (5000100,"Heavy Estoc"), - (5000200,"Keen Estoc"), - (5000300,"Quality Estoc"), - (5000400,"Fire Estoc"), - (5000500,"Flame Art Estoc"), - (5000600,"Lightning Estoc"), - (5000700,"Sacred Estoc"), - (5000800,"Magic Estoc"), - (5000900,"Cold Estoc"), - (5001000,"Poison Estoc"), - (5001100,"Blood Estoc"), - (5001200,"Occult Estoc"), - (5010000,"Cleanrot Knight's Sword"), - (5010100,"Cleanrot Knight's Heavy Sword"), - (5010200,"Cleanrot Knight's Keen Sword"), - (5010300,"Cleanrot Knight's Quality Sword"), - (5010400,"Cleanrot Knight's Fire Sword"), - (5010500,"Cleanrot Knight's Flame Art Sword"), - (5010600,"Cleanrot Knight's Lightning Sword"), - (5010700,"Cleanrot Knight's Sacred Sword"), - (5010800,"Cleanrot Knight's Magic Sword"), - (5010900,"Cleanrot Knight's Cold Sword"), - (5011000,"Cleanrot Knight's Poison Sword"), - (5011100,"Cleanrot Knight's Blood Sword"), - (5011200,"Cleanrot Knight's Occult Sword"), - (5020000,"Rapier"), - (5020100,"Heavy Rapier"), - (5020200,"Keen Rapier"), - (5020300,"Quality Rapier"), - (5020400,"Fire Rapier"), - (5020500,"Flame Art Rapier"), - (5020600,"Lightning Rapier"), - (5020700,"Sacred Rapier"), - (5020800,"Magic Rapier"), - (5020900,"Cold Rapier"), - (5021000,"Poison Rapier"), - (5021100,"Blood Rapier"), - (5021200,"Occult Rapier"), - (5030000,"Rogier's Rapier"), - (5030100,"Rogier's Heavy Rapier"), - (5030200,"Rogier's Keen Rapier"), - (5030300,"Rogier's Quality Rapier"), - (5030400,"Rogier's Fire Rapier"), - (5030500,"Rogier's Flame Art Rapier"), - (5030600,"Rogier's Lightning Rapier"), - (5030700,"Rogier's Sacred Rapier"), - (5030800,"Rogier's Magic Rapier"), - (5030900,"Rogier's Cold Rapier"), - (5031000,"Rogier's Poison Rapier"), - (5031100,"Rogier's Blood Rapier"), - (5031200,"Rogier's Occult Rapier"), - (5040000,"Antspur Rapier"), - (5040100,"Heavy Antspur Rapier"), - (5040200,"Keen Antspur Rapier"), - (5040300,"Quality Antspur Rapier"), - (5040400,"Fire Antspur Rapier"), - (5040500,"Flame Art Antspur Rapier"), - (5040600,"Lightning Antspur Rapier"), - (5040700,"Sacred Antspur Rapier"), - (5040800,"Magic Antspur Rapier"), - (5040900,"Cold Antspur Rapier"), - (5041000,"Poison Antspur Rapier"), - (5041100,"Blood Antspur Rapier"), - (5041200,"Occult Antspur Rapier"), - (5050000,"Frozen Needle"), - (5060000,"Noble's Estoc"), - (5060100,"Noble's Heavy Estoc"), - (5060200,"Noble's Keen Estoc"), - (5060300,"Noble's Quality Estoc"), - (5060400,"Noble's Fire Estoc"), - (5060500,"Noble's Flame Art Estoc"), - (5060600,"Noble's Lightning Estoc"), - (5060700,"Noble's Sacred Estoc"), - (5060800,"Noble's Magic Estoc"), - (5060900,"Noble's Cold Estoc"), - (5061000,"Noble's Poison Estoc"), - (5061100,"Noble's Blood Estoc"), - (5061200,"Noble's Occult Estoc"), - (6000000,"Bloody Helice"), - (6010000,"Godskin Stitcher"), - (6010100,"Heavy Godskin Stitcher"), - (6010200,"Keen Godskin Stitcher"), - (6010300,"Quality Godskin Stitcher"), - (6010400,"Fire Godskin Stitcher"), - (6010500,"Flame Art Godskin Stitcher"), - (6010600,"Lightning Godskin Stitcher"), - (6010700,"Sacred Godskin Stitcher"), - (6010800,"Magic Godskin Stitcher"), - (6010900,"Cold Godskin Stitcher"), - (6011000,"Poison Godskin Stitcher"), - (6011100,"Blood Godskin Stitcher"), - (6011200,"Occult Godskin Stitcher"), - (6020000,"Great epee"), - (6020100,"Heavy Great epee"), - (6020200,"Keen Great epee"), - (6020300,"Quality Great epee"), - (6020400,"Fire Great epee"), - (6020500,"Flame Art Great epee"), - (6020600,"Lightning Great epee"), - (6020700,"Sacred Great epee"), - (6020800,"Magic Great epee"), - (6020900,"Cold Great epee"), - (6021000,"Poison Great epee"), - (6021100,"Blood Great epee"), - (6021200,"Occult Great epee"), - (6040000,"Dragon King's Cragblade"), - (6900000,""), - (7000000,"Falchion"), - (7000100,"Heavy Falchion"), - (7000200,"Keen Falchion"), - (7000300,"Quality Falchion"), - (7000400,"Fire Falchion"), - (7000500,"Flame Art Falchion"), - (7000600,"Lightning Falchion"), - (7000700,"Sacred Falchion"), - (7000800,"Magic Falchion"), - (7000900,"Cold Falchion"), - (7001000,"Poison Falchion"), - (7001100,"Blood Falchion"), - (7001200,"Occult Falchion"), - (7010000,"Beastman's Curved Sword"), - (7010100,"Beastman's Heavy Curved Sword"), - (7010200,"Beastman's Keen Curved Sword"), - (7010300,"Beastman's Quality Curved Sword"), - (7010400,"Beastman's Fire Curved Sword"), - (7010500,"Beastman's Flame Art Curved Sword"), - (7010600,"Beastman's Lightning Curved Sword"), - (7010700,"Beastman's Sacred Curved Sword"), - (7010800,"Beastman's Magic Curved Sword"), - (7010900,"Beastman's Cold Curved Sword"), - (7011000,"Beastman's Poison Curved Sword"), - (7011100,"Beastman's Blood Curved Sword"), - (7011200,"Beastman's Occult Curved Sword"), - (7020000,"Shotel"), - (7020100,"Heavy Shotel"), - (7020200,"Keen Shotel"), - (7020300,"Quality Shotel"), - (7020400,"Fire Shotel"), - (7020500,"Flame Art Shotel"), - (7020600,"Lightning Shotel"), - (7020700,"Sacred Shotel"), - (7020800,"Magic Shotel"), - (7020900,"Cold Shotel"), - (7021000,"Poison Shotel"), - (7021100,"Blood Shotel"), - (7021200,"Occult Shotel"), - (7030000,"Shamshir"), - (7030100,"Heavy Shamshir"), - (7030200,"Keen Shamshir"), - (7030300,"Quality Shamshir"), - (7030400,"Fire Shamshir"), - (7030500,"Flame Art Shamshir"), - (7030600,"Lightning Shamshir"), - (7030700,"Sacred Shamshir"), - (7030800,"Magic Shamshir"), - (7030900,"Cold Shamshir"), - (7031000,"Poison Shamshir"), - (7031100,"Blood Shamshir"), - (7031200,"Occult Shamshir"), - (7040000,"Bandit's Curved Sword"), - (7040100,"Bandit's Heavy Curved Sword"), - (7040200,"Bandit's Keen Curved Sword"), - (7040300,"Bandit's Quality Curved Sword"), - (7040400,"Bandit's Fire Curved Sword"), - (7040500,"Bandit's Flame Art Curved Sword"), - (7040600,"Bandit's Lightning Curved Sword"), - (7040700,"Bandit's Sacred Curved Sword"), - (7040800,"Bandit's Magic Curved Sword"), - (7040900,"Bandit's Cold Curved Sword"), - (7041000,"Bandit's Poison Curved Sword"), - (7041100,"Bandit's Blood Curved Sword"), - (7041200,"Bandit's Occult Curved Sword"), - (7050000,"Magma Blade"), - (7060000,"Flowing Curved Sword"), - (7060100,"Flowing Heavy Curved Sword"), - (7060200,"Flowing Keen Curved Sword"), - (7060300,"Flowing Quality Curved Sword"), - (7060400,"Flowing Fire Curved Sword"), - (7060500,"Flowing Flame Art Curved Sword"), - (7060600,"Flowing Lightning Curved Sword"), - (7060700,"Flowing Sacred Curved Sword"), - (7060800,"Flowing Magic Curved Sword"), - (7060900,"Flowing Cold Curved Sword"), - (7061000,"Flowing Poison Curved Sword"), - (7061100,"Flowing Blood Curved Sword"), - (7061200,"Flowing Occult Curved Sword"), - (7070000,"Wing of Astel"), - (7080000,"Scavenger's Curved Sword"), - (7080100,"Scavenger's Heavy Curved Sword"), - (7080200,"Scavenger's Keen Curved Sword"), - (7080300,"Scavenger's Quality Curved Sword"), - (7080400,"Scavenger's Fire Curved Sword"), - (7080500,"Scavenger's Flame Art Curved Sword"), - (7080600,"Scavenger's Lightning Curved Sword"), - (7080700,"Scavenger's Sacred Curved Sword"), - (7080800,"Scavenger's Magic Curved Sword"), - (7080900,"Scavenger's Cold Curved Sword"), - (7081000,"Scavenger's Poison Curved Sword"), - (7081100,"Scavenger's Blood Curved Sword"), - (7081200,"Scavenger's Occult Curved Sword"), - (7100000,"Eclipse Shotel"), - (7110000,"Serpent-God's Curved Sword"), - (7110100,"Serpent-God's Heavy Curved Sword"), - (7110200,"Serpent-God's Keen Curved Sword"), - (7110300,"Serpent-God's Quality Curved Sword"), - (7110400,"Serpent-God's Fire Curved Sword"), - (7110500,"Serpent-God's Flame Art Curved Sword"), - (7110600,"Serpent-God's Lightning Curved Sword"), - (7110700,"Serpent-God's Sacred Curved Sword"), - (7110800,"Serpent-God's Magic Curved Sword"), - (7110900,"Serpent-God's Cold Curved Sword"), - (7111000,"Serpent-God's Poison Curved Sword"), - (7111100,"Serpent-God's Blood Curved Sword"), - (7111200,"Serpent-God's Occult Curved Sword"), - (7120000,"Mantis Blade"), - (7120100,"Heavy Mantis Blade"), - (7120200,"Keen Mantis Blade"), - (7120300,"Quality Mantis Blade"), - (7120400,"Fire Mantis Blade"), - (7120500,"Flame Art Mantis Blade"), - (7120600,"Lightning Mantis Blade"), - (7120700,"Sacred Mantis Blade"), - (7120800,"Magic Mantis Blade"), - (7120900,"Cold Mantis Blade"), - (7121000,"Poison Mantis Blade"), - (7121100,"Blood Mantis Blade"), - (7121200,"Occult Mantis Blade"), - (7140000,"Scimitar"), - (7140100,"Heavy Scimitar"), - (7140200,"Keen Scimitar"), - (7140300,"Quality Scimitar"), - (7140400,"Fire Scimitar"), - (7140500,"Flame Art Scimitar"), - (7140600,"Lightning Scimitar"), - (7140700,"Sacred Scimitar"), - (7140800,"Magic Scimitar"), - (7140900,"Cold Scimitar"), - (7141000,"Poison Scimitar"), - (7141100,"Bloody Scimitar"), - (7141200,"Occult Scimitar"), - (7150000,"Grossmesser"), - (7150100,"Heavy Grossmesser"), - (7150200,"Keen Grossmesser"), - (7150300,"Quality Grossmesser"), - (7150400,"Fire Grossmesser"), - (7150500,"Flame Art Grossmesser"), - (7150600,"Lightning Grossmesser"), - (7150700,"Sacred Grossmesser"), - (7150800,"Magic Grossmesser"), - (7150900,"Cold Grossmesser"), - (7151000,"Poison Grossmesser"), - (7151100,"Blood Grossmesser"), - (7151200,"Occult Grossmesser"), - (8010000,"Onyx Lord's Greatsword"), - (8020000,"Dismounter"), - (8020100,"Heavy Dismounter"), - (8020200,"Keen Dismounter"), - (8020300,"Quality Dismounter"), - (8020400,"Fire Dismounter"), - (8020500,"Flame Art Dismounter"), - (8020600,"Lightning Dismounter"), - (8020700,"Sacred Dismounter"), - (8020800,"Magic Dismounter"), - (8020900,"Cold Dismounter"), - (8021000,"Poison Dismounter"), - (8021100,"Blood Dismounter"), - (8021200,"Occult Dismounter"), - (8030000,"Bloodhound's Fang"), - (8040000,"Magma Wyrm's Scalesword"), - (8050000,"Zamor Curved Sword"), - (8060000,"Omen Cleaver"), - (8060100,"Heavy Omen Cleaver"), - (8060200,"Keen Omen Cleaver"), - (8060300,"Quality Omen Cleaver"), - (8060400,"Fire Omen Cleaver"), - (8060500,"Flame Art Omen Cleaver"), - (8060600,"Lightning Omen Cleaver"), - (8060700,"Sacred Omen Cleaver"), - (8060800,"Magic Omen Cleaver"), - (8060900,"Cold Omen Cleaver"), - (8061000,"Poison Omen Cleaver"), - (8061100,"Blood Omen Cleaver"), - (8061200,"Occult Omen Cleaver"), - (8070000,"Monk's Flameblade"), - (8070100,"Monk's Heavy Flameblade"), - (8070200,"Monk's Keen Flameblade"), - (8070300,"Monk's Quality Flameblade"), - (8070400,"Monk's Fire Flameblade"), - (8070500,"Monk's Flame Art Flameblade"), - (8070600,"Monk's Lightning Flameblade"), - (8070700,"Monk's Sacred Flameblade"), - (8070800,"Monk's Magic Flameblade"), - (8070900,"Monk's Cold Flameblade"), - (8071000,"Monk's Poison Flameblade"), - (8071100,"Monk's Blood Flameblade"), - (8071200,"Monk's Occult Flameblade"), - (8080000,"Beastman's Cleaver"), - (8080100,"Beastman's Heavy Cleaver"), - (8080200,"Beastman's Keen Cleaver"), - (8080300,"Beastman's Quality Cleaver"), - (8080400,"Beastman's Fire Cleaver"), - (8080500,"Beastman's Flame Art Cleaver"), - (8080600,"Beastman's Lightning Cleaver"), - (8080700,"Beastman's Sacred Cleaver"), - (8080800,"Beastman's Magic Cleaver"), - (8080900,"Beastman's Cold Cleaver"), - (8081000,"Beastman's Poison Cleaver"), - (8081100,"Beastman's Blood Cleaver"), - (8081200,"Beastman's Occult Cleaver"), - (8100000,"Morgott's Cursed Sword"), - (8900000,""), - (9000000,"Uchigatana"), - (9000100,"Heavy Uchigatana"), - (9000200,"Keen Uchigatana"), - (9000300,"Quality Uchigatana"), - (9000400,"Fire Uchigatana"), - (9000500,"Flame Art Uchigatana"), - (9000600,"Lightning Uchigatana"), - (9000700,"Sacred Uchigatana"), - (9000800,"Magic Uchigatana"), - (9000900,"Cold Uchigatana"), - (9001000,"Poison Uchigatana"), - (9001100,"Blood Uchigatana"), - (9001200,"Occult Uchigatana"), - (9010000,"Nagakiba"), - (9010100,"Heavy Nagakiba"), - (9010200,"Keen Nagakiba"), - (9010300,"Quality Nagakiba"), - (9010400,"Fire Nagakiba"), - (9010500,"Flame Art Nagakiba"), - (9010600,"Lightning Nagakiba"), - (9010700,"Sacred Nagakiba"), - (9010800,"Magic Nagakiba"), - (9010900,"Cold Nagakiba"), - (9011000,"Poison Nagakiba"), - (9011100,"Blood Nagakiba"), - (9011200,"Occult Nagakiba"), - (9020000,"Hand of Malenia"), - (9030000,"Meteoric Ore Blade"), - (9040000,"Rivers of Blood"), - (9060000,"Moonveil"), - (9070000,"Dragonscale Blade"), - (9080000,"Serpentbone Blade"), - (9080100,"Heavy Serpentbone Blade"), - (9080200,"Keen Serpentbone Blade"), - (9080300,"Quality Serpentbone Blade"), - (9080400,"Fire Serpentbone Blade"), - (9080500,"Flame Art Serpentbone Blade"), - (9080600,"Lightning Serpentbone Blade"), - (9080700,"Sacred Serpentbone Blade"), - (9080800,"Magic Serpentbone Blade"), - (9080900,"Cold Serpentbone Blade"), - (9081000,"Poison Serpentbone Blade"), - (9081100,"Blood Serpentbone Blade"), - (9081200,"Occult Serpentbone Blade"), - (9900000,""), - (9910000,""), - (9911000,""), - (9920000,""), - (9930000,""), - (10000000,"Twinblade"), - (10000100,"Heavy Twinblade"), - (10000200,"Keen Twinblade"), - (10000300,"Quality Twinblade"), - (10000400,"Fire Twinblade"), - (10000500,"Flame Art Twinblade"), - (10000600,"Lightning Twinblade"), - (10000700,"Sacred Twinblade"), - (10000800,"Magic Twinblade"), - (10000900,"Cold Twinblade"), - (10001000,"Poison Twinblade"), - (10001100,"Bloody Twinblade"), - (10001200,"Occult Twinblade"), - (10010000,"Godskin Peeler"), - (10010100,"Heavy Godskin Peeler"), - (10010200,"Keen Godskin Peeler"), - (10010300,"Quality Godskin Peeler"), - (10010400,"Fire Godskin Peeler"), - (10010500,"Flame Art Godskin Peeler"), - (10010600,"Lightning Godskin Peeler"), - (10010700,"Sacred Godskin Peeler"), - (10010800,"Magic Godskin Peeler"), - (10010900,"Cold Godskin Peeler"), - (10011000,"Poison Godskin Peeler"), - (10011100,"Blood Godskin Peeler"), - (10011200,"Occult Godskin Peeler"), - (10030000,"Twinned Knight Swords"), - (10030100,"Heavy Twinned Knight Swords"), - (10030200,"Keen Twinned Knight Swords"), - (10030300,"Quality Twinned Knight Swords"), - (10030400,"Fire Twinned Knight Swords"), - (10030500,"Flame Art Twinned Knight Swords"), - (10030600,"Lightning Twinned Knight Swords"), - (10030700,"Sacred Twinned Knight Swords"), - (10030800,"Magic Twinned Knight Swords"), - (10030900,"Cold Twinned Knight Swords"), - (10031000,"Poison Twinned Knight Swords"), - (10031100,"Blood Twinned Knight Swords"), - (10031200,"Occult Twinned Knight Swords"), - (10050000,"Eleonora's Poleblade"), - (10080000,"Gargoyle's Twinblade"), - (10080100,"Gargoyle's Heavy Twinblade"), - (10080200,"Gargoyle's Keen Twinblade"), - (10080300,"Gargoyle's Quality Twinblade"), - (10080400,"Gargoyle's Fire Twinblade"), - (10080500,"Gargoyle's Flame Art Twinblade"), - (10080600,"Gargoyle's Lightning Twinblade"), - (10080700,"Gargoyle's Sacred Twinblade"), - (10080800,"Gargoyle's Magic Twinblade"), - (10080900,"Gargoyle's Cold Twinblade"), - (10081000,"Gargoyle's Poison Twinblade"), - (10081100,"Gargoyle's Blood Twinblade"), - (10081200,"Gargoyle's Occult Twinblade"), - (10090000,"Gargoyle's Black Blades"), - (11000000,"Mace"), - (11000100,"Heavy Mace"), - (11000200,"Keen Mace"), - (11000300,"Quality Mace"), - (11000400,"Fire Mace"), - (11000500,"Flame Art Mace"), - (11000600,"Lightning Mace"), - (11000700,"Sacred Mace"), - (11000800,"Magic Mace"), - (11000900,"Cold Mace"), - (11001000,"Poison Mace"), - (11001100,"Blood Mace"), - (11001200,"Occult Mace"), - (11010000,"Club"), - (11010100,"Heavy Club"), - (11010200,"Keen Club"), - (11010300,"Quality Club"), - (11010400,"Fire Club"), - (11010500,"Flame Art Club"), - (11010600,"Lightning Club"), - (11010700,"Sacred Club"), - (11010800,"Magic Club"), - (11010900,"Cold Club"), - (11011000,"Poison Club"), - (11011100,"Bloody Club"), - (11011200,"Occult Club"), - (11030000,"Curved Club"), - (11030100,"Heavy Curved Club"), - (11030200,"Keen Curved Club"), - (11030300,"Quality Curved Club"), - (11030400,"Fire Curved Club"), - (11030500,"Flame Art Curved Club"), - (11030600,"Lightning Curved Club"), - (11030700,"Sacred Curved Club"), - (11030800,"Magic Curved Club"), - (11030900,"Cold Curved Club"), - (11031000,"Poison Curved Club"), - (11031100,"Blood Curved Club"), - (11031200,"Occult Curved Club"), - (11040000,"Warpick"), - (11040100,"Heavy Warpick"), - (11040200,"Keen Warpick"), - (11040300,"Quality Warpick"), - (11040400,"Fire Warpick"), - (11040500,"Flame Art Warpick"), - (11040600,"Lightning Warpick"), - (11040700,"Sacred Warpick"), - (11040800,"Magic Warpick"), - (11040900,"Cold Warpick"), - (11041000,"Poison Warpick"), - (11041100,"Blood Warpick"), - (11041200,"Occult Warpick"), - (11050000,"Morning Star"), - (11050100,"Heavy Morning Star"), - (11050200,"Keen Morning Star"), - (11050300,"Quality Morning Star"), - (11050400,"Fire Morning Star"), - (11050500,"Flame Art Morning Star"), - (11050600,"Lightning Morning Star"), - (11050700,"Sacred Morning Star"), - (11050800,"Magic Morning Star"), - (11050900,"Cold Morning Star"), - (11051000,"Poison Morning Star"), - (11051100,"Blood Morning Star"), - (11051200,"Occult Morning Star"), - (11060000,"Varre's Bouquet"), - (11070000,"Spiked Club"), - (11070100,"Heavy Spiked Club"), - (11070200,"Keen Spiked Club"), - (11070300,"Quality Spiked Club"), - (11070400,"Fire Spiked Club"), - (11070500,"Flame Art Spiked Club"), - (11070600,"Lightning Spiked Club"), - (11070700,"Sacred Spiked Club"), - (11070800,"Magic Spiked Club"), - (11070900,"Cold Spiked Club"), - (11071000,"Poison Spiked Club"), - (11071100,"Blood Spiked Club"), - (11071200,"Occult Spiked Club"), - (11080000,"Hammer"), - (11080100,"Heavy Hammer"), - (11080200,"Keen Hammer"), - (11080300,"Quality Hammer"), - (11080400,"Fire Hammer"), - (11080500,"Flame Art Hammer"), - (11080600,"Lightning Hammer"), - (11080700,"Sacred Hammer"), - (11080800,"Magic Hammer"), - (11080900,"Cold Hammer"), - (11081000,"Poison Hammer"), - (11081100,"Blood Hammer"), - (11081200,"Occult Hammer"), - (11090000,"Monk's Flamemace"), - (11090100,"Monk's Heavy Flamemace"), - (11090200,"Monk's Keen Flamemace"), - (11090300,"Monk's Quality Flamemace"), - (11090400,"Monk's Fire Flamemace"), - (11090500,"Monk's Flame Art Flamemace"), - (11090600,"Monk's Lightning Flamemace"), - (11090700,"Monk's Sacred Flamemace"), - (11090800,"Monk's Magic Flamemace"), - (11090900,"Monk's Cold Flamemace"), - (11091000,"Monk's Poison Flamemace"), - (11091100,"Monk's Blood Flamemace"), - (11091200,"Monk's Occult Flamemace"), - (11100000,"Envoy's Horn"), - (11110000,"Scepter of the All-Knowing"), - (11120000,"Nox Flowing Hammer"), - (11130000,"Ringed Finger"), - (11140000,"Stone Club"), - (11140100,"Heavy Stone Club"), - (11140200,"Keen Stone Club"), - (11140300,"Quality Stone Club"), - (11140400,"Fire Stone Club"), - (11140500,"Flame Art Stone Club"), - (11140600,"Lightning Stone Club"), - (11140700,"Sacred Stone Club"), - (11140800,"Magic Stone Club"), - (11140900,"Cold Stone Club"), - (11141000,"Poison Stone Club"), - (11141100,"Blood Stone Club"), - (11141200,"Occult Stone Club"), - (11150000,"Marika's Hammer"), - (11170000,""), - (12000000,"Large Club"), - (12000100,"Heavy Large Club"), - (12000200,"Keen Large Club"), - (12000300,"Quality Large Club"), - (12000400,"Fire Large Club"), - (12000500,"Flame Art Large Club"), - (12000600,"Lightning Large Club"), - (12000700,"Sacred Large Club"), - (12000800,"Magic Large Club"), - (12000900,"Cold Large Club"), - (12001000,"Poison Large Club"), - (12001100,"Blood Large Club"), - (12001200,"Occult Large Club"), - (12010000,"Greathorn Hammer"), - (12010100,"Heavy Greathorn Hammer"), - (12010200,"Keen Greathorn Hammer"), - (12010300,"Quality Greathorn Hammer"), - (12010400,"Fire Greathorn Hammer"), - (12010500,"Flame Art Greathorn Hammer"), - (12010600,"Lightning Greathorn Hammer"), - (12010700,"Sacred Greathorn Hammer"), - (12010800,"Magic Greathorn Hammer"), - (12010900,"Cold Greathorn Hammer"), - (12011000,"Poison Greathorn Hammer"), - (12011100,"Blood Greathorn Hammer"), - (12011200,"Occult Greathorn Hammer"), - (12020000,"Battle Hammer"), - (12020100,"Heavy Battle Hammer"), - (12020200,"Keen Battle Hammer"), - (12020300,"Quality Battle Hammer"), - (12020400,"Fire Battle Hammer"), - (12020500,"Flame Art Battle Hammer"), - (12020600,"Lightning Battle Hammer"), - (12020700,"Sacred Battle Hammer"), - (12020800,"Magic Battle Hammer"), - (12020900,"Cold Battle Hammer"), - (12021000,"Poison Battle Hammer"), - (12021100,"Blood Battle Hammer"), - (12021200,"Occult Battle Hammer"), - (12060000,"Great Mace"), - (12060100,"Heavy Great Mace"), - (12060200,"Keen Great Mace"), - (12060300,"Quality Great Mace"), - (12060400,"Fire Great Mace"), - (12060500,"Flame Art Great Mace"), - (12060600,"Lightning Great Mace"), - (12060700,"Sacred Great Mace"), - (12060800,"Magic Great Mace"), - (12060900,"Cold Great Mace"), - (12061000,"Poison Great Mace"), - (12061100,"Blood Great Mace"), - (12061200,"Occult Great Mace"), - (12080000,"Curved Great Club"), - (12080100,"Heavy Curved Great Club"), - (12080200,"Keen Curved Great Club"), - (12080300,"Quality Curved Great Club"), - (12080400,"Fire Curved Great Club"), - (12080500,"Flame Art Curved Great Club"), - (12080600,"Lightning Curved Great Club"), - (12080700,"Sacred Curved Great Club"), - (12080800,"Magic Curved Great Club"), - (12080900,"Cold Curved Great Club"), - (12081000,"Poison Curved Great Club"), - (12081100,"Blood Curved Great Club"), - (12081200,"Occult Curved Great Club"), - (12130000,"Celebrant's Skull"), - (12130100,"Celebrant's Heavy Skull"), - (12130200,"Celebrant's Keen Skull"), - (12130300,"Celebrant's Quality Skull"), - (12130400,"Celebrant's Fire Skull"), - (12130500,"Celebrant's Flame Art Skull"), - (12130600,"Celebrant's Lightning Skull"), - (12130700,"Celebrant's Sacred Skull"), - (12130800,"Celebrant's Magic Skull"), - (12130900,"Celebrant's Cold Skull"), - (12131000,"Celebrant's Poison Skull"), - (12131100,"Celebrant's Blood Skull"), - (12131200,"Celebrant's Occult Skull"), - (12140000,"Pickaxe"), - (12140100,"Heavy Pickaxe"), - (12140200,"Keen Pickaxe"), - (12140300,"Quality Pickaxe"), - (12140400,"Fire Pickaxe"), - (12140500,"Flame Art Pickaxe"), - (12140600,"Lightning Pickaxe"), - (12140700,"Sacred Pickaxe"), - (12140800,"Magic Pickaxe"), - (12140900,"Cold Pickaxe"), - (12141000,"Poison Pickaxe"), - (12141100,"Blood Pickaxe"), - (12141200,"Occult Pickaxe"), - (12150000,"Beastclaw Greathammer"), - (12160000,"Envoy's Long Horn"), - (12170000,"Cranial Vessel Candlestand"), - (12180000,"Great Stars"), - (12180100,"Heavy Great Stars"), - (12180200,"Keen Great Stars"), - (12180300,"Quality Great Stars"), - (12180400,"Fire Great Stars"), - (12180500,"Flame Art Great Stars"), - (12180600,"Lightning Great Stars"), - (12180700,"Sacred Great Stars"), - (12180800,"Magic Great Stars"), - (12180900,"Cold Great Stars"), - (12181000,"Poison Great Stars"), - (12181100,"Blood Great Stars"), - (12181200,"Occult Great Stars"), - (12190000,"Brick Hammer"), - (12190100,"Heavy Brick Hammer"), - (12190200,"Keen Brick Hammer"), - (12190300,"Quality Brick Hammer"), - (12190400,"Fire Brick Hammer"), - (12190500,"Flame Art Brick Hammer"), - (12190600,"Lightning Brick Hammer"), - (12190700,"Sacred Brick Hammer"), - (12190800,"Magic Brick Hammer"), - (12190900,"Cold Brick Hammer"), - (12191000,"Poison Brick Hammer"), - (12191100,"Blood Brick Hammer"), - (12191200,"Occult Brick Hammer"), - (12200000,"Devourer's Scepter"), - (12210000,"Rotten Battle Hammer"), - (12210100,"Heavy Rotten Battle Hammer"), - (12210200,"Keen Rotten Battle Hammer"), - (12210300,"Quality Rotten Battle Hammer"), - (12210400,"Fire Rotten Battle Hammer"), - (12210500,"Flame Art Rotten Battle Hammer"), - (12210600,"Lightning Rotten Battle Hammer"), - (12210700,"Sacred Rotten Battle Hammer"), - (12210800,"Magic Rotten Battle Hammer"), - (12210900,"Cold Rotten Battle Hammer"), - (12211000,"Poison Rotten Battle Hammer"), - (12211100,"Blood Rotten Battle Hammer"), - (12211200,"Occult Rotten Battle Hammer"), - (12900000,""), - (12910000,""), - (13000000,"Nightrider Flail"), - (13000100,"Heavy Nightrider Flail"), - (13000200,"Keen Nightrider Flail"), - (13000300,"Quality Nightrider Flail"), - (13000400,"Fire Nightrider Flail"), - (13000500,"Flame Art Nightrider Flail"), - (13000600,"Lightning Nightrider Flail"), - (13000700,"Sacred Nightrider Flail"), - (13000800,"Magic Nightrider Flail"), - (13000900,"Cold Nightrider Flail"), - (13001000,"Poison Nightrider Flail"), - (13001100,"Blood Nightrider Flail"), - (13001200,"Occult Nightrider Flail"), - (13010000,"Flail"), - (13010100,"Heavy Flail"), - (13010200,"Keen Flail"), - (13010300,"Quality Flail"), - (13010400,"Fire Flail"), - (13010500,"Flame Art Flail"), - (13010600,"Lightning Flail"), - (13010700,"Sacred Flail"), - (13010800,"Magic Flail"), - (13010900,"Cold Flail"), - (13011000,"Poison Flail"), - (13011100,"Blood Flail"), - (13011200,"Occult Flail"), - (13020000,"Family Heads"), - (13030000,"Bastard's Stars"), - (13040000,"Chainlink Flail"), - (13040100,"Heavy Chainlink Flail"), - (13040200,"Keen Chainlink Flail"), - (13040300,"Quality Chainlink Flail"), - (13040400,"Fire Chainlink Flail"), - (13040500,"Flame Art Chainlink Flail"), - (13040600,"Lightning Chainlink Flail"), - (13040700,"Sacred Chainlink Flail"), - (13040800,"Magic Chainlink Flail"), - (13040900,"Cold Chainlink Flail"), - (13041000,"Poison Chainlink Flail"), - (13041100,"Blood Chainlink Flail"), - (13041200,"Occult Chainlink Flail"), - (14000000,"Battle Axe"), - (14000100,"Heavy Battle Axe"), - (14000200,"Keen Battle Axe"), - (14000300,"Quality Battle Axe"), - (14000400,"Fire Battle Axe"), - (14000500,"Flame Art Battle Axe"), - (14000600,"Lightning Battle Axe"), - (14000700,"Sacred Battle Axe"), - (14000800,"Magic Battle Axe"), - (14000900,"Cold Battle Axe"), - (14001000,"Poison Battle Axe"), - (14001100,"Blood Battle Axe"), - (14001200,"Occult Battle Axe"), - (14010000,"Forked Hatchet"), - (14010100,"Heavy Forked Hatchet"), - (14010200,"Keen Forked Hatchet"), - (14010300,"Quality Forked Hatchet"), - (14010400,"Fire Forked Hatchet"), - (14010500,"Flame Art Forked Hatchet"), - (14010600,"Lightning Forked Hatchet"), - (14010700,"Sacred Forked Hatchet"), - (14010800,"Magic Forked Hatchet"), - (14010900,"Cold Forked Hatchet"), - (14011000,"Poison Forked Hatchet"), - (14011100,"Blood Forked Hatchet"), - (14011200,"Occult Forked Hatchet"), - (14020000,"Hand Axe"), - (14020100,"Heavy Hand Axe"), - (14020200,"Keen Hand Axe"), - (14020300,"Quality Hand Axe"), - (14020400,"Fire Hand Axe"), - (14020500,"Flame Art Hand Axe"), - (14020600,"Lightning Hand Axe"), - (14020700,"Sacred Hand Axe"), - (14020800,"Magic Hand Axe"), - (14020900,"Cold Hand Axe"), - (14021000,"Poison Hand Axe"), - (14021100,"Blood Hand Axe"), - (14021200,"Occult Hand Axe"), - (14030000,"Jawbone Axe"), - (14030100,"Heavy Jawbone Axe"), - (14030200,"Keen Jawbone Axe"), - (14030300,"Quality Jawbone Axe"), - (14030400,"Fire Jawbone Axe"), - (14030500,"Flame Art Jawbone Axe"), - (14030600,"Lightning Jawbone Axe"), - (14030700,"Sacred Jawbone Axe"), - (14030800,"Magic Jawbone Axe"), - (14030900,"Cold Jawbone Axe"), - (14031000,"Poison Jawbone Axe"), - (14031100,"Blood Jawbone Axe"), - (14031200,"Occult Jawbone Axe"), - (14040000,"Iron Cleaver"), - (14040100,"Heavy Iron Cleaver"), - (14040200,"Keen Iron Cleaver"), - (14040300,"Quality Iron Cleaver"), - (14040400,"Fire Iron Cleaver"), - (14040500,"Flame Art Iron Cleaver"), - (14040600,"Lightning Iron Cleaver"), - (14040700,"Sacred Iron Cleaver"), - (14040800,"Magic Iron Cleaver"), - (14040900,"Cold Iron Cleaver"), - (14041000,"Poison Iron Cleaver"), - (14041100,"Blood Iron Cleaver"), - (14041200,"Occult Iron Cleaver"), - (14050000,"Ripple Blade"), - (14060000,"Celebrant's Cleaver"), - (14060100,"Celebrant's Heavy Cleaver"), - (14060200,"Celebrant's Keen Cleaver"), - (14060300,"Celebrant's Quality Cleaver"), - (14060400,"Celebrant's Fire Cleaver"), - (14060500,"Celebrant's Flame Art Cleaver Blades"), - (14060600,"Celebrant's Lightning Cleaver"), - (14060700,"Celebrant's Sacred Cleaver"), - (14060800,"Celebrant's Magic Cleaver"), - (14060900,"Celebrant's Cold Cleaver"), - (14061000,"Celebrant's Poison Cleaver"), - (14061100,"Celebrant's Blood Cleaver"), - (14061200,"Celebrant's Occult Cleaver"), - (14080000,"Icerind Hatchet"), - (14100000,"Highland Axe"), - (14100100,"Heavy Highland Axe"), - (14100200,"Keen Highland Axe"), - (14100300,"Quality Highland Axe"), - (14100400,"Fire Highland Axe"), - (14100500,"Flame Art Highland Axe"), - (14100600,"Lightning Highland Axe"), - (14100700,"Sacred Highland Axe"), - (14100800,"Magic Highland Axe"), - (14100900,"Cold Highland Axe"), - (14101000,"Poison Highland Axe"), - (14101100,"Bloody Highland Axe"), - (14101200,"Occult Highland Axe"), - (14110000,"Sacrificial Axe"), - (14110100,"Heavy Sacrificial Axe"), - (14110200,"Keen Sacrificial Axe"), - (14110300,"Quality Sacrificial Axe"), - (14110400,"Fire Sacrificial Axe"), - (14110500,"Flame Art Sacrificial Axe"), - (14110600,"Lightning Sacrificial Axe"), - (14110700,"Sacred Sacrificial Axe"), - (14110800,"Magic Sacrificial Axe"), - (14110900,"Cold Sacrificial Axe"), - (14111000,"Poison Sacrificial Axe"), - (14111100,"Blood Sacrificial Axe"), - (14111200,"Occult Sacrificial Axe"), - (14120000,"Rosus' Axe"), - (14140000,"Stormhawk Axe"), - (15000000,"Greataxe"), - (15000100,"Heavy Greataxe"), - (15000200,"Keen Greataxe"), - (15000300,"Quality Greataxe"), - (15000400,"Fire Greataxe"), - (15000500,"Flame Art Greataxe"), - (15000600,"Lightning Greataxe"), - (15000700,"Sacred Greataxe"), - (15000800,"Magic Greataxe"), - (15000900,"Cold Greataxe"), - (15001000,"Poison Greataxe"), - (15001100,"Blood Greataxe"), - (15001200,"Occult Greataxe"), - (15010000,"Warped Axe"), - (15010100,"Heavy Warped Axe"), - (15010200,"Keen Warped Axe"), - (15010300,"Quality Warped Axe"), - (15010400,"Fire Warped Axe"), - (15010500,"Flame Art Warped Axe"), - (15010600,"Lightning Warped Axe"), - (15010700,"Sacred Warped Axe"), - (15010800,"Magic Warped Axe"), - (15010900,"Cold Warped Axe"), - (15011000,"Poison Warped Axe"), - (15011100,"Blood Warped Axe"), - (15011200,"Occult Warped Axe"), - (15020000,"Great Omenkiller Cleaver"), - (15020100,"Heavy Great Omenkiller Cleaver"), - (15020200,"Keen Great Omenkiller Cleaver"), - (15020300,"Quality Great Omenkiller Cleaver"), - (15020400,"Fire Great Omenkiller Cleaver"), - (15020500,"Flame Art Great Omenkiller Cleaver"), - (15020600,"Lightning Great Omenkiller Cleaver"), - (15020700,"Sacred Great Omenkiller Cleaver"), - (15020800,"Magic Great Omenkiller Cleaver"), - (15020900,"Cold Great Omenkiller Cleaver"), - (15021000,"Poison Great Omenkiller Cleaver"), - (15021100,"Blood Great Omenkiller Cleaver"), - (15021200,"Occult Great Omenkiller Cleaver"), - (15030000,"Crescent Moon Axe"), - (15030100,"Heavy Crescent Moon Axe"), - (15030200,"Keen Crescent Moon Axe"), - (15030300,"Quality Crescent Moon Axe"), - (15030400,"Fire Crescent Moon Axe"), - (15030500,"Flame Art Crescent Moon Axe"), - (15030600,"Lightning Crescent Moon Axe"), - (15030700,"Sacred Crescent Moon Axe"), - (15030800,"Magic Crescent Moon Axe"), - (15030900,"Cold Crescent Moon Axe"), - (15031000,"Poison Crescent Moon Axe"), - (15031100,"Blood Crescent Moon Axe"), - (15031200,"Occult Crescent Moon Axe"), - (15040000,"Axe of Godrick"), - (15050000,"Longhaft Axe"), - (15050100,"Heavy Longhaft Axe"), - (15050200,"Keen Longhaft Axe"), - (15050300,"Quality Longhaft Axe"), - (15050400,"Fire Longhaft Axe"), - (15050500,"Flame Art Longhaft Axe"), - (15050600,"Lightning Longhaft Axe"), - (15050700,"Sacred Longhaft Axe"), - (15050800,"Magic Longhaft Axe"), - (15050900,"Cold Longhaft Axe"), - (15051000,"Poison Longhaft Axe"), - (15051100,"Blood Longhaft Axe"), - (15051200,"Occult Longhaft Axe"), - (15060000,"Rusted Anchor"), - (15060100,"Heavy Rusted Anchor"), - (15060200,"Keen Rusted Anchor"), - (15060300,"Quality Rusted Anchor"), - (15060400,"Fire Rusted Anchor"), - (15060500,"Flame Art Rusted Anchor"), - (15060600,"Lightning Rusted Anchor"), - (15060700,"Sacred Rusted Anchor"), - (15060800,"Magic Rusted Anchor"), - (15060900,"Cold Rusted Anchor"), - (15061000,"Poison Rusted Anchor"), - (15061100,"Blood Rusted Anchor"), - (15061200,"Occult Rusted Anchor"), - (15080000,"Executioner's Greataxe"), - (15080100,"Executioner's Heavy Greataxe"), - (15080200,"Executioner's Keen Greataxe"), - (15080300,"Executioner's Quality Greataxe"), - (15080400,"Executioner's Fire Greataxe"), - (15080500,"Executioner's Flame Art Greataxe"), - (15080600,"Executioner's Lightning Greataxe"), - (15080700,"Executioner's Sacred Greataxe"), - (15080800,"Executioner's Magic Greataxe"), - (15080900,"Executioner's Cold Greataxe"), - (15081000,"Executioner's Poison Greataxe"), - (15081100,"Executioner's Blood Greataxe"), - (15081200,"Executioner's Occult Greataxe"), - (15110000,"Winged Greathorn"), - (15120000,"Butchering Knife"), - (15120100,"Heavy Butchering Knife"), - (15120200,"Keen Butchering Knife"), - (15120300,"Quality Butchering Knife"), - (15120400,"Fire Butchering Knife"), - (15120500,"Flame Art Butchering Knife"), - (15120600,"Lightning Butchering Knife"), - (15120700,"Sacred Butchering Knife"), - (15120800,"Magic Butchering Knife"), - (15120900,"Cold Butchering Knife"), - (15121000,"Poison Butchering Knife"), - (15121100,"Blood Butchering Knife"), - (15121200,"Occult Butchering Knife"), - (15130000,"Gargoyle's Great Axe"), - (15130100,"Gargoyle's Heavy Great Axe"), - (15130200,"Gargoyle's Keen Great Axe"), - (15130300,"Gargoyle's Quality Great Axe"), - (15130400,"Gargoyle's Fire Great Axe"), - (15130500,"Gargoyle's Flame Art Great Axe"), - (15130600,"Gargoyle's Lightning Great Axe"), - (15130700,"Gargoyle's Sacred Great Axe"), - (15130800,"Gargoyle's Magic Great Axe"), - (15130900,"Gargoyle's Cold Great Axe"), - (15131000,"Gargoyle's Poison Great Axe"), - (15131100,"Gargoyle's Blood Great Axe"), - (15131200,"Gargoyle's Occult Great Axe"), - (15140000,"Gargoyle's Black Axe"), - (15900000,""), - (16000000,"Short Spear"), - (16000100,"Heavy Short Spear"), - (16000200,"Keen Short Spear"), - (16000300,"Quality Short Spear"), - (16000400,"Fire Short Spear"), - (16000500,"Flame Art Short Spear"), - (16000600,"Lightning Short Spear"), - (16000700,"Sacred Short Spear"), - (16000800,"Magic Short Spear"), - (16000900,"Cold Short Spear"), - (16001000,"Poison Short Spear"), - (16001100,"Blood Short Spear"), - (16001200,"Occult Short Spear"), - (16010000,"Spear"), - (16010100,"Heavy Spear"), - (16010200,"Keen Spear"), - (16010300,"Quality Spear"), - (16010400,"Fire Spear"), - (16010500,"Flame Art Spear"), - (16010600,"Lightning Spear"), - (16010700,"Sacred Spear"), - (16010800,"Magic Spear"), - (16010900,"Cold Spear"), - (16011000,"Poison Spear"), - (16011100,"Bloody Spear"), - (16011200,"Occult Spear"), - (16020000,"Crystal Spear"), - (16030000,"Clayman's Harpoon"), - (16030100,"Clayman's Heavy Harpoon"), - (16030200,"Clayman's Keen Harpoon"), - (16030300,"Clayman's Quality Harpoon"), - (16030400,"Clayman's Fire Harpoon"), - (16030500,"Clayman's Flame Art Harpoon"), - (16030600,"Clayman's Lightning Harpoon"), - (16030700,"Clayman's Sacred Harpoon"), - (16030800,"Clayman's Magic Harpoon"), - (16030900,"Clayman's Cold Harpoon"), - (16031000,"Clayman's Poison Harpoon"), - (16031100,"Clayman's Blood Harpoon"), - (16031200,"Clayman's Occult Harpoon"), - (16040000,"Cleanrot Spear"), - (16050000,"Partisan"), - (16050100,"Heavy Partisan"), - (16050200,"Keen Partisan"), - (16050300,"Quality Partisan"), - (16050400,"Fire Partisan"), - (16050500,"Flame Art Partisan"), - (16050600,"Lightning Partisan"), - (16050700,"Sacred Partisan"), - (16050800,"Magic Partisan"), - (16050900,"Cold Partisan"), - (16051000,"Poison Partisan"), - (16051100,"Blood Partisan"), - (16051200,"Occult Partisan"), - (16060000,"Celebrant's Rib-Rake"), - (16060100,"Celebrant's Heavy Rib-Rake"), - (16060200,"Celebrant's Keen Rib-Rake"), - (16060300,"Celebrant's Quality Rib-Rake"), - (16060400,"Celebrant's Fire Rib-Rake"), - (16060500,"Celebrant's Flame Art Rib-Rake"), - (16060600,"Celebrant's Lightning Rib-Rake"), - (16060700,"Celebrant's Sacred Rib-Rake"), - (16060800,"Celebrant's Magic Rib-Rake"), - (16060900,"Celebrant's Cold Rib-Rake"), - (16061000,"Celebrant's Poison Rib-Rake"), - (16061100,"Celebrant's Blood Rib-Rake"), - (16061200,"Celebrant's Occult Rib-Rake"), - (16070000,"Pike"), - (16070100,"Heavy Pike"), - (16070200,"Keen Pike"), - (16070300,"Quality Pike"), - (16070400,"Fire Pike"), - (16070500,"Flame Art Pike"), - (16070600,"Lightning Pike"), - (16070700,"Sacred Pike"), - (16070800,"Magic Pike"), - (16070900,"Cold Pike"), - (16071000,"Poison Pike"), - (16071100,"Blood Pike"), - (16071200,"Occult Pike"), - (16080000,"Torchpole"), - (16090000,"Bolt of Gransax"), - (16110000,"Cross-Naginata"), - (16110100,"Heavy Cross-Naginata"), - (16110200,"Keen Cross-Naginata"), - (16110300,"Quality Cross-Naginata"), - (16110400,"Fire Cross-Naginata"), - (16110500,"Flame Art Cross-Naginata"), - (16110600,"Lightning Cross-Naginata"), - (16110700,"Sacred Cross-Naginata"), - (16110800,"Magic Cross-Naginata"), - (16110900,"Cold Cross-Naginata"), - (16111000,"Poison Cross-Naginata"), - (16111100,"Blood Cross-Naginata"), - (16111200,"Occult Cross-Naginata"), - (16120000,"Death Ritual Spear"), - (16130000,"Inquisitor's Girandole"), - (16140000,"Spiked Spear"), - (16140100,"Heavy Spiked Spear"), - (16140200,"Keen Spiked Spear"), - (16140300,"Quality Spiked Spear"), - (16140400,"Fire Spiked Spear"), - (16140500,"Flame Art Spiked Spear"), - (16140600,"Lightning Spiked Spear"), - (16140700,"Sacred Spiked Spear"), - (16140800,"Magic Spiked Spear"), - (16140900,"Cold Spiked Spear"), - (16141000,"Poison Spiked Spear"), - (16141100,"Blood Spiked Spear"), - (16141200,"Occult Spiked Spear"), - (16150000,"Iron Spear"), - (16150100,"Heavy Iron Spear"), - (16150200,"Keen Iron Spear"), - (16150300,"Quality Iron Spear"), - (16150400,"Fire Iron Spear"), - (16150500,"Flame Art Iron Spear"), - (16150600,"Lightning Iron Spear"), - (16150700,"Sacred Iron Spear"), - (16150800,"Magic Iron Spear"), - (16150900,"Cold Iron Spear"), - (16151000,"Poison Iron Spear"), - (16151100,"Blood Iron Spear"), - (16151200,"Occult Iron Spear"), - (16160000,"Rotten Crystal Spear"), - (17010000,"Mohgwyn's Sacred Spear"), - (17020000,"Siluria's Tree"), - (17030000,"Serpent-Hunter"), - (17050000,"Vyke's War Spear"), - (17060000,"Lance"), - (17060100,"Heavy Lance"), - (17060200,"Keen Lance"), - (17060300,"Quality Lance"), - (17060400,"Fire Lance"), - (17060500,"Flame Art Lance"), - (17060600,"Lightning Lance"), - (17060700,"Sacred Lance"), - (17060800,"Magic Lance"), - (17060900,"Cold Lance"), - (17061000,"Poison Lance"), - (17061100,"Bloody Lance"), - (17061200,"Occult Lance"), - (17070000,"Treespear"), - (17070100,"Heavy Treespear"), - (17070200,"Keen Treespear"), - (17070300,"Quality Treespear"), - (17070400,"Fire Treespear"), - (17070500,"Flame Art Treespear"), - (17070600,"Lightning Treespear"), - (17070700,"Sacred Treespear"), - (17070800,"Magic Treespear"), - (17070900,"Cold Treespear"), - (17071000,"Poison Treespear"), - (17071100,"Blood Treespear"), - (17071200,"Occult Treespear"), - (17900000,""), - (17910000,""), - (18000000,"Halberd"), - (18000100,"Heavy Halberd"), - (18000200,"Keen Halberd"), - (18000300,"Quality Halberd"), - (18000400,"Fire Halberd"), - (18000500,"Flame Art Halberd"), - (18000600,"Lightning Halberd"), - (18000700,"Sacred Halberd"), - (18000800,"Magic Halberd"), - (18000900,"Cold Halberd"), - (18001000,"Poison Halberd"), - (18001100,"Blood Halberd"), - (18001200,"Occult Halberd"), - (18010000,"Pest's Glaive"), - (18010100,"Pest's Heavy Glaive"), - (18010200,"Pest's Keen Glaive"), - (18010300,"Pest's Quality Glaive"), - (18010400,"Pest's Fire Glaive"), - (18010500,"Pest's Flame Art Glaive"), - (18010600,"Pest's Lightning Glaive"), - (18010700,"Pest's Sacred Glaive"), - (18010800,"Pest's Magic Glaive"), - (18010900,"Pest's Cold Glaive"), - (18011000,"Pest's Poison Glaive"), - (18011100,"Pest's Blood Glaive"), - (18011200,"Pest's Occult Glaive"), - (18020000,"Lucerne"), - (18020100,"Heavy Lucerne"), - (18020200,"Keen Lucerne"), - (18020300,"Quality Lucerne"), - (18020400,"Fire Lucerne"), - (18020500,"Flame Art Lucerne"), - (18020600,"Lightning Lucerne"), - (18020700,"Sacred Lucerne"), - (18020800,"Magic Lucerne"), - (18020900,"Cold Lucerne"), - (18021000,"Poison Lucerne"), - (18021100,"Blood Lucerne"), - (18021200,"Occult Lucerne"), - (18030000,"Banished Knight's Halberd"), - (18030100,"Banished Knight's Heavy Halberd"), - (18030200,"Banished Knight's Keen Halberd"), - (18030300,"Banished Knight's Quality Halberd"), - (18030400,"Banished Knight's Fire Halberd"), - (18030500,"Banished Knight's Flame Art Halberd"), - (18030600,"Banished Knight's Lightning Halberd"), - (18030700,"Banished Knight's Sacred Halberd"), - (18030800,"Banished Knight's Magic Halberd"), - (18030900,"Banished Knight's Cold Halberd"), - (18031000,"Banished Knight's Poison Halberd"), - (18031100,"Banished Knight's Blood Halberd"), - (18031200,"Banished Knight's Occult Halberd"), - (18040000,"Commander's Standard"), - (18050000,"Nightrider Glaive"), - (18050100,"Heavy Nightrider Glaive"), - (18050200,"Keen Nightrider Glaive"), - (18050300,"Quality Nightrider Glaive"), - (18050400,"Fire Nightrider Glaive"), - (18050500,"Flame Art Nightrider Glaive"), - (18050600,"Lightning Nightrider Glaive"), - (18050700,"Sacred Nightrider Glaive"), - (18050800,"Magic Nightrider Glaive"), - (18050900,"Cold Nightrider Glaive"), - (18051000,"Poison Nightrider Glaive"), - (18051100,"Blood Nightrider Glaive"), - (18051200,"Occult Nightrider Glaive"), - (18060000,"Ripple Crescent Halberd"), - (18070000,"Vulgar Militia Saw"), - (18070100,"Heavy Vulgar Militia Saw"), - (18070200,"Keen Vulgar Militia Saw"), - (18070300,"Quality Vulgar Militia Saw"), - (18070400,"Fire Vulgar Militia Saw"), - (18070500,"Flame Art Vulgar Militia Saw"), - (18070600,"Lightning Vulgar Militia Saw"), - (18070700,"Sacred Vulgar Militia Saw"), - (18070800,"Magic Vulgar Militia Saw"), - (18070900,"Cold Vulgar Militia Saw"), - (18071000,"Poison Vulgar Militia Saw"), - (18071100,"Blood Vulgar Militia Saw"), - (18071200,"Occult Vulgar Militia Saw"), - (18080000,"Golden Halberd"), - (18090000,"Glaive"), - (18090100,"Heavy Glaive"), - (18090200,"Keen Glaive"), - (18090300,"Quality Glaive"), - (18090400,"Fire Glaive"), - (18090500,"Flame Art Glaive"), - (18090600,"Lightning Glaive"), - (18090700,"Sacred Glaive"), - (18090800,"Magic Glaive"), - (18090900,"Cold Glaive"), - (18091000,"Poison Glaive"), - (18091100,"Blood Glaive"), - (18091200,"Occult Glaive"), - (18100000,"Loretta's War Sickle"), - (18110000,"Guardian's Swordspear"), - (18110100,"Guardian's Heavy Swordspear"), - (18110200,"Guardian's Keen Swordspear"), - (18110300,"Guardian's Quality Swordspear"), - (18110400,"Guardian's Fire Swordspear"), - (18110500,"Guardian's Flame Art Swordspear"), - (18110600,"Guardian's Lightning Swordspear"), - (18110700,"Guardian's Sacred Swordspear"), - (18110800,"Guardian's Magic Swordspear"), - (18110900,"Guardian's Cold Swordspear"), - (18111000,"Guardian's Poison Swordspear"), - (18111100,"Guardian's Blood Swordspear"), - (18111200,"Guardian's Occult Swordspear"), - (18130000,"Vulgar Militia Shotel"), - (18130100,"Heavy Vulgar Militia Shotel"), - (18130200,"Keen Vulgar Militia Shotel"), - (18130300,"Quality Vulgar Militia Shotel"), - (18130400,"Fire Vulgar Militia Shotel"), - (18130500,"Flame Art Vulgar Militia Shotel"), - (18130600,"Lightning Vulgar Militia Shotel"), - (18130700,"Sacred Vulgar Militia Shotel"), - (18130800,"Magic Vulgar Militia Shotel"), - (18130900,"Cold Vulgar Militia Shotel"), - (18131000,"Poison Vulgar Militia Shotel"), - (18131100,"Blood Vulgar Militia Shotel"), - (18131200,"Occult Vulgar Militia Shotel"), - (18140000,"Dragon Halberd"), - (18150000,"Gargoyle's Halberd"), - (18150100,"Gargoyle's Heavy Halberd"), - (18150200,"Gargoyle's Keen Halberd"), - (18150300,"Gargoyle's Quality Halberd"), - (18150400,"Gargoyle's Fire Halberd"), - (18150500,"Gargoyle's Flame Art Halberd"), - (18150600,"Gargoyle's Lightning Halberd"), - (18150700,"Gargoyle's Sacred Halberd"), - (18150800,"Gargoyle's Magic Halberd"), - (18150900,"Gargoyle's Cold Halberd"), - (18151000,"Gargoyle's Poison Halberd"), - (18151100,"Gargoyle's Blood Halberd"), - (18151200,"Gargoyle's Occult Halberd"), - (18160000,"Gargoyle's Black Halberd"), - (19000000,"Scythe"), - (19000100,"Heavy Scythe"), - (19000200,"Keen Scythe"), - (19000300,"Quality Scythe"), - (19000400,"Fire Scythe"), - (19000500,"Flame Art Scythe"), - (19000600,"Lightning Scythe"), - (19000700,"Sacred Scythe"), - (19000800,"Magic Scythe"), - (19000900,"Cold Scythe"), - (19001000,"Poison Scythe"), - (19001100,"Blood Scythe"), - (19001200,"Occult Scythe"), - (19010000,"Grave Scythe"), - (19010100,"Heavy Grave Scythe"), - (19010200,"Keen Grave Scythe"), - (19010300,"Quality Grave Scythe"), - (19010400,"Fire Grave Scythe"), - (19010500,"Flame Art Grave Scythe"), - (19010600,"Lightning Grave Scythe"), - (19010700,"Sacred Grave Scythe"), - (19010800,"Magic Grave Scythe"), - (19010900,"Cold Grave Scythe"), - (19011000,"Poison Grave Scythe"), - (19011100,"Blood Grave Scythe"), - (19011200,"Occult Grave Scythe"), - (19020000,"Halo Scythe"), - (19060000,"Winged Scythe"), - (20000000,"Whip"), - (20000100,"Heavy Whip"), - (20000200,"Keen Whip"), - (20000300,"Quality Whip"), - (20000400,"Fire Whip"), - (20000500,"Flame Art Whip"), - (20000600,"Lightning Whip"), - (20000700,"Sacred Whip"), - (20000800,"Magic Whip"), - (20000900,"Cold Whip"), - (20001000,"Poison Whip"), - (20001100,"Blood Whip"), - (20001200,"Occult Whip"), - (20020000,"Thorned Whip"), - (20020100,"Heavy Thorned Whip"), - (20020200,"Keen Thorned Whip"), - (20020300,"Quality Thorned Whip"), - (20020400,"Fire Thorned Whip"), - (20020500,"Flame Art Thorned Whip"), - (20020600,"Lightning Thorned Whip"), - (20020700,"Sacred Thorned Whip"), - (20020800,"Magic Thorned Whip"), - (20020900,"Cold Thorned Whip"), - (20021000,"Poison Thorned Whip"), - (20021100,"Blood Thorned Whip"), - (20021200,"Occult Thorned Whip"), - (20030000,"Magma Whip Candlestick"), - (20050000,"Hoslow's Petal Whip"), - (20050100,"Hoslow's Heavy Petal Whip"), - (20050200,"Hoslow's Keen Petal Whip"), - (20050300,"Hoslow's Quality Petal Whip"), - (20050400,"Hoslow's Fire Petal Whip"), - (20050500,"Hoslow's Flame Art Petal Whip"), - (20050600,"Hoslow's Lightning Petal Whip"), - (20050700,"Hoslow's Sacred Petal Whip"), - (20050800,"Hoslow's Magic Petal Whip"), - (20050900,"Hoslow's Cold Petal Whip"), - (20051000,"Hoslow's Poison Petal Whip"), - (20051100,"Hoslow's Blood Petal Whip"), - (20051200,"Hoslow's Occult Petal Whip"), - (20060000,"Giant's Red Braid"), - (20070000,"Urumi"), - (20070100,"Heavy Urumi"), - (20070200,"Keen Urumi"), - (20070300,"Quality Urumi"), - (20070400,"Fire Urumi"), - (20070500,"Flame Art Urumi"), - (20070600,"Lightning Urumi"), - (20070700,"Sacred Urumi"), - (20070800,"Magic Urumi"), - (20070900,"Cold Urumi"), - (20071000,"Poison Urumi"), - (20071100,"Blood Urumi"), - (20071200,"Occult Urumi"), - (21000000,"Caestus"), - (21000100,"Heavy Caestus"), - (21000200,"Keen Caestus"), - (21000300,"Quality Caestus"), - (21000400,"Fire Caestus"), - (21000500,"Flame Art Caestus"), - (21000600,"Lightning Caestus"), - (21000700,"Sacred Caestus"), - (21000800,"Magic Caestus"), - (21000900,"Cold Caestus"), - (21001000,"Poison Caestus"), - (21001100,"Blood Caestus"), - (21001200,"Occult Caestus"), - (21010000,"Spiked Caestus"), - (21010100,"Heavy Spiked Caestus"), - (21010200,"Keen Spiked Caestus"), - (21010300,"Quality Spiked Caestus"), - (21010400,"Fire Spiked Caestus"), - (21010500,"Flame Art Spiked Caestus"), - (21010600,"Lightning Spiked Caestus"), - (21010700,"Sacred Spiked Caestus"), - (21010800,"Magic Spiked Caestus"), - (21010900,"Cold Spiked Caestus"), - (21011000,"Poison Spiked Caestus"), - (21011100,"Blood Spiked Caestus"), - (21011200,"Occult Spiked Caestus"), - (21060000,"Grafted Dragon"), - (21070000,"Iron Ball"), - (21070100,"Heavy Iron Ball"), - (21070200,"Keen Iron Ball"), - (21070300,"Quality Iron Ball"), - (21070400,"Fire Iron Ball"), - (21070500,"Flame Art Iron Ball"), - (21070600,"Lightning Iron Ball"), - (21070700,"Sacred Iron Ball"), - (21070800,"Magic Iron Ball"), - (21070900,"Cold Iron Ball"), - (21071000,"Poison Iron Ball"), - (21071100,"Blood Iron Ball"), - (21071200,"Occult Iron Ball"), - (21080000,"Star Fist"), - (21080100,"Heavy Star Fist"), - (21080200,"Keen Star Fist"), - (21080300,"Quality Star Fist"), - (21080400,"Fire Star Fist"), - (21080500,"Flame Art Star Fist"), - (21080600,"Lightning Star Fist"), - (21080700,"Sacred Star Fist"), - (21080800,"Magic Star Fist"), - (21080900,"Cold Star Fist"), - (21081000,"Poison Star Fist"), - (21081100,"Blood Star Fist"), - (21081200,"Occult Star Fist"), - (21100000,"Katar"), - (21100100,"Heavy Katar"), - (21100200,"Keen Katar"), - (21100300,"Quality Katar"), - (21100400,"Fire Katar"), - (21100500,"Flame Art Katar"), - (21100600,"Lightning Katar"), - (21100700,"Sacred Katar"), - (21100800,"Magic Katar"), - (21100900,"Cold Katar"), - (21101000,"Poison Katar"), - (21101100,"Blood Katar"), - (21101200,"Occult Katar"), - (21110000,"Clinging Bone"), - (21120000,"Veteran's Prosthesis"), - (21130000,"Cipher Pata"), - (22000000,"Hookclaws"), - (22000100,"Heavy Hookclaws"), - (22000200,"Keen Hookclaws"), - (22000300,"Quality Hookclaws"), - (22000400,"Fire Hookclaws"), - (22000500,"Flame Art Hookclaws"), - (22000600,"Lightning Hookclaws"), - (22000700,"Sacred Hookclaws"), - (22000800,"Magic Hookclaws"), - (22000900,"Cold Hookclaws"), - (22001000,"Poison Hookclaws"), - (22001100,"Blood Hookclaws"), - (22001200,"Occult Hookclaws"), - (22010000,"Venomous Fang"), - (22010100,"Heavy Venomous Fang"), - (22010200,"Keen Venomous Fang"), - (22010300,"Quality Venomous Fang"), - (22010400,"Fire Venomous Fang"), - (22010500,"Flame Art Venomous Fang"), - (22010600,"Lightning Venomous Fang"), - (22010700,"Sacred Venomous Fang"), - (22010800,"Magic Venomous Fang"), - (22010900,"Cold Venomous Fang"), - (22011000,"Poison Venomous Fang"), - (22011100,"Blood Venomous Fang"), - (22011200,"Occult Venomous Fang"), - (22020000,"Bloodhound Claws"), - (22020100,"Heavy Bloodhound Claws"), - (22020200,"Keen Bloodhound Claws"), - (22020300,"Quality Bloodhound Claws"), - (22020400,"Fire Bloodhound Claws"), - (22020500,"Flame Art Bloodhound Claws"), - (22020600,"Lightning Bloodhound Claws"), - (22020700,"Sacred Bloodhound Claws"), - (22020800,"Magic Bloodhound Claws"), - (22020900,"Cold Bloodhound Claws"), - (22021000,"Poison Bloodhound Claws"), - (22021100,"Blood Bloodhound Claws"), - (22021200,"Occult Bloodhound Claws"), - (22030000,"Raptor Talons"), - (22030100,"Heavy Raptor Talons"), - (22030200,"Keen Raptor Talons"), - (22030300,"Quality Raptor Talons"), - (22030400,"Fire Raptor Talons"), - (22030500,"Flame Art Raptor Talons"), - (22030600,"Lightning Raptor Talons"), - (22030700,"Sacred Raptor Talons"), - (22030800,"Magic Raptor Talons"), - (22030900,"Cold Raptor Talons"), - (22031000,"Poison Raptor Talons"), - (22031100,"Blood Raptor Talons"), - (22031200,"Occult Raptor Talons"), - (23000000,"Prelate's Inferno Crozier"), - (23000100,"Prelate's Heavy Inferno Crozier"), - (23000200,"Prelate's Keen Inferno Crozier"), - (23000300,"Prelate's Quality Inferno Crozier"), - (23000400,"Prelate's Fire Inferno Crozier"), - (23000500,"Prelate's Flame Art Inferno Crozier"), - (23000600,"Prelate's Lightning Inferno Crozier"), - (23000700,"Prelate's Sacred Inferno Crozier"), - (23000800,"Prelate's Magic Inferno Crozier"), - (23000900,"Prelate's Cold Inferno Crozier"), - (23001000,"Prelate's Poison Inferno Crozier"), - (23001100,"Prelate's Blood Inferno Crozier"), - (23001200,"Prelate's Occult Inferno Crozier"), - (23010000,"Watchdog's Staff"), - (23020000,"Great Club"), - (23020100,"Heavy Great Club"), - (23020200,"Keen Great Club"), - (23020300,"Quality Great Club"), - (23020400,"Fire Great Club"), - (23020500,"Flame Art Great Club"), - (23020600,"Lightning Great Club"), - (23020700,"Sacred Great Club"), - (23020800,"Magic Great Club"), - (23020900,"Cold Great Club"), - (23021000,"Poison Great Club"), - (23021100,"Blood Great Club"), - (23021200,"Occult Great Club"), - (23030000,"Envoy's Greathorn"), - (23040000,"Duelist Greataxe"), - (23040100,"Heavy Duelist Greataxe"), - (23040200,"Keen Duelist Greataxe"), - (23040300,"Quality Duelist Greataxe"), - (23040400,"Fire Duelist Greataxe"), - (23040500,"Flame Art Duelist Greataxe"), - (23040600,"Lightning Duelist Greataxe"), - (23040700,"Sacred Duelist Greataxe"), - (23040800,"Magic Duelist Greataxe"), - (23040900,"Cold Duelist Greataxe"), - (23041000,"Poison Duelist Greataxe"), - (23041100,"Blood Duelist Greataxe"), - (23041200,"Occult Duelist Greataxe"), - (23050000,"Axe of Godfrey"), - (23060000,"Dragon Greatclaw"), - (23070000,"Staff of the Avatar"), - (23080000,"Fallingstar Beast Jaw"), - (23100000,"Ghiza's Wheel"), - (23110000,"Giant-Crusher"), - (23110100,"Heavy Giant-Crusher"), - (23110200,"Keen Giant-Crusher"), - (23110300,"Quality Giant-Crusher"), - (23110400,"Fire Giant-Crusher"), - (23110500,"Flame Art Giant-Crusher"), - (23110600,"Lightning Giant-Crusher"), - (23110700,"Sacred Giant-Crusher"), - (23110800,"Magic Giant-Crusher"), - (23110900,"Cold Giant-Crusher"), - (23111000,"Poison Giant-Crusher"), - (23111100,"Blood Giant-Crusher"), - (23111200,"Occult Giant-Crusher"), - (23120000,"Golem's Halberd"), - (23120100,"Golem's Heavy Halberd"), - (23120200,"Golem's Keen Halberd"), - (23120300,"Golem's Quality Halberd"), - (23120400,"Golem's Fire Halberd"), - (23120500,"Golem's Flame Art Halberd"), - (23120600,"Golem's Lightning Halberd"), - (23120700,"Golem's Sacred Halberd"), - (23120800,"Golem's Magic Halberd"), - (23120900,"Golem's Cold Halberd"), - (23121000,"Golem's Poison Halberd"), - (23121100,"Golem's Blood Halberd"), - (23121200,"Golem's Occult Halberd"), - (23130000,"Troll's Hammer"), - (23130100,"Troll's Heavy Hammer"), - (23130200,"Troll's Keen Hammer"), - (23130300,"Troll's Quality Hammer"), - (23130400,"Troll's Fire Hammer"), - (23130500,"Troll's Flame Art Hammer"), - (23130600,"Troll's Lightning Hammer"), - (23130700,"Troll's Sacred Hammer"), - (23130800,"Troll's Magic Hammer"), - (23130900,"Troll's Cold Hammer"), - (23131000,"Troll's Poison Hammer"), - (23131100,"Troll's Blood Hammer"), - (23131200,"Troll's Occult Hammer"), - (23140000,"Rotten Staff"), - (23150000,"Rotten Greataxe"), - (23150100,"Heavy Rotten Greataxe"), - (23150200,"Keen Rotten Greataxe"), - (23150300,"Quality Rotten Greataxe"), - (23150400,"Fire Rotten Greataxe"), - (23150500,"Flame Art Rotten Greataxe"), - (23150600,"Lightning Rotten Greataxe"), - (23150700,"Sacred Rotten Greataxe"), - (23150800,"Magic Rotten Greataxe"), - (23150900,"Cold Rotten Greataxe"), - (23151000,"Poison Rotten Greataxe"), - (23151100,"Blood Rotten Greataxe"), - (23151200,"Occult Rotten Greataxe"), - (23900000,""), - (23910000,""), - (23920000,""), - (23930000,""), - (24000000,"Torch"), - (24020000,"Steel-Wire Torch"), - (24040000,"St. Trina's Torch"), - (24050000,"Ghostflame Torch"), - (24060000,"Beast-Repellent Torch"), - (24070000,"Sentry's Torch"), - (30000000,"Buckler"), - (30000100,"Heavy Buckler"), - (30000200,"Keen Buckler"), - (30000300,"Quality Buckler"), - (30000400,"Fire Buckler"), - (30000500,"Flame Art Buckler"), - (30000600,"Lightning Buckler"), - (30000700,"Sacred Buckler"), - (30000800,"Magic Buckler"), - (30000900,"Cold Buckler"), - (30001000,"Poison Buckler"), - (30001100,"Bloody Buckler"), - (30001200,"Occult Buckler"), - (30010000,"Perfumer's Shield"), - (30010100,"Perfumer's Heavy Shield"), - (30010200,"Perfumer's Keen Shield"), - (30010300,"Perfumer's Quality Shield"), - (30010400,"Perfumer's Fire Shield"), - (30010500,"Perfumer's Flame Art Shield"), - (30010600,"Perfumer's Lightning Shield"), - (30010700,"Perfumer's Sacred Shield"), - (30010800,"Perfumer's Magic Shield"), - (30010900,"Perfumer's Cold Shield"), - (30011000,"Perfumer's Poison Shield"), - (30011100,"Perfumer's Blood Shield"), - (30011200,"Perfumer's Occult Shield"), - (30020000,"Man-Serpent's Shield"), - (30020100,"Man-serpent's Heavy Shield"), - (30020200,"Man-serpent's Keen Shield"), - (30020300,"Man-serpent's Quality Shield"), - (30020400,"Man-serpent's Fire Shield"), - (30020500,"Man-serpent's Flame Art Shield"), - (30020600,"Man-serpent's Lightning Shield"), - (30020700,"Man-serpent's Sacred Shield"), - (30020800,"Man-serpent's Magic Shield"), - (30020900,"Man-serpent's Cold Shield"), - (30021000,"Man-serpent's Poison Shield"), - (30021100,"Man-serpent's Blood Shield"), - (30021200,"Man-serpent's Occult Shield"), - (30030000,"Rickety Shield"), - (30030100,"Heavy Rickety Shield"), - (30030200,"Keen Rickety Shield"), - (30030300,"Quality Rickety Shield"), - (30030400,"Fire Rickety Shield"), - (30030500,"Flame Art Rickety Shield"), - (30030600,"Lightning Rickety Shield"), - (30030700,"Sacred Rickety Shield"), - (30030800,"Magic Rickety Shield"), - (30030900,"Cold Rickety Shield"), - (30031000,"Poison Rickety Shield"), - (30031100,"Bloody Rickety Shield"), - (30031200,"Occult Rickety Shield"), - (30040000,"Pillory Shield"), - (30040100,"Heavy Pillory Shield"), - (30040200,"Keen Pillory Shield"), - (30040300,"Quality Pillory Shield"), - (30040400,"Fire Pillory Shield"), - (30040500,"Flame Art Pillory Shield"), - (30040600,"Lightning Pillory Shield"), - (30040700,"Sacred Pillory Shield"), - (30040800,"Magic Pillory Shield"), - (30040900,"Cold Pillory Shield"), - (30041000,"Poison Pillory Shield"), - (30041100,"Blood Pillory Shield"), - (30041200,"Occult Pillory Shield"), - (30060000,"Beastman's Jar-Shield"), - (30060100,"Beastman's Heavy Jar-Shield"), - (30060200,"Beastman's Keen Jar-Shield"), - (30060300,"Beastman's Quality Jar-Shield"), - (30060400,"Beastman's Fire Jar-Shield"), - (30060500,"Beastman's Flame Art Jar-Shield"), - (30060600,"Beastman's Lightning Jar-Shield"), - (30060700,"Beastman's Sacred Jar-Shield"), - (30060800,"Beastman's Magic Jar-Shield"), - (30060900,"Beastman's Cold Jar-Shield"), - (30061000,"Beastman's Poison Jar-Shield"), - (30061100,"Beastman's Blood Jar-Shield"), - (30061200,"Beastman's Occult Jar-Shield"), - (30070000,"Red Thorn Roundshield"), - (30070100,"Heavy Red Thorn Roundshield"), - (30070200,"Keen Red Thorn Roundshield"), - (30070300,"Quality Red Thorn Roundshield"), - (30070400,"Fire Red Thorn Roundshield"), - (30070500,"Flame Art Red Thorn Roundshield"), - (30070600,"Lightning Red Thorn Roundshield"), - (30070700,"Sacred Red Thorn Roundshield"), - (30070800,"Magic Red Thorn Roundshield"), - (30070900,"Cold Red Thorn Roundshield"), - (30071000,"Poison Red Thorn Roundshield"), - (30071100,"Bloody Red Thorn Roundshield"), - (30071200,"Occult Red Thorn Roundshield"), - (30080000,"Scripture Wooden Shield"), - (30080100,"Heavy Scripture Wooden Shield"), - (30080200,"Keen Scripture Wooden Shield"), - (30080300,"Quality Scripture Wooden Shield"), - (30080400,"Fire Scripture Wooden Shield"), - (30080500,"Flame Art Scripture Wooden Shield"), - (30080600,"Lightning Scripture Wooden Shield"), - (30080700,"Sacred Scripture Wooden Shield"), - (30080800,"Magic Scripture Wooden Shield"), - (30080900,"Cold Scripture Wooden Shield"), - (30081000,"Poison Scripture Wooden Shield"), - (30081100,"Blood Scripture Wooden Shield"), - (30081200,"Occult Scripture Wooden Shield"), - (30090000,"Riveted Wooden Shield"), - (30090100,"Heavy Riveted Wooden Shield"), - (30090200,"Keen Riveted Wooden Shield"), - (30090300,"Quality Riveted Wooden Shield"), - (30090400,"Fire Riveted Wooden Shield"), - (30090500,"Flame Art Riveted Wooden Shield"), - (30090600,"Lightning Riveted Wooden Shield"), - (30090700,"Sacred Riveted Wooden Shield"), - (30090800,"Magic Riveted Wooden Shield"), - (30090900,"Cold Riveted Wooden Shield"), - (30091000,"Poison Riveted Wooden Shield"), - (30091100,"Blood Riveted Wooden Shield"), - (30091200,"Occult Riveted Wooden Shield"), - (30100000,"Blue-White Wooden Shield"), - (30100100,"Heavy Blue-White Wooden Shield"), - (30100200,"Keen Blue-White Wooden Shield"), - (30100300,"Quality Blue-White Wooden Shield"), - (30100400,"Fire Blue-White Wooden Shield"), - (30100500,"Flame Art Blue-White Wooden Shield"), - (30100600,"Lightning Blue-White Wooden Shield"), - (30100700,"Sacred Blue-White Wooden Shield"), - (30100800,"Magic Blue-White Wooden Shield"), - (30100900,"Cold Blue-White Wooden Shield"), - (30101000,"Poison Blue-White Wooden Shield"), - (30101100,"Blood Blue-White Wooden Shield"), - (30101200,"Occult Blue-White Wooden Shield"), - (30110000,"Rift Shield"), - (30110100,"Heavy Rift Shield"), - (30110200,"Keen Rift Shield"), - (30110300,"Quality Rift Shield"), - (30110400,"Fire Rift Shield"), - (30110500,"Flame Art Rift Shield"), - (30110600,"Lightning Rift Shield"), - (30110700,"Sacred Rift Shield"), - (30110800,"Magic Rift Shield"), - (30110900,"Cold Rift Shield"), - (30111000,"Poison Rift Shield"), - (30111100,"Blood Rift Shield"), - (30111200,"Occult Rift Shield"), - (30120000,"Iron Roundshield"), - (30120100,"Heavy Iron Roundshield"), - (30120200,"Keen Iron Roundshield"), - (30120300,"Quality Iron Roundshield"), - (30120400,"Fire Iron Roundshield"), - (30120500,"Flame Art Iron Roundshield"), - (30120600,"Lightning Iron Roundshield"), - (30120700,"Sacred Iron Roundshield"), - (30120800,"Magic Iron Roundshield"), - (30120900,"Cold Iron Roundshield"), - (30121000,"Poison Iron Roundshield"), - (30121100,"Bloody Iron Roundshield"), - (30121200,"Occult Iron Roundshield"), - (30130000,"Gilded Iron Shield"), - (30130100,"Gilded Heavy Iron Shield"), - (30130200,"Gilded Keen Iron Shield"), - (30130300,"Gilded Quality Iron Shield"), - (30130400,"Gilded Fire Iron Shield"), - (30130500,"Gilded Flame Art Iron Shield"), - (30130600,"Gilded Lightning Iron Shield"), - (30130700,"Gilded Sacred Iron Shield"), - (30130800,"Gilded Magic Iron Shield"), - (30130900,"Gilded Cold Iron Shield"), - (30131000,"Gilded Poison Iron Shield"), - (30131100,"Gilded Blood Iron Shield"), - (30131200,"Gilded Occult Iron Shield"), - (30140000,"Ice Crest Shield"), - (30140100,"Heavy Ice Crest Shield"), - (30140200,"Keen Ice Crest Shield"), - (30140300,"Quality Ice Crest Shield"), - (30140400,"Fire Ice Crest Shield"), - (30140500,"Flame Art Ice Crest Shield"), - (30140600,"Lightning Ice Crest Shield"), - (30140700,"Sacred Ice Crest Shield"), - (30140800,"Magic Ice Crest Shield"), - (30140900,"Cold Ice Crest Shield"), - (30141000,"Poison Ice Crest Shield"), - (30141100,"Blood Ice Crest Shield"), - (30141200,"Occult Ice Crest Shield"), - (30150000,"Smoldering Shield"), - (30190000,"Spiralhorn Shield"), - (30190100,"Heavy Spiralhorn Shield"), - (30190200,"Keen Spiralhorn Shield"), - (30190300,"Quality Spiralhorn Shield"), - (30190400,"Fire Spiralhorn Shield"), - (30190500,"Flame Art Spiralhorn Shield"), - (30190600,"Lightning Spiralhorn Shield"), - (30190700,"Sacred Spiralhorn Shield"), - (30190800,"Magic Spiralhorn Shield"), - (30190900,"Cold Spiralhorn Shield"), - (30191000,"Poison Spiralhorn Shield"), - (30191100,"Blood Spiralhorn Shield"), - (30191200,"Occult Spiralhorn Shield"), - (30200000,"Coil Shield"), - (31000000,"Kite Shield"), - (31000100,"Heavy Kite Shield"), - (31000200,"Keen Kite Shield"), - (31000300,"Quality Kite Shield"), - (31000400,"Fire Kite Shield"), - (31000500,"Flame Art Kite Shield"), - (31000600,"Lightning Kite Shield"), - (31000700,"Sacred Kite Shield"), - (31000800,"Magic Kite Shield"), - (31000900,"Cold Kite Shield"), - (31001000,"Poison Kite Shield"), - (31001100,"Blood Kite Shield"), - (31001200,"Occult Kite Shield"), - (31010000,"Marred Leather Shield"), - (31010100,"Marred Heavy Leather Shield"), - (31010200,"Marred Keen Leather Shield"), - (31010300,"Marred Quality Leather Shield"), - (31010400,"Marred Fire Leather Shield"), - (31010500,"Marred Flame Art Leather Shield"), - (31010600,"Marred Lightning Leather Shield"), - (31010700,"Marred Sacred Leather Shield"), - (31010800,"Marred Magic Leather Shield"), - (31010900,"Marred Cold Leather Shield"), - (31011000,"Marred Poison Leather Shield"), - (31011100,"Marred Blood Leather Shield"), - (31011200,"Marred Occult Leather Shield"), - (31020000,"Marred Wooden Shield"), - (31020100,"Marred Heavy Wooden Shield"), - (31020200,"Marred Keen Wooden Shield"), - (31020300,"Marred Quality Wooden Shield"), - (31020400,"Marred Fire Wooden Shield"), - (31020500,"Marred Flame Art Wooden Shield"), - (31020600,"Marred Lightning Wooden Shield"), - (31020700,"Marred Sacred Wooden Shield"), - (31020800,"Marred Magic Wooden Shield"), - (31020900,"Marred Cold Wooden Shield"), - (31021000,"Marred Poison Wooden Shield"), - (31021100,"Marred Blood Wooden Shield"), - (31021200,"Marred Occult Wooden Shield"), - (31030000,"Banished Knight's Shield"), - (31030100,"Banished Knight's Heavy Shield"), - (31030200,"Banished Knight's Keen Shield"), - (31030300,"Banished Knight's Quality Shield"), - (31030400,"Banished Knight's Fire Shield"), - (31030500,"Banished Knight's Flame Art Shield"), - (31030600,"Banished Knight's Lightning Shield"), - (31030700,"Banished Knight's Sacred Shield"), - (31030800,"Banished Knight's Magic Shield"), - (31030900,"Banished Knight's Cold Shield"), - (31031000,"Banished Knight's Poison Shield"), - (31031100,"Banished Knight's Blood Shield"), - (31031200,"Banished Knight's Occult Shield"), - (31040000,"Albinauric Shield"), - (31040100,"Heavy Albinauric Shield"), - (31040200,"Keen Albinauric Shield"), - (31040300,"Quality Albinauric Shield"), - (31040400,"Fire Albinauric Shield"), - (31040500,"Flame Art Albinauric Shield"), - (31040600,"Lightning Albinauric Shield"), - (31040700,"Sacred Albinauric Shield"), - (31040800,"Magic Albinauric Shield"), - (31040900,"Cold Albinauric Shield"), - (31041000,"Poison Albinauric Shield"), - (31041100,"Blood Albinauric Shield"), - (31041200,"Occult Albinauric Shield"), - (31050000,"Sun Realm Shield"), - (31050100,"Heavy Sun Realm Shield"), - (31050200,"Keen Sun Realm Shield"), - (31050300,"Quality Sun Realm Shield"), - (31050400,"Fire Sun Realm Shield"), - (31050500,"Flame Art Sun Realm Shield"), - (31050600,"Lightning Sun Realm Shield"), - (31050700,"Sacred Sun Realm Shield"), - (31050800,"Magic Sun Realm Shield"), - (31050900,"Cold Sun Realm Shield"), - (31051000,"Poison Sun Realm Shield"), - (31051100,"Blood Sun Realm Shield"), - (31051200,"Occult Sun Realm Shield"), - (31060000,"Silver Mirrorshield"), - (31070000,"Round Shield"), - (31070100,"Heavy Round Shield"), - (31070200,"Keen Round Shield"), - (31070300,"Quality Round Shield"), - (31070400,"Fire Round Shield"), - (31070500,"Flame Art Round Shield"), - (31070600,"Lightning Round Shield"), - (31070700,"Sacred Round Shield"), - (31070800,"Magic Round Shield"), - (31070900,"Cold Round Shield"), - (31071000,"Poison Round Shield"), - (31071100,"Blood Round Shield"), - (31071200,"Occult Round Shield"), - (31080000,"Scorpion Kite Shield"), - (31080100,"Heavy Scorpion Kite Shield"), - (31080200,"Keen Scorpion Kite Shield"), - (31080300,"Quality Scorpion Kite Shield"), - (31080400,"Fire Scorpion Kite Shield"), - (31080500,"Flame Art Scorpion Kite Shield"), - (31080600,"Lightning Scorpion Kite Shield"), - (31080700,"Sacred Scorpion Kite Shield"), - (31080800,"Magic Scorpion Kite Shield"), - (31080900,"Cold Scorpion Kite Shield"), - (31081000,"Poison Scorpion Kite Shield"), - (31081100,"Blood Scorpion Kite Shield"), - (31081200,"Occult Scorpion Kite Shield"), - (31090000,"Twinbird Kite Shield"), - (31090100,"Heavy Twinbird Kite Shield"), - (31090200,"Keen Twinbird Kite Shield"), - (31090300,"Quality Twinbird Kite Shield"), - (31090400,"Fire Twinbird Kite Shield"), - (31090500,"Flame Art Twinbird Kite Shield"), - (31090600,"Lightning Twinbird Kite Shield"), - (31090700,"Sacred Twinbird Kite Shield"), - (31090800,"Magic Twinbird Kite Shield"), - (31090900,"Cold Twinbird Kite Shield"), - (31091000,"Poison Twinbird Kite Shield"), - (31091100,"Blood Twinbird Kite Shield"), - (31091200,"Occult Twinbird Kite Shield"), - (31100000,"Blue-Gold Kite Shield"), - (31100100,"Heavy Blue-Gold Kite Shield"), - (31100200,"Keen Blue-Gold Kite Shield"), - (31100300,"Quality Blue-Gold Kite Shield"), - (31100400,"Fire Blue-Gold Kite Shield"), - (31100500,"Flame Art Blue-Gold Kite Shield"), - (31100600,"Lightning Blue-Gold Kite Shield"), - (31100700,"Sacred Blue-Gold Kite Shield"), - (31100800,"Magic Blue-Gold Kite Shield"), - (31100900,"Cold Blue-Gold Kite Shield"), - (31101000,"Poison Blue-Gold Kite Shield"), - (31101100,"Blood Blue-Gold Kite Shield"), - (31101200,"Occult Blue-Gold Kite Shield"), - (31130000,"Brass Shield"), - (31130100,"Heavy Brass Shield"), - (31130200,"Keen Brass Shield"), - (31130300,"Quality Brass Shield"), - (31130400,"Fire Brass Shield"), - (31130500,"Flame Art Brass Shield"), - (31130600,"Lightning Brass Shield"), - (31130700,"Sacred Brass Shield"), - (31130800,"Magic Brass Shield"), - (31130900,"Cold Brass Shield"), - (31131000,"Poison Brass Shield"), - (31131100,"Blood Brass Shield"), - (31131200,"Occult Brass Shield"), - (31140000,"Great Turtle Shell"), - (31140100,"Heavy Great Turtle Shell"), - (31140200,"Keen Great Turtle Shell"), - (31140300,"Quality Great Turtle Shell"), - (31140400,"Fire Great Turtle Shell"), - (31140500,"Flame Art Great Turtle Shell"), - (31140600,"Lightning Great Turtle Shell"), - (31140700,"Sacred Great Turtle Shell"), - (31140800,"Magic Great Turtle Shell"), - (31140900,"Cold Great Turtle Shell"), - (31141000,"Poison Great Turtle Shell"), - (31141100,"Blood Great Turtle Shell"), - (31141200,"Occult Great Turtle Shell"), - (31170000,"Shield of the Guilty"), - (31170100,"Heavy Shield of the Guilty"), - (31170200,"Keen Shield of the Guilty"), - (31170300,"Quality Shield of the Guilty"), - (31170400,"Fire Shield of the Guilty"), - (31170500,"Flame Art Shield of the Guilty"), - (31170600,"Lightning Shield of the Guilty"), - (31170700,"Sacred Shield of the Guilty"), - (31170800,"Magic Shield of the Guilty"), - (31170900,"Cold Shield of the Guilty"), - (31171000,"Poison Shield of the Guilty"), - (31171100,"Blood Shield of the Guilty"), - (31171200,"Occult Shield of the Guilty"), - (31190000,"Carian Knight's Shield"), - (31190100,"Carian Knight's Heavy Shield"), - (31190200,"Carian Knight's Keen Shield"), - (31190300,"Carian Knight's Quality Shield"), - (31190400,"Carian Knight's Fire Shield"), - (31190500,"Carian Knight's Flame Art Shield"), - (31190600,"Carian Knight's Lightning Shield"), - (31190700,"Carian Knight's Sacred Shield"), - (31190800,"Carian Knight's Magic Shield"), - (31190900,"Carian Knight's Cold Shield"), - (31191000,"Carian Knight's Poison Shield"), - (31191100,"Carian Knight's Bloody Shield"), - (31191200,"Carian Knight's Occult Shield"), - (31230000,"Large Leather Shield"), - (31230100,"Heavy Large Leather Shield"), - (31230200,"Keen Large Leather Shield"), - (31230300,"Quality Large Leather Shield"), - (31230400,"Fire Large Leather Shield"), - (31230500,"Flame Art Large Leather Shield"), - (31230600,"Lightning Large Leather Shield"), - (31230700,"Sacred Large Leather Shield"), - (31230800,"Magic Large Leather Shield"), - (31230900,"Cold Large Leather Shield"), - (31231000,"Poison Large Leather Shield"), - (31231100,"Bloody Large Leather Shield"), - (31231200,"Occult Large Leather Shield"), - (31240000,"Horse Crest Wooden Shield"), - (31240100,"Heavy Horse Crest Wooden Shield"), - (31240200,"Keen Horse Crest Wooden Shield"), - (31240300,"Quality Horse Crest Wooden Shield"), - (31240400,"Fire Horse Crest Wooden Shield"), - (31240500,"Flame Art Horse Crest Wooden Shield"), - (31240600,"Lightning Horse Crest Wooden Shield"), - (31240700,"Sacred Horse Crest Wooden Shield"), - (31240800,"Magic Horse Crest Wooden Shield"), - (31240900,"Cold Horse Crest Wooden Shield"), - (31241000,"Poison Horse Crest Wooden Shield"), - (31241100,"Blood Horse Crest Wooden Shield"), - (31241200,"Occult Horse Crest Wooden Shield"), - (31250000,"Candletree Wooden Shield"), - (31250100,"Heavy Candletree Wooden Shield"), - (31250200,"Keen Candletree Wooden Shield"), - (31250300,"Quality Candletree Wooden Shield"), - (31250400,"Fire Candletree Wooden Shield"), - (31250500,"Flame Art Candletree Wooden Shield"), - (31250600,"Lightning Candletree Wooden Shield"), - (31250700,"Sacred Candletree Wooden Shield"), - (31250800,"Magic Candletree Wooden Shield"), - (31250900,"Cold Candletree Wooden Shield"), - (31251000,"Poison Candletree Wooden Shield"), - (31251100,"Blood Candletree Wooden Shield"), - (31251200,"Occult Candletree Wooden Shield"), - (31260000,"Flame Crest Wooden Shield"), - (31260100,"Heavy Flame Crest Wooden Shield"), - (31260200,"Keen Flame Crest Wooden Shield"), - (31260300,"Quality Flame Crest Wooden Shield"), - (31260400,"Fire Flame Crest Wooden Shield"), - (31260500,"Flame Art Flame Crest Wooden Shield"), - (31260600,"Lightning Flame Crest Wooden Shield"), - (31260700,"Sacred Flame Crest Wooden Shield"), - (31260800,"Magic Flame Crest Wooden Shield"), - (31260900,"Cold Flame Crest Wooden Shield"), - (31261000,"Poison Flame Crest Wooden Shield"), - (31261100,"Blood Flame Crest Wooden Shield"), - (31261200,"Occult Flame Crest Wooden Shield"), - (31270000,"Hawk Crest Wooden Shield"), - (31270100,"Heavy Hawk Crest Wooden Shield"), - (31270200,"Keen Hawk Crest Wooden Shield"), - (31270300,"Quality Hawk Crest Wooden Shield"), - (31270400,"Fire Hawk Crest Wooden Shield"), - (31270500,"Flame Art Hawk Crest Wooden Shield"), - (31270600,"Lightning Hawk Crest Wooden Shield"), - (31270700,"Sacred Hawk Crest Wooden Shield"), - (31270800,"Magic Hawk Crest Wooden Shield"), - (31270900,"Cold Hawk Crest Wooden Shield"), - (31271000,"Poison Hawk Crest Wooden Shield"), - (31271100,"Blood Hawk Crest Wooden Shield"), - (31271200,"Occult Hawk Crest Wooden Shield"), - (31280000,"Beast Crest Heater Shield"), - (31280100,"Heavy Beast Crest Heater Shield"), - (31280200,"Keen Beast Crest Heater Shield"), - (31280300,"Quality Beast Crest Heater Shield"), - (31280400,"Fire Beast Crest Heater Shield"), - (31280500,"Flame Art Beast Crest Heater Shield"), - (31280600,"Lightning Beast Crest Heater Shield"), - (31280700,"Sacred Beast Crest Heater Shield"), - (31280800,"Magic Beast Crest Heater Shield"), - (31280900,"Cold Beast Crest Heater Shield"), - (31281000,"Poison Beast Crest Heater Shield"), - (31281100,"Blood Beast Crest Heater Shield"), - (31281200,"Occult Beast Crest Heater Shield"), - (31290000,"Red Crest Heater Shield"), - (31290100,"Heavy Red Crest Heater Shield"), - (31290200,"Keen Red Crest Heater Shield"), - (31290300,"Quality Red Crest Heater Shield"), - (31290400,"Fire Red Crest Heater Shield"), - (31290500,"Flame Art Red Crest Heater Shield"), - (31290600,"Lightning Red Crest Heater Shield"), - (31290700,"Sacred Red Crest Heater Shield"), - (31290800,"Magic Red Crest Heater Shield"), - (31290900,"Cold Red Crest Heater Shield"), - (31291000,"Poison Red Crest Heater Shield"), - (31291100,"Blood Red Crest Heater Shield"), - (31291200,"Occult Red Crest Heater Shield"), - (31300000,"Blue Crest Heater Shield"), - (31300100,"Heavy Blue Crest Heater Shield"), - (31300200,"Keen Blue Crest Heater Shield"), - (31300300,"Quality Blue Crest Heater Shield"), - (31300400,"Fire Blue Crest Heater Shield"), - (31300500,"Flame Art Blue Crest Heater Shield"), - (31300600,"Lightning Blue Crest Heater Shield"), - (31300700,"Sacred Blue Crest Heater Shield"), - (31300800,"Magic Blue Crest Heater Shield"), - (31300900,"Cold Blue Crest Heater Shield"), - (31301000,"Poison Blue Crest Heater Shield"), - (31301100,"Blood Blue Crest Heater Shield"), - (31301200,"Occult Blue Crest Heater Shield"), - (31310000,"Eclipse Crest Heater Shield"), - (31310100,"Heavy Eclipse Crest Heater Shield"), - (31310200,"Keen Eclipse Crest Heater Shield"), - (31310300,"Quality Eclipse Crest Heater Shield"), - (31310400,"Fire Eclipse Crest Heater Shield"), - (31310500,"Flame Art Eclipse Crest Heater Shield"), - (31310600,"Lightning Eclipse Crest Heater Shield"), - (31310700,"Sacred Eclipse Crest Heater Shield"), - (31310800,"Magic Eclipse Crest Heater Shield"), - (31310900,"Cold Eclipse Crest Heater Shield"), - (31311000,"Poison Eclipse Crest Heater Shield"), - (31311100,"Blood Eclipse Crest Heater Shield"), - (31311200,"Occult Eclipse Crest Heater Shield"), - (31320000,"Inverted Hawk Heater Shield"), - (31320100,"Heavy Inverted Hawk Heater Shield"), - (31320200,"Keen Inverted Hawk Heater Shield"), - (31320300,"Quality Inverted Hawk Heater Shield"), - (31320400,"Fire Inverted Hawk Heater Shield"), - (31320500,"Flame Art Inverted Hawk Heater Shield"), - (31320600,"Lightning Inverted Hawk Heater Shield"), - (31320700,"Sacred Inverted Hawk Heater Shield"), - (31320800,"Magic Inverted Hawk Heater Shield"), - (31320900,"Cold Inverted Hawk Heater Shield"), - (31321000,"Poison Inverted Hawk Heater Shield"), - (31321100,"Blood Inverted Hawk Heater Shield"), - (31321200,"Occult Inverted Hawk Heater Shield"), - (31330000,"Heater Shield"), - (31330100,"Heavy Heater Shield"), - (31330200,"Keen Heater Shield"), - (31330300,"Quality Heater Shield"), - (31330400,"Fire Heater Shield"), - (31330500,"Flame Art Heater Shield"), - (31330600,"Lightning Heater Shield"), - (31330700,"Sacred Heater Shield"), - (31330800,"Magic Heater Shield"), - (31330900,"Cold Heater Shield"), - (31331000,"Poison Heater Shield"), - (31331100,"Blood Heater Shield"), - (31331200,"Occult Heater Shield"), - (31340000,"Black Leather Shield"), - (31340100,"Heavy Black Leather Shield"), - (31340200,"Keen Black Leather Shield"), - (31340300,"Quality Black Leather Shield"), - (31340400,"Fire Black Leather Shield"), - (31340500,"Flame Art Black Leather Shield"), - (31340600,"Lightning Black Leather Shield"), - (31340700,"Sacred Black Leather Shield"), - (31340800,"Magic Black Leather Shield"), - (31340900,"Cold Black Leather Shield"), - (31341000,"Poison Black Leather Shield"), - (31341100,"Blood Black Leather Shield"), - (31341200,"Occult Black Leather Shield"), - (32000000,"Dragon Towershield"), - (32000100,"Heavy Dragon Towershield"), - (32000200,"Keen Dragon Towershield"), - (32000300,"Quality Dragon Towershield"), - (32000400,"Fire Dragon Towershield"), - (32000500,"Flame Art Dragon Towershield"), - (32000600,"Lightning Dragon Towershield"), - (32000700,"Sacred Dragon Towershield"), - (32000800,"Magic Dragon Towershield"), - (32000900,"Cold Dragon Towershield"), - (32001000,"Poison Dragon Towershield"), - (32001100,"Blood Dragon Towershield"), - (32001200,"Occult Dragon Towershield"), - (32020000,"Distinguished Greatshield"), - (32020100,"Distinguished Heavy Greatshield"), - (32020200,"Distinguished Keen Greatshield"), - (32020300,"Distinguished Quality Greatshield"), - (32020400,"Distinguished Fire Greatshield"), - (32020500,"Distinguished Flame Art Greatshield"), - (32020600,"Distinguished Lightning Greatshield"), - (32020700,"Distinguished Sacred Greatshield"), - (32020800,"Distinguished Magic Greatshield"), - (32020900,"Distinguished Cold Greatshield"), - (32021000,"Distinguished Poison Greatshield"), - (32021100,"Distinguished Blood Greatshield"), - (32021200,"Distinguished Occult Greatshield"), - (32030000,"Crucible Hornshield"), - (32040000,"Dragonclaw Shield"), - (32050000,"Briar Greatshield"), - (32050100,"Heavy Briar Greatshield"), - (32050200,"Keen Briar Greatshield"), - (32050300,"Quality Briar Greatshield"), - (32050400,"Fire Briar Greatshield"), - (32050500,"Flame Art Briar Greatshield"), - (32050600,"Lightning Briar Greatshield"), - (32050700,"Sacred Briar Greatshield"), - (32050800,"Magic Briar Greatshield"), - (32050900,"Cold Briar Greatshield"), - (32051000,"Poison Briar Greatshield"), - (32051100,"Blood Briar Greatshield"), - (32051200,"Occult Briar Greatshield"), - (32080000,"Erdtree Greatshield"), - (32090000,"Golden Beast Crest Shield"), - (32090100,"Heavy Golden Beast Crest Shield"), - (32090200,"Keen Golden Beast Crest Shield"), - (32090300,"Quality Golden Beast Crest Shield"), - (32090400,"Fire Golden Beast Crest Shield"), - (32090500,"Flame Art Golden Beast Crest Shield"), - (32090600,"Lightning Golden Beast Crest Shield"), - (32090700,"Sacred Golden Beast Crest Shield"), - (32090800,"Magic Golden Beast Crest Shield"), - (32090900,"Cold Golden Beast Crest Shield"), - (32091000,"Poison Golden Beast Crest Shield"), - (32091100,"Blood Golden Beast Crest Shield"), - (32091200,"Occult Golden Beast Crest Shield"), - (32120000,"Jellyfish Shield"), - (32130000,"Fingerprint Stone Shield"), - (32130100,"Heavy Fingerprint Stone Shield"), - (32130200,"Keen Fingerprint Stone Shield"), - (32130300,"Quality Fingerprint Stone Shield"), - (32130400,"Fire Fingerprint Stone Shield"), - (32130500,"Flame Art Fingerprint Stone Shield"), - (32130600,"Lightning Fingerprint Stone Shield"), - (32130700,"Sacred Fingerprint Stone Shield"), - (32130800,"Magic Fingerprint Stone Shield"), - (32130900,"Cold Fingerprint Stone Shield"), - (32131000,"Poison Fingerprint Stone Shield"), - (32131100,"Blood Fingerprint Stone Shield"), - (32131200,"Occult Fingerprint Stone Shield"), - (32140000,"Icon Shield"), - (32150000,"One-Eyed Shield"), - (32160000,"Visage Shield"), - (32170000,"Spiked Palisade Shield"), - (32170100,"Heavy Spiked Palisade Shield"), - (32170200,"Keen Spiked Palisade Shield"), - (32170300,"Quality Spiked Palisade Shield"), - (32170400,"Fire Spiked Palisade Shield"), - (32170500,"Flame Art Spiked Palisade Shield"), - (32170600,"Lightning Spiked Palisade Shield"), - (32170700,"Sacred Spiked Palisade Shield"), - (32170800,"Magic Spiked Palisade Shield"), - (32170900,"Cold Spiked Palisade Shield"), - (32171000,"Poison Spiked Palisade Shield"), - (32171100,"Blood Spiked Palisade Shield"), - (32171200,"Occult Spiked Palisade Shield"), - (32190000,"Manor Towershield"), - (32190100,"Heavy Manor Towershield"), - (32190200,"Keen Manor Towershield"), - (32190300,"Quality Manor Towershield"), - (32190400,"Fire Manor Towershield"), - (32190500,"Flame Art Manor Towershield"), - (32190600,"Lightning Manor Towershield"), - (32190700,"Sacred Manor Towershield"), - (32190800,"Magic Manor Towershield"), - (32190900,"Cold Manor Towershield"), - (32191000,"Poison Manor Towershield"), - (32191100,"Blood Manor Towershield"), - (32191200,"Occult Manor Towershield"), - (32200000,"Crossed-Tree Towershield"), - (32200100,"Heavy Crossed-Tree Towershield"), - (32200200,"Keen Crossed-Tree Towershield"), - (32200300,"Quality Crossed-Tree Towershield"), - (32200400,"Fire Crossed-Tree Towershield"), - (32200500,"Flame Art Crossed-Tree Towershield"), - (32200600,"Lightning Crossed-Tree Towershield"), - (32200700,"Sacred Crossed-Tree Towershield"), - (32200800,"Magic Crossed-Tree Towershield"), - (32200900,"Cold Crossed-Tree Towershield"), - (32201000,"Poison Crossed-Tree Towershield"), - (32201100,"Blood Crossed-Tree Towershield"), - (32201200,"Occult Crossed-Tree Towershield"), - (32210000,"Inverted Hawk Towershield"), - (32210100,"Heavy Inverted Hawk Towershield"), - (32210200,"Keen Inverted Hawk Towershield"), - (32210300,"Quality Inverted Hawk Towershield"), - (32210400,"Fire Inverted Hawk Towershield"), - (32210500,"Flame Art Inverted Hawk Towershield"), - (32210600,"Lightning Inverted Hawk Towershield"), - (32210700,"Sacred Inverted Hawk Towershield"), - (32210800,"Magic Inverted Hawk Towershield"), - (32210900,"Cold Inverted Hawk Towershield"), - (32211000,"Poison Inverted Hawk Towershield"), - (32211100,"Blood Inverted Hawk Towershield"), - (32211200,"Occult Inverted Hawk Towershield"), - (32220000,"Ant's Skull Plate"), - (32230000,"Redmane Greatshield"), - (32230100,"Heavy Redmane Greatshield"), - (32230200,"Keen Redmane Greatshield"), - (32230300,"Quality Redmane Greatshield"), - (32230400,"Fire Redmane Greatshield"), - (32230500,"Flame Art Redmane Greatshield"), - (32230600,"Lightning Redmane Greatshield"), - (32230700,"Sacred Redmane Greatshield"), - (32230800,"Magic Redmane Greatshield"), - (32230900,"Cold Redmane Greatshield"), - (32231000,"Poison Redmane Greatshield"), - (32231100,"Blood Redmane Greatshield"), - (32231200,"Occult Redmane Greatshield"), - (32240000,"Eclipse Crest Greatshield"), - (32240100,"Heavy Eclipse Crest Greatshield"), - (32240200,"Keen Eclipse Crest Greatshield"), - (32240300,"Quality Eclipse Crest Greatshield"), - (32240400,"Fire Eclipse Crest Greatshield"), - (32240500,"Flame Art Eclipse Crest Greatshield"), - (32240600,"Lightning Eclipse Crest Greatshield"), - (32240700,"Sacred Eclipse Crest Greatshield"), - (32240800,"Magic Eclipse Crest Greatshield"), - (32240900,"Cold Eclipse Crest Greatshield"), - (32241000,"Poison Eclipse Crest Greatshield"), - (32241100,"Blood Eclipse Crest Greatshield"), - (32241200,"Occult Eclipse Crest Greatshield"), - (32250000,"Cuckoo Greatshield"), - (32250100,"Heavy Cuckoo Greatshield"), - (32250200,"Keen Cuckoo Greatshield"), - (32250300,"Quality Cuckoo Greatshield"), - (32250400,"Fire Cuckoo Greatshield"), - (32250500,"Flame Art Cuckoo Greatshield"), - (32250600,"Lightning Cuckoo Greatshield"), - (32250700,"Sacred Cuckoo Greatshield"), - (32250800,"Magic Cuckoo Greatshield"), - (32250900,"Cold Cuckoo Greatshield"), - (32251000,"Poison Cuckoo Greatshield"), - (32251100,"Blood Cuckoo Greatshield"), - (32251200,"Occult Cuckoo Greatshield"), - (32260000,"Golden Greatshield"), - (32260100,"Heavy Golden Greatshield"), - (32260200,"Keen Golden Greatshield"), - (32260300,"Quality Golden Greatshield"), - (32260400,"Fire Golden Greatshield"), - (32260500,"Flame Art Golden Greatshield"), - (32260600,"Lightning Golden Greatshield"), - (32260700,"Sacred Golden Greatshield"), - (32260800,"Magic Golden Greatshield"), - (32260900,"Cold Golden Greatshield"), - (32261000,"Poison Golden Greatshield"), - (32261100,"Blood Golden Greatshield"), - (32261200,"Occult Golden Greatshield"), - (32270000,"Gilded Greatshield"), - (32270100,"Heavy Gilded Greatshield"), - (32270200,"Keen Gilded Greatshield"), - (32270300,"Quality Gilded Greatshield"), - (32270400,"Fire Gilded Greatshield"), - (32270500,"Flame Art Gilded Greatshield"), - (32270600,"Lightning Gilded Greatshield"), - (32270700,"Sacred Gilded Greatshield"), - (32270800,"Magic Gilded Greatshield"), - (32270900,"Cold Gilded Greatshield"), - (32271000,"Poison Gilded Greatshield"), - (32271100,"Blood Gilded Greatshield"), - (32271200,"Occult Gilded Greatshield"), - (32280000,"Haligtree Crest Greatshield"), - (32280100,"Heavy Haligtree Crest Greatshield"), - (32280200,"Keen Haligtree Crest Greatshield"), - (32280300,"Quality Haligtree Crest Greatshield"), - (32280400,"Fire Haligtree Crest Greatshield"), - (32280500,"Flame Art Haligtree Crest Greatshield"), - (32280600,"Lightning Haligtree Crest Greatshield"), - (32280700,"Sacred Haligtree Crest Greatshield"), - (32280800,"Magic Haligtree Crest Greatshield"), - (32280900,"Cold Haligtree Crest Greatshield"), - (32281000,"Poison Haligtree Crest Greatshield"), - (32281100,"Blood Haligtree Crest Greatshield"), - (32281200,"Occult Haligtree Crest Greatshield"), - (32290000,"Wooden Greatshield"), - (32290100,"Heavy Wooden Greatshield"), - (32290200,"Keen Wooden Greatshield"), - (32290300,"Quality Wooden Greatshield"), - (32290400,"Fire Wooden Greatshield"), - (32290500,"Flame Art Wooden Greatshield"), - (32290600,"Lightning Wooden Greatshield"), - (32290700,"Sacred Wooden Greatshield"), - (32290800,"Magic Wooden Greatshield"), - (32290900,"Cold Wooden Greatshield"), - (32291000,"Poison Wooden Greatshield"), - (32291100,"Blood Wooden Greatshield"), - (32291200,"Occult Wooden Greatshield"), - (32300000,"Lordsworn's Shield"), - (32300100,"Heavy Lordsworn's Shield"), - (32300200,"Keen Lordsworn's Shield"), - (32300300,"Quality Lordsworn's Shield"), - (32300400,"Fire Lordsworn's Shield"), - (32300500,"Flame Art Lordsworn's Shield"), - (32300600,"Lightning Lordsworn's Shield"), - (32300700,"Sacred Lordsworn's Shield"), - (32300800,"Magic Lordsworn's Shield"), - (32300900,"Cold Lordsworn's Shield"), - (32301000,"Poison Lordsworn's Shield"), - (32301100,"Blood Lordsworn's Shield"), - (32301200,"Occult Lordsworn's Shield"), - (32900000,""), - (32910000,""), - (32920000,""), - (33000000,"Glintstone Staff"), - (33040000,"Crystal Staff"), - (33050000,"Gelmir Glintstone Staff"), - (33060000,"Demi-Human Queen's Staff"), - (33090000,"Carian Regal Scepter"), - (33120000,"Digger's Staff"), - (33130000,"Astrologer's Staff"), - (33170000,"Carian Glintblade Staff"), - (33180000,"Prince of Death's Staff"), - (33190000,"Albinauric Staff"), - (33200000,"Academy Glintstone Staff"), - (33210000,"Carian Glintstone Staff"), - (33230000,"Azur's Glintstone Staff"), - (33240000,"Lusat's Glintstone Staff"), - (33250000,"Meteorite Staff"), - (33260000,"Staff of the Guilty"), - (33270000,"Rotten Crystal Staff"), - (33280000,"Staff of Loss"), - (33900000,""), - (33910000,""), - (33920000,""), - (33930000,""), - (33940000,""), - (33950000,""), - (33960000,""), - (33970000,""), - (33980000,""), - (34000000,"Finger Seal"), - (34010000,"Godslayer's Seal"), - (34020000,"Giant's Seal"), - (34030000,"Gravel Stone Seal"), - (34040000,"Clawmark Seal"), - (34060000,"Golden Order Seal"), - (34070000,"Erdtree Seal"), - (34080000,"Dragon Communion Seal"), - (34090000,"Frenzied Flame Seal"), - (34900000,""), - (34910000,""), - (34920000,""), - (34930000,""), - (34940000,""), - (34950000,""), - (34960000,""), - (34970000,""), - (34980000,""), - (34990000,""), - (40000000,"Shortbow"), - (40010000,"Misbegotten Shortbow"), - (40020000,"Red Branch Shortbow"), - (40030000,"Harp Bow"), - (40050000,"Composite Bow"), - (41000000,"Longbow"), - (41010000,"Albinauric Bow"), - (41020000,"Horn Bow"), - (41030000,"Erdtree Bow"), - (41040000,"Serpent Bow"), - (41060000,"Pulley Bow"), - (41070000,"Black Bow"), - (42000000,"Lion Greatbow"), - (42010000,"Golem Greatbow"), - (42030000,"Erdtree Greatbow"), - (42040000,"Greatbow"), - (43000000,"Soldier's Crossbow"), - (43020000,"Light Crossbow"), - (43030000,"Heavy Crossbow"), - (43050000,"Pulley Crossbow"), - (43060000,"Full Moon Crossbow"), - (43080000,"Arbalest"), - (43110000,"Crepus's Black-Key Crossbow"), - (43900000,""), - (44000000,"Hand Ballista"), - (44010000,"Jar Cannon"), - (50000000,"Arrow"), - (50010000,"Fire Arrow"), - (50020000,"Serpent Arrow"), - (50030000,"Bone Arrow (Fletched)"), - (50040000,"St. Trina's Arrow"), - (50060000,"Shattershard Arrow (Fletched)"), - (50080000,"Rainbow Stone Arrow (Fletched)"), - (50090000,"Golden Arrow"), - (50100000,"Dwelling Arrow"), - (50110000,"Bone Arrow"), - (50130000,"Firebone Arrow (Fletched)"), - (50140000,"Firebone Arrow"), - (50150000,"Poisonbone Arrow (Fletched)"), - (50160000,"Poisonbone Arrow"), - (50170000,"Sleepbone Arrow (Fletched)"), - (50180000,"Sleepbone Arrow"), - (50190000,"Stormwing Bone Arrow"), - (50200000,"Lightningbone Arrow (Fletched)"), - (50210000,"Lightningbone Arrow"), - (50220000,"Rainbow Stone Arrow"), - (50230000,"Shattershard Arrow"), - (50240000,"Spiritflame Arrow"), - (50260000,"Magicbone Arrow (Fletched)"), - (50270000,"Magicbone Arrow"), - (50280000,"Haligbone Arrow (Fletched)"), - (50290000,"Haligbone Arrow"), - (50300000,"Bloodbone Arrow (Fletched)"), - (50310000,"Bloodbone Arrow"), - (50320000,"Coldbone Arrow (Fletched)"), - (50330000,"Coldbone Arrow"), - (50340000,"Rotbone Arrow (Fletched)"), - (50350000,"Rotbone Arrow"), - (51000000,"Great Arrow"), - (51010000,"Golem's Great Arrow"), - (51020000,"Golden Great Arrow"), - (51030000,"Golem's Magic Arrow"), - (51040000,"Radahn's Spear"), - (51050000,"Bone Great Arrow (Fletched)"), - (51060000,"Bone Great Arrow"), - (52000000,"Bolt"), - (52010000,"Lightning Bolt"), - (52020000,"Perfumer's Bolt"), - (52030000,"Black-Key Bolt"), - (52040000,"Burred Bolt"), - (52050000,"Meteor Bolt"), - (52060000,"Explosive Bolt"), - (52070000,"Golden Bolt"), - (52080000,"Lordsworn's Bolt"), - (52090000,"Bone Bolt"), - (52100000,"Firebone Bolt"), - (52110000,"Lightningbone Bolt"), - (52120000,"Magicbone Bolt"), - (52130000,"Haligbone Bolt"), - (52140000,"Poisonbone Bolt"), - (52150000,"Bloodbone Bolt"), - (52160000,"Coldbone Bolt"), - (52170000,"Rotbone Bolt"), - (52180000,"Sleepbone Bolt"), - (52190000,"Flaming Bolt"), - (52900000,""), - (52910000,""), - (53000000,"Ballista Bolt"), - (53010000,"Lightning Greatbolt"), - (53020000,"Explosive Greatbolt"), - (53030000,"Bone Ballista Bolt"), - (47000000,""), - (47010000,""), - (98990000,""), - (99000000,""), - (99010000,""), - (99020000,""), - (99030000,""), - (99040000,""), - (99050000,""), - (99060000,""), - ])) - }); -} \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 4e02a51..0bc8fe4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -106,7 +106,6 @@ fn main() -> Result<(), eframe::Error> { pub struct App { save_api: Option, // Save Api vm: ViewModel, // ViewModel from the save data - backup_dir: Option, // Directory containing backup saves picked_path: PathBuf, // Path to current save file for future use when opening dialogs current_route: Route, // Current in app view importer_vm: ImporterViewModel, // ViewModel used for the importer @@ -118,7 +117,6 @@ impl App { pub fn new(_cc: &eframe::CreationContext<'_>) -> Self { Self { save_api: None, - backup_dir: None, picked_path: Default::default(), current_route: Route::None, vm: ViewModel::default(), @@ -154,8 +152,6 @@ impl App { // Create directories for the backups if they don't exist create_dir_all(&backup_path)?; - - self.backup_dir = Some(backup_path.clone()); } else { return Err(SaveApiError::IoError(std::io::Error::new( std::io::ErrorKind::NotFound, diff --git a/src/ui/inventory/add/single.rs b/src/ui/inventory/add/single.rs index 8e56c1a..1c4c44a 100644 --- a/src/ui/inventory/add/single.rs +++ b/src/ui/inventory/add/single.rs @@ -1,4 +1,4 @@ -use std::rc::Rc; +use std::{ops::Deref, rc::Rc}; use eframe::egui::{self, Color32, Layout, Ui}; @@ -89,7 +89,7 @@ pub(crate) fn single_customization(ui: &mut Ui, inventory_vm: &mut InventoryView ); ui.add_space(8.); - match &inventory_vm.add_vm.selected_item { + match inventory_vm.add_vm.selected_item.clone() { // No customization needed for these item categories SelectedItem::None | SelectedItem::Armor(_) @@ -155,7 +155,7 @@ pub(crate) fn single_customization(ui: &mut Ui, inventory_vm: &mut InventoryView // Draw available ash of war Infusions combo box if there's any if item.as_ref().borrow().is_infusable() { - ui.add(egui::Label::new("Ash Of War:")); + ui.label("Ash of War:"); if inventory_vm.add_vm.available_infusions.len() > 0 { if egui::ComboBox::new("infsuion", "") .show_index( @@ -173,10 +173,23 @@ pub(crate) fn single_customization(ui: &mut Ui, inventory_vm: &mut InventoryView }, ) .changed() - {}; + { + inventory_vm.add_vm.infusion_changed(); + }; } ui.end_row(); } + + // Draw available affinity combo box if there's any + if inventory_vm.add_vm.selected_infusion != 0 { + ui.label("Affinity:"); + egui::ComboBox::new("affinity", "").show_index( + ui, + &mut inventory_vm.add_vm.selected_affinity, + inventory_vm.add_vm.available_affinities.len(), + |i| inventory_vm.add_vm.available_affinities[i].to_string(), + ); + } }); } } diff --git a/src/vm/inventory/add/add.rs b/src/vm/inventory/add/add.rs index 97233bd..fae364a 100644 --- a/src/vm/inventory/add/add.rs +++ b/src/vm/inventory/add/add.rs @@ -7,7 +7,7 @@ use er_save_lib::{ }; use strsim::sorensen_dice; -use super::{filter::ParamFilter, item_param::ItemParam}; +use super::{affinity::Affinity, filter::ParamFilter, item_param::ItemParam}; #[derive(Default, PartialEq)] pub(crate) enum AddTypeRoute { @@ -24,7 +24,7 @@ pub(crate) struct ParamHeader { pub(crate) item_type: ItemType, } -#[derive(Default)] +#[derive(Default, Clone)] pub(crate) enum SelectedItem { #[default] None, @@ -50,6 +50,7 @@ pub(crate) struct AddViewModel { pub(crate) selected_weapon_level: u8, pub(crate) selected_gem: u8, pub(crate) selected_infusion: usize, + pub(crate) selected_affinity: usize, // Params pub(crate) items: Vec>>>, @@ -61,6 +62,7 @@ pub(crate) struct AddViewModel { // List used in view pub(crate) current_list: Vec>>, pub(crate) available_infusions: Vec>>, + pub(crate) available_affinities: Vec, } impl AddViewModel { @@ -130,7 +132,7 @@ impl AddViewModel { let weapons: Vec>>> = self .weapons .iter() - .filter(ParamFilter::not_infused) + .filter(ParamFilter::weapons_not_infused) .map(|item| item.clone()) .collect(); Self::init_list(weapons.iter(), filter_text) @@ -138,7 +140,16 @@ impl AddViewModel { ItemType::Armor => Self::init_list(self.armors.iter(), filter_text), ItemType::Accessory => Self::init_list(self.talismans.iter(), filter_text), ItemType::Item => Self::init_list(self.items.iter(), filter_text), - ItemType::Aow => Self::init_list(self.aows.iter(), filter_text), + ItemType::Aow => { + // Filter out nameless aows + let aows: Vec>>> = self + .aows + .iter() + .filter(ParamFilter::aows_nameless) + .map(|item| item.clone()) + .collect(); + Self::init_list(aows.iter(), filter_text) + } }; self.current_list.sort_by(|a, b| { a.as_ref() @@ -258,4 +269,24 @@ impl AddViewModel { .unwrap() .clone() } + + pub(crate) fn infusion_changed(&mut self) { + let current_infusion = &mut self.available_infusions[self.selected_infusion]; + if let Some(gem_param) = self + .aows + .iter() + .find(|item_param| Rc::ptr_eq(&item_param.as_ref().borrow().header, ¤t_infusion)) + { + self.available_affinities = Affinity::available_affinities(gem_param.clone()); + let default_affinity = Affinity::default_affinity(gem_param.clone()); + self.selected_affinity = self + .available_affinities + .iter() + .position(|affinity| affinity == &default_affinity) + .unwrap(); + } else { + self.selected_affinity = 0; + self.available_affinities = Vec::new(); + } + } } diff --git a/src/vm/inventory/add/affinity.rs b/src/vm/inventory/add/affinity.rs new file mode 100644 index 0000000..3c67272 --- /dev/null +++ b/src/vm/inventory/add/affinity.rs @@ -0,0 +1,160 @@ +use std::{cell::RefCell, rc::Rc}; + +use er_save_lib::EquipParamGem::EquipParamGem; + +use super::item_param::ItemParam; + +#[derive(Default, PartialEq, Debug)] +pub(crate) enum Affinity { + Standard = 0, + Heavy = 100, + Keen = 200, + Quality = 300, + Fire = 400, + FlameArt = 500, + Lightning = 600, + Sacred = 700, + Magic = 800, + Cold = 900, + Poison = 1000, + Blood = 1100, + Occult = 1200, + Unused13, + Unused14, + Unused15, + Unused16, + Unused17, + Unused18, + Unused19, + Unused20, + Unused21, + Unused22, + Unused23, + #[default] + Uknown, +} +impl ToString for Affinity { + fn to_string(&self) -> String { + match self { + Affinity::Standard => format!("Standard"), + Affinity::Heavy => format!("Heavy"), + Affinity::Keen => format!("Keen"), + Affinity::Quality => format!("Quality"), + Affinity::Fire => format!("Fire"), + Affinity::FlameArt => format!("FlameArt"), + Affinity::Lightning => format!("Lightning"), + Affinity::Sacred => format!("Sacred"), + Affinity::Magic => format!("Magic"), + Affinity::Cold => format!("Cold"), + Affinity::Poison => format!("Poison"), + Affinity::Blood => format!("Blood"), + Affinity::Occult => format!("Occult"), + Affinity::Unused13 => format!("Unused13"), + Affinity::Unused14 => format!("Unused14"), + Affinity::Unused15 => format!("Unused15"), + Affinity::Unused16 => format!("Unused16"), + Affinity::Unused17 => format!("Unused17"), + Affinity::Unused18 => format!("Unused18"), + Affinity::Unused19 => format!("Unused19"), + Affinity::Unused20 => format!("Unused20"), + Affinity::Unused21 => format!("Unused21"), + Affinity::Unused22 => format!("Unused22"), + Affinity::Unused23 => format!("Unused23"), + Affinity::Uknown => format!("Uknown"), + } + } +} + +impl Affinity { + pub(crate) fn available_affinities( + gem_param: Rc>>, + ) -> Vec { + let mut available_affinites = Vec::new(); + + // Standard + if gem_param.as_ref().borrow().param.configurableWepAttr00 == 1 { + available_affinites.push(Affinity::Standard); + } + + // Heavy + if gem_param.as_ref().borrow().param.configurableWepAttr01 == 1 { + available_affinites.push(Affinity::Heavy); + } + + // Keen + if gem_param.as_ref().borrow().param.configurableWepAttr02 == 1 { + available_affinites.push(Affinity::Keen); + } + + // Quality + if gem_param.as_ref().borrow().param.configurableWepAttr03 == 1 { + available_affinites.push(Affinity::Quality); + } + + // Fire + if gem_param.as_ref().borrow().param.configurableWepAttr04 == 1 { + available_affinites.push(Affinity::Fire); + } + + // FlameArt + if gem_param.as_ref().borrow().param.configurableWepAttr05 == 1 { + available_affinites.push(Affinity::FlameArt); + } + + // Lightning + if gem_param.as_ref().borrow().param.configurableWepAttr06 == 1 { + available_affinites.push(Affinity::Lightning); + } + + // Sacred + if gem_param.as_ref().borrow().param.configurableWepAttr07 == 1 { + available_affinites.push(Affinity::Sacred); + } + + // Magic + if gem_param.as_ref().borrow().param.configurableWepAttr08 == 1 { + available_affinites.push(Affinity::Magic); + } + + // Cold + if gem_param.as_ref().borrow().param.configurableWepAttr09 == 1 { + available_affinites.push(Affinity::Cold); + } + + // Poison + if gem_param.as_ref().borrow().param.configurableWepAttr10 == 1 { + available_affinites.push(Affinity::Poison); + } + + // Blood + if gem_param.as_ref().borrow().param.configurableWepAttr11 == 1 { + available_affinites.push(Affinity::Blood); + } + + // Occult + if gem_param.as_ref().borrow().param.configurableWepAttr12 == 1 { + available_affinites.push(Affinity::Occult); + } + + available_affinites + } + + pub(crate) fn default_affinity(gem_param: Rc>>) -> Self { + match gem_param.as_ref().borrow().param.defaultWepAttr { + 0 => Affinity::Standard, + 1 => Affinity::Heavy, + 2 => Affinity::Keen, + 3 => Affinity::Quality, + 4 => Affinity::Fire, + 5 => Affinity::FlameArt, + 6 => Affinity::Lightning, + 7 => Affinity::Sacred, + 8 => Affinity::Magic, + 9 => Affinity::Cold, + 10 => Affinity::Poison, + 11 => Affinity::Blood, + 12 => Affinity::Occult, + _ => Affinity::Uknown, + } + } +} diff --git a/src/vm/inventory/add/filter.rs b/src/vm/inventory/add/filter.rs index a02e30a..68d40bd 100644 --- a/src/vm/inventory/add/filter.rs +++ b/src/vm/inventory/add/filter.rs @@ -1,13 +1,13 @@ use std::{cell::RefCell, rc::Rc}; -use er_save_lib::EquipParamWeapon::EquipParamWeapon; +use er_save_lib::{EquipParamGem::EquipParamGem, EquipParamWeapon::EquipParamWeapon}; use super::item_param::ItemParam; pub(crate) struct ParamFilter; impl ParamFilter { - pub(crate) fn not_infused(weapon: &&Rc>>) -> bool { + pub(crate) fn weapons_not_infused(weapon: &&Rc>>) -> bool { weapon .as_ref() .borrow() @@ -21,4 +21,18 @@ impl ParamFilter { % 10_000 == 0 } + + pub(crate) fn aows_nameless(weapon: &&Rc>>) -> bool { + weapon + .as_ref() + .borrow() + .header + .as_ref() + .borrow() + .item_id + .as_ref() + .borrow() + .to_owned() + > 9999 + } } diff --git a/src/vm/inventory/add/mod.rs b/src/vm/inventory/add/mod.rs index abbb6e3..2ece836 100644 --- a/src/vm/inventory/add/mod.rs +++ b/src/vm/inventory/add/mod.rs @@ -1,4 +1,5 @@ pub(crate) mod add; +pub(crate) mod affinity; pub(crate) mod filter; pub(crate) mod item_param; pub(crate) mod weapon_type; From 644b0835e65ba6c51bfc001970527470354e3130 Mon Sep 17 00:00:00 2001 From: ClayAmore <131625063+ClayAmore@users.noreply.github.com> Date: Tue, 13 Aug 2024 02:01:13 +0200 Subject: [PATCH 04/12] Create release.yml --- .github/workflows/release.yml | 52 +++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..a1be3b8 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,52 @@ +name: er-save-editor-release + +run-name: Publishing a new release + +on: + push: + tags: + - "v*" + +jobs: + build: + runs-on: x64 + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + override: true + + - name: Build project + run: cargo build --release + + - name: Package binaries + run: | + mkdir -p dist + cp target/release/Er-Save-Editor.exe dist/ + shell: bash + + - name: Create GitHub Release + id: create_release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ github.ref }} + release_name: Release ${{ github.ref }} + body: | + Changelog or release notes go here. + draft: false + prerelease: false + + - name: Upload Release Asset + uses: actions/upload-release-asset@v1 + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: dist/Er-Save-Editor.exe + asset_name: Er-Save-Editor.exe + asset_content_type: application/octet-stream From 8592520cce1374a8e2bcab7ca53c90031d252a24 Mon Sep 17 00:00:00 2001 From: ClayAmore <131625063+ClayAmore@users.noreply.github.com> Date: Tue, 13 Aug 2024 02:10:13 +0200 Subject: [PATCH 05/12] Update release.yml --- .github/workflows/release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a1be3b8..a7b677d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -3,6 +3,7 @@ name: er-save-editor-release run-name: Publishing a new release on: + workflow_dispatch: {} push: tags: - "v*" From ae33e462113987ec48f1abe62fe2dfb51aa8e573 Mon Sep 17 00:00:00 2001 From: ClayAmore <131625063+ClayAmore@users.noreply.github.com> Date: Tue, 13 Aug 2024 02:11:17 +0200 Subject: [PATCH 06/12] Update release.yml --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a7b677d..8a9b6a2 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -3,7 +3,7 @@ name: er-save-editor-release run-name: Publishing a new release on: - workflow_dispatch: {} + pull_request: {} push: tags: - "v*" From 103b75ff8b2522e31ae4881e9077006defd839fb Mon Sep 17 00:00:00 2001 From: ClayAmore <131625063+ClayAmore@users.noreply.github.com> Date: Tue, 13 Aug 2024 02:15:29 +0200 Subject: [PATCH 07/12] Update release.yml --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8a9b6a2..b4f8712 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -10,7 +10,7 @@ on: jobs: build: - runs-on: x64 + runs-on: ubuntu-latest steps: - name: Checkout code From 51c9e94aabd767968db061266baf8a6e7d606b5c Mon Sep 17 00:00:00 2001 From: ClayAmore <131625063+ClayAmore@users.noreply.github.com> Date: Tue, 13 Aug 2024 02:19:58 +0200 Subject: [PATCH 08/12] Update release.yml --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b4f8712..c88087e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -10,7 +10,7 @@ on: jobs: build: - runs-on: ubuntu-latest + runs-on: windows-latest steps: - name: Checkout code From 8631461531b6185d59a784bb7d13cbc0b9496bce Mon Sep 17 00:00:00 2001 From: ClayAmore <131625063+ClayAmore@users.noreply.github.com> Date: Tue, 13 Aug 2024 02:38:06 +0200 Subject: [PATCH 09/12] Update release.yml --- .github/workflows/release.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c88087e..187af6f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -3,7 +3,8 @@ name: er-save-editor-release run-name: Publishing a new release on: - pull_request: {} + pull_request_target: + types: [labeled] push: tags: - "v*" From 748fa8f6f9ccfc9ce265528e8d73b5528bfe113a Mon Sep 17 00:00:00 2001 From: ClayAmore <131625063+ClayAmore@users.noreply.github.com> Date: Tue, 13 Aug 2024 02:39:46 +0200 Subject: [PATCH 10/12] Update release.yml --- .github/workflows/release.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 187af6f..7f47d69 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -3,8 +3,7 @@ name: er-save-editor-release run-name: Publishing a new release on: - pull_request_target: - types: [labeled] + pull_request_target: {} push: tags: - "v*" From 2fc1ec6da24b7d734395908756a9214c9f8d2552 Mon Sep 17 00:00:00 2001 From: ClayAmore <131625063+ClayAmore@users.noreply.github.com> Date: Tue, 13 Aug 2024 03:11:56 +0200 Subject: [PATCH 11/12] Update release.yml --- .github/workflows/release.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7f47d69..8a4092e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -3,10 +3,8 @@ name: er-save-editor-release run-name: Publishing a new release on: - pull_request_target: {} - push: - tags: - - "v*" + push: + branches: "release/0.1.0" jobs: build: From 39e4979aeeb751662d86ccb80c65925f9303c725 Mon Sep 17 00:00:00 2001 From: ClayAmore <131625063+ClayAmore@users.noreply.github.com> Date: Tue, 13 Aug 2024 03:48:41 +0200 Subject: [PATCH 12/12] Delete .github/workflows directory --- .github/workflows/release.yml | 51 ----------------------------------- 1 file changed, 51 deletions(-) delete mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index 8a4092e..0000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,51 +0,0 @@ -name: er-save-editor-release - -run-name: Publishing a new release - -on: - push: - branches: "release/0.1.0" - -jobs: - build: - runs-on: windows-latest - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up Rust - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - override: true - - - name: Build project - run: cargo build --release - - - name: Package binaries - run: | - mkdir -p dist - cp target/release/Er-Save-Editor.exe dist/ - shell: bash - - - name: Create GitHub Release - id: create_release - uses: actions/create-release@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - tag_name: ${{ github.ref }} - release_name: Release ${{ github.ref }} - body: | - Changelog or release notes go here. - draft: false - prerelease: false - - - name: Upload Release Asset - uses: actions/upload-release-asset@v1 - with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: dist/Er-Save-Editor.exe - asset_name: Er-Save-Editor.exe - asset_content_type: application/octet-stream