【NeosVR】Linuxでも仮想通貨で遊びたい

こんばんは。きさらぎです。この記事は[NeosVR(その2) Advent Calendar 2022](https://adventar.org/calendars/7624)の7日目です。
昨日の記事はきさらぎの「[NeosVRと私 (2022年版)](https://qiita.com/KisaragiEffective/items/c321a77d8a7e8b0a9cb5)」でした。
今日のは一番軽い記事です。多分。

## 更新履歴
* 2022年12月13日更新: **Windowsが要らなくなりました！！**
* 2022年12月9日更新: **`CloudX.Shared.dll`も置き換えが必要です！！**

## モチベ
Linuxにはスタンドアロンインストーラーが存在しないのでSteam経由で起動することになります。しかし、Steamは2021年10月の利用規約改定でゲームに仮想通貨を含むことを禁止したので、NeosVRも仮想通貨が使えなくなりました[^2] [^3]。

しかし、私[^1]はそんなことで仮想通貨を使うことを諦めたくありませんでした[^4]。そこで目をつけたのがWindows版のスタンドアロン版です。スタンドアロン版はSteamを経由しないので、当然上述の制限もないはずです。私は*いろいろ*と調査して、次の手順で*強制的*に有効化することができることを確認しました。

## 手順
```sh:script.sh
#!/bin/bash
# The author of this script, KisaragiEffective and Kisaragi Marine, put this script 
# under CC0. Please refer https://creativecommons.org/publicdomain/zero/1.0/legalcode to
# its full-text.

red() {
  tput setaf 1
}

green() {
  tput setaf 2  
}

reset() {
  tput sgr0
}

die () {
  echo "[$(red)ERROR$(reset)] $(echo "$@")$(reset)"
  exit 1
}

# is /dev/stdout piped?
if [ -t 1 ]; then
  color=
else
  color=1
fi

if [[ -z "$neos_install_dir" ]]; then
  neos_install_dir="~/.steam/steam/steamapps/common/NeosVR"
fi

if [[ ! -d "$neos_install_dir" ]]; then
  die "install location $neos_install_dir does not found. Please set \$neos_install_dir explicitly with yout installation path. NOTE: ~ must be replaced with $HOME"
fi

latest_version="$(curl -sSL4 https://assets.neos.com/install/Pro/Public)"
sz="$(mktemp).7z"

wget -q4O "$sz" "http://assets.neos.com/install/Pro/Data/${latest_version}.7z"

# check file
du -b $sz
sha512sum $sz

# extract
dest="$(mktemp -d)"
if [[ -f "$(which 7zr 2>/dev/null)" ]]; then
  # partial extract (more effecient)
  echo "extracting to $dest. backend: 7zr"
  mkdir -p "$dest/Neos_Data/Managed"
  (cd "$dest/Neos_Data/Managed" && 7zr e "$sz" Neos_Data/Managed/FrooxEngine.dll Neos_Data/Managed/CloudX.Shared.dll)
  clean_sz_on_exit=1
elif [[ -f "$(which p7zip 2>/dev/null)" ]]; then
  # full extract
  echo "extracting to $dest. backend: p7zip"
  (cd "$dest" && p7zip -d "$sz")
else
  echo "$(red)p7zip is required!!$(reset)" >&2
fi

# copy
for f in "FrooxEngine.dll" "CloudX.Shared.dll"; do
  from="$dest/Neos_Data/Managed/$f"
  to="$neos_install_dir/Neos_Data/Managed/$f"
  echo "copy: $(green) ${from} $(reset) to $(green) $to $(reset)"
  if [[ -z "$dry_run" ]]; then
    cp "$from" "$to" || die "FATAL: archive does not contain $f"
  else
    :
  fi
done

# finish
echo "$(green)Replacing is done!$(reset)" >&2
rm -r "$dest"
[[ ! -z "$clean_sz_on_exit" ]] && rm "$sz"

```

## おわりに
最初MODを作ろうかと思っていましたが、シェルスクリプトを動かすだけで済むようなので計画を凍結しました。
置き換えるのが不安な方は実行する前に以下のコマンドを動かして望まない差分が生まれていないかどうか確認してください。

```bash
sudo apt-get install -y dotnet-sdk-6.0
# npmと違い、sudoは要らない
dotnet tool install assembly-differ --global
# なぜか`dotnet assembly-differ`で起動しなかった
~/.dotnet/tools/assembly-differ 'assembly|win/FrooxEngine.dll' 'assembly|linux/FrooxEngine.dll'
~/.dotnet/tools/assembly-differ 'assembly|win/CloudX.Shared.dll' 'assembly|linux/CloudX.Shared.dll'
```

仮に確認しないでコピーして、かつ振る舞いがおかしくなっても、Steamからゲームファイルの修復をすればいいのでロールバックも簡単ですよ、ぜひやりましょう。

## Special Thanks
* [@kazu0617](https://qiita.com/users/kazu0617) さん - Windowsを使わない方法の概要を提供していただきました

[^1]: Linux Nativeクライアントを使っているユーザーはかなり少ないですが、だからといって情報を伏せておくのは将来のためにならないのでこれを機に公開します。
[^2]: Wineを強制的に有効化してランチャーから起動したら制限が外れるかと思いましたが、残念ながらそうはなりませんでした。
[^3]: https://discord.com/channels/402159838827905024/468504846522384394/903927102020149248
[^4]: NCRをつかってゲームセンターやスロットマシンを楽しむのが理想なので…。
[^5]: 本体のコードをMOD (より正確には、`*.dll`) にそのまま入れて配布すると、利用規約に抵触し私のNeosVRライフが終わる危険性があるので今回は選択肢から除外しました。