正直実装したのがずいぶん前すぎて、この部分どうしてちゃんと動いてるのか仕組みを忘れてしまいました。あんまり思い出したくない部分なのでこのままになるかも。
さて、フィールド上のガライの動作がおおむねうまくいったので「ガライが仲間になるイベント」の実装を行います。ポイントは2点あります。
- NPCだったガライを仲間として動作する(5人目としてPCの一部として動く)部分をどう実装するか。
- ガライが5人目としてパーティに追加される際に「5人目」の座標をどうやって得るか。
お手本としてDQ6のレイドック王妃がパーティに加わる動画を見てみましたが「あらかじめ整列していたPCの後ろに5人目が加わる」となっていました。おそらく移動先の座標を固定で指定しているものと思われます。最後の手段として以前ロマリアの変更で使ったように、ガライに話し掛けたタイミングでPCを整列させることも考えましたが、試行錯誤した結果、以下の方法で違和感なくイベントの演出ができるようになりました。PCの整列も不要です。
- ガライが仲間になる条件を満たしていて(バラモス城の骸骨から光の鎧のヒントをもらっている)、かつマップがメルキド宿屋(フロアID=#$58)の場合では、PCの最後に「透明なPC」をもう一人つけた状態で初期化を行う。
- ガライに話しかけたあと、ガライは「透明なPC」の座標、向きを取得し、そこに向かって移動を行う。
- ガライが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で初期化されます。
コメント