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

2013年11月13日(水) 21:18

問題あるが試作しよう

 照準の現在座標が入っているアドレスは簡単に見つかるので、そこに直接 memory.write()
してやれば照準移動は可能だ。しかし1フレームで移動可能な距離には限度があるので、好き勝手に値を設定すると実機で不可能なプレイになってしまう。それに、発射ボタンが押せなければ照準だけ移動できても意味はない。
 逆アセンブルリストを見て、memory mapped I/O と関連したアドレスを探す。
 問題は、テンポラリとして使われているアドレスが多く、容易に意味が掴めないこと。

 ただ、可能性は高い。というのも、デモプレイを行なう画面があるからだ。デモプレイでは、ムービーファイル同様にキー入力をあらかじめ記録しておき、それを再生していることが多い。通常プレイでは、ムービーファイルではなくコンパネの入力を使う。キー入力部分だけで両者を切り分けるのが、プログラム的には最も簡単だ。そのため、キー入力を別のワークで中継させているかもしれない。
 そして遂に、memory.write() することで自由にキー入力させられるアドレスを発見。そこに書き込んでも、デモプレイ中は反応しない。

 しかし、コイン投入とスタートボタンは別だ。lua では入力できない。
 これに関しては、手動でキーボードを叩くしかない。つまり、最速プレイは無理だし乱数調整も無理。まあ追記ゼロという段階で乱数はどうにもならないが。

 キー入力が可能となり、主要キャラのワークアドレスも分かって来た。まだ不完全だが、このあたりで自動プレイ lua を試作したい。動きを見ながら改良を重ねれば良い。
 自動プレイでは、ミサイル迎撃座標を計算せねばならない。ミサイルの位置と移動ベクトルは分かるし、迎撃基地の座標も分かっている。残る変数は1つ。迎撃ミサイルの速度である。これが実は、地味に難問なのだ。
 今回のTASは追記不可なので未来予知は無く、ミサイルはワークRAMに出現してから迎撃に掛かる。ワークRAMに出現するまで待つのだから、計算前に座標も移動ベクトルも
memory.read() 可能だ。しかるに迎撃ミサイルは、発射すなわちワークRAMに出現する前に、計算せねばならない。

 ワークRAMに出現後は、迎撃ミサイルの移動ベクトルを memory.read() できる。しかし、計算は発射前ワークRAM出現前であり、読み取れない。
 ひとまず概算値で計算することに決める。後から正確な値を何とかすれば良い。今はプロトタイプとして、基本的なプレイが想定通りに行なえるかどうかの確認だ。
 これで、特定ミサイルを特定基地から迎撃する場合に、照準を移動すべき座標が計算できる。
 次の問題は、「どのミサイルを迎撃するか」「どの基地から迎撃するか」の決定方法だ。

 人間の場合、照準を効率良く移動させる巡回問題は、それなりに重要である。しかし、トラックボールの入力はフレームごとにプラスマイナス15ドットまでアリだ。TASで最高速移動すれば、巡回順番はそれほど影響がない。1フレームを争う
Speedrun では大問題だが、今回はそういうTASではない。それに、このあたりの決め方は後から簡単に変更できる。
 まずは単純に、最も高度の低いミサイルから迎撃することとする。実際、ミサイルは上下方向の移動分速が殆ど変わらない。すなわち、垂直落下して来るミサイルも斜めに落ちて来るミサイルも、途中で追い越したり追い越されたりしない。となると、一番低いミサイルが最も脅威である。

 次に、どの基地から迎撃するか。迎撃ミサイルの数が無限であれば、最も短時間で迎撃可能な基地を使えば良い。しかし、残弾がシビアなのがミサイルコマンドである。そこで、残弾に比例して各基地の領空を比例配分する。ただし使い勝手が良いので、後半に備えて中央は使い渋りたい。そこで中央は残弾が半分しかないものとして、領空を狭くする。
 領空は、X座標だけを計算。
 まず、中央の基地から迎撃するとして、撃墜座標を計算。そのX座標が中央の領空に含まれていれば中央から撃つ。
 含まれていない場合は、左右の基地で同様の判定を行なう。
 どこかの基地で残弾が無い場合とか、若干の場合分けを行なって使用基地を決める。

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