解决PalWorld存档提取难题:XGP-save-extractor技术实现全解析

解决PalWorld存档提取难题:XGP-save-extractor技术实现全解析

【免费下载链接】XGP-save-extractor Python script to extract savefiles out of Xbox Game Pass for PC games 【免费下载链接】XGP-save-extractor 项目地址: https://gitcode.com/gh_mirrors/xg/XGP-save-extractor

你是否曾因Xbox Game Pass(XGP)平台的PalWorld存档无法备份而焦虑?当游戏崩溃导致数百小时进度丢失时,是否只能束手无策?本文将深入剖析XGP-save-extractor项目如何通过技术创新解决这一痛点,重点解析新增PalWorld支持的实现原理、代码架构与最佳实践。读完本文,你将掌握Windows应用包(Appx)存档提取技术、容器格式解析方法,以及如何为新游戏扩展提取器功能。

存档提取痛点与解决方案概述

XGP平台采用特殊的加密容器格式存储游戏存档,与Steam等平台的直接文件系统存储不同,其存档文件被分割为多个GUID命名的二进制文件,保存在%LOCALAPPDATA%\Packages目录下的应用私有空间。这种设计虽提升了安全性,却给玩家备份存档带来极大困难。

核心痛点分析

  • 存档文件被加密容器包裹,无法直接访问
  • 文件名采用GUID哈希,失去可读性
  • 多容器存储结构复杂,不同游戏格式差异大
  • 云同步机制可能导致本地文件不完整

XGP-save-extractor通过以下技术路径解决这些问题:

  1. 解析containers.index索引文件定位存档容器
  2. 根据游戏类型匹配对应的提取策略(handler)
  3. 重构文件系统结构并打包为标准ZIP格式
  4. 处理特殊格式的转换与修复(如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))

这段代码完成了三个关键操作:

  1. 遍历所有存档容器
  2. 转换容器名为文件系统路径
  3. 关联实际存储的二进制文件
3. 集成到主流程

提取器主流程通过以下步骤处理PalWorld存档:

  1. discover_games中检测已安装的PalWorld应用包
  2. 通过find_user_containers定位用户存档目录
  3. 调用read_user_containers解析容器结构
  4. 应用"palworld" handler生成存档路径映射
  5. 打包为palworld_<用户名>_<时间戳>.zip文件

技术架构深度解析

XGP-save-extractor采用模块化设计,核心架构分为五大模块:

mermaid

关键技术点解析

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
starfieldSFS文件拼接Starfield
controlChunk文件生成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))

最佳实践与注意事项

存档提取前检查清单

  1. 云同步状态确认:确保XGP云同步完成,避免提取不完整文件

    # 检查备份目录存在性
    if "backup" in entry.name:
        print("!! 检测到云同步备份文件,可能同步未完成 !!")
    
  2. 多用户环境处理:支持同一台电脑多账户存档提取

    for xbox_username_or_id, container_dir in user_containers:
        # 为每个用户单独生成ZIP包
    
  3. 错误处理与日志:完善的异常捕获机制

    try:
        # 提取存档逻辑
    except Exception:
        print(f"提取失败: {traceback.format_exc()}")
    

性能优化建议

  1. 临时文件管理:使用tempfile.TemporaryDirectory处理中间文件
  2. 延迟清理:设置ignore_cleanup_errors=True避免权限问题
  3. 批量处理:对多容器游戏采用并行读取(需注意线程安全)

技术演进与未来展望

XGP平台的存档格式处于不断演化中,如Starfield近期更新已将存档格式从"PnP"结构改为"BlobDataN"结构。为此,项目需要建立持续适配机制:

  1. 格式检测机制:自动识别存档格式版本

    is_new_format = "toc" in [f["name"] for f in container["files"]]
    
  2. 社区驱动更新:通过games.json热更新支持新游戏

  3. 自动化测试:建立存档格式测试用例库

未来版本计划添加的功能:

  • 存档加密/解密支持
  • 云存档直接下载
  • 多平台存档转换(如XGP→Steam)
  • GUI界面与存档管理功能

总结与实用工具

XGP-save-extractor通过解析Windows应用包容器格式,成功解决了PalWorld等XGP游戏的存档提取难题。核心价值在于:

  1. 技术层面:实现了封闭系统的开放访问,突破平台限制
  2. 实用层面:为玩家提供存档备份保障,降低游戏风险
  3. 生态层面:为同类工具开发提供参考架构与实现思路

快速使用指南

  1. 克隆项目代码库:

    git clone https://gitcode.com/gh_mirrors/xg/XGP-save-extractor
    
  2. 运行提取器:

    cd XGP-save-extractor
    python main.py
    
  3. 提取结果将保存为palworld_<用户名>_<时间戳>.zip文件

通过本文的技术解析,你不仅了解了PalWorld存档提取的实现细节,更掌握了Windows应用包数据解析的通用方法。当面对新的XGP游戏存档提取需求时,可按照"分析容器结构→设计转换规则→实现handler→测试验证"的流程快速解决问题。

【免费下载链接】XGP-save-extractor Python script to extract savefiles out of Xbox Game Pass for PC games 【免费下载链接】XGP-save-extractor 项目地址: https://gitcode.com/gh_mirrors/xg/XGP-save-extractor

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

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值