DQ3 ストーリー変更(雨雲の杖)

オリジナルではおそらく1回話して終わりの精霊のほこらの精霊?ですが、王者の剣、光の鎧、勇者の盾を回収必須にするために雨雲の杖の入手条件を「王者の剣+光の鎧+勇者の盾を持っていること」に変更することで、大幅に変更したアレフガルド以降のストーリーの帳尻をあわせますwww。

(11/3追記)
エントリを2つに分けようと思ったら残りがほんのちょっとしかなかったのでこのエントリに追記しました。

この精霊には各アイテムの入手ヒントをPCに教える重要な役どころを与えます。しかもフラグになっているので話し掛けないと話が先に進みません。さらに船もないのでいちいちメルキドかドムドーラから歩いていかないといけないといううざさぶり。ちょっとやりすぎかも。さて、実装に移ります。

  • SR: $0BA1F1 NPC1_TalkSR_04CD(精霊のNPC)
0BA21B JSR $F700 SR: $0BF700 精霊のほこら追加イベント処理
0BA21E-4D NOP
  • SR: $0BF700 精霊のほこら追加イベント処理(新SR)
0BF700 JSL $CDE6CA SR: $0DE6CA 王者の剣+光の鎧+勇者の盾を入手しているか(該当c=on)
0BF704 BCC #$42 if(c==off) goto $0BF748
0BF706 JSL $CCD37E SR: $0CD37E メニュー表示モードOFF?
0BF70A JSL $CDAD91 SR: $0DAD91
0BF70E JSL $C77085 SR: $077085
0BF712 JSL $CDAD91 SR: $0DAD91
0BF716 JSL $CDAD9E SR: $0DAD9E
0BF71A LDA $C199 A=$C199
0BF71D STA $BE81 $BE81=A
0BF720 LDA $C19B A=$C19B
0BF723 STA $BE85 $BE85=A
0BF726 LDA $35B2 A=$35B2
0BF729 AND #$0001 A&=#$0001 精霊のほこらで王者の剣+光の鎧+勇者の盾をそろえないで妖精に話し掛けた
0BF72C BEQ #$05 if(z==on) goto $0BF733
0BF72E BRK $102F ($0B102F) goto $00FFE6(メッセージ表示) #$102F
0BF731 BRA #$03 goto $0BF736
0BF733 BRK $08D5 ($0B08D5) goto $00FFE6(メッセージ表示) #$08D5
0BF736 JSL $CDA806 SR: $0DA806 アイテム入手BGM再生
0BF73A JSL $CCA1C3 SR: $0CA1C3 あまぐものつえ入手
0BF73E JSL $CDACE5 SR: $0DACE5
0BF742 JSL $CCD383 SR: $0CD383 メニュー表示モードON?
0BF746 BRA #$6C goto $0BF7B4
0BF748 LDA $35B2 A=$35B2
0BF74B AND #$0001 A&=#$0001
0BF74E BNE #$21 if(z==off) goto $0BF771
0BF750 JSL $CDAD91 SR: $0DAD91
0BF754 JSL $C77085 SR: $077085
0BF758 JSL $CDAD91 SR: $0DAD91
0BF75C JSL $CDAD9E SR: $0DAD9E
0BF760 LDA $C199 A=$C199
0BF763 STA $BE81 $BE81=A
0BF766 LDA $C19B A=$C19B
0BF769 STA $BE85 $BE85=A
0BF76C BRK $1030 ($0B1030) goto $00FFE6(メッセージ表示) #$1030
0BF76F BRA #$38 goto $0BF7A9
0BF771 JSL $CDE70F SR: $0DE70F 王者の剣+光の鎧+勇者の盾を入手していないか(該当c=off)
0BF775 BCS #$05 if(c==on) goto $0BF77C
0BF777 BRK $1036 ($0B1036) goto $00FFE6(メッセージ表示) #$1036
0BF77A BRA #$2D goto $0BF7A9
0BF77C BRK $1031 ($0B1031) goto $00FFE6(メッセージ表示) #$1031
0BF77F JSL $CDE726 SR: $0DE726 王者の剣を入手しているか(該当c=on)
0BF783 BCC #$06 if(c==off) goto $0BF78B
0BF785 JSL $C737BE SR: $0737BE 引数:1#$1032
0BF78B JSL $CDE6E1 SR: $0DE6E1 光の鎧を入手しているか(該当c=on)
0BF78F BCC #$06 if(c==off) goto $0BF797
0BF791 JSL $C737BE SR: $0737BE 引数:1#$1033
0BF797 JSL $CDE6ED SR: $0DE6ED 勇者の盾を入手しているか(該当c=on)
0BF79B BCC #$06 if(c==off) goto $0BF7A3
0BF79D JSL $C737BE SR: $0737BE 引数:1#$1034
0BF7A3 JSL $C737BE SR: $0737BE 引数:1#$1035
0BF7A9 JSL $CDE736 SR: $0DE736 王者の剣+光の鎧+勇者の盾を入手ヒント表示処理
0BF7AD BRK $1037 ($0B1037) goto $00FFE6(メッセージ表示) #$1037
0BF7B0 JSL $CDACD2 SR: $0DACD2 キー入力でメッセージウィンドウを閉じる
0BF7B4 LDA #$0001 A=#$0001
0BF7B7 TSB $35B2 A or $35B2
0BF7BA RTS return
  • SR: $0DE6CA 王者の剣+光の鎧+勇者の盾を入手しているか(該当c=on)(新SR)
0DE6CA JSL $CDE726 SR: $0DE726 王者の剣を入手しているか(該当c=on)
0DE6CE BCC #$0F if(c==off) goto $0DE6DF
0DE6D0 JSL $CDE6E1 SR: $0DE6E1 光の鎧を入手しているか(該当c=on)
0DE6D4 BCC #$09 if(c==off) goto $0DE6DF
0DE6D6 JSL $CDE6ED SR: $0DE6ED 勇者の盾を入手しているか(該当c=on)
0DE6DA BCC #$03 if(c==off) goto $0DE6DF
0DE6DC SEC c=on
0DE6DD BRA #$01 goto $0DE6E0
0DE6DF CLC c=off
0DE6E0 RTL return
  • SR: $0DE70F 王者の剣+光の鎧+勇者の盾を入手していないか(該当c=off)(新SR)

上記SRと逆なだけなので省略

  • SR: $0DE726 王者の剣を入手しているか(該当c=on)(新SR)
0DE726 LDA #$001E A=#$001E 王者の剣のアイテムID
0DE729 LDX #$0104 X=#$0104 袋の中も検索対象内
0DE72C JSL $C78238 SR: $078238
0DE730 BCC #$02 if(c==off) goto $0DE734
0DE732 SEC c=on
0DE733 RTL return
0DE734 CLC c=off
0DE735 RTL return
  • SR: $0DE6E1 光の鎧を入手しているか(該当c=on)(新SR)
0DE6E1 LDA $3544 A=$3544
0DE6E4 AND #$0010 A&=#$0010
0DE6E7 BEQ #$02 if(z==on) goto $0DE6EB
0DE6E9 SEC c=on
0DE6EA RTL return
0DE6EB CLC c=off
0DE6EC RTL return
  • SR: $0DE6ED 勇者の盾を入手しているか(該当c=on)(新SR)

SR: $0DE726 王者の剣を入手しているかとアイテムIDが違うだけなので省略

精霊の役割が大幅に増えたのでその分処理も多くなります。単なるメッセージ表示(台詞表示)の部分に追加処理をねじ込む場合は$20によるSRコールを使用して同バンク内の空き部分で処理するようにすれば

変更前:00 xx xx

変更後:20 yy yy

となり、サイズも変わらず、前後のJMP命令を変更する必要もないので安全に作業できます。

さて、肝心の処理ですが、オリジナルでは精霊の台詞は「オープニングの性格決定についての話→雨雲の杖渡す」という処理になっていたのですが、今回の変更では何度か話す必要があるので、「一度話し掛けたフラグ」を新規に用意してそのフラグを見て台詞を替えています。また、現状回収済みのアイテムをしらべて「あなたは… …をすでに取り戻しています」という台詞を表示させるようにします。そして最後に未回収のアイテムに関してはありかのヒントを表示させるようにします。長くなってしまったので今回の実装の肝の1つであるヒント表示の部分は次回のエントリで説明します。残りの分量は少なかったので追記してしまいます。

(11/3追記)

  • SR: $0DE736 王者の剣+光の鎧+勇者の盾入手ヒント表示
0DE736 JSL $CDE726 SR: $0DE726 王者の剣を入手しているか
0DE73A BCS #$03 if(c==on) goto $0DE73F
0DE73C BRK $1039 ($0D1039) goto $00FFE6(メッセージ表示) #$1039
0DE73F JSL $CDE6ED SR: $0DE6ED 勇者の盾を入手しているか
0DE743 BCS #$03 if(c==on) goto $0DE748
0DE745 BRK $1038 ($0D1038) goto $00FFE6(メッセージ表示) #$1038
0DE748 JSL $CDE6E1 SR: $0DE6E1 光の鎧を入手しているか
0DE74C BCS #$14 if(c==on) goto $0DE762
0DE74E JSL $CCF2E1 SR: $0CF2E1 メルキド襲撃イベントが終わっているか
0DE752 BCS #$05 if(c==on) goto $0DE759
0DE754 BRK $103A ($0D103A) goto $00FFE6(メッセージ表示) #$103A
0DE757 BRA #$09 goto $0DE762
0DE759 BRK $103B ($0D103B) goto $00FFE6(メッセージ表示) #$103B
0DE75C LDA #$0004 A=#$0004 精霊のほこらの精霊から光の鎧の所在のヒントを得た
0DE75F TSB $35B2 A or $35B2
0DE762 RTL return

光の鎧の入手のための手順変更は別途光の鎧入手編で説明します。

ここに来て重要なことに気が付いたのですが、勇者の「覚える」は直前に会話した内容のうち、最後のメッセージIDのものしか覚えてくれないようです。今回で言えば、「ヒント表示」SRのなかで表示されるメッセージではなく、$0BF791のメッセージID$1037(全てを 取り戻したとき[AD]あなたに あまぐものつえを[AD]わたしましょう。)というどうでもいいメッセージしか「おぼえる」の対象になりません。「実装はプロレベルを目指す」を密かな目標としていたのですが、ここにきてボロがでてしまいました。まあこの点については見逃してくださいwww。