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

2013年11月17日(日) 17:24

ミサイル移動頻度

 例によって64フレーム分のメモリー変化をエクセルに取り出し、敵ミサイルの移動座標が変化していないフレームに色を付ける。
 そして、そのフレームを境にして値変化の挙動に変化があるメモリーをリストアップ。
 今度は逆アセンブルリストを見て、候補のメモリーにアクセスしている部分を確認。それっぽい処理が行なわれていないか調べる。こうして、移動タイミングの管理メモリーを見つけ出した。

 まず、カウンターAがフレームごとにカウントダウンし、0の次は最大値に戻る。
 カウンターAが0の場合、カウンターBに定数が加算される。これで255を超える(オーバーフローする)とカウンターAには最大値+1がセットされる。オーバーフローしていない場合は、普通に最大値がセットされる。

 両者の総合により、256回中(B加算値)回はカウンターAが(A最大値+2)周期のループとなり、それ以外は(A最大値+1)周期のループとなる。


面数 A最大値 B加算値 平均周期
1 4 208 5.8125
2 2 224 3.875
3 1 192 2.75
4 1 8 2.03125
5 0 160 1.625
6 0 96 1.375
7 0 64 1.25
8 0 32 1.125
9 0 16 1.0625
10 0 10 1.0390625
11 0 6 1.0234375
12 0 4 1.015625
13 0 2 1.0078125
14 0 1 1.00390625
15〜 0 0 1

 15面以降はもう、ミサイルの速度は変わらない。平均周期は、その最高速の何倍遅いかを示す。10面以降は大差無いし、製作側はせいぜいその辺りまでがプレイヤーの限界だと想定していたのだろう。実際、ミサイルコマンドで10面あたりまで行けたら、相当な凄腕扱いされるだろう。しかし逆に言えば、想定外の凄腕にとっては面が進んでも難易度頭打ちという意味でもある。
 かくして世界記録が、もはやゲームの腕ではなく人間の生理的限界との戦いになっている。

 1面と2面では4、3面と4面では2、5面以降では1.そう仮定していたら、そりゃ誤差出まくりだった訳だ。

 現代の常識であれば、こんなことをしなくてもミサイル移動ベクトルの方を変えればいいだけだ。
 しかし当時のCPUは非力で、8ビットの足し算と引き算ぐらいしか出来ない。そこで固定小数点演算だが、それもビット数が少なくて誤差出まくり。ミサイルを遅くするために数を小さくすると、ビット落ちで更に誤差が大きくなる。だから、移動ベクトルには大きめの値を格納しておき、移動頻度を変えることで速度を変えているのだろう。

 これで迎撃座標の計算が正確になったが、それでもスマートボムは難物だ。爆煙を避けられると予測演算は無意味になる。ミサイル攻撃は非常に激しいので、面が進むとスクリプトにより高速照準移動でもそれほど余裕がない。スマートボムの近くのミサイルは迎撃せずに爆煙を発生させない、などという処理を行なう贅沢は苦しい。
 スマートボムの移動ベクトルを監視し、それが変化しなくなってから狙うという手法を試したが、それでもかなりの確率で狙いが外れる。

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