ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Sudachi存档数据修改指南:五步定位游戏SaveData并安全编辑

Sudachi存档数据修改指南:五步定位游戏SaveData并安全编辑

Sudachi存档数据修改指南:五步定位游戏SaveData并安全编辑

【免费下载链接】sudachiSudachi is a Nintendo Switch emulator for Android, Linux, macOS and Windows, written in C++项目地址: https://gitcode.com/GitHub_Trending/suda/sudachi

这篇文章带你基于 Sudachi(跨平台 Nintendo Switch 模拟器)的真实存档实现,快速找到游戏存档存放在哪里、如何备份、再动手修改——没读过源码也能跟着做完。

存档打不开,先从哪查起

游戏存档突然损坏,你想手动还原或修补几个字节,可翻遍配置目录只看到一堆 16 位十六进制命名的文件夹,找不到任何眼熟的文件。这篇文章解决一个问题:怎么根据 Sudachi 的存档体系,精准定位某个账号下某款游戏的存档目录,并在不弄坏存档的前提下安全读写。

原理速览:存档藏在"虚拟NAND"的哪一层

大白话说:Sudachi 在电脑上模拟了一块 Switch 的 NAND 文件系统,存档不是单个文件而是一个目录,目录名由"用户ID + 游戏ID"按固定公式算出来。核心逻辑在 savedata_factory.cpp 的GetFullPath方法:用户账号存档(Account 类型,即按账号隔离的存档)路径固定为/user/save/0/<user_id>/<title_id>,其中user_id是 128 位标识、显示为 32 个十六进制字符,title_id是游戏标识的 16 位大写十六进制。

// 打开存档时优先查新位置,查不到才走旧路径 if (future_dir != nullptr) { return future_path; // 新位置存在就直接用它 }

系统实际维护着两套位置:旧格式save/0/<user_id>/<title_id>,新格式save/account/<user_id-uuid>/<title_id>。打开时先探测新位置,存在就用(见源码第 116–125 行)。所以找存档时两个位置都得看,别只认旧格式。

分步实操:从用户ID到具体存档

第一步:确认你要操作的账号 user_id。每个游戏账号对应一个 128 位user_id,先拿到它,后面所有路径都靠它算出来。

第二步:按公式生成两个候选路径。旧格式的计算逻辑只有短短一行:

// 旧格式:save/0/<user_id>/<title_id>,全部大写十六进制 return fmt::format("/user/save/{:016X}/{:016X}{:016X}", 0, user_id[1], user_id[0]);

新格式则替换成/user/save/account/<uuid>/<title_id>。先查旧路径、再查新路径,哪边存在哪边就是目标存档目录。

第三步:修改前先整目录备份。存档目录里有个.sudachi_save_size文件(注意开头的点,属于隐藏文件),共 16 字节,前后各 8 字节记录主数据与日志区大小。动手前把整个目录复制一份,出错了才有得救。

第四步:用十六进制编辑器改数据,同步更新尺寸记录。改完如果数据体积变了,要把.sudachi_save_size里的数值一起改,否则模拟器只会按旧尺寸读取,改动等于白做。

第五步:进游戏跑一遍,确认能正常读取。模拟器每次启动都会清空temp临时目录(见第 56–62 行),临时区里的东西别当作长期数据存放。

踩坑与自检:这几点最容易让存档"变空"

  • 尺寸文件名别记错。它叫.sudachi_save_size而不是save_size.dat,定义在 savedata_factory.h;文件缺失或不足 16 字节时,模拟器会把存档尺寸直接当作 0 处理。
  • 路径格式不要只写死一套。新旧格式共存,新格式的目录名里用户ID还带连字符(UUID 风格),只查一边就可能漏掉存档。
  • 系统级存档别乱碰。Account 与 Device 两类存档在打开时会自动创建,但 System(系统级)存档涉及整台虚拟系统,改错影响面大,⚠️ 非必要不修改。
  • 修改前自检清单:① 目录名是否为 32 位 + 16 位十六进制结构;② 备份是否已完成;③ 尺寸文件是否恰好 16 字节;④ 改完后是否进游戏验证过一次。

想写个小工具批量算路径的话,直接参考静态方法GetUserGameSaveDataRoot(user_id, future)的实现(见第 147–154 行),几行代码就能复刻新旧两种根目录。

下一步可以做什么

路径逻辑拿到手后,顺手就能套上界面:用 Qt(模拟器自身所用的界面框架)搭一个目录浏览器加十六进制编辑器,再补上批量备份与模板迁移。再往后,可以结合模拟器的 network 模块 给存档加同步能力。实施优先级建议:先写路径计算和备份这两个可独立验证的功能,再接编辑器界面,最后做批量与同步——这样即使后两期没做完,前面也已经是一套能用的工具了。

【免费下载链接】sudachiSudachi is a Nintendo Switch emulator for Android, Linux, macOS and Windows, written in C++项目地址: https://gitcode.com/GitHub_Trending/suda/sudachi

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进