JonathanSoszka/wreckfest2-tuning-editor

GitHub: JonathanSoszka/wreckfest2-tuning-editor

一款基于.NET 8和WPF的Wreckfest 2职业生涯存档调校预设编辑器,支持在游戏合法范围内通过滑块编辑车辆参数并进行预设的导出、导入、复制与分享。

Stars: 0 | Forks: 0

# Wreckfest 2 调校编辑器 一款用于编辑 **Wreckfest 2** 职业生涯存档调校预设的 Windows 桌面小工具—— 通过滑块调整设置,并支持**导出 / 导入 / 复制**预设,方便你将出色的调校应用 到其他车辆上,进行备份,或是分享给朋友。 该工具的所有写入操作都**严格限制在游戏自身的合法范围内**——它绝不会 生成任何游戏自身无法产生的数值。这是一个非官方的社区工具,与 Bugbear 或 THQ Nordic 无关。 ## 功能说明 - 浏览你存档中的每一辆车及每辆车的调校预设。 - 通过滑块编辑调校数值,滑块会自动对齐到游戏自身的合法步长(构造上保证数值始终在范围内)。 - **创建**全新的预设(使用游戏默认值),**复制**现有预设,并支持将预设**导出** 为 `.json` 文件。 - 从 `.json` 文件中将预设**导入**为任意车辆的新预设;如果存在任何 超出游戏常规生成范围的数值,将会发出警告。 - 安全写入:在修改前会自动备份你的存档,并同步更新游戏读取的两份副本。 ## 下载与运行 1. 从[最新发布版](../../releases/latest)获取 `Wf2App.exe`。 2. 双击运行。**无需安装 .NET** —— 这是一个独立打包的版本。 Windows SmartScreen 首次运行时可能会对未签名的应用发出警告(依次点击展开 → *更多信息* → *仍要运行*)。 应用会自动识别你的存档。 ## 安全提示 —— 请务必阅读 - **保存前请先关闭 Wreckfest 2。** 绝不要在游戏运行时直接写入实时存档; 如果检测到游戏或 Steam 正在运行,应用会向你发出警告。 - **你的存档会自动备份**,每次写入前都会在 `Documents\Wreckfest2 Backups\` 目录下生成备份。如果游戏内出现任何异常,请恢复 最近的备份。 - 本工具会直接修改你真实的职业生涯存档。虽然它只写入游戏内的合法数值,但与使用任何存档 编辑器一样,请在确认无误前妥善保管好备份。 想要分享存档(例如用于提交 Bug 报告)又不想泄露你的 Steam/在线 ID?可以运行 `wf2 scrub `(通过 `Wf2Cli`)先进行匿名化处理。 ## 从源码构建 需要 [.NET 8 SDK](https://dotnet.microsoft.com/download)。 ``` dotnet build dotnet test # Wf2Core.Tests # 运行 GUI dotnet run --project Wf2App # 构建 standalone single-file exe dotnet publish Wf2App -c Release -r win-x64 --self-contained true ` -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true ` -p:EnableCompressionInSingleFile=true ``` ## 许可证 [MIT](LICENSE) © 2026 Jonathan Soszka. # 开发者笔记 —— 存档格式 本文档的其余部分是逆向工程参考指南,供任何参与处理 该格式的开发者(人类或 AI)查阅。如果你只是想使用这款应用,看上面的内容就足够了。 ## 范围 **目标:** 让调校 Wreckfest 2 职业生涯存档变得*更简单*,并支持**导出 / 导入 调校预设**(保存调校方案、将其应用到其他车辆、备份或分享)。 **明确排除在范围之外:** 突破游戏自身的限制。我们写入的每一个值都必须是 游戏自身在合法范围内能够生成的。`.ctms` 文件定义了每个可调参数的 合法最小值/最大值,应当用于**校验**导入的数据。(早期的 `docs/archive/PLAN.md`/`AGENTS.md` 草稿中曾提到 “超越游戏允许范围”的目标——这是错误的,现已被更正。) 次要/最初的愿景:编辑已安装的**升级部件**。这依然是个值得关注的点,但调校 预设才是当前的核心目标。 本工具以个人使用优先,但 `Wf2Core` 在编写时做到了与账号无关且易于复用。 ## 状态 **存档格式已完全破解,读取和写入功能均已正常运作。** 完全由我们自己的代码 重建的存档在游戏内能够正常加载,所有 21 辆车及每一个预设均完好无损,编辑过的数值也已成功应用。 | 领域 | 状态 | |---|---| | 容器、LZ4、CRC-32C | ✅ 已破解并验证 | | 数据块链 + 全部 4 层完整性校验 | ✅ 已破解;写入已在游戏内验证 | | 车辆 / 预设 / 调校记录 | ✅ 已解码(`atvc`,12 字节记录) | | 多数据块 payload(车辆数据 > 64 KiB) | ✅ 已破解 —— 读取**和**写入均已在游戏内验证 | | 调校参数名称 + 单位 | ✅ 已映射 37/40 个索引(`docs/PARAM_MAP.md`);51/52/57/58/59 需要游戏内 ID | | aux → value 算术转换 | ✅ 于 2026-07-23 破解 —— `value = min + aux × (max − min) / steps`(`docs/PARAM_MAP.md`) | | 经验性存储单位范围 | ✅ 对 241 个预设执行 `wf2 calibrate` 的结果 → `Wf2Core/ParamRanges.cs` | | **变长写入** | ✅ 已在游戏内验证(2026-07-22) | | 预设导出 + 导入(Tier 1 & 2) | ✅ 已于 2026-07-22 在游戏内验证(`Wf2Core/PresetIo.cs`) | | 预设复制 / 创建 | ✅ 已于 2026-07-23 在游戏内验证 | | 范围校验 | ✅ 已知 `.ctms` 中的参数采用精确范围,其余使用经验范围 | | GUI(`Wf2App`) | ✅ 浏览、滑块编辑、创建、复制、导出、作为新预设导入(`docs/PLAN_gui.md`) | **已无任何已知的格式漏洞。** 剩余的工作属于功能开发,而非逆向研究。 ## 文档导览 | 文档 | 用途说明 | |---|---| | `docs/format.md` | **权威的**二进制格式规范 | | `docs/PARAM_MAP.md` | 调校 `paramIndex` → 名称、单位、范围及 aux→value 算术转换 | | `docs/PLAN_presets.md` | 预设导出/导入功能的计划 | | `docs/PLAN_gui.md` | 桌面端 GUI 的计划 | | `AGENTS.md` | 工作约定 | | `docs/archive/` | 历史文档 —— 已被取代,保留以备溯源([索引](docs/archive/README.md)) | 如果任何文档与 `docs/format.md` 存在冲突,**以 `format.md` 为准。** ## 安全规则(针对代码) 1. **绝不要在 Wreckfest 2 运行时写入实时存档。** 2. **务必先进行备份** —— 在 `Documents\Wreckfest2 Backups\` 中生成带时间戳的副本。 3. **游戏读取的是 `Documents\My Games\Wreckfest 2\\savegame\profile.sgfi`。** Steam 的 `userdata\...\remote\` 副本仅仅是**云端镜像** —— 单独写入此处 毫无意义,Steam 会用 My Games 里的文件将其覆盖。部署时,必须**同时写入两处**,这样 Steam 才不会把旧文件重新同步回来。 4. 逆向工程和测试都必须在**副本**上进行。实时存档是神圣不可侵犯的最终基准,绝不是草稿本。 ## 让我们耗费数天时间的坑 - **头部 `0x10` 处是真实的 CRC-32C**,用于校验解压后的 payload。早期文档声称它是“装饰性的 / 游戏不进行校验”——这完全是**错误的**,这也是此项目中代价最惨痛的单个失误。 - **绝不要在 LZ4 压缩流中直接修补字节。** 字面量会被后来的匹配用作后向引用 源;修补 3 个字面量字节会悄无声息地破坏 13 个解码字节,并导致 几次实验结果失效。务必遵循解压 → 编辑 → 重新压缩的流程。 - **部件目录是散落的 `.upgr` 文件**,而不是 `data*.rpck` 归档文件。完全不需要进行归档解析。 - 如果数据块 CRC 计算错误,游戏依然能加载,但会**静默剥离**掉所有车辆/调校数据。如果 长度出错,则会引发 `Fatal Error: FS: Failed to Read 4 bytes...`。根据出现的症状就能判断是哪里错了。 - 预设中的值是**物理量,采用 SI 单位**(离地间隙为米,弹簧为 N/m),既没有经过归一化,也不是 界面上显示的那些数字——而且 UI 可以在公制/英制之间切换。 - **车辆 payload 跨越了多个 LZ4 数据块。** 仅读取容器会得到看似 完整的 64 KiB 前缀数据,*其 CRC 甚至能通过校验*,从而静默丢弃了其后的每一辆车。各个数据块 解码时必须将先前的输出作为**字典**——绝不能通过拼接压缩 字节来实现。这个坑让我们白白绕了很长一段路,甚至产生了“游戏在截断你的存档”的错觉; 事实证明是读取端的问题,而不是游戏本身。 ## 构建与测试 ``` dotnet build dotnet test # Wf2Core.Tests dotnet run --project Wf2Cli -- tuning "\data\vehicle\shared\part\tuning" ``` ## 项目结构 每个项目都有自己的 README,其中包含了详细的说明与规则。 | 项目 | 用途 | 状态 | |---|---|---| | [`Wf2Core`](Wf2Core/README.md) | 包含所有格式逻辑 —— 容器、CRC、数据块链、`.ctms`、目录。无 UI。 | 活跃 | | [`Wf2Cli`](Wf2Cli/README.md) | 无界面的逆向工程 + 验证工具(`cars`、`settune`、`tuning`、`parts`、`hexdiff`、`scrub` 等) | 活跃 | | [`Wf2Core.Tests`](Wf2Core.Tests/README.md) | xUnit 验收测试 + 真实存档测试用例(已匿名化) | 活跃 | | [`Wf2App`](Wf2App/README.md) | WPF GUI —— 浏览、滑块编辑、创建、复制、导出、导入预设 | 活跃 |
标签:.NET 8, WPF, 存档修改器, 游戏