DQ3 ストーリー変更(光の鎧入手7)

ガライが仲間になることで、「ガライが仲間にいる場合」を考慮しないといけない場所が出てきます。

具体的には、

  • すごろく開始・終了時の整列(1-4のみ、5はストーリー進行上ありえないので除外)
  • すごろく中
  • すごろく場4ごほうびフロア中
  • ロマリア王即位中
  • ちきゅうのへそ挑戦中
  • アッサラームぱふぱふ中

です(下4つはテストプレイしてくれた方が見つけてくれたものでしたorz)。これらのケースについて「PCが1-4人のとき」それぞれについてテストし、バグがあれば修正しないといけません(超面倒くせー)。また、ガライがいない場合にも問題がないかテストする必要があるので、テストの範囲は結構多くなります。

  • SR: $06F5DA PC描画タイプ初期化?(新SR)
06F5E7 PHX Push X
06F5E8 TAX X=A
06F5E9 JSL $CDF9D0 SR: $0DF9D0 アッサラーム2F-2ぱふぱふ中か(該当c=on)
06F5ED BCS #$2A if(c==on) goto $06F619
06F5EF JSL $CDF968 SR: $0DF968 すごろく場4のご褒美フロアか(該当c=on)
06F5F3 BCS #$24 if(c==on) goto $06F619
06F5F5 JSL $CDF95C SR: $0DF95C ロマリア王に即位中か(該当c=on)
06F5F9 BCS #$1E if(c==on) goto $06F619
06F5FB JSL $CDF948 SR: $0DF948 ランシールひとりチャレンジ中でランシール以外のマップか(該当c=on)
06F5FF BCS #$18 if(c==on) goto $06F619
06F601 JSL $C3FF09 SR: $03FF09 すごろく中か(該当c=on)
06F605 BCS #$12 if(c==on) goto $06F619
06F607 JSL $CCFF1C SR: $0CFF1C ガライが仲間になっているか(該当c=on)
06F60B BCS #$06 if(c==on) goto $06F613
06F60D JSL $CDF97C SR: $0DF97C 5人目を透明にするべき条件か(該当c=on)
06F611 BCC #$06 if(c==off) goto $06F619
06F613 LDA #$0002 A=#$0002 5人目を追加するモード
06F616 PLX Pull X
06F617 SEC c=on
06F618 RTS return
06F619 TXA A=X
06F61A PLX Pull X
06F61B CLC c=off
06F61C RTS return

これでガライが仲間になっていても上記のケースで後ろにガライがついてくることがなくなります。他にはすごろく開始時などにもともと存在しなかった5人目の動きを実装する必要があります。

  • SR: $0CD02F すごろく場1NPC情報設定
0CD04B-D NOP
0CD04E JSL $CCFF55 SR: $0CFF55 すごろく場1NPC設定(サブ)
  • SR: $0CFF55 すごろく場1NPC設定(サブ)(新SR)
0CFF55 LDA #$0549 A=#$0549
0CFF58 JSL $C75828 SR: $075828 NPC1設定
0CFF5C JSL $CCFFCA SR: $0CFFCA パーティ人数が5人か(5人c=on)
0CFF60 BCC #$07 if(c==off) goto $0CFF69
0CFF62 LDA #$059E A=#$059E
0CFF65 JSL $C75828 SR: $075828 NPC1設定
0CFF69 RTL return
  • SR: $0CFFCA パーティ人数が5人か(5人c=on)
0CFFCA JSL $C4297C SR: $04297C 引数:1#$01 引数:2#$FF パーティ人数を取得
0CFFD0 CMP #$0004 A==#$0004?
0CFFD3 BNE #$09 if(z==off) goto $0CFFDE
0CFFD5 JSL $CCFF1C SR: $0CFF1C ガライが仲間になっているか(該当c=on)
0CFFD9 BCC #$03 if(c==off) goto $0CFFDE
0CFFDB SEC c=on
0CFFDC BRA #$01 goto $0CFFDF
0CFFDE CLC c=off
0CFFDF RTL return
  • SR: $0D9BCA すごろく場1イベント処理
0D9C8D JSL $CDF13B SR: $0DF13B パーティ人数が5人目も含めて1人か調べる(1人c=on)
  • SR: $0DF13B パーティ人数が5人目も含めて1人か調べる(1人c=on)
0DF13B JSL $CC7B5A SR: $0C7B5A パーティ人数が1人か調べる(1人c=on)
0DF13F BCC #$09 if(c==off) goto $0DF14A
0DF141 JSL $CCFF1C SR: $0CFF1C ガライが仲間になっているか(該当c=on)
0DF145 BCS #$03 if(c==on) goto $0DF14A
0DF147 SEC c=on
0DF148 BRA #$01 goto $0DF14B
0DF14A CLC c=off
0DF14B RTL return
  • SR: $0DF06A NPC1_MoveSR_059E(5人目のNPC)(新SR)
0DF06A LDA $362A A=$362A
0DF06D AND #$0002 A&=#$0002 すごろく終了時フラグON?
0DF070 BNE #$02 if(z==off) goto $0DF074
0DF072 BRA #$06 goto $0DF07A
0DF074 JSL $CDF07F SR: $0DF07F すごろく場1PC5人目座標設定処理
0DF078 BRA #$04 goto $0DF07E
0DF07A JSL $CDF0A3 SR: $0DF0A3 すごろく場1PC5人目移動処理
0DF07E RTL return
  • SR: $0DF07F すごろく場1PC5人目座標設定処理
0DF07F LDA $353F A=$353F
0DF082 AND #$0008 A&=#$0008 ?
0DF085 BNE #$02 if(z==off) goto $0DF089
0DF087 BRA #$19 goto $0DF0A2
0DF089 LDA $344E A=$344E
0DF08C JSL $C74CD0 SR: $074CD0 キャラクター表示?
0DF090 LDA #$0021 A=#$0021
0DF093 LDX #$007F X=#$007F
0DF096 JSL $C75305 SR: $075305 キャラクター出現座標を指定
0DF09A LDA #$0000 A=#$0000
0DF09D JSL $C7518C SR: $07518C
0DF0A1 COP goto $00FFE4
0DF0A2 RTL return
  • SR: $0DF0A3 すごろく場1PC5人目移動処理
0DF0A3 JSL $CCD7EA SR: $0CD7EA
0DF0A7 COP goto $00FFE4
0DF0A8 JSL $CDAEB1 SR: $0DAEB1 カウンタが1000になるまで待機
0DF0AC JSL $CDF13B SR: $0DF13B パーティ人数が5人目も含めて1人か調べる(1人c=on)
0DF0B0 BCS #$02 if(c==on) goto $0DF0B4
0DF0B2 BRA #$02 goto $0DF0B6
0DF0B4 BRA #$18 goto $0DF0CE
0DF0B6 JSL $CDF0FB SR: $0DF0FB PC5人目を移動対象にする?
0DF0BA LDA $353F A=$353F
0DF0BD AND #$0008 A&=#$0008
0DF0C0 BNE #$02 if(z==off) goto $0DF0C4
0DF0C2 BRA #$0A goto $0DF0CE
0DF0C4 JSL $C74D4E SR: $074D4E
0DF0C8 LDA $C18D A=$C18D
0DF0CB STA $344E $344E=A
0DF0CE JSL $CDADBB SR: $0DADBB カウンタを100カウントアップ
0DF0D2 JSL $CDAED1 SR: $0DAED1 カウンタが2000になるまで待機
0DF0D6 LDA $353F A=$353F
0DF0D9 AND #$0008 A&=#$0008
0DF0DC BNE #$02 if(z==off) goto $0DF0E0
0DF0DE BRA #$16 goto $0DF0F6
0DF0E0 JSL $CCD392 SR: $0CD392 キャラクターイベント中移動フラグON?
0DF0E4 LDX #$0021 X=#$0021
0DF0E7 LDA #$007F A=#$007F
0DF0EA JSL $C75474 SR: $075474 キャラクター移動先座標指定
0DF0EE JSL $CCD59D SR: $0CD59D 指定座標にY軸→X軸の順でキャラクター移動
0DF0F2 JSL $CCD857 SR: $0CD857 キャラクターを上に向かせる
0DF0F6 JSL $CDADBB SR: $0DADBB カウンタを100カウントアップ
0DF0FA RTL return
  • SR: $0DF0FB PC5人目を移動対象にする?
0DF0FB LDA #$0008 A=#$0008
0DF0FE TRB $353F A ^ $353F
0DF101 LDA #$0024 A=#$0024
0DF104 JSL $C74B8C SR: $074B8C 行動対象キャラクター指定?
0DF108 JSL $CCD70B SR: $0CD70B
0DF10C JSL $C74C86 SR: $074C86
0DF110 BCS #$03 if(c==on) goto $0DF115
0DF112 NOP
0DF113 BRA #$21 goto $0DF136
0DF115 LDA #$0008 A=#$0008
0DF118 TSB $353F A or $353F
0DF11B JSL $CCD784 SR: $0CD784
0DF11F JSL $C74BC2 SR: $074BC2
0DF123 LDA #$0024 A=#$0024
0DF126 JSL $C74CF7 SR: $074CF7
0DF12A JSL $CCD644 SR: $0CD644
0DF12E JSL $C75662 SR: $075662
0DF132 JSL $CCD767 SR: $0CD767
0DF136 JSL $C74BC2 SR: $074BC2
0DF13A RTL return

たかが5人目をすごろく開始時と終了時に期待した座標に配置するだけなんですが結構長いです。とはいえ2人目~4人目の実装をパクるだけで十分なんですが。「みようみまねでやっている」だけなので完全には理解してはいません。ちなみに、すごろく場1と2,3,4のすごろく開始時のPCのMove処理は若干異なっているため、またちょっと違った実装をする必要があるのですが、あまり本筋ではないので説明は省略します。同様にかなり考慮をしないといけないのがランシール、アッサラームです。アッサラームに至っては未だに完全に修正はできていない始末。まあいやならやらなきゃいいんですがw、この「5人目を追加する」ギミックはやりたいこと以外に考慮しないといけない部分が多くて骨が折れました。さて、次回はイベントの残りの部分を実装します。