前回「オルテガのこども」のときにタルやタンスを調べると「周りの目が気になってやめてしまった」というメッセージが出て調べられない実装をしましたが、アリアハン城2Fに限り、ちょっと違う実装をする必要があります。なぜかというとアリアハン城2Fは「ゆうきのあかし」を持ち帰って王様に話すと「オルテガのこども」から勇者に転生するイベントがあるため、イベントの前後でタンスを調べたときのリアクションを切り替える必要があります。現在のマップ上のイベントの種類をメモリ中に保持している場所を見つけたので試しに手動で置き換えてみたところ、イベントの差し替えはできたのですが、タンスを開けたとたん、下の床が丸見えになってしまいました。要はタンスを開けた後のグラフィックがメモリ中に読み込まれていないことが原因のようです。いろいろ調べてみましたが、どうやって読み込んでいるのかとか、どのグラフィックを読んでいるのかということがわからなかったので、結局以下の手法で逃げることにしました。かなり邪道な方法です。
- イベントフラグに関わらず、オリジナルどおりのマップの初期化をする。
- 主人公が旅立ちの許可をもらってない=勇者になっていない場合は特定のメモリ領域を調べるイベントで上書きする
- 「ゆうきのあかし」を持った状態でアリアハン王に話し掛けたときの処理中に主人公は勇者に転身するが、その処理の最後に2で上書きした調べるイベントをオリジナルのイベントに差し替える
現在表示するマップ中で必要なグラフィックはおそらくマップの初期化処理中でどこかのメモリ中に展開されるようなので、実際に使う使わないに関わらずとにかくメモリ中に読ませてしまい、イベントフラグの部分だけ上書き、必要に応じて再度上書き、というのが方針です。というわけで実装は以下のようになります。
- SR: $0A9AE7 アリアハン城内2F移動・宝箱・ドア・NPC情報設定
略 | |||
---|---|---|---|
0A9AFC-B05 | NOP | ||
0A9B06 | JSL $CAF572 | SR: $0AF572 | |
略 |
- SR: $0AF572 アリアハン城内2Fアイテム拾得等切替処理
0AF572 | LDX #$0090 | X=#$0090 | |
---|---|---|---|
0AF575 | JSL $C66696 | SR: $066696 | |
0AF579 | LDX #$0060 | X=#$0060 | |
0AF57C | JSL $C666C8 | SR: $0666C8 | |
0AF580 | LDA $354E | A=$354E | |
0AF583 | AND #$0001 | A&=#$0001 | |
0AF586 | BNE #$04 | if(z==off) goto $0AF58C | |
0AF588 | JSL $CAF60A | SR: $0AF60A | |
0AF58C | RTL | return |
- SR: $0AF60A アリアハン城内2F勇者転身前アイテム拾得等切替処理
0AF60A | LDA #$0012 | A=#$0012 | |
---|---|---|---|
0AF60D | STA $A17D | $A17D=A | |
0AF610 | STA $A17F | $A17F=A | |
0AF613 | LDA #$0004 | A=#$0004 | |
0AF616 | STA $A3BD | $A3BD=A | |
0AF619 | LDA #$0004 | A=#$0004 | |
0AF61C | STA $A3BF | $A3BF=A | |
0AF61F | LDA #$0092 | A=#$0092 | |
0AF622 | STA $A41D | $A41D=A | |
0AF625 | LDA #$0093 | A=#$0093 | |
0AF628 | STA $A41F | $A41F=A | |
0AF62B | LDA #$0272 | A=#$0272 | |
0AF62E | STA $A47D | $A47D=A | |
0AF631 | STA $A47F | $A47F=A | |
0AF634 | LDA #$0037 | A=#$0037 | |
0AF637 | STA $A4DD | $A4DD=A | |
0AF63A | STA $A4DF | $A4DF=A | |
0AF63D | RTL | return |
- SR: $0AF5D6 アリアハン城内2F勇者転身後アイテム拾得等切替処理
0AF5D6 | LDA #$0007 | A=#$0007 | |
---|---|---|---|
0AF5D9 | STA $A17D | $A17D=A | |
0AF5DC | STA $A17F | $A17F=A | |
0AF5DF | LDA #$0000 | A=#$0000 | |
0AF5E2 | STA $A3BD | $A3BD=A | |
0AF5E5 | LDA #$0002 | A=#$0002 | |
0AF5E8 | STA $A3BF | $A3BF=A | |
0AF5EB | LDA #$0090 | A=#$0090 | |
0AF5EE | STA $A41D | $A41D=A | |
0AF5F1 | LDA #$0060 | A=#$0060 | |
0AF5F4 | STA $A41F | $A41F=A | |
0AF5F7 | LDA #$01F0 | A=#$01F0 | |
0AF5FA | STA $A47D | $A47D=A | |
0AF5FD | STA $A47F | $A47F=A | |
0AF600 | LDA #$0022 | A=#$0022 | |
0AF603 | STA $A4DD | $A4DD=A | |
0AF606 | STA $A4DF | $A4DF=A | |
0AF609 | RTL | return |
SR: $0AF5D6は主人公を勇者に転身させる処理の最後に呼びます。これによってタンスに設定されているイベントの切り替えが可能になりました。
コメント