DQ3 ストーリー変更(アリアハン4)

今回は「オルテガのこどもの間は他人の家で家捜しできないようにする」を実装します。昔「家捜しできるのはおかしい」を売りにしたゲームがあったような気がしますが(MOONでしたっけ?)。実装方法はいくつか考えられるのですが、家捜し制限をする必要がある場所がかなり限られていること、実家とダンジョンの宝箱はオルテガの子供でも取得可にする、という条件を考えると、個別にイベントを差し替えるのがいいという結論になりました。対象となるのは以下の箇所です。中身がスカの場合でも「まわりの目が気になってやめてしまった」というメッセージを表示させるようにします。

  • アリアハン城下町のルイーダの酒場のわきの樽(2箇所)
  • アリアハン民家2Fのタンス(2箇所)
  • アリアハン城内1Fの樽(2箇所)
  • アリアハン城内2Fのタンス(2箇所)
  • レーベの民家の本棚(2箇所)
  • ナジミの塔の最上階の本棚(2箇所)

レーベの岩の下の小さなメダルは例外として落ちているので取得可としました。また、アリアハン大陸でも盗賊の鍵がないと入れない場所(アリアハン東部のほこらなど)については盗賊の鍵入手と共に勇者になる今回の改造では考慮する必要がありません。さて、ここからが本題です。サブマップ(城、街、ダンジョン等のマップをフィールドマップと区別するためにこう呼びます)上に配置されている宝箱などのオブジェクトは、マップデータにはかかれていますが、イベント自体は独立しており、各サブマップに用意されている「マップ進入時初期化処理SR」の中で個別に配置していきます。例えばアリアハン城下町はSR: $0A5304が進入時の初期化処理SRで、その中で最終的にSR: $0A98FEでイベント、アイテム拾得のイベントの設定を行っています。アリアハン城下町ではルイーダの酒場の脇に樽がタテに2つ並んでおり、上が25G、下がスカです。この部分のイベント設定は以下の部分で行われているようです。

  • SR: $0A98FE アリアハン移動・宝箱・ドア情報設定
0A9959 LDX #$0004 X=#$0004
0A995C JSL $C666AF SR: $0666AF
0A9960 LDX #$005D X=#$005D
0A9963 JSL $C666C8 SR: $0666C8

XをそれぞれのインデックスとしてSR: $0666AFでゴールド拾得情報の設定、SR: $0666C8で装飾品情報の設定を行っているようです。ゴールド拾得($087C99-)の#$04、装飾品($087DB1-)の#$5Dをそれぞれ見てみると

ゴールド拾得($087C99-)

Index 場所区分 X座標 Y座標 階層 ? 金額 フラグ管理番号
004 タル 12 57 0 0 25 0183

装飾品($087DB1-)

Index 場所区分 X座標 Y座標 階層
5D タル 12 59 0

となっているので、実際の位置関係からしてもこれがルイーダの酒場の脇のタルに設定されたイベントと見て間違いなさそうです(マップ左上がX=0、Y=0の起点のようです)。要はこのイベント設定のプログラムを条件に応じて別のものに置き換えてしまえばいいわけです。

さて、やるべきことがだいぶ絞られてきましたが、次に何に置き換えればいいかという話になります。アイテム拾得、ゴールド取得などで「場所区分」を指定していますが、この区分指定によって調べたときにどんなメッセージを表示するか等の情報が区分ごとの調べる対応($089812-)に定義されているようで、それぞれのオブジェクトに対応してタルならまず「XXXは、タルの中をのぞきこんだ」のメッセージを表示し、その後中身に応じたメッセージを表示するようになっているようです。他にはタンスなどは最初のメッセージが設定されていません。

いまいちどういう風に実現しているのかよくわからないのと、区分設定→結果表示という枠組みが窮屈なのでかわりにしらべるイベント($088218-)で実装することにします。しらべるイベントなら上記のような枠組みにとらわれず自分で実装したSRにすぐに処理を飛ばせるようなので自由度は高くなります。というわけで、しらべるイベントの場所を$0EA000-に移動し、元の場所を参照していたSRのアドレスを変更してしまいます。さらに以下のレコードを追加します。

Index 場所区分 X座標 Y座標 階層 ? SRアドレス ??アドレス フラグ管理番号
8C 18 12 57 0 0 CAF450 CCEE6B 0033
8D 18 12 59 0 0 CAF450 CCEE6B 0033

  • SR: $0AF450 オルテガの子供のときにタルを調べたときの処理
0AF450 JSL $C737BE SR: $0737BE 引数:1#$0FDD
0AF456 JSL $CDACD2 SR: $0DACD2
0AF45A RTL return

  • SR: $0AF500 アリアハンアイテム拾得等切り替え処理
0AF500 LDA $354E A=$354E
0AF503 AND #$0001 A&=#$0001
0AF506 BNE #$0F if(z==off) goto $0AF517
0AF508 LDX #$008C X=#$008C
0AF50B JSL $C666FA SR: $0666FA
0AF50F LDX #$008D X=#$008D
0AF512 JSL $C666FA SR: $0666FA
0AF516 RTL return
0AF517 LDX #$0004 X=#$0004
0AF51A JSL $C666AF SR: $0666AF
0AF51E LDX #$005D X=#$005D
0AF521 JSL $C666C8 SR: $0666C8
0AF525 RTL return

ようやく準備が整ったのでプログラムの実装にうつります。SR: $0AF450は主人公の職業がオルテガの子供のときにタルを調べたときに表示されるメッセージの処理です。同様にタンス、本棚を調べたときの処理も追加しますがここでは省略します。SR: $0AF500はアリアハンの城下町のタルに設定するイベントをフラグによって切り替える処理です。アリアハン王から旅立ちの許可をもらっていない=勇者になっていない($7E354Eの#01ビットがOFF)場合はしらべるイベントを設定し、それ以外はオリジナルどおりのイベントを設定します。同様の処理を上で列挙したマップに対して行います。これで終わり…となるはずだったのですが、1点うまくいかない箇所ができてしまいました。アリアハン城内2Fです。これについては次回説明します。

20090610230043.jpg

コメント

タイトルとURLをコピーしました