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

PC側の成長ステータスをいじっていたんですが、それにあわせて装備品の見直しをしていたら、光のドレス、ドラゴンローブのあまりのチートさをようやく認識するにいたりました。これはひどすぎる、ということで光のドレスは守備力を大幅に下げることにしたんですが、それでも割と簡単に無限に手に入るのはけしからんということで、すごろくのシステムをちょっと変えることにしました。普通は入手数制限で対応するんですが、それ一辺倒というのもアレなので、すごろく中は「コイン」制を導入することにします。毎回スタート時にはコイン1枚から開始なので積極的に戦闘することも考えないと目標額まで到達できませんし、コインマイナスのマスに止まるとその時点でアウトになります。コインを増やすギミックを追加で用意したり、モンスターの編成を変えたりしないと単なる無理ゲーになってしまうのでバランス調整が難しいところ。あとはバランス調整とデバッグだけだと思ってたのにねえ。

さて、最近停滞気味だったストーリー関連の実装の説明を進めます。メルキド襲撃の追加イベント終了後、精霊のほこらでヒントを貰ったあとの実装です。切りどころがいまいちわからなくてベタ書きしているので、意味不明な可能性高し。

  • SR: $0A1859 NPC1_TalkSR_0228(エルフの女王の会話処理)
0A1865 JSL $CCF4B7 SR: $0CF4B7
0A1869 BCC #$16 if(c==off) goto $0A1881
0A186B-7D NOP
  • SR: $0CF4B7 エルフの女王会話処理(サブ)(新SR)
0CF4B7 LDA $35B2 A=$35B2
0CF4BA AND #$0004 A&=#$0004
0CF4BD BEQ #$0B if(z==on) goto $0CF4CA
0CF4BF BRK $103C ($0C103C) goto $00FFE6(メッセージ表示) #$103C 光の鎧のヒント表示
0CF4C2 LDA #$0001 A=#$0001
0CF4C5 TSB $35B4 A or $35B4 光の鎧の隠し場所のヒントを聞いたフラグon
0CF4C8 BRA #$17 goto $0CF4E1
0CF4CA LDA $354A A=$354A
0CF4CD AND #$0010 A&=#$0010
0CF4D0 BNE #$02 if(z==off) goto $0CF4D4
0CF4D2 BRA #$0F goto $0CF4E3
0CF4D4 LDA $353E A=$353E
0CF4D7 AND #$0004 A&=#$0004
0CF4DA BNE #$02 if(z==off) goto $0CF4DE
0CF4DC BRA #$05 goto $0CF4E3
0CF4DE BRK $03E8 ($0C03E8) goto $00FFE6(メッセージ表示) #$03E8
0CF4E1 SEC c=on
0CF4E2 RTL return
0CF4E3 CLC c=off
0CF4E4 RTL return

ただ単にお使いフラグを立てるだけです。この1クッションなしでいきなりバラモス城にGOでもいいのですが、あまりに下の精霊が万能になってしまうのでこうしました。次はバラモス城の変更です。バラモス城には都合2回来ることになります。1回目はエルフの女王にヒントを貰ってバラモスの間に来て、さらに骸骨からヒントをもらい、2回目はガライを連れてもう一度バラモスの間に来る、という修正です。まずは1回目の追加イベントの実装を行いますが、順番としては、

  1. バラモス城1F-2(骸骨が玉座にいるフロア)のドアの近くに行くと「視線を感じる」メッセージが表示される
  2. バラモスの間の特定座標に達すると後ろに骸骨が現れて逃げる
  3. バラモスの間を出てバラモス城外観に移動し、左方向に向かい特定座標に達すると骸骨が左に逃げて消える
  4. 再度バラモス城1F-2に戻り、骸骨と話して光の鎧のヒントをもらう

となります。問題なのは、「イベント中にルーラで移動された場合どうするか」という問題ですが、これは「同一ダンジョン?中のみ有効なフラグ」を使用することで一連のイベントを1パックにすることができます。「同一ダンジョン?中のみ有効なフラグ」は7E3628-40に存在し、扉の開閉状態等もここを使っています(ドア開閉データの「同一フロア内開閉管理番号」というのは7E3628からのビット単位でのオフセットを意味しています)。このフラグは同一ダンジョン?から移動するときにクリアされるテンポラリのものです。今回のようにルーラ可能な複数フロア間にまたがるイベントを実装する場合にはこの領域を利用するのが一番便利です。

  • SR: $0A59D3 バラモス城1F-2進入時初期化処理
0A59F0 JSL $CCF4E5 SR: $0CF4E5 バラモス城1F-2イベント・NPC等設定
0A59F4-6 NOP
  • SR: $0CF4E5 バラモス城1F-2イベント・NPC等設定(新SR)
0CF4E5 JSL $C77843 SR: $077843 引数:1#$CAA16B 移動・宝箱・ドア・NPC情報設定
0CF4EC JSL $C7785F SR: $07785F 引数:1#$CCFE2D イベント設定
0CF4F3 RTL return
  • SR: $0CFE2D バラモス城1F-2追加イベント処理(新SR)
0CFE2D JSL $CCFE50 SR: $0CFE50 バラモス上の骸骨から光の鎧の情報を聞いた(該当c=on)
0CFE31 BCS #$18 if(c==on) goto $0CFE4B
0CFE33 JSL $CCFEED SR: $0CFEED バラモス城1F-2追加イベント処理(骸骨と会話)発生条件か(該当c=on)
0CFE37 BCC #$06 if(c==off) goto $0CFE3F
0CFE39 JSL $CCFA23 SR: $0CFA23 バラモス城1F-2追加イベント処理(骸骨と会話)実処理
0CFE3D BRA #$10 goto $0CFE4F
0CFE3F JSL $CCFA10 SR: $0CFA10 バラモス城1F-2追加イベント処理(視線を感じた)発生条件か(該当c=on)
0CFE43 BCC #$06 if(c==off) goto $0CFE4B
0CFE45 JSL $CCF8F2 SR: $0CF8F2 バラモス城1F-2追加イベント処理(視線を感じた)実処理
0CFE49 BRA #$04 goto $0CFE4F
0CFE4B JSL $CCD211 SR: $0CD211 フラグ消化後のイベント終了時処理?
0CFE4F RTL return
  • SR: $0CFE50 バラモス上の骸骨から光の鎧の情報を聞いた(該当c=on)(新SR)
  • SR: $0CFEED バラモス城1F-2追加イベント処理(骸骨と会話)発生条件か(該当c=on)(新SR)
  • SR: $0CFA10 バラモス城1F-2追加イベント処理(視線を感じた)発生条件か(該当c=on)(新SR)

フラグのチェックのみなので省略

  • SR: $0CF8F2 バラモス城1F-2追加イベント処理(視線を感じた)実処理(新SR)
0CF8F2 COP goto $00FFE4
0CF8F3 JSL $CCD276 SR: $0CD276
0CF8F7 LDA #$08F0 A=#$08F0
0CF8FA LDX #$0900 X=#$0900
0CF8FD LDY #$0938 Y=#$0938
0CF900 JSL $C75365 SR: $075365 PCが指定座標(X座標は範囲指定)に到達しているか(しているc=on)
0CF904 BCS #$02 if(c==on) goto $0CF908
0CF906 BRA #$EB goto $0CF8F3
0CF908 JSL $C737BE SR: $0737BE 引数:1#$104A メッセージ表示
0CF90E LDA #$0001 A=#$0001
0CF911 TSB $3638 A or $3638 フラグON
0CF914 JSL $CDACD2 SR: $0DACD2 キー入力でメッセージウィンドウを閉じる
0CF918 JSL $CDD65C SR: $0DD65C PC表示?
0CF91C JSL $CCD298 SR: $0CD298 イベント終了時処理?
0CF920 RTL return
  • SR: $0AA1E2 バラモスの間移動・宝箱・ドア・NPC情報設定
0AA209 JSL $CDE763 SR: $0DE763 バラモスの間NPC設定+追加イベント用設定
  • SR: $0DE763 バラモスの間NPC設定+追加イベント用設定(新SR)
0DE763 JSL $CCC8A2 SR: $0CC8A2 バラモスの間NPC設定
0DE767 JSL $CDF23F SR: $0DF23F バラモスの間追加イベント用設定
0DE76B RTL return
  • SR: $0DF23F バラモスの間追加イベント用設定(新SR)
0DF24D LDX #$0097 X=#$0097
0DF250 JSL $C666FA SR: $0666FA しらべるイベント設定
  • SR: $0CC8A2 バラモスの間NPC設定
0CC8A2 JSR $F22E SR: $0CF22E バラモスの間NPC設定(サブ)
  • SR: $0CF22E バラモスの間NPC設定(サブ)(新SR)
0CF251 LDA #$0599 A=#$0599 骸骨のNPC
0CF254 JSL $C75828 SR: $075828 NPC1設定
0CF258 RTS return
  • SR: $0CEBBC バラモスの間イベント処理
0CEBC7 JSL $CCFDFA SR: $0CFDFA バラモスの間追加イベント処理
  • SR: $0CFFDA バラモスの間追加イベント処理(新SR)
0CFDFA JSL $CDE55C SR: $0DE55C バラモス城追加ボスを倒したか(該当c=on)
0CFDFE BCC #$06 if(c==off) goto $0CFE06
0CFE00 JSL $CCD211 SR: $0CD211 フラグ消化後のイベント終了時処理
0CFE04 BRA #$16 goto $0CFE1C
0CFE06 JSL $CCFF1C SR: $0CFF1C ガライが仲間になっているか(該当c=on)
0CFE0A BCC #$06 if(c==off) goto $0CFE12
0CFE0C JSL $CDF32A SR: $0DF32A
0CFE10 BRA #$0A goto $0CFE1C
0CFE12 JSL $CCFE5D SR: $0CFE5D バラモスの間追加イベント1が発生する条件か(該当c=on)
0CFE16 BCC #$E8 if(c==off) goto $0CFE00
0CFE18 JSL $CDEEF8 SR: $0DEEF8 バラモスの間追加イベント1処理
0CFE1C RTL return
  • SR: $0DE55C バラモス城追加ボスを倒したか(該当c=on)(新SR)
  • SR: $0CFF1C ガライが仲間になっているか(該当c=on)(新SR)
  • SR: $0CFE5D バラモスの間追加イベント1が発生する条件か(該当c=on)(新SR)

フラグのチェックのみなので省略

  • SR: $0DEEF8 バラモスの間追加イベント1処理(新SR)
0DEEF8 COP goto $00FFE4
0DEEF9 JSL $CCD276 SR: $0CD276
0DEEFD LDA #$0980 A=#$0980
0DEF00 LDX #$0980 X=#$0980
0DEF03 LDY #$0920 Y=#$0920
0DEF06 JSL $C75365 SR: $075365 PCが指定座標(X座標は範囲指定)に到達しているか(しているc=on)
0DEF0A BCS #$02 if(c==on) goto $0DEF0E
0DEF0C BRA #$EB goto $0DEEF9
0DEF0E JSL $CDADD8 SR: $0DADD8 カウンタに1000をセット
0DEF12 JSL $CDAED1 SR: $0DAED1 カウンタが2000になるまで待機
0DEF16 LDA #$0002 A=#$0002
0DEF19 TSB $3638 A or $3638 フラグON
0DEF1C JSL $CDD65C SR: $0DD65C PC表示?
0DEF20 JSL $CCD298 SR: $0CD298 イベント終了時処理
0DEF24 RTL return
  • SR: $0CFE70 NPC1_MoveSR_0599(骸骨のNPC)(新SR)
0CFE70 COP goto $00FFE4
0CFE71 JSL $CDAEB1 SR: $0DAEB1 カウンタが1000になるまで待機
0CFE75 JSL $CCD392 SR: $0CD392 キャラクターイベント中移動フラグON?
0CFE79 JSL $CCD35E SR: $0CD35E 移動速度4/3倍速セット?
0CFE7D LDA #$002E A=#$002E
0CFE80 LDX #$0039 X=#$0039
0CFE83 JSL $C75305 SR: $075305 キャラクター出現座標指定
0CFE87 JSL $CCD857 SR: $0CD857 キャラクターを上に向かせる
0CFE8B LDX #$002E X=#$002E
0CFE8E LDA #$0030 A=#$0030
0CFE91 JSL $C75474 SR: $075474 キャラクター移動先座標指定
0CFE95 JSL $CCD59D SR: $0CD59D 指定座標にY軸→X軸の順でキャラクター移動
0CFE99 JSL $CC73CF SR: $0C73CF キャラクターが足踏する処理
0CFE9D LDX #$002E X=#$002E
0CFEA0 LDA #$0039 A=#$0039
0CFEA3 JSL $C75474 SR: $075474
0CFEA7 JSL $CCD59D SR: $0CD59D
0CFEAB JSL $C75930 SR: $075930 キャラクター消滅
0CFEAF JSL $CDADE6 SR: $0DADE6 カウンタに2000セット
0CFEB3 RTL return

まだ半分くらいなんですが、長くなったので今回はこの辺で。

コメント

  1. 謎の東洋人 より:

    通りすがりですが簡単なバグ報告です。ここの改造でできた奇跡の剣を使いますと、たとえばスライムを攻撃したときに、スライムに89のダメージ!のつぎに表示されるメッセージが、スライムのキズが回復した!になってしまっています。戦闘メッセージ005E:FCA4EE:[BD][B8]の キズが かいふくした![B1]のうちの動作の対象を表す変数文字コードの[B8]を動作の主体を表す文字コードの[B7]に変更した戦闘メッセージを増設して、それを使うことですぐに直りますが。

    管理者より返信:

    実装ではそれを見越して$02D3C7-E2で行動主体と対象を入れ替えてるんですが…。念のため手元で確認してみましたが、一応ちゃんと動いてました。とはいえ、ご指摘の実装方法のほうがプログラムがすっきりするのでいいですね。取り入れさせてもらいます。