5.6. ダメージ構造体解析

5.6.1. 解析
5.6.1.1. $C23BB4 ダメージ構造体
5.6.1.2. $C90AF7 ダメージ構造体アクセスサブルーチン
5.6.2. データ

本章ではダメージ構造体の解析を行う。 なお、戦闘行動とキャラクターの状態から決定する、 ダメージの計算処理過程全てを解析するものではないことを断っておく。

ダメージ構造体関連の議論に出てくる「ダメージ」という用語だが、 この意味は、通常の意味に加えて、以下の値をも含意する。

5.6.1. 解析

とっくの昔に解析済みである (e.g. [URL1]) ため、 わざわざ解析作業をしなくて済む。 しかしここでは気の済むまで見てみよう。

ダメージ構造体はアドレス $C23B44 から各データが格納されている。 ID からダメージ構造体オブジェクトの格納アドレスを得るために、 プログラムは構造体オブジェクト格納アドレスの配列 $C23C3E を参照する。 X = ID * 2 として、 LDA $C23C3E,X の形でアドレスを得る。 これは、データアクセス時間を抑えるという意味も兼ねているのだろう。

戦闘行動構造体の属性として、 この構造体の ID を持つフィールドがある。

5.6.1.1. $C23BB4 ダメージ構造体

アドレス $C23BB4 から数十個、ダメージパターンが定義されている。 1 パターン当たりが占めるデータ量は 5byte であり、 これが #$32 (50) 個配列されている。

本構造体のメモリレイアウトは以下のようになっている。 各フィールドは 10bit で表現される。

表 5.11 $C23BB4 ダメージ構造体

Byte:Bit 80 40 20 10 08 04 02 01
00 (上位バイトから続き)
01 (上位バイトから続き) 敵側への最小値
02 (上位バイトから続き) 味方側への最小値
03 (上位バイトから続き) 敵側への最大値
04 味方側への最小値

敵側への最小値

味方側キャラクターから敵側キャラクターへ、 例えば攻撃することで発生するダメージの最小値である。

味方側への最小値

敵側キャラクターから味方側キャラクターへ、 例えば攻撃されることで発生するダメージの最小値である。

敵側への最大値

味方側キャラクターから敵側キャラクターへ、 例えば攻撃されることで発生するダメージの最大値である。

味方側への最小値

敵側キャラクターから味方側キャラクターへ、 例えば攻撃されることで発生するダメージの最大値である。

5.6.1.2. $C90AF7 ダメージ構造体アクセスサブルーチン

$C23BB4 構造体のメモリレイアウトを解析するには、 単に $C90AF7 サブルーチンを読み切るだけで済むのである。 以下にコードを抜粋する。

 .routine 戦闘行動のダメージ値決定
C9/0AF7:    08          PHP 
C9/0AF8:    8B          PHB 
C9/0AF9:    C230        REP #$30
C9/0AFB:    F47E7E      PEA $7E7E
C9/0AFE:    AB          PLB 
C9/0AFF:    AB          PLB 
C9/0B00:    DA          PHX 
C9/0B01:    5A          PHY 
C9/0B02:    AEEE23      LDX $23EE
C9/0B05:    ACE423      LDY $23E4
C9/0B08:    22E0CAC2    JSR $C2CAE0    1
C9/0B0C:    3C20        // $7E2030 戦闘キャラ構造体
C9/0B0E:    FF00        // 戦闘行動の主体が味方側ならば 5
C9/0B10:    C90500      CMP #$0005
C9/0B13:    9030        BCC $0B45      if(a < 5) goto 敵方から味方へのダメージ
.label 味方側キャラクターからモンスター側ダメージ(素)を決定
C9/0B15:    A9FFFF      LDA #$FFFF
C9/0B18:    48          PHA 
C9/0B19:    2225CCC2    JSR $C2CC25    2
C9/0B1D:    7218
C9/0B1F:    FF00
C9/0B21:    A8          TAY 
C9/0B22:    22F8CCC2    JSR $C2CCF8    3
C9/0B26:    443B        // $C23B44 ダメージ構造体::最小値(敵への)
C9/0B28:    FF03
C9/0B2A:    C9FF03      CMP #$03FF
C9/0B2D:    F03E        BEQ $0B6D      if(a == 03FFh) goto 終了
C9/0B2F:    AA          TAX
C9/0B30:    22F8CCC2    JSR $C2CCF8    4
C9/0B34:    463B        // $C23B44 ダメージ構造体::最大値(敵への)
C9/0B36:    F03F
                                       // a == ダメージ
C9/0B38:    802E        BRA $0B68      goto 乱数
.routine アイテム関連 @x ダメージ値決定
C9/0B3A:    08          PHP 
C9/0B3B:    8B          PHB 
C9/0B3C:    C230        REP #$30
C9/0B3E:    F47E7E      PEA $7E7E
C9/0B41:    AB          PLB 
C9/0B42:    AB          PLB 
C9/0B43:    DA          PHX 
C9/0B44:    5A          PHY 
.label 敵側キャラクターから味方キャラクターへのダメージ(素)を決定
C9/0B45:    A9FFFF      LDA #$FFFF
C9/0B48:    48          PHA 
C9/0B49:    2225CCC2    JSR $C2CC25    5
C9/0B4D:    7218
C9/0B4F:    FF00
C9/0B51:    A8          TAY
C9/0B52:    22F8CCC2    JSR $C2CCF8    6
C9/0B56:    453B
C9/0B58:    FC0F
C9/0B5A:    C9FF03      CMP #$03FF
C9/0B5D:    F00E        BEQ $0B6D      if(a == 03FFh) goto 終了
C9/0B5F:    AA          TAX
C9/0B60:    22F8CCC2    JSR $C2CCF8    7
C9/0B64:    473B
C9/0B66:    C0FF
.label 乱数
C9/0B68:    20750B      JSR $0B75      8
C9/0B6B:    8301        STA $01,S
.label 終了
C9/0B6D:    68          PLA
C9/0B6E:    7A          PLY
C9/0B6F:    FA          PLX
C9/0B70:    AB          PLB
C9/0B71:    28          PLP
C9/0B72:    48          PHA
C9/0B73:    68          PLA
C9/0B74:    6B          RTL

1

サブルーチン $C2CAE0 の呼び出しは、 戦闘キャラクター Y の各種状態を表す構造体オブジェクトから、 指定の状態を取得することを意味する。

呼び出し位置の直後に実引数がコードに埋め込まれている。 これらが取得したい値の相対アドレスとビットマスクを指示する。 ここで取得するオフセット#$203C からの 1 バイトは、 戦闘時におけるキャラクターのグループ番号を示す。

2 5

サブルーチン $C2CC25 を呼び出し、 戦闘オブジェクトのメンバーデータを取得する。 ここでは引数として #$1872#$00FF を渡して、 この戦闘行動 X に関連付けられているダメージデータの ID を取得する。

3 4 6 7

サブルーチン $C2CCF8 を呼び出し、 ダメージオブジェクトから指定のメンバーデータを取得する。 ここで与えている引数と、取得するメンバーの対応表は前項を参照。

8

サブルーチン $0B75 を呼び出し、範囲 [X, A] にある乱数を取る。 この意図は、ダメージ値からなる集合から、ランダムに値を一つ取るということだ。 この乱数を A に入れた状態でサブルーチンを終了する。

ダメージ構造体のフィールドにアクセスする専用サブルーチンはいくつかあるのだが、 実際にプログラムから参照されているものは $C2CCF8 サブルーチンだけであるようだ。 このサブルーチンは 4byte のパラメータをとり、 その意味はいつもと同じようなものなので、説明を省く。

5.6.2. データ

付録 B データ