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

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

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

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

  • SR: $0BA1F1 NPC1_TalkSR_04CD(精霊のNPC)
0BA21BJSR $F700SR: $0BF700精霊のほこら追加イベント処理
0BA21E-4DNOP
  • SR: $0BF700 精霊のほこら追加イベント処理(新SR)
0BF700JSL $CDE6CASR: $0DE6CA王者の剣+光の鎧+勇者の盾を入手しているか(該当c=on)
0BF704BCC #$42if(c==off) goto $0BF748
0BF706JSL $CCD37ESR: $0CD37Eメニュー表示モードOFF?
0BF70AJSL $CDAD91SR: $0DAD91
0BF70EJSL $C77085SR: $077085
0BF712JSL $CDAD91SR: $0DAD91
0BF716JSL $CDAD9ESR: $0DAD9E
0BF71ALDA $C199A=$C199
0BF71DSTA $BE81$BE81=A
0BF720LDA $C19BA=$C19B
0BF723STA $BE85$BE85=A
0BF726LDA $35B2A=$35B2
0BF729AND #$0001A&=#$0001精霊のほこらで王者の剣+光の鎧+勇者の盾をそろえないで妖精に話し掛けた
0BF72CBEQ #$05if(z==on) goto $0BF733
0BF72EBRK $102F ($0B102F)goto $00FFE6(メッセージ表示) #$102F
0BF731BRA #$03goto $0BF736
0BF733BRK $08D5 ($0B08D5)goto $00FFE6(メッセージ表示) #$08D5
0BF736JSL $CDA806SR: $0DA806アイテム入手BGM再生
0BF73AJSL $CCA1C3SR: $0CA1C3あまぐものつえ入手
0BF73EJSL $CDACE5SR: $0DACE5
0BF742JSL $CCD383SR: $0CD383メニュー表示モードON?
0BF746BRA #$6Cgoto $0BF7B4
0BF748LDA $35B2A=$35B2
0BF74BAND #$0001A&=#$0001
0BF74EBNE #$21if(z==off) goto $0BF771
0BF750JSL $CDAD91SR: $0DAD91
0BF754JSL $C77085SR: $077085
0BF758JSL $CDAD91SR: $0DAD91
0BF75CJSL $CDAD9ESR: $0DAD9E
0BF760LDA $C199A=$C199
0BF763STA $BE81$BE81=A
0BF766LDA $C19BA=$C19B
0BF769STA $BE85$BE85=A
0BF76CBRK $1030 ($0B1030)goto $00FFE6(メッセージ表示) #$1030
0BF76FBRA #$38goto $0BF7A9
0BF771JSL $CDE70FSR: $0DE70F王者の剣+光の鎧+勇者の盾を入手していないか(該当c=off)
0BF775BCS #$05if(c==on) goto $0BF77C
0BF777BRK $1036 ($0B1036)goto $00FFE6(メッセージ表示) #$1036
0BF77ABRA #$2Dgoto $0BF7A9
0BF77CBRK $1031 ($0B1031)goto $00FFE6(メッセージ表示) #$1031
0BF77FJSL $CDE726SR: $0DE726王者の剣を入手しているか(該当c=on)
0BF783BCC #$06if(c==off) goto $0BF78B
0BF785JSL $C737BESR: $0737BE 引数:1#$1032
0BF78BJSL $CDE6E1SR: $0DE6E1光の鎧を入手しているか(該当c=on)
0BF78FBCC #$06if(c==off) goto $0BF797
0BF791JSL $C737BESR: $0737BE 引数:1#$1033
0BF797JSL $CDE6EDSR: $0DE6ED勇者の盾を入手しているか(該当c=on)
0BF79BBCC #$06if(c==off) goto $0BF7A3
0BF79DJSL $C737BESR: $0737BE 引数:1#$1034
0BF7A3JSL $C737BESR: $0737BE 引数:1#$1035
0BF7A9JSL $CDE736SR: $0DE736王者の剣+光の鎧+勇者の盾を入手ヒント表示処理
0BF7ADBRK $1037 ($0B1037)goto $00FFE6(メッセージ表示) #$1037
0BF7B0JSL $CDACD2SR: $0DACD2キー入力でメッセージウィンドウを閉じる
0BF7B4LDA #$0001A=#$0001
0BF7B7TSB $35B2A or $35B2
0BF7BARTSreturn

  • SR: $0DE6CA 王者の剣+光の鎧+勇者の盾を入手しているか(該当c=on)(新SR)
0DE6CAJSL $CDE726SR: $0DE726王者の剣を入手しているか(該当c=on)
0DE6CEBCC #$0Fif(c==off) goto $0DE6DF
0DE6D0JSL $CDE6E1SR: $0DE6E1光の鎧を入手しているか(該当c=on)
0DE6D4BCC #$09if(c==off) goto $0DE6DF
0DE6D6JSL $CDE6EDSR: $0DE6ED勇者の盾を入手しているか(該当c=on)
0DE6DABCC #$03if(c==off) goto $0DE6DF
0DE6DCSECc=on
0DE6DDBRA #$01goto $0DE6E0
0DE6DFCLCc=off
0DE6E0RTLreturn
  • SR: $0DE70F 王者の剣+光の鎧+勇者の盾を入手していないか(該当c=off)(新SR)

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

  • SR: $0DE726 王者の剣を入手しているか(該当c=on)(新SR)
0DE726LDA #$001EA=#$001E王者の剣のアイテムID
0DE729LDX #$0104X=#$0104袋の中も検索対象内
0DE72CJSL $C78238SR: $078238
0DE730BCC #$02if(c==off) goto $0DE734
0DE732SECc=on
0DE733RTLreturn
0DE734CLCc=off
0DE735RTLreturn
  • SR: $0DE6E1 光の鎧を入手しているか(該当c=on)(新SR)
0DE6E1LDA $3544A=$3544
0DE6E4AND #$0010A&=#$0010
0DE6E7BEQ #$02if(z==on) goto $0DE6EB
0DE6E9SECc=on
0DE6EARTLreturn
0DE6EBCLCc=off
0DE6ECRTLreturn
  • SR: $0DE6ED 勇者の盾を入手しているか(該当c=on)(新SR)

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

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

変更前:00 xx xx

変更後:20 yy yy

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

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

(11/3追記)

  • SR: $0DE736 王者の剣+光の鎧+勇者の盾入手ヒント表示
0DE736JSL $CDE726SR: $0DE726王者の剣を入手しているか
0DE73ABCS #$03if(c==on) goto $0DE73F
0DE73CBRK $1039 ($0D1039)goto $00FFE6(メッセージ表示) #$1039
0DE73FJSL $CDE6EDSR: $0DE6ED勇者の盾を入手しているか
0DE743BCS #$03if(c==on) goto $0DE748
0DE745BRK $1038 ($0D1038)goto $00FFE6(メッセージ表示) #$1038
0DE748JSL $CDE6E1SR: $0DE6E1光の鎧を入手しているか
0DE74CBCS #$14if(c==on) goto $0DE762
0DE74EJSL $CCF2E1SR: $0CF2E1メルキド襲撃イベントが終わっているか
0DE752BCS #$05if(c==on) goto $0DE759
0DE754BRK $103A ($0D103A)goto $00FFE6(メッセージ表示) #$103A
0DE757BRA #$09goto $0DE762
0DE759BRK $103B ($0D103B)goto $00FFE6(メッセージ表示) #$103B
0DE75CLDA #$0004A=#$0004精霊のほこらの精霊から光の鎧の所在のヒントを得た
0DE75FTSB $35B2A or $35B2
0DE762RTLreturn

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

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

コメント

タイトルとURLをコピーしました