敵軍の全個体を確定させる敵編成処理について。
敵編成処理には以下の要素が影響する:
処理の流れを記す。まず敵軍の個体数と「敵軍の強さ」を以下のように初期化する:
次にランダム敵追加処理を行う。準備として「自軍の強さ」という値を定義する:
(自軍の強さ) = ((PT全員のレベルの総和) / 2) & 0xFF
(本来の型は u16
だが、下位バイトしか参照されないので実質 u8
値となっている)。ランダム敵追加処理の疑似コードを以下に示す:
// 固定編成の場合、ランダム敵を追加できるかどうかの判定を先に行う。
if (固定編成である)
if (敵軍の強さ) >= (自軍の強さ)
処理終了
if (敵の個体数) >= min(15, (このマップの敵個体数上限))
処理終了
// ランダム敵を追加できるだけ追加する。
// 追加する敵種を決め、それを数体ずつ追加することを繰り返す。
loop
// 追加するランダム敵のモンスターランクを決める。
// 主人公のレベルとマップのモンスターランク範囲が影響する。
// 関数 f は以下の確率分布で 0..=4 の乱数を返す:
// 0:50%, 1:20%, 2:15%, 3:10%, 4:5%
(モンスターランク上限) = (主人公のレベル) / 2 + f()
(モンスターランク) = if (モンスターランク上限) == 0
1
else
(モンスターランク上限) = min((このマップのモンスターランク上限), (モンスターランク上限))
rand(1..=(モンスターランク上限))
(モンスターランク) = max((このマップのモンスターランク下限), (モンスターランク))
// ランダム敵のモンスターランクは 10 が上限。
(モンスターランク) = min(10, (モンスターランク))
// 追加するランダム敵のモンスターランク内IDを決める。
// ランク 12 以外は全てちょうど 16 種のモンスターを含むことに注意。
(モンスターランク内ID) = rand(1..=16)
// この敵種を何体追加するかを決める。
// 1 回ごとの追加個体数上限はモンスターごとに定められている。
// 万一追加個体数上限が 0 の場合、モンスターランク決定からやり直す (該当するのはシェルテムのみ)。
(追加個体数上限) = (モンスターデータ内の値)
if (追加個体数上限) == 0
continue
(追加個体数) = rand(1..=(追加個体数上限))
// この敵種を (追加個体数) だけ追加することを試みる。途中で追加できなくなったらループ終了。
for _ in 0..(追加個体数)
(敵軍の強さ) += (モンスターランク)
敵リスト末尾にこの敵種の個体を追加
// 次の個体を追加できるかどうかの判定。
if (敵の個体数) >= min(15, (このマップの敵個体数上限))
break
if (敵軍の強さ) > (自軍の強さ) // ここでは等号が付かないことに注意
break
// 次の敵種を追加できるかどうかの判定。
if (敵軍の強さ) >= (自軍の強さ)
break
if (敵の個体数) >= min(15, (このマップの敵個体数上限))
break
注: モンスターランク決定時には一旦 1..=(モンスターランク上限)
の乱数を発生してからマップのモンスターランク下限との max をとっているため、マップのモンスターランク範囲の分布は一様ではない(下限の値が出やすい)。