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 | [](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 | 
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 | 
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 |