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

2013年11月12日(火) 21:24

キー入力できない

 ゲームで良くあるバグに、判定のすり抜けがある。
 ミサイルコマンドはドット単位で当たり判定しているので、1フレームの間にキャラが1ドット以上動くと判定がすり抜ける可能性がある。迎撃ミサイルの速度は、明らかにフレーム間1ドットより速い。そのため、1フレームで3回の判定を行なっているようだ。1フレームの移動量が、メモリー内に格納されているベクトルの3倍になっている。
 これは一見処理を重くするが、ミサイルは爆発するまで当たり判定が生じない。移動中は目標座標に到達したかどうかだけチェックすれば良いので、非力な8ビットCPUでも大丈夫。

 この時点で、爆撃機の移動ベクトルがどこに格納されているか分からない。
 それ以上の大問題として、そもそもどうやって lua でキー入力すれば良いか分からない。

 lua には joypad.write() という関数があり、それでゲーム時のキー入力を行なう。問題は引数がハッシュになっている。すなわち、(キー)=(値)という形式である。よって、入力するためにはキーを知っていなければならない。
 他機種TAS用 lua だと、Aボタンが押されている状態を A=1 という感じで記述する。左移動しながらBボタンだと、joypad.write({left=1,
B=1})  という感じに列挙する。この場合、左移動が left であることを知っていなければ、記述しようがない。コンシューマーゲーム機はどのゲームでも使うハードは共通なので、いったんキーの対応を解明すれば後はどのゲームでも同じように記述できる。
 ところがアーケードではゲーム毎にハードが違うので、ミサイルコマンドにはミサイルコマンド専用のキーが存在するはずだ。それを知らなければ、joypad.write()
のカッコの中にどう記述すれば良いか分からない。

 試しに left や right などありがちな値をあれこれ入れて lua を動かしたが、何やってもキー入力されない。キーボードを自分の手で叩けば、もちろん反応する。
 そもそも lua の joypad.write() はアナログに対応していない。各キーは「押されている」か「押されていない」の2状態しか設定できない。しかるに、ミサイルコマンドではトラックボールを使う。移植版なら当然デジタルパッドでも操作できるようにコンフィグ可能だが、今相手にしているのはアーケード版である。いちおう
MAME-rr にはパソコンで操作するときのためにキーコンフィグは存在するが、そんなの知らねえよとばかりに
lua には無視されてしまう。
 そこで joypad.read() を使ってキー状態を読み出した。読み出されたハッシュのキーを列挙すれば、使うべきキーが判明するはずだ。そう、これで確かに判明した。しかしそのキーを使って入力を設定すれば、エミュレーターが落ちてしまう。MAME-rr
+ lua ボロボロである。

 ネット検索しても、MAME-rr でミサイルコマンドで joypad.write() するためのキー記述なんてヒットしない。そんなものTAS製作者しか気にしないはずなので、仮に先駆者が存在すればミサイルコマンドのTASが既に作られているだろう。誰もやっていないからこそチャンスだが、情報は
Google に頼らず自力で集めねばならない。

 memory.writebyte() で 0x4800 や 0x4900 に書き込んでも、何も起きない。そりゃそうだ。memory
mapped I/O なのだから、普通のメモリーと同じアクセス方法は通用しない。駄目モトで試したら、駄目だったというだけ。
 最悪、ROMにパッチを当てるしかないかも。

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