4.17. 敵との遭遇

4.17.1. モデル
4.17.1.1. 構造体 $C6843C: 通常の戦闘用編成
4.17.1.2. 構造体 $C58F64: 敵陣グループ固定戦
4.17.1.3. 構造体 $C88DF4: イベント戦専用編成
4.17.2. 敵陣決定手順

この節では戦闘モードに移行する際における敵方の編成を決定する情報および処理について述べる。 まずは、プログラムが敵方編成を決定するのに必要なデータ型について解説する。 これらのデータ型では登場する可能性のあるモンスターや頭数等の情報が含まれる。 そして、ランダム発生戦闘における敵方編成の仕組みについて、プログラムされた処理を構成するコードを検討していく。 読者は本節で述べる構造体データを CSV にしたものを 付録 B データ から参照できる。

4.17.1. モデル

プログラムが敵方編成を決定するのに利用するデータについて解説する。 一般の戦闘では構造体 $C6843C と構造体 $C58F64とが、 イベント戦闘には構造体 $C88DF4 のオブジェクトが敵陣を決定するのに用いられる。 以下、それぞれのデータ型の構成について記す。

4.17.1.1. 構造体 $C6843C: 通常の戦闘用編成

アドレス $C6843C にはバイトサイズ #$16 のオブジェクトが配列されている。 自陣パーティーが戦闘地域を移動すると、一定の規則と乱数によって敵と遭遇する。 この配列はそれを制御するためのオブジェクトからなる。 それらのオブジェクトの構造を次に示す:

表 4.70 構造体 $C6843C

オフセット 属性
#$00 #$00FF レベル
#$01 #$0003 先制攻撃抽選
#$01 #$001C 戦闘発生カウンター減少量係数
#$01 #$0020 仲間処理無視
#$01 #$01C0 追加グループ数頻度 0
#$02 #$000E 追加グループ数頻度 1
#$02 #$0070 追加グループ数頻度 2
#$02 #$0380 頻度 #$00
#$03 #$001C グループ複数時頭数 0
#$03 #$1FE0 グループ複数時モンスター 0
#$04 #$00E0 頻度 #$01
#$05 #$0007 グループ複数時頭数 1
#$05 #$07F8 グループ複数時モンスター 1
#$06 #$0038 頻度 #$02
#$06 #$01C0 グループ複数時頭数限 2
#$07 #$01FE グループ複数時モンスター 2
#$08 #$000E 頻度 #$03
#$08 #$0070 グループ複数時頭数 3
#$08 #$7F80 グループ複数時モンスター 3
#$09 #$0380 頻度 #$04
#$0A #$001C グループ複数時頭数 4
#$0A #$1FE0 グループ複数時モンスター 4
#$0B #$00E0 頻度 #$05
#$0C #$0007 グループ単数時頭数 0
#$0C #$07F8 グループ単数時モンスター 0
#$0D #$0038 頻度 #$06
#$0D #$01C0 グループ単数時頭数 1
#$0E #$01FE グループ単数時モンスター 1
#$0F #$000E 頻度 #$07
#$0F #$0070 グループ単数時頭数 2
#$0F #$7F80 グループ単数時モンスター 2
#$10 #$0380 頻度 #$08
#$11 #$001C グループ単数時頭数 3
#$11 #$1FE0 グループ単数時モンスター 3
#$12 #$00E0 頻度 #$09
#$13 #$0007 グループ単数時頭数 4
#$13 #$07F8 グループ単数時モンスター 4
#$14 #$0038 頻度 #$0A
#$14 #$3FC0 敵陣グループ固定戦

戦闘発生抽選処理が変わったこと以外は、前作とほぼ同じモデルであると言える。 以下に各属性の概要を記す(説明の便宜上、属性の順序をメモリーレイアウトと合致させていない)。

レベル

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

例えば「トヘロス」系コマンド使用中の敵との遭遇条件、 プレイヤー側の「にげる」コマンドの成功条件、 敵キャラクターの戦闘コマンド決定ルーチン、 あるいは戦闘終了後において、職業経験値が増える条件等に影響する。

仲間キャラクターと敵キャラクターのレベルについては 4.20 レベルアップ4.14 モンスター をそれぞれ参照して欲しい。

先制攻撃抽選

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

具体的にはこの属性値は配列 $C3F9AE の添字を決定するものであり、 配列の内容が定義する先制攻撃発生条件は次のようなものだ:

表 4.71 配列 $C3F9AE: 先制発生率

ID 自陣側 敵陣側
0 1/32 1/32
1 1/32 0
21/8 1/32
31/8 1/8

これらの確率は「しのびあし」コマンドの適用状態やドラゴン職の仲間の有無で変動する。 4.23 移動中の呪文コマンド処理4.12 職業 の記述を参照して欲しい。

戦闘発生カウンター減少量係数

この属性値は、このオブジェクトに対応する戦闘地域をパーティーが歩き回ることによって減少する「戦闘発生カウンター」に対する減少量を制御するのに用いられる。

具体的に言えば、この属性値は配列 $C3015C の添字を決定するものであり、 配列の内容が定義する係数は次のようなものだ:

表 4.72 配列 $C3015C: 戦闘発生カウンター減少量係数

ID 係数
0 1/2
1 2/3
2 3/4
3 1
4 5/4
5 3/2
6 7/4
7 2

仲間処理無視

この属性はブーリアン型であり、その値は戦闘終了後に倒したモンスターが仲間になりたそうになる抽選処理を実行しないことを表す。 簡単に言うと、この値が 0 のオブジェクトから引き起こされる戦闘ではモンスターを仲間にできない。

頻度 k (k = #$00..#$0A)

頻度とは、敵陣のグループ数や構成モンスターを大まかに決定するのに用いられる数値型配列属性だ。 前作と同様の抽選方式で敵陣が固定構成か単独グループからなるのか複数グループからなるのかを決める。

敵陣グループ固定戦

敵陣グループ固定戦とは、先述の大まかな抽選処理で敵陣グループ固定戦に決定するときに採用されるオブジェクトの ID を値とする属性だ。 そのオブジェクトとは、4.17.1.2 構造体 $C58F64: 敵陣グループ固定戦 で述べるものに他ならない。

グループ単数時頭数 k (k = 0..4)

グループ単数時頭数 k とは、敵陣が単独グループから構成されるときに、 何頭のモンスターがこのグループを構成するのかを決めるコードのジャンプテーブルの行 ID を表す属性だ。 次の表が示すように、必要ならば乱数を用いて頭数を定める:

表 4.73 ジャンプテーブル $C3F862 による指定頭数

ID 頭数
0 1
1 2
2 3
3 1..2
4 2..3
5 3..4
6 4..7
7 8

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

グループ単数時モンスター k とは、敵陣が単独グループから構成されるときに、 敵陣を構成するモンスターの ID を表す属性だ。

モンスターについては 4.14 モンスター で述べる。

追加グループ数頻度 k (k = 0..2)

追加グループ数頻度 k とは、先に述べた大まかな抽選により敵陣を複数グループで構成することを決定した後に、 グループ 0 の他にあといくつグループを追加するのかを抽選するために用いる数値型配列属性だ。

追加グループ数の抽選方式の処理は、大まかな抽選処理とコードを共有している。

グループ複数時頭数 k (k = 0..4)

グループ複数時頭数 k とは、敵陣が複数グループから構成されるときに、 グループ k をなすモンスターの頭数の上限値を表す属性だ。 例えばこの属性値が 3 だとすると、グループ k の頭数の取り得る値が 0..3 であることを意味する。

グループ複数時モンスター k (k = 0..4)

グループ複数時モンスター k とは、敵陣が複数グループから構成されるときに、 グループ k をなすモンスターの ID を表す属性だ。 データとしては k = 4 のものに意味があるかどうかが怪しい。

4.17.1.2. 構造体 $C58F64: 敵陣グループ固定戦

アドレス $C58F64 にはバイトサイズ #$06 のオブジェクトが配列されている。 正規の抽選処理から分岐して、こちらのオブジェクトのいずれかで敵陣を指定するという場合が起こり得る。 オブジェクトの構造を次に示す:

表 4.74 構造体 $C58F64

オフセット 属性
#$00 #$00FF モンスター 0
#$01 #$0007 頭数 0
#$01 #$07F8 モンスター 1
#$02 #$0038 頭数 1
#$02 #$3FC0 モンスター 2
#$03 #$01C0 頭数 2
#$04 #$01FE モンスター 3
#$05 #$000E 頭数 3

以下に各属性の概要を記す。

モンスター k (k = 0..3)

モンスター k とは、敵陣グループ k を構成するモンスターの ID を値とする属性だ。

頭数 k (k = 0..3)

頭数 k とは、敵陣グループ k を構成するモンスターの頭数を決めるコードのジャンプテーブルの行 ID を表す属性だ。 先述の 表 4.73 ジャンプテーブル $C3F862 による指定頭数 を用いる。

4.17.1.3. 構造体 $C88DF4: イベント戦専用編成

アドレス $C88DF4 にはバイトサイズ #$0B のオブジェクトが配列されている。 このオブジェクト群は固定戦闘とイベント戦闘の構成を表現するためのものだ。 それらのオブジェクトの構造を次に示す:

表 4.75 構造体 $C88DF4

オフセット 属性
#$00 #$FFFF 文字列 ID
#$02 #$007F 背景 ID
#$02 #$FF80 BGM
#$04 #$0001 開始時の画面処理
#$04 #$0002 終了時の画面処理
#$04 #$0004 仲間処理無視
#$04 #$0008 逃走禁止
#$04 #$0010 しょうかん許可
#$04 #$1FE0 モンスター 0
#$05 #$00E0 頭数 0
#$06 #$00FF モンスター 1
#$07 #$0007 頭数 1
#$07 #$07F8 モンスター 2
#$08 #$0038 頭数 2
#$08 #$3FC0 モンスター 3
#$09 #$01C0 頭数 3
#$0A #$00FE (未使用)

以下に各属性の概要を記す。

文字列 ID

これは「しらべる」コマンドで対象物が罠であるときに、メッセージウィンドウ中に埋め込まれる文字列の ID を値とする属性だ。 例としては「ミミック」や「あくまのツボ」を意味する ID が妥当な属性値だ。 このオブジェクトが罠でないイベント戦に関係しているのであれば、この属性値は参照されないものとする。

文字列については 4.2 文字列 で述べる。

背景 ID

戦闘中の背景画像を指示するための ID を値とする属性だ。 具体的に言えば配列 $C60000 の添字となる。

BGM

戦闘中の BGM の ID を値とする属性だ。

開始時の画面処理

戦闘の冒頭に黒い矩形が回転する演出をカットすることを示すブーリアン型属性だ。

終了時の画面処理

戦闘終了時の画面処理に関係するブーリアン型属性だ。詳細不明。

仲間処理無視

4.17.1.1 構造体 $C6843C: 通常の戦闘用編成 の同名属性と同じ意味だ。

逃走禁止

逃走禁止とは、こちら側の「にげる」コマンドのが成功を禁止するかどうかを意味するブーリアン型属性だ。

しょうかん許可

しょうかん許可とは、戦闘中に「しょうかん」コマンドを実行すると精霊に祈りが届くかどうかを意味するブーリアン型属性だ。

モンスター k

モンスター k とは、敵陣グループ k を構成するモンスターの ID を値とする属性だ。

頭数 k

頭数 k とは、敵陣グループ k を構成するモンスターの頭数を値とする属性だ。

4.17.2. 敵陣決定手順

敵陣決定手順を説明する。 最初に、戦闘地域を移動中に一歩ずつ行われる判定処理の概要を記す:

  • 必要ならば「しのびあし」の状態を更新する。
  • 必要ならば「トヘロス」または「せいすい」の状態を更新する。
  • 「しのびあし」「トヘロス」「せいすい」のいずれかを適用している状態ならば、 主人公のレベルと戦闘構成オブジェクトのレベル + 5 を比較する。

    主人公のレベルのほうが小さくなければ、戦闘を発生させずに判定処理を終える。

  • 戦闘発生カウンターを更新する。 減少量を決めるのに戦闘発生カウンター減少量係数属性値を参照。 減少量を求め、その値を戦闘発生カウンターから差し引く。

    戦闘発生カウンターがまだ正の値ならば、戦闘を発生させずに判定処理を終える。

判定処理で戦闘発生が確定すると、次に敵陣を構成する処理を行う。それは次に述べるようなものだ:

  • 戦闘構成オブジェクトの頻度属性値の総和 S を取る。
  • 乱数 r = randint(0, S) を取る。
  • 戦闘構成オブジェクトの頻度属性値の部分和 s を求め、 s >= r なる頻度属性値添字 k を求める。 この添字 k の値により、次の (a), (b), (c) のいずれかの処理を行う:

    • (a) 添字 k が上限値のときには対応する敵陣グループ固定戦オブジェクトから敵陣を構成する。
    • (b) 添字 k が配列後半にあれば単独グループを構成する処理を行う。
    • (c) そうでなければ複数グループを構成する処理を行う。
  • 戦闘構成オブジェクトのレベルと仲間処理無視フラグの属性値をしかるべきビットにセットする。

分岐 (a) の処理は 4.17.1.2 構造体 $C58F64: 敵陣グループ固定戦 で述べた。

分岐 (b) の処理は、モンスターと頭数をグループ単数時モンスター k とグループ単数時頭数 k によりそれぞれ定める。 この k は先の k から定数 #$000A すなわち 5 * 2 を引いたものを用いる。 具体的な頭数の決定方法は 4.17.1.1 構造体 $C6843C: 通常の戦闘用編成 の属性のところで説明した。

分岐 (c) の処理は、次のようなものだ:

  • 追加グループ数を抽選する。

    戦闘構成オブジェクトの追加グループ数頻度 k 属性値に対して、 先ほどの総和・部分和比較処理相当のことを行う。

  • 各グループについて添字 k を、頻度 #$00..#$04 を確率変数として総和・部分和比較方式で抽選して決める。
  • 戦闘構成オブジェクトのグループ複数時モンスター k 属性値とグループ複数時頭数 k 属性値からモンスターと頭数をそれぞれ決定する。 具体的な頭数の決定方法は randint(0, 複数時頭数属性値) とする。