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

2013年11月15日(金) 21:26

迎撃ミサイル

 迎撃ミサイルの移動ベクトルは、どうやって算出されているか。これが良く分からない。
 しかしこれはレトロの2Dゲームである。照準座標のすべてに対して試射を行い、テーブルとして持ってしまうという力技が思い浮かんだ。

 画面解像度は256×232しかなく、そのうち照準可能な面積は240×162に過ぎない。すなわち、38880箇所。基地は3つなので、合計でも10万余りでしかない。ミサイルコマンド発売当時ならともかく、現在の基準なら些細なテーブルで済んでしまう。速度面でも有利だ。
 さっそく自動射撃の lua スクリプトを作成し、移動ベクトルをファイル出力させる。無限発射を可能とするスクリプトに問題があり、射撃失敗座標が幾つか発生した。ゲーム解析が不十分だから、仕方ない。個別に撃ち直して穴を埋め、座標ファイルが完成。

 実は必要なのは、照準座標に応じた移動ベクトルではない。照準位置に到達するまでに要するフレーム数である。
 座標ファイルを別のプログラムで処理し、所要フレーム数を最終ファイルに出力。これを
lua スクリプトに読み込ませ、内部配列にテーブルを抱え込ませる。
 これで、照準位置と使用基地からテーブルを引いて、到達に要するフレーム数が直読できるようになる。

 変換プログラムでは入力として移動ベクトルを受け取るため、迎撃ミサイルの速度が分かる。そこで、巷の噂を確認してみる。それは、中央の迎撃ミサイルが他より速いというものだ。

 これが、中央基地から発射された迎撃ミサイルの速度を視覚化したものである。

 照準位置に応じた飛行速度を、色分けした。真上に発射すると、1フレームごとに3ドットずつ移動する。すなわち、速度はフレームごとに3ドット。赤は高速で、青が低速。
 見ると、真上と左右の斜めが高速で、それ以外は速度が落ちる。移動ベクトルの計算は、結構いい加減だと判明。速度は2.8〜3.2ぐらいまでバラツいているため、アバウトな単一速度で計算すれば迎撃座標はズレまくると分かる。

 続いて、左基地から発射した迎撃ミサイルの速度。
 右上に謎の高速領域がある。対角線にこの領域を狙うと、速度が4を超える。しかし遠いので、右基地を使った方が短時間で迎撃可能だ。更に、こんな上空で迎撃するには未来予知を要する。よって、実用性はない。

 これを除外すると、速度範囲は中央基地の場合と同一。
 要するに、中央基地の迎撃ミサイルが速いというのは迷信だった。

 左基地の場合も、対角に謎の高速領域が存在する。
 全体として右基地の鏡面になっている。

 結論として、どの基地を使っても迎撃ミサイルの速度は同じである。

 しかし、更なる問題が発覚した。それは、狙った座標に迎撃ミサイルが到達しない、というものだ。
 移動ベクトルは256分の1ドット単位の固定小数点演算で加算を重ねるため、誤差が蓄積する。運が良ければ照準座標に到達できるが、かなりのケースで隣接ドットを通過してしまうのだ。そこで、照準座標と一致しなくても、X座標かY座標のいずれか一方が照準座標を
OVER したら到達と判定されている。
 ここで、到達と判定された際に爆発が照準座標で発生するなら、何の問題もない。

 ところが実際には、爆心座標として照準座標ではなく最新座標が書き込まれてしまうのだ。内部ワークではミサイルと迎撃ミサイルは隣接して記憶されており、合計16個まとめてループ回してるせいだろう。いちいち照準座標を確認していない。
 つまり、照準と異なる座標で、爆発が発生する。この座標ズレは、何割という頻度で多発する。

 ズレても通常弾頭は爆煙に巻き込めば良いが、問題は直撃させる必要があるスマートボムである。

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