5.26. 性格解析

5.26.1. 解析
5.26.1.1. $C424BC 性格構造体
5.26.2. データ

性格構造体 $C424BC のメンバー解析を行う。 性格に関係しそうなデータと言われて、名前文字列 ID とレベルアップ時のパラメータ上昇に関係する値、 あとは性別データくらいしか思い浮かばないかもしれないが、 ドラクエらしい風変わりなパラメータも、しっかりとこの構造体が定義している。

5.26.1. 解析

性格構造体の存在に気付くのは、次の 4 通りが考えられるので、 ロムイメージ解析の比較的早い段階で、データ定義位置を特定できるだろう。

  • ダーマでの転職処理の解析
  • ルイーダの酒場の処理の解析
  • レベルアップ処理の解析
  • すごろくで性格が変わるイベントの解析

次に、構造体のメモリレイアウトを調べる。 すなわち、各メンバーをビットフィールドとして見るときの長さ、 それらがどのように構造体内部で配置されているかを解析していく。 それには、構造体内部データをプログラムがどのように取得しているかをすべて見ればよい。 $C426F0 が各性格構造体データの格納アドレス値の配列となっていることもすぐに気付くので、 性格構造体データの各メンバー取得の方法として、 構造体データの値を取得する汎用サブルーチンを利用していることがわかる。 以下に、プログラムが「性格 ID を与えて、それが性別制限がある場合にその性別を取得する」という処理を引用する。 このようなパターンを、力任せにロムイメージから検索しつくせばよい。

C4/6C15:    DA          PHX
C4/6C16:    AA          TAX
C4/6C17:    227205C9    JSR $C90572    1
C4/6C1B:    01
C4/6C1C:    0C00        2
C4/6C1E:    F026C4      3
C4/6C21:    0700        4
C4/6C23:    030000      5
C4/6C26:    FA          PLX
C4/6C27:    6B          RTL

1

SFC 版ドラクエ 3 の全プログラムコード内において、 サブルーチン $C90572 の呼び出し行の直後には、 必ず 11 バイトの「実引数」が静的に与えられている。 この値を見ることで、ROM 内に静的に存在する構造体データ配列の定義が解析できる。 配列のインデックスを X レジスタで与える。 これは取りも直さず性格 ID そのものだ。

2

この行の 2 バイトで示される数は、 性格構造体データ一個当たりのバイトサイズを示している。 #$00C0 すなわち 12 バイトだ。

3

この行の 3 バイトで示される数は、 構造体配列の存在するアドレスを示している。 この場合「性格構造体データ配列は ROM 内のアドレス $C426F0 に置かれている」 と解釈できる。

4

この行の 2 バイトで示される数は、 一つの構造体データ内のどの位置のバイト列にアクセスするのかを意味する。 構造体データの先頭アドレスからのバイト単位でのオフセット量で指示している。 この場合は 7 バイト目を要求している。

5

データをバイト単位でなく、より細かい粒度で欲しい場合にビットマスクを指示する。 この場合、上記のバイト列が表現する数値に #$000003 で AND マスクをかけ、 下位 2 ビットを得ることになる。

5.26.1.1. $C424BC 性格構造体

アドレス $C424BC からすべての性格構造体データが定義されている。 ひとつの構造体データが占めるデータサイズは #$000C バイト であり、 #$2F (47) 個配列されている。

また、アドレス $C426F0 からは、各データへの先頭アドレスを格納する配列となっている。 ただし、$C426F0 (1バイト) だけはデータバンク #$C2 を意味する。

性格構造体のメモリレイアウトは以下のようになっている。 "..." となっている部分は、データフィールドがバイト境界をまたぐことを示す。

表 5.38 $C424BC 性格構造体

Byte:Bit 80 40 20 10 08 04 02 01
00 文字列 ID
01
02 ちから上昇補正
03 すばやさ上昇補正
04 たいりょく上昇補正
05 かしこさ上昇補正
06 うんのよさ上昇補正
07 ... 性格変化 女 性格変化 男 登録所台詞 性別
08 ... 武闘家転職 戦士転職...
09 ... 魔法使い転職 僧侶転職...
0A ... 商人転職 賢者転職...
0B 未使用 盗賊転職 遊び人転職...

文字列 ID

性格の名前を表す文字列 ID である。

ちから上昇補正

キャラクターのレベルアップ時に「ちから」を上昇させるときに参照するフィールドである。 「ちから」に対する補正係数のような役割を果たす。 レベルアップによる「ちから」の変更アルゴリズムは、 おおまかに書けば以下のようになっている。 当フィールドは以下の強調した箇所にのみ影響すると考えてよいが、 このフィールドの値のみで補正されるわけではないため、 厳密な解説を与えることが(記者の能力では)難しい。

  • レベルに相応しい「ちから」の値を計算する。
  • 相応しい値が現在の「ちから」の値に比べて、

    • それ以上であれば: 「ちから端数」の増分値と「ちから」の増分値を、職業・レベル・性格・(正規分布系)乱数により、それぞれ決定する。

    • それ未満であれば: 「ちから端数」増分値をレベルそのものとし、 「ちから」増分値を 0 または 1 とする。

  • 「ちから端数」「ちから」をそれぞれ上で求めた値で加算
  • この時点で「ちから」が相応しい値未満であれば:

    • 「ちから」= 相応しい値
    • 「ちから端数」= 0

ちなみに「ちから端数」というのは、「ちから」同様にキャラクター構造体 $7E3925 のフィールドである。 ナンバーズくじのキャリーオーバーのような役割を果たす。 上記にあるように、レベルアップごとに増加していき、 255 を越えた時点で「ちから」本体がさらに 1 ポイント加算されるようなイメージでよい。

すばやさ上昇補正

上述「ちから」のすばやさ版である。

たいりょく上昇補正

上述「ちから」のたいりょく版である。

かしこさ上昇補正

上述「ちから」のかしこさ版である。

うんのよさ上昇補正

上述「ちから」のうんのよさ版である。

性別

登録所で新規キャラクターを登録する際に、 その初期性格を決定するために参照するフィールドである。 性格を決定の項を参照。

登録所台詞

ルイーダの酒場二階の登録所で新規キャラクターを登録する際に、 登録屋が性格を評価する台詞 ID 配列 $C3E2EA のインデックスである。 登録屋が性格を告げるサブルーチンの項を参照。

性格変化 男

すごろくの「?」マスのランダムイベントのひとつである 「はげしい炎は すべてを無に帰し~」において、 性格変更処理サブルーチン $C56D90 が参照するフィールドである。

すごろくを攻略しているキャラクターの性別が男のとき、 このフィールドが 1 である性格のどれかランダムに変えられる。

性格変化 女

上述「性格変化 男フィールド」の女版である。

戦士転職

ダーマの神殿でキャラクターが戦士に転職するときに、 性格によっては神官の台詞が変わるときがある。 このフィールドはそれを決める値である。 詳しくは、性格によっては神官がコメントを出すサブルーチンの項を参照。

武闘家転職

上述した「戦士転職」フィールドの武闘家版である。

僧侶転職

上述した「戦士転職」フィールドの僧侶版である。

魔法使い転職

上述した「戦士転職」フィールドの魔法使い版である。

賢者転職

上述した「戦士転職」フィールドの賢者版である。

商人転職

上述した「戦士転職」フィールドの商人版である。

遊び人転職

上述した「戦士転職」フィールドの遊び人版である。

盗賊転職

上述した「戦士転職」フィールドの盗賊版である。

5.26.2. データ

付録 B データ