この節では戦闘モードに移行する際における敵方の編成を決定する情報および処理について述べる。 まずは、プログラムが敵方編成を決定するのに必要なデータ型について解説する。 これらのデータ型では登場する可能性のあるモンスターや頭数等の情報が含まれる。 そして、ランダム発生戦闘における敵方編成の仕組みについて、プログラムされた処理を構成するコードを検討していく。 読者は本節で述べる構造体データを CSV にしたものを 付録 B データ から参照できる。
プログラムが敵方編成を決定するのに利用するデータについて解説する。
一般の戦闘では構造体 $C6843C と構造体 $C58F64とが、
イベント戦闘には構造体 $C88DF4 のオブジェクトが敵陣を決定するのに用いられる。
以下、それぞれのデータ型の構成について記す。
アドレス $C6843C にはバイトサイズ #$16 のオブジェクトが
#$85 個配列されている。
自陣パーティーが戦闘地域を移動すると、一定の規則と乱数によって敵と遭遇する。
この配列はそれを制御するためのオブジェクトからなる。
それらのオブジェクトの構造を次に示す:
表 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.23 移動中の呪文コマンド処理 や 4.12 職業 の記述を参照して欲しい。
この属性値は、このオブジェクトに対応する戦闘地域をパーティーが歩き回ることによって減少する「戦闘発生カウンター」に対する減少量を制御するのに用いられる。
        具体的に言えば、この属性値は配列 $C3015C の添字を決定するものであり、
        配列の内容が定義する係数は次のようなものだ:
      
この属性はブーリアン型であり、その値は戦闘終了後に倒したモンスターが仲間になりたそうになる抽選処理を実行しないことを表す。 簡単に言うと、この値が 0 のオブジェクトから引き起こされる戦闘ではモンスターを仲間にできない。
#$00..#$0A)
              頻度とは、敵陣のグループ数や構成モンスターを大まかに決定するのに用いられる数値型配列属性だ。 前作と同様の抽選方式で敵陣が固定構成か単独グループからなるのか複数グループからなるのかを決める。
        敵陣グループ固定戦とは、先述の大まかな抽選処理で敵陣グループ固定戦に決定するときに採用されるオブジェクトの ID を値とする属性だ。
        そのオブジェクトとは、4.17.1.2 構造体 $C58F64: 敵陣グループ固定戦 で述べるものに他ならない。
      
グループ単数時頭数 k とは、敵陣が単独グループから構成されるときに、 何頭のモンスターがこのグループを構成するのかを決めるコードのジャンプテーブルの行 ID を表す属性だ。 次の表が示すように、必要ならば乱数を用いて頭数を定める:
グループ単数時モンスター k とは、敵陣が単独グループから構成されるときに、 敵陣を構成するモンスターの ID を表す属性だ。
モンスターについては 4.14 モンスター で述べる。
追加グループ数頻度 k とは、先に述べた大まかな抽選により敵陣を複数グループで構成することを決定した後に、 グループ 0 の他にあといくつグループを追加するのかを抽選するために用いる数値型配列属性だ。
追加グループ数の抽選方式の処理は、大まかな抽選処理とコードを共有している。
グループ複数時頭数 k とは、敵陣が複数グループから構成されるときに、 グループ k をなすモンスターの頭数の上限値を表す属性だ。 例えばこの属性値が 3 だとすると、グループ k の頭数の取り得る値が 0..3 であることを意味する。
グループ複数時モンスター k とは、敵陣が複数グループから構成されるときに、 グループ k をなすモンスターの ID を表す属性だ。 データとしては k = 4 のものに意味があるかどうかが怪しい。
アドレス $C58F64 には #$06 バイト長のオブジェクトが
#$23 個配列されている。
正規の抽選処理から分岐して、こちらのオブジェクトのいずれかで敵陣を指定するという場合が起こり得る。
オブジェクトの構造を次に示す:
表 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 を構成するモンスターの ID を値とする属性だ。
頭数 k とは、敵陣グループ k を構成するモンスターの頭数を決めるコードのジャンプテーブルの行 ID を表す属性だ。 先述の 表 4.73 ジャンプテーブル $C3F862 による指定頭数 を用いる。
アドレス $C88DF4 にはバイトサイズ #$0B のオブジェクトが
#$4C 個配列されている。
このオブジェクト群は固定戦闘とイベント戦闘の構成を表現するためのものだ。
それらのオブジェクトの構造を次に示す:
表 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 が妥当な属性値だ。 このオブジェクトが罠でないイベント戦に関係しているのであれば、この属性値は参照されないものとする。
文字列については 4.2 文字列 で述べる。
        戦闘中の背景画像を指示するための ID を値とする属性だ。
        具体的に言えば配列 $C60000 の添字となる。
      
戦闘中の BGM の ID を値とする属性だ。
戦闘の冒頭に黒い矩形が回転する演出をカットすることを示すブーリアン型属性だ。
戦闘終了時の画面処理に関係するブーリアン型属性だ。詳細不明。
        4.17.1.1 構造体 $C6843C: 通常の戦闘用編成 の同名属性と同じ意味だ。
      
逃走禁止とは、こちら側の「にげる」コマンドのが成功を禁止するかどうかを意味するブーリアン型属性だ。
しょうかん許可とは、戦闘中に「しょうかん」コマンドを実行すると精霊に祈りが届くかどうかを意味するブーリアン型属性だ。
モンスター k とは、敵陣グループ k を構成するモンスターの ID を値とする属性だ。
頭数 k とは、敵陣グループ k を構成するモンスターの頭数を値とする属性だ。
敵陣決定手順を説明する。 最初に、戦闘地域を移動中に一歩ずつ行われる判定処理の概要を記す:
「しのびあし」「トヘロス」「せいすい」のいずれかを適用している状態ならば、 主人公のレベルと戦闘構成オブジェクトのレベル + 5 を比較する。
主人公のレベルのほうが小さくなければ、戦闘を発生させずに判定処理を終える。
戦闘発生カウンターを更新する。 減少量を決めるのに戦闘発生カウンター減少量係数属性値を参照。 減少量を求め、その値を戦闘発生カウンターから差し引く。
戦闘発生カウンターがまだ正の値ならば、戦闘を発生させずに判定処理を終える。
判定処理で戦闘発生が確定すると、次に敵陣を構成する処理を行う。それは次に述べるようなものだ:
r = randint(0, S) を取る。
      戦闘構成オブジェクトの頻度属性値の部分和 s を求め、
      s >= r なる頻度属性値添字 k を求める。
      この添字 k の値により、次の (a), (b), (c) のいずれかの処理を行う:
    
分岐 (a) の処理は 4.17.1.2 構造体 $C58F64: 敵陣グループ固定戦 で述べた。
分岐 (b) の処理は、モンスターと頭数をグループ単数時モンスター k とグループ単数時頭数 k によりそれぞれ定める。
この k は先の k から定数 #$000A すなわち 5 * 2 を引いたものを用いる。
具体的な頭数の決定方法は 4.17.1.1 構造体 $C6843C: 通常の戦闘用編成 の属性のところで説明した。
分岐 (c) の処理は、次のようなものだ:
追加グループ数を抽選する。
戦闘構成オブジェクトの追加グループ数頻度 k 属性値に対して、 先ほどの総和・部分和比較処理相当のことを行う。
#$00..#$04 を確率変数として総和・部分和比較方式で抽選して決める。
    randint(0, 複数時頭数属性値) とする。