DQ3 ストーリー変更(幽霊船4)

ずいぶんと間があいてしまいました。現在マップ関係の勉強をしているので更新にあまり手が回りません。いままであまり触れないようにしていたマップの追加という(自分にとって)ハードルの高い部分の変更なので多少時間がかかりそうです。とはいえ、避けていては話が進まないので時間がかかるのは先行投資と割り切ります。

前回追加したNPCのうち、イベントに関連しないNPCについては取り立てて説明すべき点はあまりありません。会話したらイベント戦闘処理をして、終了後にメッセージを表示して終わりです。以下一例。

  • SR: $0CF76C NPC1_TalkSR_0574 追加NPC幽霊船甲板出口骸骨会話処理(新SR)
0CF76C BRK $0FF0 ($0C0FF0) goto $00FFE6(メッセージ表示) #$0FF0
0CF76F JSL $CDACD2 SR: $0DACD2 キー入力でメッセージウィンドウを閉じる
0CF773 JSL $CDE4BB SR: $0DE4BB イベント戦闘(vsボーンプリズナー3体)
0CF777 BRK $0FF2 ($0C0FF2) goto $00FFE6(メッセージ表示) #$0FF2
0CF77A JSL $CDACD2 SR: $0DACD2 キー入力でメッセージウィンドウを閉じる
0CF77E RTL return

次にイベントの本筋を実装することにします。正直言って今回のイベントはできがよくありません。未だに話の筋が細部まで固まっていないせいです。イベントの流れは、

  1. 甲板の戦闘を仕掛けてこない骸骨に話す
  2. B1Fの骸骨船長に話して「復活の玉」をもらう
  3. 1.の骸骨と再度話して戦闘
  4. 甲板舳先にいるボスと戦闘

という流れになります。

  • SR: $0CF7A9 NPC1_TalkSR_057B(新SR)
0CF7A9 LDA $35B0 A=$35B0
0CF7AC AND #$0080 A&=#$0080 復活の玉を入手している
0CF7AF BNE #$0E if(z==off) goto $0CF7BF
0CF7B1 BRK $0FF5 ($0C0FF5) goto $00FFE6(メッセージ表示) #$0FF5
0CF7B4 JSL $CDACD2 SR: $0DACD2
0CF7B8 LDA #$0040 A=#$0040
0CF7BB TSB $35B0 A or $35B0
0CF7BE RTL return
0CF7BF BRK $0FF6 ($0C0FF6) goto $00FFE6(メッセージ表示) #$0FF6
0CF7C2 JSL $CDACD2 SR: $0DACD2
0CF7C6 JSL $CDE456 SR: $0DE456 イベント戦闘(vsボーンプリズナー)
0CF7CA LDA #$0001 A=#$0001
0CF7CD TSB $35B1 A or $35B1 幽霊船で復活の玉を落としたゾンビを倒した
0CF7D0 RTL return

次にB1Fの変更を行います。

  • SR: $0CCF59 幽霊船B1FNPC情報設定
0CCF9F-1 NOP
0CCFA2 JSL $CCF6FD SR: $0CF6FD
  • SR: $0CF680 幽霊船B1FNPC設定(新SR)
0CF6FD LDA #$008A A=#$008A
0CF700 JSL $C758DE SR: $0758DE
0CF704 JSL $CCF15A SR: $0CF15A 幽霊船追加イベント発生条件か
0CF708 BCC #$07 if(c==off) goto $0CF711
0CF70A LDA #$057D A=#$057D 幽霊船B1F幽霊船長NPC
0CF70D JSL $C75828 SR: $075828 NPC1設定
0CF711 RTL return
  • SR: $0CF840 NPC1_TalkSR_057D(骸骨船長)(新SR)
0CF840 LDA $35B0 A=$35B0
0CF843 AND #$0080 A&=#$0080 復活の玉を入手している
0CF846 BEQ #$05 if(z==on) goto $0CF84D
0CF848 JSR $F47A SR: $0CF47A
0CF84B BRA #$0B goto $0CF858
0CF84D LDA $35B0 A=$35B0
0CF850 AND #$0040 A&=#$0040 復活の玉を落としたゾンビと話しているか
0CF853 BNE #$05 if(z==off) goto $0CF85A
0CF855 BRK $1026 ($0C1026) goto $00FFE6(メッセージ表示) #$1026
0CF858 BRA #$1B goto $0CF875
0CF85A JSL $CC7B5A SR: $0C7B5A パーティ人数が1人か調べる(1人c=on)
0CF85E BCS #$05 if(c==on) goto $0CF865
0CF860 BRK $0FFA ($0C0FFA) goto $00FFE6(メッセージ表示) #$0FFA
0CF863 BRA #$03 goto $0CF868
0CF865 BRK $0FFB ($0C0FFB) goto $00FFE6(メッセージ表示) #$0FFB
0CF868 JSL $CDAC66 SR: $0DAC66 はい/いいえ選択処理(はいc=on)
0CF86C BCS #$09 if(c==on) goto $0CF877
0CF86E BRK $0FFD ($0C0FFD) goto $00FFE6(メッセージ表示) #$0FFD
0CF871 JSL $CDACD2 SR: $0DACD2
0CF875 BRA #$18 goto $0CF88F
0CF877 BRK $0FFC ($0C0FFC) goto $00FFE6(メッセージ表示) #$0FFC
0CF87A JSL $C737BE SR: $0737BE 引数:1#$0FF9
0CF880 JSL $CDA806 SR: $0DA806 アイテム入手BGM再生
0CF884 JSL $CCF75B SR: $0CF75B 復活の玉入手
0CF888 JSL $CDACEE SR: $0DACEE
0CF88C BRK $0FFE ($0C0FFE) goto $00FFE6(メッセージ表示) #$0FFE
0CF88F JSL $CDACD2 SR: $0DACD2
0CF893 RTL return
  • SR: $0CF75B 復活の玉入手(新SR)
0CF75B LDA #$00E9 A=#$00E9 復活の玉のアイテムID
0CF75E LDX #$0104 X=#$0104
0CF761 JSL $C781C5 SR: $0781C5 アイテム入手
0CF765 LDA #$0080 A=#$0080
0CF768 TSB $35B0 A or $35B0
0CF76B RTL return

分岐する処理に関しては、途中でreturnしたり、gotoでSRの最後にジャンプしたりといまいち一貫していません。1バイト多くなりますが、今後はgotoでSRの最後にジャンプするように統一するつもりです。B1Fの骸骨船長はオリジナルでは甲板にいて舵を握っていた骸骨NPCのことです。モンスターがやってきてB1Fに追いやられた、という設定にしてあります。今回はこれといって大変な部分はありません。単なるお使いの実装のみなので。次回はボス戦がらみの部分を実装します。