少し前まで、ワイドスクリーンモニターの画像とインターフェイスの歪みを修正するために、いくつかの古いゲームの修正を書いていました。 彼らはFlatOutを見てみるように頼み 、それについてのアイデアが同時に書かれるようになりました。
必要なもの
インストールが簡単でゲームファイルを置き換える必要のない本格的な修正プログラムを作成するために、 IDA 、 Cheat Engine 、 Visual Studio 、 ユニバーサルASIローダー (詳細は以下)を使用し、ウィンドウ-D3DWindowerでゲームを起動しました。
リソース解析
ゲームがインストールされているフォルダーを調べて、何を処理する必要があるかを調べましょう。 この場合、対象となるファイルは「flatout.exe」のみです。 一部のゲームでは、画像の縦横比を修正するために、Max Payneなどに追加のDLLが存在する場合があります。実行ファイルではなくe2mfc.dllに挿入しました。 Flatout.exeにはv1.1のパッチが適用されていますが、ロシアのディストリビューターであるBUKAの公式パッチには3つの異なるEXEが含まれています。
IDAが完全に読み取り可能な方法で逆アセンブルするため、研究用にflatout、3.exe(2,822,144バイト)を選択しました。
体験
IDAでflatout 3.exeを開いて、最初に定数を探し始めました。 私の以前の経験から判断すると、ほとんどの古いゲームは次のいずれかを使用してインターフェイスと3D画像を表示します: 640.0、480.0、1.3333、0.0015625 = 1.0 / 640.0、0.00208333333 = 1.0 / 480.0など。 2番目に人気のある定数640.0と480.0が通常近くにあるため、検索に最初にドライブするのは0.0015625です。 IDAは、 0x667CE4で探しているものを見つけます 。
これでゲームを開始し、このメモリアドレスの値を変更することができます。 これは、1280x720の解像度でFlatOutインターフェイスがどのように見えるかです。
チートエンジンを並行して実行し、プロセスに参加します。 [アドレスを手動で追加]ボタンを使用して、アドレス0x667CE4をテーブルに追加します。
現在の値を0.0010に変更し、何が起こるか見てみましょう。 結果は、戦闘の半分が完了したことを示しています。
3D画像の伸縮を修正する方法を見つけることは今でも残っています。 いわゆるアスペクト比 、 4:3または1.3333定数が見つからなかったため、 480から360までのすべての数値を変更することにしました。 Max Payneでこの方法を以前に使用しましたが、ここでも検索に役立つと思いました。 チートエンジンで、次の設定を設定し、「最初のスキャン」をクリックします。
見つかったアドレスのうち、緑色でマークされたアドレスのみをテーブルに追加します。 緑色は、これらのアドレスがflatout.exeの範囲に属していることを意味し、残りは必要ありません。
見つかった値をすべて360に変更します。
ゲームの画像が消え、エラーが表示されます。 経験的に、2つのアドレス-FlatOut.exe + 1069C3(0x5069C3)およびFlatOut.exe + 107CCB(0x507CCB)の変更が原因であることがわかりました 。 IDAのアドレス0x5069C3にアクセスし、クラッシュする理由を確認します。
480はここでは定数であり、オフセットではないため、この関数は重要ではありませんが、以下の関数はアドレス0x5069D0で注意を引きます。これは小さな変換で次の形式を取ります。
定数4.0と3.0をそれぞれ16.0と9.0に変更しようとしています。
これが同じアスペクト比であることを知って驚いています。1280x720の解像度で、画像はすぐに正しい比率を取得しました(以前と同じようになりました)。
現在、現在の解像度に応じて上記の定数を計算し、任意の設定でゲーム画像を修正するプラグインを作成する必要があります。
C ++
Visual Studioを開き、新しいWin32プロジェクトを作成します。アプリケーションの種類はDLLです。 プロジェクトのプロパティで、次のオプションを設定します。
- 設定-リリース
- 文字セット-マルチバイトエンコーディングを使用
- ランタイムライブラリ-マルチスレッド(/ MT)
- 警告レベル-レベル1(/ W1)
- 最終的な拡張子は.asiです
- 出力ディレクトリ-E:\ Games \ FlatOut \ FlatOut
メモリを操作するには、CPatchと呼ばれる特別なクラスを使用します。
Dllmain:
#include "stdafx.h" #include "CPatch.h" HANDLE HndThread; int* g_Width = (int *)0x6B0D88; int* g_Height = (int *)0x6B0D8C; int g_CameraAspectRatio_x = 0x5069DA; int g_CameraAspectRatio_y = 0x5069E0; int g_hud_stretch_x = 0x667CE4; #define screen_width (float)*g_Width #define screen_height (float)*g_Height float hud_stretch_new = 0.0; int Thread() { while (!screen_width) { Sleep(0); } hud_stretch_new = 1.0/(480.0*(screen_width/screen_height)); CPatch::SetFloat(g_CameraAspectRatio_x, screen_width); CPatch::SetFloat(g_CameraAspectRatio_y, screen_height); CPatch::SetFloat(g_hud_stretch_x, hud_stretch_new); return 0; } BOOL APIENTRY DllMain(HMODULE hModule, DWORD reason, LPVOID lpReserved) { if(reason==DLL_PROCESS_ATTACH) { HndThread = CreateThread(0,0,(LPTHREAD_START_ROUTINE)&Thread,NULL,0,NULL); } return TRUE; }
ASIライブラリをゲームでロードするには、dsound.dllをアーカイブからゲームフォルダーにコピーして、 ユニバーサルASIローダーをインストールする必要があります。 ASIは単なる名前変更されたDLLであり、dsound.dllはDirectSIoundを使用するゲームのプロセスにASIをロードします。 サブフォルダーからスクリプトを読み込むことができます。
結果
これはプラグインの最初のバージョンであり、ほとんどの場合、複数回更新されます。 メインメニューなど、特定の欠陥があります。 また、互換性がない場合は、たとえばSteamバージョンなど、他のEXEのサポートを追加できます。
プラグインはgithubからダウンロードできます。
インストールは簡単です-アーカイブをゲームのあるフォルダーに解凍します。
2013年8月2日からの更新
ゲームのスチームバージョンとスチームデモバージョンをサポートする更新バージョンをリリースしました。