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 パーティ人数取得
0351CCJSL $C4297CSR: $04297C 引数:1#$01 引数:2#$FF
省略

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

  • SR: $0429A3 PC人数取得(パーティ人数,酒場待機中など)
0429A3CMP #$0001A==#$0001?
0429A6BNE #$04if(z==off) goto $0429AC
0429A8LDA $36E2A=$36E21ならパーティ人数
0429ABRTLreturn
0429ACCMP #$0004A>=#$0004?
0429AFBCC #$11if(c==off) goto $0429C2
0429B1BNE #$04if(z==off) goto $0429B7
0429B3LDA $36E4A=$36E44なら酒場待機人数
0429B6RTLreturn
0429B7CMP #$0005A==#$0005?
0429BABEQ #$02if(z==on) goto $0429BE
0429BCBRA #$EAgoto $0429A8
0429BELDA $36E6A=$36E65なら一時離脱人数
0429C1RTLreturn
0429C2CMP #$0002A==#$0002?
0429C5BNE #$08if(z==off) goto $0429CF
0429C7LDA $36E2A=$36E2
0429CACLCc=off
0429CBADC $36E4A+=($36E4+c)2ならパーティ人数+酒場待機人数
0429CERTLreturn
0429CFLDA $36E2A=$36E2
0429D2CLCc=off
0429D3ADC $36E4A+=($36E4+c)
0429D6ADC $36E6A+=($36E6+c)3なら全登録人数
0429D9RTLreturn

まとめると

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

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

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

コメント

タイトルとURLをコピーしました