5.5. モンスター

5.5.1. 構造体 $C20000: モンスター
5.5.2. モンスター構造体メソッド

この節ではモンスターデータについて述べる。 ここで言うモンスターデータとは、モンスターそれぞれの静的な性質を定義したオブジェクトのことを意味するものであり、 物理的にはアドレス $C20000 に存在する配列を構成する要素の型のことだ。 戦闘員としてのモンスターデータについては 5.3 戦闘員 で述べる。

5.5.1. 構造体 $C20000: モンスター

モンスター構造体とは、サイズが #$25 バイトであり、オブジェクトのメモリレイアウトが次の表で示されるような構造体だ。 この型のオブジェクトがアドレス $C20000 から 160 個直列している。

これらのモンスターオブジェクトは戦闘員オブジェクトの初期化や属性値の再設定の目的で参照されることになる。 あるいは、戦闘員としてのモンスターの状態に依存しないような属性、例えば使えるコマンドの集合、耐性、経験値といった量が格納されている。

表 5.9 構造体 $C20000

オフセット 属性
#$00 #$FFFF 名前
#$02 #$003F レベル
#$02 #$0040 ドラゴン系
#$02 #$0080 ゾンビ系
#$03 #$FFFF 経験値
#$05 #$03FF ゴールド
#$06 #$0FFC 攻撃力
#$07 #$3FF0 守備力
#$08 #$FFC0 パレット
#$0A #$00FF すばやさ
#$0B #$00FF MP
#$0C #$00FF アイテム
#$0D #$00FF スプライト
#$0E #$01FF コマンド 0
#$0F #$03FE コマンド 1
#$10 #$07FC コマンド 2
#$11 #$0FF8 コマンド 3
#$12 #$1FF0 コマンド 4
#$13 #$3FE0 コマンド 5
#$14 #$7FC0 コマンド 6
#$15 #$FF80 コマンド 7
#$17 #$0001 コマンド制約 0
#$17 #$0002 コマンド制約 1
#$17 #$0004 コマンド制約 2
#$17 #$0008 コマンド制約 3
#$17 #$0010 コマンド制約 4
#$17 #$0020 コマンド制約 5
#$17 #$0040 コマンド制約 6
#$17 #$0080 コマンド制約 7
#$18 #$000F コマンドアニメーション 0
#$18 #$00F0 コマンドアニメーション 1
#$19 #$000F コマンドアニメーション 2
#$19 #$00F0 コマンドアニメーション 3
#$1A #$000F コマンドアニメーション 4
#$1A #$00F0 コマンドアニメーション 5
#$1B #$000F コマンドアニメーション 6
#$1B #$00F0 コマンドアニメーション 7
#$1C #$000F コマンドアニメーション 8
#$1C #$0030 コマンド選択判断
#$1C #$00C0 コマンド決定戦略
#$1D #$0007 みかわし
#$1D #$0038 アイテム確率
#$1D #$00C0 複数回
#$1E #$0003 自動回復
#$1E #$000C 集中攻撃
#$1E #$0030 耐性 #$00
#$1E #$00C0 耐性 #$01
#$1F #$0003 耐性 #$02
#$1F #$000C 耐性 #$03
#$1F #$0030 耐性 #$04
#$1F #$00C0 耐性 #$05
#$20 #$0003 耐性 #$06
#$20 #$000C 耐性 #$07
#$20 #$0030 耐性 #$08
#$20 #$00C0 耐性 #$09
#$21 #$0003 耐性 #$0A
#$21 #$000C 耐性 #$0B
#$21 #$0030 耐性 #$0C
#$21 #$00C0 耐性 #$0D
#$22 #$FFFF HP
#$24 #$0001 (メタル系)
#$24 #$00FE (未使用)

(未使用)等の括弧付きの属性は、オブジェクトによって値が異なっているかもしれないが、プログラムからの参照がないものだ。 以下に各属性の概要を記す。

名前

名前とは、このモンスターの名前を意味する文字列の ID を値とする属性だ。 名前文字列はコマンド入力ウィンドウやメッセージ出力ウィンドウ上のテキスト内に表示される。

文字列全般については 5.2 文字列 で述べる。

レベル

レベルとは、このモンスターのレベルを値に取る属性だ。 あやしいかげの実体決定や自陣敵陣双方の逃走判定等に参照される属性値だ。

ドラゴン系

ドラゴン系とは、このモンスターがドラゴンのような性質があることを示すブーリアン型属性だ。 この属性値が 1 のモンスターに対するドラゴンキラー装備時の攻撃では、ダメージを上乗せする処理が発生する。

(ゾンビ系)

ゾンビ系とは、このモンスターがゾンビのような性質があることを示すブーリアン型属性だ。 実際のプログラムではこの属性は参照されていない。 ゾンビキラーのダメージ補正はこれではなく、ニフラム耐性属性値を参照することで処理が発生する。

経験値

経験値とは、自陣側パーティーが一人しかいないときに、このモンスターを倒すことで得られる経験値を表す属性だ。

ゴールド

ゴールドとは、このモンスターを倒すことで得られるゴールドの金額を値として取る属性だ。

攻撃力, 守備力

それぞれ、このモンスターの攻撃力と守備力を表す値を取る属性だ。 この属性値は戦闘員オブジェクトの初期化の際に対応属性に割り当てられる。

パレット

パレットとは、画面上に描画されるモンスターのイメージの色彩データを指示する属性だ。 詳細は調査中。

すばやさ

すばやさとは、このモンスターのすばやさを値に取る属性だ。 この属性値は戦闘員オブジェクトの初期化の際に対応属性に割り当てられる。

MP

MP とは、このモンスターの最大 MP を値に取る属性だ。 ただし、属性値が 255 であるときは戦闘員オブジェクトの MP 属性値を 65,535 で初期化する。 この値はマジックナンバーであり、どんなコマンドを実行しても MP が減少しないことを意味する。

アイテム

アイテムとは、このモンスターを倒すことで戦闘終了時に得られることがあるアイテムの ID を値に取る属性だ。

アイテム全般については 5.23 アイテム で述べる。

スプライト

スプライトとは、画面上に描画されるモンスターの画像の形状データを指示する属性だ。 詳細は調査中。

コマンド k (k = 0..7)

コマンドとは、このモンスターが戦闘中に実行する可能性のある戦闘コマンドの ID を値とする属性だ。

コマンド制約 k (k = 0..7)

コマンド制約とは以下に述べる性質があるブーリアン型の属性だ。 同一ターン内において、このモンスター戦闘員が所属するグループ内の他の戦闘員が既にコマンド k を実行したとする。 その場合には、この戦闘員にコマンド k を実行するために選択しないものとする。

例を挙げると、バラモスエビルのイオナズンとこごえるふぶきの属性値の違いだ。 前者は 1 で後者は 0 となっている。これはイオナズンは遠慮するが、吹雪は遠慮しないということだ。

コマンドアニメーション k (k = 0..8)

コマンドアニメーション k とは、このモンスターがコマンド k を実行するときのアニメーションパターンを指示する値を取る属性だ。 コマンド制約や選択能力の都合上、どのコマンドも実行できないという状況があり得るので、 そのときには全モンスター共通で通常攻撃を実行することになっている。 そのアニメーション用に k = 8 のものが存在する。

コマンド選択判断

コマンド選択判断とは、このモンスター戦闘員が自分のレパートリーにあるコマンドを実行するかどうかを決定する方式を表現する属性だ。 この属性値はコマンドオブジェクトの対象決定判断属性 0..2 に対応している。

「せんたくバカ」「せんたくにんげん」「せんたくかみ」というテスト用のモンスターデータが存在するが、 これらはまさにこの属性値が 0..2 とそれぞれ設定されている。 コマンドを指定して、属性値に応じた振る舞いの違いを見るためのものに違いない。

コマンド決定戦略

コマンド決定戦略とは、このモンスターが自身の実行するコマンドの選択傾向を表す属性だ。 取り得る値は 0..3 であり、0..2 と 3 とで意味合いが異なる。

値が 0..2 であれば、配列 $C268CD で決められた確率表に従う抽選でコマンドを決める。ここで分母は 256 とみなす。 ただし、同一グループ制約があり先約済みであれば、その項目を選択失敗とする。

表 5.10 コマンド選択確率

ID 0 1 2 3 4 5 6 7
0 32 32 32 32 32 32 32 32
1 18 22 26 30 34 38 42 46
2 2 4 6 8 10 12 14 200

値が 3 であれば、モンスターの所属グループ上のローテーションでコマンドを決める。 このときは配列 $C268CD の値をマスクとして用いる (ビットに対応する項目しか抽選しないようにする)。

表 5.11 コマンド選択確率

ID 0 1 2 3 4 5 6 7
3 #$01 #$02 #$04 #$08 #$10 #$20 #$40 #$80

みかわし

みかわしとは、このモンスターが戦闘相手から直接攻撃系統のコマンド、 厳密に言えばみかわし属性値が 1 のコマンドを実行されたときに、 それを身のこなしで避ける度合いを表現する値を取る属性だ。

通常戦の敵陣モンスターの場合は、みかわし属性値プラス 1 を 48 で割った値がみかわしが発生する確率と考えられる。

アイテム確率

アイテム確率とは、戦闘終了後にこのモンスターが(他に条件が加わらないときの)宝箱を落とす確率を決定する値の配列の添字を値とする属性だ。 その配列とは $C2AA34 であり、その要素らが意味するところは次の表のようになる:

表 5.12 アイテム確率

ID 確率
0 1/1
1 1/8
2 1/16
3 1/32
4 1/64
5 1/128
6 1/256
7 1/1024

複数回

複数回とは、このモンスター戦闘員が自分のコマンド実行手番のときに、何回連続でコマンドを実行するかを表す属性だ。

  • 値が 0 ならば単にコマンドを実行する。

  • 値が 1 ならば、5 割の確率で連続してコマンドを実行する。一般的には相異なるコマンドを実行する。

  • 値が 2 ならば、一様ランダムに 1 回から 3 回連続実行する。

  • それ以外の値のときは確実に 2 回連続実行する。

自動回復

自動回復とは、このモンスター戦闘員がターン終了時に回復する HP の量を指定する属性だ。 配列 $C2C3A6 に回復量の範囲が表現されている。次の表のように解釈できる:

表 5.13 自動回復

ID 回復量
0 0
1 16..24
2 44..56
3 90..110

上の表の本体は前作の 表 4.61 自動回復 のコピーアンドペーストで済ませた。

集中攻撃

集中攻撃とは、このモンスター戦闘員が所属するグループが、 コマンド実行の標的を固定するか否かを示すブーリアン型属性だ。 この値が 1 かつコマンド選択判断が 1 以上のときは、所属グループで共有した標的を狙い打ちにする。

耐性 k (k = #$00..#$0D)

耐性とは、このモンスターの戦闘コマンドに対する耐久度を示す指標を値とする属性だ。 取り得る値は 0..3 であり、数値が高いほど耐久度が高い(ただし耐久度の意味はコマンドの耐性分類による)。

「せんたく0」「せんたく1」「せんたく2」「せんたく3」というテスト用のモンスターデータが存在するが、 これらはまさにこの属性値が 0..3 とそれぞれ設定されている。 これらのモンスターを一頭ずつ登場させて、同じ攻撃呪文を試すて受けるダメージを比較するという用途だろう。

耐性の k とコマンド系統との対応関係を表にすると下記のようになる。 注意を要するのは、コマンド属性の系統分類とは一対一対応でないという点だ。

表 5.14 モンスター耐性表

k 系統
#$00 メラ・ギラ・イオ
#$01 ヒャド
#$02 バギ
#$03 デイン
#$04 ザキ
#$05 メガンテ
#$06 ラリホー
#$07 マホトーン
#$08 ルカニ
#$09 マヌーサ
#$0A マホトラ
#$0B メダパニ
#$0C ボミオス・バシルーラ
#$0D ニフラム・せいすい

HP

HP とは、このモンスターの最大 HP を値に取る属性だ。

通常戦の場合、モンスター戦闘員の初期 HP はこの値の 90% から 100% までの値のいずれかを抽選して割り当てる。

(メタル系)

メタル系とは、このモンスターがメタリックであるかどうかを示すためのブーリアン型属性だ。

オブジェクトをダンプしてみると「メタルスライム」「はぐれメタル」「メタルキメラ」に対して 1 が設定されていることがわかるのだが、 プログラム中にこの属性値を参照しているコードが見当たらない。

5.5.2. モンスター構造体メソッド

逆アセンブルの便宜を図るため、以下に $C20000 構造体の各属性にアクセスするためのサブルーチンの一覧を次に示す。 表の凡例は前作 4.14.2 モンスター構造体メソッド と同じにつき、記載を繰り返さない。

表 5.15 モンスター構造体の属性にアクセスするサブルーチン

サブルーチン 固定引数長 入力 機能
$C2CC69 2 x 2 バイト長の属性値を取得する
$C2CC70 2 y 2 バイト長の属性値を取得する
$C2CC8B 4 x ビットフィールド属性値を取得する
$C2CC92 4 y ビットフィールド属性値を取得する
$C2CCAD 4 x ビットフィールド属性値をテストする
$C2CCB4 4 y ビットフィールド属性値をテストする