■ 久々にロックマン2です
最近の改造ロックマン2は凄いのが多いですね
ですが、少しだけ疑問が残ります
「どうしてここまで凄い改造をしてるのに、あーいったところやこーいったところは未改造なんだろう?」と・・・
■ ロックマン2のボスの音楽セット
その中の代表的なものが「ロックマン2のボスの音楽」です
ロックマン2はボスの音楽が一種類しかありませんが、改造ロックマンでは複数種類用意しているものが多いですよね
ですが、せっかくメカドラゴンやピコピコ君やボスラッシュやワイリーマシンの音楽に違うものを使っているのに、ガッツタンクやブービームトラップやエイリアン(ラスボス)は通常ボスと同じにしてしまっているのでしょう?
普通に考えたら、「8ボスとワイリー面ボス」で音楽を分ける(更にボスラッシュとラスボスで別音楽)のがセオリーかと思います
もしも「やりたかったけどできなかった」「やりたいけどやり方がわからない」という方がいたら、今日の日記が少しでも役に立てば幸いです
なお、6502アセンブラがわからない人は読み飛ばしてください(汗
まず、ボスの音楽を鳴らす処理は
A9 0B lda #$0B ;ボス音楽トラック指定
20 51 C0 jsr $C051 ;音楽再生サブルーチン
ですよね?
そこで、「A9 0B 20 51 C0」で検索するとたくさん出てくると思われます
全部で5つ「メカドラゴン」「ピコピコ君」「ボスラッシュ」「ワイリーマシン」「その他のボス(8ボス等)」かと思われます
これまでボスの音楽セットを変えていた人は、ここでの指定トラックを変えていたのだと思います
8ボス、ガッツタンク、ブービームトラップ、エイリアンに共通する事はシャッターを開けてボスの部屋に入るという点です
シャッターを使用しないメカドラゴン、ピコピコ君の場合はボスの処理の中に音楽を鳴らす処理が入っています(ボスラッシュは、ワープ装置に・・・)
ロックマンEXHAUSTではエイリアンの音楽だけ変えてありますが、これもメカドラゴンと同じようにボスの変身処理に「A9 0B 20 51 C0」を挿入する事によって実現しています
0x38FF4の「A9 0B 20 51 C0」を見てみましょう
実はこれは、シャッターの開閉処理の内部です
シャッター開閉処理は「0x38F39の20 20 92」〜「0x39043の60」の間です
では、その一部分を見てみましょう
38FEF : DD 6F 90 cmp $906F,x ;ボスの部屋か?
38FF2 : D0 0F bne $0F ;ボスの部屋でなかったら音楽を鳴らさない(下の処理を0Fbyte飛ばす)
38FF4 : A9 0B lda #$0B ;ボスの音楽トラックをAレジスタにセット
38FF6 : 20 51 C0 jsr $C051 ;Aレジスタにセットした音楽を鳴らす
この処理を抜粋しただけでは面ごとにボスの音楽を変えることはできません
ですが、その下にヒントがあります
38FF9 : A5 2A lda $2A ;ステージ番号(メモリの0x2A)を読み出す
38FFB : C9 0B cmp #$0B ;ステージ番号と0B(ブービームトラップ)との差を求める
38FFD : F0 04 beq $04 ;差が0であればシャッターを閉める(下の4byteを飛ばす)
38FFF : C9 08 cmp #$08 ;ステージ番号と08との差を求める
39001 : B0 3A bcs $3A ;ステージ番号が08以上であればシャッターを閉めない(下の処理を3Abyte飛ばす)
39003 : シャッターを閉める処理
これは、「ボスの部屋に入った際にシャッターを閉めるか否か?」の処理です(実際のシャッターを閉める処理は39001以降)
ROCKMAN EXILE.ではクイックマン戦でシャッターが閉まりませんが、ここを少し変えているからです
この処理があるお陰で「8ボス(0x00〜0x07)とブービームトラップ(0x0B)シャッターが閉まり、ガッツタンク(0x0A)とエイリアン(0x0D)ではシャッターが閉まらない」というものが実現できます
この処理を応用すれば、例えば
A5 2A lda $2A ;
C9 08 cmp #$08 ;
B0 04 bcs $04 ;
A9 0B lda #$0B ;
D0 02 bne $02 ;
A9 0C lda #$0C ;
20 51 C0 jsr $C051 ;
ってな感じに書けば「ステージ07までなら音楽トラック0Bを、ステージ08以降は音楽トラック0Cを」みたいな処理になるんじゃないのかなーと思います(試してないので間違えてたら御免)
ロックマン1はそんな感じにやってたと思います、確か
でも、こんな感じにステージで音楽トラックを分ける処理を入れる場合は近隣の他の処理を潰さないと入りきりません
「ボス以外でシャッターなんかいらねえよ」という方は手前の処理を、「ボスの部屋に入った後にシャッター閉める必要なんかねえよ!」って方は後ろの処理を潰すと良いかと思います
でも、処理を潰すのは誰だって怖いですよね?
そんな方に良い方法があります
「A9 0B 20 51 C0」を「A5 2A 20 51 C0」に修正してみましょう
ボスの音楽トラックがステージ番号になります
0x30A50からの音楽トラックをステージに対応したボスの音楽アドレスに変更してしまえば簡単にステージ毎のボス音楽を指定できます
まぁ、音楽トラックが勿体無いですが、これについては一曲目のデータを削ればいくらでも(256トラックまで)確保可能なので問題ないかもしれません
このA5 2Aのような処理は結構使えます
「面によって雑魚の耐久力を変える」「面によって違う動きをする敵」「ボスラッシュでボスがパワーアップ」等に役立つかもしれません
自分だったら「音楽トラック=ステージ番号」にして、現在の0x381D0から入っている「面ごとの指定音楽トラック」を別のことに使用するために確保するかと思います(モチベーションがあれば)
■ WEB拍手レス
はぁはあ
>クワたんの描く初音ミクを見てみたい
mjd!?
この手の話は久しぶりですね。ROMの絶対アドレスよりかは bank:PC のほうがよいかと思うんですが、そこも理解してない人向けかなぁ。<br>0x と $ も統一した方がいいんじゃ。
ローカルではバンク毎に切り取ったアドレスで、後から絶対アドレスに直してますw<br>統一はした方が良かったですね。いつも0x使ってて、$はmd6502での書き方だから・・
でも人に説明して書こうとすると、こんな事でも凄い量になっちゃいます。<br>書く前までは、このくらいの事なら十数行程度で書けると思ってました
ロックマンのプログラム拡張の方々の技術力は存じませんが、たぶん基礎的なことを知るとクワタさんが今回書いたことよりもっとできると思うような。<br>それをしるとプログラムもとても楽しくなると思う。けど書いても読む人がどれだけいるかどうかとか。<br>暇ができたら私が書きたいなと思います。
改造の世界では、ある程度できてしまえば何でもできてしまうので、基礎的なことを自分では書くことはないと思います。<br>取り敢えず、「折角6502を勉強してるのに、元々の作りで思考停止している」のが勿体無いと思ったので書いただけです
読む人、いると思いますよ。<br>でも、読者の対象を何処にするかで記事の難易度は変わりそうですね