3.14. 敵との遭遇

3.14.1. モデル
3.14.1.1. 構造体 $2396F3: 通常の戦闘用編成
3.14.1.2. 構造体 $23B04B: 特殊な通常戦闘用編成
3.14.1.3. 構造体 $23D757: イベント戦専用編成
3.14.2. 敵陣決定手順
3.14.3. データ

この節では戦闘モードに移行する際における敵方の編成を決定する情報および処理について述べる。 移動モードから戦闘モードに突入する状況は大きく分けると、次の三つがある:

本節ではこのうちの最初の二項目について記す。 最後の格闘場における試合については 3.10.1.17 格闘場で述べる。

まずは、プログラムが敵方編成を決定するのに必要なデータ型について解説する。 これらのデータ型では登場する可能性のあるモンスターや頭数等の情報が含まれる。 そして、ランダム発生戦闘における敵方編成の仕組みについて、プログラムされた処理を構成するコードを検討していく。 最後に、本節で採り上げたデータ型オブジェクトを全て抽出した CSV ファイルを提供する。

3.14.1. モデル

プログラムが敵方編成を決定するのに利用するデータについて解説する。 本節の冒頭で示した分類でいうところのランダム戦闘では構造体 $2396F3 と構造体 $23B04Bとが対応し、 イベント戦闘には構造体 $23D757 がそれぞれ議論の対象となる型だ。 以下、それぞれのデータ型の構成について記す。

3.14.1.1. 構造体 $2396F3: 通常の戦闘用編成

アドレス $2396F3 にはバイトサイズ #$16 のオブジェクトが配列されている。 それらのオブジェクトの構造を次に示す:

表 3.52 構造体 $2396F3: 通常の戦闘用編成

オフセット 属性
#$00 #$FF レベル
#$01 #$07 モンスター抽選 00
#$38 グループ複数時頭数抽選 0
#$C0 グループ数抽選 0
#$02 #$07 モンスター抽選 01
#$38 グループ複数時頭数抽選 1
#$C0 グループ数抽選 1
#$03 #$07 モンスター抽選 02
#$38 グループ複数時頭数抽選 2
#$C0 グループ数抽選 2
#$04 #$07 モンスター抽選 03
#$38 グループ複数時頭数抽選 3
#$C0 先制攻撃抽選
#$05 #$07 モンスター抽選 04
#$38 グループ複数時頭数抽選 4
#$40 (未使用)
#$80 戦闘発生率調整 A
#$06 #$07 モンスター抽選 05
#$38 グループ単数時頭数抽選 0
#$40 (未使用)
#$80 戦闘発生率調整 B
#$07 #$07 モンスター抽選 06
#$38 グループ単数時頭数抽選 1
#$40 (未使用)
#$80 戦闘発生率調整 C
#$08 #$07 モンスター抽選 07
#$38 グループ単数時頭数抽選 2
#$40 (未使用)
#$80 仲間可能性
#$09 #$07 モンスター抽選 08
#$38 グループ単数時頭数抽選 3
#$40 (未使用)
#$80 昼夜判定
#$0A #$07 モンスター抽選 09
#$38 グループ単数時頭数抽選 4
#$C0 (未使用)
#$0B #$07 モンスター抽選 0A
#$F8 特殊な通常戦闘用編成 ID
#$0C #$FF グループ複数時モンスター 0
#$0D #$FF グループ複数時モンスター 1
#$0E #$FF グループ複数時モンスター 2
#$0F #$FF グループ複数時モンスター 3
#$10 #$FF グループ複数時モンスター 4
#$11 #$FF グループ単数時モンスター 0
#$12 #$FF グループ単数時モンスター 1
#$13 #$FF グループ単数時モンスター 2
#$14 #$FF グループ単数時モンスター 3
#$15 #$FF グループ単数時モンスター 4

各属性の意味は次のようなものとなる(処理コードが戦闘を発生させる処理で参照する順序でなるべく列挙する):

戦闘発生率調整

戦闘発生率調整とは、プレイヤーキャラクターが移動中にこのオブジェクトの定義するモンスターの群と遭遇する確率を調整する数値型属性だ。 物理的には三つのメンバーに分割されているが、論理的にはこれらの和が一つの ID 型属性であり、 乱数範囲を定義する配列 $23EA44 の添字を与えるものだ。

プレイヤーキャラクターが戦闘地域を移動しているとする。戦闘発生テストは一歩進むたびに行われると考える。 前回戦闘時から S 歩動いたとすると、まず次の係数表から対応する戦闘発生率調整値 M を取る:

表 3.53 配列 $23EA44: 戦闘発生係数

オフセット
#$00 #$10
#$01 #$16
#$02 #$2B
#$03 #$40
#$04 #$50
#$05 #$60
#$06 #$70
#$07 #$80

次に調整値 M と歩数 S を乗じて積を得る。さらにそれを 6 ビット右シフトする。 このシフト後の 2 バイト値 P の上位バイト Pu が非ゼロならば、戦闘の敵陣抽選へと進む。 そうではなく Pu がゼロならば、次は P の下位バイト Pl と乱数とを比較する。 乱数が Pl の下位バイトを超えれば戦闘の敵陣抽選へと進む。 超えなければ、戦闘は発生しないものとする。

先制攻撃抽選

先制攻撃抽選とは、最初のターンで自陣か敵陣のどちらか一方しかコマンド実行をしないような状況を決定するために用いる数値型属性だ。 この属性値を基にした乱数処理により、先制攻撃権の発生を決める。

レベル

レベルとは、このオブジェクトが定義する戦闘において、必要なときに主人公のレベルとの比較対象となる数値型属性だ。 レベルそのものを表すわけではないので、0 も有効な値だ。

例えばプレイヤー側の「にげる」コマンドの成功条件、ダメージ計算時に参照する耐性テーブルの決定、 敵キャラクターの戦闘コマンド決定ルーチン、 あるいは戦闘終了後において、倒した仲間候補モンスターが起き上がる条件等に影響する。

仲間可能性

仲間可能性とは、戦闘終了後に倒したモンスターが起き上がる可能性があることを示すブーリアン型属性だ。 この値が 1 であるときに限り、倒したモンスターが起き上がって、仲間になりたそうにこちらを見る可能性がある。

幼少期、光の教団本部内、およびエビルマウンテンでの遭遇パターンでは 0 が割り当てられている。

モンスター抽選

モンスター抽選とは、敵陣のグループ数や構成モンスターを大まかに決定するのに用いられる数値型配列属性だ。 まずこの配列の総和を求め、それからその値を上限とする乱数を生成する。 次に配列の初項からの部分和が初めて総和以上となる添字を求める。 この添字が配列の前半か後半のどちらに属するかで、まずは敵陣のグループが単独なのか複数なのかを決める。 グループが単数のときのモンスター ID と、複数のときの先頭グループのモンスター ID は、 それぞれそのまま後述するグループ単数時モンスター配列およびグループ複数時モンスター配列の添字とする。

昼夜判定

昼夜判定とは、この遭遇パターンが夜しか現れないことを示すブーリアン型属性だ。 この値が 1 だと、昼で遭遇したとしても戦闘発生をキャンセルするらしい。

実際のゲームデータでは、どのオブジェクトもこの属性値が 0 になっている。 事実上、夜専用の遭遇パターンというのは存在しない。

特殊な通常戦闘用編成 ID

先述した敵陣の陣容を決定するモンスター抽選処理中に、 部分和のための添字が配列末尾まで行くと、特殊な通常戦闘用編成を発動するしたい。 それには 3.14.1.2 構造体 $23B04B: 特殊な通常戦闘用編成 で定義されている遭遇オブジェクトをこのオブジェクトの代用とするのだが、 この属性はそのオブジェクトの ID を表すものだ。

グループ単数時頭数抽選

グループ単数時頭数抽選とは、敵陣が単独グループで構成することを決定した後に そのグループにおける構成員の頭数を抽選するために参照される ID 型配列の属性だ。 言い換えると、頭数範囲を表現する定数テーブル $23EA63 および $23EA73 の添字の配列だ。 下に示す表のように暫定的にグループを構成するモンスターの頭数が決まるが、 グラフィック上の都合なのか、後ほど頭数が間引かれることがある。

表 3.54 配列 $23EA63 および $23EA73: 頭数範囲指定

オフセット $EA63 $EA73 暫定頭数
#$00 1 1 1
#$01 2 1 2
#$02 3 1 3
#$03 1 2 1..2
#$04 2 2 2..3
#$05 3 2 3..5
#$06 4 4 4..7
#$07 8 1 8
#$08 1 1 1
#$09 1 2 1..2
#$0A 1 3 1..3
#$0B 1 4 1..4
#$0C 1 5 1..5
#$0D 1 6 1..6
#$0E 1 7 1..7
#$0F 1 8 1..8

グループ単数時モンスター

グループ単数時モンスター抽選とは、敵陣が単独グループで構成することを決定した後に そのグループを構成するモンスターの ID からなる配列の属性だ。

グループ数抽選

グループ数抽選とは、敵陣が複数グループで構成することを決定した後に、 最初のグループに加えて、あといくつグループを追加するのかを抽選するために用いる数値型配列属性だ。

抽選方式は、先に述べたモンスター抽選における方式と同様だ。 今度の配列は要素が重複する可能性のある 0, 1, 2 からなる非減少列であるという性質がある。

グループ複数時頭数抽選

先述のグループ単数時頭数抽選と同じく、 グループ複数時頭数抽選とは、敵陣が複数グループで構成することを決定した後に、 グループそれぞれに何頭のモンスターを割り当てるのかを抽選するために用いる ID 型配列属性だ。

グループ複数時モンスター

先述のグループ単数時モンスター抽選と同じく、 グループ複数時モンスターとは、敵陣が複数グループで構成することを決定した後に、 グループそれぞれを構成するモンスターの ID からなる配列の属性だ。

3.14.1.2. 構造体 $23B04B: 特殊な通常戦闘用編成

アドレス $23B04B にはバイトサイズ #$06 のオブジェクトが配列されている。 それらのオブジェクトの構造を次に示す:

表 3.55 構造体 $23B04B: 特殊な通常戦闘用編成

オフセット 属性
#$00 #$FF モンスター 0
#$01 #$FF モンスター 1
#$02 #$FF モンスター 2
#$03 #$0F 表示位置調整 0
#$03 #$F0 頭数指定 0
#$04 #$0F 表示位置調整 1
#$04 #$F0 頭数指定 1
#$05 #$0F 表示位置調整 2
#$05 #$F0 頭数指定 2

各属性の意味は次のようなものとなる:

モンスター i

モンスター i とは、敵陣グループ i を構成するモンスターの ID を値とする属性だ。 ただし、値が #$FF であれば、グループ i にモンスターを割り当てないことを意味する。

表示位置調整 i

表示位置調整 i とは、敵陣グループ i にいるモンスターの描画位置を画面垂直方向に調整するための値を取る属性だと思われる。 どのオブジェクトも属性値が 0 につき、詳細不明。

頭数指定 i

頭数指定 i とは、グループ i に何頭のモンスターを割り当てるのかを抽選するために用いる ID 型配列属性だ。 ID とは、前述の定数テーブルの添字だ。

我々の印象に妙に残る「ブルーイーター数匹・エビルマスター・レッドイーター数匹」だとか 「はぐれメタル・メタルスライム数匹」だとかの遭遇パターンは、このオブジェクト配列によるものだ。

3.14.1.3. 構造体 $23D757: イベント戦専用編成

アドレス $23D757 にはバイトサイズ #$0D のオブジェクトが配列されている。 それらのオブジェクトの構造を次に示す:

表 3.56 構造体 $23D757: イベント戦専用編成

オフセット 属性
#$00 #$03 先制攻撃抽選
#$04 (未使用)
#$08 格闘場モード
#$10 乱入
#$20 パパス単独
#$40 逃走禁止
#$80 制限モード
#$01 #$FF モンスター 0
#$02 #$FF モンスター 1
#$03 #$FF モンスター 2
#$04 #$FF モンスター 3
#$05 #$FF 頭数 0
#$06 #$FF 頭数 1
#$07 #$FF 頭数 2
#$08 #$FF 頭数 3
#$09 #$FF 表示位置調整 0
#$0A #$FF 表示位置調整 1
#$0B #$FF 表示位置調整 2
#$0C #$FF 表示位置調整 3

各属性の意味は次のようなものとなる(未説明のもののみとする):

格闘場モード

格闘場モードとは、ウィンドウ表示およびテキスト描画の処理が格闘場でのそれになることを示すフラグ型の属性だ。 ただし、実際のデータではすべてのオブジェクトでこの値は 0 となっている。

乱入

乱入とは、戦闘中にパパスや妻が割り込んでくるイベントを含むことを示すフラグ型の属性だ。

パパス単独

パパス単独とは、これが自陣側がパパス一人による自動戦闘であることを示すフラグ型の属性だ。 この属性のある戦闘には、メインのコマンド入力ウィンドウが一切表示されない、 その終了後に仲間キャラクターが経験値を獲得しない、 ゴールドが入らない、モンスターが宝箱を落とさない、仲間にならない等の性質がある。

逃走禁止

逃走禁止とは、この戦闘を「にげる」コマンドで終了することが失敗することを示すフラグ型の属性だ。

制限モード

制限モードとは、ある一定の戦闘コマンドの振る舞いが制限されることを示すフラグ型の属性だ。 例えばビアンカのリボンやキメラのつばさの「つかう」時の挙動、 パルプンテの選択肢およびその挙動、 どくばり、キラーピアス、どくがのナイフ、ゆうわくのけん、まどろみのけん、あくまのツメ装備時の直接攻撃による付加効果、 敵側仲間呼びの結果、混乱時の挙動、 死亡時のメガンテのうでわの反応有無、 あるいは敵キャラクターの初期化に影響する。

3.14.2. 敵陣決定手順

敵陣決定手順を説明する。

戦闘地域を移動していると、一歩歩くたびにサブルーチン $23E7C2 が呼び出される。 このサブルーチンの冒頭で通常の戦闘用編成 ID を決定し、それから戦闘発生をするかどうかを決定し、 あとは敵陣を構成をしつつ、無理があれば中止するというのが大まかな処理手順だ。 以下、ID 決定直後から呼び出し元に戻るまでの制御を見ていこう。

TBW

3.14.3. データ

本節で説明したデータ構造それぞれのオブジェクト配列を単独の CSV ファイルに統合して 付録 B データ に収録する。 特に、論理的なまとまりを優先して CSV を作ったので、データフィールドの順序はメモリレイアウトを反映していないし、 一部のフィールド群については、それらが論理的に一体のものであるならば、一つの値にまとめた。