DQ3 ストーリー変更(光の鎧入手6)

1つ前のエントリを投下したのがちょうど1ヶ月前。正直自分でもかなり忘却のかなたに行ってしまってるのと、「需要あんのかこれ」という気もするので投下モチベーションはかなり低いのですが、残りの変更点はあと2箇所なのでグダグダながらやりきりたいと思います。ここ最近はDQ3SFC K.Mixの追加改造というか一応自分の中では最終稿扱いのバージョン1.0.0リリースに向けてつらつらと作業をしているわけですが、作業速度は低下気味。手のつけやすいところからちょこちょこと作業をしているのですが、モンスターネタが枯渇気味です。今のところ自分の中では没扱いのこんなモンスターも。

犬っぽいグラのモンスターもそろってるので(こっちは腐ってるけどw)、PS版DQ4のエグチキみたいにセットで出てくるって言うのもありかなーとも思ったんですが、おふざけが過ぎると思い直したので没にしました。現在はゾーマの城に無限回廊のフロアを追加しようと思ってるんですが、これまたいろいろ面倒っぽい(っていうかお手本になるいいフロアがない)のでこちらもモチベーション低下中です。

さて本題に入ります。前回までで、「ガライが仲間になる条件を満たしているフロアに侵入時に5人目を透明のキャラクターとして初期化する」ところまで終わっています。残りは「ガライとの会話終了後にガライが5人目の座標に移動し向きを変えた瞬間にガライを消し、代わりに5人目を可視化してPCを再描画する」処理を実装すればいいことになります。

例によってまずイベントの設計を行います。

カウンタ 処理内容
1000 ガライとの会話終了
2000 ガライが5人目の座標に移動完了し「ガライが仲間になった」フラグON、5人目を実体化させてPC再描画
3000 ガライのNPC消滅
4000 「ガライが 仲間に加わった!」メッセージ表示
  • SR: $0CE694 メルキド宿屋イベント処理
0CE6B9 JSL $CDEFAC SR: $0DEFAC
  • SR: $0DEFAC メルキド宿屋追加イベント処理(新SR)
0DEFAC LDA $35B4 A=$35B4
0DEFAF AND #$0004 A&=#$0004 ガライを仲間にしたか
0DEFB2 BEQ #$06 if(z==on) goto $0DEFBA
0DEFB4 JSL $CCD298 SR: $0CD298 イベント終了時処理?
0DEFB8 BRA #$0A goto $0DEFC4
0DEFBA JSL $CCF2E1 SR: $0CF2E1 メルキド襲撃イベントが終わっているか(該当c=on)
0DEFBE BCC #$06 if(c==off) goto $0DEFC6
0DEFC0 JSL $CDE9EE SR: $0DE9EE メルキド宿屋追加イベント処理(ガライ仲間追加)
0DEFC4 BRA #$04 goto $0DEFCA
0DEFC6 JSL $CCFC10 SR: $0CFC10 メルキド宿屋追加イベント処理(魔物襲撃)
0DEFCA RTL return
  • SR: $0DE9EE メルキド宿屋追加イベント処理(ガライ仲間追加)(新SR)
0DE9EE LDA $35B4 A=$35B4
0DE9F1 AND #$0002 A&=#$0002 バラモス城の骸骨に光の鎧の隠し場所の情報を聞いた
0DE9F4 BEQ #$05 if(z==on) goto $0DE9FB
0DE9F6 JSL $CCFF31 SR: $0CFF31 メルキド宿屋追加イベント処理(ガライ仲間追加)
0DE9FA RTL return
0DE9FB JSL $CCD298 SR: $0CD298 イベント終了時処理?
0DE9FF RTL return
  • SR: $0BF1BE メルキド宿屋ガライ会話追加処理(以前新規追加したSRに追記)
0BF1BE LDA $35B4 A=$35B4
0BF1C1 AND #$0008 A&=#$0008 ガライと別れた
0BF1C4 BEQ #$05 if(z==on) goto $0BF1CB
0BF1C6 BRK $1050 ($0B1050) goto $00FFE6(メッセージ表示) #$1050
0BF1C9 BRA #$0B goto $0BF1D6
0BF1CB LDA $35B4 A=$35B4
0BF1CE AND #$0002 A&=#$0002
0BF1D1 BEQ #$0B if(z==on) goto $0BF1DE
0BF1D3 BRK $104E ($0B104E) goto $00FFE6(メッセージ表示) #$104E
0BF1D6-B NOP
0BF1DC BRA #$41 goto $0BF21F $0BF21Fでカウンタに1000をセットするSR実行
  • SR: $0DEFDB メルキド宿屋ガライMove処理(新SR)
0DEFDB LDA $35B4 A=$35B4
0DEFDE AND #$0008 A&=#$0008
0DEFE1 BNE #$10 if(z==off) goto $0DEFF3
0DEFE3 JSL $CDF5C1 SR: $0DF5C1 バラモス城の骸骨から光のよろいのヒントをもらっていていてマップIDがメルキド宿屋orバラモスの間か(該当c=on)
0DEFE7 BCS #$06 if(c==on) goto $0DEFEF
0DEFE9 JSL $CDE518 SR: $0DE518 メルキド襲撃イベント時のガライMove処理
0DEFED BRA #$04 goto $0DEFF3
0DEFEF JSL $CDEFF6 SR: $0DEFF6 ガライが仲間に加わる処理
0DEFF3 RTL return
  • SR: $0DEFF6 ガライが仲間に加わる処理(新SR)
0DEFF6 COP goto $00FFE4
0DEFF7 JSL $CDAEB1 SR: $0DAEB1 カウンタが1000になるまで待機
0DEFFB JSL $CCD392 SR: $0CD392 キャラクターイベント中移動フラグON?
0DEFFF JSL $C4297C SR: $04297C 引数:1#$01 引数:2#$FF パーティ人数取得
0DF005 ASL A<<1
0DF006 TAY Y=A
0DF007 LDA $CFA5,Y A=$CFA5+Y 5人目の向き状態取得
0DF00A PHA Push A
0DF00B LDX $C5E5,Y X=$C5E5+Y 5人目のX座標取得?
0DF00E LDA $C625,Y A=$C625+Y 5人目のY座標取得?
0DF011 PHA Push A
0DF012 LDY $7F2A Y=$7F2A
0DF015 STA $D625,Y $D625+Y=A ガライの移動先X座標を実座標で指定
0DF018 TXA A=X
0DF019 STA $D5E5,Y $D5E5+Y=A ガライの移動先Y座標を実座標で指定
0DF01C PLA Pull A
0DF01D CMP #$08F7 A>=#$08F7?
0DF020 BCS #$06 if(c==on) goto $0DF028
0DF022 JSL $CCD59D SR: $0CD59D 指定座標にY軸→X軸の順でキャラクター移動
0DF026 BRA #$04 goto $0DF02C
0DF028 JSL $CCD58C SR: $0CD58C 指定座標にX軸→Y軸の順でキャラクター移動
0DF02C PLA Pull A
0DF02D LSR A>>1
0DF02E CMP #$0000 A==#$0000? 5人目の向きが上
0DF031 BNE #$06 if(z==off) goto $0DF039
0DF033 JSL $CCD837 SR: $0CD837 キャラクターを上に向かせる
0DF037 BRA #$1A goto $0DF053
0DF039 CMP #$0001 A==#$0001? 5人目の向きが右
0DF03C BNE #$06 if(z==off) goto $0DF044
0DF03E JSL $CCD83F SR: $0CD83F キャラクターを右に向かせる
0DF042 BRA #$0F goto $0DF053
0DF044 CMP #$0002 A==#$0002? 5人目の向きが下
0DF047 BNE #$06 if(z==off) goto $0DF04F
0DF049 JSL $CCD847 SR: $0CD847 キャラクターを下に向かせる
0DF04D BRA #$04 goto $0DF053
0DF04F JSL $CCD84F SR: $0CD84F キャラクターを左に向かせる
0DF053 JSL $CDADE6 SR: $0DADE6 カウンタに2000をセット
0DF057 LDA #$0004 A=#$0004
0DF05A TSB $35B4 A or $35B4
0DF05D JSL $CDAEE1 SR: $0DAEE1 カウンタが3000になるまで待機
0DF061 JSL $C75930 SR: $075930 キャラクター消滅
0DF065 JSL $CDADF4 SR: $0DADF4 カウンタに4000をセット
0DF069 RTL return
  • SR: $0CFF31 メルキド宿屋追加イベント処理(ガライ仲間追加)(新SR)
0CFF31 COP goto $00FFE4
0CFF32 JSL $CCE1D1 SR: $0CE1D1 イベント開始待ち?
0CFF36 JSL $CDAED1 SR: $0DAED1 カウンタが2000になるまで待機
0CFF3A JSL $C3BD64 SR: $03BD64 仲間増減時再描画処理?
0CFF3E JSL $CDADED SR: $0DADED カウンタに3000をセット
0CFF42 JSL $CDAEF1 SR: $0DAEF1 カウンタが4000になるまで待機
0CFF46 JSL $C737BE SR: $0737BE 引数:1#$104F メッセージ表示
0CFF4C JSL $CDACD2 SR: $0DACD2 キー入力でメッセージウィンドウを閉じる
0CFF50 JSL $CCD298 SR: $0CD298 イベント終了時処理?
0CFF54 RTL return

2点ほど注意点があります。1つ目は、5人目の座標に応じてガライの移動方法をX座標を先に合わせるか、Y座標を先に合わせるか変えることです。どうでもいいといえばいいのですが、これを無視するとガライが壁を突き破って移動することになるので。2つ目は、「ガライが仲間になった」フラグONのタイミングです。意味的にはガライとの会話が終わり移動を開始する寸前にONするほうが正しいようにも思えるのですが、それだと再描画のタイミングによってはガライが移動を開始する前に5人目が実体化されてしまうため、ガライの移動が完了した直後にONにする必要があります。実際便利ボタンでガライに話し掛けるとこの現象は起きず、メニューを表示させ「はなす」を選んでガライに話し掛けるとこの問題が起きるようです。おそらくガライに話し掛けた後にPC再描画処理が行われているためだと思われます(この問題は巨年末のファーストリリース直前に見つけました)。ちなみに、PCを再描画するだけでなぜ5人目が実体化されるかというと、「ガライが仲間になったフラグ」がONになっている状態でPC再描画処理を呼び出しているため、いままで透明で描画されていた5人目が実体化されて再描画される、という仕組みになっています。一度この仕組みを使いこなせるようになれば他の場所でも5人目の切り離し+つけ戻しはフラグのON/OFFをしてからPC再描画をすればいいだけになります。

というわけで懸案だった「5人目をNPCからPCに変える」処理は終わりです。次回は5人目がいることで影響のある部分の対応を行います。