忌み鬼、マルギットが杖を振り上げ、空中で1.5秒止まった。
あなたはすでにローリングしている。意識より先に親指がBボタンを押していた——8回の死が一つのことを教え込んだからだ。マルギットの予備動作には二つの異なるコンボが隠されており、見分け方は杖先の振れ幅だけ。だが今回はそれを見極める前に転がってしまった。マルギットの溜め斬りは、あなたの無敵フレームが切れたまさにそのフレームに着弾した。YOU DIED。
9回目。画面を睨みながら、奇妙なことに気づき始める。死ねば死ぬほど、マルギットの挙動はむしろ「読みやすく」なっている。弱体化したからではない——ボスのデータは死ぬたびに何も変わっていない——あなたの脳がマルギットのモーションライブラリをルールセットにコンパイルしつつあるのだ。杖先が前傾=突進三段。杖先が上向き=聖なる槌の叩きつけ。距離が1キャラ分以上=飛び道具投擲。ルールは多くない。どれも明確で、どれも決まった応答ウィンドウに対応している。
これがフロム・ソフトウェアのゲームAIの最も直感に反する点だ。単純であればあるほど、賢く感じられる。
AIではなくPDA
2026年6月、nega.tvに投稿された技術リバースエンジニアリングの記事がHacker NewsとLobstersを席巻した。内容は驚くべき発見に要約できる。フロム・ソフトウェアの敵AIシステム——『デモンズソウル』から『エルデンリング』まで一貫して使われている——の正体は、ビヘイビアツリー(Behavior Tree)でも、GOAPプランナーでもなく、ましてやディープラーニングとは無縁だ。本質的には**プッシュダウン・オートマトン(PDA)**であり、Havok Script(すでに開発終了したゲーム向けLua方言)で記述され、データ構造は大半のAAAゲームのAIシステムより遥かにシンプルである。
フロム・ソフトウェアは内部でAIの基本単位を「Goal」と呼ぶ。Goalは不変の関数テーブルであり、三つの中核コールバックを含む。activate(初回実行時またはサブGoal枯渇後の再活性化)、update(毎フレーム呼び出し、Continue/Success/Failureを返す)、interrupt(外部イベントへの応答)。各Actor(NPCやボス)はGoalスタックを保持する——単純な有限ステートマシンではなく、スタック構造を持つPDAだ。
実行時ロジックは驚くほど素朴だ。毎フレーム、スタックトップのGoalを更新する。現在のGoalがサブ行動を展開する必要があれば、一束のサブGoalをスタックに積み、次のフレームから自動的に一番上のものが実行される。Goalが完了するとスタックからポップされる。あるGoalが失敗した場合、サブGoalチェーン全体がまとめてポップされ、制御は親Goalに戻る。
CoolBossBattleを例に取ろう。ボスのactivate関数には重み付きの行動候補セットがある。遠距離時:デスレイの重み15、ジャンプ攻撃の重み65。中距離時:グラウンドスラムの重み5、軽攻撃コンボの重み60、重攻撃コンボの重み35。重みは動的だ——クールダウン中の技は重みがゼロになり、ボスのHPが低いほど高危険度の技の重みが上がる。各意思決定サイクルは重み付きランダム選択を一回行い、対応する攻撃Goalをスタックに積むだけ。
ここに「プランニング」はない。ボスは3秒後にあなたがどこに立つかを予測せず、ワールドモデルを構築せず、モンテカルロ木探索もしない。各意思決定サイクルで、明確に定義された少数の条件(距離、クールダウン、HP、乱数)に基づいて、アクションテーブルからカードを一枚引いているだけだ。
だがなぜこんなに難しいのか
ここにこそ、フロム・ソフトウェアの設計思想の中核的なパラドックスがある。敵の行動を予測可能にすることが、戦闘をむしろ難しくしている。
よくある誤解は「難しい=賢い」だ。しかしコントローラーを投げつけたくなるゲーム体験を思い返してみてほしい。最もフラストレーションの溜まる死は、たいてい敵が賢すぎたからではない——敵が何をしているのか読めなかったからだ。NPCの行動がランダムで、一貫性がなく、「理不尽」に見えるとき、プレイヤーは「上達しなきゃ」から「このゲーム、ズルしてる」へと一瞬で切り替わる。学習プロセスは停止し、フラストレーションがすべてを支配する。
フロム・ソフトウェアのやり方は逆だ。各ボスのモーションライブラリは閉じている。各技の予備動作アニメーション、攻撃判定のアクティブフレーム、後隙モーションはすべて固定。ボスはあなたの戦い方を「学習」しない——同じ重み付きランダムプールから延々と技を出しているだけだ。しかしこれこそが、あなたがボスを学習できることを意味する。9回目の死と1回目の死の違いは、ボスが弱くなったのではなく、あなたの脳が決定論的システムのリバースエンジニアリングを完了したことだ。
Lobstersユーザーのicefoxが本質を言い当てている。「敵AIより賢い、というのが『エルデンリング』であなたが持つ数少ない優位性の一つだ。」この言葉は逆から読むとさらに正確だ。フロム・ソフトウェアがAIを「プレイヤーに出し抜かれるもの」として設計していることこそが、このシリーズの戦闘体験を成立させる前提なのである。
この設計思想をエンジニアリングの言葉で言えば:予測可能性=プレイアビリティ。創発的行動は複雑な意思決定アルゴリズムからではなく、シンプルなルールが異なるプレイヤー行動のもとで組み合わせ爆発を起こすことから生まれる。溜め斬りが名高いのは、高度なAIを使っているからではない——Attack Goalのアニメーション再生に待機フレームを何枚か余分に挿入しただけだ。プレイヤー視点でこれを翻訳すると、「フレームを数えられるようになれ」である。
なぜAAAゲームはML AIを追ってコケたのか
フロム・ソフトウェアのこの手法を現在のAAAゲームのAIトレンドの中に置くと、落差は滑稽なほどだ。
過去10年、ゲーム業界のAIナラティブの主旋律は「NPCをもっと賢く」だった。ビヘイビアツリーは事実上の業界標準となった——Halo 2が2004年に戦闘AI管理にBTを初めて大規模導入し、以降のHaloシリーズはBTを極限まで洗練させた。GOAP(Goal Oriented Action Planning)は2005年の『F.E.A.R.』で包囲し、遮蔽物を飛び越え、「いまリロード中だ」と叫ぶ敵AIによって神格化され、今なお語り継がれている。Utility AIは『The Sims』で複雑な日常生活シミュレーションを駆動できることを証明した。どの手法もフロム・ソフトウェアのPDAより複雑だ——BTにはシーケンスノード、セレクタノード、パラレルノード、デコレータノードがあり、GOAPはアクション空間のA*探索を必要とし、Utility AIは各選択肢にスコアをつける。
しかし複雑さには過小評価されがちな代償がある。制御不能だ。デザイナーが汎用プランナーに依存して行動シーケンスを自動生成させればさせるほど、NPCが特定の状況で何をするかを予測できなくなる。GOAPの古典的問題は「プランナーが時々、ドアを開けるのに梯子で叩くことを選ぶ」だ。ビヘイビアツリーの拡張には通常、「木が深すぎて誰にも読めなくなる」呪いが伴う。十数年前、BungieのDamian IslaはGDC講演で警告している——Halo 3のBTの複雑さは、デザイナーが行動の因果連鎖を完全に理解できないレベルに達していたと。
フロム・ソフトウェアにとって、これは問題ではない——彼らはAIに「自己プランニング」能力をそもそも与えていないからだ。各ボスの行動はデザイナーがフレーム単位で振り付ける。アニメーターが攻撃の前隙フレーム数と判定フレーム数を決める。戦闘デザイナーがクールダウン時間と重み分布を決める。プレイヤーが感じる「賢さ」は、この三層の手作業による磨き込みが重なり合って生まれる創発効果であり、何らかのアルゴリズムの自己判断ではない。
これが設計思想の分水嶺だ。一方は「AIに汎用知能フレームワークを与え、どう動くかはAIに任せる」。もう一方は「デザイナーに、十分シンプルで十分に組み合わせ可能な基盤を与え、AIのあらゆる意思決定を手動で制御させる」。フロム・ソフトウェアは後者に賭け、そして勝った。
割り込みシステム:隠れた難易度調整器
Goalスタックと重み付きランダム選択に加え、フロム・ソフトウェアのAIシステムには第三の脚がある。割り込み(Interrupt)だ。
各Goalは割り込みコールバックを登録できる。特定のイベントが発生したとき——プレイヤーがアイテムを使った、魔法を唱えた、ボスの背後の特定の空間領域に立った——割り込みイベントがGoalスタックを遡って浮上し、いずれかのGoalのinterruptコールバックがtrueを返して「このイベントは処理した」と宣言する。処理ロジックには、現在のGoalスタックのクリア、新しい攻撃Goalの即時プッシュ、親Goalの状態変更が含まれうる。
これが、鈴玉狩りがあなたの回復瓶を飲むモーションにほぼ確実に突進攻撃で反応する理由だ——その割り込みシステムにはこう書いてある。UseItemイベントの検出+85%の確率 → 現在のアクションをクリアし、即座に突進。あなたはボスが「入力を読んでいる」と思うかもしれないが、実際は単にハードコードされたイベントコールバックに応答しているだけだ。
このシステムの賢さは、デザイナーがボスのプレイヤー行動への反応強度を正確に制御できる一方で、そのロジックを基本的な意思決定ループに混ぜ込まずに済むことにある。ボスの日常行動(中距離 → 技テーブルからランダムドロー)とストレス反応行動(回復中 → 即座に妨害)は、独立した二つのロジック回路だ。
HNコメント欄で誰かが問うた。このシステムはSoulsborneのボス戦より複雑なシナリオを扱えるのか。nega.tv著者の回答は「かなり遠くまで行ける」。理由はシンプルだ。PDAフレームワークの複雑さはGoalの数と質に依存し、フレームワークそのものには依存しない。各村人が日々の生活パターンとソーシャルネットワークを持つオープンワールドを作りたい? おそらく数千のGoalと複雑な編成システムが必要だろう。しかし記憶に残るボス戦を作りたい? Goal十数個、Havok Script 200行で十分だ。
原点回帰:ローテクはなぜ勝ったのか
冒頭の問いに戻ろう。なぜフロム・ソフトウェアのステートマシンは大半のAAAゲームのAIより優れているのか。
答えは技術の中ではなく、設計思想の中にある。フロム・ソフトウェアはAIを「知能をシミュレートする」ツールとして一度も開発したことがない——彼らはAIを戦闘デザインの伝達媒体として扱ってきた。ボスの行動はデザイナーがプレイヤーに書く言語だ。一振り一振り、すべての硬直ウィンドウ、すべての「ここでもう一撃いける」というヒントは、意図的に設計されている。AIが複雑になりすぎ、予測不能になりすぎたとき、この言語は断裂する。プレイヤーはもはや「戦闘を学習」するのではなく、「乱数に耐える」だけになる。
より実務的な工学的利点もある。PDAの実行効率はBTをはるかに上回る——通常、毎フレームスタックトップのGoalだけを更新すればよく、ルートノードからツリー全体を再走査する必要がない。フロム・ソフトウェアのGoalシステムは制御フローを命令型コードに書き、データモデルは極限まで簡素化されている——各Actorは単なる浮動小数点配列であり、Goalはインデックスで読み書きする。ブラックボードも、イベントバスも、複雑なコンディション/シーケンス/セレクタのノードツリーもない。nega.tv著者が更新記事で特に強調しているように、大半のAAAゲームでは「数万ノードのビヘイビアツリーに、制御フローとアクションを実装する数百の独立ノード」を目にすることになるが、フロム・ソフトウェアの単一ボスの行動は通常「かなり小さい」。
もちろん、PDAが万能薬というわけではない。Havok ScriptでAIを書くことは、ビジュアル行動編集ツールに基本的に別れを告げることを意味する——デザイナーはコードを書かなければならない。割り込みシステムのデバッグ難度もGoalスタックの深さに応じて指数関数的に増大する。汎用プランナーがないことは、各ボスの行動が一点ものの手作りであり、使い回せないことを意味する——だがフロム・ソフトウェアにとって、それはバグではなくフィーチャーだ。
技術的選択の正しさは、最終的にその先進性ではなく、解決すべき問題にマッチしているかどうかで決まる。フロム・ソフトウェアが解決しようとしたのは「より賢いAIを作る」ことではなく、「より可読で、より学習可能で、よりフェアな敵を作る」ことだ。GOAPではなくPDAを、ディープラーニングではなくステートマシンを使うのは、彼らが遅れているからではない——彼らが求めるものが、たまたまローテクの提供できるものだっただけだ。
本稿の素材は公開情報とコミュニティ議論に基づいています。この話題についてより深い実務経験をお持ちの方は、文中の不足点をぜひご指摘ください。