9个版本

0.3.0 2024年6月28日
0.2.3 2024年5月23日
0.2.2 2024年3月23日
0.2.1 2024年1月31日
0.1.0 2022年9月13日

#337解析器实现

Download history 113/week @ 2024-05-23 1/week @ 2024-06-06 2/week @ 2024-06-13 2/week @ 2024-06-20 170/week @ 2024-06-27 52/week @ 2024-07-04

570 每月下载量

GPL-3.0 许可证

650KB
10K SLoC

Physis

Crates.io

Physis是一个用于读取和写入FFXIV数据的库。

尽管这个库是为Rust语言编写的,但Physis为其他语言提供了绑定

  • PhysisSharp 可以在任何C#应用程序中使用,并且基于libphysis构建。
  • libphysis 可以用于任何可以与C FFI接口的事物。例如,Novus和Astra都是基于libphysis构建的。

目标

Physis应该

  • ... 让开发者更容易地与游戏数据互动。
  • ... 在过程中记录文件格式,以便更容易编写未来的应用程序库。
  • ... 使解析数据安全,并在可能的情况下创建自动化测试。
  • ... 旨在具有最小的依赖性,并且无论平台如何都易于使用。

特性

以下是支持的格式及其状态列表

文件格式 读取 写入 注意
配置文件
保存的角色数据 目前仅支持一些版本。
角色制作参数
字典
Excel数据
文件信息
地图层 层支持尚未经过充分测试。
聊天记录 尚未发现所有聊天类别。
模型 尚未完全支持添加自定义形状键。
材质
修补文件
前骨骼变形器
着色器包
骨骼
地形
纹理 仅支持某些格式。

Physis还支持进行一些除了读取和写入文件格式之外的有用操作

  • 从SqPack文件中提取游戏数据,并从index/index2中列出文件哈希。
  • 应用游戏补丁。虽然尚未支持索引ZiPatch。
  • Blockfish加密解密SqexArg
  • 提取零售安装程序的文件内容,在Linux上很有用,可以避免运行InstallShield安装程序。
  • 构建到装备、物品、面部和其他有用模型的路径。
  • 从可执行文件中提取字符串。

支持的游戏版本

版本 工作 注意
A Realm Reborn (2.x) ??? 尚未测试。
天际之刃(3.x) ??? 尚未测试。
狂乱之血(4.x) ??? 尚未测试。
暗影之逆(5.x) ~ 有一段时间没有测试了,但应该没问题..
终章(6.x)
曙光之径(7.x) ~ 基准测试仅提供有限支持,等待零售版发布。

请注意,目前仅支持游戏的Windows版本。

用法

如果您想在Rust项目中使用Physis,您只需将其作为Cargo.toml中的依赖项添加即可。

[dependencies]
physis = "0.2"

文档可在docs.xiv.zone在线获取。它会在主分支推送新提交时自动更新。

C#项目可以使用PhysisSharp,它将Physis暴露在C#中。

C/C++项目(或任何可以与C库交互的项目)可以使用libphysis

构建

Physis只有几个依赖项,默认情况下几乎不需要开启。您需要设置Rust,然后运行cargo build

如果您想构建game_install功能,还需要安装unshield

开发

如果您想更详细地了解这些格式的工作原理,请参阅xiv.devdocs.xiv.zone

测试

Physis的主要目标之一是避免意外回归,这在处理可能需要数小时下载的游戏数据时尤为重要。

单元测试

您可以运行一组基本的单元测试,方法是通过cargo test。您还可以在resources/tests中找到相关的测试资源。这些测试不包含受版权保护的材料,而是由physis自己创建的虚构游戏数据。这些测试由CI自动运行。

零售测试

某些测试和基准测试需要设置环境变量FFXIV_GAME_DIR。默认情况下,这些测试是禁用的,因为它们需要一个合法的游戏数据副本。可以通过retail_game_testing功能来启用这些测试。

补丁测试

修补是一个极其敏感的操作,因为一旦出错就很难逆转。修复游戏文件是可行的选项,但在physis中尚未实现。为了防止在修补游戏时出现回归,我已设置了一个测试床,以交叉检查我们的实现与其他实现。目前,这仅限于XIVLauncher的实现,但我最终会采用一种方法来测试零售补丁安装程序。

  1. 启用patch_testing功能。
  2. 设置一些环境变量
    • FFXIV_PATCH_DIR是安装补丁的目录。它应结构化为$FFXIV_PATCH_DIR/game/D2017.07.11.0000.0001.patch
    • FFXIV_XIV_LAUNCHER_PATCHER应该是XIVLauncher修补程序的路径。如果您在Linux上运行,我们将为您处理Wine的运行。
    • FFXIV_INSTALLER是安装程序的路径。这将使用physis已包含的常规InstallShield模拟安装。

如您所见,您必须在运行测试之前先下载以前的补丁以及安装程序。这是留给开发者去考虑如何合法下载它们的问题。

注意: 这些测试将在 game_testgame_test_xivlauncher 文件夹中创建,位置在 $HOME,并且在退出时不会删除它们,以防您想要检查结果。您可能想删除这些文件夹,因为它们是完整的游戏安装,并且占用相当大的空间。

语义版本和依赖性检查

尽管Rust的包管理更加简单,但这也是一把双刃剑。我试图避免过度包含crates - 但我们确实包含的,需要经常检查。我使用 cargo deny 来检查依赖项的版本不匹配、弃用警告、更新等。这也将在CI上运行!

确保库符合语义版本也很重要,我使用 cargo semver 来执行这项任务。这是为了确保在移动到补丁版本时API不会中断。

贡献 & 支持

您能提供的最好帮助是通过 资助我 或通过提交补丁来帮助修复错误或添加功能。提交问题很受欢迎,但我是在业余时间做的,所以请不要期望专业支持。

致谢 & 感谢

  • goatcorp(XIVQuickLauncher,docs.xiv.dev,还有更多)
  • Ioncannon(FFXIV 数据浏览器)为首次记录文件格式
  • binrw 团队 提供了一个出色的Rust库!
  • sha1-smol 提供了一个无依赖的SHA1实现

以及所有其他编写FFXIV工具的人!

许可

GPLv3

本项目采用GNU通用公共许可证第3版授权。代码或资产的部分可能采用不同的许可证,请参阅REUSE元数据。

依赖项

~5.5MB
~79K SLoC