4.21. 戦闘キャラクター構造体

4.21.1. 構造体 $7E2030: 戦闘キャラクター
4.21.2. 戦闘キャラクター構造体メソッド

本節では、戦闘キャラクター構造体各種のメモリーレイアウトを表で示し、また各メンバーデータの意味とアクセス例とをごく簡単に記す。 前作では自陣側と敵陣側とで異なる型を使い分けていたが、本作では両者とも同じ型のオブジェクトで戦闘員を表現する。

4.21.1. 構造体 $7E2030: 戦闘キャラクター

次の表で示されるメモリーレイアウトで構成される、サイズが #$34 バイトのオブジェクトがアドレス $7E2030 から 24 個直列している。 戦闘開始時に、自陣および敵陣のメンバーの配列に準じて、これらのオブジェクトが初期化される。 そして、戦闘の状況が変化するにつれて、これらのオブジェクトの状態も変化していく、というものだ。

以下、この構造体の各属性を詳しく見ていくことにする。

表 4.89 構造体 $7E2030

オフセット 属性
#$00 #$FFFF HP
#$02 #$FFFF MP
#$04 #$01FF 戦闘コマンド 0
#$05 #$00FE 戦闘コマンド対象 0
#$06 #$01FF 戦闘コマンド 1
#$07 #$00FE 戦闘コマンド対象 1
#$08 #$01FF 戦闘コマンド 2
#$09 #$00FE 戦闘コマンド対象 2
#$0A #$FFFF 敵キャラクター位置
#$0C #$FFFF MHP
#$0E #$FFFF HP + 総合対策評価値
#$10 #$FFFF 呪文対策評価値
#$12 #$FFFF おどり対策評価値
#$14 #$FFFF 炎・吹雪対策評価値
#$16 #$FFFF 打撃対策評価値
#$18 #$FFFF 一般的対策評価値
#$1A #$FFFF 総合対策評価値
#$1C #$FFFF 誰の歌声の余韻に浸っているか
#$1E #$0007 グループ
#$1E #$0008 スカラ・ルカニ状態
#$1E #$0010 おいかぜ状態
#$1E #$0020 バイキルト状態
#$1E #$0040 ドア閉め状態
#$1E #$0080 ちからがみなぎる状態
#$1F #$00FF キャラクター・モンスター ID
#$20 #$0001 自陣・敵陣フラグ
#$20 #$0002 死亡状態
#$20 #$0004 アストロン状態
#$20 #$0008 マヒ状態
#$20 #$0010 戦闘コマンド判断良化フラグ
#$20 #$00E0 ラリホーカウンター
#$21 #$01FF 変身相手
#$22 #$0002 メダパニ状態
#$22 #$0004 変身状態
#$22 #$0008 マホトーン状態
#$22 #$0010 マヌーサ状態
#$22 #$0020 砂煙状態
#$22 #$00C0 まぶしいひかりカウンター
#$23 #$001F モシャス相手添字
#$23 #$0020 モシャス状態
#$23 #$0040 マホキテ状態
#$23 #$0080 フバーハ状態
#$24 #$000F 防御状態
#$24 #$00F0 どうぐつかうコマンド添字
#$25 #$0001 マジックバリア状態
#$25 #$0002 ぶきみなひかり状態
#$25 #$003C 同一モンスター識別子
#$25 #$00C0 やすみ・アストロンカウンター
#$26 #$000F やすみ分類
#$26 #$0010 炎・吹雪コマンドを相手に実行された
#$26 #$0020 呪文コマンドを相手に実行された
#$26 #$0040 おどりコマンドを相手に実行された
#$26 #$0080 せいれいのうた状態
#$27 #$001F 特殊防御対象のキャラクター添字
#$27 #$0020 集中攻撃フラグ
#$27 #$0040 戦闘コマンド実行を無視するかどうか
#$27 #$0080 メダパニ状態から回復した直後かどうか
#$28 #$03FF 守備力
#$29 #$000C ちからため系カウンター
#$29 #$0030 ちからため系分類
#$29 #$0040 マホカンタ状態
#$29 #$0080 マホターン状態
#$2A #$03FF 攻撃力
#$2B #$0FFC すばやさ
#$2C #$3FF0 コマンド実行優位
#$2D #$0040 おどりふうじ状態
#$2D #$0080 こおりつき状態
#$2E #$0003 まねまね反応準備状態
#$2E #$0004 馬車待機中フラグ
#$2E #$0018 みかわしきゃく系カウンター
#$2E #$00E0 戦闘コマンド決定用カウンター
#$2F #$0001 アクティブフラグ
#$2F #$00FE 集中攻撃の対象
#$30 #$00FF どうぐつかうコマンドアイテム ID
#$31 #$001F キャラクター添字
#$31 #$0020 もうどく状態
#$31 #$0040 どく状態
#$31 #$0080 戦闘コマンドがどうぐつかう
#$32 #$0007 戦闘コマンドアニメーション 0
#$32 #$0038 戦闘コマンドアニメーション 1
#$32 #$01C0 戦闘コマンドアニメーション 2
#$33 #$00FE (未使用)

HP, MP

それぞれこの戦闘員の現在の HP と MP の値を保持するための属性だ。

戦闘コマンド k (k = 0, 1, 2)

この戦闘員が実行するコマンドの ID を値に取る属性だ。 ここでいうコマンド ID とは、コマンドオブジェクトの配列 $C8C65D の添字を意味する。

戦闘コマンドについては 4.22 戦闘コマンド で述べる。

戦闘コマンド対象 k (k = 0, 1, 2)

戦闘コマンド k を実行する相手を表現する 7 ビット長の数を値に取る属性だ。 この数は戦闘員インデックスと対象範囲を示すビットとの論理和で構成されている。

以下、サブルーチン $C26158 から読み取れる 7 ビット値の仕様を記す。 ビット #$40 が立っていると、コマンド k の対象は複数グループに及ぶか、または空となる。 このとき、下位ビットで敵陣・自陣・両方等の詳細を表現する。 ビット #$01 が 1 ならば敵陣すべてのグループを、 ビット #$02 が 1 ならば自陣すべてのグループを、 そしてビット #$04 が 1 ならばここから特定の誰かを選ばずにそのままコマンド対象とする。

ビット #$20 が立っていると、コマンド k の対象は一つのグループとなる。 このとき、下位ビットがグループ添字を表す。

ビット #$60 がどちらもゼロであれば、この値全体が戦闘員添字を直接表現する。

敵キャラクター位置

これは敵陣側専用の属性であり、登場順に 0, 2, 4, ... のように割り振られる値を取る。

MHP

この戦闘員の最大 HP の値を保持するための属性だ。

HP + 総合対策評価値

これは導出属性であり、上述の HP 属性の値と後述する総合対策評価値属性の値の和を保持する。 自陣キャラクターが AI により戦闘コマンドを決定する際に、この値が考慮されるようだ。 詳細は戦闘 AI の節で述べることにする。

呪文対策評価値

呪文対策評価値とは、この戦闘員がどれだけ強力な呪文コマンド実行能力を有するかを表す数値を取る属性だ。 もしこの戦闘員がマホトーン状態でもなく、かつ MP の値もゼロでなければ、 この属性値はモンスター ID から一意に決まる値で確定する。さもなくばゼロとする。

おどり対策評価値

おどり対策評価値とは、この戦闘員がどれだけ強力なおどりコマンド実行能力を有するかを表す数値を取る属性だ。 もしこの戦闘員がおどりふうじ状態になければ、 この属性値はモンスター ID から一意に決まる値で確定する。さもなくばゼロとする。

炎・吹雪対策評価値

炎・吹雪対策評価値とは、この戦闘員がどれだけ強力な炎・吹雪コマンド実行能力を有するかを表す数値を取る属性だ。 この属性値はモンスター ID から一意に決まる値で確定する。

打撃対策評価値

打撃対策評価値とは、この戦闘員が打撃系コマンドをどれほど得意とするかを表す数値を取る属性だ。 この属性値はモンスター ID から一意に決まる値で確定するが、 この戦闘員がマヌーサ状態、すなけむり状態、まぶしいひかり状態などであれば、その値を半減して評価する。

一般的対策評価値

一般的対策評価値とは、この戦闘員が上述したもの以外の脅威をどれほど有するかを表す(と思われる)数値を取る属性だ。 この属性値はモンスター ID から一意に決まる値で確定する。

総合対策評価値

総合対策評価値とは、呪文対策評価値、おどり対策評価値、炎・吹雪対策評価値、打撃対策評価値、 そして一般的対策評価値の 5 属性の値の和を保持する属性だ。 便宜上「総合」と言ったが、最終的に評価される値は前述の HP との和を取ったものだ。

誰の歌声の余韻に浸っているか

あそびコマンドの一つであるひきがたりがこの戦闘員に効いているときに、 そのコマンド実行者の戦闘員インデックスを値に取る属性だ。

グループ

この戦闘員が所属するグループ ID を値に取る属性だ。次の対応関係により定まる。

表 4.90 グループ

ID 意味
0 敵陣グループ 0
1 敵陣グループ 1
2 敵陣グループ 2
3 敵陣グループ 3
4 敵陣に「しょうかん」した精霊グループ
5 自陣に「しょうかん」した精霊グループ
6 自陣グループ
7 (未使用)

スカラ・ルカニ状態

この戦闘員がスカラ系またはルカニ系のコマンドを適用されている状態であることを示すブーリアン値を取る属性だ。

おいかぜ状態

この戦闘員がおいかぜコマンドを適用されている状態であることを示すブーリアン値を取る属性だ。

バイキルト状態

この戦闘員がバイキルトコマンドを適用されている状態であることを示すブーリアン値を取る属性だ。

ドア閉め状態

この戦闘員が馬車のドアを閉めるコマンドを実行中であることを示すブーリアン値を取る属性だ。 これは敵陣キャラクター専用の属性だ。

ちからがみなぎる状態

この戦闘員がパルプンテの効果の一つである、ちからがみなぎる状態であることを示すブーリアン値を取る属性だ。

キャラクター・モンスター ID

この戦闘員が自陣側に属していればキャラクター ID を、敵陣側に属していればモンスター ID を値に取る属性だ。 前者は配列 $C8BD12 等の添字であり、 後者は配列 $C20154 等の添字だ。

自陣・敵陣フラグ

この戦闘員が自陣側なのか敵陣側なのかを示すブーリアン値を取る属性だ。 値が 1 であれば自陣側メンバーであることを意味する。

死亡状態

この戦闘員が死亡しているのかどうかを示すブーリアン値を取る属性だ。

アストロン状態

この戦闘員がアストロンのコマンドを適用されていることを示すブーリアン値を取る属性だ。 これはアストロンカウンターの属性と関係がある。

マヒ状態

この戦闘員がマヒしていることを示すブーリアン値を取る属性だ。

戦闘コマンド判断良化フラグ

この属性はブーリアン値を取り、この戦闘員が何らかのコマンド実行が不発に終わったときに 1 に更新される。 この値が 1 であり、かつ戦闘員の選択判断能力属性値が 1 であれば、次回からのコマンド選択がスマートになるようだ。 ちなみに戦闘員の選択判断能力属性値が 1 以外であれば、戦闘コマンド判断良化フラグは参照されない。

ラリホーカウンター

この戦闘員が眠っていることを示す値を取る属性だ。 値がゼロでない値からゼロに変化すると、この戦闘員は目を覚ます。

変身相手

この戦闘員がモシャス、ドラゴラム、へんしんのいずれかのコマンドを使用中ならば、 その相手のキャラクター、ドラゴラム用モンスターデータ、へんしん用モンスターデータの ID をそれぞれ値に取る属性だ。 それらのコマンドのいずれも使用中でなければ、自身のモンスター ID を値に取る。

この属性は変身状態属性やモシャス状態属性と関係がある。

メダパニ状態

この戦闘員が混乱していることを示すブーリアン値を取る属性だ。

変身状態

この戦闘員がドラゴラムやへんしんの各コマンドを使用したことによる、特殊な状態にあることを示すブーリアン値を取る属性だ。 変身相手属性と関係がある。

マホトーン状態

この戦闘員がマホトーン等を適用されていることにより、呪文コマンドを封じられている状態にあることを示すブーリアン値を取る属性だ。

マヌーサ状態

この戦闘員がマヌーサを適用されていることにより、直接攻撃系コマンドの成功率が低下する状態にあることを示すブーリアン値を取る属性だ。

砂煙状態

この戦闘員がすなけむりコマンドを適用されていることを示すブーリアン値を取る属性だ。

まぶしいひかりカウンター

この戦闘員がまぶしいひかりコマンドを適用されていることを示す値を取る属性だ。

モシャス相手添字

この戦闘員がモシャスコマンドを使用しているときの、モシャス対象キャラクターの 配列 $7E2030 の添字を値とする属性だ。 モシャス状態属性や変身相手属性と関係がある。

モシャス状態

この戦闘員がモシャスコマンドを使用していることを示すブーリアン値を取る属性だ。 モシャス相手添字属性や変身相手属性と関係がある。

マホキテ状態

この戦闘員がマホキテコマンドを使用していることを示すブーリアン値を取る属性だ。

フバーハ状態

この戦闘員がフバーハコマンドを使用していることを示すブーリアン値を取る属性だ。

防御状態

この戦闘員が次のいずれかのコマンドを実行中であることを表現する属性だ。 表の左列と右列はそれぞれ属性値と戦闘員が実行中のコマンドを示す:

表 4.91 防御分類

実行中のコマンド
0 (なし)
1 うけながし
2 だいぼうぎょ
3 ぼうぎょ2
4 ぼうぎょ
5 みがわり
6 におうだち
7 すてみ
8 まねまね

どうぐつかうコマンド添字

この戦闘員が所持品のアイテムを使用することによるコマンドを実行するときに、 その道具袋におけるアイテム位置を値に取る属性だ。 これは自陣側戦闘員専用の属性だ。

マジックバリア状態, ぶきみなひかり状態

この戦闘員がマジックバリアまたはぶきみなひかりコマンドをそれぞれ適用されていることを示すブーリアン値を取る属性だ。 ただし、両者の値が同時に 1 であってはならない。

同一モンスター識別子

敵陣側にモンスター ID が同じ戦闘員が現れるときに、それらを識別するためのゼロからの連番を取る属性値だ。 このような場合にはウィンドウではモンスター名の末尾にアルファベット一文字が付されるが、その配列添字を意味する。

やすみ・アストロンカウンター

この戦闘員がやすみ状態またはアストロン状態にあるときに、この効果がどれくらい続くのかを表現する数値を取る属性だ。

やすみ分類

この戦闘員がどのやすみ状態にあるかを示す値を取る属性だ。 属性値と適用されているコマンドとの対応は次のとおりだ:

表 4.92 やすみ分類

コマンド
#$00 (なし)
#$01 なめまわし
#$02 ひゃくれつなめ
#$03 おたけび
#$04 あしばらい
#$05 なめまわし
#$06 さそうおどり
#$07 おたけび
#$08 つまづいてこける
#$09 ぱふぱふ
#$0A ひきがたり
#$0B ながしめ
#$0C ゆうわくおどり

炎・吹雪コマンドを相手に実行された

この戦闘員が相手陣から炎・吹雪コマンドを実行されると直ちに 1 になるブーリアン値の属性だ。

呪文コマンドを相手に実行された

この戦闘員が相手陣から呪文コマンドを実行されると直ちに 1 になるブーリアン値の属性だ。

おどりコマンドを相手に実行された

この戦闘員が相手陣からおどりコマンドを実行されると直ちに 1 になるブーリアン値の属性だ。

せいれいのうた状態

この戦闘員がせいれいのうたコマンドを使用中であることを示すブーリアン値を取る属性だ。

防御対象のキャラクター添字

この戦闘員の防御状態属性値がある値であるときには、コマンド対象が自陣キャラクターのいずれかになる。 これは、そのキャラクターの対応する戦闘員配列 $7E2030 添字を値に取る属性だ。

集中攻撃フラグ

この戦闘員が集中攻撃特性があることを示すブーリアン値を取る属性だ。 モンスター構造体の集中攻撃分類属性と関係がある。

戦闘コマンド実行を無視するかどうか

このフラグが 1 であるような戦闘員については、現在ターンにおける手番が回ってこない。

メダパニ状態から回復した直後かどうか

この戦闘員のメダパニ状態属性値が 1 から 0 になると、その時点で値が 1 になるブーリアン型属性だ。

守備力

この戦闘員の守備力を表す属性だ。

ちからため系カウンター

この戦闘員がちからため系コマンドを実行した際に値が 2 にセットされる属性だ。 以降のコマンド実行により値が 1, 0 と減少する。 この値が 1 であることが、攻撃力が一時上昇するときに必要だ。

ちからため系分類

この戦闘員が次のいずれかのコマンドを実行中であることを表現する属性だ。 表の左列と右列はそれぞれ属性値と戦闘員が実行中のコマンドを示す:

表 4.93 ちからため系分類

ID 実行中のコマンド
0 普通の「ちからため」
1 普通の「きあいため」
2 モンスターの「ちからをためている」
3 モンスターの「おおきく いきをすいこんだ」

マホカンタ状態

この戦闘員がマホカンタコマンドを適用されていることを示すブーリアン値を取る属性だ。

マホターン状態

この戦闘員がマホターンコマンドを適用されていることを示すブーリアン値を取る属性だ。

攻撃力

この戦闘員の攻撃力を表す属性だ。

すばやさ

この戦闘員のすばやさを表す属性だ。

コマンド実行優位

この戦闘員が実行する戦闘コマンドのターン内優先度を表す数値を取る属性だ。 具体的に言うと、アストロン、におうだち、しっぷうづきを実行する場合に属性の値がそれぞれ #$4000, #$2000, #$1000 となる。

この属性の値の用途は、複数コマンドを実行する順序を正規化することだと思われる。

おどりふうじ状態

この戦闘員がおどりふうじコマンドを適用されていることを示すブーリアン値を取る属性だ。

こおりつき状態

この戦闘員がパルプンテコマンドの効果の一つによって、凍りついていることを示すブーリアン値を取る属性だ。

まねまね反応準備状態

戦闘員の防御状態属性値がまねまねのときに、その詳細な状態を表す値を取る属性だ。 値 0, 1, 2 は自分が受けたコマンド実行を無視、そのままやり返す、通常攻撃としてやり返すことをそれぞれ意味する。

馬車待機中フラグ

これは自陣キャラクター専用の属性であり、馬車の中にいることを示すブーリアン値を取る。 この属性値は仲間の実行コマンドを AI に決定させるときにしか利用されない。

みかわしきゃく系カウンター

この戦闘員がみかわしきゃくのコマンドまたはあそびのタップダンスを実行したときに 1 か 2 がセットされる属性だ。

戦闘コマンド決定用カウンター

これは敵陣キャラクター専用属性であり、コマンドを実行するたびに値が 1 ずつ増えていき、 値が 6 に至ると 0 にリセットされるようなカウンターのような属性だ。 この値をモンスター固有の戦闘コマンド配列の添字として用い、次回実行コマンドを決定する。

アクティブフラグ

適当な名前が思いつかないのだが、この属性はこの戦闘員が戦闘の場にいることを示すブーリアン値を取る。死亡状態でも構わない。 例を挙げると、ともえなげ、つきとばし、バシルーラ等のコマンドが効いた戦闘員については 0 を取る。

集中攻撃の対象

この戦闘員が集中攻撃をする際に、その相手の $7E2030 配列添字を値に取る属性だ。

どうぐつかうコマンドアイテム ID

この戦闘員が所持品のアイテムを使用することによるコマンドを実行するときに、 そのアイテム ID を値に取る属性だ。 これは自陣側戦闘員専用の属性だ。

キャラクター添字

キャラクター ID の配列 $7E400D の添字を値に取る属性だ。 これは自陣側戦闘員専用の属性だ。

どく状態, もうどく状態

この戦闘員がどくに冒されているか、もうどくに冒されているかをそれぞれ示すブーリアン値を取る属性だ。 ただし、両者の値が同時に 1 であってはならない。

戦闘コマンドがどうぐつかう

この戦闘員が所持品のアイテムを使用することによってコマンドを実行することを意味するブーリアン値を取る属性だ。 これは自陣側戦闘員専用の属性だ。

戦闘コマンドアニメーション k (k = 0, 1, 2)

戦闘コマンド k に対応するアニメーションを指示する値を取る属性だ。 これは敵陣側戦闘員専用の属性だ。

4.21.2. 戦闘キャラクター構造体メソッド

バンク $C2 の逆アセンブルの便宜を図るため、 以下に $7E2030 構造体の各属性にアクセスするためのサブルーチンの一覧を次に示す。 ただし、LDA $7E205F,X のように直接値にアクセスする処理も当然のように存在する。

表 4.94 戦闘キャラクター構造体の属性にアクセスするサブルーチン

サブルーチン 固定引数長 入力 機能
$C2EF33 2 x 2 バイト長の属性値を取得する
$C2EF3A 2 y 2 バイト長の属性値を取得する
$C2EF6B 2 a, x 2 バイト長の属性値を更新する
$C2EF74 2 a, y 2 バイト長の属性値を更新する
$C2EFA7 4 x 指定する長さのビットフィールド属性値を取得する
$C2EFAE 4 y 指定する長さのビットフィールド属性値を取得する
$C2EFF4 4 x 指定する長さのビットフィールド属性値を取得する
$C2EFFB 4 y 指定する長さのビットフィールド属性値をシフトせずに取得する
$C2F034 4 a, x 指定する長さのビットフィールド属性値を更新する
$C2F03D 4 a, y 指定する長さのビットフィールド属性値を更新する

レジスター x および y は戦闘員の添字を、レジスター a は属性値をそれぞれ指定する。

固定引数長とあるのは、各 JSR 命令に続く非プログラムバイト列の長さのことだ。 値が 2 ならばオブジェクトのベースアドレスからのオフセット値が、 値が 4 ならばオフセット値とビットマスク値がコード中に埋め込まれていることを示す。 以下に参考コードと解釈例を示す。本節の表と照合しながら確かめるといいだろう:

C2/56C7:    22F4EFC2    JSR $C2EFF4         戦闘員 x の属性を取得する
C2/56CB:    5020
C2/56CD:    0400                            対象属性はアストロン状態
C2/56CF:    18          CLC
C2/56D0:    F027        BEQ $56F9           if(アストロン状態){
C2/56D2:    22A7EFC2    JSR $C2EFA7             戦闘員 x の属性を取得する
C2/56D6:    4E20
C2/56D8:    0700                                対象属性は所属グループ
C2/56DA:    C90500      CMP #$0005
C2/56DD:    B013        BCS $56F2               if(敵陣){
C2/56DF:    A90000      LDA #$0000                  a = 0
C2/56E2:    2234F0C2    JSR $C2F034                 戦闘員 x の属性を値 a で更新する
C2/56E6:    5020
C2/56E8:    0400                                    対象属性はアストロン状態
C2/56EA:    22162AC0    JSR $C02A16                 メッセージ 0086: [BC][B7]の アストロンが とけた![B1][AC]
C2/56EE:    8600
C2/56F0:    8006        BRA $56F8               }else{
C2/56F2:    22162AC0    JSR $C02A16                 メッセージ 0087: [BC][B7]は てつのかたまりになっている![B1][AC]
C2/56F6:    8700
                                                }
C2/56F8:    38          SEC
                                            }
C2/56F9:    60          RTS