本節ではダメージ構造体を説明する。 ここで議論するのはダメージのいわば基本量についてであり、 コマンドとキャラクターの状態から決定する、ダメージの計算処理過程の全てを網羅するものではないことを断っておく。
また、ダメージ構造体関連の議論に出てくる「ダメージ」という用語だが、 本書で言うダメージとは、通常の意味に加えて、回復量や永続的な属性値をも含むものとする。 抽象的に表現すると「キャラクターの属性値であり、数量的に表現されているものに対する変化量」ということになるだろうか。
アドレス $C23BB4
から 50 個、ダメージパターンが定義されている。
各要素のサイズは 5 バイトで、メモリーレイアウトは次に示すとおりだ:
表 5.26 構造体 $C23BB4
オフセット | 桁 | 属性 |
---|---|---|
#$00
|
#$03FF
|
自陣側実行時の下限値 |
#$01
|
#$0FFC
|
敵陣側実行時の下限値 |
#$02
|
#$3FF0
|
自陣側実行時の上限値 |
#$03
|
#$FFC0
|
敵陣側実行時の上限値 |
各属性の意味を以下に記す:
それぞれ自陣側戦闘員と敵陣側戦闘員が実行するコマンドから決まるダメージの下限値を表す属性だ。 値が 1,023 のときはマジックナンバーとして取り扱う。 このときは後述の抽選を適用せず、値を 65,535 とする。
それぞれ自陣側戦闘員と敵陣側戦闘員が実行するコマンドから決まるダメージの上限値を表す属性だ。
ROM データをダンプして属性値を検討すると、自陣と敵陣とで威力が異なるコマンドはそれほど多くないことがわかる。 一部の攻撃コマンドしか該当しない。 そのようなダメージについては、いずれも自陣実行時のほうが敵陣のそれよりも大きい値が設定されている。
ダメージ構造体のフィールドにアクセスする専用サブルーチンはいくつかあるのだが、
実際にプログラムから参照されているものは $C2CCF8
サブルーチンだけであるようだ。
このサブルーチンは 4 byte のパラメーターをとり、
その意味はいつもと同じようなものなので、説明を省く。
表 5.27 ダメージ構造体の属性にアクセスするサブルーチン
サブルーチン | 固定引数長 | 入力 | 機能 |
---|---|---|---|
$C2CCCF
|
2 | x | 2 バイト長の属性値を取得する(未使用) |
$C2CCD6
|
2 | y | 2 バイト長の属性値を取得する(未使用) |
$C2CCF1
|
4 | x | ビットフィールド属性値を取得する(未使用) |
$C2CCF8
|
4 | y | ビットフィールド属性値を取得する |
$C2CD13
|
4 | x | ビットフィールド属性値をテストする(未使用) |
$C2CD1A
|
4 | y | ビットフィールド属性値をテストする(未使用) |
コマンドのダメージ(基本量)を決定するのはサブルーチン $C90AF7
だ。
コマンド実行者とコマンドを入力とし、ダメージ量を出力とする関数とみなすのが理解しやすい。
コードの概要を以下に示す。
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 C9/0B0C: 3C20 C9/0B0E: FF00 C9/0B10: C90500 CMP #$0005 C9/0B13: 9030 BCC $0B45 if(a < 5) goto 実行者が敵陣戦闘員 C9/0B15: A9FFFF LDA #$FFFF ; 65,535 C9/0B18: 48 PHA C9/0B19: 2225CCC2 JSR $C2CC25 C9/0B1D: 7218 C9/0B1F: FF00 C9/0B21: A8 TAY C9/0B22: 22F8CCC2 JSR $C2CCF8 C9/0B26: 443B C9/0B28: FF03 C9/0B2A: C9FF03 CMP #$03FF C9/0B2D: F03E BEQ $0B6D if(属性値 == 1023) goto 終了 C9/0B2F: AA TAX C9/0B30: 22F8CCC2 JSR $C2CCF8 C9/0B34: 463B C9/0B36: F03F C9/0B38: 802E BRA $0B68 goto 抽選 .label 実行者が敵陣戦闘員 C9/0B45: A9FFFF LDA #$FFFF ; 65,535 C9/0B48: 48 PHA C9/0B49: 2225CCC2 JSR $C2CC25 C9/0B4D: 7218 C9/0B4F: FF00 C9/0B51: A8 TAY C9/0B52: 22F8CCC2 JSR $C2CCF8 C9/0B56: 453B C9/0B58: FC0F C9/0B5A: C9FF03 CMP #$03FF C9/0B5D: F00E BEQ $0B6D if(属性値 == 1023) goto 終了 C9/0B5F: AA TAX C9/0B60: 22F8CCC2 JSR $C2CCF8 C9/0B64: 473B C9/0B66: C0FF .label 抽選 C9/0B68: 20750B JSR $0B75 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
5.3.2 戦闘員構造体メソッド で述べるように、
サブルーチン |
|
サブルーチン |
|
サブルーチン |
|
同バンクサブルーチン |
このサブルーチンは戦闘中に呼び出される。