[プラグイン] IntelliPatch — RPG Maker MZ用の動的リアクティブA*経路探索


IntelliPatch — RPG Maker MZ 用の動的リアクティブ A* パスファインディング

ギャラリーファースト

g1
g2
g3
g4

バージョン: 2.0.6
作者: Rpx & Just Dev
GitHub: https://github.com/Rp-ics/RMMZ_IntelliPatch_Plugin
Discord: https://discord.gg/fXcK6u22gQ
Itchio: https://r-px.itch.io/


IntelliPatch とは?

IntelliPatch は、リアクティブで動的なナビゲーションに焦点を当てた、RPG Maker MZ 用のタイルベース A* パスファインディングプラグインです。単に「A から B へ移動する」だけでなく、リアルタイムで再計算を行い、移動中のターゲットにも対応し、パスの計算タイミングと方法を完全に制御できます。

CPU リソースを消費しすぎることなく、賢い NPC を必要とするプロジェクト向けに構築されています。


機能

  • バイナリヒープを用いたタイルベース A*(高速、依存関係なし)
  • プログラム可能なナビゲーションパッチ — コスト、ブロック、強制、ポータル、条件付き
  • フレームごとのラウンドロビン再計算スケジューラ — 制限付き、優先度付き、トークンバケット方式
  • パススムージング(ブレンハムの直線視界によるストレージング)
  • デバッグオーバーレイ — 緑:パス、赤:ブロック済み、黄:パッチ済み、灰:訪問済み
  • 立ち往生ポリシー — 再計算、原点復帰、後退再試行、ランダム、ゴースト、断念
  • ゴールシステム — 複合可能なマルチターゲットゴール(任意、すべて、シーケンス、最寄、重み付け、条件付きなど)
  • 拡張性 — カスタムヒューリスティック、コスト関数、パッチタイプ、ゴールモード、待機条件、ステアリング動作を登録可能
  • VisuStella 互換 — ベースクラスにフックするため、Events & Movement Core との競合なし

クイックスタート

  1. IntelliPatch.js を js/plugins/ にコピー
  2. プラグインマネージャーで有効化
  3. ロード順: VisuStella Events/Movement Core の後、Game_CharacterBase.update をオーバーライドするプラグインより前に配置

その後、スクリプト呼び出しまたは移動ルートから:

IntelliPatch.moveTo(this, 15, 20);

またはプラグインコマンド(MoveTo、FollowTarget、WanderArea など)を使用。


例:NPC がプレイヤーを追跡

IntelliPatch.moveTo(this, $gamePlayer.x, $gamePlayer.y, {
  avoidEvents: true,
  allowTouch: true,
  diagonal: true,
  stuckPolicy: "recalc",
  onArrive: function() { $gameMessage.add("Caught!"); }
});

例:低速ゾーンにコストパッチ適用

IntelliPatch.addPatch({
  id: "mud",
  type: "cost",
  area: { x: 3, y: 3, w: 5, h: 5 },
  data: { multiplier: 3.0 }
});
IntelliPatch.wander(this, { x1: 1, y1: 1, x2: 10, y2: 10 });

例:スイッチで開くドア

IntelliPatch.addPatch({
  id: "door",
  type: "block",
  area: { x: 12, y: 8, w: 1, h: 1 },
  condition: function() { return !$gameSwitches.value(5); }
});
IntelliPatch.moveTo(this, 15, 8);

パッチタイプ

タイプ 説明
cost 移動コストを乗算(泥、荒れた地形など)
block タイルを通行不可にする
force 特定の方向に押し出す(風、潮流など)
portal タイル A からタイル B へのテレポート
conditional カスタムコールバックでコストまたはブロックを決定

立ち往生ポリシー

代替ルートが存在しない場合、IntelliPatch は設定されたポリシーを実行します:

  • recalc — 再試行を続ける(デフォルト、断念しない)
  • origin — 開始地点に戻り、その後失敗とする
  • back_retry — 軌跡を後退して再試行
  • random — ランダムなタイルにワandering して再試行
  • ghost — N タイル分衝突判定をオフ(パッチは適用される)
  • giveup — その場で停止し、onFail を発火

ゴールシステム

複合可能なゴールにより、NPC を複雑なターゲットへ誘導できます:

IntelliPatch.moveToGoal(this, {
  mode: "sequence",
  points: [{x: 5, y: 5}, {x: 10, y: 10}, {x: 15, y: 15}]
});

対応モード: any, all, sequence, closest, farthest, random, weighted, conditional, sequenceThenLoop, sequenceThenReverse, eventAt, eventAtAny, guardPost, twoEventsMeet, simultaneous, swap など。


デバッグオーバーレイ

DebugMode を true に設定するか、IntelliPatch.debug() を呼び出します。

  • 緑 = アクティブなパス
  • 赤 = ブロック済み / 失敗したターゲット
  • 黄 = パッチ済みタイル
  • 灰 = 訪問済みノード
  • 紫 = ゴールポイント
  • シアン = キャラクター → ターゲットの直線

タイルをクリック(DebugMode 有効時)または IntelliPatch.debugTile(x, y) を呼び出すと、そのタイルのすべてのパッチ修飾子をログに出力します。


IntelliPatch の拡張

ファイル編集は不要です。ランタイムでカスタム動作を登録します:

IntelliPatch.registerHeuristic("biased", function(x0, y0, x1, y1) {
  var base = Math.abs(x0 - x1) + Math.abs(y0 - y1);
  if ($gamePlayer.direction() === 6 && x1 > x0) base *= 0.7;
  if ($gamePlayer.direction() === 4 && x1 < x0) base *= 0.7;
  return base;
});
IntelliPatch.setGlobalConfig("defaultHeuristic", "biased");

利用可能なレジストリ:

  • registerHeuristic(name, fn)
  • registerCostFunction(name, fn)
  • registerPatchType(name, handlers)
  • registerGoalMode(name, resolver)
  • registerWaitCondition(name, fn)
  • registerSteeringBehavior(name, fn)
  • registerCallback(hook, fn)
  • registerPreRecalc(fn) / registerPostRecalc(fn)
  • registerOnMapChange(fn) / registerOnArrival(fn)

動画シリーズ

IntelliPatch に関するフル動画シリーズを作成中です:

  • Ep. 1 — イントロ
  • Ep. 2 — 問題点 vs 解決策
  • Ep. 3 — セットアップとパラメータ
  • Ep. 4 — スクリプト呼び出しとプラグインコマンド
  • …その他多数
    https://youtu.be/BQJ8TGwz_Bc

フィードバックとバグ報告

バグ、提案、フィードバックはこのスレッドに投稿するか、GitHub でイシューを開いてください。

プロジェクトで IntelliPatch を使用している場合は、ぜひ見せてください!スクリーンショットやクリップを共有してください!


クレジット

  • Rpx & Just Dev • プラグイン作者 (任意)
  • RPG Maker MZ コミュニティ向けに構築

ライセンス: 詳細は GitHub リポジトリをご参照ください。