DQ3 ストーリー変更(ロマリア~ノアニール12)

イベントの残りの実装を終わらせてしまいます。

  • SR: $0CF500 NPC1_TalkSR_0573(ドン・ガアデとの会話処理)(新SR)
0CF500 LDA $354A A=$354A
0CF503 AND #$0020 A&=#$0020 目覚めの粉を使っているか
0CF506 BNE #$03 if(z==off) goto $0CF50B
0CF508 JMP $F53B ($0CF53B) goto $0CF53B
0CF50B LDA $35B0 A=$35B0
0CF50E AND #$0020 A&=#$0020 橋が修復済みか
0CF511 BEQ #$0A if(z==on) goto $0CF51D
0CF513 BRK $0FED ($0C0FED) goto $00FFE6(メッセージ表示) #$0FED
0CF516 JSL $CDACD2 SR: $0DACD2
0CF51A JMP $F53E ($0CF53E) goto $0CF53E
0CF51D LDA $35B0 A=$35B0
0CF520 AND #$0008 A&=#$0008 ロマリアの橋修復失敗イベントをみているか
0CF523 BEQ #$10 if(z==on) goto $0CF535
0CF525 BRK $0FEB ($0C0FEB) goto $00FFE6(メッセージ表示) #$0FEB
0CF528 LDA #$0010 A=#$0010
0CF52B TSB $35B0 A or $35B0
0CF52E JSL $CDADD8 SR: $0DADD8
0CF532 JMP $F53E ($0CF53E) goto $0CF53E
0CF535 BRK $0FEC ($0C0FEC) goto $00FFE6(メッセージ表示) #$0FEC
0CF538 JMP $F53E ($0CF53E) goto $0CF53E
0CF53B BRK $0151 ($0C0151) goto $00FFE6(メッセージ表示) #$0151
0CF53E RTL return
  • SR: $0CF56E NPC1_MoveSR_0573(ドン・ガアデの移動処理)(新SR)
0CF56E LDA $354A A=$354A
0CF571 AND #$0020 A&=#$0020 目覚めの粉を使っているか
0CF574 BEQ #$14 if(z==on) goto $0CF58A
0CF576 LDA $35B0 A=$35B0
0CF579 AND #$0010 A&=#$0010 ドン・ガアデがロマリアに向かっているか
0CF57C BNE #$06 if(z==off) goto $0CF584
0CF57E JSL $CCF5D0 SR: $0CF5D0 ドン・ガアデがルーラでロマリアに向かう処理
0CF582 BRA #$04 goto $0CF588
0CF584 JSL $CCDADF SR: $0CDADF
0CF588 BRA #$04 goto $0CF58E
0CF58A JSL $CCD17B SR: $0CD17B
0CF58E RTL return
  • SR: $0CF5D0 ドン・ガアデがルーラでロマリアに向かう処理(新SR)
0CF5D0 COP goto $00FFE4
0CF5D1 JSL $CDAEB1 SR: $0DAEB1 カウンタが1000になるまで待機
0CF5D5 JSL $CC73CF SR: $0C73CF 足踏みをする処理
0CF5D9 JSL $CDADE6 SR: $0DADE6 カウンタに2000をセット
0CF5DD JSL $CDAEE1 SR: $0DAEE1 カウンタが3000になるまで待機
0CF5E1 JSL $C1E32E SR: $01E32E 引数:1#$0054 ルーラのBGM再生
0CF5E7 LDX #$0000 X=#$0000
0CF5EA LDA $DAA5,X A=$DAA5+X
0CF5ED BMI #$0A if(n==on) goto $0CF5F9
0CF5EF STA $2F00,X $2F00+X=A
0CF5F2 INX X++
0CF5F3 INX X++
0CF5F4 CPX #$0008 X>=#$0008?
0CF5F7 BCC #$F1 if(c==off) goto $0CF5EA
0CF5F9 LDA #$0008 A=#$0008
0CF5FC STA $DAA5 $DAA5=A
0CF5FF LDA #$FFFF A=#$FFFF
0CF602 STA $DAA7 $DAA7=A
0CF605 LDA #$FFFF A=#$FFFF
0CF608 STA $DAA9 $DAA9=A
0CF60B LDA #$FFFF A=#$FFFF
0CF60E STA $DAAB $DAAB=A
0CF611 JSL $C1E7D5 SR: $01E7D5 ルーラでキャラクターが飛び上がる処理
0CF615 JSL $C75930 SR: $075930
0CF619 LDX #$0000 X=#$0000
0CF61C LDA $2F00,X A=$2F00+X
0CF61F BMI #$0D if(n==on) goto $0CF62E
0CF621 STA $DAA5,X $DAA5+X=A
0CF624 STZ $2F00,X $2F00+X=#$00
0CF627 INX X++
0CF628 INX X++
0CF629 CPX #$0008 X>=#$0008?
0CF62C BCC #$EE if(c==off) goto $0CF61C
0CF62E RTL return

ちょっと解説を加えると、$7EDAA5-はルーラ(もしくはキメラの翼)で飛び上がる対象のキャラクターのマップ上でのIDがセットされているようです(他の用途にも使われているかもしれませんが不明)。通常はPCのIDがセットされているのですが、今回は飛び上がる対象が変わるので、飛び上がる演出をする直前にもともとセットされていた値を$7E2F00-に退避しておき、ドン・ガアデのID(#$0008)をセットし、演出後値を元に戻すということをしています。

  • SR: $01E7D5 ルーラでキャラクターが飛び上がる処理(新SR)
01E7D5 JSR $D1AC SR: $01D1AC ルーラでキャラクターが飛び上がる処理
01E7D8 RTL return

なんでこんなSRを作ったかというと、オリジナルから存在するSR: $01D1ACは同一バンク($01xxxx)からしかコールできません。それを忘れて「22 AC D1 C1」などと直接SR: $0CF5D0からコールしていたのでプログラムカウンタがずれてバグるという現象の原因がなかなかわからず悩まされました。DQ3SFCEditorにチェック機能をつけた方がよさそうです。

これでノアニール側のイベントの実装は終わりです。次回はロマリアに再び戻ってドン・ガアデが橋を直してくれたイベントを実装して長かった一連のイベントも終わりです。このイベントはフラグを立てるだけなので大したことはありません。