ミランダのクラスによって顔グラが変化するように変更

ミランダの現在のクラスによって顔グラフィックが変化するようにしました。ミランダはAルートではダークマージとして加入するため、ダークマージおよびダークビショップのときだけ、それらしい格好をします。

紹介動画

スクリーンショット

Aルートでのミランダ加入時
ミランダ(ダークマージ)
ミランダ(ダークビショップ)

Aルートでも、マージファイターにクラスチェンジすると、いつもの服装に戻ります。

ミランダ(マージファイター)

Bルートでは常にいつもの服装です。

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

今のところは他のキャラにこの処理を適用するつもりがなかったので、汎用性のない処理になっています。全てのキャラに対してクラスチェンジしたときに顔を変えたいとか思う場合は、もっと処理を共通化できるように考えなければなりませんね。

なお、この処理ではパレットは元の顔と同じものを使う前提となっていますが、顔を切り替えるときは違うパレットを使えるようにしたほうが自由度が高くなります。(今回のミランダは色が足りなかったので、緑色の服の陰部分を茶色で描いてしまっています。)

追記:ミランダの元の顔のパレットを調節し、深緑色を追加して描き直しました。