今回はRPGツクールMZで、ドラゴンクエストの「ルーラ」と「リレミト」のようなスキルを作っていきます。
ルーラは、一度訪れた街へワープできるスキルです。一方、リレミトはダンジョンの中から脱出できるスキルです。
ただ、そのままの名前で作るのも少し味気ないので、この記事ではルーラ風のスキルを「ワープ」、リレミト風のスキルを「エスケープ」として作ります。
1. ワープとエスケープの仕様
まずは、それぞれのスキルにどんな役割を持たせるかを決めておきます。
ワープの特徴
ワープは、訪問済みの街へ移動できるスキルです。
- 一度訪れた街にワープできる
- ただし、ダンジョンはワープ先に含めない
- 一度訪れた街が、ワープリストに追加されていく
- ダンジョン内では使えない
エスケープの特徴
エスケープは、ダンジョンから脱出するためのスキルです。
- ダンジョンの中でしか使えない
- 特定のダンジョンでは使えない
- ダンジョンの入り口に戻ることができる
たとえば「魔王の城ではエスケープを使えない」といった制限も、この仕組みで作れます。
テスト用のマップ構成
今回は、テスト用に次のようなマップを用意します。
| ID | マップ名 | 種別 |
|---|---|---|
| 1 | フィールド | フィールド |
| 2〜4 | 北海道・東京・福岡 | 街(ワープ対象) |
| 5〜7 | 新潟・鳥取・徳島 | ダンジョン(エスケープ対象) |
この構成をもとに、ワープとエスケープを順番に作っていきます。
2. ワープの作り方
ワープは、訪問済みの街だけを選択肢に表示する仕組みで作ります。
大まかな流れは次の通りです。
- スキルから呼び出すコモンイベント「ワープリスト」を作る
- 一度訪れた街をワープリストに追加するコモンイベントを作る
- 特定のダンジョンではワープを使えないようにする
スキル「ワープ」を作成する
まず、データベースのスキルを開いて「ワープ」というスキルを作ります。
設定は次のようにします。
- 消費MP: 0
- 使用効果: その他 → コモンイベント
- 使用可能時: メニュー画面のみ
- 範囲: なし
同じ設定で「エスケープ」も作っておきます。中身のコモンイベントだけを変える形です。
選択肢でワープリストを作る
ワープ先の一覧は、選択肢を使って作ると分かりやすいです。
北海道・東京・福岡をそれぞれ選択肢に入れて、4つ目は「やめる」にします。
選択肢の設定で大事なのは、次の項目です。
- 背景: ウィンドウ
- ウィンドウの位置: 左(好みで調整)
- デフォルト: ナンバー1(最初にフォーカスが合う場所)
- キャンセル: 4番(やめる)、もしくは禁止
あとは、各選択肢の中に場所移動を設定すれば、基本のワープリストは完成です。
MPPChoiceEXで選択肢を拡張する
ただし、このままだと最初からすべての街へ行けてしまいます。
そこで、訪れた街だけを順不同で選べるようにします。ここで使うのが、MPPChoiceEX というプラグインです。
MPPChoiceEXは、選択肢の機能を拡張するプラグインです。今回使いたい機能は主に2つあります。
- 通常は6行しか表示できない選択肢を、ほぼ無制限に拡張できる
- スイッチや変数によって、選択肢のオンオフを切り替えられる
マップが増えても、ワープ先をリストとして扱いやすくなるのが便利です。
スイッチで訪問済みの街を管理する
次に、各街に訪れたかどうかを記録するスイッチを作ります。
| スイッチID | 名前 | 用途 |
|---|---|---|
| 1 | 訪れた初めての街 | 1箇所でも訪れたらオン |
| 2 | 訪れた北海道 | 北海道訪問フラグ |
| 3 | 訪れた東京 | 東京訪問フラグ |
| 4 | 訪れた福岡 | 福岡訪問フラグ |
ポイントは、スイッチIDをマップIDとそろえておくことです。
北海道のマップIDが2なら、北海道訪問フラグもスイッチ2番にする。東京のマップIDが3なら、東京訪問フラグもスイッチ3番にする。こうしておくと、あとから管理しやすくなります。
MPPChoiceEX側では、選択肢に次のような条件を設定します。
- スイッチ2番がオンの時だけ「北海道」を表示する
- スイッチ3番がオンの時だけ「東京」を表示する
- スイッチ4番がオンの時だけ「福岡」を表示する
さらに、どこにも訪れていない時は、ワープの選択肢自体を出さないようにします。
スイッチ1番「訪れた初めての街」で条件分岐を作り、オフの時は「まだワープできる場所がありません」と表示します。
ワープリスト追加はコモンイベントで一元管理する
次に、一度訪れた街をワープリストに追加するコモンイベントを作ります。
ここで大事なのは、イベントの分散を避けることです。
避けたいのは、次のような作り方です。
- 各マップの場所移動イベントに、スイッチオンを仕込む
- 各マップに自動実行イベントを置いて、スイッチをオンにする
これでも動きますが、スイッチの場所を変えた時や、IDを間違えていた時の修正が大変になります。
マップが10個、20個と増えていくと、デバッグと管理が一気に重くなります。
マップIDを取得して訪問を判定する
おすすめは、コモンイベントの並列処理でマップIDを監視する方法です。
手順は次の通りです。
- 変数「マップID」を用意する
- ゲームデータ → マップIDを、その変数に代入する
- 条件分岐で、マップIDが2(北海道)・3(東京)・4(福岡)の時に、それぞれの訪問スイッチをオンにする
- マップIDが2以上かつ4以下の時に、「訪れた初めての街」スイッチをオンにする
これなら、どの場所にプレイヤーがいても、コモンイベント側で横断的に監視できます。
スクリプトで条件を書く方法
変数に代入せず、条件分岐のスクリプト欄に直接書くこともできます。
// 条件分岐のスクリプト欄に書く
$gameMap.mapId() === 2 // マップIDが2(北海道)の時
$gameMap.mapId() === 3 // マップIDが3(東京)の時
$gameMap.mapId() === 4 // マップIDが4(福岡)の時
// 初めての街の条件(2以上かつ4以下)
$gameMap.mapId() >= 2 && $gameMap.mapId() <= 4
$gameMap.mapId() は、現在のマップIDを取得する命令です。変数に代入しなくても、1文で判定できます。
=== は「一致する時」、>= は「以上」、<= は「以下」、&& は「かつ(AND)」という意味です。
ちなみに、=== は == でも動くことがあります。他にもいろいろな書き方があるので、気になる場合はJavaScriptの比較演算子や論理演算子を調べてみるとよいです。
ダンジョンではワープを使えないようにする
次に、ダンジョン内ではワープを使えないようにします。
まず、不採用にした方法から見ておきます。
不採用1: スキルの着脱で制御する
ダンジョンに入る時にワープを忘れさせ、出る時に覚えさせる方法です。
動きはしますが、すべての出入り口に処理を入れる必要があります。マップが増えるほどミスが出やすくなるので、今回は採用しません。
不採用2: タイルセットIDで判定する
タイルセットIDで判定する方法もあります。
$gameMap.tilesetId() === 4 // タイルセットが「ダンジョン」の時
ただ、実際のゲーム制作では、ダンジョンを作る時に必ず「ダンジョン」のタイルセットだけを使うとは限りません。
森のマップなら「外観」、近未来的な建物なら「近未来内装」を使うこともあります。タイルセットIDで禁止すると、本来はワープできる街でもワープ不可になってしまう可能性があります。
不採用3: マップIDで判定する
マップIDで判定する方法もあります。
$gameMap.mapId() >= 5 // マップID5以上の時
今回のテスト環境では、ID5以上が全部ダンジョンなので動きます。
ただ、あとからID8番に普通の街を作りたくなった時に困ります。IDの並びに依存しすぎると、拡張しにくくなります。
推奨: メモ欄を参照する
おすすめは、マップのメモ欄を参照する方法です。
マップの設定にある「メモ」欄に、次のように書きます。
<noWarp>
そして、条件分岐のスクリプト欄で次のように判定します。
$dataMap.meta['noWarp']
これは、「現在のマップのメモ欄に noWarp というタグがある時」という条件になります。
たとえば、今回の設定なら次のように使えます。
noWarpがある新潟・徳島 → ワープ使用不可noWarpがない鳥取 → ワープ使用可
ワープを使わせたくないマップには <noWarp> を付ける。使えるマップには付けない。
この形なら、マップごとの挙動を柔軟に制御できます。イベントのスクリプトも長くならないので、管理しやすいです。
3. エスケープの作り方
エスケープは、ワープに比べるとかなりシンプルです。
作るコモンイベントは2つです。
- エスケープ: スキルから呼び出すメインのコモンイベント
- エスケープ記憶用: 脱出先の座標を記録する並列処理のコモンイベント
使える場所を判定する
エスケープでは、ワープで使ったメモ欄参照を逆に使います。
$dataMap.meta['noWarp']
考え方は次の通りです。
- メモ欄に
noWarpがない時 → 「ここでは使えないよ」と表示する - メモ欄に
noWarpがある時 → エスケープを実行する
つまり、ワープが使えない場所では、エスケープが使える。ワープとエスケープを対の関係にするわけです。
戻り先の座標を記録する
エスケープで「ダンジョンの入り口に戻る」には、ダンジョンに入る直前の座標を記録しておく必要があります。
まず、次の変数を用意します。
| 変数 | 用途 |
|---|---|
| マップID | 戻り先のマップID |
| プレイヤーX | 戻り先のX座標 |
| プレイヤーY | 戻り先のY座標 |
代入元は、ゲームデータのキャラクター → プレイヤーのマップX/マップYを使います。
画面X/Yではないので注意してください。画面X/Yはピクチャーなどで使う座標で、マップX/Yはマス目の座標です。
場所移動の前に毎回代入する方法は避ける
場所移動の前に、マップID・X・Yを取得するイベントを毎回入れる方法もあります。
ただ、これは管理が大変です。動作はしますが、移動イベントを作るたびに同じ処理を入れる必要があります。
マップが増えると見落としも起きやすくなるので、今回は採用しません。
リージョンIDで入り口を監視する
おすすめは、リージョンIDで監視する方法です。
マップエディターのRタブで、ダンジョンの入り口にリージョン1を押しておきます。
そして、コモンイベント「エスケープ記憶用」の並列処理で、次の条件を設定します。
// 条件分岐: プレイヤー位置のリージョンIDが1の時
$gameMap.regionId(this.character(-1).x, this.character(-1).y) === 1
それぞれの意味は次の通りです。
$gameMap.regionId(): 指定した位置のリージョンIDを取得するthis.character(-1): プレイヤーを指す(-1=プレイヤー、0=このイベント、1以上=イベントID)
この条件が成立した時に、マップID・プレイヤーX・プレイヤーYを変数へ取得します。
そしてエスケープを使う時は、場所移動を変数で指定にして、記録した変数を使って戻り先へ移動します。
リージョン方式のメリット
リージョンIDを使うと、メンテナンスがかなり楽になります。
- ダンジョンの入り口にリージョン1を押すだけでいい
- いらなくなったらリージョンを消すだけでいい
- イベントエディターを毎回開かなくていい
- マップが増えても管理しやすい
入り口の印だけをマップ側に置いて、処理はコモンイベントでまとめる。これが扱いやすい形です。
まとめ
今回は、RPGツクールMZでルーラ風の「ワープ」と、リレミト風の「エスケープ」を作る方法を紹介しました。
ポイントは次の通りです。
- ワープ: 選択肢 + スイッチ + MPPChoiceEXで、訪問済みの街だけをリストに表示する
- エスケープ: メモ欄参照 + リージョンID + 変数で、戻り先の座標を記録して脱出する
- イベントの分散を避ける: コモンイベントの並列処理で一元管理すると、デバッグと管理が楽になる
- メモ欄を活用する:
<noWarp>のようなタグで、マップごとの挙動を柔軟に制御できる - スクリプトを覚えておく:
$gameMap.mapId()、$dataMap.meta['noWarp']、$gameMap.regionId()は便利
ワープもエスケープも、考え方さえ整理すれば、かなり少ないコードで作れます。
ぜひ今回の仕組みを、あなたのゲーム制作に取り入れてみてください。

