上に戻る
jsr $0004;キャラ化けさせずに敵を出す
概要
 ステージ中に登場するザコ全てをVRAMに保持することは、容量的に不可能です。
 ファミコンのロックマンでは数画面単位(部屋?)でスクロールし、次の部屋のザコのグラフィックを準備をすれば正しくザコを表示することが出来ました。(ただし、5を除く)
 しかし、エックスシリーズでは、こういった部屋単位でザコが分かれているとは限りません。(X3では割と多い気もするけど)一体どのようにザコの絵を準備を行っているのでしょうか。
オブジェクト任せ
 結論を書くと、ある一定のライン(縦ラインor横ライン)を超えるとVRAMへの転送を行う様になっています。そのラインはある特定のオブジェクトを置くことにより作られます。その特定のオブジェクトが毎フレーム、エックスの位置を監視し、あるラインを踏み越えた瞬間に画像転送の準備を行っているのです。

 詳細には、その「準備」というのは、別のスレッド作成し行われます。もちろんスーファミのCPUは単スレッドの処理しか行えないため、メインのスレッドの処理が終わった後に、画像転送用のスレッドの処理をすることになります。
 画像転送用スレッドはさらに、画像展開用スレッドを作成し、CPUの余裕な時間を目いっぱい利用し、ROMに圧縮された画像をWRAMへと展開します。それが終わると、画像転送用スレッドは、WRAMに展開されたデータをVRAMへと転送する指示を出し、スレッド処理を終えます。実際の転送は、X3に積まれた非標準のハードウェアにより「かなり」高速に行われるようです。(それが何なのか分からない当たり情けねー……)

 なんか、あーだこーだ書きましたが、「詳細には」以下は、割とどうでもいいです……
特定のオブジェクトとは
 ObH(コンダクター)の、種類15,18を利用します。種類15の場合、配置された場所から縦にラインを引き、その左右どちらかにエックスが居るかで画像を指定します。種類18の場合は、横にラインを引きます。
 尚、出現した瞬間は転送処理を行いません。ラインを「踏み越えた」瞬間に、画像の転送処理を開始します。

 どちらのオブジェクトも、引数として、「どの」画像を転送するかを指定します。引数は上位ニブルと下位ニブルで0〜Fの2つの値を指定します。
 縦ラインだと分かりやすいのですが、
 上位ニブルの値が「右から左に踏み越えたとき(エックスは左に居る)」の画像番号、
 下位ニブルの値が「左から右に踏み越えたとき(エックスは右に居る)」の画像番号です。
 例えば、引数として12を与えた場合、大体、エックスが左に居るときは画像番号1、右に居るときは画像番号2の画像がVRAMにあると考えて問題ありません。
 縦ラインの話だけをしてきましたが、種類18の横ラインでも同様です。こちらは上に居るとき上位ニブルを利用するようです。

 何気なく「画像番号」なんて言って誤魔化しましたが、各ステージ毎に0〜Fまでの16通りの画像のパターンを組むことが出来るようです。例えばイレギュラーハンター本部ステージの画像番号0はノートルバンジャー・キャタキラーという2つの敵が転送されます。なぜか画像番号1でも同じ組み合わせのようです。画像番号2はマックです。
 また、転送するのは画像だけではなく、大抵はパレットも転送するようです。
具体的にどの番号を指定する?
 一つ上に、RockX3Cond15Viewerというソフトがありますので、それを使うと、ステージ毎に、どの番号でどの画像が転送されるかが分かります。同じステージの中から変更するときは、これで問題が無いでしょう。
もっと自由に変えたいんだけど……
 アドレス088623から、各ステージで2バイトずつデータ(※1)が存在します。この値はオフセットになっており、088623に足した先のデータを参照します。
 その参照先は更に、2バイトずつのオフセットデータ(※2)が存在します。このデータは、画像番号に対応するものです。やはり、088623からのオフセットです。
 更にもう1回参照すると、画像転送のための構造体データ(※3)に行き着きます。

 とりあえずは、そこ(※3)まで奥深くに入る必要はとりあえずないでしょう。1回だけ参照したオフセットデータ(※2)を弄くれば、それ相応の敵パターンを作ることが可能です。
 例えばホーネックステージのエレベーターを出したいなら、適当なステージ・画像番号の、画像転送のための構造体データへのオフセットを、02E6(E6 02)と書き換えれば良いです。

 ……「こめじるし」(※)は、データの階層を分かりやすく指すために使っただけなので、どこかに対応する補足説明があったりはしないです。
転送時間にご用心
 上の方でなにやらごちゃごちゃ書いたのですが、ラインを踏み越えた瞬間、即転送が終わるわけではありません。どうも、一部のザコは画像転送中に出現すると、透明になってしまい、画像転送が終わっても透明なままといった現象が起こりえるようです。
 また、ライン付近に敵が居ると、ラインを踏み越えた瞬間に化けてしまうので美観がよろしくありません。なるべく敵が居ないところにラインを引くと良いでしょう。
 その他、画像転送中にシャッターをくぐったりすると、なにやら嫌な予感がします。
 負荷に応じて展開速度が変わる仕様のようなので、条件が悪いといつまでも転送が終わらなかったりするかも?
実は……
 画像指定はこの方法のみを使って行われるわけではないようです。今回はObHの15,18を利用しましたが、16,19も同様に、縦ライン横ラインでの画像転送です。その利用区分は分かってないです。BG転送に利用されているような……
 さらに、まだ他の方法で指定されることもあるようです。具体的には……未調査です。シャッターをくぐったときなどに、画像が転送される様に思えます。その他、敵等のプログラムから画像転送要求を出すことも出来るはずです。
 画像番号は0〜Fまでしか使えないと書きましたが、プログラムから画像転送要求を出すときは、10以上の番号が使えるようです。例えば、8ボスステージにおいて、ナイトメアポリスは、それぞれ10,11に指定されています。
まとめ
 ……られるほど調査が進んでいない感は否めない……しかしまぁ、今回の内容までで、一つ上に公開しているRockmanX3 AMHHくらいの書き換えは可能です。
 今回示したように、ObH(コンダクター)は、他にも多くの制御を行います。いかに多くのObHの挙動を知るかで、書き換えられる内容が変わってくるでしょう。
 ちなみに、ObHの種類は、00-22の範囲で取られることが分かっています。そのうちいくつかは利用できないようにも思えます。
(200)2011年10月23日 プレさ兵衛
inserted by FC2 system