橙汁分支管理

橙汁分支管理

「某个夏天 某个时候」 #

最近橙子更新了 bh 3.0 的 beta 测试分支。

让我看看现在是哪年。

bh-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 发生了变化,在监听到后,可以只更新变动文件的软连接。