質問回答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とそれ以外のキャラでデコードルーチンが異なるためか(原因は不明)、グラフィックが崩れるという問題が起きてしまったので、元勇者の王様を代用することでとりあえずの回答とします。
:プレイヤーキャラクター



コメント