「某个夏天 某个时候」 #
最近橙子更新了 bh 3.0 的 beta 测试分支。
让我看看现在是哪年。
但是 steam 管理游戏分支的方式让人很不满意。
虽然这跟开发者和分支的性质也有一定的关系。比如 Rabi-Ribi 或者 Starbound 不借助 steam 而是使用游戏本体自己管理分支。
橙汁作为 beta 测试,现在的做法没什么问题。
只是觉得每次切换分支都要重新从 steam 拉取 depot 有些遗憾罢了。
本地化分支管理的方法 #
简单一点,不考虑增量更新的话,在适当的分支下,切换本地游戏文件就好了。
对于橙汁而言,很容易想到下面 3 种方案。(只讨论通过 steam 启动的情况。)
- 更换
Steam/steamapps/common/100 Orange Juice/
的指向 - 更换
Steam/steamapps/common/100 Orange Juice/data
以及exe
的指向 - 对比不同 depot 之间各个文件的 md5 ,最小化更新软连接的指向
3 个方案的复杂程度递增、资源消耗递减。
对于不通过 steam 来启动橙汁,而是通过「添加 appid」或者「利用其他的 steam_api.dll,比如 cream_api 或者 goldbergEmu」 从进程直接连接到 steam 的方法,在存储的时候同样可以是以上三种思路。
羽希的实例 #
羽希采用第 2 种方案。
先上切换用到的 shell,比较简单,通过变更软连接的指向来管理版本。
利用 select
语法制作选项。
STEAM_HOME="/home/haneki/.local/share/Steam/"
OJ_HOME=$STEAM_HOME"steamapps/common/100 Orange Juice/"
BRANCH_HOME=$OJ_HOME".branch/"
if [ ! -f "branch" ]; then
touch "branch"
else
echo "*"`cat branch`
echo ""
fi
function funSwitchBranch(){
echo "switch to branch $1"
# data
ln -snf "${BRANCH_HOME}${1}data" "${OJ_HOME}data"
# exe
ln -snf "${BRANCH_HOME}${1}100orange.exe" "${OJ_HOME}100orange.exe"
# exe_x86
ln -snf "${BRANCH_HOME}${1}100orange_x86.exe" "${OJ_HOME}100orange_x86.exe"
# config
# not sure how to do
# manifest
ln -snf "${BRANCH_HOME}${1}appmanifest_282800.acf" "${STEAM_HOME}steamapps/appmanifest_282800.acf"
echo $branch > branch
}
# branch list
echo find branch
branchListIndex=0
for branch in `ls -F "$BRANCH_HOME" | grep "/"`
do
branchList[$branchListIndex]=$branch
echo " "$branch
((branchListIndex++))
done
echo ""
echo "select branch in "
select branch in "${branchList[@]}"
do
funSwitchBranch $branch
break
done
运行输出
下面是目录结构
其中.branch
的目录结构如下
branch
├── beta-bh-3
│ ├── 100orange.exe <- ${OJ_HOME}100orange.exe
│ ├── 100orange_x86.exe <- ${OJ_HOME}100orange_x86.exe
│ ├── appmanifest_282800.acf <- ${STEAM_HOME}steamapps/appmanifest_282800.acf
│ ├── beta_config.dat <- ${OJ_HOME}beta_config.dat
│ └── data <- ${OJ_HOME}data
│ ├── alphamasks.pak
│ :
│ └── voice_sys_yuuki.pak
├── default
│ ├── 100orange.exe
│ ├── 100orange_x86.exe
│ ├── appmanifest_282800.acf
│ ├── config.dat
│ └── data
│ ├── alphamasks.pak
│ :
│ └── voice_sys_yuuki.pak
└── switch.sh
appmanifest_282800.acf 记录了游戏的 depotid。
同样适用于切换不同的 depot。
如果采用上述的第三种做法,对比不同 depot 之间各个文件的 md5 ,最小化更新软连接的指向
,比如本次的 bh 更新中,data 目录下只有 alphamasks.pak bgmpackrogue.pak cards.pak cardsystem.pak codex.pak define.pak events.pak fbfadd.pak field.pak playerplate.pak se.pak system.pak units.pak
的 md5 发生了变化,在监听到后,可以只更新变动文件的软连接。