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

正直実装したのがずいぶん前すぎて、この部分どうしてちゃんと動いてるのか仕組みを忘れてしまいました。あんまり思い出したくない部分なのでこのままになるかも。

さて、フィールド上のガライの動作がおおむねうまくいったので「ガライが仲間になるイベント」の実装を行います。ポイントは2点あります。

  1. NPCだったガライを仲間として動作する(5人目としてPCの一部として動く)部分をどう実装するか。
  2. ガライが5人目としてパーティに追加される際に「5人目」の座標をどうやって得るか。

お手本としてDQ6のレイドック王妃がパーティに加わる動画を見てみましたが「あらかじめ整列していたPCの後ろに5人目が加わる」となっていました。おそらく移動先の座標を固定で指定しているものと思われます。最後の手段として以前ロマリアの変更で使ったように、ガライに話し掛けたタイミングでPCを整列させることも考えましたが、試行錯誤した結果、以下の方法で違和感なくイベントの演出ができるようになりました。PCの整列も不要です。

  1. ガライが仲間になる条件を満たしていて(バラモス城の骸骨から光の鎧のヒントをもらっている)、かつマップがメルキド宿屋(フロアID=#$58)の場合では、PCの最後に「透明なPC」をもう一人つけた状態で初期化を行う。
  2. ガライに話しかけたあと、ガライは「透明なPC」の座標、向きを取得し、そこに向かって移動を行う。
  3. ガライが2の座標に移動し、「透明なPC」と同じ向きを向いたところで(透明でない)5人目を含んだ状態でPC再描画を行い、その後ガライのNPCを消滅させる。

というわけで実装に移ります。

  • SR: $063033 PC+NPCグラフィック描画?
063033 JSL $CDF97C SR: $0DF97C 5人目を透明にするべき条件か(該当c=on)
063037 BCC #$03 if(c==off) goto $06303C
063039 LDA #$FFFF A=#$FFFF
06303C CMP #$FFFF A==#$FFFF?
06303F BEQ #$33 if(z==on) goto $063074
063041 JSR $F512 SR: $06F512 追加NPCキャラクターインデックス置き換え(置換済c=on)
063044 BCS #$10 if(c==on) goto $063056
063046 JSR $F56B SR: $06F56B 追加NPC用キャラクターインデックス取得(実体)
063049-55 NOP
  • SR: $0DF97C 5人目を透明にするべき条件か(該当c=on)
0DF97C PHA Push A
0DF97D JSL $CDF5C1 SR: $0DF5C1 バラモス城の骸骨から光のよろいのヒントをもらっていていてマップIDがメルキド宿屋orバラモスの間か(該当c=on)
0DF981 BCS #$04 if(c==on) goto $0DF987
0DF983 JSL $CDF92E SR: $0DF92E 地球のへそ帰還時にガライ表示するか(該当c=on)
0DF987 BCS #$04 if(c==on) goto $0DF98D
0DF989 JSL $CDF9E4 SR: $0DF9E4 アッサラームぱふぱふ中か(該当c=on)
0DF98D PLA Pull A
0DF98E RTL return
  • SR: $0DF5C1 バラモス城の骸骨から光のよろいのヒントをもらっていていてマップIDがメルキド宿屋orバラモスの間か(該当c=on)
  • SR: $0DF92E 地球のへそ帰還時にガライ表示するか(該当c=on)
  • SR: $0DF9E4 アッサラームぱふぱふ中か(該当c=on)

省略

  • SR: $06F512 追加NPCキャラクターインデックス置き換え(置換済c=on)
06F512 PHX Push X
06F513 PHY Push Y
06F514 PHA Push A
06F515 LDA $7E353B A=$7E353B
06F519 AND #$0010 A&=#$0010
06F51C BNE #$09 if(z==off) goto $06F527
06F51E LDA $7E353B A=$7E353B
06F522 AND #$0020 A&=#$0020
06F525 BEQ #$18 if(z==on) goto $06F53F
06F527 JSL $C90572 SR: $090572 引数:1#$00 引数:2#$0009 引数:3#$CE2000 引数:4#$0002 引数:5#$0000FF
06F536 CMP #$0000 A==#$0000?
06F539 BEQ #$04 if(z==on) goto $06F53F
06F53B STA $01,S Stack($01)=A
06F53D BRA #$24 goto $06F563
06F53F LDA $7E353B A=$7E353B
06F543 AND #$0040 A&=#$0040
06F546 BEQ #$16 if(z==on) goto $06F55E
06F548 LDX $3530 X=$3530
06F54B JSL $C90572 SR: $090572 引数:1#$00 引数:2#$0002 引数:3#$C89839 引数:4#$0000 引数:5#$0000FF
06F55A STA $01,S Stack($01)=A
06F55C BRA #$05 goto $06F563
06F55E PLA Pull A
06F55F PLY Pull Y
06F560 PLX Pull X
06F561 CLC c=off
06F562 RTS return
06F563 PLA Pull A
06F564 PLY Pull Y
06F565 PLX Pull X
06F566 JSR $F58A SR: $06F58A 追加NPC用キャラクターインデックス取得(空)
06F569 SEC c=on
06F56A RTS return
  • SR: $06F58A 追加NPC用キャラクターインデックス取得(空)
06F58A PHX Push X
06F58B PHA Push A
06F58C AND #$7FFF A&=#$7FFF
06F58F TAX X=A
06F590 LDA #$0000 A=#$0000
06F593 STA $EA21 $EA21=A
06F596 LDA #$00FF A=#$00FF
06F599 STA $EA23 $EA23=A
06F59C PLA Pull A
06F59D PLX Pull X
06F59E RTS return

これで、バラモス城で骸骨からヒントをもらった後、メルキドの宿屋に入ると、見た目は4人ですが、内部では5人目が透明の状態で付いているPCで初期化されます。