Hearthstone accessの開発環境を構築する

いくつかはまりポイントがあるので手順をメモっておく

基本は開発ツールがとてもよくできているので問題ないのですが、所々トラップがあるので、自分でもう1回最初からできる気がしません。なのでメモです。

ちなみに、開発環境を興味本位で構築してみましたが、 Hearthstone Access 事態が非常に洗練されていて安定しているので、特にやることは見つかってませんw

初めに

この方法は、開発元である Blizzard によって認められている方法のようです。なので、ここでも紹介します。ただし、途中で生成されるソースコードをネット上に公開してはいけません。

必要な物

  • Visual Studio Community
  • Hearthstoneの本体

まずはリポジトリをローカルに持って来る

必ずサブモジュールを含めて持って来る必要があります。そうしないと、環境構築のステップで散々待たされたあげく、バーンとエラーになって悲しい気分になります。

git clone --recurse-submodules git@github.com:antonshusharin/DevTools.git

以前は hearthstoneaccess というOrganizationでホストされていたのですが、最初に開発した人がやめたことで、antonshusharin という人が引き継いでいるようです。

開発ツールをビルドする

Visual Studio Community の x86_64 開発者用コマンドプロンプトを起動して、リポジトリ直下に移動します。

移動したら、

set Platform=Any CPU

というオマジナイを唱えます。これをしないと、ビルドが失敗します。

Platform を設定したら、

dotnet build

でビルドします。開発用のいくつかのツールがビルドされます。

Hearthstone のインストール先とリンクさせる

ここまで来たら、一度コマンドプロンプトを終了させます。そして、同じ x64 開発者用コマンドプロンプトを、「管理者として実行」で起動し直します。これは、次に実行するコマンドの中で mklink というコマンドを使っていて、管理者権限が必要だからです。

管理者権限のコマンドプロンプトを起動したら、リポジトリ直下に移動します。そして、

dotnet run --project LinkHearthstoneInstallation

と唱えます。これを実行すると、ローカル上から Hearthstone のインストール先を探して、それをリポジトリ直下にシンボリックリンクします。これは、ビルドしたバイナリをHearthstoneに書き戻す際に使われます。

環境構築スクリプトを走らせる

管理者権限のコマンドプロンプトは終了して、また通常の権限に戻っておきます。これをしておかないと、環境構築スクリプトの中で作られるgitリポジトリが管理者権限でしかアクセスできないものになってしまいます。

通常の権限に戻ったら、やっぱり set Platform=Any CPU を実行しておく必要があります。

リポジトリ直下で

dotnet run --project EnvironmentSetup

と唱えます。これを実行すると、以下のことが起こります。

  1. Decompiled というフォルダができます。
  2. その中に、新しいgitリポジトリが作られます。このリポジトリは、絶対にネット上にpushしてはいけません!!!
  3. DevTools リポジトリの中にある SetupBaseline というフォルダに、 hearthstone version 24.6.2.155409 のバイナリが入っていて、こいつが逆コンパイルされて Decompiled に入ります。ちなみに、今は version 27 まで本家が上がっているので、結構古いです。
  4. 逆コンパイル結果に対して baseline.patch という git diff のファイルが git apply によって適用されます。この baseline.patch に書かれているのは、 hearthstone version 24.6.2.155409 のソースコードに対して、 hearthstone access を適用するための全ての変更です。
  5. パッチ適用前と、適用後のソースコードが、内側のリポジトリの別々のブランチにコミットされます。
  6. 最後に、 hearthstone version 24.6.2.155409 に hearthstone access を適用した結果がビルドされて、 hearthstone に書き戻されます。これはちょっと不便ですが、もともと開発ツールを作ったのはオリジナルの作者なので、まぁちょっとバージョンが古いのはご愛敬ということで。

Hearthstone が古いバージョンに戻っちゃったので、最新版に修復する

Battle.net から、 Hearthstone の「修復」を実行して、最新バージョンに戻しておきます。

最新版を逆コンパイルする

内側のリポジトリに入って、ブランチを 24.6.2.155409 に切り替えておきます。そして、 DevTools の直下に戻って、

dotnet run --project Decompiler

を唱えます。これで、最新版のソースコードが逆コンパイルされて、バージョン番号のブランチができて、そこに全部コミットされます。

最新のソースコードに hearthstone access を適用する

dotnet run --project Patcher

で、最新版のソースコードに hearthstone access のパッチを適用します。ここで使われるのが、 diff.patch です。

最新版をビルドする

Decompiled/Assembly-CSharp に移動して、

dotnet build

を唱えます。これで、最新版のソースコードがビルドされて、 hearthstone に書き戻されます。

ここまでやれば、あとは普通に Hearthstone を起動すれば、ソースコードからビルドした最新の hearthstone access が使えるようになります。

気に入らん箇所があったら修正する

結局ちょっと修正しました。なので、そのときのことをちょっと。

修正作業は、普通にコードを書くだけです。膨大な量のコードがありますが、まあそこは頑張ります。 Hearthstone Access 事態のコードは、比較的読みやすいです。きっと、これはプロの仕事です。

よし修正できたぞと思ったら、さっきの「最新版をビルドする」の手順に戻って、 dotnet build します。これで、修正内容が Hearthstone に書き戻されるので、動作確認します。ちゃんと修正できていたら、やったねということで、中の人に送りつけます。

送りつける方法ですが、 git の pull request だとだめらしいので、 パッチの readme に書いてある discord に潜入して、 prepatch-developers というチャンネルに入れてもらって、 そこに git diff の内容を送りつけます。あとはいい感じにしてくれます。

以上です

まだアップデートされてないのですが、カードの交換と鍛造のときにメッセージがそれぞれ変わるようになっていたら、それはワイのおかげです。どや顔。猫をあがめよ。嘘です。べつにあがめなくていいです。