本節では、戦闘キャラクター構造体各種のメモリーレイアウトを表で示し、また各メンバーデータの意味とアクセス例とをごく簡単に記す。 前作では自陣側と敵陣側とで異なる型を使い分けていたが、本作では両者とも同じ型のオブジェクトで戦闘員を表現する。
次の表で示されるメモリーレイアウトで構成される、サイズが #$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 の値を保持するための属性だ。
この戦闘員が実行するコマンドの ID を値に取る属性だ。
ここでいうコマンド ID とは、コマンドオブジェクトの配列 $C8C65D
の添字を意味する。
戦闘コマンドについては 4.22 戦闘コマンド で述べる。
戦闘コマンド k を実行する相手を表現する 7 ビット長の数を値に取る属性だ。 この数は戦闘員インデックスと対象範囲を示すビットとの論理和で構成されている。
以下、サブルーチン $C26158
から読み取れる 7 ビット値の仕様を記す。
ビット #$40
が立っていると、コマンド k の対象は複数グループに及ぶか、または空となる。
このとき、下位ビットで敵陣・自陣・両方等の詳細を表現する。
ビット #$01
が 1 ならば敵陣すべてのグループを、
ビット #$02
が 1 ならば自陣すべてのグループを、
そしてビット #$04
が 1 ならばここから特定の誰かを選ばずにそのままコマンド対象とする。
ビット #$20
が立っていると、コマンド k の対象は一つのグループとなる。
このとき、下位ビットがグループ添字を表す。
ビット #$60
がどちらもゼロであれば、この値全体が戦闘員添字を直接表現する。
これは敵陣側専用の属性であり、登場順に 0, 2, 4, ... のように割り振られる値を取る。
この戦闘員の最大 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 を値に取る属性だ。
前者は配列 $C8BD12
等の添字であり、
後者は配列 $C20154
等の添字だ。
この戦闘員が自陣側なのか敵陣側なのかを示すブーリアン値を取る属性だ。 値が 1 であれば自陣側メンバーであることを意味する。
この戦闘員が死亡しているのかどうかを示すブーリアン値を取る属性だ。
この戦闘員がアストロンのコマンドを適用されていることを示すブーリアン値を取る属性だ。 これはアストロンカウンターの属性と関係がある。
この戦闘員がマヒしていることを示すブーリアン値を取る属性だ。
この属性はブーリアン値を取り、この戦闘員が何らかのコマンド実行が不発に終わったときに 1 に更新される。 この値が 1 であり、かつ戦闘員の選択判断能力属性値が 1 であれば、次回からのコマンド選択がスマートになるようだ。 ちなみに戦闘員の選択判断能力属性値が 1 以外であれば、戦闘コマンド判断良化フラグは参照されない。
この戦闘員が眠っていることを示す値を取る属性だ。 値がゼロでない値からゼロに変化すると、この戦闘員は目を覚ます。
この戦闘員がモシャス、ドラゴラム、へんしんのいずれかのコマンドを使用中ならば、 その相手のキャラクター、ドラゴラム用モンスターデータ、へんしん用モンスターデータの ID をそれぞれ値に取る属性だ。 それらのコマンドのいずれも使用中でなければ、自身のモンスター ID を値に取る。
この属性は変身状態属性やモシャス状態属性と関係がある。
この戦闘員が混乱していることを示すブーリアン値を取る属性だ。
この戦闘員がドラゴラムやへんしんの各コマンドを使用したことによる、特殊な状態にあることを示すブーリアン値を取る属性だ。 変身相手属性と関係がある。
この戦闘員がマホトーン等を適用されていることにより、呪文コマンドを封じられている状態にあることを示すブーリアン値を取る属性だ。
この戦闘員がマヌーサを適用されていることにより、直接攻撃系コマンドの成功率が低下する状態にあることを示すブーリアン値を取る属性だ。
この戦闘員がすなけむりコマンドを適用されていることを示すブーリアン値を取る属性だ。
この戦闘員がまぶしいひかりコマンドを適用されていることを示す値を取る属性だ。
この戦闘員がモシャスコマンドを使用しているときの、モシャス対象キャラクターの
配列 $7E2030
の添字を値とする属性だ。
モシャス状態属性や変身相手属性と関係がある。
この戦闘員がモシャスコマンドを使用していることを示すブーリアン値を取る属性だ。 モシャス相手添字属性や変身相手属性と関係がある。
この戦闘員がマホキテコマンドを使用していることを示すブーリアン値を取る属性だ。
この戦闘員がフバーハコマンドを使用していることを示すブーリアン値を取る属性だ。
この戦闘員が次のいずれかのコマンドを実行中であることを表現する属性だ。 表の左列と右列はそれぞれ属性値と戦闘員が実行中のコマンドを示す:
この戦闘員が所持品のアイテムを使用することによるコマンドを実行するときに、 その道具袋におけるアイテム位置を値に取る属性だ。 これは自陣側戦闘員専用の属性だ。
この戦闘員がマジックバリアまたはぶきみなひかりコマンドをそれぞれ適用されていることを示すブーリアン値を取る属性だ。 ただし、両者の値が同時に 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 であることが、攻撃力が一時上昇するときに必要だ。
この戦闘員が次のいずれかのコマンドを実行中であることを表現する属性だ。 表の左列と右列はそれぞれ属性値と戦闘員が実行中のコマンドを示す:
この戦闘員がマホカンタコマンドを適用されていることを示すブーリアン値を取る属性だ。
この戦闘員がマホターンコマンドを適用されていることを示すブーリアン値を取る属性だ。
この戦闘員の攻撃力を表す属性だ。
この戦闘員のすばやさを表す属性だ。
この戦闘員が実行する戦闘コマンドのターン内優先度を表す数値を取る属性だ。
具体的に言うと、アストロン、におうだち、しっぷうづきを実行する場合に属性の値がそれぞれ
#$4000
, #$2000
, #$1000
となる。
この属性の値の用途は、複数コマンドを実行する順序を正規化することだと思われる。
この戦闘員がおどりふうじコマンドを適用されていることを示すブーリアン値を取る属性だ。
この戦闘員がパルプンテコマンドの効果の一つによって、凍りついていることを示すブーリアン値を取る属性だ。
戦闘員の防御状態属性値がまねまねのときに、その詳細な状態を表す値を取る属性だ。 値 0, 1, 2 は自分が受けたコマンド実行を無視、そのままやり返す、通常攻撃としてやり返すことをそれぞれ意味する。
これは自陣キャラクター専用の属性であり、馬車の中にいることを示すブーリアン値を取る。 この属性値は仲間の実行コマンドを AI に決定させるときにしか利用されない。
この戦闘員がみかわしきゃくのコマンドまたはあそびのタップダンスを実行したときに 1 か 2 がセットされる属性だ。
これは敵陣キャラクター専用属性であり、コマンドを実行するたびに値が 1 ずつ増えていき、 値が 6 に至ると 0 にリセットされるようなカウンターのような属性だ。 この値をモンスター固有の戦闘コマンド配列の添字として用い、次回実行コマンドを決定する。
適当な名前が思いつかないのだが、この属性はこの戦闘員が戦闘の場にいることを示すブーリアン値を取る。死亡状態でも構わない。 例を挙げると、ともえなげ、つきとばし、バシルーラ等のコマンドが効いた戦闘員については 0 を取る。
この戦闘員が集中攻撃をする際に、その相手の $7E2030
配列添字を値に取る属性だ。
この戦闘員が所持品のアイテムを使用することによるコマンドを実行するときに、 そのアイテム ID を値に取る属性だ。 これは自陣側戦闘員専用の属性だ。
キャラクター ID の配列 $7E400D
の添字を値に取る属性だ。
これは自陣側戦闘員専用の属性だ。
この戦闘員がどくに冒されているか、もうどくに冒されているかをそれぞれ示すブーリアン値を取る属性だ。 ただし、両者の値が同時に 1 であってはならない。
この戦闘員が所持品のアイテムを使用することによってコマンドを実行することを意味するブーリアン値を取る属性だ。 これは自陣側戦闘員専用の属性だ。
戦闘コマンド k に対応するアニメーションを指示する値を取る属性だ。 これは敵陣側戦闘員専用の属性だ。
バンク $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