Darkside(リンクエラー修正しました)

2013年11月20日(水) 21:20

爆煙処理

 スマートボムと普通のミサイルは、同じ領域に記録されている。すなわち、画面に一度に表示される敵ミサイルの数は、スマートボムを含めて8個までである。それとは別に爆撃機の記録領域が1つだけ確保されている。よって、同時に爆撃機が2つ表示されることはない。
 となると問題は、通常ミサイルとスマートボムの区別はどこで行なわれているのか?である。
 これ探すのが簡単そうで、意外に難航した。必要な情報は1ビットで、最大8つだから1バイトで記録可能。という訳で、1バイトだけ使ってビットごとに記録されていた。確かにRAMは節約できるが、それを利用するためにビットマスクのテーブルをROMに8バイト確保しているのだから得失は不明だ。

 当時はRAMが貴重だったのかもしれないが、ミサイルコマンドの場合だとVRAMは贅沢に搭載している。

 ともあれスマートボムの判別法が分かったので、スマートボム専用の処理を行なっている部分も探し易くなる。正確な未来予測の焦点は、スマートボムの移動先である。スマートボムの移動処理を行なっている部分を探し出すのが絶対に必要。
 RAMの値変化を見る限り、爆煙に接近したスマートボムは回避運動を行なうが、その際に移動ベクトルまで書き換わっている。通常は他のミサイル同様に等速直線運動を行なうが、回避処理が入ると移動ベクトルを再計算しているようだ。よって、ベクトル計算ルーチンを呼び出している部分をチェックすれば良い。

 ここまで情報が揃っているのに、どうしても発見できない。逆アセンブルリストの解明は、難作業だ。
 変数名から意味を推測できる高級言語と異なり、逆アセンブルを解明するのは下手すると自分で作るより大変だ。アーケードゲーム1本を実現するアセンブラの全解析は、仕事でもやってられないだろう。判明している情報を手がかりに効率良く推理するわけだが、何か根本的に誤解している部分がありそうだ。

 スマートボムの未来予測には、正確な爆煙の状態も必要となる。こっちは素直に解明できた。
 爆煙は最大20個を表示可能となっているが、負荷を分散させるため順番に4個ずつ処理されている。よって爆煙の拡散・収縮・表示更新は5フレームに1回の頻度であり、更新タイミングは20個のうち何番目に記録されているかによってズレる。
 だから未来予測するには、新たに発生した爆煙が何番目に記録されるかも、正確にシミュレートせねばならない。爆煙半径は最大13で、27段階に分けてテーブル記録されている。結果として爆煙の存在時間は2秒より少しだけ長い。どうせ128フレームとかだろうと予想していたが、若干違っていた。

 ところで、今日のゲーム画面がおかしいことにお気づきだろうか?
 そう、ミサイルの残弾が合っていない。自動迎撃スクリプトのデバッグ用に、残弾無限にしてある。発射直後に、残弾に10を書き込んでいるだけだが。
 スマートボムが判別できると、狙い越しの量を変えられる。通常ミサイルは20フレーム未来を狙い、スマートボムは直撃を狙う。

written by higashino [ゲーム] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL

Comments

TrackBacks

Darkside(リンクエラー修正しました)

Generated by MySketch GE 1.4.1

Remodelling origin is MySketch 2.7.4