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

まずはイベントフラグ関連の変更をします。オリジナルではアリアハン王に最初に謁見した時点でルイーダ、登録所が使用可能になりますが、ナジミの塔からイベントアイテム(ゆうきのあかし ID=#$E8)を持ち帰るまではこのフラグはONにはしません。なお、個々のメッセージの編集内容は基本カットします。

  • SR: $0B6A0A NPC1_TalkSR_02FA(アリアハン王との会話処理)
0B6A5B BRA #$70 goto $0B6ACD
0B6A5D-60 NOP
0B6ABC LDA #$0040 A=#$0040
0B6ABF TSB $354D A or $354D
0B6AC2 BRK $0557 ($0B0557) goto $00FFE6(メッセージ表示) #$0557
0B6AC5 BRK $0558 ($0B0558) goto $00FFE6(メッセージ表示) #$0558
0B6AC8 BRK $055A ($0B055A) goto $00FFE6(メッセージ表示) #$055A
0B6ACB BRA #$0E goto $0B6ADB
0B6ACD JSR $EF12 SR: $0BEF12
0B6AD0 BCS #$94 if(c==on) goto $0B6A66
0B6AD2 LDA $354D A=$354D
0B6AD5 AND #$0040 A&=#$0040
0B6AD8 BRA #$87 goto $0B6A61
0B6ADA NOP

今回各NPCとの会話処理の中身を初めてまじめに見たのですが、気がついたのは、

  • イベントは後に起きるもの→先に起きるものの順で並んでいる
  • JMP(#$4C)が多用されている

ということです。BRA(#$80)でないので、ジャンプ先のアドレスが絶対アドレスで指定されています。そのため気軽に処理を移動できません。おそらく処理によっては128バイト以上先に飛ばないといけない(BRAでは前後127バイトまでしか飛べない)からだと思われます。さて、あまり思うようにプログラムを移動できないので(やってやれなくはないが、バグの元になるので既存のプログラムの移動は極力避けることにします)、かなり苦しい実装になっています。アリアハン王との会話は「ゾーマ登場以降→旅立ちの許可をもらって以降→初回の謁見」の順番に処理が並んでいます。これを「ゾーマ登場以降→旅立ちの許可をもらって以降→初回の謁見以降→初回の謁見」と1段階はさむように変えます。なお、$7E354Dの7ビット目(#$40)が「アリアハン王に会ったか」のフラグで、$7E354Eの1ビット目(#$01)が「アリアハン王から旅立ちの許可をもらったか」のフラグです。

  • SR: $0BEF12 アリアハン王に旅立ちの許可をもらう処理+条件判定(旅立ちの許可をもらっているc=on)(新SR)
0BEF12 LDA $354E A=$354E
0BEF15 AND #$0001 A&=#$0001
0BEF18 BNE #$7A if(z==off) goto $0BEF94
0BEF1A JSL $CCF104 SR: $0CF104
0BEF1E BCC #$72 if(c==off) goto $0BEF92
0BEF20 BRK $0FD6 ($0B0FD6) goto $00FFE6(メッセージ表示) #$0FD6
0BEF23 JSL $C737BE SR: $0737BE 引数:1#$0FD7
0BEF29 JSL $C1E32E SR: $01E32E 引数:1#$0028
0BEF2F JSL $C028B4 SR: $0028B4
0BEF33 JSL $C1E59C SR: $01E59C 引数:1#$0028
0BEF39 BCC #$F4 if(c==off) goto $0BEF2F
0BEF3B JSL $C1E35B SR: $01E35B
0BEF3F LDX #$3925 X=#$3925
0BEF42 SEP #$20 m=on(A/M:8b)
0BEF44 LDA #$08 A=#$08
0BEF46 STA $0021,X $0021+X=A
0BEF49 REP #$30 m=off(A/M:16b) x=off(X/Y:16b)
0BEF4B LDX #$0000 X=#$0000
0BEF4E JSL $C4FE6B SR: $04FE6B 引数:1#$01 引数:2#$FE
0BEF54 JSL $CCF119 SR: $0CF119
0BEF58 JSL $C737BE SR: $0737BE 引数:1#$0FE0
0BEF5E BRK $0FD8 ($0B0FD8) goto $00FFE6(メッセージ表示) #$0FD8
0BEF61 JSL $C737BE SR: $0737BE 引数:1#$0559
0BEF67 JSL $CC9F2C SR: $0C9F2C
0BEF6B BRK $0FD9 ($0B0FD9) goto $00FFE6(メッセージ表示) #$0FD9
0BEF6E JSL $C737BE SR: $0737BE 引数:1#$0FDA
0BEF74 JSL $CDA806 SR: $0DA806
0BEF78 JSL $CC9F5F SR: $0C9F5F
0BEF7C JSL $CDACEE SR: $0DACEE
0BEF80 LDA #$0001 A=#$0001
0BEF83 TSB $354E A or $354E
0BEF86 LDA #$0080 A=#$0080
0BEF89 TSB $362B A or $362B
0BEF8C JSL $CAF5D6 SR: $0AF5D6
0BEF90 BRA #$02 goto $0BEF94
0BEF92 CLC c=off
0BEF93 RTS return
0BEF94 SEC c=on
0BEF95 RTS return
  • SR: $0CF104 ゆうきのあかしを持っているか(持っているc=on)
0CF104 LDA #$00E8 A=#$00E8
0CF107 LDX #$0104 X=#$0104
0CF10A JSL $C78238 SR: $078238
0CF10E BCS #$02 if(c==on) goto $0CF112
0CF110 CLC c=off
0CF111 RTL return
0CF112 SEC c=on
0CF113 RTL return
  • SR: $0CF119 ゆうきのあかし削除
0CF119 LDA #$00E8 A=#$00E8
0CF11C LDX #$0104 X=#$0104
0CF11F JSL $C781F6 SR: $0781F6 アイテム削除
0CF123 RTL return

順番が前後してしまいますが、先に「ゆうきのあかし」(ナジミの塔の最上階で入手)をもっている状態でアリアハン王に話したときの実装を済ませてしまいます。「ゆうきのあかし」を持っている場合には、専用のメッセージを表示し、主人公を勇者に転生させます(レベルはそのまま)。その後、「ゆうきのあかし」を削除し、$7E354Eの1ビット目(#$01)をONにします。ちなみにこの部分は作者の表現力のなさのためなぜか唐突に説明調の台詞が多くなります。DQ6の本体合流時に体が光ったりする演出ができればいいんですが、やり方がよくわからないのでとりあえずペンディングで。また、SR: $0AF5D6は今回新しく定義したSRですが、別途説明します。