今回は「オルテガのこどもの間は他人の家で家捜しできないようにする」を実装します。昔「家捜しできるのはおかしい」を売りにしたゲームがあったような気がしますが(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です。これについては次回説明します。
コメント