はじめに
本記事は、東方のプレイデータをGitで管理するPowerShellスクリプトを作成したので、その使用法についての解説となります。
Win版第一弾の『東方紅魔郷』は2002年にコミックマーケットC62で配布されました。
紅魔郷、妖々夢、永夜抄は「Windows版三部作」とされSteamでこそ配信されないまでも今でも新品が流通しています。
当たり前ながら東方にはクラウドセーブなんて便利な機能はありません。しかし、複数のPCでプレイデータを同期しながらプレイしたいという人は多いでしょう。今回はこの同期をGitとPowerShellで実現します。
同期のポピュラーな方法としてGoogle Drive/ OneDriveがあります。しかし、単純なクラウド同期だと同時に書き込みが起きたとき衝突してそのままデータがおなくなりになる可能性があります。Gitであれば衝突することはあれど変更ごとに巻き戻ることが可能です。
サークルの先輩のモデリングデータがGoogleDriveでお亡くなりになっていて可哀想だった
そこで「Windows版三部作」がでた当時存在しなかった、最新のバージョン管理システム「Git」(※1)を使用してこの課題に取り組んで行こうではありませんか。
注釈1)Gitは2005年に開発がスタート、リリースされています。ちなみに2005年は花映塚がリリースされた年であり、筆者の生まれ年です。そして筆者は二十歳になりました。怖いですね
Git/GitHubについて
Gitとは
Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.
とあるように分散バージョン管理システムです。主にソースコードの管理に用いられています。変更履歴を管理できるツールくらいに捉えてください。
GitHubとは
平たく言うとGitをホストしているサービスの一つです。
インストール場所について
データを同期するのにあたり、そもそもどこにプレイデータが保存されているかを知っておく必要があります。
ネット上ではリプレイファイルの場所について、次の2通りの言説があります
- インストール先直下
- VirtualStore\Program Files (x86)\東方xxx
なぜこのように記述が別れているかというとWindowsの仕様のせいです。本来プログラムが意図した位置はインストール先直下です。
東方のデフォルトのインストール先は
C:\Program Files (x86)\東方xxx
です。(紅魔郷だけはProgram Filesであったり、新しめの作品はC:\Program Files (x86)\上海アリス幻樂団\東方xxx)
となっているので、本来の意図した挙動としては次のように保存されるのですが
C:\Program Files (x86)\東方xxx\replay
Windowsは後に導入されたUAC(ユーザーアカウント制御)によって
Program Files下に変更が加えられた場合
C:\Users\<user>\AppData\Local\VirtualStore\Program Files (x86)\東方xxx
にファイルを保存するようになってしまいました。
UACはWindows Vistaの頃より導入されているので、大抵の方は
C:\Users\<user>\AppData\Local\VirtualStore\Program Files (x86)\東方xxx
にセーブデータが入っていると考えてよいです。
今回Gitでリプレイファイルを管理するにあたり、
C:\Program Files (x86)\東方xxx
へインストールするのではなく、別の場所に保存することを推奨します。
例えばそうですね、
C:\幻想郷
とかいいのではないでしょうか。(フォルダ名に日本語を含めるのは場合によってはよろしくないですが、東方はすでにフォルダ名が日本語なので今更です)
フォルダ構成
東方フォルダ構成はこんな感じです。作品によって少しずつ異なりますが、私が知る範囲(th06-09)は大体こんな感じです。
この中からscore.dat,th**.cfgとreplayファイルをステージすることにします。
[インストール先フォルダ] (任意の名称)
├── replay/ (リプレイデータ格納フォルダ: *.rpy) ※1
├── custom.exe (環境設定用実行ファイル)
├── th**.exe (ゲーム本体実行ファイル)
├── th**.cfg (設定ファイル)
├── score.dat (スコアおよびクリア状況保存データ) ※1
├── log.txt (動作ログファイル) ※1
└── readme.txt (説明書)
※1 :初回起動するまでなかったりします
使い方
では実際にやっていきましょう。
絶対に事前バックアップをとっておいてください。
準備
すでに非システムフォルダにインストールされている場合は飛ばしてください。
CDとCD(or DVD, Blu-ray)ドライブを用意してください。今回用意したのはこちら、Win版第三作、永夜抄。

水羊羹を食べながらインストール完了を待ちます
スクリプトを実行
インストール先の親フォルダ(この場合はC:\幻想郷)でコマンドプロンプトを立ち上げて、次のコマンドを入力します。エクスプローラで該当フォルダを開いてアドレスバーにcmdと入力すると楽です。
curl -o thgit.ps1 https://raw.githubusercontent.com/ru322/thgit/main/thgit.ps1
powershell -ExecutionPolicy Bypass -NoExit -File "thgit.ps1"
注意1) Gitが導入されていないときはWingetから導入されるようにしていますが、デバッグできていないので動くかはわかりません。駄目でしたら頑張って入れてください。
注意2) Gitにユーザ情報を登録していないとコミットができません。GitHubに登録したメールアドレスとユーザ名を設定して下さい
$ git config user.email "you@example.com"
$ git config user.name "Your Name"
リモートリポジトリのURLが求められると思うので入れて下さい。GitHubで新しいリポジトリを作成することをおすすめします。
↓このURLを踏むとGitHubのリポジトリ新規作成ページに遷移できます。
https://repo.new
このように、リポジトリ名を適当に設定(ここではthsync)、公開範囲はPrivateで作成します(プレイを共有したいならばPublicでも良いですが、結構リスキーです。私は推奨しませんし責任も取りません)

そうすると、次のようなリンクをもらえるのでこれを入力してください。

正常に動作すれば、デスクトップにショートカットが生成されるはずです。(すでに存在する場合は上書きされます)
ショートカットをクリックしてみましょう。ターミナルが起動し、起動時にpullが、終了時にpushが走るはずです。
作品を複数管理したい場合は同一フォルダに作品をまとめてください。つまり、ディレクトリ構成は次のようになります。
[親フォルダ(`C:\幻想郷`)] (任意の名称)
├── thgit.ps1
├── 東方紅魔郷
├── 東方永夜抄
├── 東方妖々夢
├── ...
├── .gitignore
├── ...
└── thgit-setup
不用意に.gitignoreを触らないでください。
うまく同期がされないとき
同期されないけど、シェルが落ちてしまってエラーが読めない場合は、thgit.logがシェルスクリプトと同階層に存在するはずなのでそちらを読んでください。
2台めのPCを登録する場合は、同じ様にインストールしたのち、先程のコマンドを実行します、多分初回のプルでコンフリクトするはずなので、リモートを受け入れる操作をしてください。
セットアップをやり直したい場合は、親フォルダに存在するthgit-setupを削除してから、thgit.ps1を立ち上げてください。セットアップをやり直すだけならばローカルリポジトリは保持されます。
powershell -ExecutionPolicy Bypass -NoExit -File "thgit.ps1"
ちょっとした設計の解説
正直大したことはやっていません。というかこのような要件を伝えて、あとはOpusがやってくれたという話もあります。
スクリプトはGitHubに公開されています。どうなっているのか確認したい人はゆっくりみていってください。
https://github.com/ru322/thgit
初回セットアップ時
- Gitのインストール確認
- Git初期化
- 除外設定の生成
- ショートカットの作成
通常起動時
- ソフト起動前に更新確認
- 終了後に変更をコミット・プッシュ
蛇足
作成するに当たって引っかかったところと気をつけるところを軽く挙げてみようと思います。
-
.gitattributesの設定
東方は、score.datにプレイ時間や挑戦回数などが記録されるのですが、jsonの様に人が読めるものではなく、バイナリです。というかプレイデータは全てバイナリなので.gitattributesでバイナリだよと指定してあげないと、うまく同期されないです。起動し直すごとにプレイ時間が数十時間加算される摩訶不思議な体験を味わうことになります。 -
.gitignore
東方をGitで管理するとき、ゲーム実行ファイルなどが含まれてしまうと、複製にあたるおそれがあります。もしpublicリポジトリでやらかしてしまえば、二次配布です。
明確にアウトなので十分に注意してください。 -
ファイルロック
ユーザデータはソフトが終了してもしばらく解放されません。なので、終了後すぐにpushしようとするとエラーになってしまうことがあります。ここでは時間をおいて数度トライすることで押し切りました。 -
PowerShellとエンコード
どうやらPowerShell(.ps1)はUTF-8(BOM無し)かつ日本語を含んでいるとエラーを吐いてしまってどうしようもないです。今回はShift-JISエンコードにすることで乗り切りましたがあまり気分は良くないです。
おわりに
身内(MCC)に東方原作をプレイしておられる方はいないのでこの記事は完全に外部に向けて書かれています。
そして、東方原作をプレイしている方で、データをGitで管理したいという酔狂な方がいるのかという疑問はつきませんが、何より私が欲しいので良いのです。これで大学で遊べる
ではではよき弾幕ライフを
