まずはイベントフラグ関連の変更をします。オリジナルではアリアハン王に最初に謁見した時点でルイーダ、登録所が使用可能になりますが、ナジミの塔からイベントアイテム(ゆうきのあかし 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ですが、別途説明します。
コメント