今回は改造無しで解析のみ行います。また、今回の内容は「どうやらそうらしい」というだけで正しいかどうかについては確証が持てないということに注意してください。
さて、関係するのは
- SR: $0B2CD8 NPC1_MoveSR_0170(タニアの祖父)
- SR: $0B2D1B NPC1_TalkSR_0170(タニアの祖父)
- SR: $0B2B79 NPC1_MoveSR_016F(グプタ)
- 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です。
コメント