DQ3 PCの情報管理1

盗賊の登録所のエントリでチラッと触れましたが、ゲストキャラの加入等を実現するためにPC*1の情報管理について必要に迫られて調査しました。パーティからキャラクターを外したり追加したりという処理はDQ3ではルイーダくらいでしかやらないので自分もろくに解析していませんでした(が必要に迫られて解析しました)。まず結論から言うと以下のようになっています。ちなみに、登録できる人数の最大はオリジナルでは22人(勇者を含めて)です。

7E36E2-3 現在のパーティ人数(*A)
7E36E4-5 酒場で待機中のPC人数(*B)
7E36E6-7 一時的に離脱しているPC人数(含バークで別れた商人)(*C)
7E36E8-3713(2Byte*22rec) 各PCの先頭アドレス(A,B,Cの順)

A,Bはそのとおりの意味です。Cはランシールの地球のへそ挑戦時、アッサラーム夜のパフパフ屋などによって一時的に切り離された仲間の人数がセットされます。順番はA、B、Cの順なので、1人になった場合は7E36E8-のアドレスの並びが一時的に変わります。パーティ人数などを取得するSRはSR: $04297Cで定義されています。このSRは引数を2個取り、1つめは取得したい種類、2つめはリターンする場所を指定しています。

(例)

  • SR: $$0351CC パーティ人数取得
0351CC JSL $C4297C SR: $04297C 引数:1#$01 引数:2#$FF
省略

このSRは内部でSR: $0429A3をコールしており、このSRが実体です。コール時にAレジスタに取得したい種類がセットされていることを前提としています。

  • SR: $0429A3 PC人数取得(パーティ人数,酒場待機中など)
0429A3 CMP #$0001 A==#$0001?
0429A6 BNE #$04 if(z==off) goto $0429AC
0429A8 LDA $36E2 A=$36E2 1ならパーティ人数
0429AB RTL return
0429AC CMP #$0004 A>=#$0004?
0429AF BCC #$11 if(c==off) goto $0429C2
0429B1 BNE #$04 if(z==off) goto $0429B7
0429B3 LDA $36E4 A=$36E4 4なら酒場待機人数
0429B6 RTL return
0429B7 CMP #$0005 A==#$0005?
0429BA BEQ #$02 if(z==on) goto $0429BE
0429BC BRA #$EA goto $0429A8
0429BE LDA $36E6 A=$36E6 5なら一時離脱人数
0429C1 RTL return
0429C2 CMP #$0002 A==#$0002?
0429C5 BNE #$08 if(z==off) goto $0429CF
0429C7 LDA $36E2 A=$36E2
0429CA CLC c=off
0429CB ADC $36E4 A+=($36E4+c) 2ならパーティ人数+酒場待機人数
0429CE RTL return
0429CF LDA $36E2 A=$36E2
0429D2 CLC c=off
0429D3 ADC $36E4 A+=($36E4+c)
0429D6 ADC $36E6 A+=($36E6+c) 3なら全登録人数
0429D9 RTL return

まとめると

1 パーティ人数
2 パーティ人数+酒場待機人数
3 前登録人数
4 酒場待機人数
5 一時待機人数

ということのようです。たいていは1しか使いませんが、酒場での仲間追加処理の時には4をコールして待機している仲間がいるかどうかを調べてメッセージを変えたり($03D8F3近辺)、登録時に最大数に達しているか($03DD13近辺)では1以外の引数を渡しています。とりあえず今回はここまで。次回はパーティ情報の操作について見ていきます。

*1:プレイヤーキャラクター