├── .github └── workflows │ └── ci.yaml ├── .gitignore ├── README.md ├── docs ├── contributing.md ├── getting_started │ ├── extraction_modding.md │ └── mod_manager.md ├── images │ ├── 404.png │ ├── favicon.png │ └── logo.png ├── index.md ├── modding │ ├── GBFR Reloaded-II Mod Creation Guide.mp4 │ ├── GBFR Reloaded-II and Mod Installation Guide.mp4 │ ├── creating_mods.md │ ├── deploy_asi_loader.png │ ├── gbfrelink.recolor.bluehair.zip │ ├── installing_mods.md │ ├── mod_manager_api.md │ ├── mod_manager_mods.png │ └── recommended_mods_tools.md ├── models │ ├── GBFR_Blender_Model_Import.mp4 │ ├── exporting.md │ └── importing.md ├── overrides │ └── 404.html ├── resources │ ├── asset_paths.md │ ├── change_lists │ │ ├── quest_rate_v1.0_v1.1.htm │ │ ├── quest_rate_v1.1.4_v1.2.1.htm │ │ ├── quest_rate_v1.1_v1.1.4.htm │ │ └── quest_rate_v1.2.1_v1.3.1.htm │ ├── curio_loot_rates.md │ ├── enemy_break_part_rates.md │ ├── entity_prefixes.md │ ├── file_extensions.md │ ├── formats │ │ ├── cfct.md │ │ ├── minfo.md │ │ ├── mmat.md │ │ ├── objread.md │ │ └── stpr.md │ ├── fsm.md │ ├── gacha_rates.md │ ├── item_id.csv │ ├── item_ids.md │ ├── model_ids.md │ ├── player │ │ ├── action_ids.md │ │ ├── action_parameter.md │ │ ├── buff_ids.csv │ │ ├── buff_ids.md │ │ ├── buff_ids_specific.csv │ │ ├── control_types.csv │ │ ├── control_types.md │ │ ├── debuff_ailment_ids.csv │ │ ├── debuff_ailment_ids.md │ │ └── motions.md │ ├── quest_drop_rates.md │ ├── quest_id.csv │ ├── quest_ids.md │ ├── quests_layouts │ │ ├── placement.md │ │ └── quest_base_info.md │ ├── re │ │ ├── api.md │ │ ├── hashes.md │ │ ├── hashlist.7z │ │ ├── mechanics │ │ │ ├── gem_mix.md │ │ │ └── rotd.md │ │ ├── misc.md │ │ ├── networking.md │ │ ├── obj_id.md │ │ ├── playlog_request.json │ │ ├── save_units.md │ │ └── user_attributes.md │ ├── sigil_gem_ids.md │ ├── sigil_id.csv │ ├── skill_id.csv │ ├── trait_skill_ids.md │ └── weapon_materials.md ├── stylesheets │ └── extra.css ├── tables │ └── table_database.md ├── textures │ ├── granite.md │ └── textures.md └── tutorials │ ├── GBFR_Data_Tools_Extract_Model_Files.mp4 │ ├── audio │ ├── BnkExtr_QuickBms.zip │ ├── audio_creation.md │ ├── audio_extraction.md │ └── wwnames.txt │ ├── file_extraction.md │ └── textures │ ├── texture_creation.md │ └── texture_extraction.md └── mkdocs.yml /.github/workflows/ci.yaml: -------------------------------------------------------------------------------- 1 | name: ci 2 | on: 3 | push: 4 | branches: 5 | - master 6 | - main 7 | permissions: 8 | contents: write 9 | jobs: 10 | deploy: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - uses: actions/checkout@v4 14 | with: 15 | fetch-depth: 0 16 | sparse-checkout: | 17 | docs 18 | - uses: actions/setup-python@v4 19 | with: 20 | python-version: 3.x 21 | - uses: actions/cache@v4 22 | with: 23 | key: ${{ github.ref }} 24 | path: .cache 25 | - run: pip install mkdocs-material mkdocs-git-revision-date-localized-plugin pillow cairosvg mkdocs-glightbox mkdocs-git-committers-plugin-2 mkdocs-table-reader-plugin 26 | - run: mkdocs gh-deploy --force 27 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .cache/ 2 | /venv 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # relink-modding 2 | 3 | This is the public repository behind Relink Modding 4 | 5 | Dependencies are mkdocs-material among other extensions. 6 | 7 | ## Setup & Contributing 8 | 9 | Python 3 is required. 10 | ``` 11 | pip install mkdocs-material mkdocs-git-committers-plugin-2 mkdocs-table-reader-plugin mkdocs-git-revision-date-localized-plugin mkdocs-glightbox "mkdocs-material[imaging]" 12 | ``` 13 | 14 | Cairo (Windows) - Download [MSYS2](https://www.msys2.org/) and run: 15 | ``` 16 | pacman -S mingw-w64-ucrt-x86_64-cairo 17 | ``` 18 | 19 | Local host the site: 20 | ``` 21 | mkdocs serve 22 | ``` 23 | 24 | -------------------------------------------------------------------------------- /docs/contributing.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: material/book-plus 3 | --- 4 | 5 | # Contributing 6 | 7 | If you're like to improve the site, the repository is available [here](https://github.com/Nenkai/relink-modding)! Feel free to help out in any way. 8 | 9 | Everything uses easy-to-write markdown for documentation with a few additions that you can see in the [Mkdocs Material](https://squidfunk.github.io/mkdocs-material/reference/) reference. 10 | 11 | [Visual Studio Code](https://code.visualstudio.com/) is recommended to easily edit and preview in real-time. 12 | 13 | !!! tip 14 | 15 | Feel free to join the [Discord](https://discord.gg/gbsG4CDsru) for guidance if needed. -------------------------------------------------------------------------------- /docs/getting_started/extraction_modding.md: -------------------------------------------------------------------------------- 1 |
2 | ![404](../images/404.png) 3 |
Content Not Found
4 |
5 | 6 | This page's contents have been moved: 7 | 8 | :material-arrow-right: [Extracting Files](../tutorials/file_extraction.md) 9 | 10 | :material-arrow-right: [Installing Mods](../modding/installing_mods.md) -------------------------------------------------------------------------------- /docs/getting_started/mod_manager.md: -------------------------------------------------------------------------------- 1 |
2 | ![404](../images/404.png) 3 |
Content Not Found
4 |
5 | 6 | This page's contents have been moved: 7 | 8 | :material-arrow-right: [Installing Mods](../modding/installing_mods.md) 9 | 10 | :material-arrow-right: [Creating Mods](../modding/creating_mods.md) -------------------------------------------------------------------------------- /docs/images/404.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nenkai/relink-modding/19ebf8a75928241d506d6531af421e73d30d13a9/docs/images/404.png -------------------------------------------------------------------------------- /docs/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nenkai/relink-modding/19ebf8a75928241d506d6531af421e73d30d13a9/docs/images/favicon.png -------------------------------------------------------------------------------- /docs/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nenkai/relink-modding/19ebf8a75928241d506d6531af421e73d30d13a9/docs/images/logo.png -------------------------------------------------------------------------------- /docs/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | hide: 3 | - navigation 4 | - toc 5 | - footer 6 | --- 7 | 8 | # Granblue Fantasy: Relink Modding 9 | 10 | Welcome to the world of GBFR Modding! Here you can learn all about modding the game. 11 | 12 | --- 13 | 14 |
15 | 16 | - :octicons-stack-16:{ .lg .middle } __Modding Tutorials__ 17 | 18 | --- 19 | 20 | Tutorials for installing and creating mods 21 | 22 | [:material-folder-download: Installing Mods](modding/installing_mods.md) 23 | 24 | [:material-folder-plus: Creating Mods](modding/creating_mods.md) 25 | 26 | [:material-medal-outline: Recommended Mods/Tools](modding/recommended_mods_tools.md) 27 | 28 | - :material-wrench:{ .lg .middle } __Tutorials for Modders__ 29 | 30 | --- 31 | 32 | Learn how to Extract and Mod GBFR files! 33 | 34 | [:material-folder-move: Extracting Files](tutorials/file_extraction.md) 35 | 36 | [:material-image-move: Extracting Textures](tutorials/textures/texture_extraction.md) 37 | 38 | [:material-image-plus: Creating Textures](tutorials/textures/texture_creation.md) 39 | 40 | [:material-file-music: Audio Extraction](tutorials/audio/audio_extraction.md) & [Creation](tutorials/audio/audio_creation.md) 41 | 42 | - :material-book-alphabet:{ .lg .middle } __Resources & Info for Modders__ 43 | 44 | --- 45 | 46 | All the resources for your needs can be found here 47 | 48 | [:octicons-rel-file-path-16: File Tree/Asset Paths](resources/asset_paths.md) 49 | 50 | [:material-book-alphabet: Entity Prefixes](resources/entity_prefixes.md) 51 | 52 | [:material-file-question-outline: File Extensions & Tools](resources/file_extensions.md) 53 | 54 | [:material-identifier: Model IDs](resources/model_ids.md) 55 | 56 | - :simple-blender:{ .lg .middle } __Blender__ 57 | 58 | --- 59 | 60 | Learn how to import models, or create & export new game models 61 | 62 | [:material-application-import: Importing **into** Blender](models/importing.md) 63 | 64 | [:material-application-export: Exporting **from** Blender](models/exporting.md) 65 | 66 | - :material-tools:{ .lg .middle } __Tool Links__ 67 | 68 | --- 69 | 70 | Links to the various tools 71 | 72 | [GBFR Mod Manager](https://github.com/WistfulHopes/gbfrelink.utility.manager/releases) 73 | 74 | [GBFRDataTools](https://github.com/Nenkai/GBFRDataTools/releases) 75 | 76 | [GraniteTextureReader](https://github.com/Nenkai/GraniteTextureReader/releases) 77 | 78 | [:simple-blender: GBFR Blender Tools](https://github.com/WistfulHopes/GBFRBlenderTools) 79 | 80 | [GBFR File Name Logger](https://github.com/WistfulHopes/gbfrelink.utility.filenamelogger/releases) 81 | 82 | - :simple-discord:{ .lg .middle } __Discord__ 83 | 84 | --- 85 | 86 | Join the Discord for mods, guidance & more! 87 | 88 | [![Relink Modding Community Discord](https://discordapp.com/api/guilds/1203608338344976434/widget.png?style=banner2&raw=true)](https://discord.gg/gbsG4CDsru) 89 | 90 | - :material-heart:{ .lg .middle } __Support / Contributing__ 91 | 92 | --- 93 | 94 | Support our work to allow us to make more things possible! 95 | 96 | [:simple-kofi: Nenkai](https://ko-fi.com/nenkai) 97 | 98 | [:material-patreon: Ryn](https://www.patreon.com/WistfulHopes) 99 | 100 | [:material-book-plus: Improving the site](contributing.md) 101 |
-------------------------------------------------------------------------------- /docs/modding/GBFR Reloaded-II Mod Creation Guide.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nenkai/relink-modding/19ebf8a75928241d506d6531af421e73d30d13a9/docs/modding/GBFR Reloaded-II Mod Creation Guide.mp4 -------------------------------------------------------------------------------- /docs/modding/GBFR Reloaded-II and Mod Installation Guide.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nenkai/relink-modding/19ebf8a75928241d506d6531af421e73d30d13a9/docs/modding/GBFR Reloaded-II and Mod Installation Guide.mp4 -------------------------------------------------------------------------------- /docs/modding/creating_mods.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: material/folder-plus 3 | --- 4 | 5 | # Creating Mods 6 | 7 | ## Creating Mods for the Relink Mod Manager 8 | 9 | Once you have modded assets you'd like to mod into the game 10 | 11 | 1. First, follow the [Reloaded II Creating Mods tutorial](https://reloaded-project.github.io/Reloaded-II/CreatingMods/) for general information about creating a mod for Reloaded-II. 12 | 2. Set the Granblue Fantasy Relink Mod Manager as a dependency. Reloaded-II will prompt you to set mod dependencies when creating the mod. 13 | 3. Your mod's assets must be contained within the `GBFR\data` folder, and follow the same path as where you first extracted the mods from. 14 | * For example, a mod for `model\pl\pl0101\pl0101.minfo` must be located at: `(Mod Directory)\GBFR\data\model\pl\pl0101\pl0101.minfo.` 15 | 16 | 19 | 20 | !!! info "Example Mod" 21 | :material-download: An example mod can be found [here](gbfrelink.recolor.bluehair.zip). This example mod switches Djeeta's modifies Djeeta's original outfit model in the prologue. 22 | 23 | If you have successfully gotten your mod to work, congratulations! 24 | 25 | --- 26 | 27 | ## Mod Loader Features 28 | 29 | The mod loader comes with a few features that you can leverage to make mods easier to build or compatible across versions. 30 | 31 | ### :material-transfer-up: `.minfo` Spoofing 32 | 33 | Sometimes the [Model Info](../resources/formats/minfo.md) (`.minfo`) format is changed and a *version date* is changed across all `.minfo` files. This version is explicitly checked to at least be of a certain date. 34 | 35 | Since `.minfo` files are [FlatBuffers](https://flatbuffers.dev/) files, it is normally fine to just upgrade this version as is. The mod loader will silently upgrade any files if needed. 36 | 37 | ### :material-file-export: Automatic `.json` -> `.msg` 38 | 39 | As of 1.0.5, any `.json` files converted from message pack `.msg` files can be automatically processed by the mod loader and converted back to `.msg`. 40 | 41 | You only have to deal with editing the `.json` file. 42 | 43 | --- 44 | 45 | ## Creating Mods for Manual Installation 46 | 47 | Refer to [Modding Manually](./installing_mods.md#modding-manually) on the Installing Mods page. 48 | 49 | --- 50 | 51 | ## Publishing Mods & Guidelines 52 | 53 | [Nexus Mods](https://www.nexusmods.com/granbluefantasyrelink) is the primary website to publish mods. 54 | 55 | Before you publish a mod, ensure that you've mentioned the following: 56 | 57 | * Which **version** this mod was tested for. 58 | * The **version** of the mod loader (Granblue Fantasy Relink Mod Manager) this mod requires. 59 | * If this mod contains **[table edits](../tables/table_database.md)**, in that case the mod is likely to break in future updates. 60 | * If this mod cotnains UI **texture edits** (any texture that are [spritesheets](https://en.wikipedia.org/wiki/Texture_atlas)), in that case the mod is likely to break in future updates. 61 | * If you've made an UI mod, make sure that you've made both `fhd` and non-fhd versions - if you've only edited textures from the `fhd` folder, users using resolutions above 2k (1920x1080) will be using textures from the non-fhd folder and **not be able to see your texture mods**. -------------------------------------------------------------------------------- /docs/modding/deploy_asi_loader.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nenkai/relink-modding/19ebf8a75928241d506d6531af421e73d30d13a9/docs/modding/deploy_asi_loader.png -------------------------------------------------------------------------------- /docs/modding/gbfrelink.recolor.bluehair.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nenkai/relink-modding/19ebf8a75928241d506d6531af421e73d30d13a9/docs/modding/gbfrelink.recolor.bluehair.zip -------------------------------------------------------------------------------- /docs/modding/installing_mods.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: material/folder-download 3 | --- 4 | 5 | # Mod Manager 6 | 7 | The Reloaded II mod manager combined with the Granblue Fantasy Relink Mod Manager mod is the primary way to manage mods for GBFR. It quickly handles what would normally be a multi-step process with GBFRDataTools for all managed mods. 8 | 9 | --- 10 | 11 | ## Requirements 12 | 13 | * :material-github: [Reloaded-II Mod Manager](https://github.com/Reloaded-Project/Reloaded-II/releases) 14 | * `gbfrelink.utility.manager` (:simple-nexusmods: [NexusMods](https://www.nexusmods.com/granbluefantasyrelink/mods/526) - :material-github: [Github](https://github.com/WistfulHopes/gbfrelink.utility.manager/releases)) 15 | 16 | --- 17 | 18 | ## Setting up Reloaded-II 19 | 20 | First, install Reloaded-II. 21 | 22 | 1. Download Reloaded-II's [`Release.zip`, or `Setup.exe`](https://github.com/Reloaded-Project/Reloaded-II/releases). 23 | 2. Extract `Release.zip` to its own folder or run the `Setup.exe` and install it. 24 | 3. Open `Reloaded-II.exe`. 25 | 4. Press the `+` Icon to add a game and select `Granblue Fantasy Relink.exe`. 26 | 27 | Then, install the Mod Loader for Relink (two options): 28 | 29 | * Drag/Drop `gbfrelink.utility.manager.7z` into Reloaded-II. Make sure Reloaded-II is not running as admin (Windows disallows drag/drop on elevated processes). 30 | * Or, in Reloaded-II's installation folder, open the folder called `Mods`. 31 | * Extract `gbfrelink.utility.manager.7z` using the `Extract To...` option. It should look like this: 32 |
33 | ![image](mod_manager_mods.png) 34 | *Make sure to extract `gbfrelink.utility.manager` into its own folder.* 35 |
36 | 37 | Then make sure to tick on the checkbox next to `Granblue Fantasy Relink Mod Manager` to enable it. 38 | 39 | !!! info 40 | 41 | For more information if needed, refer to the Reloaded II [Quick Start Guide](https://reloaded-project.github.io/Reloaded-II/QuickStart/). 42 | 43 | --- 44 | 45 | ## Installing Mods 46 | 47 | 1. Download a mod. You can find mods on sites like Nexus Mods and GameBanana. 48 | 2. Drag-Drop the zipped file into Reloaded-II. 49 | 3. In Reloaded-II make sure to tick on the checkbox next to the mods to enable them. 50 | 4. Press `Launch Application` to launch the game and install the mods. 51 | * If you'd like to just launch the game with mods from steam, follow the instructions in the next section. 52 | 5. Head to [Nexus Mods](https://www.nexusmods.com/granbluefantasyrelink/mods/) for finding mods. We also have a [recommend mod list here](recommended_mods_tools.md). 53 | 54 | !!! warning 55 | The game sends quest reports/results as telemetry data (named [PlayLog](../resources/re/api.md#playlog-endpoints)) which is recommended to **disable** when running mods (especially quest mods). You can do so by heading to `Game Options -> Other -> Play Log -> Do Not Agree`. 56 | 57 | --- 58 | 59 | ## Removing Mods 60 | 61 | You can remove mods by disabling all mods **except** the mod loader, and start the game once. 62 | 63 | !!! warning "Warning - Mods that edit sound files" 64 | 65 | You may need to verify integrity on Steam for mods that edit sound files as those cannot be reverted easily yet. 66 | 67 | --- 68 | 69 | ### Compatibility with SpecialK and GBFRelinkFix 70 | 71 | Some programs/mods that directly inject into the game, like SpecialK or GBFRelinkFix, will be incompatible with Reloaded-II's default setup. Thankfully, this is easy to remedy. 72 | 73 |
74 | ![image](deploy_asi_loader.png) 75 |
76 | 77 | 1. In Reloaded-II click on GBFR's icon. 78 | 2. Click `Edit Application`. 79 | 3. Open the `Advanced Tools & Options` dropdown. 80 | 4. Press `Deploy ASI Loader`. 81 | 82 | You can now either launch the game through Reloaded-II or Steam. 83 | 84 | --- 85 | 86 | ### Video Tutorial - Mod Installation 87 | 88 | 91 | 92 | 93 | --- 94 | 95 | ## Game Updates 96 | 97 | !!! Warning 98 | ***Do this before Downloading the game update through steam!*** 99 | 100 | To properly update to a newer game version with mods installed: 101 | 102 | * Rename `orig_data.i` in the game's folder to `data.i`. Otherwise Steam delta patching may attempt to patch a modded `data.i`, leading in an invalid file. 103 | * Remove any tools/patch files you may have installed in the game's folder such as: 104 | * `scripts` folder 105 | * `.asi` files 106 | * `winmm.dll` 107 | 108 | If that does not work, or you already downloaded the game update, delete the `data.i` file and verify game files integrity via Steam in the game's properties. 109 | 110 | --- 111 | 112 | ## Alternative Mod Managers 113 | 114 | We cannot ensure that these will remain compatible with the Reloaded II Mod Manager. It is *always recommended* to use the Reloaded II Mod Manager to ensure to get the latest fixes if and when game updates could break certain mods. 115 | 116 | * [Relink-Mod-Manager](https://github.com/Zetas-Workshop/Relink-Mod-Manager) 117 | * [Wiki](https://github.com/Zetas-Workshop/Relink-Mod-Manager/wiki) 118 | * [Compatibility with Reloaded II Mods](https://github.com/Zetas-Workshop/Relink-Mod-Manager/wiki/Importing-Reloaded-II-Mod-Packs) 119 | 120 | --- 121 | 122 | ## Modding Manually 123 | 124 | !!! warning 125 | 126 | It is important that you create a backup of `data.i` first. If you do not have one, you can verify game files integrity on Steam. 127 | 128 | 129 | To add or update contents, simply add them to the `data` folder. **You should preserve the same paths.** 130 | 131 | !!! example 132 | 133 | If you want to mod `system/table/ability.tbl`, drop it to the `data` folder as such: 134 | ```{ .sh .no-copy } 135 | . 136 | ├─ data/ # Always preserve game paths 137 | │ └─ system/ 138 | │ └─ table/ 139 | │ └─ ability.tbl 140 | │ 141 | ... 142 | ``` 143 | 144 | Then run the following command: 145 | ``` markdown title="Command" 146 | GBFRDataTools.exe add-external-files -i 147 | ``` 148 | 149 | !!! note 150 | 151 | If you are editing or adding files, you must re-run the command! You may also need to restore your original `data.i` if you've removed a file that was previously registed and wish to restore it. -------------------------------------------------------------------------------- /docs/modding/mod_manager_api.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: material/api 3 | --- 4 | 5 | # Mod Manager API 6 | 7 | !!! note 8 | This page is intended for programmers with knowledge in C#. 9 | 10 | As of `gbfrelink.utility.manager` 1.0.8, a modding API is now exposed. 11 | 12 | This API can be leveraged to create file mods through your own C# code. This has the benefit of creating specific mods with a lessened chance of breaking across official game updates. 13 | 14 | An example is available at [gbfr.qol.weaponglowcontrol](https://github.com/Nenkai/gbfr.qol.weaponglowcontrol) ([Nexus Page](https://www.nexusmods.com/granbluefantasyrelink/mods/363)), which programatically fetches game files, edits them, and passes them back to the mod loader. 15 | 16 | ## Setting Up 17 | 18 | 1. [Setup a development environment](https://reloaded-project.github.io/Reloaded-II/DevelopmentEnvironmentSetup/) for Reloaded-II mods. 19 | 2. [Create a New Project](https://reloaded-project.github.io/Reloaded-II/ProjectSetup/) using the Reloaded II Mod template. 20 | 3. Add the [`gbfrelink.utility.manager.Interfaces`](https://www.nuget.org/packages/gbfrelink.utility.manager.Interfaces) NuGet package to your project. 21 | 22 | ## Usage 23 | 24 | Refer to the [Dependencies Consumption documentation](https://reloaded-project.github.io/Reloaded-II/DependencyInjection_Consumer/) to understand the concept behind shared libraries. 25 | 26 | In your mod's constructor, grab a reference to `IDataManager`: 27 | 28 | ```csharp 29 | // Fetch IDataManager to manipulate game data 30 | _modLoader.GetController()?.TryGetTarget(out IDataManager dataManager!); 31 | 32 | // Checks if a game file exists (archive file, non-external) 33 | const string TEXT_EN_PATH = "system/table/text/en/text.msg"; 34 | if (dataManager.FileExists(TEXT_EN_PATH, includeExternal: false)) 35 | { 36 | // Get the file data 37 | byte[] file = dataManager.GetArchiveFile(TEXT_EN_PATH); 38 | 39 | // ... Do something with the file 40 | 41 | // Add/Update game file 42 | dataManager.AddOrUpdateExternalFile(TEXT_EN_PATH, newContents); 43 | 44 | // Apply changes to the game's data.i. 45 | dataManager.UpdateIndex(); 46 | } 47 | ``` 48 | 49 | !!! note 50 | External files or files altered by other mods cannot be acquired yet. -------------------------------------------------------------------------------- /docs/modding/mod_manager_mods.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nenkai/relink-modding/19ebf8a75928241d506d6531af421e73d30d13a9/docs/modding/mod_manager_mods.png -------------------------------------------------------------------------------- /docs/modding/recommended_mods_tools.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: material/medal-outline 3 | --- 4 | 5 | # Recommended Mods/Tools 6 | 7 | When applicable, make sure to support the authors! 8 | 9 | ## Mods 10 | 11 | * [Worldwide Matchmaking](https://www.nexusmods.com/granbluefantasyrelink/mods/335) by *Nenkai* 12 | * [Skip Intro-Boot Logos & News](https://www.nexusmods.com/granbluefantasyrelink/mods/28) by *happihora* 13 | * [Community Character Rebalance](https://www.nexusmods.com/granbluefantasyrelink/mods/502) 14 | * **Note**: *Vanilla compatible*, not recommended online as it may break game balance. 15 | * [Curio T4 Rewards With Quick Quest Tickets (Rebalance)](https://www.nexusmods.com/granbluefantasyrelink/mods/322) by *Nenkai* 16 | * [Show Curio Tier on Drop](https://www.nexusmods.com/granbluefantasyrelink/mods/117) by *Nenkai* 17 | * [Mute Vyrn/Lyria](https://www.nexusmods.com/granbluefantasyrelink/mods/208) by *happihora* 18 | * [Stun Bar Cooldown Color Change](https://www.nexusmods.com/granbluefantasyrelink/mods/507) by *MidnightAugur* 19 | * [Mute Sierokarte and Parrot](https://www.nexusmods.com/granbluefantasyrelink/mods/52) by *SixTrillionOwls* 20 | * [Disable TAA/Bloom/Motion Blur/DoF & More](https://www.nexusmods.com/granbluefantasyrelink/mods/17) by *happihora* 21 | * [Weapon Customization Tool](https://www.nexusmods.com/granbluefantasyrelink/mods/451) by *Hazelberry* and *Nenkai* 22 | * [Midnight's Overhaul](https://www.nexusmods.com/granbluefantasyrelink/mods/455) by *MidnightAugur* 23 | * **Note**: Game/Quest/Content overhaul. *Incompatible with Vanilla*, only recommended after fully completing the game. 24 | 25 | !!! tip 26 | More mods can be found on [Nexus Mods](https://www.nexusmods.com/granbluefantasyrelink)! 27 | 28 | ## Relink Tools 29 | 30 | * [Freecam/Hud Toggle/Freeze/FOV (IGCS)](https://github.com/ghostinthecamera/IGCS-GITC/releases/tag/GBFR_v2.11) by *ghostinthecamera & Skall* 31 | * [gbfr-logs](https://github.com/false-spring/gbfr-logs) - Damage/Quest Logger, Parser & Overlay by *false-spring* 32 | * [GBFRelinkFix - Widescreen Support](https://github.com/Lyall/GBFRelinkFix) by *Lyall* 33 | 34 | ## Other Useful Tools 35 | 36 | * [Notepad++](https://notepad-plus-plus.org/downloads/) 37 | * [grepWin](https://tools.stefankueng.com/grepWin.html) - Searching for strings inside files 38 | * [WinMerge](https://winmerge.org/?lang=en) - File diffing 39 | * [010 Editor](https://www.sweetscape.com/010editor/) - Hex viewer + file previewer (with templates such as the ones available [here](https://github.com/Nenkai/010GameTemplates/tree/main/Cygames/Granblue%20Fantasy%20-%20Relink)) 40 | * [strings2](https://github.com/glmcdona/strings2) - Dumps all strings from specified files or folders -------------------------------------------------------------------------------- /docs/models/GBFR_Blender_Model_Import.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nenkai/relink-modding/19ebf8a75928241d506d6531af421e73d30d13a9/docs/models/GBFR_Blender_Model_Import.mp4 -------------------------------------------------------------------------------- /docs/models/exporting.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: material/application-export 3 | --- 4 | 5 | # :material-application-export: Model Exporting 6 | 7 | !!! note 8 | 9 | Exporting requires basic knowledge of how to use Blender. 10 | 11 | ## Blender Add-on 12 | 13 | Make sure you have the [GBFR Blender Tools Add-on](../models/importing.md#installing-the-blender-add-on) installed. 14 | 15 | --- 16 | 17 | ## Exporting 18 | 19 | !!! Warning 20 | Exporting still has some issues and you are likely to encounter many issues. 21 | 22 | 1. **Make sure you create a folder to export to, and place a copy of the model's original `.minfo` in that folder.** 23 | * **Do not place any of the other `.skeleton` or `.mmesh` files in this folder, they will be overridden!** 24 | 2. Ensure your model is set up according to the [Exporting Checklist](#exporting-checklist). 25 | 3. Go to `File` :material-arrow-right: `Export` :material-arrow-right: `Granblue Fantasy Relink (.mmesh)` 26 | 4. Name the model to the same name as the `.minfo` (i.e. Should be `pl1400.mmesh` for `pl1400.minfo`) 27 | 5. Press the `Export` button and wait. 28 | 6. Done! Your exported model's generated `.minfo`, `.mmesh`, and `.skeleton` files can be found in the `_Exported_Minfo` folder created where you exported to. 29 | 30 | !!! info 31 | To check for errors in the export you can re-import the exported file. 32 | 33 | --- 34 | 35 | ### :material-texture: Exporting Textures 36 | 37 | By this point you must be wondering how to export textures for the game *without* using granite. This is done by editing the [Material Set](../resources/formats/mmat.md) (`.mmat`) file, located in `model///vars/.mmat` (each number represents a different material variation, used for color packs). 38 | 39 | * Get [FlatBuffers / flatc](https://github.com/google/flatbuffers/releases), which you should already have if you already imported models. Extract it. 40 | * Get the [FlatBuffer MMat schema](https://github.com/Nenkai/010GameTemplates/blob/main/Cygames/Granblue%20Fantasy%20-%20Relink/MMat_ModelMaterial.fbs). Schemas are used to tell `flatc` how to read and write the material files. 41 | * Run the following command to convert the `.mmat` file into a human readable `.json` file: 42 | 43 | ``` { .yaml .annotate } 44 | flatc --json --strict-json -- --raw-binary 45 | ``` 46 | 47 | !!! tip 48 | 49 | `` should be the path to the `.fbs` file and `` should be the path to the `.mmat` file. 50 | 51 | * You should now have a `.json` file next to the original `.mmat` file. Open it in a text editor (preferably something like [Notepad++](https://notepad-plus-plus.org/downloads/)). 52 | * Scroll down to `granite_params`. **Remove the entire section**. This will force the game *not* to use texture streaming and use local files instead. 53 | 54 | ??? example "Example section to remove" 55 | 56 | ```json 57 | "granite_params": { 58 | "page_file": [ 59 | "f46ebc1f33247b5ba4448a428b107edcdc0f4b0451f06b3701615823a41c94e9" 60 | ], 61 | "layer_to_shader_map_name_hash": [ 62 | "g_AlbedoMap", 63 | "g_NormalMap", 64 | "g_Mask1", 65 | "g_Mask2" 66 | ], 67 | "unk4": 4, 68 | "unk5": 1, 69 | "tile_set_number": 1 70 | }, 71 | ``` 72 | 73 | Now, inside the `texture_maps` section, you will see all the textures associated to each material map. As you've removed the granite section, your textures will need to be put in the following folders (if they aren't already there): 74 | 75 | * 4k: `texture/4k/{name}.texture` 76 | * 2k: `texture/2k/{name}.texture` 77 | 78 | These textures files are simply `.wtb` files with a different extension. Follow [this simple guide](../tutorials/textures/texture_creation.md) to create `.wtb` files. Change your `.wtb` extension to `.texture` once that's done. 79 | 80 | !!! note 81 | DDS files are required beforehand. 82 | 83 | Finally, to convert your material `.json` file into `.mmat`: 84 | 85 | ``` { .yaml .annotate } 86 | flatc -b 87 | ``` 88 | 89 | Rename the newly created `.bin` file extension to `.mmat`. 90 | 91 | --- 92 | 93 | ## :octicons-checklist-16: Exporting Checklist 94 | 95 | This list is subject to change as model exporting changes and is more fully understood. 96 | 97 | * The model must have an armature and a mesh. 98 | * The model can only have 1 Mesh object, you must join all meshes together. 99 | * Each material must be assigned a material index using the addon's [Tool Shelf Panel](../models/importing.md#tool-shelf). These indices correspond with the materials list found in the model's `.mmat` files. 100 | * The mesh cannot have any vertices with zero vertex group weights assigned to it. Use the `Select Zero Weights` button in the GBFR tool shelf panel to select them. It is up to you to deal with them via weight painting, deleting, etc. 101 | * The armature's bone names must match to the GBFR Bone Index names if they are to be animated. Use an original game model to see the naming scheme of humanoid bones (TODO: Create viewable bone name list). 102 | * The armature must be pointed upwards on the Z-Axis. Remember to `CTRL+A > All Transforms` to apply all transforms on the Armature. 103 | * Models can only have 1 UV Map. 104 | * The GBFR Model format has a limit of 65535 total vertex group weights. Your model should have a reasonable amount of bones to accomodate this, if not merge the bones down. 105 | * Bone collection/group names can only contain alphanumeric characters, no special characters (i.e. Japanese characters) 106 | 107 | --- 108 | 109 | ## Other 110 | 111 | ??? abstract "Known Export Issues, Requirements, and Fixes" 112 | 113 | ### Issues & Fixes 114 | 115 | * Parts of the model are invisible in game: 116 | * Each material must be assigned a material index using the addon's [Tool Shelf Panel](../models/importing.md#tool-shelf). These indices correspond with the materials list found in the model's `.mmat` files. 117 | * Parts of the model are transparent in game: 118 | * Your mesh's normals are there are inverted, flip / recalculate your normals for affected areas. 119 | 120 | ### Old issues that should now be fixed automatically 121 | 122 | * Model's Geometry Explodes: 123 | * This is caused due to having any loose vertices/edges. To fix this, select the mesh and press the `Delete Loose Verts & Edges` button in the GBFR panel. 124 | * UVs look weird/distorted: 125 | * You must split the geometry along all outer Edges of the UV islands. Press the `Split Vertices`: `Along UV Islands`. 126 | * Model is rotated 90 degrees forward: 127 | * Exported All Transforms for the model and Armature must be applied before export. Select all objects and press `CTRL+A > All Transforms` to do this. 128 | * Parts of the mesh are stretching and not really following the bones: 129 | * You need to limit your total Vertex Group weights to `3`, then `Normalize All` your weights your weights. 130 | * This is automatically applied by the exporter on export. If it didn't work, parts of your mesh are missing weights, you can't have any geometry with 0 weight. 131 | 132 | ### Other 133 | 134 | * You can add bones to the armatures, but there is no guaruntee they will animate properly. 135 | -------------------------------------------------------------------------------- /docs/models/importing.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: material/application-import 3 | --- 4 | 5 | # :material-application-import: Model Importing 6 | 7 | !!! note 8 | 9 | Importing requires some prior Blender knowledge. 10 | 11 | ## Installing the Blender Add-on 12 | 13 | ### Requirements: 14 | 15 | * [Blender (3.5 or Higher)](https://www.blender.org/download/) 16 | * [GBFR Blender Tools](https://github.com/WistfulHopes/GBFRBlenderTools/releases) is required for importing models from the game. 17 | * [FlatBuffers - Windows.flatc.binary.zip](https://github.com/google/flatbuffers/releases) 18 | 19 | ### Installation: 20 | 21 | 1. Download and the `io_gbfr_blender_tools.zip` file from GitHub. 22 | 2. In blender go to `Edit` :material-arrow-right: `Preferences` :material-arrow-right: `Add-ons` 23 | 3. Click `Install...` in the top right. 24 | 4. Drag in the `io_gbfr_blender_tools.zip` file and install it. 25 | 5. Toggle on the checkbox for the `Granblue Fantasy Relink Blender Tools` add-on. 26 | 6. In the addon's prefences, set the filepath to the FlatBuffers `flatc.exe` file. 27 | 7. Close the preferences window. 28 | 29 | --- 30 | 31 | ## Importing 32 | 33 | 1. **Make sure you have the `.minfo`, `.skeleton`, and `.mmesh` for a model all in the same folder together to be able to import them.** 34 | 35 | !!! tip 36 | * You can learn how to extract files [here](../tutorials/file_extraction.md). 37 | * Check out [Entity Prefixes](../resources/entity_prefixes.md#models) for a list of model prefixes. 38 | * Check out [Model IDs](../resources/model_ids.md) to find a certain model's ID. 39 | * Model heads are split into their own files. 40 | * `.minfo` and `.skeleton` files are found under `model///`. 41 | * `.mmesh` files are found under `model_streaming/lod0/`. 42 | 43 | 2. Go to `File` :material-arrow-right: `Import` :material-arrow-right: `Granblue Fantasy Relink (.minfo)` 44 | 3. Drag in the model's `.minfo` file and press the `Import` button. 45 | 4. Done! Some models may fail to import currently, please open an issue to let us know by opening an issue on GitHub. 46 | 47 | !!! warning "Textures" 48 | 49 | :material-arrow-right: Refer to the [Model Textures (Granite)](../textures/granite.md) section on the Texture Extraction page for getting model textures. 50 | 51 | Textures must be manually applied to the model in blender. 52 | 53 | --- 54 | 55 | ## :octicons-video-16: Video Tutorial 56 | 57 | 60 | 61 | --- 62 | 63 | ## Tool Shelf 64 | 65 | ### (Press `N` in the `3D View` to open the tool shelf, then click the `GBFR` Tab) 66 | 67 | * :material-texture-box: `Split Mesh along UVs:` Prevents the textures from looking warped in areas on export. (Makes sure to separate vertices that are shared among 2 separate UV islands). 68 | * :material-sphere: `Sort Materials:` Sorts the order of the materials list so it should be close enough to how they import. Helps with stopping materials from going invisible when out of order. 69 | * :material-vector-triangle: `Limit & Normalize Weights:` Limits all vertex weights to 4 groups and normalizes them. 70 | * :material-vector-triangle: `Translate Bones:` Allows you to switch between the GBFR bone names and Unity/Blender standard bone names. 71 | * :material-vector-triangle: `Separate by Materials:` Separates the model's main mesh into several meshes, one for each material. Also renames them to the material names. 72 | * :material-vector-triangle: `Join all meshes:` Joins all the model's meshes into 1 mesh. 73 | * :material-vector-triangle: `Select Zero Weight Vertices:` Selects all vertices that are not connected to any bones. Exporting with 0 weight vertices fails, so this prevents this highlights the unweighted vertices for you to deal with. 74 | * :material-vector-triangle: `Flip Normals:` Flips the facing of selected geometry in edit mode, so if the model appears inside out, you can flip the facing so it's right-side out. 75 | * :material-vector-triangle: `Remove Doubles:` Joins vertices that are very close together but not joined. 76 | * :material-sphere: `Materials Section:` Use this section to set the material indices of the materials that will correlate with the materials listed in the `.mmat`s. -------------------------------------------------------------------------------- /docs/overrides/404.html: -------------------------------------------------------------------------------- 1 | {% extends "main.html" %} 2 | 3 | 4 | {% block content %} 5 |

404 - Not found

6 | 7 |
8 | 9 |
Content Not Found
10 |
11 | {% endblock %} -------------------------------------------------------------------------------- /docs/resources/enemy_break_part_rates.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: material/bone-off 3 | --- 4 | 5 | :material-lightbulb: Data Version: `1.1.x` 6 | 7 | !!! note ":material-note: Notes/Observations" 8 | 9 | * Data is extracted from `enemy_parts` 10 | * This file __**only contains weight tables**__, refer to below note. 11 | * **`[R]` means reward rank.** It depends per quest. Any item that doesn't match the rank are NOT in the pool. `-1` is always included. Therefore percentages are not included here, refer to [Quest IDs](quest_ids.md) in the future for reward ranks. 12 | * It is unclear what the flag is for, only used for Tayu'itar 13 | 14 | If you need to find a specific enemy, ++ctrl+f++ and search by enemy name. 15 | 16 | ## Quakadile (EM0500) 17 | ### Part Group #1 18 | UnkFlag/Id: 0 19 | #### Body Part 1 (Right Arm) 20 | ``` 21 | - [R-1] Rumbling Orb (10000) 22 | - [R0] Earth Shard (10000) 23 | - [R2] Earth Shard (7000) 24 | - [R2] Earth Orb (3000) 25 | - [R5] Rumbling Orb (10000) 26 | - [R6] Landbeast Plate (10000) 27 | - [R11] Earth Shard (10000) 28 | ``` 29 | 30 | #### Body Part 2 (Left Arm) 31 | ``` 32 | - [R-1] Landbeast Plate (10000) 33 | - [R0] Earth Shard (8000) 34 | - [R0] Earth Orb (2000) 35 | - [R2] Earth Orb (6000) 36 | - [R2] Landbeast Plate (4000) 37 | - [R5] Landbeast Plate (10000) 38 | - [R6] Landbeast Plate (8000) 39 | - [R6] Mirage Munition (2000) 40 | - [R11] Earth Shard (8000) 41 | - [R11] Earth Orb (2000) 42 | ``` 43 | 44 | ### Part Group #2 45 | UnkFlag/Id: 0 46 | #### Body Part 0 (Horn/Head) 47 | ``` 48 | - [R-1] Landbeast Horn (8000) 49 | - [R-1] Mirage Munition (2000) 50 | - [R0] Earth Shard (9000) 51 | - [R0] Earth Orb (1000) 52 | - [R2] Earth Orb (9000) 53 | - [R2] Landbeast Horn (1000) 54 | - [R5] Landbeast Horn (8000) 55 | - [R5] Mirage Munition (2000) 56 | - [R6] Landbeast Horn (5000) 57 | - [R6] Mirage Munition (5000) 58 | - [R11] Earth Shard (9000) 59 | - [R11] Earth Orb (1000) 60 | ``` 61 | 62 | ---- 63 | 64 | ## Blizzadile (EM0501) 65 | ### Part Group #1 66 | UnkFlag/Id: 0 67 | #### Body Part 1 (Right Arm) 68 | ``` 69 | - [R2] Water Shard (7000) 70 | - [R2] Water Orb (3000) 71 | - [R5] Frost Orb (10000) 72 | - [R6] Frostbeast Plate (10000) 73 | - [R17] Water Shard (7000) 74 | - [R17] Water Orb (3000) 75 | ``` 76 | 77 | #### Body Part 2 (Left Arm) 78 | ``` 79 | - [R2] Water Orb (6000) 80 | - [R2] Frostbeast Plate (4000) 81 | - [R5] Frostbeast Plate (10000) 82 | - [R6] Frostbeast Plate (8000) 83 | - [R6] Mirage Munition (2000) 84 | - [R17] Water Orb (6000) 85 | - [R17] Frostbeast Plate (4000) 86 | ``` 87 | 88 | ### Part Group #2 89 | UnkFlag/Id: 0 90 | #### Body Part 0 (Horn/Head) 91 | ``` 92 | - [R2] Water Orb (9000) 93 | - [R2] Frostbeast Horn (1000) 94 | - [R5] Frostbeast Horn (8000) 95 | - [R5] Mirage Munition (2000) 96 | - [R6] Frostbeast Horn (5000) 97 | - [R6] Mirage Munition (5000) 98 | - [R17] Water Orb (9000) 99 | - [R17] Frostbeast Horn (1000) 100 | ``` 101 | 102 | ---- 103 | 104 | ## Infernadile (EM0502) 105 | ### Part Group #1 106 | UnkFlag/Id: 0 107 | #### Body Part 1 (Right Arm) 108 | ``` 109 | - [R3] Fire Shard (7000) 110 | - [R3] Fire Orb (3000) 111 | - [R5] Inferno Orb (10000) 112 | - [R6] Flamebeast Plate (10000) 113 | - [R16] Fire Shard (10000) 114 | ``` 115 | 116 | #### Body Part 2 (Left Arm) 117 | ``` 118 | - [R3] Fire Orb (6000) 119 | - [R3] Flamebeast Plate (4000) 120 | - [R5] Flamebeast Plate (10000) 121 | - [R6] Flamebeast Plate (8000) 122 | - [R6] Mirage Munition (2000) 123 | - [R16] Fire Shard (8000) 124 | - [R16] Fire Orb (2000) 125 | ``` 126 | 127 | ### Part Group #2 128 | UnkFlag/Id: 0 129 | #### Body Part 0 (Horn/Head) 130 | ``` 131 | - [R3] Fire Orb (9000) 132 | - [R3] Flamebeast Horn (1000) 133 | - [R5] Flamebeast Horn (8000) 134 | - [R5] Mirage Munition (2000) 135 | - [R6] Flamebeast Horn (5000) 136 | - [R6] Mirage Munition (5000) 137 | - [R16] Fire Shard (9000) 138 | - [R16] Fire Orb (1000) 139 | ``` 140 | 141 | ---- 142 | 143 | ## Tayu'itar (EM1900) 144 | ### Part Group #1 145 | UnkFlag/Id: 0 146 | #### Body Part 0 (MK1 Head) 147 | ``` 148 | - [R-1] Tayu'itar Head Unit (5000) 149 | - [R-1] Shining Orb (3000) 150 | - [R-1] Mirage Munition (2000) 151 | - [R0] Light Shard (9000) 152 | - [R0] Light Orb (1000) 153 | - [R3] Shining Orb (9000) 154 | - [R3] Tayu'itar Head Unit (1000) 155 | - [R5] Tayu'itar Head Unit (7000) 156 | - [R5] Shining Orb (2500) 157 | - [R5] Mirage Munition (500) 158 | - [R13] Light Shard (9000) 159 | - [R13] Light Orb (1000) 160 | - [R16] Light Shard (9000) 161 | - [R16] Light Orb (1000) 162 | ``` 163 | 164 | ### Part Group #2 165 | UnkFlag/Id: 1 166 | #### Body Part 0 (MK2 Head) 167 | ``` 168 | - [R5] Ukhar Core (7500) 169 | - [R5] Mirage Munition (2500) 170 | ``` 171 | 172 | ---- 173 | 174 | ## Ancient Dragon (EM1800) 175 | ### Part Group #1 176 | UnkFlag/Id: 0 177 | #### Body Part 0 178 | ``` 179 | - [R3] Ancient Hollowpoint (9000) 180 | - [R3] Dragon Scale (1000) 181 | - [R6] Ancient Hollowpoint (10000) 182 | - [R17] Ancient Hollowpoint (6000) 183 | - [R17] Dragon Wing (3000) 184 | - [R17] Dragon Scale (1000) 185 | ``` 186 | 187 | ---- 188 | 189 | ## Vrazarek Firewyrm (EM1801) 190 | ### Part Group #1 191 | UnkFlag/Id: 0 192 | #### Body Part 0 (Head) 193 | ``` 194 | - [R4] Crimson Horn (8000) 195 | - [R4] Dragon Scale (2000) 196 | - [R6] Crimson Horn (10000) 197 | ``` 198 | 199 | ---- 200 | 201 | ## Wilinus Icewyrm (EM1802) 202 | ### Part Group #1 203 | UnkFlag/Id: 0 204 | #### Body Part 0 (Head) 205 | ``` 206 | - [R4] Frozen Horn (8000) 207 | - [R4] Dragon Scale (2000) 208 | - [R6] Frozen Horn (10000) 209 | ``` 210 | 211 | ---- 212 | 213 | ## Corvell Earthwyrm (EM1803) 214 | ### Part Group #1 215 | UnkFlag/Id: 0 216 | #### Body Part 0 (Head) 217 | ``` 218 | - [R4] Terra Horn (8000) 219 | - [R4] Dragon Scale (2000) 220 | - [R6] Terra Horn (10000) 221 | ``` 222 | 223 | ---- 224 | 225 | ## Elusious Windwyrm (EM1804) 226 | ### Part Group #1 227 | UnkFlag/Id: 0 228 | #### Body Part 0 (Head) 229 | ``` 230 | - [R4] Typhoon Horn (8000) 231 | - [R4] Dragon Scale (2000) 232 | - [R6] Typhoon Horn (10000) 233 | ``` 234 | 235 | ---- 236 | 237 | ## Radis Whitewyrm (EM1805) 238 | ### Part Group #1 239 | UnkFlag/Id: 0 240 | #### Body Part 0 (Head) 241 | ``` 242 | - [R6] Bright Horn (10000) 243 | ``` 244 | 245 | ---- 246 | 247 | ## Ancient Dragon (EM1806) 248 | ### Part Group #1 249 | UnkFlag/Id: 0 250 | #### Body Part 0 (Head) 251 | ``` 252 | - [R6] Abyssal Horn (10000) 253 | ``` 254 | 255 | ---- 256 | 257 | ## Angra Mainyu (EM7500) 258 | ### Part Group #1 259 | UnkFlag/Id: 0 260 | #### Body Part 0 (Head - Left Horn) 261 | ``` 262 | - [R5] Dark Orb (6000) 263 | - [R5] Flawless Prism (3000) 264 | - [R5] Calamity Corkscrew (1000) 265 | ``` 266 | 267 | #### Body Part 1 (Head - Right Horn) 268 | ``` 269 | - [R5] Rainbow Prism (6000) 270 | - [R5] Dark Orb (2500) 271 | - [R5] Calamity Corkscrew (1500) 272 | ``` 273 | 274 | ### Part Group #2 275 | UnkFlag/Id: 0 276 | #### Body Part 2 (Head - Left Horn) 277 | ``` 278 | - [R-1] Abysm Orb (9700) 279 | - [R-1] Calamity Corkscrew (300) 280 | - [R0] Dark Shard (10000) 281 | - [R5] Abysm Orb (8000) 282 | - [R5] Calamity Corkscrew (2000) 283 | - [R14] Dark Shard (10000) 284 | ``` 285 | 286 | #### Body Part 3 (Head - Right Horn) 287 | ``` 288 | - [R-1] Abysm Orb (6300) 289 | - [R-1] Mirage Munition (3000) 290 | - [R-1] Calamity Corkscrew (700) 291 | - [R0] Dark Shard (8000) 292 | - [R0] Dark Orb (2000) 293 | - [R5] Abysm Orb (4000) 294 | - [R5] Calamity Corkscrew (3000) 295 | - [R5] Mirage Munition (3000) 296 | - [R14] Dark Shard (8000) 297 | - [R14] Dark Orb (2000) 298 | ``` 299 | 300 | ### Part Group #3 301 | UnkFlag/Id: 0 302 | #### Body Part 4 (Head - Left Braid) 303 | ``` 304 | - [R-1] Mirage Munition (5000) 305 | - [R-1] Abysm Orb (3000) 306 | - [R-1] Calamity Corkscrew (2000) 307 | - [R0] Dark Shard (10000) 308 | - [R4] Abysm Orb (5500) 309 | - [R4] Dark Orb (4000) 310 | - [R4] Calamity Corkscrew (500) 311 | - [R5] Calamity Corkscrew (4000) 312 | - [R5] Abysm Orb (3000) 313 | - [R5] Mirage Munition (3000) 314 | - [R14] Dark Shard (10000) 315 | ``` 316 | 317 | #### Body Part 5 (Head - Right Braid) 318 | ``` 319 | - [R-1] Calamity Corkscrew (7000) 320 | - [R-1] Mirage Munition (3000) 321 | - [R0] Dark Shard (7000) 322 | - [R0] Dark Orb (2000) 323 | - [R0] Prism Chip (1000) 324 | - [R4] Abysm Orb (5500) 325 | - [R4] Dark Orb (3500) 326 | - [R4] Calamity Corkscrew (1000) 327 | - [R5] Calamity Corkscrew (7000) 328 | - [R5] Mirage Munition (3000) 329 | - [R14] Dark Shard (7000) 330 | - [R14] Dark Orb (2000) 331 | - [R14] Flawed Prism (1000) 332 | ``` 333 | 334 | ---- 335 | 336 | ## Bahamut Versa (EM7600) 337 | ### Part Group #1 338 | UnkFlag/Id: 0 339 | #### Body Part 0 340 | ---- 341 | 342 | ## Pyet-A (EM3100) 343 | ### Part Group #1 344 | UnkFlag/Id: 0 345 | #### Body Part 0 (Tail) 346 | ``` 347 | - [R6] Mirage Munition (7000) 348 | - [R6] Lunary Cell (3000) 349 | ``` 350 | 351 | ### Part Group #2 352 | UnkFlag/Id: 0 353 | #### Body Part 1 (Right Leg) 354 | ``` 355 | - [R6] Mirage Munition (8000) 356 | - [R6] Mana Circuit (2000) 357 | ``` 358 | 359 | ### Part Group #3 360 | UnkFlag/Id: 0 361 | #### Body Part 2 362 | ``` 363 | - [R6] Mirage Munition (8000) 364 | - [R6] Mana Circuit (2000) 365 | ``` 366 | 367 | ### Part Group #4 368 | UnkFlag/Id: 0 369 | #### Body Part 3 370 | ``` 371 | - [R6] Mirage Munition (8000) 372 | - [R6] Mana Circuit (2000) 373 | ``` 374 | 375 | ### Part Group #5 376 | UnkFlag/Id: 0 377 | #### Body Part 4 378 | ``` 379 | - [R6] Mirage Munition (8000) 380 | - [R6] Mana Circuit (2000) 381 | ``` 382 | 383 | ### Part Group #6 384 | UnkFlag/Id: 0 385 | #### Body Part 5 386 | ``` 387 | - [R6] Mirage Munition (8000) 388 | - [R6] Mana Circuit (2000) 389 | ``` 390 | 391 | ### Part Group #7 392 | UnkFlag/Id: 0 393 | #### Body Part 6 (Face) 394 | ``` 395 | - [R6] Mirage Munition (7000) 396 | - [R6] Lunary Detector (3000) 397 | ``` 398 | 399 | ---- 400 | 401 | ## EM7001 402 | ### Part Group #1 403 | UnkFlag/Id: 0 404 | #### Body Part 0 405 | ``` 406 | - [R5] Mirage Munition (7000) 407 | - [R5] Horn of Bahamut (3000) 408 | - [R6] Horn of Bahamut (10000) 409 | ``` 410 | 411 | ---- 412 | 413 | ## EM1700 414 | ### Part Group #1 415 | UnkFlag/Id: 0 416 | #### Body Part 0 417 | ``` 418 | - [R6] ITEM_32_0043 (10000) 419 | ``` -------------------------------------------------------------------------------- /docs/resources/entity_prefixes.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: material/book-alphabet 3 | --- 4 | 5 | # :material-book-alphabet: Entity Prefixes 6 | 7 | ## Models 8 | * `ba` -- Room objects animated 9 | * `bg` -- Room static model props, non passthrough & passthrough 10 | * `bh` -- Room objects such as breakables, but also obstacles 11 | * `ef` -- Effects 12 | * `em` -- Enemies 13 | * `et` -- 3D Model Viewer entities, other misc objects 14 | * `fe` -- Enemy Faces/Heads 15 | * `fn` -- NPC Faces/Heads 16 | * `fp` -- Player Faces/Heads 17 | * `it` -- Some random models 18 | * `np` -- NPC Bodies 19 | * `pl` -- Player Bodies 20 | * `tr` -- Landscape/Scenery Models, such as map walls, cliffs 21 | * `we` -- Enemy Weapons 22 | * `wn` -- NPC Weapons 23 | * `wp` -- Player Weapons 24 | 25 | ## Scripting 26 | ph - Phases, controls what stages to load 27 | st - Stages aka rooms aka, maps 28 | -------------------------------------------------------------------------------- /docs/resources/file_extensions.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: material/file-question-outline 3 | --- 4 | 5 | # :material-file-question-outline: File Extensions 6 | 7 | | Extension | Name | Can be viewed with | Can be edited with | 8 | | ----------|----------------------------|----------------------|--------------------| 9 | | `.bk2` | [Bink Video](https://www.radgametools.com/bnkmain.htm) | [RAD Video Tools](https://www.radgametools.com/bnkdown.htm) 10 | | `.bnk` | Wwise Bank | [Wwiser](https://github.com/bnnm/wwiser) | 11 | | `.bxm` | Binary XML | [Nier CLI](https://github.com/ArthurHeitmann/nier_cli/releases) | [Nier CLI](https://github.com/ArthurHeitmann/nier_cli/releases) | 12 | | `.evtb` | Event Timeline Data - FlatBuffer | | 13 | | `.gtp/gts`| [Granite](https://unity.com/products/granite-sdk) Streamed Texture | [GraniteTextureReader](https://github.com/Nenkai/GraniteTextureReader) | N/A | 14 | | `.layout2`| [Map Layout 2 - FlatBuffer](https://github.com/Nenkai/010GameTemplates/blob/main/Cygames/Granblue%20Fantasy%20-%20Relink/Layout2_LayoutBin.fbs) | [Flatbuffers](https://github.com/google/flatbuffers/releases/) 15 | | `.msg` | [MessagePack](https://msgpack.org/index.html) | [MsgPack2Json](https://github.com/Nenkai/MsgPack2Json) | [MsgPack2Json](https://github.com/Nenkai/MsgPack2Json) 16 | | `.minfo` | [Model Info - FlatBuffer](https://github.com/Nenkai/010GameTemplates/blob/main/Cygames/Granblue%20Fantasy%20-%20Relink/MInfo_ModelInfo.fbs) | [Flatbuffers](https://github.com/google/flatbuffers/releases/) 17 | | `.mmat` | [Model Material - FlatBuffer](https://github.com/Nenkai/010GameTemplates/blob/main/Cygames/Granblue%20Fantasy%20-%20Relink/MMat_ModelMaterial.fbs) | [Flatbuffers](https://github.com/google/flatbuffers/releases/) 18 | | `.mmesh` | Model Mesh Buffer | [GBFRBlenderImporter](https://github.com/WistfulHopes/GBFRBlenderImporter/releases) | 19 | | `.mot` | Motion (Animations) | [GBFR2Blender2GBFR](https://github.com/WistfulHopes/GBFR2Blender2GBFR) | [GBFR2Blender2GBFR](https://github.com/WistfulHopes/GBFR2Blender2GBFR) | 20 | | `.pck` | Wwise Pack | [QuickBMS](https://aluigi.altervista.org/quickbms.htm) + [wwise_pck_extractor.bms](https://github.com/bnnm/wwiser-utils/blob/master/scripts/wwise_pck_extractor.bms) | 21 | | `.tbl` | System Database Table | [GBFRDataTools](https://github.com/Nenkai/GBFRDataTools) | [GBFRDataTools](https://github.com/Nenkai/GBFRDataTools) | 22 | | `.wtb/.texture` | Texture (UI mainly) | [F-SERVO](https://github.com/ArthurHeitmann/F-SERVO) | [F-SERVO](https://github.com/ArthurHeitmann/F-SERVO) | -------------------------------------------------------------------------------- /docs/resources/formats/cfct.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: material/camera-off 3 | --- 4 | 5 | # :material-camera-off: CfCt - Camera Fade Table 6 | 7 | `.cfct` controls entity fading parameters during photo mode. 8 | 9 | This file is a [FlatBuffer](https://flatbuffers.dev/) file. 10 | 11 | * [Flatbuffer Schema](https://github.com/Nenkai/GBFRDataTools/blob/master/GBFRDataTools.FlatBuffers/CfCt_CameraFadeTable.fbs) -------------------------------------------------------------------------------- /docs/resources/formats/minfo.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: material/axis-arrow-info 3 | --- 4 | 5 | # Model Info - .minfo 6 | 7 | `.minfo` is the main file for any model. It describes how many lods a model has, the materials to use, how to read the `.mmesh` file buffer & more. 8 | 9 | This file is a [FlatBuffer](https://flatbuffers.dev/) file. 10 | 11 | * [Flatbuffer Schema](https://github.com/Nenkai/010GameTemplates/blob/main/Cygames/Granblue%20Fantasy%20-%20Relink/MInfo_ModelInfo.fbs) 12 | * [010 Editor Template](https://github.com/Nenkai/010GameTemplates/blob/main/Cygames/Granblue%20Fantasy%20-%20Relink/MInfo_ModelInfo.bt) 13 | 14 | ## Header 15 | 16 | | Field Name | Type | Description | 17 | |-----------------------|----------------|----------------------------------------------------| 18 | | magic | uint | Should be `20230729`, **explicitly checked**. Might correspond to a date, 2023/07/09. | 19 | | lods | [StreamLOD](#streamlod)[] | Parameters for each lod. Each index corresponds to a `data/model_streaming/lod{number}` entry. 20 | | ShadowLODInfos | [StreamLOD](#streamlod)[] | Parameters for each shadow lod. Each index corresponds to a `data/model_streaming/shadowlod{number}` entry. 21 | | a4 | float | Unknown. May be related to LOD distance. 22 | | sub_meshes | [SubMeshInfo](#submeshinfo)[] | List of submeshes. Addressed by lod infos. 23 | | materials | [MaterialInfo](#materialinfo)[] | List of materials used. 24 | | bones_to_weight_indices | ushort[] | An array that matches bone indices to weight indices. Any bones not in this list are non-deform. 25 | | deform_bone_boundary_box | BBox | Appears to be a boundary box for every deform bone. Not sure what the purpose of this is. 26 | | vec4_9 | Vec4 | Unknown. 27 | | a10 | [Unk_A10](#Unk_A10) | Unknown. Used very rarely in bgXXXX files 28 | | vec3_11 | Vec3 | Unknown. 29 | | float12 | float | Unknown. 30 | | float13 | float | Unknown. 31 | | float14 | float | Unknown. 32 | | float15 | float | Unknown. 33 | | float16 | float | Unknown. 34 | | float17 | float | Unknown. 35 | | float18 | float | Unknown. 36 | | float19 | float | Unknown. 37 | | float20 | float | Unknown. 38 | | byte21 | byte | Unknown. 39 | | byte22 | byte | Unknown. 40 | | bool23 | bool | Unknown. 41 | | bool24 | bool | Unknown. 42 | | bool25 | bool | Unknown. 43 | | bool26 | bool | Unknown. 44 | | bool27 | bool | Unknown. 45 | | bool28 | bool | Unknown. 46 | | bool29 | bool | Unknown. 47 | | bool30 | bool | Unknown. 48 | | bool31 | bool | Unknown. 49 | | bool32 | bool | Unknown. 50 | 51 | --- 52 | 53 | ### StreamLOD 54 | 55 | Contains information on how to read a specific .mmesh, depending on LOD. 56 | 57 | Anything polygon related are in terms of polygons times the number of vertices per polygon. As all models are made of tris, these can be thought of as polygon index times 3. 58 | 59 | | Field Name | Type | Description | 60 | |-----------------------|-------------------|----------------------------------------------------| 61 | | mesh_buffers | [MeshBufferLocator](#meshbufferlocator) | Location of each mesh buffer. | 62 | | chunks | [LodChunk](#lodchunk)[] | Parameters for each lod. Each index corresponds to a `data/model_streaming/lod{number}` entry. 63 | | vertex_count | uint | Total of vertices for this lod mesh. 64 | | poly_count_x3 | uint | The number of polygons (times 3) in the entire .mmesh. 65 | | buffer_types | byte | Bitflags determining what mesh buffers are contained in the LOD. 1 = Mesh data (vertex then indices), 2 = Vertex Weight Indices, 8 = Vertex Weights 66 | | a6 | byte | Unknown. 67 | 68 | --- 69 | 70 | ### MeshBufferLocator 71 | 72 | A `.mmesh` is broken into different "buffers". 73 | 74 | | Field Name | Type | Description | 75 | |-----------------------|-------------------|----------------------------------------------------| 76 | | offset | uint64 | Offset of the buffer within `.mmesh`. | 77 | | BoundaryBox | BBox | Size of the buffer within `.mmesh`. 78 | 79 | --- 80 | 81 | ### LodChunk 82 | 83 | | Field Name | Type | Description | 84 | |-----------------------|-------------------|----------------------------------------------------| 85 | | offset | uint | Beginning polygon index (times 3) for the chunk. | 86 | | count | uint | Number of polygons (times 3) in the chunk. 87 | | sub_mesh_id | byte | The index of the submesh the chunk belongs to. 88 | | material_id | byte | The index of the material the chunk belongs to. 89 | | a5 | byte | Unknown. 90 | | a6 | byte | Unknown. 91 | 92 | --- 93 | 94 | ### SubMeshInfo 95 | 96 | All .minfos are comprised of one or more submeshes. These submeshes can be toggled on and off separately. 97 | 98 | | Field Name | Type | Description | 99 | |-----------------------|-------------------|----------------------------------------------------| 100 | | name | string | Name of the sub mesh. | 101 | | bbox | BoundaryBox | Boundary box for the sub mesh. | 102 | 103 | --- 104 | 105 | ### MaterialInfo 106 | 107 | Contains all material slots. 108 | 109 | | Field Name | Type | Description | 110 | |-----------------------|-------------------|----------------------------------------------------| 111 | | unique_name_hash | XXHash32Custom(str) | Unknown String hash. May need to be unique. Also referenced in a few master.evtb files. | 112 | | unk_flags | byte | Unknown, likely bitflags. 113 | 114 | --- 115 | 116 | ### Unk_A10 117 | 118 | | Field Name | Type | Description | 119 | |-----------------------|-------------------|----------------------------------------------------| 120 | | unk_id | XXHash32Custom(str) | Unknown String hash. Not always used. | 121 | | a2 | float | Unknown. 122 | | a3 | byte | Unknown. 123 | | a4 | byte | Unknown. 124 | 125 | -------------------------------------------------------------------------------- /docs/resources/formats/mmat.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: material/palette-swatch-variant 3 | --- 4 | 5 | # Model Material Set - .mmat 6 | 7 | `.mmat` represents all the materials for a model, it is a set of materials. It describes the textures to use, and the shaders linked to a material. 8 | 9 | This file is a [FlatBuffer](https://flatbuffers.dev/) file. 10 | 11 | * [Flatbuffer Schema](https://github.com/Nenkai/010GameTemplates/blob/main/Cygames/Granblue%20Fantasy%20-%20Relink/MMat_ModelMaterial.fbs) 12 | * [010 Editor Template](https://github.com/Nenkai/010GameTemplates/blob/main/Cygames/Granblue%20Fantasy%20-%20Relink/MMat_ModelMaterial.bt) 13 | 14 | ## Header 15 | 16 | | Field Name | Type | Description | 17 | |-----------------------|----------------|----------------------------------------------------| 18 | | magic | uint | Should be `20230727`, **explicitly checked**. Might correspond to a date, 2023/07/27. | 19 | | materials | [Material](#material)[] | List of all materials in the material set. 20 | | constant_buffers | [ConstantBuffer](#constantbuffer) | List of constant buffers. 21 | | shader_param_float_data_pool | float[] | Float data for materials when their parameters uses floats/Vectors. 22 | | byte5 | byte | Unknown. `em` files seem to use this. 23 | | bool6 | bool | Unknown. 24 | | bool7 | bool | Unknown. 25 | 26 | --- 27 | 28 | ### Material 29 | 30 | | Field Name | Type | Description | 31 | |-----------------------|-------------------|----------------------------------------------------| 32 | | shader_params | [ShaderParamInfo](#shaderparaminfo)[] | Shader parameters, which shaders to use. | 33 | | texture_maps | [TextureMapInfo](#texturemapinfo)[] | Textures to use. 34 | | constant_buffer_indices | uint | Indices of which [constant buffers](#constantbuffer) to use. 35 | | granite_params | [GraniteVirtualTextureStreamingInfo](#granitevirtualtexturestreaminginfo) | Granite SDK Texture streaming info. If not present, will load textures loose. 36 | | unique_material_name_hash_maybe | XXHash32Custom(str) | Hash of the name of this material. 37 | | shader_type | byte | Type of shader to use. 38 | | shader_sub_type | byte | Sub-type of shader. 39 | | unk_8 | byte | Unknown. Should be 0 to 3. 40 | | bool9 | bool | Unknown. 41 | | bool10 | bool | Unknown. 42 | | bool11 | bool | Unknown. 43 | | bool12 | bool | Unknown. 44 | 45 | ??? abstract "Shader Type" 46 | 47 | Each shader type uses a different type of shader where **different parameters and texture maps may be required to be provided**. Refer to files which uses these types in the first place to provide the proper parameters to avoid a potential game crash. 48 | 49 | * 0 = player_silhouette? (sub-types: 7, 8) 50 | * 1 = player_silhouette2? (sub-types: 7, 8) 51 | * 2 = Eye shaders? (sub-types: 7, 8) 52 | * 3 = Face shaders? (sub-types: 0, 3, 7, 8) 53 | * 4 = Hair shaders? (sub-types: 0, 3, 7, 8) 54 | * 5 = Metal shaders (sub-types: 0, 3, 4, 5, 7, 8) 55 | * 7 = `elementallookdev` (sub-types: 7, 8) 56 | * 8 = `flowmap` (sub-types: 7, 8) 57 | * 9 = `foilage` (sub-types: 7, 8) 58 | * 10 = `glowingground` (sub-types: 7, 8) 59 | * 11 = `glowingmountain` (sub-types: 7, 8) 60 | * 12 = `ice` (sub-types: 2, 3, 7, 8) 61 | * 13 = `ice_2layer` (sub-types: 7, 8) 62 | * 14 = `lavafall` (sub-types: 7, 8) 63 | * 15 = `lucilius` (sub-types: 7, 8) 64 | * 16 = Not supported 65 | * 17 = `plantbillboard` (sub-types: 7, 8) 66 | * 18 = `plantmiddleview` (sub-types: 4, 7, 8) 67 | * 19 = `plantshake` (sub-types: 4, 7, 8) 68 | * 20 = `skycloud` (sub-types: 1, 7, 8) 69 | * 21 = `uberenv` (sub-types: 1, 7, 8) 70 | * 22 = `uberenv_layer2` (sub-types: 1, 7, 8) 71 | * 23 = `uberenv_layer2_plantpivotpainter` (sub-types: 1, 7, 8) 72 | * 24 = `uberenv_layer3` (sub-types: 1, 7, 8) 73 | * 25 = `uberenv_layer4` (sub-types: 1, 7, 8) 74 | * 26 = `uberenv_plantpivotpainter`? (sub-types: 4, 7, 8) 75 | * 27 = `uberenvtextureless`? (sub-types: 7, 8) 76 | * 28 = Not supported 77 | * 29 = `grid` (sub-types: 7, 8) 78 | 79 | ??? abstract "Shader Sub-Type" 80 | The sub-types supported **depend** on the main shader type. 81 | 82 | * 0 = vs_pbs_xxxxx/vs_pbs_sxxxx8_anime/vs_pbs_sxxxx/vs_pbs_sxxxx_anime 83 | * 1 = ? 84 | * 3 = outline (skinning) 85 | * 4 = shadow 86 | * 5 = shadow skinning mask (dp) 87 | * 6 = pointlight_shadow_mask 88 | * 7 = player silhouette or regular texture? 89 | * 8 = "foward" shaders? 90 | 91 | --- 92 | 93 | #### ShaderParamInfo 94 | 95 | | Field Name | Type | Description | 96 | |-----------------------|-------------------|----------------------------------------------------| 97 | | param_hash | XXHash32Custom(str) | Hashed shader parameter name. **NOTE: Structures should be ordered by this.** | 98 | | value_or_offset | uint | Value for the parameter. Note that when the type is `float/Vec2/Vec3/Vec4`, the value becomes an offset to `shader_param_float_data_pool`. 99 | | value_type | ShaderParamValueType | Parameter value type. 100 | 101 | !!! note "Value Types" 102 | 103 | * `U8` = 0, 104 | * `U16` = 1, 105 | * `F32` = 2, 106 | * `Vec2` = 3 107 | * `Vec3` = 4, 108 | * `Vec4` = 5 109 | 110 | --- 111 | 112 | #### TextureMapInfo 113 | 114 | | Field Name | Type | Description | 115 | |-----------------------|-------------------|----------------------------------------------------| 116 | | shader_map_name_hash | XXHash32Custom(str) | Hashed map name passed to the shader. **NOTE: Structures should be ordered by this.** | 117 | | texture_name | string | Texture name. When granite is not in use, this will be mapped to `texture/4k/.texture` or `texture/.texture`. 118 | 119 | --- 120 | 121 | #### GraniteVirtualTextureStreamingInfo 122 | 123 | | Field Name | Type | Description | 124 | |-----------------------|-------------------|----------------------------------------------------| 125 | | page_file | string | Granite page file where textures for this material are located. | 126 | | layer_to_shader_map_name_hash | XXHash32Custom(str)[] | Shader map names. Each element will map to one layer in the granite file. For instance if element 0 is the hash of `g_AlbedoMap`, that means that `g_AlbedoMap` is located at layer 0. | 127 | | unk3 | byte | Unknown. 128 | | unk4 | byte | Unknown. 129 | | tile_set_number | byte | Tile set number where the page file is located. Up to 11 is supported, 0-2 is used. Reminder - a new minor update always adds 3 new tile sets, so 0-11 for 1.0 through 1.3. 130 | 131 | --- 132 | 133 | ### ConstantBuffer 134 | 135 | Unknown. This is indexed by `constant_buffer_indices` within materials. 136 | 137 | | Field Name | Type | Description | 138 | |-----------------------|-------------------|----------------------------------------------------| 139 | | buffer | uint[] | Float buffer. | 140 | | unk_unique_param_name_hash | XXHash32Custom(str) | Unique name hash. | 141 | 142 | ## Known Hashes 143 | 144 | ??? abstract "Shader Maps" 145 | 146 | Strings can be found inside shaders. 147 | 148 | ``` 149 | enum ShaderMapTypeHash : uint 150 | { 151 | Unk = 0, 152 | g_5A2C820C = 0x5A2C820C, 153 | g_8A0507FB = 0x8A0507FB, 154 | g_AlbedoMap = 0x3F2B4D59, 155 | g_AlbedoMapFar = 0x7847F758, 156 | g_AlbedoMapMiddle = 0x56C35C30, 157 | g_AlbedoTex = 0xE9AEA597, 158 | g_AlbedoTex0 = 0x7D82DDEA, 159 | g_AlbedoTex1 = 0x8FC0A070, 160 | g_AlbedoTex2 = 0x19615C52, 161 | g_AlbedoTex3 = 0xA697D782, 162 | g_AreaMaskMap = 0xD52525E5, 163 | g_Base0Map = 0x9EE04147, 164 | g_Base1Map = 0x46C247DB, 165 | g_BottomErosion0Map = 0xAD237ACF, 166 | g_BottomErosion1Map = 0x47DA21A1, 167 | g_BumpMap = 0xE19336DE, 168 | g_BumpMaskMap = 0x707A6889, 169 | g_BumpNormalMap = 0x9B7115C3, 170 | g_Color0Map = 0x7AF0C744, 171 | g_Color1Map = 0xC5089B10, 172 | g_ContainerMap = 0x6C92581E, 173 | g_DetailNormalMap = 0x71F4A50E, 174 | g_DitherMap = 0x0C914331, 175 | g_EmissiveMap = 0x5CDF6E8F, 176 | g_EyeHighLightTexture = 0x00B36A70, 177 | g_EyeIrisTexture = 0x637A19F3, 178 | g_EyeWhiteTexture = 0xAEDB57AE, 179 | g_FlowMap = 0x983C09F6, 180 | g_IBLTexture = 0x330CF7B7, 181 | g_Large0Map = 0xC56364D9, 182 | g_Large1Map = 0x9FEF4F43, 183 | g_Layer1Map = 0x7373F664, 184 | g_Layer2Map = 0x3779219E, 185 | g_LowDetailMap = 0xF8E10DF2, 186 | g_LUT = 0x69DF53A1, 187 | g_Mask0Map = 0xDB972A87, 188 | g_Mask1 = 0x847A6CBD, 189 | g_Mask1Map = 0x42904E14, 190 | g_Mask2 = 0x6137BA13, 191 | g_Mask2Map = 0x2D04F715, 192 | g_Mask3 = 0x35091AFA, 193 | g_Mask4 = 0x393263EF, 194 | g_MaskMap = 0x63C1ED71, 195 | g_MaskMap1 = 0x3DCC2032, 196 | g_MaskTex = 0xD19EA412, 197 | g_MaskTex0 = 0xAE860AB0, 198 | g_MaskTex1 = 0x3069DB65, 199 | g_MaskTex2 = 0xEDD2D2AF, 200 | g_MaskTex3 = 0x4CC0E7B6, 201 | g_Middle0Map = 0x38054382, 202 | g_Middle1Map = 0xB70FDCD5, 203 | g_MROEMap = 0x4905E4E4, 204 | g_MROMap = 0x7852D3FE, 205 | g_Noise0Map = 0x451D0F3A, 206 | g_Noise1Map = 0x62F4BBF8, 207 | g_NoiseGradationMap = 0xB21CCD8B, 208 | g_NoiseMap = 0x7159CBC3, 209 | g_NoiseMaskMap = 0x010A5EFA, 210 | g_NormalMap = 0xADBA7C37, 211 | g_NormalMap1 = 0x1470B2FB, 212 | g_NormalTex = 0xE752FF91, 213 | g_NormalTex0 = 0xB55D7961, 214 | g_NormalTex1 = 0xFB542B74, 215 | g_NormalTex2 = 0x295ED71A, 216 | g_NormalTex3 = 0x82A0AA5A, 217 | g_OffsetMask0Map = 0x6ECBBABD, 218 | g_OffsetMask1Map = 0xAD768A4F, 219 | g_ParallaxTexture = 0x1EE34406, 220 | g_SideErosion0Map = 0x1EC206C2, 221 | g_SideErosion1Map = 0xE21BFE74, 222 | g_SideNoiseMap = 0xA7D31F31, 223 | g_SparkleNormalMap = 0x64E256E8, 224 | g_UberColorNoiseMap = 0xC19A4B09, 225 | g_WindMaskMap = 0x1DD2F116, 226 | } 227 | ``` 228 | 229 | ??? abstract "Shader Parameters" 230 | 231 | Strings can be found inside shaders. 232 | 233 | ``` 234 | enum ShaderParameterTypeNameHash : uint 235 | { 236 | Unk = 0, 237 | g_037BE4E5 = 0x037BE4E5, 238 | g_EmissivePower = 0x06CFE5A4, 239 | g_0A05A26F = 0x0A05A26F, 240 | g_11664BFC = 0x11664BFC, 241 | g_EnableDiscardMask = 0x24C1ABA9, 242 | g_2AEDA6AD = 0x2AEDA6AD, 243 | g_2B5C866C = 0x2B5C866C, 244 | g_372C03F0 = 0x372C03F0, 245 | g_UseIceEmissive0 = 0x3C966EE3, 246 | g_4298F7E4 = 0x4298F7E4, 247 | g_EnableOutLine = 0x49D8C1B9, 248 | g_53F49792 = 0x53F49792, 249 | g_56346692 = 0x56346692, 250 | g_IsUseAlbedoAlphaClip = 0x60F31A22, 251 | g_IsUseDetailNormal = 0x6C5CB9AC, 252 | g_IsUseDitherMap = 0x7920C84F, 253 | g_EnableBooleanMask = 0x920821E1, 254 | g_92339519 = 0x92339519, 255 | g_93D9F63A = 0x93D9F63A, 256 | g_SwayAmplitude = 0x98EBBEC2, 257 | g_9C83F56F = 0x9C83F56F, 258 | g_ContainerUse = 0x9F1DA064, 259 | g_A6EB1B34 = 0xA6EB1B34, 260 | g_AB261CFA = 0xAB261CFA, 261 | g_AC6F995D = 0xAC6F995D, 262 | g_B0EA41D9 = 0xB0EA41D9, 263 | g_B460A0F0 = 0xB460A0F0, 264 | g_BAEF6920 = 0xBAEF6920, 265 | g_C5BD3DED = 0xC5BD3DED, 266 | g_C9762248 = 0xC9762248, 267 | g_UseIceEmissive = 0xCA06A6B6, 268 | g_TwoSided = 0xD94F2821, 269 | g_UseColorNoise = 0xE208C4C4, 270 | g_E56343C0 = 0xE56343C0, 271 | g_EB6F1AE7 = 0xEB6F1AE7, 272 | } 273 | ``` -------------------------------------------------------------------------------- /docs/resources/formats/objread.md: -------------------------------------------------------------------------------- 1 | # ObjRead - .objread 2 | 3 | `.objread` are currently an unknown. 4 | 5 | This file is a [FlatBuffer](https://flatbuffers.dev/) file. 6 | 7 | --- 8 | 9 | ## Info 10 | 11 | The `info.objread` file appears to be **extremely important** as it seems to control which objects are loaded per object id? 12 | 13 | * [Flatbuffer Schema](https://github.com/Nenkai/010GameTemplates/blob/main/Cygames/Granblue%20Fantasy%20-%20Relink/ObjReadInfo.fbs) 14 | 15 | --- 16 | 17 | ## Append 18 | 19 | Unknown. 20 | 21 | * [Flatbuffer Schema](https://github.com/Nenkai/010GameTemplates/blob/main/Cygames/Granblue%20Fantasy%20-%20Relink/ObjReadAppend.fbs) -------------------------------------------------------------------------------- /docs/resources/formats/stpr.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: material/progress-download 3 | --- 4 | 5 | # :material-progress-download: StPr - Streaming Prefetch 6 | 7 | `.stpr` files are used to indicate which textures and entities should be preloaded within the specified [quest](../quest_ids.md). 8 | 9 | This file is a [FlatBuffer](https://flatbuffers.dev/) file. 10 | 11 | * [Flatbuffer Schema](https://github.com/Nenkai/GBFRDataTools/blob/master/GBFRDataTools.FlatBuffers/StPr_StreamingPrefetch.fbs) 12 | 13 | --- 14 | 15 | ## ObjectPreloadRequest 16 | 17 | Contains the list of [entities/objects](../re/obj_id.md) that should be loaded. 18 | 19 | 20 | --- 21 | 22 | ## TexturePreloadRequest 23 | 24 | Contains the list of granite textures that should be loaded. Their keys are hashes of granite texture files. 25 | 26 | For instance: 27 | 28 | ``` 29 | XXHash64("a929045e256fa2e20c1785c65c09c2f540b09037bceba4df7769a9be95779bd7") 30 | ``` 31 | 32 | Is equal to hash `804BD56EE16E60A1`. -------------------------------------------------------------------------------- /docs/resources/fsm.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: material/share-variant-outline 3 | --- 4 | 5 | # :material-share-variant: FSM (Finite State Machine) 6 | 7 | A fair chunk of the game's logic (quests, moves & ai behavior) is scripted using FSMs - [Finite State Machines](https://en.wikipedia.org/wiki/Finite-state_machine) which Cygames custom built for the game. 8 | 9 | You can find a fair chunk of these files in `system/fsm` files. They will **always** have the `_fsm_ingame` suffix - for some reason it is required. 10 | 11 | !!! tip 12 | You can preview FSMs using [RelinkToolkit2](https://github.com/Nenkai/RelinkToolkit2). 13 | 14 | ## General Understanding 15 | 16 | FSMs are visual trees that organizes logic into blocks called *nodes*. Nodes are separated by arrows that can contain conditions to move from one state from another, say, AI moving, and then attacking. These are *transitions* - moving from one node to another. Each node may have one or multiple executing components - this determines what a node does. moving, using an action, etc. 17 | 18 | ### Layers 19 | 20 | Sometimes FSMs are made up of smaller graphs called layers. When the FSM reaches the end of a layer, execution will go back to **the beginning of it**, not the start of the FSM. For FSM execution to fully complete, nodes that transition to other nodes usually have a transition with `FSMUnderLayerEndCondition`, which waits for the layer to be complete. 21 | 22 | When a node reaches a END node, the current layer ends. If the current layer is the root, the FSM ends. 23 | 24 | ### Override Transitions 25 | 26 | Override Transitions are represented by RelinkToolkit2 as Orange-Red arrows. 27 | 28 | Before explaining what these do, it is important to understand how the game executes the FSM. On every frame, the game will start from the start of the tree and execute each node starting from the root. Regular transitions (denoted by a blue arrow in RelinkToolkit2) are evaluated and their result **cached** for each node. These are only executed once, until the flow goes back there. This is how the game remembers the last node it executed - by navigating from the root and navigating each node's cached result. 29 | 30 | Override transitions bypass that rule as they are always evaluated regardless. Which means that these may **override** or **hijack** the current FSM flow. A simple example would be link attacks - they may interrupt a character's current action in order to perform link-attack specific actions. One should see these transitions as a way to interrupt normal execution based on what happens during gameplay. 31 | 32 | --- 33 | 34 | ## File Structure 35 | 36 | The FSMs file built in a **depth-first** manner. The game will iterate over every node in the file, link them to conditions and execution components accordingly, and then, build the final tree with the root node. 37 | 38 | * The game iterates through all nodes. 39 | * `FSMNode` declares a new node on the graph. They may point to other nodes with conditions. 40 | * When `childLayerId_` is set, that means this node **points to a new layer**. The first node of that layer is always the root of that layer. 41 | * `tailIndexOfChildNodeGuids_` is practically the number of nodes in this layer. This is only set for root (and layer root) nodes. 42 | * `layerNo_` sets the current layer the nodes belong to. Note that layers may be completely empty (leftover metadata) and not necessarily used. 43 | * `Transition` links a node to another using `fromNodeGuid_` and `toNodeGuid_`. Note that they are in reverse - Cygames mistake. `toNodeGuid_` is the SOURCE node while `fromNodeGuid_` is the TARGET node. 44 | * `conditionGuids_` links to condition components, aka the specified conditions to check on for this transition to occur while `params_` are how the conditions are linked, i.e OR or AND, and their priority/order of execution. (there should always be one param between two conditions. So 3 conditions = 2 params.) 45 | * `isEndTransition_` refers to FSM end. It doesn't necessarily point to a node that actually exists in the file, which, doesn't matter. 46 | * NOTE: Purpose of transitions/branches that do not have `toNodeGuid_` is currently unclear. RelinkToolkit2 shows these as green arrows. 47 | * `addAllTransition` - TODO 48 | * `addTransition` - TODO 49 | * `EnableBaseTransition` - TODO 50 | * `EnableBaseAllTransition` - TODO 51 | * **Anything else is an execution or condition**, name is an fsm object engine [reflected](https://en.wikipedia.org/wiki/Reflective_programming) based on its name which internally inherits from `BehaviorTreeComponent`. A list can be found [here](https://github.com/Nenkai/GBFRDataTools/tree/master/GBFRDataTools.FSM/Components). 52 | * For *conditions* (which must inherit from `ConditionComponent` internally), `isReverseSuccess_` means whether if a condition fails, then it is considered a success. This is equivalent to `if (!success)`. 53 | * For *actions*, these will be linked up to nodes using `parentGuid_`. 54 | * Then, the tree is built - all nodes will have children linked to. This starts from the first node in the graph, and then recursively to the bottom. 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /docs/resources/item_ids.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: material/sack 3 | --- 4 | 5 | # Item IDs 6 | 7 | :material-lightbulb: Data Version: `1.3.x` 8 | 9 | List is interpolated using `system/table/text/text.msg` & `system/table/item.tbl` 10 | 11 | {{ read_csv('item_id.csv') }} -------------------------------------------------------------------------------- /docs/resources/model_ids.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: material/identifier 3 | --- 4 | 5 | # :material-identifier: Model IDs 6 | 7 | ## Player (pl) 8 | 9 | ``` 10 | 0000 -- Gran (Rebel) 11 | 0001 -- Gran (original) 12 | 0100 -- Djeeta (Rebel) 13 | 0101 -- Djeeta (original) 14 | 0200 -- Katalina 15 | 0300 -- Rackam 16 | 0400 -- Io 17 | 0500 -- Eugen 18 | 0600 -- Rosetta 19 | 0700 -- Ferry 20 | 0800 -- Lancelot 21 | 0900 -- Vane 22 | 1000 -- Percivale 23 | 1100 -- Siegfried 24 | 1101 -- Siegfried (Open Helmet) 25 | 1102 -- Siegfried (Closed Helmet) 26 | 1200 -- Charlotta 27 | 1300 -- Yodarha 28 | 1400 -- Narmaya 29 | 1500 -- Ghandagoza 30 | 1600 -- Zeta 31 | 1700 -- Vaseraga 32 | 1800 -- Cagliostro 33 | 1900 -- Id 34 | 2000 -- Id (Transformation) 35 | 2100 -- Sandalphon (1.3.0) 36 | 2200 -- Seofon (1.2.0) 37 | 2300 -- Tweyen (1.2.0) 38 | ``` 39 | 40 | --- 41 | 42 | ## NPC (np) 43 | 44 | ``` 45 | 0000 -- Lyria 46 | 0001 -- Lyria (Church of Avia) 47 | 0100 -- Vyrn 48 | 0200 -- Sierokarte 49 | 0300 -- Rolan 50 | 0301 -- Rolan (2) 51 | 0400 -- Historiath 52 | 0500 -- Lilith 53 | 0600 -- Zathba 54 | 0700 -- Human Man 55 | 0702 -- Human Man (2) 56 | 0800 -- Old Man with Cane 57 | 0900 -- Human Boy 58 | 1000 -- Human Woman 59 | 1002 -- Human Woman (2) 60 | 1010 -- Human Woman (3) 61 | 1200 -- Erune Man 62 | 1202 -- Dagger 63 | 1300 -- Erune Woman 64 | 1400 -- Harvin Man 65 | 1402 -- Rilla 66 | 1500 -- Harvin Girl 67 | 1502 -- Harvin Woman 68 | 1510 -- Harvin Girl (2) 69 | 1600 -- Draph Man 70 | 1602 -- Pops 71 | 1700 -- Draph Woman 72 | 1702 -- Draph Woman (2) 73 | 1710 -- Draph Woman (3) 74 | 1800 -- Mellose Acolyte 75 | 1900 -- Seedhollow Soldier 76 | 2000 -- Boy 77 | 2100 -- Girl 78 | 2200 -- Alliance Receptionist 79 | 2201 -- Alliance Receptionist (2) 80 | ``` 81 | 82 | --- 83 | 84 | ## Enemy (em) 85 | 86 | ``` 87 | 0000 -- Goblin Stormer/Bandit/Striker/Gatherer/Trooper/Savage Carrion-Eater 88 | 0001 -- Goblin Witch Doctor/Hexer/Pyromancer 89 | 0002 -- Goblin Tanker/Mud-Covered Swordsman 90 | 0003 -- Goblin Archer/Frenzied Archer 91 | 0004 -- Goblin Soldier/Gladiator/Rowdy Bord/Craver Janaf/Sandeater Gimza 92 | 0005 -- Goblin Warrior/Greatshield Madbeat 93 | 0100 -- Skeleton/Mossy Skeleton 94 | 0101 -- Frosty Bones/Withered Holy Knight/Icy Hexblade 95 | 0102 -- Gerasene 96 | 0103 -- Scarmiglione 97 | 0200 -- Timber Wolf/Sand Wolf/Ravenous Wolf 98 | 0201 -- Goblin Wolfrider/Crimson Runner 99 | 0300 -- Hornbird/Ominous Raptor/Crazed Crow/Minepecker 100 | 0400 -- Wyvern 101 | 0500 -- Quakadile 102 | 0501 -- Blizzadile 103 | 0502 -- Infernadile 104 | 0600 -- Slime 105 | 0601 -- Silverslime 106 | 0602 -- Goldslime 107 | 0603 -- King Silverslime 108 | 0604 -- King Goldslime 109 | 0605 -- Prismatic Slime 110 | 0701 -- Cyaegha/Silent Watcher 111 | 0705 -- Ahriman 112 | 0706 -- Nazarbonju/Eternal Gaze 113 | 0800 -- Flame Gyre 114 | 0801 -- Aqua Gyre 115 | 0802 -- Earth Gyre 116 | 0803 -- Wind Gyre 117 | 0804 -- Light Gyre 118 | 0805 -- Dark Gyre 119 | 0900 -- Fire Spirit/Trialbeast Flame Elemental/Phondam Elemental/Vayoi Elemental/Torchlight Spirit/Crimson Phantom/Ruby Phantom/Shimmering Flame 120 | 0901 -- Water Effigy 121 | 0902 -- Water Spirit/Elemental/Phantom 122 | 0903 -- Wind Effigy 123 | 1000 -- Aviaeth Saber/Aviaeth Trooper 124 | 1001 -- Aviaeth Lancer 125 | 1002 -- Aviaeth Archer 126 | 1003 -- Aviaeth Flagbearer/Aviaeth Honor Guard 127 | 1004 -- Inquisitor Rook/Aviaeth Dreadnaught/Galcia the Saved/Hardened Rynell 128 | 1005 -- Reaper Avalan/Sinner Balgas/Aviaeth Avenger/Deluded Derleth 129 | 1006 -- Aviaeth Crusader 130 | 1100 -- Sword Veil Fellowship 131 | 1200 -- Vaza'ite Raptor 132 | 1300 -- Droita Sentinel 133 | 1301 -- Droita Mother/Droita Mother (Assault)/Droita Cyclops Prototype 134 | 1303 -- Droita Balsam/Torpedo Balsam 135 | 1500 -- Rock Golem 136 | 1600 -- Griffin/Wraithwing/Goblin Eater/Obsidian Raptor 137 | 1700 -- Behemoth 138 | 1800 -- Ancient Dragon/Frumious Bandersnatch/Ferocious Garamud 139 | 1801 -- Vrazarek Firewyrm 140 | 1802 -- Wilinus Icewyrm 141 | 1803 -- Corvell Earthwyrm 142 | 1804 -- Elusious Windwyrm 143 | 1805 -- Radis Whitewyrm 144 | 1806 -- Evyl Blackwyrm 145 | 1900 -- Tayu'itar/Tayu'itar Mk II 146 | 2000 -- Gallanza 147 | 2100 -- Maglielle/Mysterious Swordsman 148 | 2300 -- Id (Dragonform) 149 | 2400 -- Lilith 150 | 2500 -- Pincer 151 | 2600 -- Cobra/Sand Reaper 152 | 2700 -- Sir Barrold 153 | 2800 -- Ominous Form/Vengeful Wraith/Calamitous Specter 154 | 3100 -- Pyet-A 155 | 7000 -- Proto Bahamut 156 | 7100 -- Vulkan Bolla 157 | 7110 -- Vulkan Bolla Nihilla 158 | 7200 -- Furycane 159 | 7210 -- Furycane Nihilla 160 | 7300 -- Managarmr 161 | 7310 -- Managarmr Nihilla 162 | 7400 -- Excavallion 163 | 7401 -- Talus Reactor (Excavallion) 164 | 7404 -- Spinal Core (Excavallion) 165 | 7406 -- Atlas Plug/Bolt/Primal Cylinder (Excavallion) 166 | 7407 -- Deltoid Reactor/Forearm Reactor (Excavallion) 167 | 7408 -- Coxa Reactor (Excavallion) 168 | 7409 -- Chest Reactor (Excavallion) 169 | 7410 -- Spinal Core (Excavallion) 170 | 7500 -- Angra Mainyu 171 | 7520 -- Daeva 172 | 7530 -- Aka Manah 173 | 7540 -- Aka Manah (Wires) 174 | 7600 -- Bahamut Versa 175 | 7603 -- Bahamut Core 176 | 7610 -- Bahamut Versa Omega 177 | 7700 -- Lucilius 178 | ``` 179 | 180 | --- 181 | 182 | ## Map Animated (ba) 183 | 184 | ``` 185 | 0350 -- Cat 186 | 2103 -- Grapnel 187 | 7200 -- Keeper 188 | 7201 -- Watcher 189 | 7210 -- Calamitous Vestiges 190 | 7211 -- Calamitous Gate 191 | ``` 192 | 193 | --- 194 | 195 | ## Map Breakable Props (bh) 196 | 197 | ``` 198 | 0002 -- Merchant's Cargo 199 | 0003 -- Hallowed Ground 200 | 0004 -- Barricade 201 | 2002 -- 20mm Ether Autocannon 202 | 2005 -- Control Unit 203 | ``` 204 | 205 | --- 206 | 207 | ## Player Weapons (wp) 208 | Source: `table/weapon.tbl` & `table/text/en/text.json` 209 | 210 | ### Captain (Gran/Djeeta) 211 | ``` 212 | wp0000 - Traveller's Sword 213 | wp0001 - Durandal 214 | wp0002 - Sword of Eos (Sword of Eos, the Star Key) 215 | wp0003 - Albacore Blade 216 | wp0004 - Ultima Sword 217 | wp0005 - Seven-Star Sword (Seven-Star Sword, Celestial) 218 | wp0010 - False Sword of the Apocalypse 219 | wp0100 - Partenza 220 | ``` 221 | 222 | ### Katalina 223 | ``` 224 | wp0200 - Rukalsa 225 | wp0201 - Flame Rapier 226 | wp0202 - Murgleis (Murgleis, the Azure Oath) 227 | wp0203 - Luminiera Sword Omega 228 | wp0204 - Ephemeron 229 | wp0205 - Blutgang (Blutgang, Blade of Refuge) 230 | wp0290 - Ares 231 | wp0291 - Ares Sword 232 | wp0292 - Ares Shield 233 | ``` 234 | 235 | ### Rackam 236 | ``` 237 | wp0300 - Flintspike 238 | wp0301 - Wheellock Axe 239 | wp0302 - Benedia (Benedia, Azure Ammunition) 240 | wp0303 - Tiamat Bolt Omega 241 | wp0304 - Stormcloud 242 | wp0305 - Freikugel (Freikugel, the Purifier) 243 | wp0370 - Shotgun 244 | ``` 245 | 246 | ### Io 247 | ``` 248 | wp0400 - Little Witch Scepter 249 | wp0401 - Zhezl 250 | wp0402 - Gambanteinn (Gambanteinn, Staff of Hope) 251 | wp0403 - Colossus Cane Omega 252 | wp0404 - Tupsimati 253 | wp0405 - Caduceus (Caduceus, Immortal Coil) 254 | ``` 255 | 256 | ### Eugen 257 | ``` 258 | wp0500 - Dreyse 259 | wp0501 - Matchlock 260 | wp0502 - Ak-4A (AK-4A, the Suppressor) 261 | wp0503 - Leviathan Muzzle 262 | wp0504 - Clarion 263 | wp0505 - Draconic Fire (Draconic Fire, Charring Breath) 264 | wp0590 - Thrown Grenade 265 | ``` 266 | 267 | ### Rosetta 268 | ``` 269 | wp0600 - Egoism 270 | wp0601 - Swordbreaker 271 | wp0602 - Love Eternal (Love Eternal, Forevermore) 272 | wp0603 - Rose Crystal Knife 273 | wp0604 - Cortana 274 | wp0605 - Dagger of Bahamut Coda (Primal Dagger of Bahamut Coda) 275 | wp0690 - Large Rose Vine 276 | wp0691 - Vine 277 | wp0692 - Large Vine 278 | wp0693 - Large Rose 279 | wp0694 - Large Leafy Vine 280 | wp0695 - Round Vine? 281 | ``` 282 | 283 | ### Ferry 284 | ``` 285 | wp0700 - Geisterpeitche 286 | wp0701 - Leather Belt 287 | wp0702 - Ethereal Lasher (Ethereal Lasher, Fleeting End) 288 | wp0703 - Flame Lit Curl 289 | wp0704 - Live Wire 290 | wp0705 - Erinnerung (Erinnerung, From Beyond) 291 | wp0790 - Momo 292 | wp0791 - Fugee 293 | wp0792 - Nicola 294 | wp0793 - GeeGee 295 | wp0794 - Beppo 296 | ``` 297 | 298 | ### Lancelot 299 | ``` 300 | wp0800 - Altachiara 301 | wp0801 - Hoarfrost Blade Persius 302 | wp0802 - Blanc Comme Neige 303 | wp0803 - Vegalta 304 | wp0804 - Knight of Ice (Knight of Ice, the Silver Blur) 305 | wp0805 - Damascus Knife (Damascus Knife, the Unseen) 306 | ``` 307 | 308 | ### Vane 309 | ``` 310 | wp0900 - Alabarda 311 | wp0901 - Swan 312 | wp0902 - Treuer Krieger (Treuer Krieger, the Dauntless) 313 | wp0903 - Ukonvasara 314 | wp0904 - Blossom Axe 315 | wp0905 - Mjolnir (Mjolnir, Thunderous Crusher) 316 | ``` 317 | 318 | ### Percival 319 | ``` 320 | wp1000 - Flamberge 321 | wp1001 - Lohengrin 322 | wp1002 - Antwerp 323 | wp1003 - Joyeuse 324 | wp1004 - Lord of Flames (Lord of Flames, Exalted Reign) 325 | wp1005 - Gottfried (Gottfried, the White Fang) 326 | ``` 327 | 328 | ### Siegfried 329 | ``` 330 | wp1100 - IntergriIntegrityty 331 | wp1101 - Broadsword of Earth 332 | wp1102 - Ascalon (Ascalon, Dragon's Bane) 333 | wp1103 - Hrunting 334 | wp1104 - Windhose 335 | wp1105 - Balmung (Balmung, the Blue Blaze) 336 | ``` 337 | 338 | ### Charlotta 339 | ``` 340 | wp1200 - Claiomh Solais 341 | wp1201 - Arondight 342 | wp1202 - Claidheamh Soluis (Claidheamh Soluis, the Radiant) 343 | wp1203 - Ushumgal 344 | wp1204 - Sahrivar 345 | wp1205 - Galatine (Galatine, Trinity's Wrath) 346 | ``` 347 | 348 | ### Yodarha 349 | ``` 350 | wp1300 - Kiku-Ichimonji 351 | wp1301 - Asura 352 | wp1302 - Fudo-Kuniyuki (Fudo-Kuniyuki, Scarlet Glory) 353 | wp1303 - Higurashi 354 | wp1304 - Xeno Phantom Demon Blade 355 | wp1305 - Swordfish (Swordfish, Tipper of Scales) 356 | ``` 357 | 358 | ### Narmaya 359 | ``` 360 | wp1400 - Nakamaki Nodachi 361 | wp1401 - Kotetsu 362 | wp1402 - Venustas (Venustas, the Sacred Gift) 363 | wp1403 - Flourithium Blade 364 | wp1404 - Blade of Purification 365 | wp1405 - Ameno Habakiri (Ameno Habakiri, the Beheader) 366 | wp1470 - Blue Stance Sword 367 | ``` 368 | 369 | ### Ghandagoza 370 | ``` 371 | wp1500 - Brahma Gauntlet 372 | wp1501 - Rope Knuckles 373 | wp1502 - Crimson Finger 374 | wp1503 - Golden Fists of Ura (Golden Fists of Ura, No Mercy) 375 | wp1504 - Arkab 376 | wp1505 - Sky Piercer (Sky Piercer, the Apex Fist) 377 | ``` 378 | 379 | ### Zeta 380 | ``` 381 | wp1600 - Spear of Arvess 382 | wp1601 - Sunspot Spear 383 | wp1602 - Brionac (Brionac, the Dominant) 384 | wp1603 - Gisla 385 | wp1604 - Huanglong Spear 386 | wp1605 - Gae Bulg (Gae Bulg, Impaler of Ruin) 387 | wp1690 - Extra Spear 388 | ``` 389 | 390 | ### Vaseraga 391 | ``` 392 | wp1700 - Great Scythe Grynoth 393 | wp1701 - Alsarav 394 | wp1702 - Wurtzite Scythe (Wurtzite Scythe, Reaper's Hand) 395 | wp1703 - Soul Eater 396 | wp1704 - Cosmic Scythe 397 | wp1705 - Ereshkigal (Ereshkigal, Impending Doom) 398 | ``` 399 | 400 | ### Cagliostro 401 | ``` 402 | wp1800 - Magnum Opus 403 | wp1801 - Dream Atlas 404 | wp1802 - Transmigration Tome (Transmigration Tome, Infinity) 405 | wp1803 - Sacred Codex 406 | wp1804 - Arshivelle 407 | wp1805 - Zosimos (Zosimos, the Unabridged Truth) 408 | wp1890 - Dash Dragon (Ouroboros) 409 | wp1892 - Statue Substitue 410 | wp1893 - Small Ult Dagger 411 | wp1894 - Ult Dagger 412 | wp1895 - Spear 413 | wp1896 - Chakram 414 | wp1897 - Blades 415 | wp1898 - Torch Hammer 416 | ``` 417 | 418 | ### Id 419 | ``` 420 | wp1900 - Ragnarok 421 | wp1901 - Aviaeth Faussart 422 | wp1902 - Susanoo (Susanoo, the Condemner) 423 | wp1903 - Premium Sword 424 | wp1904 - Ecke Sachs 425 | wp1905 - Sword of Bahamut (Primal Sword of Bahamut) 426 | ``` 427 | 428 | ### Sandalphon 429 | ``` 430 | wp2100 - Apprentice 431 | wp2106 - World Ender (World Ender, the Fated Edge) 432 | 433 | ``` 434 | 435 | ### Seofon 436 | ``` 437 | wp2200 - Sette di Spade 438 | wp2206 - Gateway-Star Sword, Seven Winks 439 | wp2290 - Seofon's Avatar 440 | ``` 441 | 442 | ### Tweyen 443 | ``` 444 | wp2300 - Bow of Dismissal 445 | wp2306 - Desolation-Crown Bow 446 | ``` 447 | 448 | --- 449 | 450 | ## Enemy Weapons (we) 451 | ``` 452 | 2110 -- Freikugel 453 | 2111 -- Mjolnir 454 | 2112 -- Caduceus 455 | 2113 -- Gae Bulg 456 | 3100 -- Firefly 457 | 3101 -- Hutchison Generator 458 | 7000 -- Skotadi 459 | 7001 -- Fotia 460 | 7002 -- Hydor 461 | 7003 -- Edafos 462 | 7004 -- Anemos 463 | 7300 -- Nereid/Halimede 464 | ``` 465 | 466 | --- 467 | 468 | ## et 469 | 470 | This appears to be misc objects, down to mechanics 471 | 472 | !!! warning 473 | 474 | This is TODO 475 | 476 | ``` 477 | 00af - Bird 478 | cxxx - Bahamut? 479 | dxxx - Id + Camera Override/Control (3D View), referenced in `story_note_picture_*` & `chara` tables 480 | ``` -------------------------------------------------------------------------------- /docs/resources/player/action_parameter.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: material/account-cog 3 | --- 4 | 5 | # :material-account-cog: Action / Parameters 6 | 7 | Each Player character has a `{model_id}_action` and a `{model_id}_parameter` file in `system/player/data/{model_id}`. 8 | 9 | * The parameter file will list off the player's Damage caps in an array, with identifying numbers 10 | * The action file will list off the player's actions, listing the [motions](motions.md) associated with each one, as well as how the game should treat each action. 11 | 12 | ## Action File 13 | 14 | The Action file will list off the player's actions, listing the motions associated with each one, as well as how the game should treat each action. 15 | 16 | Actions, when called, can have projectiles or other attacks linked to them that do not use the `XML/BXM` file format. these will be located in the FSMs for that character. 17 | 18 | |
Name
| Type | Description | 19 | ----------------------------|--------|-------------| 20 | `id_ ` | string | This will be the number used to refer to the action by other files or other actions in branching paths. 21 | `abilityTag_` | string | Names the skill, refers to `ability` [table](../../tables/table_database.md). This is only used for actual abilities, not just normal actions. Example: "AB_PL0000_09" (this is Gran's 9th ability, which the ordering of abilities can be found by matching this against the Text file for the abilities, or removing all selected abilities in game, and counting from top to bottom). 22 | `saveActionType_` | int | Unknown. 23 | `straddleFlagBit_` | int | Bit flags. Controls how the game will handle the action. Bit 1 made the move assigned to this flag be affected by quick charge on Vaseraga. 24 | `usePoint_` | int | Whether to grants honors to the player upon using the action 25 | `autoHomingType_` | int | Unknown. Possibly impacts how the game handles targeting while this move is called 26 | `autoHomingOffsetDistance_` | int | Unknown. 27 | `abilityStocks_` | int | This will be the number of charges an ability can hold, like *Lancelot*'s Lawinsturm 28 | `saveAbilityChargeType_` | int | 1 will make the ability function like an other, 2 will set it to be a 1 time use, like Seofon's 7SB or Tweyen's 2CS 29 | `abilityChargeTime_` | int | Ability cooldown. 30 | `abilityChargeDelayMin_` | int | Extra timer that will delay the cooldown starting, this does not impact Cascade 31 | `abilityChargeDelayMax_` | int | Extra timer that will delay the cooldown starting, this does not impact Cascade 32 | `branchXAtk_` | int | When X is pressed during this action, so long as the flags are set to allow X presses, then the action listed in this will begin 33 | `branchYAtk_` | int | Same as above, but for Y 34 | `branchXAtk_Just_` | int | When X is pressed within a specified window in the flags for the action/motions, it will go to the action listed 35 | `branchYAtk_Just_` | int | Same as above but for Y 36 | `branchXAtk_Hold_` | int | Allow charging actions after this one. This functions a little weirdly, as the action seems to be needed to be specified in both the hold and press entries, and requires the following action to accept the input 37 | `branchYAtk_Hold_` | int | Same as before but for Y 38 | `branchAtkHit_` | int | Unknown. 39 | `dist_` | int | Unknown. 40 | `type_` | uint | Unknown. 41 | `controlTypeHash_` | uint | Unknown. [List of Control Types](control_types.md) 42 | `supportTypeHash_` | uint | Unknown. **Appears to be completely unused by game code**. 43 | `actionName_` | string | **Possibly unused.** Generally a name assigned to the action by the devs. 44 | `saveMotId{number}_` | uint | [Motions](motions.md) being called by this action. saved motions can be confusing at times, as certain actions will not play them in order, such as Parries 45 | `actionFreeWork{number}_` | uint | Values associated with the action, such as for *Zeta*, when she does a Rhapsody parry, the angle of bounce and force behind the lift will be listed here 46 | `freeWork{number}_` | uint | Unknown. 5 and 6 are seemingly always 1 47 | `bulletType_` | uint | Refers to the FSM associated with the action, I do not know where this is set however, as to add FSM links. Flags are required in the action to call the FSM 48 | `bulletFreeWork{number}_` | uint | Unknown. 49 | `supportEffectList_` | uint[] | Utilizes a hash and 6 values in an array format to state the buffs that will be applied to the character or team members when this player calls this action, so long as the required flag is in any of the [motions](motions.md) tied to the action. 1st value = How many buffs the game will attempt to give, 2nd value = [Buff Id](buff_ids.md) 50 | `uiIconCategory_` | uint | Possibly unused. 51 | `actionCategory_` | uint | Unknown. Compared against `abilityBit_` in certain FSM nodes such as `AIBattleRequestAbilityAction` and `AIBattleUseIdAction`. 52 | `isTriggerAttackHit_` | uint | Unknown. 53 | `damageLimitType_` | uint | Should be unused after 1.3, the game migrated to the next value 54 | `damageLimitDataIndex_` | uint | Specifies the damage cap in the Parameter File's Damage cap index that is associated with this action 55 | `relatedAbilityType_` | uint | Associates the action with the id assigned, possibly not needed, changing it still allowed the action to function as intended 56 | `indirectDamagePoint_` | uint | Additional honors, possibly given on granting buffs to other players, not fully aware of how honors works 57 | `isIndirectDamageAddMulti_` | bool | Unknown. `true` for *Vane*'s Bubble 58 | `isCheckComboCutAbility_` | bool | Unknown. 59 | 60 | ### Spawned Entities 61 | 62 | Some players spawn weapons/entities during their attacks, those characters include: 63 | 64 | * *Eugen* - Grenades 65 | * *Rosetta* - Roses and normal attacks/combo finishers 66 | * *Katalina* - Ares 67 | * *Seofon* - Avatar 68 | * *Cagliostro* - Almost all of her attacks 69 | * *Sandalphon* - Gems thrown during specific attacks 70 | * *Ferry* - Pets 71 | 72 | The weapons will have motion files and BXMs specific to them. 73 | 74 | For some characters, the weapons will handle their own hitboxes 75 | 76 | For other characters, the weapons are mostly decoration 77 | 78 | For *Cagliostro* and *Rosetta*, the Weapon animation assignments are located in the parameter file, where each action will be assigned a weapon animation (or multiple). 79 | 80 | --- 81 | 82 | 83 | *Credits: MidnightAugur* -------------------------------------------------------------------------------- /docs/resources/player/buff_ids.csv: -------------------------------------------------------------------------------- 1 | Id/Name,
Hash
,
Hash (Decimal)
,Array[0],Array[1],Array[2],Array[3],Array[4],Array[5] 2 | [0] Various,`0x3DF78A11`,`1039632913`,?,?,?,?,1(Default),1(Default) 3 | [1] Unknown,`0x74E366EA`,`1961060074`,?,?,?,?,1(Default),1(Default) 4 | [2] ATK UP (Party),`0x7EA3642C`,`2124637228`,Percent,Time(s),N/A,N/A,1(Default),1(Default) 5 | [3] DEF UP (Party),`0x7279FD12`,`1920597266`,Percent,Time(s),N/A,N/A,1(Default),1(Default) 6 | [4] Damage Cut (Area),`0xB9EE55DF`,`3119404511`,Percent,Time(s),Range(m),N/A,1(Default),1(Default) 7 | [5] Cleanse (Self),`0x385B2937`,`945498423`,?,Number of Debuffs to Remove,?,N/A,1(Default),1(Default) 8 | [6] Invulnerability (Area),`0x5D242D2D`,`1562651949`,Time(s),Range(m),N/A,N/A,1(Default),1(Default) 9 | [7] ATK UP (Self),`0x94356910`,`2486528272`,Percent,Time(s),N/A,N/A,1(Default),1(Default) 10 | [8] DEF UP (Self),`0x04620443`,`73532483`,Percent,Time(s),N/A,N/A,1(Default),1(Default) 11 | [9] Invulnerability (Self),`0x8567C7C4`,`2238171076`,Time(s),N/A,N/A,N/A,1(Default),1(Default) 12 | [10] Mirror Image (Area)(3 Hits),`0x4630AB3C`,`1177594684`,Time(s),Range(m),N/A,N/A,1(Default),1(Default) 13 | [11] Mirror Image (Self),`0x2CB18EB5`,`749833909`,Time(s),N/A,N/A,N/A,1(Default),1(Default) 14 | [12] Stout Heart (Self),`0xF0C762F9`,`4039598841`,Time(s),N/A,N/A,N/A,1(Default),1(Default) 15 | [13] Hostility (Self),`0xF690C192`,`4136681874`,Time(s),Range(m),?,?,1(Default),1(Default) 16 | [14] Unknown,`0x7079C0FF`,`1887027455`,?,?,?,?,1(Default),1(Default) 17 | [15] Unknown,`0xEE6D81FC`,`4000154108`,?,?,?,?,1(Default),1(Default) 18 | [16] Heal (Self),`0xA65CE935`,`2791106869`,?,Percent of Max HP to Heal,?,N/A,1(Default),1(Default) 19 | [17] Unknown,`0x71A9250F`,`1906910479`,?,?,?,?,1(Default),1(Default) 20 | [18] Supplementary Damage (Self),`0x173C4A28`,`389827112`,Time(s),Percent of DMG Dealt,Number of Frames to Delay,N/A,0-1(Default),0-1(Default) 21 | [19] Drain (Team),`0x5DAFEB78`,`1571810168`,Percent of DMG Dealt,Time(s),N/A,N/A,1(Default),1(Default) 22 | [20] ATK DOWN (Enemy - Applied in Area),`0x8EBDD513`,`2394805523`,Percent,Time(s),Range(m),N/A,1(Default),1(Default) 23 | [21] DEF DOWN (Enemy - Applied in Area),`0xCC5CEBB6`,`3428641718`,Percent,Time(s),Range(m),N/A,1(Default),1(Default) 24 | [22] Unknown,`0x004A1635`,`4855349`,?,?,?,?,1(Default),1(Default) 25 | [23] DEF DOWN (Enemy - Applied by AtkFlag=19[536870912]),`0x0F00F2F8`,`251720440`,Percent,Time(s),N/A,N/A,1(Default),1(Default) 26 | [24] Drain (Self - Based on most recent attack[Supplementary counts as a separate hit]),`0x994ABA62`,`2571811426`,Percent of DMG Dealt,N/A,N/A,N/A,1(Default),1(Default) 27 | [25] Dispel (Enemy - Applied by AtkFlag=19[536870912]),`0x0A71753A`,`175207738`,Number of Buffs to Dispel,N/A,N/A,N/A,1(Default),1(Default) 28 | [26] Subsitute (Area),`0xEC211E9C`,`3961593500`,Time(s),Range(m),N/A,N/A,1(Default),1(Default) 29 | [27] Debuff Immunity (Team),`0x93505ED4`,`2471517908`,Time(s),N/A,N/A,N/A,1(Default),1(Default) 30 | [28] SBA Share,`0xE2893157`,`3800641879`,Maximum Taken from User,Minimum given to other players,N/A,N/A,1(Default),1(Default) 31 | [29] Guts (Self),`0x15B7ACB7`,`364358839`,N/A,N/A,N/A,N/A,1(Default),1(Default) 32 | [30] Bugged Stout Heart (No Icon - Character glow never fades),`0x38E66DEF`,`954625519`,N/A,N/A,N/A,N/A,1(Default),1(Default) 33 | [31] Strength,`0x4EFE6CF8`,`1325296888`,Percent,Time(s),N/A,N/A,1(Default),1(Default) 34 | [32] Jammed,`0xCAD30AAD`,`3402828461`,Percent,Time(s),N/A,N/A,1(Default),1(Default) 35 | [33] Critical Hit Chance (Team),`0x72F61986`,`1928731014`,Percent,Time(s),N/A,N/A,1(Default),1(Default) 36 | [34] Critical Hit Chance (Self),`0x24B08E48`,`615550536`,Percent,Time(s),N/A,N/A,1(Default),1(Default) 37 | [35] Unknown,`0x5AB202AE`,`1521615534`,?,?,?,?,1(Default),1(Default) 38 | [-1] Unknown,`0xF8C4E240`,`4173652544`,?,?,?,?,1(Default),1(Default) 39 | -------------------------------------------------------------------------------- /docs/resources/player/buff_ids.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: material/account-arrow-up 3 | hide: 4 | - toc 5 | --- 6 | 7 | # :material-account-arrow-up: Buff IDs 8 | 9 | !!! warning 10 | 11 | * Many of the hashes are hardcoded in the executable. 12 | * Rows are also present in the `status` [table](../../tables/table_database.md). 13 | 14 | Used by: 15 | 16 | * :material-account-cog: Character Action Parameters (`system/player/data/{id}/{id}_action`) 17 | * `ActionInfo` -> `supportEffectList_[1]` 18 | 19 | ### List 20 | 21 | {{ read_csv('buff_ids.csv') }} 22 | 23 | ### Specific 24 | 25 | !!! note 26 | 27 | These will only work for the specified characters. 28 | 29 | {{ read_csv('buff_ids_specific.csv') }} 30 | 31 | ### Sound Files 32 | 33 | Part of the Wwise `core.bnk`. `core_status_{em/pl}_{s/m/l}_{name}_{start/end/dot}`, Example: `core_status_em_m_stun_start` 34 | 35 | Will match from `status` table. 36 | 37 | ``` 38 | 0 = "atkup" 39 | 1 = "defup" 40 | 2 = "atkdown" 41 | 3 = "defdown" 42 | 4 = "damagecut" 43 | 5 = "regeneration" 44 | 6 = "muteki" 45 | 7 = "tsuigeki" 46 | 8 = "hyperarmor" 47 | 9 = "illusion" 48 | 10 = "protect" 49 | 11 = "protected" 50 | 17 = "antidebuff" 51 | 18 = "drain" 52 | 20 = "guts" 53 | 21 = "strength" 54 | 22 = "gyakkyou" 55 | 23 = "criticalup" 56 | 24 = "hateup" 57 | 25 = "autorevive" 58 | 26 = "magicvortex" 59 | 27 = "concentration" 60 | 28 = "ironmeiden" 61 | 29 = "idodragon" 62 | 30 = "idosuper" 63 | 31 = "undead" 64 | 33 = "phantasmagoria" 65 | 36 = "em1806" 66 | 37 = "maxhpdown" 67 | 38 = "doubletap" 68 | 39 = "uniqueguts" 69 | 41 = "barrier" 70 | 42 = "dmgup" 71 | 43 = "sharpshoot" 72 | 44 = "senrai" 73 | 45 = "pl2100super" 74 | ``` -------------------------------------------------------------------------------- /docs/resources/player/buff_ids_specific.csv: -------------------------------------------------------------------------------- 1 | Name,
Hash
,
Hash (Decimal)
,Array[0],Array[1],Array[2],Array[3],Array[4],Array[5] 2 | Redistribute (Pl0100),`0x2C52A4A2`,`743613602`,Maximum Taken from User,Minimum given to other players,N/A,N/A,1(Default),1(Default) 3 | Mystic Vortex (3) (Pl0400),`0xEFF8B87D`,`4026054781`,N/A,N/A,N/A,N/A,1(Default),1(Default) 4 | Unknown (Pl0700),`0x3384197F`,`864295295`,?,?,?,?,1(Default),1(Default) 5 | Benediction Lvl 2 (Pl0700),`0x865B9A65`,`2254150245`,N/A,N/A,N/A,N/A,1(Default),1(Default) 6 | Benediction Lvl 2 (Pl0700),`0xA7781674`,`2809665140`,N/A,N/A,N/A,N/A,1(Default),1(Default) 7 | +1 Pet (Pl0700),`0xAA8D483A`,`2861385786`,N/A,N/A,N/A,N/A,1(Default),1(Default) 8 | Benediction Lvl 3 (Pl0700),`0xF15CAAF3`,`4049382131`,N/A,N/A,N/A,N/A,1(Default),1(Default) 9 | Benediction Lvl 1 (Pl0700),`0x1F52CBDF`,`525519839`,N/A,N/A,N/A,N/A,1(Default),1(Default) 10 | Unknown (Pl0700),`0xF15CAAF2`,`4049382130`,?,?,?,?,1(Default),1(Default) 11 | Benediction Lvl 3 (Pl0700),`0xD07F26E2`,`3497993954`,N/A,N/A,N/A,N/A,1(Default),1(Default) 12 | Onslaught Pet Summon (Pl0700),`0xDAE7BCB5`,`3672620213`,N/A,N/A,N/A,N/A,1(Default),1(Default) 13 | Unknown (Pl0700),`0x6F383F4F`,`1865957199`,?,?,?,?,1(Default),1(Default) 14 | Unknown (Pl0700),`0x7935180D`,`2033522701`,?,?,?,?,1(Default),1(Default) 15 | Umlauf (Pl0700),`0x7935180E`,`2033522702`,Time(s),AttackRate,BreakRate,SpArtsRate,1(Default),1(Default) 16 | Unknown (Pl0700),`0x7A152B84`,`2048207748`,?,?,?,?,1(Default),1(Default) 17 | Benediction Lvl 4 (Pl0700),`0x6F383F50`,`1865957200`,N/A,N/A,N/A,N/A,1(Default),1(Default) 18 | Sic 'em Geegee (Calls FSM) (Pl0700),`0x71A4DF4E`,`1906630478`,N/A,N/A,N/A,N/A,1(Default),1(Default) 19 | Unknown (Pl0700),`0x44832915`,`1149446421`,?,?,?,?,1(Default),1(Default) 20 | Unknown (Pl0700),`0x44832916`,`1149446422`,?,?,?,?,1(Default),1(Default) 21 | Benediction Lvl 4 (Pl0700),`0x4E1BB341`,`1310438209`,N/A,N/A,N/A,N/A,1(Default),1(Default) 22 | Summon all Pets (Pl0700),`0x33841980`,`864295296`,N/A,N/A,N/A,N/A,1(Default),1(Default) 23 | Benediction Lvl 1 (Pl0700),`0x3E7147CE`,`1047611342`,N/A,N/A,N/A,N/A,1(Default),1(Default) 24 | Supplementary DMG (Self) (Pl0800),`0xC8313227`,`3358667303`,Time(s),Percent of DMG dealt,Number of Frames to Delay,?,1(Default),1(Default) 25 | Full Heal + Cleanse (Self) (Pl0900),`0x351D334B`,`891106123`,N/A,N/A,N/A,N/A,1(Default),1(Default) 26 | DMG Increase Based on SBA Gauge (Pl0900),`0xA35A1ACC`,`2740591308`,Maximum % Increase,?,N/A,N/A,1(Default),1(Default) 27 | Unknown (Pl1000),`0xA3D08ECC`,`2748354252`,?,?,?,?,1(Default),1(Default) 28 | Unknown (Pl1100),`0x8C71F7DD`,`2356279261`,?,?,?,?,1(Default),1(Default) 29 | ATK UP + DEF UP (Self) (Pl1100),`0xE000D366`,`3758150502`,Percent,Time(s),?,N/A,1(Default),1(Default) 30 | Draconic Release (Pl1100),`0x70FA1BE7`,`1895439335`,Base Percent (Multiplies up to 5x),Base Time(s),N/A,N/A,1(Default),1(Default) 31 | Valiant Stance (Pl1200),`0xB6B2FA0D`,`3065182733`,Base Percent (Multiplies up to 4x),Time(s),N/A,N/A,1(Default),1(Default) 32 | Trice Blade (Pl1300),`0x9234731A`,`2452910874`,?,Time(s),N/A,N/A,1(Default),1(Default) 33 | 10 Stacks of Eternal Rage (Pl1500),`0x7B2B42FC`,`2066432764`,?,N/A,N/A,N/A,1(Default),1(Default) 34 | Stacks of Eternal Rage (Pl1500),`0x2206919A`,`570855834`,Number of Stacks,N/A,N/A,N/A,1(Default),1(Default) 35 | Unknown (Pl1600),`0x4ADC6716`,`1255958294`,?,?,?,?,1(Default),1(Default) 36 | Thousand Flames (Adds Dispel properties and calls FSM) (Pl1600),`0x05CA5D48`,`97148232`,N/A,N/A,N/A,N/A,1(Default),1(Default) 37 | Melas Gauge Activation (Pl1700),`0x8D70C1B6`,`2372977078`,N/A,N/A,N/A,N/A,1(Default),1(Default) 38 | Health Loss (Self) (Pl1700),`0xF858EDED`,`4166577645`,Percent,N/A,N/A,N/A,1(Default),1(Default) 39 | Phantasmagoria (Pl1800),`0x8D2324D6`,`2367890646`,ATK UP/DEF UP Percent,?,Crit UP Percent,Time(s),1(Default),1(Default) 40 | Ethereal Prison (Calls FSM) (Pl2100),`0x6B258477`,`1797620855`,N/A,N/A,N/A,N/A,1(Default),1(Default) 41 | Breath of Life (Calls FSM) (Pl2100),`0x035AE5D4`,`56288724`,N/A,N/A,N/A,N/A,1(Default),1(Default) 42 | Unknown (Pl2200),`0x607715DE`,`1618417118`,?,?,?,?,1(Default),1(Default) 43 | Unknown (Pl2200),`0x607715DF`,`1618417119`,?,?,?,?,1(Default),1(Default) 44 | Full Avatar Gauge (Pl2200),`0x7174941D`,`1903465501`,N/A,N/A,N/A,N/A,1(Default),1(Default) 45 | Max SBA Gauge (Team) (Pl2200),`0xA80061E9`,`2818597353`,N/A,N/A,N/A,N/A,1(Default),1(Default) 46 | Unknown (Pl2200),`0xCCC343EE`,`3435348974`,?,?,?,?,1(Default),1(Default) 47 | Deadshot (Pl2300),`0x01AE6CA0`,`28208288`,?,N/A,Time(s),Percent of Extra Multilock Points,1(Default),1(Default) 48 | -------------------------------------------------------------------------------- /docs/resources/player/control_types.csv: -------------------------------------------------------------------------------- 1 | Hash,Id 2 | F39CFDF5,0 3 | 4582EE4A,1 4 | 6C507ED8,2 5 | DF037954,3 6 | AB6F341B,4 7 | 353FD27E,5 8 | 44DFF94D,6 9 | 4ABCF8AE,7 10 | 643F288A,8 11 | 85B80171,9 12 | BC35AD81,10 13 | 8A821683,11 14 | 40DD4CF1,12 15 | 024A7E51,13 16 | BCB2951A,14 17 | D6AD09A0,15 18 | 977B3D2F,16 19 | 68A701F1,17 20 | 9FC0D703,18 21 | FF4986F0,19 22 | 2D277B17,20 23 | 61FF8ED8,21 24 | E766D1CA,22 25 | C581097E,23 26 | 70B0D7BC,24 27 | 72E1B055,25 28 | 06A5C0D6,26 29 | 39B891B6,27 30 | 90F79D40,28 31 | D88ADFF1,29 32 | 2B5B1FFA,30 33 | 28FF53ED,31 34 | 0C89C1BD,32 35 | 02B1E0C0,33 36 | EEE1E975,34 37 | 81EEC3A4,35 38 | ABCBB5FF,37 39 | 2FA01F95,36 40 | 8B3E61E4,38 41 | 2D0AD1CA,39 42 | 89551EA9,40 43 | E8E3062A,41 44 | 1CDB3304,42 45 | E103B6D1,43 46 | 250822E7,44 47 | 14D16F20,45 48 | FCF2E873,46 49 | 012A6DA6,47 50 | D93A4BED,48 51 | 92FB916F,49 52 | 21F24002,50 53 | BB4C142F,51 54 | 8149886E,-1 55 | -------------------------------------------------------------------------------- /docs/resources/player/control_types.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: material/controller 3 | --- 4 | 5 | # :material-controller: Control Types 6 | 7 | Used by: 8 | 9 | * :material-account-cog: Character Action Parameters (`system/player/data/{id}/{id}_action`) 10 | * `ActionInfo` -> `controlTypeHash_` 11 | 12 | ### List 13 | 14 | {{ read_csv('control_types.csv') }} -------------------------------------------------------------------------------- /docs/resources/player/debuff_ailment_ids.csv: -------------------------------------------------------------------------------- 1 | Name,Category,Hash,Hash (Decimal),Id,`status` Id (?),Sound File/Id 2 | ?,1,`0x3A104097`,`974143639`,0,?,? 3 | Burn,1,`0x10D25D5C`,`282221916`,1,1001,`burn` 4 | Dizzy,1,`0xB6F49156`,`-1225485994`,2,1003,`stun` 5 | Held Under,1,`0xF6533F8E`,`-162316402`,3,1008,`waterprison` 6 | Frostbite,1,`0xCE8AF003`,`-829755389`,4,1005,`frostbite` 7 | Sandtomb,1,`0x47BB7C64`,`1203469412`,5,1006,`sandman` 8 | ?,1,`0xD64D3367`,`-699583641`,6,?,? 9 | ?,1,`0xC0C1D535`,`-1061038795`,7,?,? 10 | Paralysis,1,`0xB1508E3D`,`-1320120771`,8,1007,`paralysis` 11 | Poison,1,`0x5320CE6F`,`1394658927`,9,1000,`poison` 12 | Slow,1,`0x70873185`,`1887908229`,10,1002,`slow` 13 | Darkflame,1,`0x993235CA`,`-1724762678`,11,1011,`darkburn` 14 | ?,1,`0x034CB30B`,`55358219`,12,?,? 15 | ?,1,`0x8EB687C9`,`-1900640311`,13,?,? 16 | ?,1,`0x0F0FC8B5`,`252692661`,14,?,? 17 | Glaciate,1,`0x35ABCF81`,`900452225`,15,1004,`freeze` 18 | Bound,1,`0x62375707`,`1647793927`,16,1012,? 19 | Skill Sealed,1,`0x29635228`,`694374952`,17,1016,`disableability` 20 | SBA Sealed,1,`0x37E7BA96`,`937933462`,18,1017,`disableougi` 21 | Blight,1,`0x61B1700D`,`1639018509`,19,1018,`darkpoison` 22 | Fear,1,`0xF67874A6`,`-159877978`,20,1019,`fear` 23 | Arvess Fermare,1,`0xF816D1FD`,`-132722179`,21,1020,`arvessfermare` 24 | Ethereal Prison,1,`0xC9932485`,`-913103739`,22,?,? 25 | Debuff Extension,1,`0x48841219`,`1216614937`,23,1022,`debufftimeextend` 26 | ATK Down,2,`0xD21EADD5`,`-769741355`, 27 | Def Down,2,`0xE7C92715`,`-406247659`, 28 | ?,2,`0xBD5E4FDD`,`-1117892643`, 29 | Dispel,2,`0xF70DC616`,`-150092266`, 30 | Drain,2,`0xF493ECEE`,`-191632146`, 31 | Max HP Down,2,`0x6680BF9B`,`1719713691`, 32 | -------------------------------------------------------------------------------- /docs/resources/player/debuff_ailment_ids.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: material/account-arrow-down 3 | hide: 4 | - toc 5 | --- 6 | 7 | # :material-account-arrow-down: Debuffs 8 | 9 | !!! warning 10 | 11 | * Many of the hashes/ids are hardcoded in the executable. 12 | * Rows are also present in the `status` [table](../../tables/table_database.md). 13 | 14 | ## Category 15 | *Used by:* 16 | 17 | * :material-graph: [FSM] `BT::AreaEffectAttackAction` (`category_`) 18 | * `0x67AE4C55` - Category 0 19 | * `0x78D65167` - Category 1 20 | * `0x9CD39782` - Category 2 21 | 22 | ## Debuff Type 23 | Used by: 24 | 25 | * :material-xml: [BXM] Used by attack bxms (`type_`) 26 | * :material-graph: [FSM] `BT::AreaEffectAttackAction` (`type_`) 27 | * :material-graph: [FSM] `BT::BadStatusCondition` (`badStatusHash_`) 28 | * :material-graph: [FSM] `BT::Em0102AreaEffectAttackAction` 29 | * :material-graph: [FSM] Anything inheriting from `ShotAttackAction` 30 | 31 | !!! note 32 | 33 | These range from id 1000 to 1022, used by 'status' table 34 | 35 | {{ read_csv('debuff_ailment_ids.csv') }} -------------------------------------------------------------------------------- /docs/resources/player/motions.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: material/motion-play 3 | --- 4 | 5 | # :material-motion-play: Motions (Seq) 6 | 7 | Motions can be broken down into a variety of BXM files located in the `{model_prefix}/{model_id}` folders. 8 | 9 | ``` 10 | {model_id}_{mot_number}_{variant_number}_seq_edit_{type}.bxm 11 | ``` 12 | 13 | !!! example "File Example" 14 | `pl2000_0015_0_seq_edit_effect.bxm` 15 | 16 | * `mot_number` - This will match the number of the motion assigned in the [action file](../player/action_parameter.md) 17 | * `variant_number` - This will be "versions" of the attack that can be utilized depending on the character's progress in their specific gimmick. 18 | An example of this would be Ghandagoza's Raging fist. Depending on the amount of Eternal Rage he has, it will go from 0 (0 stacks) to 4 (10 stacks) 19 | This allows the motion to be used multiple times, but have different `AttackRate`, `BreakRate`, `SpArtsRate` values, as well as other effects or things affected by BXMs 20 | * `type` 21 | * `effect` - Controls visual effects 22 | * `facialmotion` - Controls facial animations 23 | * `flags` - Controls flags needed to be called during the animation (see below for flag values) 24 | * `ik` - Controls inverse kinematics 25 | * `mesh` - Unknown 26 | * `attack` - Controls hitboxes that the animation will spawn, note that these hitboxes will not hit automatically, the amount of times the character can hit and when is controlled by flags 27 | * `se` - Controls sound effects 28 | * `camera` - Controls camera movements 29 | * `speed` - Controls the speed of the ANIMATION. this does not affect VFX, but does affect hitboxes and flags. i am not aware if it affects camera or sound effects 30 | * `cloth` - ? 31 | 32 | --- 33 | 34 | ## Flags File 35 | 36 | ### `Flag0` Values 37 | 38 | ??? abstract "Flags" 39 | 40 | | Bit/Value | Name | 41 | |-----------|------| 42 | | `0 (1)` | Allows walking to cancel the current action 43 | | `1 (2)` | Allows chaining to the Next Action (includes starting an SBA and chaining SBAs) 44 | | `2 (4)` | Allows the player to dodge 45 | | `3 (8)` | Allows Jumping to cancel the current Action 46 | | `4 (16)` | Unknown 47 | | `5 (32)` | Allows the player to hit an additional time, so long as a hitbox is activated after the call. (this should be called for each hit, including the first). **`Config` is set to 1.** An action seems to always be allowed 1 hit per session, so long as no additional hit flags are called. if the action is performed twice in a session, the second+ will not hit. 48 | | `6 (64)` | Unknown 49 | | `7 (128)` | Unknown 50 | | `8 (256)` | Unknown 51 | | `9 (512)` | Unknown 52 | | `10 (1024)` | Unknown 53 | | `11 (2048)` | Unknown 54 | | `12 (4096)` | Unknown 55 | | `13 (8192)` | Allows the player to activate Skills 56 | | `14 (16324)` | Unknown 57 | | `15 (32768)` | Unknown 58 | | `16 (65536)` | Unknown 59 | | `17 (131072)` | Unknown 60 | | `18 (262144)` | Unknown. 61 | | `19 (524288)` | Unknown. 62 | | `20 (1048576)` | Unknown 63 | | `21 (2097152)` | Unknown 64 | | `22 (4194304)` | Unholster/equip weapon. **`Config` is set to 1**. 65 | | `23 (8388608)` | Unknown 66 | | `24 (16777216)` | Unknown 67 | | `25 (33554432)` | Unknown 68 | | `26 (67108864)` | Unknown 69 | | `27 (134217728)` | Unknown 70 | | `28 (268435456)` | Unknown 71 | | `29 (536870912)` | Allows the character to turn while the action is being performed 72 | | `30 (1073741824)` | Closes the window on follow-up attacks. **`Config` is set to 1**, Generally set through `Flag1`, functions fine in `Flag0` 73 | 74 | ### `Flag1` Values 75 | 76 | ??? abstract "Flags" 77 | 78 | | Bit/Value | Name | 79 | |-----------|------| 80 | | `0 (1)` | Unknown. 81 | | `1 (2)` | Unknown. 82 | | `2 (4)` | Cast Buff. **Config is set to 1**. 83 | | `3 (8)` | Unknown. 84 | | `4 (16)` | Calls the FSM associated with the move. **Config is set to 1**. 85 | | `5 (32)` | Unknown. 86 | | `6 (64)` | Unknown. 87 | | `7 (128)` | Consume Skill Charge. **Config is set to 1**. 88 | | `8 (256)` | Unknown. 89 | | `9 (512)` | Unknown. 90 | | `10 (1024)` | Unknown. 91 | | `11 (2048)` | Unknown. 92 | | `12 (4096)` | Unknown. 93 | | `13 (8192)` | Unknown. 94 | | `14 (16324)` | Unknown. 95 | | `15 (32768)` | Unknown. 96 | | `16 (65536)` | Unknown. 97 | | `17 (131072)` | Unknown. 98 | | `18 (262144)` | Perfect Window (does not actually perform the attack, just allows the input) 99 | | `19 (524288)` | Perfect Attack (does not allow input, only calls the action). **`Config` is set to 1.** 100 | | `20 (1048576)` | Unknown. 101 | | `21 (2097152)` | Unknown. 102 | | `22 (4194304)` | Allows blocking. 103 | | `23 (8388608)` | Unknown. 104 | | `24 (16777216)` | Unknown. 105 | | `25 (33554432)` | Unknown. 106 | | `26 (67108864)` | Unknown. 107 | | `27 (134217728)` | Unknown. 108 | | `28 (268435456)` | Unknown. 109 | | `29 (536870912)` | Unknown. 110 | | `30 (1073741824)` | Unknown. 111 | 112 | --- 113 | 114 | *Credits: MidnightAugur* 115 | -------------------------------------------------------------------------------- /docs/resources/quest_id.csv: -------------------------------------------------------------------------------- 1 | Quest/Stage Id,Name 2 | 100000,Prologue - Game Intro 3 | 100001,Chapter 1 - Forest & Quakadile Fight 4 | 100002,Prologue - Repressed Memory 5 | 100003,Chapter 1 - Our Lives Are Linked 6 | 100005,Prologue - Ruffled Wings 7 | 100006,Prologue - Bahamut Fight 8 | 101000,Chapter 1 - Folka 9 | 101001,Chapter 2 - Skyboat Cutscene + The Hills 10 | 101002,Chapter 2 - Zeghard Fortress 11 | 101003,Chapter 3 - Tampeal Mines 12 | 101004,Chapter 3 - Furycane Boss Fight 13 | 101005,Chapter 3 - Mysterious Swordman/Id Fight 14 | 101F00,Chapter 2 - Skyboat Travel (Chapter 2 Start) 15 | 102000,Chapter 4 - Initial Cutscene + Folca Church Cutscene 16 | 102002,Chapter 4 - Ship Chase 17 | 102F00,Chapter 4 - Grandcypher (Chapter 4 Start) 18 | 103001,Chapter 5 - Mt. Neigelith 19 | 103F00,Chapter 5 - Grandcypher (Leutagne Airspace) 20 | 104000,Chapter 6 - Seedhollow 21 | 104001,Chapter 6 - Dahli Island 22 | 104003,Chapter 6 - Id Memory Cutscene after Skyboat Travel 23 | 104F00,Chapter 6 - Grandcypher (Route to Seedhollow) 24 | 104F01,Chapter 6 - Skyboat Travel with Zathba (Route to Dahli Island) 25 | 105001,Chapter 7 - Phondam Isles 26 | 105002,Chapter 7 - Grandcypher Outro Cutscene + Avia Fight 27 | 105F00,Chapter 7 - Grandcypher (Intro) 28 | 105F01,Chapter 7 - Grandcypher (Outro) 29 | 106000,Chapter 8 - Seedhollow 30 | 106001,Chapter 8 - Seedhollow Castle 31 | 106002,Chapter 8 - Angra Mainyu 32 | 106F00,Chapter 8 - Grandcypher (Route to Seedhollow) 33 | 107000,Chapter 9 - Seedhollow 34 | 707001,Chapter 9 - Pillar of Vayoi 35 | 107002,Chapter 9 - Pillar of Vayoi (Intro Cutscene) 36 | 107F00,Chapter 9 - Grandcypher 37 | 108000,Final Chapter - Bahamut Versa 38 | 108001,Final Chapter - Credit Roll 39 | 108002,Final Chapter - After Bahamut Versa (on Grandcypher) 40 | 108F00,Final Chapter - Grandcypher 41 | 200000,A Lingering Regret 42 | 200001,Save the Crustaceans 43 | 200002,Miracle Mushrooms 44 | 200003,Annoying Neighbors 45 | 200100,Results Guaranteed 46 | 200101,Pebbles of Perfection 47 | 200102,Infested Skyways 48 | 200103,Soaring Dream 49 | 200104,Long Time No Fix 50 | 200200,Memories on Ice 51 | 200201,Vulnerable Nights 52 | 200400,The Gourmet Way 53 | 200401,Fresh Material 54 | 201002,A Curious Charm 55 | 201005,Propeller Problems 56 | 201006,Support Our Troops 57 | 201007,On the Tip of My Chip 58 | 201102,En-Raptored 59 | 202002,Hands-On Research 60 | 202005,Forget Me Not 61 | 202006,Everything in Moderation 62 | 202007,Collecting Godstones 63 | 202010,Cleansing the Dead 64 | 203006,Securing the Homestead 65 | 203007,Stuffed Stocks 66 | 203011,Sculpting Fire 67 | 203111,Sculpting Ice 68 | 203211,Sculpting Earth 69 | 203311,Sculpting Wind 70 | 204005,An Eyeful 71 | 204006,Glory Days 72 | 204007,Help Your Fellow Farer 73 | 204011,Dubious Literature 74 | 204012,Oddly Specific Request 75 | 204013,Avenge the Dead 76 | 204106,Futureproof Trading 77 | 204107,Presentproof Investing 78 | 204113,Frozen Menace 79 | 205000,How Does Siero Do It? 80 | 205001,Astral Research Notes 81 | 205002,Be Legendary 82 | 210220,The Forbidden Spirit 83 | 210221,Icey Interior 84 | 210223,To Whirl Again 85 | 210225,Trowel and Error 86 | 210227,Family Reporting 87 | 210228,Wolves at the Door 88 | 210229,Aid from Afar 89 | 210420,Bug Hunt 90 | 210421,A Barrold of My Own 91 | 210423,Red-Hot Seller 92 | 210425,Out of Serpentine Spite 93 | 210427,Violent Requiem 94 | 210428,Wrath of the Sword Veil 95 | 211021,"Eye for an Eye, Quake for a Dile" 96 | 211023,Loathsome Wings 97 | 211025,Smith Smarter 98 | 211027,Cooling Bones 99 | 211030,Magimorphosis 100 | 211121,Sensitive Technology 101 | 211123,Soul in the Machine 102 | 211125,Goopy Research 103 | 211130,Hidden Lesson 104 | 211230,Into the Unknown 105 | 211330,Classroom Science 106 | 211430,Expecting the Expected 107 | 211530,Windy Memories 108 | 212021,First Step is the Hardest 109 | 212024,"Wreck, Reduce, Recycle" 110 | 212026,Iced Water Supplies 111 | 212030,Fiery Commerce 112 | 212031,Nightmare of a Shadow 113 | 212130,Light and Shadow 114 | 212230,Study with Care 115 | 212330,Mother Water 116 | 212430,From the Soil 117 | 212530,As the Wind Blows 118 | 212630,Squishy Lies the Crown 119 | 213021,"Try, Try Again" 120 | 213022,Strong as Hell 121 | 213024,A Vision of Gates 122 | 213026,A Vision of Vitality 123 | 213032,A Vision of Sequestration 124 | 213033,A Vision of Fortification 125 | 213034,A Vision of Dread 126 | 214024,Degoop the Farm 127 | 214026,An Eye for Business 128 | 214027,Dynamic Design 129 | 214030,Within the Flickering Flame 130 | 214033,Symbol of the Hordes 131 | 214034,Regret and Repentance 132 | 214035,In Defense of the City 133 | 214130,To Illuminate All Creation 134 | 214135,Arts Long Lost 135 | 214230,Voids Beyond 136 | 214330,"Absolute, Absolute Zero" 137 | 214430,Earth's Bounty 138 | 214530,Shifting Winds 139 | 214630,Slime After Slime 140 | 290002,Save the Crustaceans Part Deux 141 | 290003,Save the Crustaceans the Third 142 | 290004,Save the Crustaceans Reloaded 143 | 290005,Save the Crustaceans Beyond 144 | 290006,Save the Crustaceans Neo 145 | 290007,Save the Crustaceans Returns 146 | 290008,Save the Crustaceans Prime 147 | 290009,Save the Crustaceans New Dawn 148 | 290010,Save the Crustaceans Chronicles 149 | 290011,Save the Crustaceans Origins 150 | 290012,Save the Crustaceans Supremacy 151 | 290013,Save the Crustaceans Infinity 152 | 290014,Save the Crustaceans Rises 153 | 290015,Save the Crustaceans Finale 154 | 300000,I've Got Your Back 155 | 300002,Family Is Everything 156 | 300003,"Down, but Not Out" 157 | 300004,It's Just a Phase 158 | 300005,Words Left Unspoken 159 | 300006,Uninvited Guests 160 | 300007,Warm Threads 161 | 300008,Ludwin and Hans 162 | 300009,Vane the Squire 163 | 300010,Spark of Change 164 | 300011,Seedhollow's Armed Forces 165 | 300012,The Deceitful Nobleman 166 | 300013,The Hottest Fishing Spot 167 | 300014,Narmaya's Chosen Path 168 | 300015,One-Man Army 169 | 300016,A Modest Gift 170 | 300017,The Woman Who Pines for Death 171 | 300018,An Artist's Pain 172 | 300019,Confronted by the Past 173 | 300021,Wind 174 | 300022,Ticking Time Bomb 175 | 300023,A Dragon in Sheep's Clothing 176 | 301000,Pushing Forward 177 | 301002,Wraithwing Eggs 178 | 301003,Straighten Up and Fly Right 179 | 301004,Change of Heart 180 | 301005,So Long as We Draw Breath 181 | 301006,Crystal of Fortification 182 | 301007,Searching for Happiness 183 | 301008,Learning Together 184 | 301009,Lost Knight 185 | 301010,The Corps's Biggest Test 186 | 301011,A Little Help from the Shadows 187 | 301012,Soupstock's Trap 188 | 301013,The Votes Are In 189 | 301014,A Greater Whole 190 | 301015,A Duel for the Ages 191 | 301016,Crimson and Ebony 192 | 301017,Vestiges 193 | 301018,Sibling Squabble 194 | 301019,Day of Reckoning 195 | 301021,Illusion 196 | 301022,Righteous Execution 197 | 301023,A Clash of the Titans 198 | 401301,Make Our Skies Safe Again 199 | 401303,Worried about Papa 200 | 401305,Fort Fumigation 201 | 401306,Defeat-*wheeze*-Goblin Boss 202 | 401310,Bash the Goblin Hordes 203 | 401311,Guard Our Hometown 204 | 401315,Protect Our Woods 205 | 401316,Tomorrow's Prayers 206 | 402301,Rilla Done Did It 207 | 402302,Golemology 101: Desert Golems 208 | 402304,On the Front Lines 209 | 402306,I See a Bloody Vision 210 | 402308,Sweep the Volcano 211 | 402309,The Saga Continues: Fire 212 | 402310,Dagger Really Done Did It 213 | 402312,The Saga Continues: Ice 214 | 402313,Saga Grande: The Beginning 215 | 402314,"Spare the Rod, Spoil the Valley" 216 | 402315,Eye Have a Problem 217 | 402316,Only You Can Prevent Forest Flyers 218 | 403201,Delts of Our Lives 219 | 403202,Hide and Chic 220 | 403301,Rule the Skies 221 | 403302,The Juice of Jealousy 222 | 403303,Unthinning the Troops 223 | 403307,Protect the Rep 224 | 403308,Collector's Digest 225 | 403309,"Looming Tower, Leering Eye" 226 | 403311,I See a Flaming Vision 227 | 403312,Drumsticks au Griffin 228 | 404101,Wings of Antiquity 229 | 404204,Dark Refrain 230 | 404309,No One Likes Leftovers 231 | 404310,I See a Deathly Vision 232 | 404311,The Next Hot Topic 233 | 404313,Golemology 102: Volcanic Golems 234 | 404315,Seeds of Trouble 235 | 404316,A Bone to Peak 236 | 404317,Absolutely No Trespassers! 237 | 405101,License to Thrill 238 | 405201,Saga Illustrated: The Beginning 239 | 405202,Learning from the Past 240 | 405203,Saga Illustrated: Inferno 241 | 405205,To Know the Unknowable 242 | 405206,General Investigation: Gallanza 243 | 405207,General Investigation: Maglielle 244 | 405208,General Investigation: Id 245 | 405302,Wings of Conflagration 246 | 405303,Wings of Upheaval 247 | 405304,Wings of the Storm 248 | 405305,Wings of Rime 249 | 405308,Gulp... So These Are the Rumored Monsters 250 | 405309,Assault Formation! 251 | 405310,Great Goblins of Fire 252 | 405311,Shedding Light on the Pillar 253 | 406101,Back to the Fated Land 254 | 406323,I See a Chromatic Vision 255 | 406324,Revenge of the Hordes 256 | 406325,Hope in the Machine 257 | 406327,Hallowed Be Thy Ground 258 | 406330,The Saga Continues: Earth 259 | 406331,The Saga Continues: Wind 260 | 406332,Saga Illustrated: Crystal 261 | 406333,Saga Illustrated: Hellfire 262 | 406334,The Saga Continues: Silver 263 | 406335,Saga Illustrated: Veil 264 | 406337,Id Bears Repeating 265 | 406338,Saga Grande: Happily Ever After 266 | 406351,Roost and Reign 267 | 406352,Boss Done Wants It Did 268 | 406353,Know Your Enemy 269 | 406354,Serenity Upon the Mount 270 | 406355,Golemology 103: Forest Golems 271 | 406356,A New Breed 272 | 406357,"Death, Taxes, and Goblins" 273 | 406358,Icy Eye on the Holy Prize 274 | 406359,Rumble in the Desert 275 | 406360,I See a Grim Vision 276 | 406361,Slimepede 277 | 406364,Throw a Smith a Bone 278 | 406365,Armor Is Best Served Cold 279 | 406366,A Heated Rivalry 280 | 407101,The Final Report 281 | 407301,Blazing Trial 282 | 407302,Grounded Trial 283 | 407303,Stormy Trial 284 | 407304,Frigid Trial 285 | 407305,Worst Vacation Ever 286 | 407306,Trade Barriers 287 | 407307,Melting Pot of Hostility 288 | 407308,Banquet of Ice and Corpses 289 | 407309,For a Freer Folca 290 | 407310,A Quest of Fire and Earth 291 | 407311,A Quest of Frost and Storm 292 | 407312,The Wolf and the Veil 293 | 407313,Calamity Incarnate 294 | 407314,As Fierce as the Silver Wolf 295 | 407315,Memories of Fire 296 | 407316,Thunderbolts and Lightning 297 | 407317,Into the Abyss 298 | 407318,The Tale of Bahamut's Rage 299 | 407319,The Automagod Strikes Back 300 | 407320,The Final Vision 301 | 407321,Zero 302 | 407322,Lock Horns 303 | 407323,Dark Swordman's Nightmare 304 | 407324,Pageant of Might and Magic 305 | 407325,Zathba's 'Volunteers' 306 | 500A00,Folka (endgame) 307 | 501003,Seedhollow (endgame) 308 | 5F0001,Grandcypher (endgame) 309 | 601000,Practice 310 | 602000,Score Attack 311 | 603000,Time Attack 312 | 710000,Days of Our Zegagrande - The Automagod Strikes Back 313 | 710001,Days of Our Zegagrande - The Final Vision 314 | 720018,Lyria's Journal/Empty? -------------------------------------------------------------------------------- /docs/resources/quest_ids.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: material/sword-cross 3 | --- 4 | 5 | # Quest IDs 6 | 7 | :material-lightbulb: Data Version: `1.3.x` 8 | 9 | List is interpolated using `system/table/text/text_stage.msg` 10 | 11 | !!! note 12 | A quest should have: 13 | 14 | * [BaseInfo](./quests_layouts/quest_base_info.md) file, with quest details 15 | * FSM Files (`system/fsm/quest`), normally linked by the BaseInfo file 16 | * An entry in `quest/BaseInfoFolderList` 17 | * Entries in various quest related [tables](../tables/table_database.md) 18 | * Optionally an entry in the [streaming prefetch](./formats/stpr.md) file for which assets are preloaded. 19 | 20 | * `1xxxxx` = Main Quest 21 | * `2xxxxx` = Challenge/Side Quest 22 | * `3xxxxx` = Fate Episode 23 | * `4xxxxx` = Multiplayer/Quest Counter 24 | * `5xxxxx` = Towns/Lobbies 25 | * `6xxxxx` = Dummy/Practice 26 | * `7xxxxx` = Short Story/Misc 27 | 28 | {{ read_csv('quest_id.csv') }} -------------------------------------------------------------------------------- /docs/resources/quests_layouts/placement.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: material/graph 3 | --- 4 | 5 | # :material-graph: Placement Info File 6 | 7 | Placement files (`layout/p{phaseId}/placement_*.msg`) determine how phases (and their stages) should be setup and behave (enemies, routes, treasures & more) - treat them as a [scene graph](https://en.wikipedia.org/wiki/Scene_graph). 8 | 9 | ## Placement Info 10 | 11 | ### `groupType_` 12 | 13 | Determines the type of `Group` object. 14 | 15 | ``` 16 | 0 - stage::placement::Group 17 | 1 - stage::placement::ObjectsSet 18 | 2 - stage::placement::EnemySet 19 | 3 - stage::placement::MobVillageNpcGroup 20 | 4 - stage::placement::TreasureSet 21 | 5 - stage::placement::NpcChatGroup 22 | 6 - stage::placement::ObjectMaker 23 | 7 - stage::placement::PlayerCharaNpcGroup 24 | 8 - stage::placement::VyrnAssist 25 | ``` 26 | 27 | ### `memberType_` 28 | 29 | Determines the type of `Member` object. Directly affects the values expected in `values_`. 30 | 31 | ``` 32 | 0 = stage::placement::Member 33 | 1 = stage::placement::Enemy 34 | 2 = stage::placement::BreakObject 35 | 3 = stage::placement::Effect 36 | 4 = stage::placement::Zone 37 | 5 = stage::placement::Behavior 38 | 6 = stage::placement::Player 39 | 7 = stage::placement::EventNpc 40 | 8 = stage::placement::Behavior (#2?) 41 | 9 = stage::placement::MobVillageNpc 42 | 10 = stage::placement::Route 43 | 11 = stage::placement::Point 44 | 12 = stage::placement::Behavior (#3?) 45 | 13 = stage::placement::Interact 46 | 14 = stage::placement::EntityAccessor 47 | 15 = Empty? 48 | 16 = stage::placement::Treasure 49 | 17 = stage::placement::PlayerNpc 50 | 18 = stage::placement::SideQuestNpc 51 | 19 = stage::placement::LittleSnipper 52 | 20 = stage::placement::PartnerCharaNpc 53 | ``` 54 | 55 | ??? "Reverse-Engineering Details" 56 | 57 | Signature of the table (1.3.1): 58 | 59 | `48 8D 0D ?? ?? ?? ?? E8 ?? ?? ?? ?? 83 3D ?? ?? ?? ?? ?? 0F 85 ?? ?? ?? ?? 48 8D 05 ?? ?? ?? ?? 48 89 05 ?? ?? ?? ?? 48 8D 05 ?? ?? ?? ?? 48 89 05 ?? ?? ?? ?? 48 8D 05 ?? ?? ?? ?? 48 89 05 ?? ?? ?? ?? 48 8B 8D` 60 | 61 | Static array of 21 elems (size 0x38 each) is created linking to vtables 62 | 63 | ``` 64 | vtable: 65 | - dtor @ 0x00 66 | - dtor2 @ 0x08 67 | - createObj @ 0x10 68 | - getVtableUnk @ 0x18 69 | - unk @ 0x20 70 | - unk @ 0x28 71 | ``` 72 | 73 | ## Operation Detail 74 | 75 | ### `action_` 76 | 77 | From 0 to 20 78 | 79 | TODO 80 | 81 | ??? "Reverse-Engineering Details" 82 | 83 | Table signature (1.3.1) `55 56 57 53 48 81 EC ?? ?? ?? ?? 48 8D AC 24 ?? ?? ?? ?? 48 C7 45 ?? ?? ?? ?? ?? C7 45` 84 | 85 | Handled at `4A 8B 4C 30 ?? 48 85 C9 0F 84` 86 | 87 | ### `what_` 88 | 89 | From 0 to 3 90 | 91 | * 0 = None 92 | * 1 = Controller (`stage::placement::Controller`) 93 | * 2 = Group (inheriting from/or `stage::placement::Group`) 94 | * 3 = Member (inheriting from/or `stage::placement::Member`) 95 | 96 | ??? "Reverse-Engineering Details" 97 | 98 | Table signature (1.3.1) `48 8D 05 ?? ?? ?? ?? 48 89 05 ?? ?? ?? ?? 48 8D 05 ?? ?? ?? ?? 48 89 05 ?? ?? ?? ?? 48 8D 0D ?? ?? ?? ?? 48 8D 15 ?? ?? ?? ?? 48 89 15 ?? ?? ?? ?? 48 89 0D ?? ?? ?? ?? 48 89 05 ?? ?? ?? ?? 48 8D 0D ?? ?? ?? ?? 48 8D 15 ?? ?? ?? ?? 48 89 15 ?? ?? ?? ?? 48 89 0D ?? ?? ?? ?? 48 89 05 ?? ?? ?? ?? 48 8D 05 ?? ?? ?? ?? 48 8D 0D ?? ?? ?? ?? 48 89 0D ?? ?? ?? ?? 48 89 05 ?? ?? ?? ?? 48 8D 0D ?? ?? ?? ?? E9 ?? ?? ?? ?? CC CC CC CC CC CC CC CC 41 56` 99 | 100 | Handled at `4A 8B 4C 20 ?? 48 85 C9 0F 84 ?? ?? ?? ?? 48 8B 01` -------------------------------------------------------------------------------- /docs/resources/quests_layouts/quest_base_info.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: material/chat-question 3 | --- 4 | 5 | # :material-chat-question: Quest Base Info 6 | 7 | Quest Base Info files (`quest/{quest_id}/baseinfo.msg`) provides the basic & critical information about any given quest. 8 | 9 | !!! note 10 | The quest id should be present in `quest/BaseInfoFolderList.msg`. 11 | 12 | | Attribute | Type | Description | 13 | |--------------------------|------------|----------------------------------------------------| 14 | | `category_` | `int` | Quest category. 1st hex digit of a quest id, `category_` should be `4` if the quest id is `407320`. Category in general denotes the type of quest. 15 | | `subCategory_` | `int` | Quest sub-category. 2nd & 3rd hex digit of a quest id, `subCategory_` should be `32` (decimal) if the quest id is `720009`. 16 | | `serialNumber_` | `int` | Serial Number. Last 3 hex digits of a quest id, `serialNumber_` should be `800` (decimal) if the quest id is `407320`. 17 | | `difficultyHash_` | `string` | Difficulty name. Directly controls the difficulty of enemies in general. Maps to `quest_difficulty` [table](../../tables/table_database.md) (hashed). 18 | | `lv_` | `int` | Unknown. Seems to affect enemy levels. 19 | | `time_` | `int` | Quest timer in seconds. 20 | | `lostTime_` | `int` | Unknown. 21 | | `clearableTimes_` | `int` | Unknown. 22 | | `mobIdHash_` | `string` | Display mob name. Maps to `mob` [table](../../tables/table_database.md). 23 | | `sortNo_` | `int` | Sorting order. Greater number means further down in the quest listing. 24 | | `main_` | [Main](#main) | Main story quest information (quest category has to be `1`). 25 | | `challenge_` | [Challenge](#challenge) | Challenge (side-quest) quest information (quest category has to be `2`). 26 | | `fateEpisode_` | [FateEpisode](#fate-episode) | Fate Episode quest information (quest category has to be `3`). 27 | | `multi_` | [Multi](#multi) | Multiplayer quest information (quest category has to be `4`). 28 | | `shortStory_` | [ShortStory](#short-story) | Short Story quest information (quest category has to be `7`). 29 | | `occurrenceList_` | [Occurrence][](#occurrence) | Unknown. 30 | | `orderList_` | ?[] | Unknown. 31 | | `successList_` | ?[] | Unknown. 32 | | `failureText_{}` | `TXT_QT_PARTYDEATH` | Message to show on failure. 33 | | `reward_` | Reward | Reward information. 34 | | `fsmDataList` | [FSMData](#fsmdata) | List of FSM files linked to this quest. 35 | | `targetList_` | [Target](#target) | List of targets (current objectives) for the quest. 36 | | `subMissions_` | [SubMission](#sub-mission) | List of sub-goals/missions and their rewards. 37 | | `sectionSortListGuid_` | ?[] | List of sections. **`guid_` array should directly match `guid` in `sectionlist.json`.** 38 | | `lotData_` | `string` | Unknown. Maps to `treasure_chest` [table](../../tables/table_database.md). 39 | | `rewardRank_` | `int` | Reward Rank. **Very Important** as it controls the rewards available per lot in the `reward_lot` [table](../../tables/table_database.md) - reminder that enemy drops also point to the reward table so rank can also change their death drop. 40 | | `placementsInfo_` | [PlacementInfo](#placement-info) | Information about items that can be picked during the quest. 41 | | `exPlacementFilesInfo_` | ?[] | List of placement files, possibly maps to `layout/p{phaseNumber}/placement_{type_name}_{suffix}`. 42 | | `startEventInfo_` | ? | Unknown. 43 | | `endEventInfo_` | ? | Unknown. 44 | | `isConsumeAppend_` | `bool` | Unknown. 45 | | `consumeCounts_` | `int[]` | Unknown. 46 | | `clearTimeMax_` | `int` | Unknown. In seconds. 47 | | `clearTimeMin_` | `int` | Unknown. In seconds. 48 | | `resetTownTreasureType_` | `int` | Unknown. 49 | | `specialRegulationInfo_` | `?[]` | Unknown. Possibly never used. 50 | | `actionDropRewardList_` | `?[]` | Unknown. Used in a few story & fate episode quests, possibly unique rewards for certain things. 51 | | `preLoadQuestFSMFileInfos_` | `PreLoadQuestFSMFileInfo[]` | List of FSMs to pre-load, possibly optional. `index` is the same as suffix unless `names` is provided, which can point to fsms that are not quest fsms. Use `.yml` extension regardless of actual extension. 52 | | `preLoadVoiceEventFileInfos_` | `PreLoadVoiceEventFileInfo[]` | List of voice files to pre-load (sound, lipsync). 53 | | `overrideAttribute_` | `int` | Unknown. 54 | | `isBroadcastVersion_` | `bool` | Unknown. 55 | 56 | --- 57 | 58 | ### Main 59 | 60 | !!! note 61 | Only when quest category is `1`. 62 | 63 | | Attribute | Type | Description | 64 | |------------------------------|------------|----------------------------------------------------| 65 | | `type_` | `int` | Unknown. 66 | | `rcommendedCombatPower_{}` | `int[]` | Recommended PWR per story difficulty 67 | | `isChapterSelectPartyKeep_` | `bool` | Unknown. 68 | 69 | ### Challenge 70 | 71 | !!! note 72 | Only when quest category is `2`. 73 | 74 | | Attribute | Type | Description | 75 | |--------------------------|------------|----------------------------------------------------| 76 | | `uuidHashs_{}` | `ulong` | Unknown. 77 | | `phaseNos_{}` | `int` | Phase number, remember to convert it to hex - i.e `3072` = `pC00`. 78 | | `isConsecutive_` | `bool` | Whether it can be replayed? 79 | 80 | ### Fate Episode 81 | 82 | !!! note 83 | Only when quest category is `3`. 84 | 85 | | Attribute | Type | Description | 86 | |--------------------------|------------|----------------------------------------------------| 87 | | `isStartEventTown_` | `bool` | Whether the event starts in town. 88 | | `isEndEventTown_` | `bool` | Whether the event ends in town. 89 | | `townType_` | `int` | Unknown. 90 | | `hasStartEvent_` | `bool` | Unknown. 91 | | `hasEndEvent_` | `bool` | Unknown. 92 | | `hasStartTelop_` | `bool` | Unknown. 93 | | `hasClearTelop_` | `bool` | Unknown. 94 | | `gameCategory_` | `int` | Unknown. 95 | | `location_` | `string` | Unknown. 96 | | `targetDispInfo_` | TargetDispInfo | `textHash_` is quest target/description, `type_` is unknown. 97 | 98 | 99 | ### Multi 100 | 101 | !!! note 102 | Only when quest category is `4`. 103 | 104 | | Attribute | Type | Description | 105 | |--------------------------|------------|----------------------------------------------------| 106 | | `strengthValue_` | `int` | Strength value. 107 | | `rcommendedCombatPower_` | `int` | Display value of recommended PWR. 108 | | `islandId_` | `string` | Island name where the quest takes place. Used mainly for displaying the name, maps to `island` [table](../../tables/table_database.md). 109 | | `gameCategory_` | `int` | Unknown. 110 | | `multiQuestType_` | `int` | Unknown. 111 | | `location_` | `string` | Display location name where the quest takes place. Used mainly for displaying the location, maps to `location` [table](../../tables/table_database.md). 112 | | `enemyIds_[]` | `ObjId[]` | Display enemies in the quest. [Object ID](../re/obj_id.md). 113 | | `enemyNum_[]` | `int[]` | Display enemies number in the quest. 114 | | `overwriteStatusAndReward_[]` | `int[]` | Unknown. 115 | | `min_` | `int` | Unknown. 116 | | `max_` | `int` | Unknown. 117 | | `standard_` | `int` | Unknown. 118 | | `targetDispInfo_` | TargetDispInfo | `textHash_` is quest target/description, `type_` is unknown. 119 | | `hasPrepareArea` | `bool` | Unknown. 120 | | `isQuestStartFromBossAppear_` | `bool` | Unknown. 121 | | `isUltimateParameterUse_` | `bool` | Unknown. 122 | | `isBossRush_` | `bool` | Whether the quest is a boss rush. **Must be used for boss rushes**, controls whether to move on to other sections, otherwise quest ends early/gets stuck. 123 | 124 | ### Short Story 125 | 126 | !!! note 127 | Only when quest category is `7`. 128 | 129 | | Attribute | Type | Description | 130 | |--------------------------|------------|----------------------------------------------------| 131 | | `isPhaseMoveDelete_` | `bool` | Unknown. 132 | 133 | --- 134 | 135 | ### Occurrence 136 | 137 | | Attribute | Type | Description | 138 | |--------------------------|------------|----------------------------------------------------| 139 | | `type_` | `int` | Id Type `1` = Quest ID, `2` = Phase ID 140 | | `id_` | `int` | Id Value 141 | | `count_` | `int` | Count 142 | 143 | ### Reward 144 | 145 | !!! note 146 | Strings are hashed and then mapped to the `reward` [table](../../tables/table_database.md). 147 | 148 | | Attribute | Type | Description | 149 | |--------------------------|------------|----------------------------------------------------| 150 | | `first_` | `string` | Reward on first clear. 151 | | `every_` | `string` | Reward on every clear. 152 | | `rankReward[]` | `string` | Rewards (depending on rank). 153 | 154 | ### FSMData 155 | 156 | | Attribute | Type | Description | 157 | |--------------------------|------------|----------------------------------------------------| 158 | | `name_` | `string` | Unused. 159 | | `hash_` | `ulong` | Hash of the fsm file. **Used as a unique identifier**. 160 | | `suffix_` | `int` | Suffix - maps this to `system\fsm\quest\quest_{quest_id}_{suffix}_fsm_ingame.msg`. 161 | 162 | ### Target 163 | 164 | List of available current objectives in the quest. 165 | 166 | | Attribute | Type | Description | 167 | |--------------------------|------------|----------------------------------------------------| 168 | | `label_` | `string` | **Unique key of the target**. 169 | | `textLabel_` | `string` | Localized text. 170 | | `type_` | `int` | Type of objective display value. 171 | | `id_` | `int` | Id (when applicable), i.e Enemy [Object Id](../re/obj_id.md). 172 | | `count_` | `int` | Count. 173 | | `canFail_` | `bool` | Whether this target/objective is failable. 174 | | `isDisplay_` | `bool` | Whether this is displayed. 175 | | `idIndex_` | `int` | Unknown. 176 | | `udsId_` | `int` | Unknown. 177 | 178 | The value `canFail_` perhaps doesn't have the best name. It seems rather more 179 | accurate to say it acts as a `shouldFail` signal. When set to true, then a 180 | failure will be triggered for this objective once the condition determined by 181 | this objective's `type_` attribute has been met. 182 | 183 | `isDisplay_` doesn't seem to have any hard rules, either. For a quest's three 184 | typical objectives, `isDisplay_` is usually set to true, except for when using 185 | either `type_` for displaying text strings, ironically. Some objectives do have 186 | hidden objectives, however, which can be used to trigger additional rewards. 187 | 188 | `type_` can take on many different (integer) values to indicate a multitude of 189 | different quest objectives. Known values are enumerated in the table below. Note 190 | that for many or most of these, the `id_` field isn't used and is expected to be `0`. 191 | 192 | | `type_=` | Description | 193 | |----------------|---------------------------------------------------------------------------| 194 | | `0` | No effect. Used to displays textual objective strings only (as guidance). | 195 | | `1` | Appears Unused. | 196 | | `2` | Completion time, full quest. Triggers after `count_` seconds elapsed. Usually used when `canFail_=true` to trigger objective's failure. | 197 | | `3` | Collect Entity/Defeat Enemy `id_`, `count_` times. | 198 | | `4` | Unsure. | 199 | | `5` | Destroy battleship installations, minimum of `count_`. | 200 | | `6` | Appears Unused. | 201 | | `7` | HP Percentage exceeds `count_` (defend-the-base) quests. For this value, `count_` is a float between `0.` and `1.` | 202 | | `8` | Unsure. Perhaps some sort of internal timer for delays? Only used once. | 203 | | `9` | Appears Unused. | 204 | | `10` | Activate any skill, minimum of `count_` times. | 205 | | `11` | Appears Unused. | 206 | | `12` | Skybound Art Usage, minimum of `count_` times. | 207 | | `13` | Appears Unused. | 208 | | `14` | Link Attacks Count, minimum (plus 1). For "do N link attacks", set `count_` to `N+1`. | 209 | | `15` | Critical Condition Count, maximum (plus 1). For "do not enter critical more than N times", set `count_` to `N+1`. | 210 | | `16..18` | Appears Unused. | 211 | | `19` | Number of foe waves (defend-the-base quests), minimum of `count_`. Used with `canFail_=false`. | 212 | | `20` | Appears Unused. | 213 | | `21` | Update/Refresh objective text. Used for specific fate story quests. Used with `canFail_=false`, `isDisplay_=false`. | 214 | | `22` | Appears Unused. | 215 | | `23` | LinkTime Entry Count, minimum of `count_` times. | 216 | | `24` | Number of Full Bursts triggered, minimum of `count_` times. | 217 | | `25` | Defeats/Kills via ether cannon, minimum of `count_`. | 218 | | `26` | Defeats/Kills via thrown object, minimum of `count_`. | 219 | | `27` | Appears Unused. | 220 | | `28` | Obtain/Destroy Entities or Destructible Parts. `count_` set to minimum quantity (usually just `1`). | 221 | | `29` | Status Anomalies Received, maximum (plus 1). `count_=N+1`, and `id_` set to status effect's global ID. | 222 | | `30` | Completion Time, after defeat of a foe (plus 1). For "defeat Y within 5 minutes after defeating X", set `count_=301`. | 223 | | `31` | Appears Unused. | 224 | | `32` | Unsure. | 225 | | `33..37` | Appears Unused. | 226 | | `38` | Attacks Dodged, minimum of `count_` times. NOT perfect dodges. | 227 | | `39` | Appears Unused. | 228 | | `40` | Attacks Guarded, minimum of `count_` times. NOT perfect guards. | 229 | | `41` | Attacks Perfect-Guarded, minimum of `count_` times. | 230 | | `42` | Defeats/Kills via Dimension Warp, minimum of `count_`. (Angra Mainyu). | 231 | | `43` | Defeat/Negate light orb via ether cannon, minimum of `count_` times. | 232 | 233 | 234 | ### Sub Mission 235 | 236 | | Attribute | Type | Description | 237 | |--------------------------|------------|----------------------------------------------------| 238 | | `target_` | `string` | Maps directly to the label/key in [target](#target). 239 | | `reward_` | `string` | Reward for completing this sub-mission. Maps to `reward` [table](../../tables/table_database.md). 240 | | `firstReward_` | `string` | First reward for completing this sub-mission. Maps to `reward` [table](../../tables/table_database.md). 241 | 242 | ### Placement Info 243 | 244 | | Attribute | Type | Description | 245 | |-----------------------------|------------|----------------------------------------------------| 246 | | `treasureMaxCount_` | `int` | Max number of chests. 247 | | `treasureMinCount_` | `int` | Min number of chests. 248 | | `pickMaxCount_` | `int` | Max number of 'pick'/ground items (blue shine). 249 | | `pickMinCount_` | `int` | Min number of 'pick'/ground items (blue shine). 250 | | `searchItemMaxCount_` | `int` | Unknown. 251 | | `searchItemMinCount_` | `int` | Unknown. 252 | | `archiveMaxCount_` | `int` | Max number of 'archives'/note/paper items. 253 | | `archiveMinCount_` | `int` | Min number of 'archives'/note/paper items. 254 | | `multiQuestCoinMaxCount_` | `int` | Unknown. 255 | | `multiQuestCoinMinCount_` | `int` | Unknown. 256 | 257 | -------------------------------------------------------------------------------- /docs/resources/re/api.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: material/api 3 | --- 4 | 5 | # API 6 | 7 | The game reaches to some very basic API when booting up the game. 8 | 9 | --- 10 | 11 | ## HTTP Client Setup 12 | 13 | Setup through [`ISteamHTTP::CreateHTTPRequest`](https://partner.steamgames.com/doc/api/ISteamHTTP#CreateHTTPRequest) 14 | 15 | ### Base URL 16 | 17 | ``` 18 | https:// # Protocol 19 | gameapi-relink.granbluefantasy.jp/v1 # Domain 20 | api # Type 21 | sys/get_terms # Endpoint 22 | ``` 23 | 24 | Example: `https://gameapi-relink.granbluefantasy.jp/v1/api/index.php/sys/get_terms` 25 | 26 | --- 27 | 28 | ### Request Headers 29 | 30 | Setup through [`ISteamHTTP::SetHTTPRequestHeaderValue`](https://partner.steamgames.com/doc/api/ISteamHTTP#SetHTTPRequestHeaderValue) 31 | 32 | ??? abstract "`App-Info` (Mandatory)" 33 | 34 | `{}/{}.{}.{} ({}) language/{} region/{} platform/{}"` 35 | 36 | * `{1}` - Game 37 | * Always `relink` 38 | * `{2/3/4}` - Version 39 | * Version from [User Attributes](user_attributes.md), so `major.minor.patch` 40 | * `{5}` - Platform String 41 | * `STEAM` 42 | * `PLAYSTATION_4` 43 | * `PLAYSTATION_5` 44 | * `{6}` - Language Value 45 | * `1` = en 46 | * `{7}` - Region Value 47 | * `{8}` - Platform Value 48 | * 1 = PS4 49 | * 2 = PS5 50 | * 3 = STEAM 51 | 52 | !!! example 53 | `relink/1.1.1 (STEAM) language/1 region/0 platform/3"` 54 | 55 | ??? abstract "`Signature` (Mandatory)" 56 | 57 | Key: `9xcleSD8efksogsz` (Steam), `id83dfsSlvg2Lo` (PS4) 58 | 59 | input: Current timestamp ms i.e 1711640120000 to string 60 | 61 | Signature = `Base64(input + ";" + ToString(HMACSHA256(input, key)))` 62 | 63 | --- 64 | 65 | ### Errors 66 | 67 | Signature lasts for one minute or so, otherwise error (403): 68 | 69 | ```json 70 | [[1], [4]] 71 | ``` 72 | 73 | --- 74 | 75 | ## Endpoints 76 | 77 | ### [POST] `sys/get_terms` 78 | 79 | When correct: 80 | ```json 81 | [[0], [0,1,1]] 82 | ``` 83 | 84 | --- 85 | 86 | ### [POST] `sys/get_news` 87 | 88 | !!! example "Sample Result (json)" 89 | ```json 90 | [[0],[0,7,[[7,"This Just In!","Ver. 1.1.0 is now available!\nThis patch features a new quest addition, bug fixes, and other updates.","cmn_imgnews_0110_00",2,"https:\/\/relink.granbluefantasy.jp\/en\/news\/detail?id=uudl9p4so98",1],[6,"Ready for The Final Vision?","O \"proud\" skyfarers, victors of the highest order, Supreme Primarch Sandalphon\nhas a request for you. Join him in a battle against the ultimate foe, Lucilius!","cmn_imgnews_0110_03",2,"https:\/\/relink.granbluefantasy.jp\/en\/news\/detail?id=uudl9p4so98",1],[5,"New Emote Set: Let's Chat!","Come on, it's time to express yourself!\nLiven up the party with 3 new unique emotes that all characters can use!","cmn_imgnews_0110_01",2,"https:\/\/store.steampowered.com\/app\/2782160\/GRANBLUE_FANTASY_Relink\/",1],[4,"Item Packs On Sale Now!","Gear up for your adventure in Zegagrande with helpful, powerful sigils!\nThese packs also come with resources for enhancing characters and gear!\nSo get stronger and crush your foes!","cmn_imgnews_0110_02",2,"https:\/\/store.steampowered.com\/dlc\/881020\/GRANBLUE_FANTASY_Relink\/",1],[3,"Upgrade Pack On Sale Now!","Get all the goodies of the Special Edition with this upgrade pack!\nNow's the chance to pick up even more Relink goodness!\n*This product is intended for those who have purchased the digital Standard Edition.","cmn_imgnews_0110_04",2,"https:\/\/store.steampowered.com\/app\/2799850\/GRANBLUE_FANTASY_Relink\/",0],[2,"Color Packs On Sale Now!","Get more character colors with three additional color packs!\n*Color packs 1, 2 and 3 can be purchased individually or as a set of three.\n*The three-pack set is also included in the Deluxe Edition, Collector's Edition, and Digital Deluxe Edition.\n*The Special Edition only includes color packs 2 and 3.","cmn_imgnews_0110_05",2,"https:\/\/store.steampowered.com\/dlc\/881020\/GRANBLUE_FANTASY_Relink\/",0],[1,"Official Site Information","Check the official site for the latest information on Granblue Fantasy: Relink!","cmn_imgnews_0110_00\t",2,"https:\/\/relink.granbluefantasy.jp\/en\/",0]]]] 91 | ``` 92 | 93 | --- 94 | 95 | ## Playlog Endpoints 96 | 97 | Playlog is used for quest reports/telemetry. 98 | 99 | It is fired on: 100 | 101 | * Quest clear (after the results screen) 102 | * Quest abandon (immediately on abandon) 103 | 104 | Url is `https://main-playlog-relink.granbluefantasy.jp/playlog/` 105 | 106 | ### [POST] `main` 107 | 108 | [:material-code-json: Sample Request Data](playlog_request.json) 109 | 110 | !!! note 111 | Steam ID is hashed, it is not possible to refer back to the original steam profile that sent the result. Refer to generation below. 112 | 113 | Pseudo-code of uid generation: 114 | 115 | ```csharp 116 | string key = "kdu7JfwdKDu3"; 117 | string str = "STEAM:" + id; // id is SteamID64 118 | for (int i = 0; i < 17; i++) 119 | str = HMACSHA256ToStr(str, key); // HMACSHA256 str + convert to hex string (lowercase) 120 | ``` -------------------------------------------------------------------------------- /docs/resources/re/hashes.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: octicons/hash-16 3 | --- 4 | 5 | # Hashes 6 | 7 | The vast majority of the game and its executable uses hashed strings. This makes any reverse-engineering work tedious as strings cannot always be recovered, and decompilation work can be complicated without a hash list of sorts. 8 | 9 | Hashes can be found just about everywhere - in table files, in the executable as compile-time constants, inside model files, `prfb`/`matb`... and more. 10 | 11 | --- 12 | 13 | ## Algorithm 14 | 15 | The algorithm is XXHash32 with some odd twist. 16 | 17 | C# code for it can be found [here](https://github.com/Nenkai/GBFRDataTools/blob/master/GBFRDataTools.Hashing/XXHash32Custom.cs). 18 | 19 | #### Tester 20 | 21 | An empty string `""` is always equal to `887AE0B0` / `B0 E0 7A 88`. 22 | 23 |
24 | 31 | 32 | 33 |
34 | 35 | --- 36 | 37 | ## Hash List 38 | 39 | You can grab a zipped hash list [here](hashlist.7z) (updated January 26th 2025). 40 | 41 | It contains: 42 | 43 | * Hashes for the majority of english words 44 | * Hashes for most strings for all game files gathered with `strings2` 45 | * Hashes for most strings gathered from the executable with `strings2` 46 | * Hashes for most strings gathered from NierAutomata.exe with `strings2` 47 | * Hashes for strings such as `object_` => `Object`, useful for UI file component properties 48 | 49 | -------------------------------------------------------------------------------- /docs/resources/re/hashlist.7z: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nenkai/relink-modding/19ebf8a75928241d506d6531af421e73d30d13a9/docs/resources/re/hashlist.7z -------------------------------------------------------------------------------- /docs/resources/re/mechanics/gem_mix.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: material/party-popper 3 | --- 4 | 5 | # :material-party-popper: Sigil Synthesis Grand Success 6 | 7 | !!! tip 8 | 9 | Handled by `ui::fsm::action::MixGem` fsm component. Signature: `55 41 57 41 56 41 55 41 54 56 57 53 48 81 EC ? ? ? ? 48 8D AC 24 ? ? ? ? 48 83 E4 ? 48 89 E3 48 89 AB ? ? ? ? 48 C7 85 ? ? ? ? ? ? ? ? 4C 8B 2D`. 10 | 11 | ## Execution 12 | 13 | Sigil Synthesis has an unexplained feature where the game will randomly award a gem with a maxed level rather than the default level (which is 11). When this happens, a 'Grand Success' in place of a 'Great Success' is shown. 14 | 15 | !!! tip 16 | 17 | Internally: 18 | 19 | * Sigil Synthesis = Gem Mix 20 | * Sigil = Gem 21 | * Trait = Skill 22 | * Ticket = Knicknack Voucher 23 | 24 | For how this works; the game combines total level of all skills inserted. Lv11+Lv11 & Lv11+Lv11 = 44. 25 | 26 | It is then used as a key into `gem_mix_success` [table](../../../tables/table_database.md). 27 | 28 | * The first column is the weight chance for regular (great) success. 29 | * The second column is the weight chance for grand success. 30 | 31 | All skills from both gems are put into an array of 4 skills then the list is shuffled. 32 | The first two are taken. That's the new gem. 33 | 34 | If it's a grand success, assign the maximum possible level for the gem. Otherwise default level. 35 | 36 | Cost is determined from `gem_mix_rupi` and `gem_mix_ticket` tables, also based on total combined skill level for both gems. Current rupies & tickets are deducted based on that. 37 | 38 | --- 39 | 40 | ## Chance List 41 | 42 | Total Sigil Level to Chance 43 | ``` 44 | 44 (4x Lvl.11) = 45% 45 | 46 = 48% 46 | 48 = 51% 47 | 50 = 54% 48 | 52 = 57% 49 | 54 = 60% 50 | 56 = 70% 51 | 58 = 75% 52 | 60 (4x Lv.15) = 85% 53 | ``` 54 | 55 | ## Siero 56 | 57 | Siero can show three messages on the right side before synthesis: 58 | 59 | * `Some solid picks you got there.\nReady whenever you are!` (`TXT_YOROZU_COMP_PROB_LOW`) 60 | * `I've got a good feeling about this!\nHope it turns out great!` (`TXT_YOROZU_COMP_PROB_MID`) 61 | * `Oh my! I think we've got a real\nwinner here! I've got goosebumps!` (`TXT_YOROZU_COMP_PROB_HIGH`) 62 | 63 | The second and third ones are chosen if the weight/percentage for the current combined sigil level (column 2 of `gem_mix_success`) is above the last two columns in the `constant` table, respectively. In 1.3, the second message has weight 5400 (54%) and the third message is 7000 (70%). 64 | 65 | Otherwise, the first one (default) is picked. 66 | 67 | --- 68 | 69 | ## Other useful signatures 70 | 71 | * GemManager::GetGemInfoFromSlotId(__int64 a1, _QWORD *a2, unsigned int a3) - `41 56 56 57 55 53 48 83 EC ? 44 89 C3 49 89 D6 48 89 CF 48 81 C1 ? ? ? ? 48 8B 87 ? ? ? ? FF 50 ? 39 D8 0F 84 ? ? ? ? 89 D8 C1 E8 ? 89 D9 C1 E9 ? 0F B6 D3 48 BE ? ? ? ? ? ? ? ? 48 31 D6 48 BA ? ? ? ? ? ? ? ? 48 0F AF F2 0F B6 EF 48 31 F5 48 0F AF EA 0F B6 C0 48 31 E8 48 0F AF C2 48 31 C8 48 0F AF C2 48 23 87 ? ? ? ? 48 8B 8F ? ? ? ? 48 8B B7 ? ? ? ? 48 89 C2 48 C1 E2 ? 48 8B 54 16 ? 48 39 CA 0F 84 ? ? ? ? 39 5A ? 74 ? 48 01 C0 48 8B 34 C6 31 C0 66 0F 1F 84 00 ? ? ? ? 48 39 F2 74 ? 48 8B 52 ? 39 5A ? 75 ? 48 39 CA 74 ? 48 8B 42 ? 48 85 C0 74 ? 8B 50 ? 8B 6F` 72 | * GetGemMixSuccessForGemSlots - `41 56 56 57 55 53 48 83 EC ? 4D 89 CE 44 89 C3` 73 | * RandomManager::GetRandomValue - `55 56 57 48 83 EC ? 48 8D 6C 24 ? 48 C7 45 ? ? ? ? ? 8B 81 ? ? ? ? 83 F8` 74 | * GetGemMixRupiCostForGemSlots - `E8 ? ? ? ? 89 43 ? C6 44 24` 75 | * GetSigilListForGemMix - `E8 ? ? ? ? 48 8D 4B ? 4C 8B 43` - Returns a struct containing a count and the list of sigil hashes 76 | * GetDefaultLevelForGem - `E8 ? ? ? ? 45 85 FF 74 ? 4C 89 E9` 77 | * GetMaxPossibleLevelForGem - `56 57 55 53 8B 71 ? 21 D6 4C 8B 41 ? 4C 8B 49 ? 48 89 F0 48 C1 E0 ? 49 8B 5C 01 ? B8 ? ? ? ? 4C 39 C3 0F 84 ? ? ? ? 39 53 ? 74 ? 48 01 F6 49 8B 34 F1 66 0F 1F 84 00 ? ? ? ? 48 39 F3 0F 84 ? ? ? ? 48 8B 5B ? 39 53 ? 75 ? 4C 39 C3 0F 84 ? ? ? ? 48 8B 5B` 78 | * CreateNewGem - `55 41 57 41 56 41 55 41 54 56 57 53 48 81 EC ? ? ? ? 48 8D AC 24 ? ? ? ? 48 C7 45 ? ? ? ? ? 41 89 D5 8B 79` 79 | * SetGemTrait- `55 41 57 41 56 56 57 53 48 83 EC ? 48 8D 6C 24 ? 48 C7 45 ? ? ? ? ? 45 89 CE 45 89 C7 89 D3` 80 | * GetTotalGemLevelFromGemSlotId - `56 57 53 48 83 EC ? 89 D3 48 89 CE 48 81 C1 ? ? ? ? 48 8B 86 ? ? ? ? FF 50 ? 89 C1 31 C0 39 D9 0F 84 ? ? ? ? 89 D9 C1 E9 ? 41 89 D9 41 C1 E9 ? 44 0F B6 C3 48 BA ? ? ? ? ? ? ? ? 4C 31 C2 49 B8 ? ? ? ? ? ? ? ? 49 0F AF D0 0F B6 FF 48 31 D7 49 0F AF F8 0F B6 C9 48 31 F9 49 0F AF C8 4C 31 C9 49 0F AF C8 48 23 8E ? ? ? ? 4C 8B 86 ? ? ? ? 48 8B B6 ? ? ? ? 48 89 CA 48 C1 E2 ? 48 8B 54 16 ? 4C 39 C2 74 ? 39 5A ? 74 ? 48 01 C9 48 8B 0C CE 66 66 66 66 66 66 2E 0F 1F 84 00 ? ? ? ? 48 39 CA 74 ? 48 8B 52 ? 39 5A ? 75 ? 4C 39 C2 74 ? 48 8B 4A ? 48 85 C9 74 ? 31 C0 81 39 ? ? ? ? 74` 81 | * AddOrRemoveRupies - `55 41 56 56 57 53 48 81 EC ? ? ? ? 48 8D AC 24 ? ? ? ? 48 C7 45 ? ? ? ? ? 48 89 CE 89 D1` 82 | * AddOrRemoveItem - `55 41 57 41 56 41 55 41 54 56 57 53 48 81 EC ? ? ? ? 48 8D AC 24 ? ? ? ? 48 83 E4 ? 48 89 E3 48 89 AB ? ? ? ? 48 C7 85 ? ? ? ? ? ? ? ? 45 85 C0 0F 84` -------------------------------------------------------------------------------- /docs/resources/re/mechanics/rotd.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: material/dice-1 3 | --- 4 | 5 | # Roll of the Die 6 | 7 | !!! quote "Sigil Description" 8 | 9 | "*Grants a chance for normal attacks to deal 1x-4x damage.* 10 | 11 | *The 4x multiplier ignores damage cap for a max of 999,999 damage. Otherwise attacks only deal 1 damage.*" 12 | 13 | Percentages depends on [`skill_status`](../../../tables/table_database.md) (Key: `SKILL_157_00`) 14 | 15 | On attack: 16 | 17 | * `1%` = Damage Multiplier = **4x**, Damage Cap set to = 999999 18 | * `5%` = Damage Multiplier = **3x** 19 | * `18%` = Damage Multiplier = **2x** 20 | * `26%` = Damage Multiplier = **1x** 21 | * `50%` = 1 Damage 22 | 23 | Average damage multiplier = `0.79x` 24 | 25 | !!! tip "Function Handler Pattern" 26 | 27 | ``` 28 | 41 57 41 56 41 55 41 54 56 57 55 53 48 81 EC ? ? ? ? C5 78 29 A4 24 ? ? ? ? C5 78 29 9C 24 ? ? ? ? C5 78 29 94 24 ? ? ? ? C5 78 29 4C 24 29 | ``` 30 | 31 | Damage & Cap appear to be set separately. 32 | ```c 33 | *(_DWORD *)(_R14 + 208) = 1;// Damage 34 | ... 35 | *(_DWORD *)(_R14 + 612) = 999999; // Cap 36 | ``` 37 | -------------------------------------------------------------------------------- /docs/resources/re/misc.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: material/wrench 3 | --- 4 | 5 | # :material-wrench: Misc 6 | 7 | * SBA Chain Chance (3 seconds) is hardcoded. Signature: `48 B8 ? ? ? ? ? ? ? ? 48 89 83 ? ? ? ? 48 C7 83 ? ? ? ? ? ? ? ? 48 8B 05` 8 | * Chest Claim Time period (30s) - Signature: `48 B8 ? ? ? ? ? ? ? ? 48 89 87 ? ? ? ? C5 FA 10 05` 9 | * Color Pack 10 Face Sigil render call - Signature: `49 8B 45 ? 4C 39 F0 0F 84 ? ? ? ? 4C 89 E9` 10 | 11 | --- 12 | 13 | * `ui::component::ControllerResultReward`'s vtable @ 0xE8 increments quest repeat by 1 on close. 14 | * `ui::fsm::condition::ResultRetryCountCheck::Execute` checks quest repeat count < 10 (hardcoded) -------------------------------------------------------------------------------- /docs/resources/re/networking.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: material/network 3 | --- 4 | 5 | # :material-network: Networking 6 | 7 | ## Encryption 8 | 9 | Packets are encrypted before being passed to Steam's [ISteamNetworkingSockets](https://partner.steamgames.com/doc/api/ISteamnetworkingSockets) 10 | 11 | OpenSSL is used, with EVP_CIPHER = EVP_chacha20. 12 | 13 | Relevant functions: 14 | 15 | * `EVP_EncryptInit`/ `EVP_EncryptUpdate`/`EVP_EncryptFinal` 16 | * `EVP_DecryptInit`/ `EVP_DecryptUpdate`/`EVP_DecryptFinal` 17 | 18 | 19 | ### Keys 20 | Key (32 bytes): 21 | ``` 22 | 0F 8B 00 17 F6 19 90 48 9D 96 90 61 75 1B 18 58 23 | D0 02 27 F1 B2 2C 25 A8 5D 6E 42 DA 52 65 AF B0 24 | ``` 25 | 26 | IV (12 bytes): 27 | ``` 28 | 4E 15 6B 43 8F B4 88 F2 D6 71 BC A3 29 | ``` 30 | 31 | ### Useful Signatures 32 | 33 | * SteamSockets::EncryptAndSendMessage: `55 41 57 41 56 41 55 41 54 56 57 53 48 83 EC ? 48 8D 6C 24 ? 48 C7 45 ? ? ? ? ? 45 89 CE 4C 89 C6 41 89 D7 48 89 CF` 34 | * ProcessIncomingPackets: `55 41 57 41 56 41 55 41 54 56 57 53 48 81 EC ? ? ? ? 48 8D AC 24 ? ? ? ? C5 F8 29 BD ? ? ? ? C5 F8 29 B5 ? ? ? ? 48 83 E4 ? 48 89 E3 48 89 AB ? ? ? ? 48 C7 85 ? ? ? ? ? ? ? ? 48 89 C8` 35 | * ReadPacketMaybe: `55 41 57 41 56 41 54 56 57 53 48 83 EC ? 48 8D 6C 24 ? C5 F8 29 75 ? 48 C7 45 ? ? ? ? ? 48 89 D6 48 89 CB` 36 | * EncryptInit: `B8 ? ? ? ? E8 ? ? ? ? 48 2B E0 48 8B 44 24 ? C7 44 24 ? ? ? ? ? 48 89 44 24 ? E8 ? ? ? ? 48 83 C4 ? C3 CC CC CC CC CC CC CC B8` 37 | * DecryptInit: `B8 ? ? ? ? E8 ? ? ? ? 48 2B E0 48 8B 44 24 ? C7 44 24 ? ? ? ? ? 48 89 44 24 ? E8 ? ? ? ? 48 83 C4 ? C3 CC CC CC CC CC CC CC 48 89 74 24` -------------------------------------------------------------------------------- /docs/resources/re/obj_id.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: material/format-list-numbered 3 | --- 4 | 5 | # Obj IDs 6 | 7 | *Not to be confused with [Model IDs](../model_ids.md)* 8 | 9 | --- 10 | 11 | Object IDs are actual IDs of any object in the game. This also applies to PlatinumGames games. 12 | 13 | They are categorized as such: 14 | 15 | ``` 16 | 0x1xxxx - pl 17 | 0x2xxxx - em 18 | 0x3xxxx - wp 19 | 0x4xxxx - et 20 | 0x5xxxx - ef 21 | 0x7xxxx - it 22 | 0x9xxxx - sc 23 | 0xCxxxx - bg 24 | 0xExxxx - bh 25 | 0xFxxxx - ba 26 | 0x100xxxx - fp 27 | 0x101xxxx - fe 28 | 0x102xxxx - fn 29 | 0x103xxxx - we 30 | 0x104xxxx - wn 31 | 0x10Axxxx - np 32 | 0x10Bxxxx - tr 33 | 0x10Cxxxx - bt 34 | ``` 35 | 36 | Where the last `xxxx` is the actual ID for every category. 37 | 38 | !!! tip 39 | These IDs can be seen inside `objread` files. 40 | -------------------------------------------------------------------------------- /docs/resources/re/save_units.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: material/content-save 3 | --- 4 | 5 | # :material-content-save: Save Units 6 | 7 | Save units are part of the save data. Every type of data is separated by a type number. 8 | 9 | !!! warning 10 | 11 | Many types may be missing still. 12 | 13 | ## UserDataManager 14 | ``` 15 | - 1104 16 | - 1105 17 | - 1102 18 | - 1101 19 | - 1103 20 | - 1106 21 | - 1107 22 | - 1114 23 | - 1108 24 | - 1109 25 | - 1110 26 | - 1111 27 | - 1112 28 | - 1113 29 | - 4601 30 | - 4602 31 | - 4603 32 | - 4604 33 | - 4605 34 | - 4606 35 | - 4607 36 | 37 | - 1151 38 | 39 | - 1201 40 | - 1202 41 | - 1203 42 | - 1204 43 | - 1205 44 | - 1206 45 | - 1207 46 | ``` 47 | 48 | ## CharacterManager 49 | 50 | ``` 51 | Unit ids 10000 through 10039 52 | - 1301 53 | - 1315 54 | - 1302 55 | - 1316 56 | - 1317 57 | - 1318 58 | - 1303 59 | - 1304 60 | - 1305 61 | - 1307 62 | - 1321 63 | - 1322 64 | 65 | - 1402 66 | - 1403 67 | - 1404 68 | 69 | - 1501 70 | - 1502 71 | - 1503 72 | 73 | // unit ids altered? this value * 1000 and * 10000 74 | - 1601 75 | - 1602 76 | - 1603 77 | - 1604 78 | - 1605 79 | - 1606 80 | - 1607 81 | 82 | - 1308 83 | - 1309 84 | - 1310 85 | - 1311 86 | - 1312 87 | - 1313 88 | - 1314 89 | 90 | unit ids 20000 through (20000 + (40 * 15)) 91 | 92 | - 3001 93 | - 3002 94 | - 3003 95 | - 3004 96 | 97 | - 1402 98 | - 1403 99 | - 1404 100 | 101 | 7 Unit ids 10100/10200 102 | - 3101 103 | - 3102 104 | - 3103 105 | - 3104 106 | - 3105 107 | - 3106 108 | - 3107 109 | - 3108 110 | 111 | Then 10100/10200 * 100 112 | 113 | - 3401 114 | - 3402 115 | - 1701 116 | - 1702 117 | 118 | - 1501 119 | - 1502 120 | - 1503 121 | 122 | // unit ids altered? this value * 1000 and * 10000 123 | - 1601 124 | - 1602 125 | - 1603 126 | - 1604 127 | - 1605 128 | - 1606 129 | - 1607 130 | ``` 131 | 132 | ## WeaponManager 133 | ``` 134 | // No unit id 135 | - 2801 136 | 137 | // loop going on for these, possibly main id 138 | - 2802 139 | - 2803 140 | - 2814 141 | - 2815 142 | - 2804 143 | - 2805 144 | - 2806 145 | - 2807 146 | - 1701 147 | - 1702 148 | - 2816 149 | - 2813 150 | 151 | 152 | // unit ids 0 through 511 153 | - 7401 154 | - 7402 155 | - 7403 156 | ``` 157 | 158 | ## ScenarioManager 159 | ``` 160 | // unit ids 0 through 64 161 | - 4202 162 | - 4201 163 | ``` 164 | 165 | ## AbilityManager 166 | ``` 167 | // unit ids 0 through 640 168 | - 3903 169 | - 3904 170 | ``` 171 | 172 | ## GemManager 173 | ``` 174 | // unit ids unk 175 | - 2701 176 | 177 | // Loop? 5100 entries 178 | - 2702 179 | - 2703 180 | - 2704 181 | - 2706 182 | - 2707 183 | - 1701 184 | - 1702 185 | 186 | // Loop? 900 entries 187 | - 8001 188 | - 8002 189 | 190 | - 2708 191 | ``` 192 | 193 | ## ItemManager 194 | ``` 195 | // unit ids unk 196 | // Loop, 300 entries 197 | - 1801 198 | - 1802 199 | - 1803 200 | - 1804 201 | - 1807 202 | 203 | - 1805 204 | 205 | - 2001 206 | 207 | // Loop 999 entries, id increment 100? 208 | - 2002 209 | - 2003 210 | // extra main id for these? 211 | - 1901 212 | - 1902 213 | - 1903 214 | - 1904 215 | - 2004 216 | 217 | - 2101 218 | // Loop 5000 entries 219 | - 2102 220 | - 2103 221 | - 2104 222 | - 2105 223 | - 1701 224 | - 1702 225 | 226 | - 6801 227 | 228 | - 1806 229 | ``` 230 | 231 | ## PartyManager 232 | ``` 233 | - 2201/103000 234 | - 2202/103000 235 | - 2203/103000 236 | - 2201/103001 237 | - 2202/103001 238 | - 2203/103001 239 | - 2201/103002 240 | - 2202/103002 241 | - 2203/103002 242 | - 2201/103003 243 | - 2202/103003 244 | - 2203/103003 245 | 246 | // unit ids 104000, 104001, 104002, 104003 247 | - 3003 248 | - 3004 249 | - 1402 250 | - 1403 251 | - 1404 252 | 253 | - 2401/10400 254 | - 2402/10400 255 | 256 | // unit ids 10500 through 105xx? 257 | - 2301 258 | - 2302 259 | 260 | // then same entities as i.e 104000, with main multiplied by 10 then + 1/2/3? 261 | ``` 262 | 263 | ## QuestSystem 264 | ``` 265 | - 2501 266 | - 2502 267 | - 2503 268 | - 2504 269 | - 2505 270 | - 2506 271 | - 2507 272 | - 2508 273 | - 2509 274 | 275 | - 2530 276 | 277 | - 2510 278 | - 2511 279 | - 2512 280 | - 2513 281 | - 2514 282 | - 2515 283 | - 2516 284 | - 2517 285 | - 2518 286 | - 2519 287 | - 2520 288 | - 2521 289 | - 2522 290 | 291 | - 2550 292 | - 2551 293 | - 2552 294 | - 2553 295 | - 2554 296 | - 2555 297 | 298 | - 2560 299 | - 2561 300 | - 2562 301 | - 2563 302 | 303 | - 2570 304 | - 2571 305 | - 2572 306 | - 2573 307 | - 2574 308 | - 2575 309 | - 2576 310 | - 2577 311 | 312 | - 2580 313 | - 2581 314 | - 2582 315 | - 2583 316 | ``` 317 | 318 | ## FateEpisodeDataManager 319 | ``` 320 | // unit ids 0 thru 800 321 | - 3501 322 | - 3502 323 | ``` 324 | 325 | ## UINetworkManager 326 | ``` 327 | - unit id 10600, 10700, 10800,, 10900 328 | 329 | - 4502 330 | - 4503 331 | - 4504 332 | - 4505 333 | - 4506 334 | - 4507 335 | 336 | - 4601 337 | - 4602 338 | - 4603 339 | - 4604 340 | - 4605 341 | - 4606 342 | - 4607 343 | 344 | - 4701 345 | - 4702 346 | - 4703 347 | - 4704 348 | - 4705 349 | - 4706 350 | - 4707 351 | - 4708 352 | 353 | // unit * 100? 354 | - 4801 355 | - 4802 356 | - 4803 357 | - 4804 358 | 359 | - 4901 360 | - 5001 361 | - 5002 362 | - 5003 363 | 364 | ## misc 365 | - 7204 366 | - 7201 367 | - 7202 368 | - 7203 369 | ``` 370 | 371 | ## FilterSortDataManager 372 | ``` 373 | // unit id unk 374 | - 3601 375 | - 3701 376 | 377 | // 32 entries 378 | - 3801 379 | - 3802 380 | ``` 381 | 382 | ## CycleTradeManager 383 | ``` 384 | // Unit unk 385 | - 4004 386 | 387 | // 1024 entries? 388 | - 4001 389 | - 4002 390 | - 4003 391 | 392 | - 4101 393 | - 4102 394 | - 4103 395 | - 4104 396 | - 4105 397 | - 4106 398 | - 4107 399 | ``` 400 | 401 | ## TutorialManager 402 | ``` 403 | // unit id 0 thru 300 404 | - 5901 405 | - 5902 406 | 407 | // unit id 0 thru 300 408 | - 6001 409 | - 6002 410 | ``` 411 | 412 | ## IslandManager 413 | ``` 414 | // unit ids 0 thru 32 415 | - 6101 416 | - 6102 417 | ``` 418 | 419 | ## UIShopManager 420 | ``` 421 | // unit id 0 thru 32 422 | - 6901 423 | - 6902 424 | ``` 425 | 426 | ## CycleGachaManager 427 | ``` 428 | // unit id 0 thru 9 429 | - 7001 430 | - 7002 431 | - 7003 432 | ``` 433 | 434 | ## ui::unlock::Manager 435 | ``` 436 | // unit id 0 thru 128 437 | - 7101 438 | - 7102 439 | - 7103 440 | ``` 441 | 442 | ## UIInformationDialogManager 443 | ``` 444 | - 7303 445 | - 7304 446 | - 7305 447 | - 7306 448 | - 7307 449 | - 7308 450 | - 7309 451 | - 7310 452 | 453 | // 64 entries 454 | - 7301 455 | - 7302 456 | 457 | // 64 entries 458 | - 7351 459 | - 7352 460 | ``` 461 | 462 | ## Communication Manager 463 | ``` 464 | // unit ids 0 thru 29 465 | - 6201 466 | - 6202 467 | 468 | // loop 100 unit entries? 469 | - 6301 470 | - 6302 471 | 472 | // loop 20? 473 | - 7502 474 | - 7501 475 | - 7503 476 | - 7504 477 | 478 | - 7701/0/1/2/3 479 | - 7702/0/1/2/3 480 | - 7703/0/1/2/3 481 | ``` 482 | 483 | ## cycle::utility::Random 484 | ``` 485 | - 7601 486 | ``` 487 | 488 | ## CycleArchiveManager 489 | ``` 490 | // unit id 0 thru 100 491 | - 7901 492 | - 7902 493 | ``` 494 | 495 | ## CycleWordListManager 496 | ``` 497 | // unit id 0 thru 150 498 | - 8101 499 | - 8102 500 | ``` 501 | 502 | ## CycleMainStoryManager 503 | ``` 504 | // unit id 0 thru 260 505 | - 8201 506 | - 8202 507 | ``` 508 | 509 | ## CycleBGMManager 510 | ``` 511 | // unit id 0 thru 100 512 | - 8301 513 | - 8302 514 | ``` 515 | 516 | ## CyclePictureBookCharaManager 517 | ``` 518 | // unit id 0 thru 50 519 | - 8401 520 | - 8402 521 | ``` 522 | 523 | ## CyclePictureBookEnemyManager 524 | ``` 525 | // unit id 0 thru 150 526 | - 8501 527 | - 8502 528 | ``` 529 | 530 | ## CyclePictureBookPendulumManager 531 | ``` 532 | // unit id 0 thru 10 533 | - 8601 534 | - 8602 535 | ``` 536 | 537 | ## CycleTipsManager 538 | ``` 539 | // unit id 0 thru 500 540 | - 8701 541 | - 8702 542 | ``` 543 | 544 | ## CommandListManager 545 | ``` 546 | // unit id 0 thru 800 547 | - 8801 548 | - 8802 549 | ``` 550 | 551 | ## PlaylogManager 552 | ``` 553 | - 8901 554 | - 8902 555 | - 8903 556 | - 8904 557 | - 8905 558 | - 8906 559 | - 8907 560 | - 8908 561 | - 8909 562 | - 8912 563 | - 8913 564 | - 8910 565 | - 8911 566 | - 8914 567 | ``` -------------------------------------------------------------------------------- /docs/resources/re/user_attributes.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: material/information-variant 3 | --- 4 | 5 | # User Defined Params 6 | 7 | User defined params is a 16 bytes blob resource stored in the executable. 8 | 9 | It holds: 10 | 11 | * 0x00 - The language (4 bytes) 12 | * 0x04 - Application version (3 bytes, patch/minor/major) 13 | * 0x08 - 4 bytes (unused) 14 | * 0x0C - Number of granite tile sets to load - 0 means load all (`version minor * 3` so `v1.1` = load `0.gts` through 6) 15 | 16 | Minor in particular is often used in the code as a feature/system unlock flag (which, do not work without the required files). 17 | 18 | ## PS Version 19 | 20 | On the PS versions, user attributes are located in the `param.sfo` instead. 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /docs/resources/sigil_gem_ids.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: simple/rubygems 3 | --- 4 | 5 | # Sigil/Gem IDs 6 | 7 | :material-lightbulb: Data Version: `1.3.x` 8 | 9 | List is interpolated using `system/table/text/text.msg` 10 | 11 | {{ read_csv('sigil_id.csv') }} -------------------------------------------------------------------------------- /docs/resources/skill_id.csv: -------------------------------------------------------------------------------- 1 | Id,Name,Id Hash 2 | SKILL_000_00,ATK,50079A1C 3 | SKILL_001_00,HP,F372F096 4 | SKILL_002_00,(Empty),7279E478 5 | SKILL_003_00,Critical Hit Rate,8D78A19B 6 | SKILL_004_00,Stun Power,CEB700EE 7 | SKILL_005_00,Enmity,3F488339 8 | SKILL_006_00,Stamina,2FC8FBFF 9 | SKILL_007_00,(Empty),9B90820C 10 | SKILL_008_00,Charged Attack DMG,1C360C63 11 | SKILL_009_00,Linked Together,3FEC5F80 12 | SKILL_010_00,(Empty),6D5ACD5C 13 | SKILL_011_00,(Empty),98ACE800 14 | SKILL_012_00,Throw DMG,8D078597 15 | SKILL_013_00,Critical Hit DMG,C0979A17 16 | SKILL_014_00,Weak Point DMG,6B694D6D 17 | SKILL_015_00,(Empty),54401E12 18 | SKILL_016_00,(Empty),3D718078 19 | SKILL_017_00,Combo Finisher DMG,A7A45F28 20 | SKILL_018_00,Concentrated Fire,B360801D 21 | SKILL_019_00,(Empty),0E592AC4 22 | SKILL_020_00,DMG Cap,DC584F60 23 | SKILL_021_00,(Empty),6CD9DBB8 24 | SKILL_022_00,(Empty),48069644 25 | SKILL_023_00,(Empty),CAC6AFF2 26 | SKILL_024_00,Combo Booster,F17850B9 27 | SKILL_025_00,(Empty),2982C763 28 | SKILL_026_00,(Empty),FE02D02F 29 | SKILL_027_00,Tyranny,71F11A9B 30 | SKILL_028_00,Lucky Charge,C35B111B 31 | SKILL_029_00,Injury to Insult,4F1A3683 32 | SKILL_030_00,Overdrive Assassin,A9D17F55 33 | SKILL_031_00,Break Assassin,AC9674C1 34 | SKILL_032_00,(Empty),A254AB8C 35 | SKILL_033_00,(Empty),BC90C6A4 36 | SKILL_034_00,(Empty),998A78CD 37 | SKILL_035_00,(Empty),BEB4D1E9 38 | SKILL_036_00,Garrison,E6CDBA9C 39 | SKILL_037_00,(Empty),06F7CEDE 40 | SKILL_038_00,(Empty),709B29B6 41 | SKILL_039_00,(Empty),F8F6FD8E 42 | SKILL_040_00,(Empty),E338C0E0 43 | SKILL_041_00,(Empty),687202B5 44 | SKILL_042_00,(Empty),D5A33083 45 | SKILL_043_00,(Empty),130111F4 46 | SKILL_044_00,Stout Heart,A1A8E39D 47 | SKILL_045_00,Guts,E69A4694 48 | SKILL_046_00,Poison Resistance,973B49AF 49 | SKILL_047_00,Burn Resistance,7C84A6B3 50 | SKILL_048_00,(Empty),E22E33A8 51 | SKILL_049_00,(Empty),81A3BBB4 52 | SKILL_050_00,(Empty),C7848E9E 53 | SKILL_051_00,Sandtomb Resistance,D54F8CA7 54 | SKILL_052_00,Glaciate Resistance,FB572681 55 | SKILL_053_00,(Empty),F2FDA35D 56 | SKILL_054_00,Dizzy Resistance,3759A5B9 57 | SKILL_055_00,Paralysis Resistance,2242921F 58 | SKILL_056_00,(Empty),D62AC108 59 | SKILL_057_00,Skill Sealed Resistance,50B453DD 60 | SKILL_058_00,SBA Sealed Resistance,CFB48782 61 | SKILL_059_00,(Empty),BAA020D8 62 | SKILL_060_00,Improved Guard,0AA20846 63 | SKILL_061_00,Guard Payback,3C2B57B0 64 | SKILL_062_00,(Empty),E0A7A887 65 | SKILL_063_00,Improved Dodge,8B3BF60C 66 | SKILL_064_00,Dodge Payback,7C2E4D64 67 | SKILL_065_00,Improved Healing,9389CC06 68 | SKILL_066_00,Regen,6085DA25 69 | SKILL_067_00,Drain,7CCFF74F 70 | SKILL_068_00,Autorevive,95F3FA86 71 | SKILL_069_00,Quick Cooldown,318D12E9 72 | SKILL_070_00,Cascade,05F2ECDC 73 | SKILL_071_00,(Empty),C1F72F43 74 | SKILL_072_00,Uplift,B5FF9FD3 75 | SKILL_073_00,Potion Hoarder,24883AF3 76 | SKILL_074_00,(Empty),E833D96A 77 | SKILL_075_00,(Empty),3DDA90FA 78 | SKILL_076_00,(Empty),7EDE8000 79 | SKILL_077_00,Low Profile,DC607D75 80 | SKILL_078_00,Provoke,6018372B 81 | SKILL_079_00,Fast Learner,F687C5EF 82 | SKILL_080_00,Rupie Tycoon,C86F3082 83 | SKILL_081_00,(Empty),B9C865C1 84 | SKILL_082_00,(Empty),2816B618 85 | SKILL_083_00,Skilled Assault,EAE321EB 86 | SKILL_084_00,(Empty),F69D1076 87 | SKILL_085_00,Aegis,E0ABFDFE 88 | SKILL_086_00,Slow Resistance,A2FA9685 89 | SKILL_087_00,Firm Stance,B6E31F76 90 | SKILL_088_00,Blight Resistance,9702860F 91 | SKILL_089_00,(Empty),935D84E7 92 | SKILL_090_00,(Empty),C1DC2F4A 93 | SKILL_091_00,(Empty),A1E395FA 94 | SKILL_092_00,(Empty),10810867 95 | SKILL_093_00,(Empty),C7B4AAB4 96 | SKILL_094_00,Steady Focus,0053599E 97 | SKILL_095_00,(Empty),1D02DF7D 98 | SKILL_096_00,Steel Nerves,1470F860 99 | SKILL_097_00,(Empty),9189DE53 100 | SKILL_098_00,(Empty),323F6C09 101 | SKILL_099_00,(Empty),4B400B01 102 | SKILL_100_00,Supplements,3F2C482E 103 | SKILL_101_00,(Empty),734C58D1 104 | SKILL_102_00,(Empty),5209463B 105 | SKILL_103_00,Natural Defenses,0EAD65E0 106 | SKILL_104_00,Nimble Defense,09AA7DB5 107 | SKILL_105_00,(Empty),7D99DBD6 108 | SKILL_106_00,Nimble Onslaught,D2C8E10A 109 | SKILL_107_00,Precise Resilience,29B292A8 110 | SKILL_108_00,(Empty),52692E71 111 | SKILL_109_00,Precise Wrath,7EDD69D0 112 | SKILL_110_00,Life on the Line,8F502F0D 113 | SKILL_111_00,Quick Charge,84078CB0 114 | SKILL_112_00,(Empty),D0A1C6E5 115 | SKILL_113_00,Sigil Booster,57E8A93F 116 | SKILL_114_00,Fearless Drive,CD030268 117 | SKILL_114_01,Fearless Spirit,A38510E2 118 | SKILL_115_00,Guardian's Conviction,3BFED918 119 | SKILL_115_01,Guardian's Honor,F8496336 120 | SKILL_115_02,Guardian's Warpath,9AFDFA9E 121 | SKILL_116_00,Helmsman's Navigation,151E4674 122 | SKILL_116_01,Helmsman's Tenacity,A374FDF0 123 | SKILL_116_02,Helmsman's Warpath,D76F4D24 124 | SKILL_117_00,Mage's Aspiration,B48EEF48 125 | SKILL_117_01,Mage's Savvy,11AAE5F5 126 | SKILL_117_02,Mage's Warpath,C00163B3 127 | SKILL_118_00,Veteran's Insight,AA83F548 128 | SKILL_118_01,Veteran's Vision,921B6B0C 129 | SKILL_118_02,Veteran's Warpath,0E42BE1B 130 | SKILL_119_00,Rose's Blooming,23D0F67F 131 | SKILL_119_01,Rose's Profusion,C2A4C7A9 132 | SKILL_119_02,Rose's Warpath,8519AD4A 133 | SKILL_120_00,Phantasm's Concord,D908223D 134 | SKILL_120_01,Phantasm's Harmony,7351D602 135 | SKILL_120_02,Phantasm's Warpath,A339D642 136 | SKILL_121_00,White Dragon's Oath,8CDF9382 137 | SKILL_121_01,White Dragon's Glory,D1012D8C 138 | SKILL_121_02,White Dragon's Warpath,6316CBEB 139 | SKILL_122_00,Hero's Creed,2E65A774 140 | SKILL_122_01,Hero's Will,16EFF868 141 | SKILL_122_02,Hero's Warpath,D8f66C1C 142 | SKILL_123_00,Lord's Procession,E60A735C 143 | SKILL_123_01,Lord's Ambition,6FF05223 144 | SKILL_123_02,Lord's Warpath,BA504607 145 | SKILL_124_00,Dragonslayer's Dominance,86CBCDC4 146 | SKILL_124_01,Dragonslayer's Ingenuity,05FA4599 147 | SKILL_124_02,Dragonslayer's Warpath,C7D379F1 148 | SKILL_125_00,Holy Knight's Luster,9A9DC170 149 | SKILL_125_01,Holy Knight's Grandeur,522E2388 150 | SKILL_125_02,Holy Knight's Warpath,B85202BC 151 | SKILL_126_00,Swordmaster's Prowess,0CD6C625 152 | SKILL_126_01,Swordmaster's Art,A3B49220 153 | SKILL_126_02,Swordmaster's Warpath,DAEFBB27 154 | SKILL_127_00,Butterfly's Grace,29B07BEB 155 | SKILL_127_01,Butterfly's Valor,A63B89CD 156 | SKILL_127_02,Butterfly's Warpath,FDD1AD24 157 | SKILL_128_00,Eternal Rage's Mettle,5463232F 158 | SKILL_128_01,Eternal Rage's Ethos,451D814C 159 | SKILL_128_02,Eternal Rage's Warpath,0F026CF0 160 | SKILL_129_00,Founder's Strategy,EC3CF174 161 | SKILL_129_01,Founder's Truth,AF513A9D 162 | SKILL_129_02,Founder's Warpath,E6B92E34 163 | SKILL_130_00,Versalis Foundation,93A2093C 164 | SKILL_130_01,Versalis Ignition,7AD0C010 165 | SKILL_130_02,Versalis Heart,B064A634 166 | SKILL_131_00,Crimson's Clout,6EBFA176 167 | SKILL_131_01,Crimson's Flight,F1D5DBD0 168 | SKILL_131_02,Crimson's Warpath,4F135217 169 | SKILL_132_00,Ebony's Presence,7440E869 170 | SKILL_132_01,Ebony's Poise,CD124165 171 | SKILL_132_02,Ebony's Warpath,d8f66c1c 172 | SKILL_133_00,Fortifying Vigor,0FBA47E8 173 | SKILL_134_00,Instilling Vigor,A4D6B880 174 | SKILL_135_00,Gilding Vigor,CDEB73F6 175 | SKILL_136_00,Held Under Resistance,1DC9D7E7 176 | SKILL_137_00,Darkflame Resistance,DD4A701E 177 | SKILL_138_00,ATK↓ Resistance,4BF2E191 178 | SKILL_139_00,DEF↓ Resistance,66DE60B1 179 | SKILL_140_00,Crabby Resonance,082033CB 180 | SKILL_141_04,Crabvestment Returns,D461ECFB 181 | SKILL_142_00,Seven Net,9AD8B5E6 182 | SKILL_143_00,Catastrophe,40223C28 183 | SKILL_144_00,Stronghold,74AA75D6 184 | SKILL_145_00,Power Hungry,DC225C96 185 | SKILL_146_00,War Elemental,4C588C27 186 | SKILL_147_00,Path to Mastery,5E422AE5 187 | SKILL_150_00,Untouchable,AF794A87 188 | SKILL_151_00,Supplementary DMG,57AB5B10 189 | SKILL_152_00,Less Is More,82CE278D 190 | SKILL_153_00,Head Start,1568E0E4 191 | SKILL_154_00,Berserker,70395731 192 | SKILL_156_00,Potent Greens,CD18A77D 193 | SKILL_157_00,Roll of the Die,333E5862 194 | SKILL_158_00,Glass Cannon,A8A3163B 195 | SKILL_159_00,Flight over Fight,EC1C6779 196 | SKILL_160_00,Alpha,DBE1D775 197 | SKILL_161_00,Beta,8D2ADB6E 198 | SKILL_162_00,Gamma,5C862E13 199 | SKILL_164_00,Crabmiration,D3B8C21F 200 | SKILL_166_00,Greater Aegis,48A95B8D 201 | SKILL_167_00,Auto Potion,F71F8997 202 | SKILL_170_00,Spirit Edge's Rally,77C809F5 203 | SKILL_170_01,Spirit Edge's Fury,9230E3F5 204 | SKILL_170_02,Spirit Edge's Warpath,7B4FC47A 205 | SKILL_170_03,Seven-Star Boundary,EF05EC4D 206 | SKILL_171_00,Dark Huntress's Volley,E85FF8E0 207 | SKILL_171_01,Dark Huntress's Surge,8572B8AF 208 | SKILL_171_02,Dark Huntress's Warpath,81B293D9 209 | SKILL_171_03,Two-Crown Boundary,281214AB 210 | SKILL_172_00,Supreme Primarch's Awe,D40D1E9B 211 | SKILL_172_01,Supreme Primarch's Nimbus,15806DFC 212 | SKILL_172_03,Supreme Primarch's Warpath,4E5F6706 213 | SKILL_172_03,Ain,1A2EF59E 214 | SKILL_233_00,Berserker Echo,EE85CD1F 215 | SKILL_234_00,Spartan Echo,3D8153A1 216 | SKILL_235_00,Super Ultimate Perfect Dodge,51C115D2 217 | -------------------------------------------------------------------------------- /docs/resources/trait_skill_ids.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: material/shield-plus 3 | --- 4 | 5 | # Trait/Skill IDs 6 | 7 | :material-lightbulb: Data Version: `1.3.x` 8 | 9 | List is interpolated using `system/table/text/text.msg` 10 | 11 | {{ read_csv('skill_id.csv') }} 12 | -------------------------------------------------------------------------------- /docs/stylesheets/extra.css: -------------------------------------------------------------------------------- 1 | .md-grid { 2 | max-width: 1560px; 3 | } -------------------------------------------------------------------------------- /docs/tables/table_database.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: material/database 3 | --- 4 | 5 | # Table Database 6 | 7 | The table files `.tbl`, located under `system/table` holds most of the data for the game. Items, abilities, gems (sigils), and a lot more. 8 | 9 | In order to make it easier for editing, it is recommended to first convert them to [SQLite](https://en.wikipedia.org/wiki/SQLite) for easier manipulation. 10 | 11 | !!! danger 12 | 13 | Do **NOT** use this online. Likewise, do **NOT** use this to create and publish cheat related mods, such as skill edits. 14 | 15 | Table research and edits should be reserved to adding or adjusting content. Using mods with table edits has a **high** potential for breakage if used online. If you are publishing a mod with table edits, only include the table files you've edited in your mod, **not ALL the tables**. 16 | 17 | **Mention which tables you have edited when publishing your mod**. Otherwise multiple mods may conflict if they edit the same table. 18 | 19 | --- 20 | 21 | ## Converting to SQLite 22 | 23 | To convert them to SQLite, you can use [GBFRDataTools](https://github.com/Nenkai/GBFRDataTools) >1.2.0 which you should already have. 24 | 25 | ``` markdown title="Command" 26 | GBFRDataTools.exe tbl-to-sqlite -i -o -v 27 | ``` 28 | 29 | You can then preview them using any SQLite database editor, such as [SQLiteStudio](https://sqlitestudio.pl/) 30 | 31 | !!! tip 32 | 33 | If you care about your eyes, switch to Dark Mode in: 34 | 35 | * Tools :material-arrow-right: Open configuration dialog :material-arrow-right: Look & feel (Style) :material-arrow-right: Current style: Fusion Dark. 36 | 37 | --- 38 | 39 | ## Converting back to .tbl 40 | 41 | !!! note 42 | 43 | Make sure you've read the danger notice above. 44 | 45 | 46 | ``` markdown title="Command" 47 | GBFRDataTools.exe sqlite-to-tbl -i -o -v 48 | ``` 49 | 50 | --- 51 | 52 | ## Additional Notes 53 | 54 | * For random-looking-values, [Hashes](../resources/re/hashes.md) are used for table relationships. Blank columns signify a hash of `887AE0B0` (empty string/no value). 55 | * The actual type of each column can be found by inspecting the `.headers` files of GBFRDataTool under the `Headers` folder. 56 | * Many of the columns are unknown and may need to be figured out first. 57 | * **Please contribute!** There are many tables that have yet to be figured out. The headers are located [here](https://github.com/Nenkai/GBFRDataTools/tree/master/GBFRDataTools.Database/Headers) on the repo **and you might find some extra comments for certain tables**. For hashes, if you manage to bruteforce the original string for certain hashes, the list is located [here](https://github.com/Nenkai/GBFRDataTools/blob/master/GBFRDataTools.Database/Data/ids.txt). 58 | 59 | ### Easy Searching 60 | 61 | You might find yourself how to identity where certain ids (or hashes) are used between tables. If you have query knowledge you could add a function that makes it easy to find where certain cells are used. 62 | 63 | * In SQLiteStudio, find the "Open SQLite functions editor" window. Press the `+`. 64 | * Set the function name as `find`, make sure `Type` is Scalar and `Implementation language` is **Tcl**. 65 | * In `Input arguments`, Press the `+` such as you have one `argument` 66 | * In `Function implementation code`, insert the following: 67 | 68 | ```batch 69 | set value [string map [list "'" "''"] [lindex $argv 0]] 70 | set results [list] 71 | 72 | foreach table [db eval {select name from sqlite_master where type = "table"}] { 73 | set table $table 74 | set cols [list] 75 | foreach {cid colName colType colNN colDef colPk} [db eval "PRAGMA table_info('$table')"] { 76 | lappend cols "\[$colName\] = '$value'" 77 | } 78 | if {[catch { 79 | set res [db eval "SELECT rowid FROM \[$table\] WHERE [join $cols { OR }]"] 80 | if {[llength $res] > 0} { 81 | return "found in table $table in rows with following ROWID: [join $res ,\ ]" 82 | } 83 | }]} { 84 | set res [db eval "SELECT count(*) FROM \[$table\] WHERE [join $cols { OR }]"] 85 | if {[lindex $res 0] > 0} { 86 | lappend results '$table' 87 | } 88 | } 89 | } 90 | return "[join $results {, }]" 91 | ``` 92 | 93 | You can now use the SQL Editor/Querier with `SELECT find("")`, which will return where said value is referenced. 94 | 95 | 96 | -------------------------------------------------------------------------------- /docs/textures/granite.md: -------------------------------------------------------------------------------- 1 |
2 | ![404](../images/404.png) 3 |
Content Not Found
4 |
5 | 6 | This page's contents have been moved: 7 | 8 | :material-arrow-right: [Extracting Textures](../tutorials/textures/texture_extraction.md) -------------------------------------------------------------------------------- /docs/textures/textures.md: -------------------------------------------------------------------------------- 1 |
2 | ![404](../images/404.png) 3 |
Content Not Found
4 |
5 | 6 | This page's contents have been moved: 7 | 8 | :material-arrow-right: [Extracting Textures](../tutorials/textures/texture_extraction.md) 9 | 10 | :material-arrow-right: [Extracting Textures](../tutorials/textures/texture_creation.md) -------------------------------------------------------------------------------- /docs/tutorials/GBFR_Data_Tools_Extract_Model_Files.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nenkai/relink-modding/19ebf8a75928241d506d6531af421e73d30d13a9/docs/tutorials/GBFR_Data_Tools_Extract_Model_Files.mp4 -------------------------------------------------------------------------------- /docs/tutorials/audio/BnkExtr_QuickBms.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nenkai/relink-modding/19ebf8a75928241d506d6531af421e73d30d13a9/docs/tutorials/audio/BnkExtr_QuickBms.zip -------------------------------------------------------------------------------- /docs/tutorials/audio/audio_creation.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: material/music-note-plus 3 | --- 4 | 5 | # :material-music-note-plus: Audio Creation 6 | 7 | !!! tip 8 | 9 | It is recommended to read the [Audio Playback Page](audio_extraction.md) before proceeding. 10 | 11 | !!! warning 12 | 13 | BGMs (or stuff inside `.pck` are not supported yet), if you know how to edit these, reach out! 14 | 15 | 16 | --- 17 | 18 | ## :material-folder-text: Requirements 19 | 20 | * Everything mentioned in the [Audio Playback Page](audio_extraction.md) 21 | * [WWise](https://www.audiokinetic.com/en/download/) (ugh). Make an account, get the launcher, install Wwise. **You only need the Authoring Package** for Windows. Untick anything else. 22 | * [wwiseutil](https://github.com/hpxro7/wwiseutil/releases), used to edit `.bnk` 23 | 24 | --- 25 | 26 | ## :material-new-box: Creating `.wem` files 27 | 28 | You will need `.wav` files ahead of time. 29 | 30 | ??? abstract "Easy Method - sound2wem" 31 | 32 | **Note:** This method does not support inserting filename markers into `.wem`s, which is sometimes required for lipsyncing (or animations) to work. 33 | 34 | Get [sound2wem](https://github.com/EternalLeo/sound2wem). Specifically the `zSound2wem.cmd` file. Put it next to the other utilities such as Wwiser. 35 | 36 | Then simply run the following command: 37 | 38 | ```batch 39 | zSound2wem.cmd 40 | ``` 41 | 42 | This will convert your `.wav` file to `.wem`. 43 | 44 | ??? abstract "Other Method - Using Wwise directly (higher control)" 45 | 46 | This part uses Wwise directly in case you need more control over the `.wem` output. 47 | 48 | * On the left side (Project Explorer), Head to **ShareSets** :material-arrow-right: Conversion Settings :material-arrow-right: Default Work Unit :material-arrow-right: **Default Conversion Settings**. 49 | * Set the first row's *Format* to **Vorbis**. Make sure to tick **Insert filename marker**, this is used by the game for animations. 50 | * ++shift+i++ to bring up the Audio Importer 51 | * Alternatively, head to Project Explorer again, Audio :material-arrow-right: Interactive Music Hierarchy, Right-Click & Import Audio Files. 52 | * From there, import any audio files. 53 | * In Audio :material-arrow-right: Interactive Music Hierarchy :material-arrow-right: Default Work Unit, you should be able to see your files. From there you can edit some of the parameters such as *volume* if needed. 54 | * ++shift+c++ to convert the file. 55 | * Head to Documents & `WWISE\WwiseProjects\\.cache\Windows\SFX\`. Wem files will be located there. 56 | 57 | --- 58 | 59 | ## Locating which files to edit 60 | 61 | If you did not generate `.txtp` files for playback, it is highly recommended you do so first through Wwiser. 62 | 63 | Open the target `.txtp` file and inspect the first few lines - you should be able to find the wems that are used for a certain event. 64 | 65 | For most part when looking at characters you'll be looking at the banks that end with `_m.bnk`. 66 | 67 | ## Editing `.bnk` 68 | 69 | 1. Open `wwiseutil` and the `.bnk` file linked to audio you would like to edit. 70 | 2. Find `Id` column that matches. Hit **Replace** and select your `.wem` file you created earlier. 71 | 3. Hit **Save**. Make sure to select `SoundBank file (*.bnk)`. 72 | 4. Bank is ready for the game. 73 | 74 | !!! tip 75 | You can also use [FusionTools](https://www.nexusmods.com/mafiadefinitiveedition/mods/98) or [RingingBloom](https://github.com/Silvris/RingingBloom) for this process. 76 | 77 | --- 78 | 79 | Credits to korone for establishing the [first guide](https://www.bilibili.com/read/cv33210537) (Chinese). -------------------------------------------------------------------------------- /docs/tutorials/audio/audio_extraction.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: material/file-music 3 | --- 4 | 5 | # :material-file-music: Audio Playback/Conversion 6 | 7 | Relink uses AudioKinetic's [Wwise](https://www.audiokinetic.com/en/wwise/overview/) as its Audio Middleware for playback and file formats. It is generally a pain to deal with both for extraction and creation of new audio. 8 | 9 | There are two distinct proprietary formats: 10 | 11 | * `.bnk` - These contain instructions on how to play audio, but *does not necessarily contain audio by themsleves* (except for `_m` banks). You can most of these in the `data/sound` folder of the game. 12 | * `.pck` - Contains actual sounds. You can *not* simply and play them. You will need to extract them first, and will specifically be located in the `sound` folder. 13 | 14 | --- 15 | 16 | ## :material-folder-text: Requirements 17 | 18 | * Game files extracted beforehand. 19 | * [foobar2000](https://www.foobar2000.org/), Music player. 20 | * [vgmstream](https://github.com/vgmstream/vgmstream/releases/), Get `.fb2k-component` file. This is a plugin for foobar2000. 21 | * [Python 3](https://www.python.org/downloads/), Required for Wwiser. 22 | * [Wwiser](https://github.com/bnnm/wwiser), Used to process `.bnk` files. 23 | * [QuickBms + wwise_pck_extractor.bms + BnkExtr](BnkExtr_QuickBms.zip), Used to extract `.pck` files and `.bnk` containing audio if you need it. 24 | * [wwnames.txt](wwnames.txt) (Right-click Save), Names for each Wwise 'event', to tell sound files apart. This file has been manually created after reverse-engineering. 25 | 26 | Install foobar2000 + plugin, extract the rest in the same folder, make sure to place `wwnames.txt` next to Wwiser. 27 | 28 | ## :material-speaker-play: Playing Audio 29 | 30 | You should make a copy of the `data/sound` folder *away from the game* for backup purposes & to centralize all sound assets, so create one and merge the extracted `sound` folder with it so that you have both `.pck` and `.bnk` files. 31 | 32 | 1. Drag and drop one or more `.pck` files to `extract_pck.bat`. This should create a new folder with `wem` files inside. 33 | 2. Open `wwiser.pyz`. Hit **Load banks** to load `.bnk` files (or **Load dirs** to load ALL `.bnk` in a folder). Load `Init.bnk` before any other banks. Wait until the files have loaded. 34 | 3. Hit **Generate TXTP**. This will create a `txtp` folder with each file containing instruction on how to play every Wwise event. 35 | 4. Drag the folder or individual txtp files to *foobar2000*. 36 | 37 | !!! tip 38 | 39 | You should mark `.txtp` files to always open with foobar2000. 40 | 41 | --- 42 | 43 | ## Additional Information 44 | 45 | All this wouldn't have been possible without bnnm's tools and time spent on audio reverse-engineering! 46 | 47 | ### Wwise Information 48 | 49 | * [How Wwise Works](https://github.com/bnnm/wwiser/blob/master/doc/WWISER.md) 50 | * [Ripping Wwise Games](https://github.com/bnnm/wwiser-utils/blob/master/doc/RIPPING.md) 51 | * [Reversing Wwise Names](https://github.com/bnnm/wwiser-utils/blob/master/doc/NAMES.md) 52 | 53 | ### Wwise, Relink & Other Details 54 | 55 | * Every character that speaks has an associated sound & `lipsync` file found in the `sound/lipsync` folder. These were used to reverse the Wwise event names. 56 | * For some reason, `YellowTown` = Folca, `RedTown` = Seedhollow. 57 | * Character emotes/motions and their linked files are defined in their `___seq_edit_se.xml` file i.e `np/np0300/np0300_3040_0_seq_edit_se.xml`. 58 | * Audio playback through FSM happens using `SoundTriggerAction`, `SoundOneVelAutoTriggerAction` (and potentially more). 59 | * The `.wem` files contain a file name (except for certain packs), but aren't necessarily the *event*'s. 60 | -------------------------------------------------------------------------------- /docs/tutorials/file_extraction.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: material/export 3 | --- 4 | 5 | # File Extraction 6 | 7 | ## :material-folder-text: Game Files 8 | 9 | !!! tip 10 | The game folder can be found under `\steamapps\common\Granblue Fantasy Relink`. 11 | 12 | You should be able to find the following files/folders: 13 | 14 | * `data/` - This is where most sound files are. 15 | * `data.0, data.1, etc.` - **These contain the actual game contents that you will first need to extract.** 16 | * `data.i` - **The index file for the numbered data files, you will extract from them using this file.** 17 | 18 | --- 19 | 20 | ## :material-folder-move: Extracting Files 21 | 22 | ### Requirements 23 | 24 | * [.NET 8.0](https://dotnet.microsoft.com/en-us/download/dotnet/8.0) 25 | * [GBFRDataTools](https://github.com/Nenkai/GBFRDataTools/releases) 26 | 27 | --- 28 | 29 | ### Extracting a file 30 | 31 | GBFRDataTools is a *command-line program* that you need to run under the command prompt (`cmd` or Windows Terminal on Windows). 32 | 33 | 1. Download GBFRDataTools and extract it, preferably next to the game executable. 34 | 2. Open a Command Prompt (Not in Admin mode) and drag in the GBFRDataTools.exe file, this will path to the tool. 35 | * !!! note 36 | You can press enter to run the program with no commands yet. This will print out the list of commands you can run. Also, you can press the `Up Arrow` on your keyboard to show the previous command you entered. 37 | 3. type `extract -i `. 38 | 4. Drag in your data.i file located in the Game's install folder: `...\steamapps\common\Granblue Fantasy Relink\data.i` 39 | 5. type in ` -f ` and put a path to a game file like `model/pl/pl1400/pl1400.minfo`. 40 | * Refer to the [Asset Paths](../resources/asset_paths.md) page for finding files. 41 | * You can also search through `filelist.txt` in the GBFRDataTools folder for file paths. 42 | 6. Press enter, this will extract that one specified file. 43 | 44 | ``` markdown title="Example Command - Extract single file" 45 | "/GBFRDataTools.exe" extract -i "" -f "model/pl/pl1400/pl1400.minfo" 46 | ``` 47 | **Replace `` to the path to the `data.i` file.** 48 | 49 | --- 50 | 51 | ### Extracting all files 52 | 53 | If you want to just extract all known files just replace `extract` with `extract-all` and get rid of the `-f command`. 54 | 55 | ``` markdown title="Example Command - Extract all files" 56 | "/GBFRDataTools.exe" extract-all -i "" 57 | ``` 58 | It will take some time to extract all files. 59 | !!! note 60 | 61 | Not *all* files will be extracted, but most. You can see the current progress on the [GBFRDataTools](https://github.com/Nenkai/GBFRDataTools) page. 62 | 63 | This is because none of the data files holds the path names for their contents and had to be guessed. If you'd like to contribute, the file list can be found [here](https://github.com/Nenkai/GBFRDataTools/blob/master/GBFRDataTools/filelist.txt), and a file accessor logger can be found [here](https://github.com/WistfulHopes/gbfrelink.utility.filenamelogger) 64 | 65 | --- 66 | 67 | ### Extracting all files matching filter 68 | 69 | If you want to mass extract files from paths that contain a certain string, run `extract-all` with `-f "put matching string here"` on the end. 70 | 71 | ``` markdown title="Example Command - Extract all files containing 'pl1400' in the path" 72 | "../GBFRDataTools.exe" extract-all -i "" -f "pl1400" 73 | ``` 74 | or 75 | ``` markdown title="Example Command - Extracts all .wtb files" 76 | "../GBFRDataTools.exe" extract-all -i "" -f ".wtb" 77 | ``` 78 | 79 | !!! note 80 | You can put `-o ""` at the end of the commands to extract the files to a specified folder. 81 | 82 | --- 83 | 84 | ### :octicons-video-16: Video Tutorial 85 | 88 | 89 | --- 90 | 91 | ## Additional Information 92 | 93 | ??? abstract "Inner Workings" 94 | 95 | *NOTE: This section only goes into detail as to how it all works and is completely optional*. 96 | 97 | #### New Files 98 | 99 | The `data.i` file is an index file. It holds all the information about the game's contents inside numbered `data` files. It is split in two types of content: 100 | 101 | * Content *inside* archive files such as `data.0`, `data.1` and so on. 102 | * Content *outside* archive files such as the sound files initially present inside the `data` folder. 103 | 104 | For some more notes: 105 | 106 | * `data.i` is a FlatBuffer file. The schema has been [fully reverse-engineered](https://github.com/Nenkai/GBFRDataTools/blob/master/GBFRDataTools/Entities/IndexFile.fbs). 107 | * All file paths are hashed using [XXHash64](https://github.com/Cyan4973/xxHash). Files are compressed using [LZ4](https://en.wikipedia.org/wiki/LZ4_(compression_algorithm)). 108 | * The XXHash seed can be provided by the index file. It is set to 0 by default. 109 | * All file hashes are ordered by their value for binary searching. Same for their descriptors within the index file, making it impossible to guess paths based on their order inside data files. 110 | * When modding, GBFRDataTools simply marks existing or new files as external files. 111 | * `data.2` is hardcoded to not be used. 112 | 113 | 114 | -------------------------------------------------------------------------------- /docs/tutorials/textures/texture_creation.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: material/image-plus 3 | --- 4 | 5 | # :material-texture: Creating Textures 6 | 7 | 1. Download [Nier CLI](https://github.com/ArthurHeitmann/nier_cli/releases/tag/v1.3.0_mgrr). This program is used to convert `.wtb` texture files to a standard viewable image format, or into `.wtb`. 8 | 2. Create a new folder named `.wtb_extracted`. `` should be replaced with the output texture file name you want. The `.wtb_extracted` at the end of the folder is important. 9 | 3. Create and/or add one or multiple `.dds` files to the folder. 10 | 4. Drag the folder into the `Nier CLI` executable. **This will overwrite any `.wtb` file if any already exists with the same name.** -------------------------------------------------------------------------------- /docs/tutorials/textures/texture_extraction.md: -------------------------------------------------------------------------------- 1 | --- 2 | icon: material/image-move 3 | --- 4 | 5 | # :material-texture: UI Textures 6 | 7 | Most UI (& other) textures are contained within `.wtb` files - a carry-over from Platinum Games's texture format. 8 | 9 | 1. Download [Nier CLI](https://github.com/ArthurHeitmann/nier_cli/releases/tag/v1.3.0_mgrr). This program is used to convert `.wtb` texture files to a standard viewable image format, and back to into `.wtb`. 10 | 2. To extract textures, simply drop any `.wtb` file into the executable. A folder will be created. 11 | 12 | --- 13 | 14 | # :simple-dask: Extracting Model Textures (Granite) 15 | 16 | Most model textures are located inside the `granite` folder as `.gtp` files. These textures are generated by the [Granite SDK](https://unity.com/products/granite-sdk) which GBFR uses for texture streaming. 17 | 18 | Texture Folders: 19 | 20 | * 4k Textures: `granite/4k/` 21 | * 2k Textures: `granite/2k/` 22 | 23 | !!! note 24 | 25 | You should be going through all three folders to extract all texture contents, but if you only need specific content; each GTS subfolder represents *mostly* a different kind of content: 26 | 27 | * `/0/0.gts` - World Textures, Some Effects, Some Weapons 28 | * `/1/1.gts` - NPC/Character & Faces, Effects 29 | * `/2/2.gts` - Eye/Iris 30 | 31 | For any content added in updates, tile sets are separated by packs of three based on version minor, so v1.1 = `3,4,5`, v1.2 = `6,7,8` and so on. 32 | 33 | In order to extract and convert the textures, grab [GraniteTextureReader](https://github.com/Nenkai/GraniteTextureReader/releases). 34 | 35 | If you want to extract textures, open the Command Prompt and run the following command: 36 | 37 | ``` markdown title="Command" 38 | "../GraniteTextureReader.exe" extract-all -t -l 39 | ``` 40 | 41 | !!! warning 42 | 43 | `-l` is an **L** as in **Lima**, not an i/1. 44 | 45 | * Replace `` with the actual path to the `.gts` file 46 | * Replace `` with a layer number. The layer number is the type of content that you want to extract, such as: 47 | * `-1` - All layers, **use this by default to extract everything**. 48 | * `0` - Albedo, regular model textures 49 | * `1` - Normal maps 50 | * `2` or `3` - RGB maps -------------------------------------------------------------------------------- /mkdocs.yml: -------------------------------------------------------------------------------- 1 | 2 | site_name: Granblue Fantasy - Relink Modding 3 | site_description: Granblue Fantasy - Relink Modding Docs 4 | site_url: https://nenkai.github.io/relink-modding/ 5 | repo_url: https://github.com/Nenkai/relink-modding 6 | repo_name: nenkai/relink-modding 7 | 8 | copyright: Copyright © 2024 Nenkai - Not affiliated with Cygames. 9 | 10 | theme: 11 | name: material 12 | logo: images/logo.png 13 | favicon: images/favicon.png 14 | custom_dir: docs/overrides/ 15 | 16 | features: 17 | - navigation.tabs 18 | - navigation.sections 19 | - navigation.footer 20 | - navigation.top 21 | - navigation.instant 22 | - navigation.instant.progress 23 | - navigation.tracking 24 | - toc.follow 25 | - search.suggest 26 | - search.highlight 27 | - content.tabs.link 28 | - content.code.copy 29 | - content.action.edit 30 | - content.code.annotate 31 | - header.autohide 32 | language: en 33 | palette: 34 | 35 | # Palette toggle for automatic mode 36 | - media: "(prefers-color-scheme)" 37 | toggle: 38 | icon: material/brightness-auto 39 | name: Switch to light mode 40 | primary: light blue 41 | accent: light blue 42 | 43 | # Palette toggle for light mode 44 | - media: "(prefers-color-scheme: light)" 45 | scheme: default 46 | toggle: 47 | icon: material/brightness-7 48 | name: Switch to dark mode 49 | primary: light blue 50 | accent: light blue 51 | 52 | # Palette toggle for dark mode 53 | - media: "(prefers-color-scheme: dark)" 54 | scheme: slate 55 | toggle: 56 | icon: material/brightness-4 57 | name: Switch to system preference 58 | primary: light blue 59 | accent: light blue 60 | 61 | 62 | nav: 63 | - Main Page: index.md 64 | - Installing/Creating Mods: 65 | - Installing Mods: modding/installing_mods.md 66 | - Creating Mods: modding/creating_mods.md 67 | - Recommended Mods/Tools: modding/recommended_mods_tools.md 68 | - Mod Manager API: modding/mod_manager_api.md 69 | 70 | - Modder Tutorials: 71 | - Extracting Files: tutorials/file_extraction.md 72 | 73 | - Textures: 74 | - Extracting Textures: tutorials/textures/texture_extraction.md 75 | - Creating Textures: tutorials/textures/texture_creation.md 76 | 77 | - Audio: 78 | - Audio Playback/Conversion: tutorials/audio/audio_extraction.md 79 | - Audio Creation: tutorials/audio/audio_creation.md 80 | 81 | - Modder Resources/Info: 82 | - Asset Paths: resources/asset_paths.md 83 | - File Extensions: resources/file_extensions.md 84 | - Entity Prefixes: resources/entity_prefixes.md 85 | 86 | - General IDs: 87 | - Item IDs: resources/item_ids.md 88 | - Model IDs: resources/model_ids.md 89 | - Quest IDs: resources/quest_ids.md 90 | - Sigil/Gem IDs: resources/sigil_gem_ids.md 91 | - Trait/Skill IDs: resources/trait_skill_ids.md 92 | 93 | - Rates/Tables: 94 | - Enemy Parts Rates: resources/enemy_break_part_rates.md 95 | - Gacha (Transmute) Rates: resources/gacha_rates.md 96 | - Item Junk (Curio) Rates: resources/curio_loot_rates.md 97 | - Quest Drop Rates: resources/quest_drop_rates.md 98 | - Weapon Materials: resources/weapon_materials.md 99 | 100 | - Player System: 101 | - Actions / Parameters: resources/player/action_parameter.md 102 | - Action IDs: resources/player/action_ids.md 103 | - Buff IDs: resources/player/buff_ids.md 104 | - Control Types: resources/player/control_types.md 105 | - Debuff/Ailment IDs: resources/player/debuff_ailment_ids.md 106 | - Motions: resources/player/motions.md 107 | 108 | - Scripting: 109 | - FSMs: resources/fsm.md 110 | 111 | - Quests/Layouts: 112 | - Quest Base Info: resources/quests_layouts/quest_base_info.md 113 | - Placement Info: resources/quests_layouts/placement.md 114 | 115 | - Formats: 116 | - .cfct - Camera Fade Table: resources/formats/cfct.md 117 | - .minfo - Model Info: resources/formats/minfo.md 118 | - .mmat - Material Info: resources/formats/mmat.md 119 | - .objread - Obj Read: resources/formats/objread.md 120 | - .stpr - Streaming Prefetch: resources/formats/stpr.md 121 | 122 | - Reverse-Engineering: 123 | - API: resources/re/api.md 124 | - Hashes: resources/re/hashes.md 125 | - Misc: resources/re/misc.md 126 | - Networking: resources/re/networking.md 127 | - Obj IDs: resources/re/obj_id.md 128 | - Save Unit IDs: resources/re/save_units.md 129 | - User Attributes: resources/re/user_attributes.md 130 | 131 | - Mechanics: 132 | - Roll of the Die: resources/re/mechanics/rotd.md 133 | - Sigil Synth. Grand Success: resources/re/mechanics/gem_mix.md 134 | 135 | - Blender: 136 | - Model Importing: models/importing.md 137 | - Model Exporting: models/exporting.md 138 | 139 | - Tables: 140 | - Table Database: tables/table_database.md 141 | 142 | - Contributing: contributing.md 143 | 144 | markdown_extensions: 145 | - toc: 146 | permalink: true 147 | - pymdownx.highlight: 148 | anchor_linenums: true 149 | - pymdownx.inlinehilite 150 | - pymdownx.snippets 151 | - admonition 152 | - pymdownx.arithmatex: 153 | generic: true 154 | - footnotes 155 | - pymdownx.details 156 | - pymdownx.superfences: 157 | custom_fences: 158 | - name: mermaid 159 | class: mermaid 160 | format: !!python/name:pymdownx.superfences.fence_code_format 161 | - pymdownx.mark 162 | - pymdownx.keys 163 | - pymdownx.critic 164 | - pymdownx.tilde 165 | - pymdownx.tabbed: 166 | alternate_style: true 167 | - attr_list 168 | - md_in_html 169 | - pymdownx.emoji: 170 | emoji_index: !!python/name:material.extensions.emoji.twemoji 171 | emoji_generator: !!python/name:material.extensions.emoji.to_svg 172 | 173 | plugins: 174 | - git-revision-date-localized: 175 | enable_creation_date: true 176 | - git-committers: 177 | repository: nenkai/relink-modding 178 | branch: main 179 | - social 180 | - search: 181 | lang: en 182 | - glightbox 183 | - table-reader 184 | 185 | extra: 186 | social: 187 | - icon: fontawesome/brands/discord 188 | link: https://discord.gg/gbsG4CDsru 189 | 190 | - icon: fontawesome/brands/twitter 191 | link: https://twitter.com/Nenkaai 192 | 193 | - icon: fontawesome/brands/github 194 | link: https://github.com/Nenkai 195 | 196 | - icon: simple/kofi 197 | link: https://ko-fi.com/nenkai 198 | 199 | extra_css: 200 | - stylesheets/extra.css --------------------------------------------------------------------------------