User:Sil/解析してみたい方に向けた解説/コードの探し方
概要
特定の部分のコードを探したいのに、なかなか見つからないことってありますよね。
このページでは、私が普段どのようにコードを探しているのか紹介します。
あくまで趣味でやっているので、非効率な探し方かもしれません。 もっといい探し方があるのにと思った方は、ぜひ教えてくれると嬉しいです。
さっそく探し方を紹介!…と言いたいところですが、事前準備が必要です。 「そんなこと当然知ってるよ」という方は飛ばして見てください。
(注意)VScodeにC#の拡張機能を入れて使っているため、他のツールでは難しい方法があるかもしれません。
事前準備
Elinのスキルやオブジェクトなどには対応するIDがあり、ソースコード内では基本的にそのIDが使われています。
そのためIDと対応物を知っておくことが重要です。この項目ではそれを知る方法について記します。
1. 自作MODで出力する
専用のMODを作って出力すればIDが分かりますが、「それができれば苦労しない!」とか「それは面倒……」という方が多いと思います。 なので、次の方法を使いましょう。
2. Elin Modding Wikiのxlsxデータを見る
Elin Modding Wikiには、IDと対応するデータが載ったxlsxファイルがあります。
アクセス方法
- Elin Modding Wikiにアクセス
- 上部の 「Elin Sources」 にカーソルを合わせる
- 以下のxlsxファイルを確認
- Lang:キャラのログ以外のElin全体の表示テキストなど
- SourceBlock:建築素材やアイテム素材など
- SourceCard:アイテムやレシピ関連など
- SourceChara:キャラ、種族、職業のデータなど
- SourceGame:スキル、魔法、エンチャント等のステータス関連など
これらのxlsxデータはElin制作者様が定期的に上げ直してくれていますが、最新データが反映されていないことがあります。
3. Source Extractorを使う
MOD開発者向けの方法で、Source ExtractorというMODを使う方法です。 こちらは、ゲーム内のソースデータをcsvファイルとして出力してくれるMODです。
MOD開発者専用ということになっていますが、誰でも購読できてしまうので、絶対に悪用しないようにしましょう。
購読したらElinを起動すると、Cドライブに「Elin_source」というフォルダができているので、そこからcsv形式でソースデータを確認できます。 foodsやthingV が空になっていますが、thingsに統合されているだけだと思われるので、おそらく問題ないです。
コードの探し方
IDから目的のコードを探す(基礎編)
1番初歩的で、可能そうであれば真っ先に試す方法です。
全体検索で目当てのIDを入力します。 大量に出てくるかと思いますが、関係のなさそうな名前のクラスは無視して見つけましょう。 関係のありそうなクラスの中での検索でもいいですが、逐一クラスを移動して検索するのは面倒なので、個人的には全体検索をおすすめします。
TIPS
- スキルレベルの上昇が関連する場合は ModExp(ID で検索すると、ただIDのみで調べるより絞り込めます。
- 魔法やスキルの効果を制御している大元はActEffectsクラスのProcAtやProcなので、そこを見てみるのもいいかもしれません。
IDから目的のコードを探す(応用編)
これは、目的の動作に関連するコードを探す方法の応用編です。特に、目的の行動自体に直接的なスキルやアイテムのIDが含まれていない場合に有効です。
ステップ 1: 行動の前後に注目する
まず最初に、その行動の前後でキャラクターが喋っていたり、ゲーム内で特別なアイテムやキャラクターが登場したりする場面を思い出してみましょう。もしそのような要素があれば、目的のコードを見つける手がかりになるかもしれません。
ステップ 2: ゲーム内でのIDを調べる
Elinでは、テキスト、アイテム、そしてその他の多くのゲーム内要素に「ID」が割り当てられています。このIDを使って、コードを特定することができる場合があります。
したがって、ゲーム内で目にした行動の前後の特定のフレーズやアイテム名を思い出し、それに関連するIDを調べてみましょう。
ステップ 3: 芋づる式で探し続ける
ゲーム内で表示されるテキストやアイテムのIDを元に探すことで、目的のコードにたどり着くことができる場合があります。しかし、場合によってはIDだけでは目的のコードにたどり着けないこともあります 関連するメソッドやクラスなどが他の場所で使用されている場合、それらのメソッドやクラスを調べることで目的のコードにたどり着くことができます。
例
例えば、ウィジェットの装飾を変更するコードを調べたい場合、まず「デコの編集」というボタンを思い出します。この「デコの編集」という語句をLangのソースデータ内で検索してみると、「editDeco」というIDが見つかります。その「editDeco」を基礎編で学んだ方法で調べると、ウィジェットの装飾を変更するコードにたどり着くことができるでしょう。
関連したコードから探す
目当ての処理にIDもなく、前後に特徴のあるスキルやアイテム、キャラ、テキストもない場合、どうしようもありませんね。
素直に諦めましょう。 ……冗談です。
そんな場合は連想ゲームをしましょう。 少し違いますが、5W1H(いつ・どこで・誰が・何を・なぜ・どのように)を考えるといいかもしれません。
例
「店の在庫管理の処理がどこで行われているのか知りたい」とします。 しかし、「在庫管理」そのものに対応するIDはおそらく存在しません。 そこで、まずはゲーム内のどのタイミングで処理が行われるのかを考えてみます。
1. 5W1Hで整理する
質問 | 例(商人の在庫管理の処理を探す場合) |
---|---|
いつ? | 話しかけたとき |
どこで | 拠点や町で |
誰が? | 商人系キャラ |
何を? | 在庫追加までの日付をリセット |
なぜ? | 売っているアイテムを更新するため |
どのように? | 不明(これから調べる) |
2. 手がかりを探す
この中で特定できそうな情報はあるでしょうか。 「話しかけたときに処理される」ということは、商人キャラに関連するコードを探すと、在庫管理の処理も見つかるかもしれません。 しかし、「商人」や「店」だけで検索すると範囲が広すぎるため、特定の商人キャラに注目してみます。
Elinには、ケトルやデミタスなどの特別な商人キャラが存在します。 これらのキャラには専用の在庫管理の処理があるため、「ケトルのID」で検索してみます。
3. 検索結果を確認する
検索すると、TraitKettleという明らかにケトル専用のクラスが見つかります。 そのクラスの中を見ると、以下のような記述がありました。
public override int RestockDay => 28;
いかにも在庫管理をしているコードに繋がりそうなコードですね
4. さらに参照先を調べる
このコードがどこで使われているのかを探すために、このコードがどこで使われているか参照先を見ます。 overrideされているので必ず大元のpublic virtual int RestockDayがあるはずなのでそれを更に参照先を見ます。 すると、在庫をリセットする処理が見つかります。
こうして、直接検索できなかった処理も、関連するコードから辿っていくことで発見できることがあります。
ソースコードを公開しているMODから探す
Elinにはソースコードを公開してくれているMODが多くあります。 その多くはElin Modding Wiki → Reference → External Guides から確認可能です。またGitHubでElin Modなどで検索しても出てくるでしょう。
まずは目当ての処理に近いMODを探します。次に.csファイル内を確認してHarmonyPatchをチェックします。 すると以下のようなコードに近いものが見つかると思います。
[HarmonyPostfix, HarmonyPatch(typeof(DramaCustomSequence), nameof(DramaCustomSequence.Build))]
これはDramaCustomSequenceクラスのBuildメソッドにパッチしますという宣言です。HarmonyPostfixの部分がHarmonyPrefixの場合などもありますが気にしなくて良いです。 つまるところパッチを当てている = その処理がある可能性が高いということです。
あまり褒められた方法ではありませんが、Workshopから一時的にMODを購読して入手したdllをデコンパイルすることで目当ての処理を見つけるという方法もあります。
クラス名から類推する
最終手段の1歩手前の方法です。 クラス名の英語の意味から、どのような処理を行っているか推測して探します。
ただし、Elinのクラスは1つ1つが膨大なコード量なので内容の多いクラスでは非推奨です。
英単語で全文検索する(最終手段)
どうしても見つからない場合に使う最終手段で、目当ての処理に関連しそうな英単語を、全文検索して総当たりで探します。
ただし、一般的すぎる単語(例:Get、Use など)はヒット数が多すぎるので、ユニークな単語のときにすることをおすすめします。
最後に
私なりのコードの探し方を紹介しましたが、上手く説明できないため省いている解析のコツがあります。
それはElinのソースデータの活用です。 Elinのソースデータは、IDだけでなくもっと多くの項目がコード内で参照されています。 そのため、「IDがないから手がかりがない……」と思っても、他の項目で検索するとすぐに見つかることがあります。
可能な限りソースデータを使い倒して、良い解析ライフを送りましょう! このページが、膨大なコードの中から目的の処理を見つける助けになれば幸いです。