リバースエンジニアリングストライクコマンダー

1990年代初頭、PCゲームの進歩の最前線にいた1社、 Origin Systems 。 彼女のスローガンは「私たちは世界を創造する」であり、それを気にして、彼らはそれに対応しました:シリーズUltima 、Crusader、およびWing Commanderは、プレーヤーの想像力に衝撃を与えました。



ゲームの1つであるStrike Commanderを作成するのに4年と100万時間以上かかりました。 有名なフライトシミュレータにはRealSpaceと呼ばれる独自の3Dエンジンがあり、今日では当然のことながら、テクスチャマッピング、Gouroシェーディング、ディテールレベルの変更、ディザリングカラーなどのテクノロジーが登場しました。



私の昔の夢は、仮想現実のヘルメットで遊ぶことでした。 Oculus Riftのおかげでこのファンタジーは現実に一歩近づきました。



しかし、判明したように、ゲームのソースコードは失われ、リリースされることはありませんでしたので、逆の開発を行うことにしました。



この記事の公開時点では、私のプロジェクトはまだ完了していませんが、これから作成できる技術を共有したいと思います。











これ











...そして、おそらく誰かが私の冒険に参加するよう促します。



ストライクコマンダー前



90年代前半、フライトシミュレータは優れていましたが、 Falcon 3.0またはFlight Simulator 4.0は、美しい視覚化ではなく、フライトモデルの精度に重点を置いていました。



















市場には多くのフライトシミュレータがあり、1990年にOrigin Systemsが新しいゲームの作成を発表したことに気づいた人はほとんどいませんでした。 しかし、デモが上映されたシカゴでのCES 1991以降、すべてが変わりました。 ゲームには、空軍のフライトシミュレーターにのみ存在する要素(テクスチャマッピング、グーローシェーディング、フォグなど)があるとは信じられませんでした。 スクリーンショットは、競合他社をはるかに上回る技術を示しています。



































1991年以降、多くの人がゲームを待ち始めました。 素晴らしいエンジンとエキサイティングなプロットだけでなく、RealSpaceは当初、フライトシミュレーターのファンにとって望ましい追加機器、非常に高価で壊れやすいアクセサリーをサポートしていました-THRUSTMASTER WEAPON CONTROL SYSTEMおよびTHRUSTMASTER FLIGHT CONTROL SYSTEM:



















THRUSTMASTER RUDDERを接続することもできます。











しかし、それだけではありませんでした。ゲームは仮想コックピットをサポートしていました。 4方向のThrustMasterミニジョイスティックを使用すると、仮想現実ヘルメットを必要とせずにパイロットの頭を動かし、地上目標/敵機を監視できます。



















1993:最初の連絡



このゲームとその3次元エンジンは単純に「脳を吹き飛ばす」が、信じられないほど強力なマシンが必要だった。





現代の技術レベルから類推すると、推奨される構成は次のようになります。





そして、ゲームを購入するだけでは不十分であり、インストールプロセスを実行する必要がありました。 箱を開けると、ユーザーは8枚のフロッピーディスク(Speech Packの場合は+3)を見ました。



















興味深い事実:ポスターには1991年のクリスマスのリリース日が示されていることに注意してください。 このゲームは、クリス・ロバートが「今日のコンピューターゲームの黙示録」と呼んだ長いプロセスを経て、1993年に完成しました。



フロッピーからハードドライブにゲームを展開し、13個のディスクを交換するのに30分かかりました。 そして、すでに終わったと思ったとき、ゲームはすべてのカードを生成し始めました。 ゲームのサイズは24 MBから38 MBに増加しました。これは当時の他のゲームの4倍の大きさでした。











興味深い事実:マップは、擬似乱数生成アルゴリズムに挿入された1つのシード(整数)から生成されました。 これは、インストール後にカードを生成することにより、ディスク上のデータ量の増加を回避する巧みな手法でした。 このトリックの詳細に興味がある場合は、 The Backroom Boysの本とゲームFrontier Eliteの章を読むことをお勧めします。



386番目のPCでは、カードの生成に1時間かかりました。 しかし、Origin Systemsは、2012年のゲーム世界の暗い環境の中で、 ゲームボックスに優れた1ページの雑誌を提供するというアイデアを思いつきました。 Sudden Deathのおかげで、プロセス全体の痛みが軽減されました(38ページに、2013年のクリスマスまでにStrike Commanderをリリースすることを約束する偽の広告があることに注意してください)。



ストライクコマンダー!



最後に、これらの手順の後、プレーヤーはゲームを楽しむことができました... 1993年4月! ゲームが2年間遅れたという事実にもかかわらず、Originが約束したすべてのものがあり、非常に売れました。 ゲームは次のようになっているはずですが、多くの人が長い夜をかけて戦いました。











...最小設定では、次のようになりました。











一般に、これはパイロットを惹きつけ、良い思い出を作るのに十分でした。



失われたソースコード



Oculus Riftのリリース後、Strike Commanderへの関心が再び高まりました。適切なハードウェアが登場しました。 ゲームが20年前だったので、ソースコードは既にリリースされていると思っていましたが、すぐにOrigin Systemsが枯れているという悲しい話についての話に出会いました。



1992年9月、Origin SystemsはElectronic Artsに買収され、1999年頃、Ultima 9の販売が低調だったため、すべてのプロジェクトがキャンセルされました。同社は、先駆者であるMMORPG Ultima Online 多くの人々は、完成したすべてのゲームの「ゴールド」のソースコードとバージョンは、EAリポジトリの深層のどこかに保存されていると考えています。 しかし、 Wing Commander CICの人々に連絡した後、会社が閉鎖された後、すべてのソースコードが消えたことがわかりました。



今日は信じがたいですが、当時は開発者や企業は「古いもの」を保存するよりも新しいゲームに興味があり、懐かしさはまだありませんでした。現代のGood Old Gamesのようなファンやストアの大規模なベースはありませんでした 多くのストーリーはソース管理の「原始性」のレベルを説明できますが、おそらく最高のストーリーは15分14秒の「ZAP SC」です。





作業の初日、1人の開発者が900 MBのStrike Commanderソースツリー全体を削除しました。 IT部門は72時間をかけて開発マシンからすべてを復元しました。 インタビューでは、Wing Commander 1および2のコードがフロッピーディスクで転送されたということも述べています。StrikeCommanderの前にはネットワークがありませんでした。



興味深い事実:予期せぬイベントの変化-ソースコードの一部は、以前のOrigin開発者によって最近発見されました。WingCommander CICは、 Wing Commander IおよびWing Commander IIIのソースコードを格納するオフラインアーカイブを格納します。 Ultima 8の開発者は、Ultima 8:Paganのソースコードを提供されました(ただし拒否されました)。 ストライク司令官に関しては、誰も彼と一緒にいると聞いたことがありません。



リバースエンジニアリング:可能ですか?



長年にわたり、多くのチームがOrigin Systemsのゲームに取り組むことができ、素晴らしい結果を達成しました:





どれくらい長くて難しいですか? Another Worldのほぼすべてのリバース開発を行ったGregory Montoirと話をした後、夕方に1時間作業すると、1か月で10 KBのアセンブラーコードをCに戻すことができることに気付きました。 Strike Commanderには多くの実行可能ファイルがあり、最初の推奨されない時間は次のとおりです。



INSTALL.EXE 7 793 : 2

MKTERR.EXE 203 744 : 1,5

SC.EXE 20 000 : 1

MKGAME.EXE 131 696 : 1

OPTTEST.EXE 870 528 : 7

STRIKE.EXE 746 304 : 6

=============================================

15 , 7 2 . -.








1993年に仕事を始めた人は6年前に仕事を終えていたでしょうし、 git clone



を作れば十分でしょう! しかし、 IDAを起動してファイルを少し調べることで、すべてを元に戻す必要があるわけではないことに気付きました。3Dエンジンは完全にSTRIKE.EXEにあり、小さなチームが妥当な時間で処理できます。



ロードマップ



ストライクコマンダーのリバースエンジニアリングのために最初に描いたロードマップは次のとおりです。



  1. できるだけ多くのドキュメントを収集します。
  2. Strike Commanderのグローバルアーキテクチャを理解する。
  3. ゲームリソースの開発を逆にします。
  4. ステージ3の文書化と外挿(視覚表面の決定、詳細レベルなど)
  5. 3Dエンジンを再実装し、 NEO_STRIKE.EXE



    をビルドしNEO_STRIKE.EXE



  6. Oculus Rift VRデバイスのサポートを追加します。


そして仕事に取り掛かりました。



パート2.アーキテクチャとドキュメント、



建築



Strike Commanderは、単一のモノリシック実行可能ファイルで構成されていません。 6つの実行可能ファイルが連携してゲームプレイを提供します。 基本的な考え方は、 セカンドリアリティコードレビューに似ています 。 複数の.exeファイルの使用は、さまざまな方法で説明できます。





IDAで調査した結果、各実行可能ファイルはDOS 21hシステムコールを使用して他の.EXE



をロードおよび実行することが判明しました。 たとえば、ダイアログとシネマティック挿入の処理を提供するストーリーモードはOPTTEST.EXE



です。 RAMから自分自身を削除し、3Dモードが必要なときにSTRIKE.EXE



をロード/起動します。



Strike Commanderの各部分を担当するコンポーネントの研究と研究のために、DosBOXは非常に有用であることが証明されました。 現在実行中の実行可能ファイルの名前は、ウィンドウタイトルに表示されます。



実行可能ファイル

スクリーンショット

注釈

INSTALL.EXE







MKGAME.EXEを開始するモジュール

MKGAME.EXE















実際のインストーラー:

  • 起動ディスクを作成します。
  • サウンドカードを定義します。
  • コピープロテクションを実行します(Sudden Deathマガジンの質問と回答)。
  • 8枚のフロッピーディスクを開梱します。


MKTERR.EXE





















すべてのマップ要素を作成し、それらをPAKにグループ化するマップジェネレーター:

  • ALASKA.PAK
  • ANDMAL1.PAK
  • ANDMAL2.PAK
  • ARENA.PAK
  • CANYON.PAK
  • EGYPT.PAK
  • EUROPE.PAK
  • MAPDATA.PAK
  • MAURITAN.PAK
  • QUEBEC.PAK
  • RHODEI.PAK
  • SANFRAN.PAK
  • TURKEY.PAK
OPTTEST.EXE



















ゲーム内のすべてのダイアログ、映画の挿入、メニュー、格納庫での武器の選択、オブジェクトの表示を担当しています。

SC.EXE







ゲームの開始方法。 通常、 OPTTEST.EXE



ダウンロードして実行しOPTTEST.EXE





STRIKE.EXE







三次元エンジンRealSpace。 ゲームプレイのアクティブフェーズを担当します。



注: PAKマップアーカイブを削除すると、 STRIKE.EXE



不足しているファイルSTRIKE.EXE



検出し、 MKTERR.EXE



を自動的に起動してマップを生成します。 つまり、ほとんどの作業はOPTTEST.EXE



およびSTRIKE.EXE



ます。 しかし、パラメーターがパラメーター間でどのように渡されるかはまだわかりません。 DOS 21hシステムコールを使用すると、コマンドラインパラメーターを使用したり、特定のメモリページにデータを保存したり、ゲームの状態をハードドライブに保存したりできます。 IDAは、私たちの場合の状況を教えてくれます。



重要なファイルのリスト



ゲームで使用される重要なファイル:



//

16 -rw-r--r-- 1 fabiensanglard staff 7,793 17 Jan 03:02 INSTALL.EXE

264 -rw-r--r-- 1 fabiensanglard staff 131,696 17 Jan 03:02 MKGAME.EXE

400 -rw-r--r-- 1 fabiensanglard staff 203,744 17 Jan 03:03 MKTERR.EXE

1704 -rw-r--r-- 1 fabiensanglard staff 870,528 17 Jan 03:02 OPTTEST.EXE

16 -rw-r--r-- 1 fabiensanglard staff 7,793 17 Jan 03:09 SC.EXE

1464 -rw-r--r-- 1 fabiensanglard staff 746,304 17 Jan 03:03 STRIKE.EXE



//

19832 -rw-r--r-- 1 fabiensanglard staff 10,150,560 17 Jan 03:03 GAMEFLOW.TRE

952 -rw-r--r-- 1 fabiensanglard staff 485,877 17 Jan 03:02 MISC.TRE

1304 -rw-r--r-- 1 fabiensanglard staff 665,456 17 Jan 03:02 MISSIONS.TRE

13544 -rw-r--r-- 1 fabiensanglard staff 6,932,708 17 Jan 03:02 OBJECTS.TRE

1760 -rw-r--r-- 1 fabiensanglard staff 899,145 17 Jan 03:02 SOUND.TRE

3288 -rw-r--r-- 1 fabiensanglard staff 1,681,738 17 Jan 03:02 TEXTURES.TRE



//

2040 -rw-r--r-- 1 fabiensanglard staff 1,042,674 17 Jan 03:05 ALASKA.PAK

2040 -rw-r--r-- 1 fabiensanglard staff 1,042,570 17 Jan 03:04 ANDMAL1.PAK

2040 -rw-r--r-- 1 fabiensanglard staff 1,042,960 17 Jan 03:09 ANDMAL2.PAK

2048 -rw-r--r-- 1 fabiensanglard staff 1,046,382 17 Jan 03:09 ARENA.PAK

2040 -rw-r--r-- 1 fabiensanglard staff 1,043,268 17 Jan 03:06 CANYON.PAK

2032 -rw-r--r-- 1 fabiensanglard staff 1,038,716 17 Jan 03:05 EGYPT.PAK

2024 -rw-r--r-- 1 fabiensanglard staff 1,033,096 17 Jan 03:07 EUROPE.PAK

656 -rw-r--r-- 1 fabiensanglard staff 333,464 17 Jan 03:02 MAPDATA.PAK

2040 -rw-r--r-- 1 fabiensanglard staff 1,044,396 17 Jan 03:03 MAURITAN.PAK

2032 -rw-r--r-- 1 fabiensanglard staff 1,037,798 17 Jan 03:04 QUEBEC.PAK

2040 -rw-r--r-- 1 fabiensanglard staff 1,043,840 17 Jan 03:08 RHODEI.PAK

2048 -rw-r--r-- 1 fabiensanglard staff 1,046,316 17 Jan 03:06 SANFRAN.PAK

2048 -rw-r--r-- 1 fabiensanglard staff 1,045,766 17 Jan 03:08 TURKEY.PAK



//

80 -rw-r--r-- 1 fabiensanglard staff 37,732 17 Jan 03:02 MSFILES.PAK



// 3D-

8 -rw-r--r-- 1 fabiensanglard staff 1,806 17 Jan 03:02 PALETTE.IFF








Strike Commanderに関連するドキュメント







パート3.リバースリソース開発。



アーカイブシステム



PAKおよびTRE形式は、マリオの仕様のおかげで100%明確です。





libRealSpaceのTreArchiveとPakArchviveを使用すると、アーカイブを簡単に管理/解凍できます。



飛行機



航空機は、IFFアーカイブの完全なファイルに保存されます。 95%は理解可能です。 4つの重要な部分で構成されます。



  1. 空力特性。
  2. ダメージシステムとライフポイント
  3. 武器システム
  4. 外観

    1. 3Dデータ
    2. テクスチャー


JET形式の仕様を参照してください。



カード



マップは95%理解可能です。 これらはX.PAK



に保存されますが、 TEXTURES.TRE



テクスチャも参照します。 カード形式の仕様を参照してください。



マップテクスチャフォーマットの仕様を参照してください。



メニュー



メニューは50%理解できます(視覚化ですが、ロジックではありません)。



まだ仕様はありません。



アニメーション



アニメーションは50%明確です:





アニメーション形式の仕様を参照してください。



パレット



パレットは100%明確です: パレット形式の仕様を参照してください。



AI /ゲームロジック



今のところ、彼らは彼らに取り組んでいない。 それらはおそらくすべてexeに含まれています。



プレイテスターマニュアルに記載されている時間とドキュメントを考慮すると、単純な決定木は存在しないと思います。 おそらく階層的な有限状態マシン。



Arctificial Intelligence for Gamesのすべてのテクニックの詳細な説明を参照してください。



ゲームを保存する



保存されたゲームの形式は75%理解できます。 保存されたゲームの形式の仕様を参照してください。



パート4.ゲームを再び開始します。



Strike Commanderの書き換えプロジェクトが開始されました。 完全なソースコードはGitHubにあります



git clone https://github.com/fabiensanglard/libRealSpace







エンジン











航空機/オブジェクト



































メニュー











地図ビューア



















グラフィックス形式



















アニメーションビューア



















ゲームビューア



まだ何もありません! ゲームでSCUMMスタイルの仮想マシンを使用することを強く期待しました。 この部分はOPTTEST.EXE



によって実行されOPTTEST.EXE







パレット



パレットの効果を再現するのはおそらく難しいでしょう。パイロットが過負荷になると、画面が灰色に変わります(Gが大きくなると暗くなります)。 これは、パレット間を補間することにより実装されます。 ここでシェーダーが役立ちます。



















Oculus Riftのサポート



Oculus Riftの統合に関する作業はまだ開始されていません。 [約。 レーン:Githubでのプロジェクトの最後のコミットは昨年10月であるため、悲しいかな...]



All Articles