前回は、C# MOD 制作の基本的な作業手順を学びました。次に気になるのは、「じゃあ具体的には、どんなことを、どんな風にプログラミングをするとゲームを改造できるのか?」ではないでしょうか。
しかし、ゲームの内容を改造するには、まずその内容自体を知っていなければなりません。そこで必要となるのが、
.NET デコンパイラというツールです。これを使うと、.NET プログラムからソースコードをある程度復元できます。
.NET デコンパイラには幾つか種類があるようですが、ここでは
dnSpy を使っていきます。
dnSpy の準備
dnSpy は
GitHub からダウンロードできます。確認した時点では、
- dnSpy-net-win32
- dnSpy-net-win64
- dnSpy-netframework
の 3 種類ありましたが、dnSpy-netframework を選んでください。
ZIP をお好みの場所に展開して dnSpy.exe を起動します (インストール作業は特に必要ありません)。
File メニューから Open... を選択し、以下のフォルダにある DLL を全て開いてください
- [Bannerlord インストールフォルダ]\bin\Win64_Shipping_Client (TaleWorlds.○○.dll だけでよい)
- [Bannerlord インストールフォルダ]\Modules\CustomBattle\bin\Win64_Shipping_Client
- [Bannerlord インストールフォルダ]\Modules\Native\bin\Win64_Shipping_Client
- [Bannerlord インストールフォルダ]\Modules\SandBox\bin\Win64_Shipping_Client
- [Bannerlord インストールフォルダ]\Modules\SandBoxCore\bin\Win64_Shipping_Client (筆者の環境ではここは空っぽ)
- [Bannerlord インストールフォルダ]\Modules\StoryMode\bin\Win64_Shipping_Client
ここまでで画面はこんな感じになっているかと思います。(画像は一部加工してあります)
下部に Search ボックスが表示されていない場合は、Edit メニューから Search Assemblies で表示できます。
解析
Search
それでは、とりあえずパークのデータでも探してみましょう。
Search ボックスに perk と入力してください。名前に perk が含まれているものが一覧表示されます。ですが、これでは数が多すぎて何が何やら分かりません。Search For ドロップダウンリストを All of the Above から Class に変えましょう。これで多少は絞り込めます。
検索結果をスクロールしていくと、Athletics や Bow などと付いたクラスが見つかります。どうやら、DefaultPerks というのがパークに関係するクラスのようです。Search 結果の一覧から DefaultPerks をダブルクリック (あるいは、右クリック -> Go to Reference) しましょう。DefaultPerks クラスのソースコードが表示されるはずです。
今度は DefaultPerks クラスのソースを見ていきましょう。
スクロールしていくと、InitializePerks() というメソッドが見つかります。これが、パークの名前や対象、効果の度合い (マグニチュード) を設定している場所です。OneHandedDeflect や OneHandedBasher など、各フィールドがデータを保持しています。
Analyze
各フィールドにパークの設定値が格納されているのは分かりましたが、その設定値がどういう風に使われるのか、つまり、パークの効果そのものの定義も見つけなければなりません。そんな時に役立つのが Analyze です。
試しに、InitializePerks() の最初にある OneHandedDeflect フィールドを右クリックし、Analyze を選択してみましょう。
下のタブが Search から Analyzer に切り替わり、ツリーが表示されます。
Assigned By はフィールドに値が割り当てられた場所、Read By は値が読み取られている場所です。今は OneHandedDeflect フィールドが使われている場所を探したいので、Read By を開きます。さらに get_Deflect() の Used By を開くと、GetEffectiveSkill() と GetPerkEffectsOnAgent() が見つかりました。この二つのメソッドが、Deflect の設定値を参照している場所、すなわち、Deflect の効果を処理している場所です。
必要に応じて検索対象を絞り込みつつ Search で当たりをつけて、Analyze で処理を追う、これが解析の基本的な流れとなります。改造したい部分をそうやって見つけ出し、そのクラスなり、メソッドなりをオーバーライドすることで、MOD としての処理を実現するのです。
ちなみに、ここまで例として挙げてきた DefaultPerks クラスですが、継承できるクラス設計にはなっていないため、(少なくとも、TaleWorlds が提供している MOD 実装方法の範疇では) 改造できません。
最終更新:2021年05月15日 18:29