DQ3 きんのかんむり装備時に外見を王様にする

質問回答3連発の最後です。

DQ3できんのかんむり装備時に外見を王様にしたい

です。まずはオリジナルの実装のお勉強です。普段あまりいじる場所ではありませんが、DQ3SFC K.Mixで5人目のキャラクターの着脱をする際にざっと解析していたので変更場所は分かっています。

  • SR: $063084 PCグラフィック決定
063084 PHX Push X
063085 PHY Push Y
063086 STA $1C $00001C=A
063088 JSL $046951 SR: $046951 引数:1#$06 引数:2#$FF 引数:3#$FD 職業ID取得
06308F STY $18 $000018=Y
063091 JSL $042E19 SR: $042E19 引数:1#$06 引数:2#$FF 引数:3#$FD 性別取得
063098 STY $1A $00001A=Y
06309A JSL $043F87 SR: $043F87 引数:1#$06 引数:2#$FF 引数:3#$FF ステータス取得
0630A1 AND #$0010 A&=#$0010 死んでいるかどうか
0630A4 BEQ #$06 if(z==on) goto $0630AC
0630A6 LDA #$0020 A=#$0020 死んでいたら棺桶のグラフィック
0630A9 JMP $3142 goto $063142
0630AC LDA $7E354F A=$7E354F
0630B0 AND #$0002 A&=#$0002 勇者がロマリア即位中か
0630B3 BEQ #$03 if(z==on) goto $0630B8
0630B5 JMP $312A goto $06312A
0630B8 LDA $7E353E A=$7E353E
0630BC AND #$0010 A&=#$0010 夢の中の最終イベント中(モンスター)
0630BF BEQ #$03 if(z==on) goto $0630C4
0630C1 JMP $313C goto $06313C
0630C4 LDY $18 Y=$000018
0630C6 LDA #$0001 A=#$0001 種別:鎧をセット
0630C9 JSL $044A03 SR: $044A03 引数:1#$06 引数:2#$1C 引数:3#$FF 引数:4#$FF 装備アイテムID取得
0630D1 BCS #$14 if(c==on) goto $0630E7 装備していなければ飛ばす
0630D3 CMP #$004E A==#$004E? あぶない水着装備
0630D6 BEQ #$3A if(z==on) goto $063112
0630D8 CMP #$0063 A==#$0063? 神秘の水着装備
0630DB BEQ #$35 if(z==on) goto $063112
0630DD CMP #$004F A==#$004F? 魔法のビキニ装備
0630E0 BEQ #$30 if(z==on) goto $063112
0630E2 CMP #$0047 A==#$0047? ぬいぐるみ装備
0630E5 BEQ #$3D if(z==on) goto $063124
0630E7 LDA $1A A=$00001A
0630E9 CMP #$0000 A==#$0000? 性別が男か
0630EC BEQ #$12 if(z==on) goto $063100
0630EE JSL $090566 SR: $090566 引数:1#$01 引数:2#$0173 引数:3#$C424A9 引数:4#$0003 引数:5#$0000FF 固定長データ「職業」の女CG(キャラクターグラフィック)ID取得
0630FD JMP $3142 goto $063142
063100 JSL $090566 SR: $090566 引数:1#$01 引数:2#$0173 引数:3#$C424A9 引数:4#$0002 引数:5#$0000FF 固定長データ「職業」の男CG(キャラクターグラフィック)ID取得
06310F JMP $3142 goto $063142
063112 JSL $090566 SR: $090566 引数:1#$01 引数:2#$0173 引数:3#$C424A9 引数:4#$0004 引数:5#$0000FF 固定長データ「職業」の水着着用時女CG(キャラクターグラフィック)ID取得
063121 JMP $3142 goto $063142
063124 LDA #$001C A=#$001C 着ぐるみの格好
063127 JMP $3142 goto $063142
06312A LDA $1A A=$00001A
06312C CMP #$0000 A==#$0000? 性別が男か
06312F BEQ #$05 if(z==on) goto $063136
063131 LDA #$001E A=#$001E 勇者のロマリア王の格好(女)
063134 BRA #$03 goto $063139
063136 LDA #$001D A=#$001D 勇者のロマリア王の格好(男)
063139 JMP $3142 goto $063142
06313C LDA #$005D A=#$005D モンスター
06313F JMP $3142 goto $063142
063142 PHA Push A
063143 TAX X=A
063144 LDA $7E353B A=$7E353B
063148 AND #$0010 A&=#$0010 透明中?
06314B BNE #$09 if(z==off) goto $063156
06314D LDA $7E353B A=$7E353B
063151 AND #$0020 A&=#$0020 透明中?
063154 BEQ #$16 if(z==on) goto $06316C
063156 JSL $090572 SR: $090572 引数:1#$00 引数:2#$0009 引数:3#$C893D4 引数:4#$0002 引数:5#$0000FF 構造体アクセス
063165 CMP #$0000 A==#$0000?
063168 BEQ #$02 if(z==on) goto $06316C
06316A STA $01,S Stack($01)=A
06316C PLA Pull A
06316D PHA Push A
06316E LDA $7E353B A=$7E353B
063172 AND #$0040 A&=#$0040 変化の杖で変化中?
063175 BEQ #$14 if(z==on) goto $06318B
063177 LDX $3530 X=$7E3530 変化中のキャラクターID?
06317A JSL $090572 SR: $090572 引数:1#$00 引数:2#$0002 引数:3#$C89839 引数:4#$0000 引数:5#$0000FF 構造体アクセス
063189 STA $01,S Stack($01)=A
06318B PLA Pull A
06318C PLY Pull Y
06318D PLX Pull X
06318E RTL return

というわけで、装備品が特定のものであればいつもと違うCGを使う、というだけで、とりたてて解説するべき部分はない実装になっています。この実装を踏まえて、きんのかんむり装備時に王様のCGになる実装をどう挟むか、ということになります。場所的に水着やぬいぐるみの前後が妥当な感じがするので、その前後を変更します。

  • SR: $063084 PCグラフィック描画
0630D1 BCS #$0A if(c==on) goto $0630DD
0630D3 JSR $F400 SR: $06F400 Aが水着系か(該当c=on)
0630D6 BCS #$3A if(c==on) goto $063112
0630D8 CMP #$0047 A==#$0047?
0630DB BEQ #$47 if(z==on) goto $063124
0630DD JSR $F413 SR: $06F413
0630E0 BCS #$5D if(c==on) goto $06313F
0630E2-6 NOP
  • SR: $06F400 Aが水着系か(該当c=on)(新SR)
06F400 CMP #$004E A==#$004E? あぶない水着
06F403 BEQ #$0C if(z==on) goto $06F411
06F405 CMP #$0063 A==#$0063? 神秘の水着
06F408 BEQ #$07 if(z==on) goto $06F411
06F40A CMP #$004F A==#$004F? 魔法のビキニ
06F40D BEQ #$02 if(z==on) goto $06F411
06F40F CLC c=off
06F410 RTS return
06F411 SEC c=on
06F412 RTS return
  • SR: $06F413 きんのかんむり装備か(該当c=on)(新SR)
06F413 LDY $18 Y=$000018
06F415 LDA #$0003 A=#$0003 アイテム種別に兜をセット
06F418 JSL $044A03 SR: $044A03 引数:1#$06 引数:2#$1C 引数:3#$FF 引数:4#$FF 装備アイテムID取得
06F420 BCS #$16 if(c==on) goto $06F438
06F422 CMP #$0072 A==#$0072? 金の冠か
06F425 BNE #$11 if(z==off) goto $06F438
06F427 LDA $1A A=$00001A
06F429 CMP #$0000 A==#$0000? 性別が男
06F42C BEQ #$05 if(z==on) goto $06F433
06F42E LDA #$001E A=#$001E 女王様(元勇者)のCGID
06F431 BRA #$03 goto $06F436
06F433 LDA #$001D A=#$001D 男王様(元勇者)のCGID
06F436 SEC c=on
06F437 RTS return
06F438 CLC c=off
06F439 RTS return

本当は普通の王様・女王のキャラ(ID:#$37,38)に変えようと思ったのですがPC*1とそれ以外のキャラでデコードルーチンが異なるためか(原因は不明)、グラフィックが崩れるという問題が起きてしまったので、元勇者の王様を代用することでとりあえずの回答とします。

*1:プレイヤーキャラクター