マイトアンドマジック (FC) 攻略/解析 - エンカウント

敵編成処理

敵軍の全個体を確定させる敵編成処理について。

敵編成処理には以下の要素が影響する:

処理の流れを記す。まず敵軍の個体数と「敵軍の強さ」を以下のように初期化する:

「敵軍の強さ」について 後述のランダム敵追加処理を見るとわかるように、「敵軍の強さ」は「全ての敵個体のモンスターランクの総和」とみなせる。ただし、固定編成の場合はイベント側で恣意的な初期値が設定される(固定敵の内容によらない)。これは、「数種類の固定編成からランダムに選ぶ」などのパターンもあるため、その都度モンスターランクの総和を求める手間を省いたものと思われる。

次にランダム敵追加処理を行う。準備として「自軍の強さ」という値を定義する:

ランダム敵追加処理の疑似コードを以下に示す:

// 固定編成の場合、ランダム敵を追加できるかどうかの判定を先に行う。
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 をとっているため、マップのモンスターランク範囲の分布は一様ではない(下限の値が出やすい)。