
はじめに
「私の時間では、ゲームはより良かったです。 ゲームプレイはグラフィックスよりも重要だと考えられていたため、彼らはより興味深いものでした。」
-任意の10年で生まれたゲーマー
「あなたの時間」が何であれ、あなたはある程度この意見に同意すると思います。 私にとっては、 フレッド ir 、 アティックアタック 、 エアボーンレンジャー 、 モンキーアイランド 、 トワイライト:2000 、 スタント 、 ガンシップ2000 、 ツインセンの冒険 、 ダークサン 、 チャレンジに無数の時間を費やした80年代半ばから90年代半ばの期間でしたAncient Empires 、 X-Wingシリーズ、その他多くのゲーム用。
時々ノスタルジアの発作を経験し、それらのゲームの1つをもう一度プレイしたいです。 この場合、選択可能なオプションがいくつかあります。
リマスター版を再生します。 一部のゲームは非常に素晴らしく、熱心なファンを集めているため、公式の「新版」がリリースされています。 これはまったく同じゲームですが、最新のグラフィックを使用しています。 そのようなゲームの素晴らしい例は、素晴らしいモンキーアイランドスペシャルエディションです。
これは理想的なオプションです。 残念ながら、やり直されるゲームはごくわずかです。その理由は、コスト、オリジナルのソースコードの紛失、またはあまり知られていないゲームの場合には不十分な関心です。
同様のカテゴリには、ソースコードが公開されているゲーム(idのファーストパーソンシューティングゲームなど)が含まれます。 これらのゲームの新しいグラフィックリソースを作成するプロジェクトがありますが、それらはまれであり、ゲームのソースコードを開く開発者はほとんどいません。
リメイクを再生します。 一部のゲームは非常に素晴らしく、熱心なファンを集めているため、誰かがゲームを最初から書き直すことを決めました。通常は元の作者のわずかなサポートがありません。 優れたリメイクを見つけることができれば、ほぼオリジナルのゲームを手に入れることができますが、最新のグラフィックが使用されています。
これは優れた代替手段ですが、繰り返しますが、多くのゲームにはリメイクがありません。 これは、リメイクは通常ファンによって作成され、タスクは非常に難しく、ゲームを再度作成するのと同じくらい複雑であり、元のゲームプレイを正確に再現するのが難しくなるためです。 高度な精度を実現する唯一の方法は、元のコードを逆アセンブルし、そのロジックを再作成することです。
エミュレータを実行します 。 ScummVMなどの一部のゲームでは、常にDOSBoxと特別なソリューションを使用できます。 それはうまく機能しますが、正直なところ、ほとんどのゲームのグラフィックはワインのようではなく、時間とともに改善されます。 ただし、元のゲームをプレイします。
まとめ
プレイしたいゲームがリマスター版である場合、これは素晴らしいことです! しかし、リマスターを持たない大多数のゲームでは、エミュレータを使用する(広く利用可能で、完璧なゲームプレイと古いグラフィックを提供する)か、誰かがリメイクを作成することを期待する(比較的まれで、不完全なゲームプレイ、最新のグラフィック)の2つのオプションしかありません)
新しいアプローチ
しかし、改善されたグラフィックスでのみ不変のバイナリを実行できるとしたらどうでしょうか?
エミュレータでゲームを実行するとします。 ソースコードはありませんが、バイナリコードのどこかに「draw sprite」メソッドが隠れていることを確認できます。 または「シンボルを推測する」方法。 または「効果音を再生する」方法。 または、 「ポリゴンのレンダリング」メソッド。
エミュレータに統合されたデバッガ/逆アセンブラを使用して、これらのメソッドの入力ポイントを見つけることができたらどうなりますか? どのレジスタにどのパラメータが含まれているか、またはスタック上の順序を見つけたらどうなるでしょうか?
これらの入力ポイントを実行する必要があるときに任意のC ++メソッドを呼び出すようにエミュレーターをプログラムし、その時点でレジスターの状態を抽出し、独自のスプライト描画コードを実行できるとしたらどうでしょうか。 または、TrueTypeフォントレンダリングコードですか? またはMP3再生コードですか? またはいくつかのOpenGL呼び出し?
これらすべてのメソッドをC ++実装に置き換えることができた場合、結果として、元のロジックとまったく同じですが、モダンに見えるゲームになります。 徐々に補うことができる正確に再現されたゲームプレイでエミュレートされたリメイクを取得します。これには、逆アセンブルされたコードの非常に表面的な理解で十分です。
私はこの問題を少し調査しましたが、かなり新鮮なアイデアであることがわかりました。 なぜこれを誰も試みなかったのですか?
これは機能しますか?
検証コンセプト
このクレイジーなアイデアをテストすることにしました。 44個の実装されたオペコードのみで8086 + CGAエミュレーターを作成しましたが、これはGoodyスプラッシュスクリーンを起動するのに十分です:

私は2つのツールを作成しました。逆アセンブラーとgdbのようなインターフェースを備えたランチャーで、コードのステップ実行、ブレークポイントの設定などを可能にします。
完全に分解せずに興味深い機能を見つけるにはどうすればよいですか? 私は多くの方法を使用しました-ブレークポイントの設定とレジスタの調査、小さなフラグメントでのコードの実行、シミュレートされたビデオメモリの内容を誤って入力してレンダリングされるものを確認する、コードを修正して一部の呼び出しをスキップして動作を停止したものを確認する、逆アセンブルされたコードを調査する、私に役立つコメントを追加します。
これらの手法のおかげで、いくつかの興味深い「機能」を見つけることができました。


別のウィンドウで独自のレンダリングを行うために、C ++インターセプターを追加しました。

ラフなグラフィックをいくつか追加し、指を交差させた...

...そして見よ、私は「リメイク」をしている! 「古い」ウィンドウは、「新しい」ウィンドウの隣に表示されます。 これは静的な画像ではなく、元のX86コードによって駆動される新しいグラフィックです!
自分で見てください
デモ全体(x86エミュレーター/逆アセンブラー/デバッガー、Goodyインターセプター、ドラフトグラフィックス)はGitHubで入手できます 。 LinuxおよびMacで動作します。 SDL2およびC ++ 0xコンパイラが必要です。
ソースコードは 、 Whatever / Creditライセンスの下でリリースされます。コードで何でもできます。 あなたが何かクールなものを作成するなら、私は私の著者であることを示すことに感謝します。 どちらかといえば、コードはアルファ品質でさえありません-これは「コンセプトチェック/私のマシンで動作します」品質です。
リポジトリには元のゲーム (
goody.com
)が含まれています-オリジナルのGonzo Suarezの作者の1人から、その配布について非公式の祝福を受けました。さらに、古いソフトウェアを備えたサイトで簡単に見つけることができます。 誰かがそれに反対している場合、私はリポジトリからゲームを削除します。
パブリックドメインのひどいGimpスキルとリソースを使用して、またはOpenGameArtの Creative Commonsライセンスでグラフィックをスケッチしました: 1、2、3、4、5 。 この記事を読んでいるアーティストがこのデモの元のグラフィックを共有したい場合、私は非常に感謝します。
予想される質問への回答
Q:Goodyの素晴らしいリメイクがあることをご存知ですか?
A:はい。 しかし、概念をテストするためにGoodyを選択しました。CGA時代からこのゲームが一番好きだったからです。COMファイルに含まれているためです。つまり、EXEローダーが不要であり、明らかにタイルに基づいているためです。作業が非常に簡単になります。
Q:使用可能なx86エミュレーターやDOSBoxを使用しなかったのはなぜですか?
A:x86エミュレーターの作成は興味深いタスクだからです。 コンセプト検証フェーズの後、DOSBoxをこれに完全に適合させるつもりです。
結論の考え
システムはスケーラブルですか?
これらの手法は、より複雑なゲームに使用できますか? 障害はありません。 いつでもDOSBoxから始めて、たとえばサウンドを置き換えることができます。 これが部分的なリメイクの始まりです。
別の質問は、どこに線を引くかです-抽象化のどのレベルでインターセプターを追加します。 ある程度まで、DOSBoxでインターセプターを作成して、個々のピクセルを描画することができます。 私のコンセプトチェックは、 「タイルレンダリング」と「グリフレンダリング」のレベルでインターセプトを実行します。 しかし、たとえばフォントを考えてみましょう。 グリフによるグリフのレンダリングは、お金やライフカウンターなどの側面に非常に適していますが、メイン画面の指示のテキストには、たとえば「ラインドロー」レベルのインターセプターなど、より良いものを考えることができ、美しいカーニングのあるプロポーショナルフォントを取得するためにFreeTypeを使用します。
同様の考慮事項は、X-WingやStuntsなどのソフトウェアレンダリングを使用した3Dゲームにも適用されます。 「レンダートライアングル」機能をインターセプトすることが可能かもしれません。この場合、非常に低ポリモデルがビデオプロセッサでレンダリングされるか、 「レンダーモデル」機能をインターセプトして新しい3Dモデルを使用します。 または、3Dモデルさえ使用しない元のWing Commanderを使用することもできます。代わりに、高解像度の船のビットマップがあり、実際に3D船をレンダリングします。
別の例は音です。 プログラム可能なタイマーとスピーカーI / Oポートをインターセプトして、対応するウェーブをオンザフライで生成するか(DOSBoxが行うと想定)、または「サウンド効果を再生する」機能をインターセプトして、 サウンドの代わりにMP3ファイルを再生できます。
フレームレートはどうですか? グッディの死のアニメーションは2フレームかかり、約1秒間続きます。 美しいリソースがあっても、アニメーションは引き裂かれたように見えます。 このタイプの問題の解決策は、状態レンダリングのよりインテリジェントな処理になると思います-理想的には、レンダリングメソッドを直接インターセプトする必要なく、メモリから読み取られたゲームの状態に基づいて完全に新しいレンダラーを記述できます。
ゲームを超えた適用性
このアイデアは、ゲームだけでなく適用できます。 一部のシステムは非常に古いソフトウェアを使用しています。これは、長年にわたってビジネスロジックの詳細が多く追加されており、そのようなシステムをゼロから書き直すことが不可能または非実用的であるためです。 しかし、これらの手法のおかげで、ロジックを変更せずに実行し、I / O /データベースコードを最新のものに置き換えることができます。
合法性
これは法律上の助言ではありませんが 、私は弁護士ではないため、ゲームの元のリメイクにはリメイクが付属していないため(ゲーム自体が無料で配布されていない場合のみ)、テクニック自体が違法である理由は考えられません。
グラフィックスはより困難です。 リメイクには元のリソースを含めることはできません。 アーティストやミュージシャンはそれらをゼロからやり直す必要があります。 しかし、それでも、X-Wing 3DモデルやDarth Vaderの画像の作成が合法かどうかはわかりません。 おそらく彼らはファンアートと見なすことができますか?
追加の読書
リバースエンジニアリング、古いゲーム、またはその両方が好きな場合は、 Fabien SanglarのWebサイトをご覧ください 。
まとめると
コンセプトの検証により、アイデアの実行可能性が確認されます。 結局、彼女はそんなにクレイジーではなかったことがわかりました。 リメイクは、最新のレンダリング/サウンド/ネットワークデータ転送コードを、元のゲームが実行されているエミュレーター/仮想マシンに接続することで実行できます。
これはリメイクの作成方法に革命をもたらしますか? 本当にそう願っています! モダンなグラフィックとオリジナルのゲームプレイで過去のゲームをプレイしたいです。