RPGツクールMZでルーラとリレミト風スキルを作る方法

当ページのリンクには広告が含まれています。

今回はRPGツクールMZで、ドラゴンクエストの「ルーラ」と「リレミト」のようなスキルを作っていきます。

ルーラは、一度訪れた街へワープできるスキルです。一方、リレミトはダンジョンの中から脱出できるスキルです。

ただ、そのままの名前で作るのも少し味気ないので、この記事ではルーラ風のスキルを「ワープ」、リレミト風のスキルを「エスケープ」として作ります。

チャプター

1. ワープとエスケープの仕様

まずは、それぞれのスキルにどんな役割を持たせるかを決めておきます。

ワープの特徴

ワープは、訪問済みの街へ移動できるスキルです。

  • 一度訪れた街にワープできる
  • ただし、ダンジョンはワープ先に含めない
  • 一度訪れた街が、ワープリストに追加されていく
  • ダンジョン内では使えない

エスケープの特徴

エスケープは、ダンジョンから脱出するためのスキルです。

  • ダンジョンの中でしか使えない
  • 特定のダンジョンでは使えない
  • ダンジョンの入り口に戻ることができる

たとえば「魔王の城ではエスケープを使えない」といった制限も、この仕組みで作れます。

テスト用のマップ構成

今回は、テスト用に次のようなマップを用意します。

IDマップ名種別
1フィールドフィールド
2〜4北海道・東京・福岡街(ワープ対象)
5〜7新潟・鳥取・徳島ダンジョン(エスケープ対象)

この構成をもとに、ワープとエスケープを順番に作っていきます。

2. ワープの作り方

ワープは、訪問済みの街だけを選択肢に表示する仕組みで作ります。

大まかな流れは次の通りです。

  1. スキルから呼び出すコモンイベント「ワープリスト」を作る
  2. 一度訪れた街をワープリストに追加するコモンイベントを作る
  3. 特定のダンジョンではワープを使えないようにする

スキル「ワープ」を作成する

まず、データベースのスキルを開いて「ワープ」というスキルを作ります。

設定は次のようにします。

  • 消費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を監視する方法です。

手順は次の通りです。

  1. 変数「マップID」を用意する
  2. ゲームデータ → マップIDを、その変数に代入する
  3. 条件分岐で、マップIDが2(北海道)・3(東京)・4(福岡)の時に、それぞれの訪問スイッチをオンにする
  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() は便利

ワープもエスケープも、考え方さえ整理すれば、かなり少ないコードで作れます。

ぜひ今回の仕組みを、あなたのゲーム制作に取り入れてみてください。

SNSのネタにどうぞ

作者

ゲーム作ってる人。主にRPGツクールでのゲーム制作に役立つスキルを発信している

座右の銘:インドカレー
将来の夢:インドカレーになること

チャプター