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

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

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

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

  • SR: $0A98FE アリアハン移動・宝箱・ドア情報設定
0A9959LDX #$0004X=#$0004
0A995CJSL $C666AFSR: $0666AF
0A9960LDX #$005DX=#$005D
0A9963JSL $C666C8SR: $0666C8

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

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

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

装飾品($087DB1-)

Index場所区分X座標Y座標階層
5Dタル12590

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

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

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

Index場所区分X座標Y座標階層?SRアドレス??アドレスフラグ管理番号
8C18125700CAF450CCEE6B0033
8D18125900CAF450CCEE6B0033

  • SR: $0AF450 オルテガの子供のときにタルを調べたときの処理
0AF450JSL $C737BESR: $0737BE 引数:1#$0FDD
0AF456JSL $CDACD2SR: $0DACD2
0AF45ARTLreturn

  • SR: $0AF500 アリアハンアイテム拾得等切り替え処理
0AF500LDA $354EA=$354E
0AF503AND #$0001A&=#$0001
0AF506BNE #$0Fif(z==off) goto $0AF517
0AF508LDX #$008CX=#$008C
0AF50BJSL $C666FASR: $0666FA
0AF50FLDX #$008DX=#$008D
0AF512JSL $C666FASR: $0666FA
0AF516RTLreturn
0AF517LDX #$0004X=#$0004
0AF51AJSL $C666AFSR: $0666AF
0AF51ELDX #$005DX=#$005D
0AF521JSL $C666C8SR: $0666C8
0AF525RTLreturn

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

20090610230043.jpg

スポンサーリンク

コメントを書く

メールアドレスが公開されることはありません。コメントは管理者の承認後表示されます。