ミランダの現在のクラスによって顔グラフィックが変化するようにしました。ミランダはAルートではダークマージとして加入するため、ダークマージおよびダークビショップのときだけ、それらしい格好をします。
紹介動画
スクリーンショット
Aルートでも、マージファイターにクラスチェンジすると、いつもの服装に戻ります。
Bルートでは常にいつもの服装です。
変更箇所
$8CBFB7 にある顔グラフィックのアドレスを読み込む処理をフックして、判定を入れています。ここではXに顔IDの4倍の値を保持しているので、ミランダの顔IDを判定するときは cpx.w #$000a*4 で分岐させます。
具体的には、以下のような処理を適当な空き領域に入れてサブルーチンとして呼び出すようにします。
cpx.w #$000a*4 ; ミランダの顔 bne .end ; クラスチェンジ用 lda $0E6F ; アクティブユニット ユニットID cmp #$000a ; ミランダ bne + lda $0E71 ; アクティブユニット クラスID and #$00ff cmp.w #$0038 ; ダークマージ beq .hit2 cmp.w #$0039 ; ダークビショップ beq .hit2 bra .end + ; その他の場合用 phx ; 味方48人分サーチ lda #$5298 ; ユニットデータ1 ユニットIDの位置 .loop tax lda $7e0000,x ; メモリ内のユニットID cmp.w #$000a ; ミランダ bne .next lda $7e0002,x ; メモリ内のクラスID and #$00ff cmp.w #$0038 ; ダークマージ beq .hit cmp.w #$0039 ; ダークビショップ bne .end2 .hit plx .hit2 lda.w #portrait_010_1 ; ミランダ(ダークマージ) sta $2f lda.w #portrait_010_1/256 sta $30 rtl .next txa clc adc #$0041 ; 次のユニットを参照する cmp #$5EC7 ; 味方48人目まで処理したら終了 bcc .loop .false ; 未加入時、17章Aでだけはダークマージ姿にする lda $0e11 cmp #$0016 ; 17章A レンスターゲイト beq .hit .end2 plx .end lda.l portrait_list,x ; 顔グラ 画像読み込みアドレス指定(デフォでは $8cd12a) sta $2f lda.l portrait_list+1,x sta $30 rtl
今のところは他のキャラにこの処理を適用するつもりがなかったので、汎用性のない処理になっています。全てのキャラに対してクラスチェンジしたときに顔を変えたいとか思う場合は、もっと処理を共通化できるように考えなければなりませんね。
なお、この処理ではパレットは元の顔と同じものを使う前提となっていますが、顔を切り替えるときは違うパレットを使えるようにしたほうが自由度が高くなります。(今回のミランダは色が足りなかったので、緑色の服の陰部分を茶色で描いてしまっています。)
追記:ミランダの元の顔のパレットを調節し、深緑色を追加して描き直しました。