DQ3 ストーリー変更(アリアハン5)

前回「オルテガのこども」のときにタルやタンスを調べると「周りの目が気になってやめてしまった」というメッセージが出て調べられない実装をしましたが、アリアハン城2Fに限り、ちょっと違う実装をする必要があります。なぜかというとアリアハン城2Fは「ゆうきのあかし」を持ち帰って王様に話すと「オルテガのこども」から勇者に転生するイベントがあるため、イベントの前後でタンスを調べたときのリアクションを切り替える必要があります。現在のマップ上のイベントの種類をメモリ中に保持している場所を見つけたので試しに手動で置き換えてみたところ、イベントの差し替えはできたのですが、タンスを開けたとたん、下の床が丸見えになってしまいました。要はタンスを開けた後のグラフィックがメモリ中に読み込まれていないことが原因のようです。いろいろ調べてみましたが、どうやって読み込んでいるのかとか、どのグラフィックを読んでいるのかということがわからなかったので、結局以下の手法で逃げることにしました。かなり邪道な方法です。

  1. イベントフラグに関わらず、オリジナルどおりのマップの初期化をする。
  2. 主人公が旅立ちの許可をもらってない=勇者になっていない場合は特定のメモリ領域を調べるイベントで上書きする
  3. 「ゆうきのあかし」を持った状態でアリアハン王に話し掛けたときの処理中に主人公は勇者に転身するが、その処理の最後に2で上書きした調べるイベントをオリジナルのイベントに差し替える

現在表示するマップ中で必要なグラフィックはおそらくマップの初期化処理中でどこかのメモリ中に展開されるようなので、実際に使う使わないに関わらずとにかくメモリ中に読ませてしまい、イベントフラグの部分だけ上書き、必要に応じて再度上書き、というのが方針です。というわけで実装は以下のようになります。

  • SR: $0A9AE7 アリアハン城内2F移動・宝箱・ドア・NPC情報設定
0A9AFC-B05 NOP
0A9B06 JSL $CAF572 SR: $0AF572
  • SR: $0AF572 アリアハン城内2Fアイテム拾得等切替処理
0AF572 LDX #$0090 X=#$0090
0AF575 JSL $C66696 SR: $066696
0AF579 LDX #$0060 X=#$0060
0AF57C JSL $C666C8 SR: $0666C8
0AF580 LDA $354E A=$354E
0AF583 AND #$0001 A&=#$0001
0AF586 BNE #$04 if(z==off) goto $0AF58C
0AF588 JSL $CAF60A SR: $0AF60A
0AF58C RTL return
  • SR: $0AF60A アリアハン城内2F勇者転身前アイテム拾得等切替処理
0AF60A LDA #$0012 A=#$0012
0AF60D STA $A17D $A17D=A
0AF610 STA $A17F $A17F=A
0AF613 LDA #$0004 A=#$0004
0AF616 STA $A3BD $A3BD=A
0AF619 LDA #$0004 A=#$0004
0AF61C STA $A3BF $A3BF=A
0AF61F LDA #$0092 A=#$0092
0AF622 STA $A41D $A41D=A
0AF625 LDA #$0093 A=#$0093
0AF628 STA $A41F $A41F=A
0AF62B LDA #$0272 A=#$0272
0AF62E STA $A47D $A47D=A
0AF631 STA $A47F $A47F=A
0AF634 LDA #$0037 A=#$0037
0AF637 STA $A4DD $A4DD=A
0AF63A STA $A4DF $A4DF=A
0AF63D RTL return
  • SR: $0AF5D6 アリアハン城内2F勇者転身後アイテム拾得等切替処理
0AF5D6 LDA #$0007 A=#$0007
0AF5D9 STA $A17D $A17D=A
0AF5DC STA $A17F $A17F=A
0AF5DF LDA #$0000 A=#$0000
0AF5E2 STA $A3BD $A3BD=A
0AF5E5 LDA #$0002 A=#$0002
0AF5E8 STA $A3BF $A3BF=A
0AF5EB LDA #$0090 A=#$0090
0AF5EE STA $A41D $A41D=A
0AF5F1 LDA #$0060 A=#$0060
0AF5F4 STA $A41F $A41F=A
0AF5F7 LDA #$01F0 A=#$01F0
0AF5FA STA $A47D $A47D=A
0AF5FD STA $A47F $A47F=A
0AF600 LDA #$0022 A=#$0022
0AF603 STA $A4DD $A4DD=A
0AF606 STA $A4DF $A4DF=A
0AF609 RTL return

SR: $0AF5D6は主人公を勇者に転身させる処理の最後に呼びます。これによってタンスに設定されているイベントの切り替えが可能になりました。