盗賊の登録所のエントリでチラッと触れましたが、ゲストキャラの加入等を実現するために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:プレイヤーキャラクター
コメント