2022-07-19 19:29:41 -04:00
# Physis
2022-10-17 19:32:40 -04:00
[](https://crates.io/crates/physis)
2022-09-15 16:26:18 -04:00
[](https://builds.sr.ht/~redstrate/physis?)
2023-12-02 19:48:42 -05:00
Physis is a framework for interacting with FFXIV data. It can read and write lots of game formats, and is designed for tooling to be built on top of it. Even though this library works best with Rust, [libphysis ](https://git.sr.ht/~redstrate/libphysis ) is a C API wrapper designed for interfacing through other languages.
2022-07-19 19:29:41 -04:00
## Goals
2022-10-20 12:03:19 -04:00
* Make it easy for people to tinker around with game data.
* Documenting game formats for other people to develop their own libraries and applications for.
2022-07-19 19:29:41 -04:00
* Parsing data should be safe, and unit tested vigorously.
2022-10-20 12:03:19 -04:00
* Aim to have minimal dependencies, and those dependencies should be checked via `cargo deny` .
2022-07-19 19:29:41 -04:00
## Features
2022-08-06 18:40:16 -04:00
* Easily extract game data from SqPack files.
2022-09-13 16:53:46 -04:00
* Apply game and boot updates, enabling custom launchers to patch the game easily.
2022-07-19 19:29:41 -04:00
* Blockfish ciphers for encrypting and decrypting SqexArg.
* Parse various game formats:
2022-08-06 18:40:16 -04:00
* SqPack index and dat files
* ZiPatch files
* All three Excel data types (EXD, EXH, EXL)
* Models
* Havok Packfile/TexTool skeletons
2022-08-11 15:41:30 -04:00
* Textures
* Materials
2022-10-20 12:03:19 -04:00
* and more!
2022-08-06 18:40:16 -04:00
## Usage
2022-10-20 12:03:19 -04:00
**Warning:** The API will not be truly stable until 1.0. However, the API is stable between patch versions.
2022-08-06 18:40:16 -04:00
2022-10-20 12:03:19 -04:00
If you intend to use this in your Rust project, you can simply include this crate directly.
```
[dependencies]
physis = "0.1"
```
You can view the documentation at [docs.xiv.zone ](https://docs.xiv.zone/docs/physis )! It's automatically updated as new
commits are pushed to the main branch.
2022-08-06 18:40:16 -04:00
For other use in languages I maintain [libphysis ](https://git.sr.ht/~redstrate/libphysis ), which is a C wrapper
2022-10-20 12:03:19 -04:00
around the same functionality. I use these bindings in [other projects ](https://git.sr.ht/~redstrate/astra ).
2022-07-19 19:29:41 -04:00
## Development
2022-10-20 12:03:19 -04:00
If you're interested to see how these formats work in more detail, see [xiv.dev ](https://xiv.dev/ ) and
[docs.xiv.zone ](https://docs.xiv.zone )! They explain the file formats in more detail, but I also encourage reading the
ibrary code as well if you can.
### Testing
One of the main goals of Physis is to avoid accidental regressions, this is especially important when handling game
2023-12-02 19:48:42 -05:00
data that might take hours to download.
2022-10-20 12:03:19 -04:00
#### Unit Testing
2022-07-19 19:29:41 -04:00
2022-10-20 12:03:19 -04:00
There are a set of basic unit tests you can run via `cargo test` . You can also find the relevant test resources in `resources/tests` .
This does **NOT** contain copyrighted material, but actually fake game data created by physis itself. These tests are
run automatically by the CI.
#### Retail Testing
There are some tests and benchmarks require the environment variable `FFXIV_GAME_DIR` to be set. By default, these are disabled
2022-07-27 20:58:12 -04:00
since they require a legitimate copy of the retail game data. These tests can be turned on via the `retail_game_testing`
feature.
2022-07-19 19:29:41 -04:00
2022-10-20 12:03:19 -04:00
#### Patch Testing
2022-10-13 15:45:23 -04:00
Patching is an extremely sensitive operation since it is not easily reversible if done wrong. Repairing the game files
2022-10-20 12:03:19 -04:00
is an option, but it's time-consuming and not yet implemented in physis. To prevent regressions in patching the
2022-10-13 15:45:23 -04:00
game, I have set up a testing bed for cross-checking our implementation with others. Currently, this is limited to XIVLauncher's implementation,
but I will eventually adopt a way to test the retail patch installer as well.
1. Enable the `patch_testing` feature.
2. Set a couple of environment variables:
* `FFXIV_PATCH_DIR` is the directory of patches to install. It should be structured as `$FFXIV_PATCH_DIR/game/D2017.07.11.0000.0001.patch` .
2022-10-17 15:37:02 -04:00
* `FFXIV_XIV_LAUNCHER_PATCHER` should be the path to the XIVLauncher patcher executable. If you're running on Linux, we will handle running Wine for you.
2022-10-13 15:45:23 -04:00
* `FFXIV_INSTALLER` is the path to the installer executable. This will be installed using the usual InstallShield emulation physis already includes.
As you can see, you must have the previous patches downloaded first as well as the installer before running the tests.
This is left up to the developer to figure out how to download them legally.
2022-10-20 12:03:19 -04:00
**Note:** These tests create the `game_test` and `game_test_xivlauncher` folders in `$HOME` and does not
2022-10-17 15:37:02 -04:00
delete them on exit, in case you want to check on the results. You may want to remove these folders as they
are full game installations and take up a considerable amount of space.
2022-10-20 12:03:19 -04:00
#### Semver and Dependency Checks
2023-12-02 19:48:42 -05:00
Even though package management in Rust is easier, it's a double-edged sword. I try to prevent getting carried away
2022-10-20 12:03:19 -04:00
from including crates - but the ones we do include, have to get checked often. I use `cargo deny` to check my
dependencies for mismatched versions, deprecation warnings, updates and more. This is also run on the CI!
2022-10-26 17:16:08 -04:00
Making sure that the library is semver-compliant is also important, and I use `cargo semver` for this task. This is to ensure the API does not break when moving between patch
2022-10-20 12:03:19 -04:00
versions.
2022-08-06 18:40:16 -04:00
## Contributing & Support
2022-07-19 19:29:41 -04:00
2022-10-20 12:03:19 -04:00
The best way you can help is by [monetarily supporting me ](https://redstrate.com/about/ ) or by submitting patches to
2022-10-25 13:06:49 -04:00
help fix bugs or add functionality.
## Credits
- [goatcorp ](https://goatcorp.github.io ) (XIVQuickLauncher, docs.xiv.dev, and even more)
- [Ioncannon ](http://ffxivexplorer.fragmenterworks.com/research.php ) (FFXIV Data Explorer) for the first documenting the file formats
- [binrw team ](https://binrw.rs ) for an awesome Rust library!
- [sha1-smol ](https://github.com/mitsuhiko/sha1-smol ) for a dependency-free SHA1 implementation
2023-12-02 19:48:42 -05:00
And everyone else who writes FFXIV tools!
## License

This project is licensed under the GNU General Public License 3. Some parts of the code or assets may be licensed differently, refer to the REUSE metadata.