MOD制作 > ソースコード解析




前回は、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