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

2013年11月16日(土) 20:31

dsync

 スマートボムはミサイルコイマンドの主役であり、強烈に厄介だ。
 通常ミサイルだけなら、スクリプトの力を使えば簡単に100%迎撃可能。しかし、スマートボムは爆煙を回避して来る。これが1980年製作とは思えないほどスマートで、複数の爆発が複雑に絡んで発生しても、ドット単位で綺麗に回避する。丸い爆煙の縁に綺麗に沿って動く様は、VRAMを読んで判定しているとしか思えないほど。

 複数の爆発を近接発生させて挟み撃ちにするのが有効だが、弾数制限がキツいので実用性はない。
 最も効果的なのは、爆煙ではなく直撃で破壊することだ。しかしちょっとズレると回避されてしまう。だから、迎撃座標が1ドットでもズレるのは非常に影響が大きい。実際は2ドットぐらいはズレても大丈夫なのだが、座標計算には複数の要因が絡む。それぞれで最大1ドットの誤差を出していたら、すぐに致命的なまでに誤差が蓄積する。キッチリ計算すれば出ないはずの誤差は、出している余裕がない。

 狙いを外せば、TAS動画としては鑑賞に堪えなくなるし現実面でも残弾の浪費である。

 厄介なのは計算誤差だけではない。
 ミサイルコマンドというゲームは、ラウンド数の表示がない。内部ワークには、それっぽい場所がある。しかし39までカウントアップすると20に戻っている。単純な面数ワークではなさそうだ。それ自体は別にいいのだが、分かり易いように
lua スクリプトでその面数を表示させると、チラチラと表示が乱れる。いや、そもそも
memory.readbyte() で読み出した結果が、時々おかしいのだ。
 ワークRAMのすべてが全く別の用途で流用されているかのようで、まるで脈絡のない別の値が書き込まれまくる。その頻度は10回に1回程度で、極めて厄介なことに規則性が無い。

 自動プレイ lua スクリプトでは、必要に応じて memory.readbyte() して状況を把握している。無関係な値が読み出されてしまうと、スクリプトが誤動作する。
 この異常値は、特定のワークを活用すれば判別は容易である。例えばスコアはBCDで記録されているので、99H
すなわち153を OVER する値が入ることはない。入っていれば異常値である。また、迎撃ミサイルの始点座標は3箇所固定なので、それ以外の値が入っていれば異常値である。
 よって、異常値を検出すればそのフレームは処理を休止することで、誤動作を防止できる。だが、スクリプトが動かないフレームが不規則に入るのだから、照準の移動も不規則に休止が入る。これでは迎撃座標の計算が狂う。

 メモリー値の変化を追うと、謎の異常値が読み出されるフレームでも迎撃ミサイル等は普通に移動処理されている。ということは、発射してさえすれば計算通りの座標に飛んで行くはずだ。
 そこで、照準移動が完了して射撃ボタンを押す直前に、改めて迎撃座標の計算を行なわせることにした。計算結果が変わっていなければ、発射する。変わっていれば、再計算した座標へ照準を移動させる。ところがこれも、延々と再照準が繰り返されて発射できない場合が多い。止むを得ず、再移動に制限回数を設けたが、これは命中しない可能性を残す。

 ゲームなんてデジタルの世界であり、未来は完全に予測可能。よって、しっかり計算すれば百発百中。そう考えてしまうが、それほど単純ではない。そもそも、それほど単純ならなぜ
dsync などという現象が発生するのだ?
 現実のハードでは、複数のCPUが並行動作しているものもあるし、単一CPUでも割り込み処理は普通に使用される。それをソフトだけでエミュレートする場合、フレームごとに明確に処理を区切れるのか?という問題にぶち当たる。性能が低いハードならエミュレートが容易・・・という簡単な話ではない。
 特にアーケードの場合は、ユーザーインターフェイスまで含めてあらゆるハードをカスタマイズしてあるのが多い。そうなると、ゲーム毎に
dsync 状況も変化し得る。TASが製作されている数少ないアーケードゲームは、たまたま
dsync が発生し難いのだろう。

 試作 lua にあれこれ手を入れるが、どうにもスマートボムに直撃させられない。迎撃側の速度は正確に把握できるようになったので、ミサイル側の速度が不正確なのだろう。面が進んでも、ミサイルが移動していないフレームが多発している。それは謎の異常値とは無関係で、どうやら規則性がある。すなわち、どこかにカウンターが存在して移動タイミングを管理しているはずだ。

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