オリジナルではおそらく1回話して終わりの精霊のほこらの精霊?ですが、王者の剣、光の鎧、勇者の盾を回収必須にするために雨雲の杖の入手条件を「王者の剣+光の鎧+勇者の盾を持っていること」に変更することで、大幅に変更したアレフガルド以降のストーリーの帳尻をあわせますwww。
(11/3追記)
エントリを2つに分けようと思ったら残りがほんのちょっとしかなかったのでこのエントリに追記しました。
この精霊には各アイテムの入手ヒントをPCに教える重要な役どころを与えます。しかもフラグになっているので話し掛けないと話が先に進みません。さらに船もないのでいちいちメルキドかドムドーラから歩いていかないといけないといううざさぶり。ちょっとやりすぎかも。さて、実装に移ります。
- SR: $0BA1F1 NPC1_TalkSR_04CD(精霊のNPC)
略 | |||
---|---|---|---|
0BA21B | JSR $F700 | SR: $0BF700 | 精霊のほこら追加イベント処理 |
0BA21E-4D | NOP | ||
略 |
- SR: $0BF700 精霊のほこら追加イベント処理(新SR)
0BF700 | JSL $CDE6CA | SR: $0DE6CA | 王者の剣+光の鎧+勇者の盾を入手しているか(該当c=on) |
---|---|---|---|
0BF704 | BCC #$42 | if(c==off) goto $0BF748 | |
0BF706 | JSL $CCD37E | SR: $0CD37E | メニュー表示モードOFF? |
0BF70A | JSL $CDAD91 | SR: $0DAD91 | |
0BF70E | JSL $C77085 | SR: $077085 | |
0BF712 | JSL $CDAD91 | SR: $0DAD91 | |
0BF716 | JSL $CDAD9E | SR: $0DAD9E | |
0BF71A | LDA $C199 | A=$C199 | |
0BF71D | STA $BE81 | $BE81=A | |
0BF720 | LDA $C19B | A=$C19B | |
0BF723 | STA $BE85 | $BE85=A | |
0BF726 | LDA $35B2 | A=$35B2 | |
0BF729 | AND #$0001 | A&=#$0001 | 精霊のほこらで王者の剣+光の鎧+勇者の盾をそろえないで妖精に話し掛けた |
0BF72C | BEQ #$05 | if(z==on) goto $0BF733 | |
0BF72E | BRK $102F ($0B102F) | goto $00FFE6(メッセージ表示) #$102F | |
0BF731 | BRA #$03 | goto $0BF736 | |
0BF733 | BRK $08D5 ($0B08D5) | goto $00FFE6(メッセージ表示) #$08D5 | |
0BF736 | JSL $CDA806 | SR: $0DA806 | アイテム入手BGM再生 |
0BF73A | JSL $CCA1C3 | SR: $0CA1C3 | あまぐものつえ入手 |
0BF73E | JSL $CDACE5 | SR: $0DACE5 | |
0BF742 | JSL $CCD383 | SR: $0CD383 | メニュー表示モードON? |
0BF746 | BRA #$6C | goto $0BF7B4 | |
0BF748 | LDA $35B2 | A=$35B2 | |
0BF74B | AND #$0001 | A&=#$0001 | |
0BF74E | BNE #$21 | if(z==off) goto $0BF771 | |
0BF750 | JSL $CDAD91 | SR: $0DAD91 | |
0BF754 | JSL $C77085 | SR: $077085 | |
0BF758 | JSL $CDAD91 | SR: $0DAD91 | |
0BF75C | JSL $CDAD9E | SR: $0DAD9E | |
0BF760 | LDA $C199 | A=$C199 | |
0BF763 | STA $BE81 | $BE81=A | |
0BF766 | LDA $C19B | A=$C19B | |
0BF769 | STA $BE85 | $BE85=A | |
0BF76C | BRK $1030 ($0B1030) | goto $00FFE6(メッセージ表示) #$1030 | |
0BF76F | BRA #$38 | goto $0BF7A9 | |
0BF771 | JSL $CDE70F | SR: $0DE70F | 王者の剣+光の鎧+勇者の盾を入手していないか(該当c=off) |
0BF775 | BCS #$05 | if(c==on) goto $0BF77C | |
0BF777 | BRK $1036 ($0B1036) | goto $00FFE6(メッセージ表示) #$1036 | |
0BF77A | BRA #$2D | goto $0BF7A9 | |
0BF77C | BRK $1031 ($0B1031) | goto $00FFE6(メッセージ表示) #$1031 | |
0BF77F | JSL $CDE726 | SR: $0DE726 | 王者の剣を入手しているか(該当c=on) |
0BF783 | BCC #$06 | if(c==off) goto $0BF78B | |
0BF785 | JSL $C737BE | SR: $0737BE 引数:1#$1032 | |
0BF78B | JSL $CDE6E1 | SR: $0DE6E1 | 光の鎧を入手しているか(該当c=on) |
0BF78F | BCC #$06 | if(c==off) goto $0BF797 | |
0BF791 | JSL $C737BE | SR: $0737BE 引数:1#$1033 | |
0BF797 | JSL $CDE6ED | SR: $0DE6ED | 勇者の盾を入手しているか(該当c=on) |
0BF79B | BCC #$06 | if(c==off) goto $0BF7A3 | |
0BF79D | JSL $C737BE | SR: $0737BE 引数:1#$1034 | |
0BF7A3 | JSL $C737BE | SR: $0737BE 引数:1#$1035 | |
0BF7A9 | JSL $CDE736 | SR: $0DE736 | 王者の剣+光の鎧+勇者の盾を入手ヒント表示処理 |
0BF7AD | BRK $1037 ($0B1037) | goto $00FFE6(メッセージ表示) #$1037 | |
0BF7B0 | JSL $CDACD2 | SR: $0DACD2 | キー入力でメッセージウィンドウを閉じる |
0BF7B4 | LDA #$0001 | A=#$0001 | |
0BF7B7 | TSB $35B2 | A or $35B2 | |
0BF7BA | RTS | return |
- SR: $0DE6CA 王者の剣+光の鎧+勇者の盾を入手しているか(該当c=on)(新SR)
0DE6CA | JSL $CDE726 | SR: $0DE726 | 王者の剣を入手しているか(該当c=on) |
---|---|---|---|
0DE6CE | BCC #$0F | if(c==off) goto $0DE6DF | |
0DE6D0 | JSL $CDE6E1 | SR: $0DE6E1 | 光の鎧を入手しているか(該当c=on) |
0DE6D4 | BCC #$09 | if(c==off) goto $0DE6DF | |
0DE6D6 | JSL $CDE6ED | SR: $0DE6ED | 勇者の盾を入手しているか(該当c=on) |
0DE6DA | BCC #$03 | if(c==off) goto $0DE6DF | |
0DE6DC | SEC | c=on | |
0DE6DD | BRA #$01 | goto $0DE6E0 | |
0DE6DF | CLC | c=off | |
0DE6E0 | RTL | return |
- SR: $0DE70F 王者の剣+光の鎧+勇者の盾を入手していないか(該当c=off)(新SR)
上記SRと逆なだけなので省略
- SR: $0DE726 王者の剣を入手しているか(該当c=on)(新SR)
0DE726 | LDA #$001E | A=#$001E | 王者の剣のアイテムID |
---|---|---|---|
0DE729 | LDX #$0104 | X=#$0104 | 袋の中も検索対象内 |
0DE72C | JSL $C78238 | SR: $078238 | |
0DE730 | BCC #$02 | if(c==off) goto $0DE734 | |
0DE732 | SEC | c=on | |
0DE733 | RTL | return | |
0DE734 | CLC | c=off | |
0DE735 | RTL | return |
- SR: $0DE6E1 光の鎧を入手しているか(該当c=on)(新SR)
0DE6E1 | LDA $3544 | A=$3544 | |
---|---|---|---|
0DE6E4 | AND #$0010 | A&=#$0010 | |
0DE6E7 | BEQ #$02 | if(z==on) goto $0DE6EB | |
0DE6E9 | SEC | c=on | |
0DE6EA | RTL | return | |
0DE6EB | CLC | c=off | |
0DE6EC | RTL | return |
- SR: $0DE6ED 勇者の盾を入手しているか(該当c=on)(新SR)
SR: $0DE726 王者の剣を入手しているかとアイテムIDが違うだけなので省略
精霊の役割が大幅に増えたのでその分処理も多くなります。単なるメッセージ表示(台詞表示)の部分に追加処理をねじ込む場合は$20によるSRコールを使用して同バンク内の空き部分で処理するようにすれば
変更前:00 xx xx
変更後:20 yy yy
となり、サイズも変わらず、前後のJMP命令を変更する必要もないので安全に作業できます。
さて、肝心の処理ですが、オリジナルでは精霊の台詞は「オープニングの性格決定についての話→雨雲の杖渡す」という処理になっていたのですが、今回の変更では何度か話す必要があるので、「一度話し掛けたフラグ」を新規に用意してそのフラグを見て台詞を替えています。また、現状回収済みのアイテムをしらべて「あなたは… …をすでに取り戻しています」という台詞を表示させるようにします。そして最後に未回収のアイテムに関してはありかのヒントを表示させるようにします。長くなってしまったので今回の実装の肝の1つであるヒント表示の部分は次回のエントリで説明します。残りの分量は少なかったので追記してしまいます。
(11/3追記)
- SR: $0DE736 王者の剣+光の鎧+勇者の盾入手ヒント表示
0DE736 | JSL $CDE726 | SR: $0DE726 | 王者の剣を入手しているか |
---|---|---|---|
0DE73A | BCS #$03 | if(c==on) goto $0DE73F | |
0DE73C | BRK $1039 ($0D1039) | goto $00FFE6(メッセージ表示) #$1039 | |
0DE73F | JSL $CDE6ED | SR: $0DE6ED | 勇者の盾を入手しているか |
0DE743 | BCS #$03 | if(c==on) goto $0DE748 | |
0DE745 | BRK $1038 ($0D1038) | goto $00FFE6(メッセージ表示) #$1038 | |
0DE748 | JSL $CDE6E1 | SR: $0DE6E1 | 光の鎧を入手しているか |
0DE74C | BCS #$14 | if(c==on) goto $0DE762 | |
0DE74E | JSL $CCF2E1 | SR: $0CF2E1 | メルキド襲撃イベントが終わっているか |
0DE752 | BCS #$05 | if(c==on) goto $0DE759 | |
0DE754 | BRK $103A ($0D103A) | goto $00FFE6(メッセージ表示) #$103A | |
0DE757 | BRA #$09 | goto $0DE762 | |
0DE759 | BRK $103B ($0D103B) | goto $00FFE6(メッセージ表示) #$103B | |
0DE75C | LDA #$0004 | A=#$0004 | 精霊のほこらの精霊から光の鎧の所在のヒントを得た |
0DE75F | TSB $35B2 | A or $35B2 | |
0DE762 | RTL | return |
光の鎧の入手のための手順変更は別途光の鎧入手編で説明します。
ここに来て重要なことに気が付いたのですが、勇者の「覚える」は直前に会話した内容のうち、最後のメッセージIDのものしか覚えてくれないようです。今回で言えば、「ヒント表示」SRのなかで表示されるメッセージではなく、$0BF791のメッセージID$1037(全てを 取り戻したとき[AD]あなたに あまぐものつえを[AD]わたしましょう。)というどうでもいいメッセージしか「おぼえる」の対象になりません。「実装はプロレベルを目指す」を密かな目標としていたのですが、ここにきてボロがでてしまいました。まあこの点については見逃してくださいwww。
コメント