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

2013年11月21日(木) 21:17

スマートボム移動

 一部の情報から処理の目的を推測しながら解析を進めていたが、早とちりで失敗していた。
 画面に表示中のミサイル数やスマートボム数を記録しているメモリーがあるが、それを+1している部分があった。なるほど新しくミサイルを画面出現させるルーチンなんだろうと思ってたら、実はそれがミサイル移動ルーチンだった。無関係だと思い込んでずっとスルーしていた。

 なぜ移動ルーチンで+1されているかと言うと、移動と同時に存在数をカウントしていたのだった。
 ルーチン最初に個数を0としておき、8セットのワークエリアにミサイルが存在すれば移動&個数+1する。ルーチンを終了すると、移動が完了すると同時に存在数も更新されている。
 移動ルーチンだと確定すれば、スマートボムと処理が分岐している部分は容易に分かる。
 これでスマートボム独自処理を行なっている部分が判明し、そこを解析すれば移動アルゴリズムが分かる。

 こうして芋蔓式にスマートボムの正確な移動処理が判明したが、ビット判定とテーブル引きを駆使しているため、lua
に移植する場合もある程度、まる写し。
 そして最初に感じた危惧通り、VRAMを読んでいやがった。
 考えてみればフレーム毎にVRAM更新は必須だから、VRAMに書き込む行為は追加コストにならない。それならば、VRAMを読むことで爆煙との当たり判定を高速化できる。最大20個ある爆煙との当たり判定を繰り返すより遥かに速い。だが、lua
で未来予測する場合、画面表示は不要である。だから、スマートボムの当たり判定だけのために仮想VRAMを更新し続けるのは無駄なコストであり、爆煙内かどうか判定するループを回した方がマシと思われる。

 スマートボム移動ではまず、周囲8箇所の爆煙を調べる。上下左右の4方向に、8ドット離れた画素。斜め4方向に、横6ドット縦6ドット離れた画素。
 結果は1か0としてビットまとめして1バイトのRAMに格納しておく。8面までは、真上には常に爆煙が検出されるものと細工されている。恐らくコレで、スマートボムが若干「馬鹿」になるはずだ。つまり、スマートボムがその本領を発揮して嫌らしさ全開となるのは、9面以降。
 結果が0または255(爆煙が全く無いか8箇所全部が爆煙内)であれば、通常ミサイルと同じように等速直線運動を続行して移動終了。

 爆煙が検出されれば、テーブルからマスクパターンを引いてビット演算し、移動方向を決める。これには移動ベクトル計算ルーチンも駆り出して、本来移動したい方向がどっちであるかまで加味されている。生き物じみたスマートボムの挙動を実現するため、予想外に多くの処理が行なわれている。これには驚いた。ミサイルコマンドのCPUは、クロック
625KHz である。ギカヘルツはおろかメガヘルツですらなく、キロヘルツ!
 命令の機能や実行サイクルを考慮しても、PICの10分の1ぐらいの処理能力しかない。それで、このスマートボムの動き。移植版の多くが、スマートボムを再現できなかったという・・・

 最終的に移動方向は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