3.11. 仲間キャラクターの特性データ

3.11.1. レベルアップ構造体
3.11.2. 習得能力構造体
3.11.3. 初期状態
3.11.4. 人間またはモンスター固有の属性
3.11.5. 名前

この節では、3.4.1 構造体 $7E2040: パーティーメンバー表現 で説明した型のオブジェクトを構成するのに必要な型やオブジェクトについて述べる。

まずは仲間キャラクターのレベルアップに関係するデータ構造について述べる。 一つは、各レベルに到達する必要経験値の計算に用いられる定数と、特定のレベル群における属性値の既定値をカプセル化した型だ。 もう一つは、各レベルで習得する能力、すなわち移動時および戦闘時コマンドを定義する型だ。

さて、仲間キャラクターがレベルアップを一度もしていない状態というのも当然考慮しなければならない。 この状態を表現するデータが、人間とモンスターとで別々に定義されている。それぞれについて説明する。

さらに、仲間キャラクターの属性には、人間固有のものとモンスター固有のものとがある。 それらの属性とそれぞれが取り得る値について述べる。

最後に、仲間キャラクターの名前について簡単に説明する。

なお、この節で採り上げる特性データのうち、規模の大きいものを CSV ファイルとして 付録 B データ に収録する。 一部の変則的なデータ収納方式を採るものについては、ここで示すアドレスと異なるアドレスをファイル名に含めてあるので注意して欲しい。

3.11.1. レベルアップ構造体

アドレス $239E41 には次の表が示す、かなりサイズが大きい型のオブジェクトの配列がある。 本節ではこの型をレベルアップ構造体と呼ぼう:

表 3.31 構造体 $239E41: レベルアップ構造体

オフセット 属性
#$00 レベル区間数
#$01 レベル 2 の必要経験値
#$02 レベル区間境界値 0
...
#$08 レベル区間境界値 6
#$09 #$07 経験値計算用引数 0
#$F8
...
#$10 #$07 経験値計算用引数 7
#$F8
#$11 さいだいHP標準値 0
...
#$19 さいだいHP標準値 8
#$1A さいだいMP標準値 0
...
#$22 さいだいMP標準値 8
#$23 ちから標準値 0
...
#$2B ちから標準値 8
#$2C すばやさ標準値 0
...
#$34 すばやさ標準値 8
#$35 みのまもり標準値 0
...
#$3D みのまもり標準値 8
#$3E かしこさ標準値 0
...
#$46 かしこさ標準値 8
#$47 うんのよさ標準値 0
...
#$4F うんのよさ標準値 8

レベル区間数

レベル区間数とは、このオブジェクトに定義されているレベル区間の個数のことだ。

レベル 2 の必要経験値

レベル 2 の必要経験値とは、このオブジェクトに対応するキャラクターが、 そのレベルが 2 であるときの経験値の下限値を意味する。

対応キャラクターのレベル最小値が 2 でなくても、この属性には意味があるので注意。

レベル区間境界値 i (i = 0, 1, ..., レベル区間数 - 1)

レベル区間境界値とは、レベル区間 i の下限値だ。 ただし、最初のレベル区間は下限値と上限値をそれぞれ 2 とレベル区間境界値 0 とする。 最後のレベル区間は下限と上限をそれぞれレベル区間境界値ラスト、 そのキャラクターの最大レベルとする。

TODO: 例を示す。

経験値計算用引数 i (i = 0, 1, ..., レベル区間数 - 1)

経験値計算用引数とは、対応するキャラクターのレベルがレベル区間 i に含まれる値のどれかであるために必要な経験値を計算するサブルーチンに引き渡す実引数のことだ。

経験値の計算アルゴリズムについては後述する。

さいだいHP標準値 i (i = 0, 1, ..., レベル区間数)

さいだいHP標準値 i とは、対応するキャラクターのレベルがレベル区間境界値 i であるときの、 そのキャラクターのさいだいHPの値を意味する属性だ。 ただし、実際にはその半分の値を保持していて、計算部で倍にする。

さいだいMP標準値 i (i = 0, 1, ..., レベル区間数)

さいだいMP標準値はさいだいHP標準値と同様の扱いの属性だ。

ちから標準値 i (i = 0, 1, ..., レベル区間数)

ちから標準値とは、対応するキャラクターのレベルがレベル区間境界値 i であるときの、 そのキャラクターのちからの値を意味する属性だ。 こちらは実際の値を直接表現している。

すばやさ標準値 i, みのまもり標準値 i, かしこさ標準値 i, うんのよさ標準値 i

これらの属性の意味はちから標準値のそれに準じる。

TODO: 必要経験値算出アルゴリズムの説明。 算術計算のコードも効率も素晴らしい傑作なので是非紹介したい。

3.11.2. 習得能力構造体

習得能力構造体と銘打ってしまったが、「レベルに応じて習得する能力」の表現に関するデータが実は複数 ROM 中にある。 便宜上、それらを統合した概念を習得能力構造体と呼んでしまうことにする。 一方は習得レベルと対応する習得能力の組の集合であり、他方は習得可能な能力の配列だ。

前者は具体的には次のような不定サイズのデータで表現されている:

表 3.32 構造体 $23B819: 習得レベル定義

オフセット 意味
#$00 要素数
#$01 移動時呪文習得フラグ
#$02 戦闘時コマンド習得フラグ
#$03
(以下、要素数分だけフラグ組を繰り返す)

要素数

要素数とは、データ内に存在するフラグ組の個数のことだ。 ゼロの場合にはフラグ組定義がない、つまり特殊技能のないキャラクターであることを意味する。

移動時呪文習得フラグ

移動時呪文習得フラグとは、仲間キャラクター構造体 $7E2040 のオフセット #$23 に作用するビットマスクの値だ。 このビットがオンになることで、対応する呪文を使用することが許される。

戦闘時コマンド習得フラグ

戦闘時コマンド習得フラグとは、仲間キャラクター構造体 $7E2040 のオフセット #$24..#$25 に作用するビットマスクの値だ。 このビットがオンになることで、対応する呪文または特技を使用することが許される。

習得可能な能力の集合のほうは不定サイズのコマンド ID の配列の形式で定義されている:

表 3.33 構造体 $23BE27: 習得能力配列

オフセット 意味
#$00 要素数
#$01 コマンド ID
(以下、要素数分だけコマンド ID を繰り返す)

コマンド ID とは、3.9.3 一般のコマンド の意味でのコマンドテーブルの列 ID とみなせる。 この配列と先の構造体との関係は、フラグの桁とコマンド ID のある配列添字とが対応するということだ。

3.11.3. 初期状態

仲間キャラクターの初期状態とは、それを仲間にした直後における $7E2040 オブジェクトの「値」を意味する。 仲間キャラクターが人間であれば、この値は配列 $23C014 に直接定義されている。 一方、モンスターの場合には次の型からなるオブジェクトの配列 $23AED1 に定義されている値を用いる。 これは変則的な扱いなのだが、ベビーパンサーとキラーパンサーについては人間方式で初期化を行う。

このプログラムは同じ役割を果たす型を、人間キャラクターとモンスターキャラクターとで別々に定義することがよくあるのだが、 初期状態においてもその手法を採っている。 モンスターの仲間では、初期状態における所持品と装備品とを考慮せずに済むので、その分のメモリが節約できるということだろう。

構造体 $23C014 については 3.4.1 構造体 $7E2040: パーティーメンバー表現 で述べたものと同型だ。

構造体 $23AED1 は次の表に示すような構成だ:

表 3.34 構造体 $23AED1: 仲間モンスター初期状態

オフセット 属性
#$00 初期レベル
#$01 最大レベル
#$02 ちから
#$03 みのまもり
#$04 かしこさ
#$05 うんのよさ
#$06 さいだいHP
#$07 さいだいMP
#$08 #$0F 装備クラス
#$30さいだいHP
#$C0(unknown)

初期レベル

初期レベルとは、このモンスターを仲間にした時点におけるそのレベルの値を意味する。

最大レベル

最大レベルとは、このモンスターが到達し得るレベルの値の最大値を意味する。

ちから, みのまもり, かしこさ, うんのよさ, さいだいHP, さいだいMP

これらの属性は、このモンスターを仲間にした時点におけるそれぞれの値を意味する。

さいだいHPは物理的に二箇所で定義されているが、これはデータ長が 1 バイトに収まらないからそうしている。

装備クラス

この属性だけ初期状態と関係がない概念だ。 $7E2040 オブジェクトの属性値とはならない。

装備クラスとは、このモンスターが何を装備できるのかを決定する数値だ。 データサイズが 4 ビットなので 16 種類のクラスがある。 この値が 3.13.9 配列 $23B669: 装備許可フラグ(モンスター) で示した順序と対応する。

3.11.4. 人間またはモンスター固有の属性

戦闘中のメダパニ状態における振る舞いを決定するときには、 プログラムは仲間キャラクターを「おとこ」「おんな」「???」の三つに分類する。 まずキャラクターがモンスターであるかどうかを調べ、それから性別配列 $23C236 を参照する。 短い配列なので、ここで全データを引用する:

23/C236:    00 ; 主人公
23/C237:    00 ; クーパー
23/C238:    01 ; アニー
23/C239:    01 ; ビアンカ
23/C23A:    01 ; ビアンカ
23/C23B:    00 ; サンチョ
23/C23C:    00 ; ピピン
23/C23D:    01 ; フローラ
23/C23E:    00 ; パパス
23/C23F:    00 ; ヘンリー
23/C240:    01 ; ベラ

人間とモンスターとで異なる属性といえば、移動中の「つよさ」ウィンドウで「せいべつ」欄の真上に表示される部分だ。 人間の場合は文字列配列 $23C5F9 のインデックスを属性値として取る。 この配列の具体的な内容については付録の文字列テーブルを参照して欲しい。

一方、仲間がモンスターならば、属性値としてはそのモンスター ID を取る。 一応断っておくと、モンスター ID とはモンスターデータテーブル $238000 の列 ID を意味する。 仲間モンスター ID からモンスター ID への対応は配列 $23D72D で定義されている:

23/D72D:    0E  ; ベビーパンサー
23/D72E:    59  ; キラーパンサー
23/D72F:    00  ; スライム
23/D730:    03  ; ドラキー
...
23/D755:    C5  ; ヘルバトラー
23/D756:    D7  ; ネーレウス

3.11.5. 名前

通常、仲間キャラクターは名前で呼ぶ。 仲間キャラクターが人間であれば、主人公とその子供らはプレイヤーが名前を文字列の入力によって設定する。 それ以外は既定の文字列を参照するだけであり、その配列はアドレス $23C5CE にある。 モンスターの仲間キャラクターについては、モンスター ID と仲間順位情報の両方を用いて文字列配列 $23C242 の対応要素を参照する。

主人公、息子、娘の名前を示す文字列はアドレス $7E2001, $7E2009, $7E2011 に格納される。 ただし、その既定値はアドレス $23D6ED にある、ある種の初期化データの一部で与えられている。

23/D6ED:    01 ; 00:
23/D6EE:    01 ; 01:
23/D6EF:    01 ; 02:
23/D6F0:    01 ; 03:
23/D6F1:    01 ; 04:
23/D6F2:    01 ; 05:
23/D6F3:    01 ; 06:
23/D6F4:    01 ; 07:
23/D6F5:    01 ; 08:
23/D6F6:    49 ; 09: ク
23/D6F7:    78 ; 0A: ー
23/D6F8:    83 ; 0B: ゜
23/D6F9:    5B ; 0C: ハ
23/D6FA:    78 ; 0D: ー
23/D6FB:    01 ; 0E:
23/D6FC:    01 ; 0F:
23/D6FD:    01 ; 10:
23/D6FE:    42 ; 11: ア
23/D6FF:    57 ; 12: ニ
23/D700:    78 ; 13: ー
23/D701:    01 ; 14:
23/D702:    01 ; 15:
23/D703:    01 ; 16:
23/D704:    01 ; 17:
23/D705:    01 ; 18:

文字列配列 $23C5CE および $23C242 については、 付録の文字列テーブルを参照して欲しい。