一个 steam 创意工坊模组版本管理的设想

背景

当你给游戏打了许多mod,游玩的常态是玩游戏五分钟,调 mod 两小时。而当游戏更新或mod更新后,辛苦完成的排序工作又要推倒重来。更雪上加霜的是steam创意工坊强制更新到最新版本,隔一段时间打开游戏发现冲突,想要回退到可玩的版本都不行,即使游戏的版本可以回退,已更新的mod和未更新的mod无论游戏版本新旧都会冲突。

部分游戏的mod管理器,例如P社游戏的 IronyModManager,可以导出一个可玩的mod合集文件,当游戏更新发生冲突后只需回退游戏版本就可游玩。但这种方式有很多弊端:

  • 导出的合集文件需要手动管理
  • 不同合集中相同的mod文件会重复占用体积,对于许多mod比本体大的游戏占用的磁盘空间不能忽略
  • 想要部分升级或修改合集中的mod较为困难

设想解决方案

我设想了一种创意工坊的版本管理方式,包含创意工坊版本控制和modlist维护两大功能

版本控制

监测创意工坊文件夹发生变更,复制出变动的 mod 文件夹并记录更新时间。更新时间不知道有没有API提供,没有的话可以写个爬虫从网页获取。在支持cow的文件系统中,这样应该不会占用太多额外空间(NTFS不支持,Windows或许可以用第三方的Btrfs)。一段时间后,自动删除不存在于任何 modlist 中的 mod 版本。

还想到另一种方式,定期调用 steam-cli 下载并更新 mod,这样可以将版本控制完全集成,可以替代创意工坊的订阅功能。

modlist 维护

前提条件是游戏的 mod 管理器支持导入和导出 modlist,设想的维护功能有以下几点:

  • 记录并备份当前可玩的 modlist 中的 mod 版本以及当前的游戏版本
  • 导出包含版本的 modlist
  • 一段时间后自动删除不包含在任何 modlist 中的 mod 版本
  • 一些对模组管理器的增强功能
    • 修改 modlist,例如更新或回退 mod 版本,增添或删除 mod
    • modlist 之间的互相引用
    • 记录 mod 依赖关系
    • 记录 mod 分类以方便排序
    • 设置排序规则检测 modlist 是否满足
    • 检测 modlist 中的过期mod

程序编写

modlist 导入和导出需要对特定游戏进行适配,最开始打算做的是P社的几款游戏,后续可能加上文明6。

计划用 python 写一个 cli 程序,命令仿照着包管理器来。毕竟应该没什么性能需求而且我也只会 python。最近在学着用 nix,不知道 nix 能不能实现上面的功能。

完全没有开发经验,各位有什么意见或建议十分欢迎,以我个人的拖延症有成果之日怕是遥遥无期。

对于rimworld来说,我最难受的就是可能过两天就不记得这个英文名字没有简介的mod到底是干什么用的了。
如果能有个mod的备注就好了。

用于参考:

这是我针对 Left 4 Dead 2 的创意工坊制作的合集。(很久没维护了,因为很久不玩了)

完全基于 Steam 自身功能。

主合集起到索引效果,下面的子合集根据游戏进行合理的 mod 分类。

以 Left 4 Dead 2 为例,有很多武器 mod,我把所有替换原版 Uzi 的 mod 放在一起,玩的时候,只需要保证取消所有订阅,并只开启我想玩的那个,就能避免 mod 冲突。

Steam Workshop::L4D2 MOD整理总索引 By DavidJoy

这个方式的整理过程十分麻烦,但是能够对大部分 mod 进行充分的认识。

发现一个 L4D2 的模组管理器

感觉功能设计得挺好的

FireAxe
https://github.com/ktxiaok/FireAxe
https://www.bilibili.com/video/BV1gfcZekE5Z/