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

さて、肝心のボス戦イベントの実装を行います。「復活の玉」を持った状態で今まで話し掛けても戦闘にならなかった骸骨に話し掛けると戦闘になり(vsボーンプリズナー)、倒すとキャラクターが消えるので先に進めるようになり、舳先に近づくとボス達と戦闘となり、勝つとイベント終了、ということになります。今回は「一定座標にPCが到達するとイベントが発生」という発生方法を使用します。お手本はラスボス4連戦のバラモスブロス、バラモスゾンビとの戦闘部分です。まずはイベントのカウンタの設計から始めます。

カウンタ1000のトリガーはPCが指定座標に到達したらセットされる

カウンタ 処理
1000 モンスターのNPCが振り向く+ネクロマンサーのセリフ
2000 グラコスのセリフ
3000 くちぶえのBGM再生
4000 後ろで寝転がっていた囚人、骸骨のNPCが起き上がってやってくる
5000 ボス戦
6000 ネクロマンサーのセリフ+消滅
7000 グラコスのセリフ+消滅
8000 その他ザコのNPCを消滅

イベントの概要は固まったので、後は実装するだけです。

  • SR: $0CF997 幽霊船追加イベント処理(新SR)
0CF997 COP goto $00FFE4
0CF998 JSL $CCD276 SR: $0CD276
0CF99C LDA #$08F0 A=#$08F0 X座標左端
0CF99F LDX #$0910 X=#$0910 X座標右端
0CF9A2 LDY #$0908 Y=#$0908 Y座標
0CF9A5 JSL $C75365 SR: $075365 PCが指定座標(X座標は範囲指定)に達しているか?(しているc=on)
0CF9A9 BCS #$03 if(c==on) goto $0CF9AE
0CF9AB BRA #$EB goto $0CF998
0CF9AD NOP
0CF9AE JSL $CDADD8 SR: $0DADD8 カウンタに1000セット
0CF9B2 JSL $CDAEE1 SR: $0DAEE1 カウンタが3000になるまで待機
0CF9B6 LDA #$006C A=#$006C
0CF9B9 JSL $C72FB2 SR: $072FB2 BGM再生
0CF9BD JSL $CDADF4 SR: $0DADF4 カウンタに4000セット
0CF9C1 JSL $CDAF01 SR: $0DAF01 カウンタが5000になるまで待機
0CF9C5 JSL $CDE490 SR: $0DE490 イベント戦闘(グラコス+ネクロマンサー)
0CF9C9 LDA #$0002 A=#$0002
0CF9CC TSB $35B1 A or $35B1
0CF9CF JSL $CDAE02 SR: $0DAE02 カウンタに6000セット
0CF9D3 JSL $CDAF31 SR: $0DAF31 カウンタが8000になるまで待機
0CF9D7 LDA #$0017 A=#$0017
0CF9DA JSL $C74B8C SR: $074B8C 行動対象キャラクター指定
0CF9DE JSL $C75930 SR: $075930 キャラクター消滅
0CF9E2 LDA #$0016 A=#$0016
0CF9E5 JSL $C74B8C SR: $074B8C 行動対象キャラクター指定
0CF9E9 JSL $C75930 SR: $075930 キャラクター消滅
0CF9ED LDA #$0015 A=#$0015
0CF9F0 JSL $C74B8C SR: $074B8C 行動対象キャラクター指定
0CF9F4 JSL $C75930 SR: $075930 キャラクター消滅
0CF9F8 LDA #$0014 A=#$0014
0CF9FB JSL $C74B8C SR: $074B8C 行動対象キャラクター指定
0CF9FF JSL $C75930 SR: $075930 キャラクター消滅
0CFA03 JSL $CDD65C SR: $0DD65C PC表示
0CFA07 JSL $CCD383 SR: $0CD383 メニュー表示モードON?
0CFA0B JSL $CCD298 SR: $0CD298 イベント終了処理
0CFA0F RTL return
  • SR: $0CFA80 NPC1_MoveSR_0577(ネクロマンサーのNPC)(新SR)
0CFA80 JSL $CCDADF SR: $0CDADF
0CFA84 COP goto $00FFE4
0CFA85 JSL $CDAEB1 SR: $0DAEB1 カウンタが1000になるまで待機
0CFA89 JSL $CCD940 SR: $0CD940 キャラクターを反時計回りで下を向かせる
0CFA8D JSL $CC73CF SR: $0C73CF キャラクターが足踏みする処理
0CFA91 BRK $1002 ($0C1002) goto $00FFE6(メッセージ表示) #$1002
0CFA94 JSL $CDACD2 SR: $0DACD2
0CFA98 JSL $CDADE6 SR: $0DADE6 カウンタに2000セット
0CFA9C JSL $CDAF11 SR: $0DAF11 カウンタが6000になるまで待機
0CFAA0 JSL $CC73CF SR: $0C73CF
0CFAA4 BRK $1008 ($0C1008) goto $00FFE6(メッセージ表示) #$1008
0CFAA7 JSL $CDACD2 SR: $0DACD2
0CFAAB JSL $C1E32E SR: $01E32E 引数:1#$003F BGM再生
0CFAB1 JSL $C75930 SR: $075930 キャラクター消滅
0CFAB5 JSL $CDAE09 SR: $0DAE09 カウンタに7000セット
0CFAB9 RTL return
  • SR: $0CFABA NPC1_MoveSR_0578(グラコスーのNPC)(新SR)
0CFABE COP goto $00FFE4
0CFABF JSL $CDAEB1 SR: $0DAEB1 カウンタが1000になるまで待機
0CFAC3 JSL $CCD91C SR: $0CD91C キャラクターを時計回りで下を向かせる
0CFAC7 JSL $CDAED1 SR: $0DAED1 カウンタが2000になるまで待機
0CFACB JSL $CC73CF SR: $0C73CF キャラクターが足踏みする処理
0CFACF JSL $CC7B5A SR: $0C7B5A パーティ人数が一人か調べる(一人c=on)
0CFAD3 BCS #$05 if(c==on) goto $0CFADA
0CFAD5 BRK $1000 ($0C1000) goto $00FFE6(メッセージ表示) #$1000
0CFAD8 BRA #$03 goto $0CFADD
0CFADA BRK $1001 ($0C1001) goto $00FFE6(メッセージ表示) #$1001
0CFADD JSL $CDACD2 SR: $0DACD2
0CFAE1 JSL $CDADED SR: $0DADED カウンタに3000セット
0CFAE5 JSL $CDAF21 SR: $0DAF21 カウンタが7000になるまで待機
0CFAE9 JSL $CC73CF SR: $0C73CF キャラクターが足踏みする処理
0CFAED BRK $1009 ($0C1009) goto $00FFE6(メッセージ表示) #$1009
0CFAF0 JSL $CDACD2 SR: $0DACD2
0CFAF4 JSL $C1E32E SR: $01E32E 引数:1#$003F BGM再生
0CFAFA JSL $C75930 SR: $075930 キャラクター消滅
0CFAFE JSL $CDAE10 SR: $0DAE10 カウンタに8000セット
0CFB02 RTL return
  • SR: $0CF7E0 NPC1_MoveSR_0579(新SR)
0CF7E0 JSL $CCDB10 SR: $0CDB10
0CF7E4 JSL $CCD196 SR: $0CD196 キャラクター横向き配置?
0CF7E8 COP goto $00FFE4
0CF7E9 JSL $CDAEF1 SR: $0DAEF1 カウンタが4000になるまで待機
0CF7ED JSL $CCD392 SR: $0CD392 キャラクターイベント中移動フラグON?
0CF7F1 JSL $CCD366 SR: $0CD366 移動速度5/3倍速セット?
0CF7F5 LDA #$0022 A=#$0022
0CF7F8 LDX #$0033 X=#$0033
0CF7FB JSL $C75305 SR: $075305 キャラクター出現座標を指定
0CF7FF JSL $CCD7B8 SR: $0CD7B8
0CF803 LDA #$0049 A=#$0049
0CF806 JSL $C74CD0 SR: $074CD0 キャラクター表示?
0CF80A LDX #$0021 X=#$0021
0CF80D LDA #$0030 A=#$0030
0CF810 JSL $C75474 SR: $075474 キャラクター移動先座標指定
0CF814 JSL $CCD59D SR: $0CD59D 指定座標にY軸→X軸の順でキャラクター移動
0CF818 LDX #$001C X=#$001C
0CF81B LDA #$002A A=#$002A
0CF81E JSL $C75474 SR: $075474 キャラクター移動先座標指定
0CF822 JSL $CCD58C SR: $0CD58C 指定座標にX軸→Y軸の順でキャラクター移動
0CF826 JSL $CDADFB SR: $0DADFB カウンタに5000をセット
0CF82A JSL $CDAF31 SR: $0DAF31 カウンタが8000になるまで待機
0CF82E LDA #$0020 A=#$0020
0CF831 JSL $C74B39 SR: $074B39 処理にインターバルを置く?
0CF835 JSL $C1E32E SR: $01E32E 引数:1#$003F BGM再生
0CF83B JSL $C75930 SR: $075930 キャラクター消滅
0CF83F RTL return
  • SR: $0CF894 NPC1_MoveSR_057C(新SR)
0CF894 JSL $CCD1A7 SR: $0CD1A7 キャラクター横向き配置?
0CF898 COP goto $00FFE4
0CF899 JSL $CDAEF1 SR: $0DAEF1 カウンタが4000になるまで待機
0CF89D JSL $CCD392 SR: $0CD392 キャラクターイベント中移動フラグON?
0CF8A1 JSL $CCD35E SR: $0CD35E 移動速度4/3倍速セット?
0CF8A5 LDA #$0029 A=#$0029
0CF8A8 LDX #$002B X=#$002B
0CF8AB JSL $C75305 SR: $075305 キャラクター出現座標を指定
0CF8AF JSL $CCD7B8 SR: $0CD7B8 キャラクター表示?
0CF8B3 LDA #$005C A=#$005C
0CF8B6 JSL $C74CD0 SR: $074CD0
0CF8BA LDX #$0024 X=#$0024
0CF8BD LDA #$002A A=#$002A
0CF8C0 JSL $C75474 SR: $075474 キャラクター移動先座標指定
0CF8C4 JSL $CCD58C SR: $0CD58C 指定座標にX軸→Y軸の順でキャラクター移動
0CF8C8 JSL $CDAF31 SR: $0DAF31 カウンタが8000になるまで待機
0CF8CC LDA #$0040 A=#$0040
0CF8CF JSL $C74B39 SR: $074B39 処理にインターバルを置く?
0CF8D3 JSL $C1E32E SR: $01E32E 引数:1#$003F BGM再生
0CF8D9 JSL $C75930 SR: $075930 キャラクター消滅
0CF8DD RTL return

今回のイベントを実装して1つわかったことがあります。「キャラクターイベント中移動フラグON」にすると、どうも通行属性が無視されるようで、移動経路に他のキャラクターがいても立ち止まらずに通り過ぎるようです。つまり、ロマリアの追加イベント中に通行属性をあれやこれや無理矢理変えていたのが不要になる、ということで、実際ロマリア東部の橋の修復失敗を報告に来る兵士のMoveSRの先頭でSR: $0CD392を呼んでおくと途中で立ち止まらなくなります。あれだけ苦労したのに、とも思いますが、スマートな解決策が見つかったのでよしとします。

とりあえず、これで幽霊船の追加イベントの実装は終わりです。範囲が限定されているので実装自体は比較的簡単でした。次回からはアレフガルドの変更に移ります。