4.12. 戦闘行動解析

4.12.1. 解析
4.12.1.1. $C8EE67 - 戦闘行動構造体へのポインタ配列
4.12.1.2. JSL $C2F0C2 によるデータ取得
4.12.1.3. JSL $C2F0C9 によるデータ取得
4.12.1.4. JSL $C2F0DF によるデータ取得
4.12.1.5. JSL $C2F0E6 によるデータ取得
4.12.1.6. JSL $C2F0FC によるデータ取得
4.12.1.7. JSL $C2F103 によるデータ取得
4.12.1.8. $C8C65D - 戦闘行動構造体
4.12.2. TODO リスト

この文書では、$C8C65D に定義されている戦闘行動構造体の解析をどのようにして行うのかを説明する。 先人の手で「戦闘行動構造体データが $C8C65D に存在する」ことが判明している。 これを出発点に、どこまで構造体の仕組みを解明できるかに挑戦する。

以下のことは、解析前に既知であると仮定する。

4.12.1. 解析

アイテム解析 のときと同じ戦略をとった。 以下、戦闘行動構造体のメンバー取得サブルーチンの紹介をする。

4.12.1.1. $C8EE67 - 戦闘行動構造体へのポインタ配列

アイテム構造体へのポインタ配列と同じ役割を果たす。 格納されているデータは、戦闘行動 ID に対応するアイテムデータが格納されているアドレスだ。 ただし、この値を #$C8C65D に加算したものが正確なアドレスだ。

C8/EE67:    0000 // 0000 [表示なし]
C8/EE69:    1900 // 0001 メラ
C8/EE6B:    3200 // 0002 メラミ
C8/EE6D:    4B00 // 0003 メラゾーマ
C8/EE6F:    6400 // 0004 ギラ
C8/EE71:    7D00 // 0005 べギラマ
C8/EE73:    9600 // 0006 べギラゴン
C8/EE75:    AF00 // 0007 イオ
C8/EE77:    C800 // 0008 イオラ
C8/EE79:    E100 // 0009 イオナズン
...

例えば、以下のようにして戦闘行動 X のデータ内部の値を取得する実装がある。 LDA $C8EE67,X を逆アセンブルコードファイルから grep すれば、 つられて LDA $C8C6??,X タイプのコードが見つかる。 その周囲を解読して、戦闘行動構造体のレイアウトを解析する。

C2/8BD2:    AD8D25      LDA $258D           // 行動 ID
C2/8BD5:    0A          ASL A
C2/8BD6:    AA          TAX 
C2/8BD7:    BF67EEC8    LDA $C8EE67,X       // 行動構造体へのポインタ
C2/8BDB:    AA          TAX 
C2/8BDC:    BF62C6C8    LDA $C8C662,X       // 耐性
C2/8BE0:    291F00      AND #$001F          a = 行動X[05h] & 001Fh;
C2/8BE3:    C91F00      CMP #$001F
...

4.12.1.2. JSL $C2F0C2 によるデータ取得

X を戦闘行動 ID にセットした直後に呼び出し、 さらに構造体のアドレスを 2 バイトの「実引数」を指定してから、 そこに格納されている値をアキュームレータにロードするサブルーチンの呼び出しだ。

ここでは紙面の都合上、各種データ取得サブルーチンのコードを紹介できない。 呼び出し元だけをお見せすると、 下の例は、アドレス C8C674 + sizeof(戦闘行動構造体) * x から値を取得するものだ。

C3/9C9F:    AA          TAX 
C3/9CA0:    22C2F0C2    JSR $C2F0C2         ■(RTL+2)
            74C6        // 呪文名文字列 ID
C3/9CA6:    223A76C3    JSR $C3763A         ■a を ID とする文字列を描画

4.12.1.3. JSL $C2F0C9 によるデータ取得

JSL $C2F0C2 によるデータ取得の Y バージョンだ。

4.12.1.4. JSL $C2F0DF によるデータ取得

X を戦闘行動 ID にセットした直後に呼び出し、 さらに構造体のアドレスを 4 バイトの「実引数」を指定してから、 そこに格納されている値をアキュームレータにロードするサブルーチンの呼び出しだ。 4 バイトの内訳は、最初の 2 バイトが構造体内部のどこかを指すアドレスであり、 最後の 2 バイトがビットマスクだ。 マスク後、それを右シフトして数値化したものをアキュームレータにロードする。

一つ例を挙げる。 下の呼び出しにおいて、サブルーチンの呼び出しはアドレス C8C667 + sizeof(戦闘行動構造体) * x にある 2 バイトの値に対し、 #$0040 の「桁」だけを取り出すものだ。

C2/6208:    AE5F25      LDX $255F           // 行動 ID
C2/620B:    22DFF0C2    JSR $C2F0DF         ■(RTL+4)
            67C6
            4000    // 戦闘メッセージを表示するか否か
C2/6213:    D01C        BNE $6231

4.12.1.5. JSL $C2F0E6 によるデータ取得

JSL $C2F0DF によるデータ取得Y バージョンだ。

4.12.1.6. JSL $C2F0FC によるデータ取得

サブルーチン $C2F0FC は、 サブルーチン $C2F0DF とまったく同じ実装だ。 従って、同じ役割を果たすわけだが、 なぜ本物が二つあるのかは不明。

4.12.1.7. JSL $C2F103 によるデータ取得

JSL $C2F0FC によるデータ取得Y バージョンだ。 取りも直さず $C2F0E6 と同じ実装だ。

4.12.1.8. $C8C65D - 戦闘行動構造体

構造体一個あたりのデータ格納レイアウトを以下に示す。 括弧内の数字はバイト数またはビット数(小数点以下)を示す。

表 4.29 $C8C65D 戦闘行動構造体

Byte:Bit 80 40 20 10 08 04 02 01
00 JSR ($469F,X) のためのインデックス (.7) 呪文フラグ (.1)
01 JSR ($469F,X) のためのインデックス (.7) おどりフラグ (.1)
02 JSR ($469F,X) のためのインデックス (.7) フバーハフラグ (.1)
03 だいぼうぎょフラグ (.1) マヌーサ系フラグ (.1) ? (.6)
04 ? (.1) 痛恨・会心の一撃 (.1) バイキルト (.1) ちから・きあいため (.1) かわす・うちはらう (.1) ? (.3)
05 ドラゴンキラー等 (.1) 対象が複数 (.1) まじんのかなづち (.1) 耐性種別 (.5)
06 ? (.1) きせきのつるぎ (.1) 追加ダメージのある武器 (.1) はやぶさのけん等 (.1) 特殊武器装備時 (.1) どくばり (.1) ? (.2)
07 うけながし可能 (.1) マホカンタ等 (.1) かばうことが可能 (.1) アストロン (.1) パラディン時に即死 (.1) ? (.1) ? (.2)
08 ? (.1) メッセージ調整 (.2) まねまねメッセージ (.2) ? (.3)
09 ? (.2) JSR ($E0D6,X) のためのインデックス (.6)
0A 状態異常クリア (.1) 名前を持つか (.1) JSR ($D3E5,X) のためのインデックス (.6)
0B ? (.1) $C8FC9B ダメージ構造体へのインデックス (.7)
0C 戦闘行動キャプションセット ID (1)
0D 戦闘行動画面効果 ID (1)
0E (次のバイトの下位へ続く)
0F 敵を倒しても無利益 (.1) ? (1.7)
10 (次のバイトの下位へ続く) ? (.4) ? (.2)
11 ? (1.1)
12 処理サブルーチン アドレス (3)
13
14
15 戦闘メッセージ ID (2)
16
17 戦闘行動の名前 文字列 ID (2)
18

残念ながら全てを解析できていない。

メンバーには勝手に名前をつけておいた。 以下、その説明をする。

呪文フラグ

呪文である行動には 1 がセットされている。 それ以外は 0 がセットされている。 レベル・職業レベルアップ時に何かを習得する場合、 それが呪文か特技かを区別するためにも用いられる。

おどりフラグ

「おどりふうじ」の対象となる行動には 1 がセットされている。 「おどりふうじ」の処理時に参照される。

フバーハフラグ

このメンバーが 1 にセットされている行動は、 「フバーハ」が効いているキャラクターには、ダメージが半減する。 また、「おいかぜ」も効き目がある。

マヌーサ系フラグ

マヌーサ系状態のキャラクターがこの行動をするとき、 攻撃ミスをする処理が有効になるのであれば 1 がセットされている。

だいぼうぎょフラグ

「だいぼうぎょ」をするキャラクターに対して、 ダメージを 1/10 に減じることができるものは 1 がセットされている。

かわす・うちはらうフラグ

みをかわすことがあったり、バトルマスターがうちはらうことがある行動には 1 がセットされている。

ちからため・きあいためフラグ

「ちからため」「きあいため」の直後にこの行動をとれば、 相手側へのダメージが 1.5 倍になるものについて、 1 がセットされている。

バイキルトフラグ

「バイキルト」がかかっている状態でこの行動をとったときに、 相手側へのダメージが 2 倍になるものについて、 1 がセットされている。

痛恨・会心フラグ

痛恨の一撃、または会心の一撃に変化し得る行動について、 1 がセットされている。

耐性種別

この行動の持つ耐性の種別だ。 数値と意味の対応は次の通り。

表 4.30 耐性表

属性
00 メラ系
01 ギラ系
02 イオ系
03 ヒャド系
04 バギ系
05 デイン系
06 マヌーサ系
07 ラリホー系
08 ザキ系
09 ニフラム・バシルーラ
0A マホトラ系
0B マホトーン系
0C メダパニ系
0D ルカニ系
0E 該当なし
0F 毒系
10 やすみ系
11 おどりふうじ
12 かえん系
13 ふぶき系
14 たたき系
15 マヒ系
16 ぐんたいよび
17-1E 該当なし
1F 無属性

ちなみに、この並びは PS 版ドラクエ 7 のモンスターデバッガの呪文耐性リストと同じ順序だ。

まじんのかなづちフラグ

「まじんのかなづち」装備状態でこの行動をとるときに、 攻撃ミスになる可能性があるものについては 1 がセットされている。

対象が複数フラグ

行動の対象が一人のキャラクターだけにとどまらないものについては 1 がセットされている。

ドラゴンキラー等有効フラグ

「ドラゴンキラー」「はやぶさのけん」「ゾンビキラー」装備時に、 それらの武器特有のダメージ補正処理を行う行動であれば 1 がセットされている。

どくばり有効フラグ

「どくばり」装備キャラクターがこの行動をとるときに、 「どくばり」の影響があるものについては 1 がセットされている。

特殊武器装備有効フラグ

「ゆうわくのけん」等を装備しているキャラクターがこの行動をとるときに、 その武器が持つ効果を活かすものについては 1 がセットされている。

はやぶさのけん・キラーピアス有効フラグ

「はやぶさのけん」「キラーピアス」を装備しているキャラクターがこの行動をとるときに、 二回連続してその行動を繰り返すものについては 1 がセットされている。

追加ダメージフラグ

通常の攻撃ダメージにプラスして、付加的なダメージを与える武器 (例:ラミアスのつるぎ)を装備しているキャラクターがこの行動をとる場合に、 付加的ダメージの処理があるものについては 1 がセットされている。

きせきのつるぎ有効フラグ

「きせきのつるぎ」を装備しているキャラクターがこの行動をとる場合に、 相手方にダメージを与えたときに、自分の HP が回復する処理があるものについては 1 がセットされている。

パラディンとして攻撃すると、敵が即死する可能性があるフラグ

キャラクターの職業がパラディンである場合にこの行動をとれば、 行動の対象となるキャラクターが即死する可能性のあるものについては 1 がセットされている。

アストロン有効フラグ

「アストロン」により鉄の塊になっているキャラクターに対して、 その行動がムダになるものについては 1 がセットされている。

かばうことが可能フラグ

「みがわり」によってかばうことが可能な行動について 1 がセットされている。

マホカンタ・マホターン有効フラグ

「マホカンタ」「マホターン」が効いているキャラクターに対して、 その行動が反射するものについては 1 がセットされている。 「ひかりのドレス」「ミラーアーマー」処理もこのフラグを参照する。

うけながし可能フラグ

「うけながし」を使用中のキャラクターに対してその行動をとった場合に、 その行動が受け流される可能性のあるものについては 1 がセットされている。

まねまね処理

「まねまね」使用中のキャラクターに対してこの行動をとった場合に、 そのキャラクターがどのように対処するかを示す値だ。 以下のように処理をすることになる。

表 4.31 まねまね

アクション
0 無視する
1 やりかえせない
2 通常攻撃を返す
3 やりかえす

メッセージ調整

詳細は不明。

名前を持つかフラグ

じゅもんウィンドウやとくぎウィンドウに、 その行動の名前を表示することができるものに関しては、 1 がセットされている。

状態異常クリア可能フラグ

メダパニやラリホーにかかったキャラクターに対してこの行動をとった場合に、 ダメージを与えた直後に、混乱状態や睡眠状態から回復する可能性があれば 1 がセットされている。

$C8FC9B ダメージ構造体データ ID

各戦闘行動に定義される、ダメージ構造体データの ID だ。 なお、ダメージ構造体については、別項で解説をする予定がある。

戦闘行動キャプションセット ID

戦闘行動を入力する際に、画面隅に表示される小ウィンドウの 各行の文字列 ID を格納する構造体データの ID だ。

敵を倒しても無利益フラグ

この行動が直接的な原因で、敵を戦闘の場からいなくした場合に、 この敵の本来持つ経験値もゴールドも得られないのであれば 1 がセットされている。

処理サブルーチン アドレス

戦闘行動の処理実装中、その行動固有の処理部分 (言ってみれば Template Method か) を実装するサブルーチンのアドレスだ。

戦闘メッセージ ID

戦闘行動中に表示する戦闘メッセージの ID だ。 #$1000 以上の値をもつ戦闘行動は、例外的な扱いを受ける。

戦闘行動の名前 文字列 ID

「じゅもん」「とくぎ」選択ウィンドウに表示する文字列の文字列 ID だ。

4.12.2. TODO リスト

当然のことながら、目標は構造体全メンバーの完全解析だ。

  • 各種 JSR(addr,X) の持つ意味を調査する。

  • 構造体[03] & 003Fh; $C2C25D 付近から解析する。

  • 構造体[04] & 0007h; $C28BEF で参照されていて、ある配列の添え字であることは判明したが、 役割が不明。

  • 構造体[04] & 0080h; $C25D40 で参照されていることは判明したが、 複雑な処理の開始地点であるため未解析。

  • 構造体[06] & 0003h および構造体[07] & 0003h; それぞれ $C23AB4, $C23D54 で参照されていて、 これらは関係のあるメンバーになっている。

  • 構造体[06] & 0080h; 参照箇所が不明。 構造体全データを見る限り、このメンバーは未使用ではない感じがする。

  • 構造体[07] & 0004h; 参照箇所は $C25D0A だ。

  • 構造体[08] & 0007h および構造体[08] & 0080h; それぞれ $C2D2E7, $C2D2AF で参照されていて、 これらは関係のあるメンバーになっている。

  • 構造体[09] & 00C0h; サブルーチン $C92965 を解析しないと進めない。

  • 構造体[0B] & 0080h; 周辺の意味解読が難しい。

  • 構造体[0E] & 7FFFh; および構造体[10] & 0003h; コードはこのメンバーを同時に参照する。 ムラサキのひとみで顕著な値をとるようだが、詳細不明。

  • 構造体[10] & 003Ch; 解読が難しい。

  • 構造体[11]; 解読が難しい。