DQ3 バハラタイベント解析

今回は改造無しで解析のみ行います。また、今回の内容は「どうやらそうらしい」というだけで正しいかどうかについては確証が持てないということに注意してください。

さて、関係するのは

  1. SR: $0B2CD8 NPC1_MoveSR_0170(タニアの祖父)
  2. SR: $0B2D1B NPC1_TalkSR_0170(タニアの祖父)
  3. SR: $0B2B79 NPC1_MoveSR_016F(グプタ)
  4. SR: $0CE653 バハラタグプタ関連イベント

です。1,2,3はマップ進入時の初期化処理中のNPCの部分で呼び出されます。4は$0A49C9-でSR: $07785Fの引数として呼び出されているようです。SR: $07785Fはおそらくイベント登録用のSRと思われます。さて、イベントの中でよく出てくるのが、$0DADBB~$0DB091のSR群です。現在公開しているDQ3SFCEditorに付属しているRommap.xmlでは「フェードインまでxxxms?」としていますが、大嘘でした。これらのSRの中をよく見るとわかりますが、$7E3434をカウンタとして、$0DADBB~$DAEAAまではカウンタに特定の値をセットするSRで、$0DAEB1~$0DB091まではカウンタが特定の値になるまで処理を待つ、という機能のようです。いまいちはっきりしたイメージが持てないのですが、イベントは複数のスレッドのようなものが同時に走っていて、カウンタの値が変わるなどの条件で何らかのアクションを起こす、という仕組みになっているようです。

さらに、こうしたイベントは、NPC間の動作だけでは成り立たず、イベントをドライブするメインとも言うべきSR(今回のケースでは$0CE653)がないと動作しないようです。さて、上図のように、イベントは分解するとカウンタセット→アクション→待機の繰り返しで成り立っているといえます。今回のケースでは、

カウンタ 実行SR 処理
1000 $0CE653 「旅のひと…」(タニアの祖父のセリフ)
2000 $0B2B79 「ぼくが いきます!」(グプタのセリフ)
3000 ???? ????
4000 $0B2B79 ????
5000 $0CE653 ????
$0B2CD8 タニアの祖父左を向く
6000 ????
7000 $0B2B79 「見ず知らずの…」(グプタのセリフ)
グプタ座標X=$26 Y=$57に移動(グプタ町を出るべく移動)
8000 $0B2CD8 「グプタ!」(タニアの祖父のセリフ)
9000? $0B2B79 グプタ座標X=$28 Y=$4Bに移動し消滅
10000 $0CE653 メニューモードON

となります(完全ではないですが)。ちなみにカウンタに1000をセットするのはSR: $0B2D1Bでタニアの祖父に話し掛けたときに行われます。見てわかるように、複数のSR内でカウンタをセットしたり待機したりしているのでイベントを自作する場合は、どのSRでいくつのカウンタをセットするのか、いくつのカウンタを待機するのか簡単にまとめておくといいでしょう。当然のことですが、カウンタをセットし忘れるといつまでたっても処理が進まず、フリーズしたようになります(内部的には無限ループが発生している状態ですね)。

このSRをサンプルに取り上げたのは他にも理由があります。キャラクターの移動、マップからの消滅が含まれているからです。

  • SR: $0B2B9E グプタがバハラタを飛び出す処理
0B2BE1 LDX #$0026 X=#$0026 移動先X座標をセット
0B2BE4 LDA #$0057 A=#$0057 移動先Y座標をセット
0B2BE7 JSL $C75474 SR: $075474 移動先座標を指定
0B2BEB JSL $CCD58C SR: $0CD58C 移動先座標にX軸→Y軸の順で移動
0B2BF3 LDX #$0028 X=#$0028 移動先X座標をセット
0B2BF6 LDA #$004B A=#$004B 移動先Y座標をセット
0B2BF9 JSL $C75474 SR: $075474 移動先座標を指定
0B2BFD JSL $CCD58C SR: $0CD58C 移動先座標にX軸→Y軸の順で移動
0B2C05 JSL $C75930 SR: $075930 キャラクター消滅

初めは「なんで移動先の座標設定と移動をいっしょにやらないのだろう」と思いましたが、移動方法を指定する必要があるため、ということに気が付きました。SR: $0CD58Cの近辺に同様のSRが複数存在しますが、Y軸→X軸の順で移動するSRなどが定義されています。状況に応じて使い分けてください。SR: $075930はマップからキャラクターを消すSRです。今回のストーリー変更で必要なSRです。