解决PalWorld存档提取难题:XGP-save-extractor技术实现全解析
你是否曾因Xbox Game Pass(XGP)平台的PalWorld存档无法备份而焦虑?当游戏崩溃导致数百小时进度丢失时,是否只能束手无策?本文将深入剖析XGP-save-extractor项目如何通过技术创新解决这一痛点,重点解析新增PalWorld支持的实现原理、代码架构与最佳实践。读完本文,你将掌握Windows应用包(Appx)存档提取技术、容器格式解析方法,以及如何为新游戏扩展提取器功能。
存档提取痛点与解决方案概述
XGP平台采用特殊的加密容器格式存储游戏存档,与Steam等平台的直接文件系统存储不同,其存档文件被分割为多个GUID命名的二进制文件,保存在%LOCALAPPDATA%\Packages目录下的应用私有空间。这种设计虽提升了安全性,却给玩家备份存档带来极大困难。
核心痛点分析:
- 存档文件被加密容器包裹,无法直接访问
- 文件名采用GUID哈希,失去可读性
- 多容器存储结构复杂,不同游戏格式差异大
- 云同步机制可能导致本地文件不完整
XGP-save-extractor通过以下技术路径解决这些问题:
- 解析
containers.index索引文件定位存档容器 - 根据游戏类型匹配对应的提取策略(handler)
- 重构文件系统结构并打包为标准ZIP格式
- 处理特殊格式的转换与修复(如Starfield的SFS文件拼接)
PalWorld支持的技术实现
存档格式逆向工程
通过对PalWorld应用包(PocketpairInc.Palworld_ad4psfrxyesvt)的存档目录分析,发现其采用"单容器单文件"(1c1f)的基础架构,但具有独特的路径编码规则:
原始容器名:"SaveData-0000-Player-0000"
转换规则:将"-"替换为目录分隔符,添加".sav"后缀
结果路径:"SaveData/0000/Player/0000.sav"
这种层级结构使得存档文件自然组织为角色/进度的目录树,为后续的提取和备份提供了清晰的逻辑结构。
代码实现三要素
1. 游戏元数据配置(games.json)
在项目的games.json文件中,为PalWorld添加专属配置条目:
{
"name": "Palworld",
"package": "PocketpairInc.Palworld_ad4psfrxyesvt",
"handler": "palworld"
}
package字段对应Windows应用包的唯一标识handler指定使用"palworld"专用处理逻辑
2. 专用处理函数(main.py)
在get_save_paths函数中实现PalWorld特有的路径转换逻辑:
elif handler_name == "palworld":
for container in containers:
fname = container["name"]
# 将容器名中的"-"替换为目录分隔符
fname = fname.replace("-", "/")
# 添加标准.sav后缀
fname += ".sav"
fpath = container["files"][0]["path"]
save_meta.append((fname, fpath))
这段代码完成了三个关键操作:
- 遍历所有存档容器
- 转换容器名为文件系统路径
- 关联实际存储的二进制文件
3. 集成到主流程
提取器主流程通过以下步骤处理PalWorld存档:
- 在
discover_games中检测已安装的PalWorld应用包 - 通过
find_user_containers定位用户存档目录 - 调用
read_user_containers解析容器结构 - 应用"palworld" handler生成存档路径映射
- 打包为
palworld_<用户名>_<时间戳>.zip文件
技术架构深度解析
XGP-save-extractor采用模块化设计,核心架构分为五大模块:
关键技术点解析
1. Windows应用包存档结构
XGP游戏存档遵循Windows应用模型,存储路径格式为:
%LOCALAPPDATA%\Packages\<package_name>\SystemAppData\wgs\<user_id>_<title_id>
其中包含两类关键文件:
containers.index:存档容器索引,记录所有容器的元信息{GUID}\container.{n}:实际存储的二进制容器文件
2. 容器索引解析
read_user_containers函数解析索引文件的核心代码:
with containers_idx_path.open("rb") as f:
# 跳过4字节未知头
f.read(4)
# 读取容器数量
container_count = struct.unpack("<i", f.read(4))[0]
# 读取包名等元数据
pkg_display_name = read_utf16_str(f)
store_pkg_name = read_utf16_str(f).split("!")[0]
for _ in range(container_count):
container_name = read_utf16_str(f) # 容器名
f.read(4) # 跳过未知数据
container_guid = uuid.UUID(bytes_le=f.read(16)) # 容器GUID
# 读取容器内文件信息...
这段代码处理了Windows特有的UTF-16编码字符串和FILETIME时间戳格式,通过结构体解析(struct.unpack)实现二进制数据的反序列化。
3. 多游戏处理策略设计
项目采用策略模式(Strategy Pattern)处理不同游戏的存档格式差异,目前支持12种处理策略:
| 策略名称 | 适用场景 | 代表游戏 |
|---|---|---|
| 1c1f | 单容器单文件 | Atomic Heart |
| 1cnf | 单容器多文件 | Hades |
| 1cnf-folder | 多容器多文件夹 | Persona 5 Royal |
| palworld | 路径转换处理 | PalWorld |
| starfield | SFS文件拼接 | Starfield |
| control | Chunk文件生成 | Control |
这种设计使得添加新游戏支持只需实现对应的handler函数,无需修改核心逻辑,符合开闭原则。
实战指南:为新游戏扩展支持
假设需要为"幻兽帕鲁"的DLC添加支持,只需以下三步:
步骤1:添加游戏元数据
编辑games.json,添加DLC的应用包信息:
{
"name": "PalWorld - DLC",
"package": "PocketpairInc.PalworldDLC_ad4psfrxyesvt",
"handler": "palworld"
}
步骤2:验证容器结构
执行提取器的发现功能,验证DLC存档路径:
# 伪代码示例
for package_name in found_games:
if "PalworldDLC" in package_name:
user_containers = find_user_containers(package_name)
print(f"发现PalWorld DLC容器: {user_containers}")
步骤3:适配处理策略
如果DLC采用不同的命名规则,扩展handler函数:
elif handler_name == "palworld-dlc":
for container in containers:
fname = container["name"]
# DLC特有路径转换逻辑
fname = fname.replace("_", "/").replace("DLC", "dlc")
fname += ".dlc.sav"
save_meta.append((fname, fpath))
最佳实践与注意事项
存档提取前检查清单
-
云同步状态确认:确保XGP云同步完成,避免提取不完整文件
# 检查备份目录存在性 if "backup" in entry.name: print("!! 检测到云同步备份文件,可能同步未完成 !!") -
多用户环境处理:支持同一台电脑多账户存档提取
for xbox_username_or_id, container_dir in user_containers: # 为每个用户单独生成ZIP包 -
错误处理与日志:完善的异常捕获机制
try: # 提取存档逻辑 except Exception: print(f"提取失败: {traceback.format_exc()}")
性能优化建议
- 临时文件管理:使用
tempfile.TemporaryDirectory处理中间文件 - 延迟清理:设置
ignore_cleanup_errors=True避免权限问题 - 批量处理:对多容器游戏采用并行读取(需注意线程安全)
技术演进与未来展望
XGP平台的存档格式处于不断演化中,如Starfield近期更新已将存档格式从"PnP"结构改为"BlobDataN"结构。为此,项目需要建立持续适配机制:
-
格式检测机制:自动识别存档格式版本
is_new_format = "toc" in [f["name"] for f in container["files"]] -
社区驱动更新:通过games.json热更新支持新游戏
-
自动化测试:建立存档格式测试用例库
未来版本计划添加的功能:
- 存档加密/解密支持
- 云存档直接下载
- 多平台存档转换(如XGP→Steam)
- GUI界面与存档管理功能
总结与实用工具
XGP-save-extractor通过解析Windows应用包容器格式,成功解决了PalWorld等XGP游戏的存档提取难题。核心价值在于:
- 技术层面:实现了封闭系统的开放访问,突破平台限制
- 实用层面:为玩家提供存档备份保障,降低游戏风险
- 生态层面:为同类工具开发提供参考架构与实现思路
快速使用指南:
-
克隆项目代码库:
git clone https://gitcode.com/gh_mirrors/xg/XGP-save-extractor -
运行提取器:
cd XGP-save-extractor python main.py -
提取结果将保存为
palworld_<用户名>_<时间戳>.zip文件
通过本文的技术解析,你不仅了解了PalWorld存档提取的实现细节,更掌握了Windows应用包数据解析的通用方法。当面对新的XGP游戏存档提取需求时,可按照"分析容器结构→设计转换规则→实现handler→测试验证"的流程快速解决问题。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



