2025/07/02 17:22 Making a speedrun timer in D

ロボ子、今回のDeus Exのスピードランの話は面白いのじゃ!Linuxで自動分割タイマーを作るなんて、ワクワクするぞ!

博士、私も興味津々です!Windows版ではLiveSplitが使えるのに、Linuxだとプラグインが動かないのは不便ですよね。

そうじゃ!だから、D言語でタイマーを作って、高精度な計測、自動分割、ロード時間削除を実現するのじゃ!

記事によると、まずロードフラグを探したんですね。Deus Exのスクリプトがプレーンテキストで抽出できるとは知りませんでした。

そう!そして、ロード画面中にグローバル変数を設定するコードを見つけたのじゃ。でも、scanmemでは特定のアドレスを特定できなかったみたいじゃな。

そこでシステムコールですか。ptraceとprocess_vm_readvを使って、別のプロセスのメモリを読み書きするんですね。

その通り!D言語にバインディングがないから、Cとの互換性を使うのは賢いのじゃ!

LoadMap関数の特定も興味深いです。WindowsバイナリのPE形式から、llvm-readobjでエクスポートテーブルをダンプして関数を見つけるんですね。

そう!そして、LoadMapのアドレスにブレークポイントを設定して確認するのじゃ。地道な作業じゃが、重要なステップなのじゃ。

未使用メモリの発見もすごいですね。/proc/<PID>/mapsからメモリマップを調査して、書き込み可能で未使用の領域を探すなんて。

じゃろじゃろ?Engine.dllの書き込み可能なマッピングを見つけた時は、私も興奮したぞ!

フレームワークもよく考えられていますね。RunningProcess、GameProcess、Patcher、UIと、必要な機能が揃っています。

MVP(最小実行可能プログラム)では、LoadMap関数にパッチを適用してロードフラグを設定するのじゃ。LoadMapのジャンプテーブルエントリを修正して、新しいコードを指すように変更するなんて、ハッキングみたいで面白いぞ!

ロードフラグの解除も重要ですね。LoadMap関数の最後にフラグを解除するコードを挿入するんですね。例外処理の分岐があるから、コードを移動してスペースを確保するとは。

最終ロードマップでは、自動分割のためにロードされたマップ名を特定する必要があるのじゃ。LoadMap関数の戻り値からマップ名を取得するなんて、エレガントじゃな。

問題点として、例外処理がパッチされていないことと、セーブ画面が処理されていないことが挙げられていますね。グリッチセーブを使うと例外が発生するのは盲点でした。

改善点としては、ロード遷移の検出メカニズムの改善があるのじゃな。ポーリング方式はゲームにもたつきを引き起こすから、Linuxシグナルを使うのは良いアイデアじゃ。

本当に勉強になりました!Deus Exのスピードランの世界も奥が深いですね。

そうじゃな!しかし、ロボ子よ、もし私がスピードランナーになったら、きっとバグを見つけすぎてゲームを壊してしまう自信があるぞ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。