【1月プラン記事③】シンボルエンカウントの作り方
今月の有料プランの特典として「移動ルートの拡張プラグイン」を公開しました!
- 【1月プラン記事①】移動ルート拡張プラグイン
(ver1.0.1 <2022/1/24> セーブ・ロードの不具合修正)
前回の落石ギミックの作り方解説に続いて、今回はプラグインを使ったシンボルエンカウントの作り方を解説します!
(※基本的な部分は前回で解説しているので、今回は新しいコマンドに絞ってサクサクと解説していきます!)
全体の処理の流れ
前回と同様にイベントページに自律移動を設定します。
完成したイベントページは↓のような処理の流れになります。
- 自律移動用の移動ルート
- 戦闘勝利時に敵が消える移動ルート
- 戦闘逃走時に敵が1秒間点滅して待機する移動ルート
の3つの移動ルートを作成していきます。
それぞれコモンイベントのページに貼り付けてそれを呼び出していますが、イベントページ上で編集中して出来上がってからコモンイベントに移すと良いでしょう。
# 自律移動用の移動ルート
↓の通り!
@route custom repeat skippable freq:max
//現在の位置を保存
cmd save
//リピート開始をこの下のコマンドからに変更
cmd repeat
//距離が4以内ならラベル「アラート開始」へ
cmd if dist 4; labeljump アラート開始
//それ以外の場合は30%で60フレーム待機
cmd if prob 30; wait 10; return;
cmd turnrand @ //ランダムな方向を向く
cmd speed 3 @ //移動スピードを3に
//3~6歩前進
cmd loop \RN[3,6]
cmd forward
cmd if dist 4; labeljump アラート開始
cmd loopend
//1秒待ってからリピート開始へ戻る
cmd wait 60
cmd return //-----------------------------------------------
cmd label アラート開始
//プレイヤーの方を向いてジャンプ&バルーン表示
cmd turntoward
cmd jump 0 0 @
cmd balloon bikkuri
cmd wait 20
cmd label チェイス
//速度を4.5に変更
cmd speed 4.5 @
//10回プレイヤーへ近づく
cmd loop num:10 @
cmd toward
cmd loopend @
//距離8以下ならなら繰り返す
cmd if dist 8; labeljump チェイス @
//距離8以上の場合はプレイヤーを見失う
cmd balloon kusha
cmd wait 60
それでは、新しく出てきたコマンドを中心に解説していきます!
ラベル(label)とラベルジャンプ(labelJump)コマンド
イベントコマンドにもある「ラベル」「ラベルジャンプ」が使えます!
「if」コマンドに"それ以外の場合"の「else」処理が無いですが、代用としてラベル機能が活躍します!
//距離が4以内ならラベル「アラート開始」へ
cmd if dist 4; labeljump アラート開始
(距離が4以内でないときの処理。適当に歩き回ったり)
︙
cmd label アラート開始
(プレイヤーを見つけて追いかけてくる処理)
以下、距離が離れているときの処理を追っていきます。
「if prob」コマンドで確率で分岐
距離が離れているときは、「その場で待機」か「ランダムな方向に進む」処理のどちらかを行います。
//それ以外の場合(距離が離れている)は30%で60フレーム待機
cmd if prob 30; wait 10; return;
(残りの70%のときの処理)
「if dist」コマンドはプレイヤーとの距離によって判定を行いましたが、今回は「if prob」コマンドを使って確率的に分岐させます。
「if prob 確率(%); 実行させる処理」
今回は「wait 10」で10フレーム待機後、「return」コマンドで移動ルートをいったん終えて繰り返しの最初に戻っています。
(※実際には「wait 10」と「return」は同時に行われるため、繰り返しの最初に戻ってから10フレーム待機しています)
「loop」コマンドで指定回数繰り返す
30%の確率でその場で待機しなかった場合には
- ランダムな方向を向いて
- 3〜6歩だけ前に歩いて
- その場で60フレーム待機して
ループの最初に戻ります。
cmd turnrand @ //ランダムな方向を向く
cmd speed 3 @ //移動スピードを3に
//3~6歩前進
cmd loop \RN[3,6]
cmd forward
cmd if dist 4; labeljump アラート開始
cmd loopend
//1秒待ってからリピート開始へ戻る
cmd wait 60
cmd return //-----------------------------------------------
「loop」コマンドは「loopEnd」コマンドまでの間の処理を、指定回数だけ繰り返します。
便利そうなコマンドですが、制限も多いです。
- ネストが出来ない(loopの中で更にloopを使えない)
- ラベルジャンプなどを使ってloopの中に入っても正しく動かない
単純に同じ処理を繰り返す分にはスッキリ見やすくなるので積極的に使っていきましょう!
(※ループ回数を0とすると無限にループします。「loopBreakコマンド」でループから抜けれるのでifコマンドと組み合わせて使うと○)
今回は、制御文字\RN[最小回数,最大回数]
を使ってループ回数を3~6のランダムな回数に設定しています。(\RNの詳しい使い方はチートシート参照)
cmd loop \RN[3,6]
ループ内では「1歩前に進んで(forward)」「距離が4以下なら、ラベル:アラート開始にジャンプ」という処理を繰り返します。
cmd forward
cmd if dist 4; labeljump アラート開始
次にプレイヤーが近くにいてラベル:アラート開始に飛んだ場合の処理を見ていきます。
↓プレイヤーに気がついて驚く演出
cmd label アラート開始
//プレイヤーの方を向いてジャンプ&バルーン表示
cmd turntoward
cmd jump 0 0 @
cmd balloon bikkuri
cmd wait 20
次にいったんラベル「チェイス」を貼り直します。
プレイヤーを追っかけ回して、まだ近くにいた場合にはここに戻ってきます。
cmd label チェイス
//速度を4.5に変更
cmd speed 4.5 @
//10回プレイヤーへ近づく
cmd loop num:10 @
cmd toward
cmd loopend @
ループを使って10回だけ「プレイヤーへ近づく(toward)」コマンドを実行しています。
(※ところどころにある行末の「@」は即座に次の行を実行するという記号です)
10回プレイヤーに近づいてから「if dist」コマンドで再度距離をチェックして
追いかけ続ける(ラベル「チェイス」に戻る)か、
諦める(移動ルートの最初に戻る)か
を判定します。
//距離8以下ならなら繰り返す
cmd if dist 8; labeljump チェイス @
//距離8以上の場合はプレイヤーを見失う
cmd balloon kusha
cmd wait 60
以上が自律移動のルートの全容となります!
戦闘勝利時の処理
戦闘勝利時に実行する移動ルートの設定は↓の通り!
@route this skippable
//トリガーを無効に & 通り抜けON
cmd trigger none; through @
//半透明にして少し待機
//cmd opacity 180; wait 10
//45フレームかけて透明に
cmd opacity 0 d:45 @
//同時に縦に引き伸ばす&完了までウェイト
cmd scale x:1 y:200 relative d:45 easeOut wait
cmd erase
「trigger」コマンドでイベント開始トリガーの制御
戦闘勝利時には、すぐにトリガーを無効(none)にして、再度イベントが実行されないようにしています。
//トリガーを無効に & 通り抜けON
cmd trigger none; through @
トリガーの操作は自律移動のカスタムルートに組み込むのも面白くておすすめです。
- 半透明の間は触れない幽霊
└cmd trigger none; opacity 128 //半透明にしてトリガー無効
└cmd trigger event; opacity 255 //不透明にしてとりがーを「イベントから接触」へ
また、トリガーをauto(自動実行)、parallel(並列処理)にすると即座に開始するので注意。(※並列処理は繰り返し実行されるので、1度だけ並列で実行したいときは「parallel」コマンドを使用)
不透明度(opacity)、拡大率(scale)のアニメーション
//45フレームかけて透明に
cmd opacity 0 d:45 @
//同時に縦に引き伸ばす&完了までウェイト
cmd scale x:1 y:200 relative d:45 easeOut wait
前回の記事の「y」コマンドでy座標をアニメーションさせましたが、↑のopacity(不透明度)、scale(拡大率)コマンドも同様の使い方が可能です。
「scale」コマンドはデフォルトで絶対値指定(relative:false = abs)ですが、ここでは相対値(relative:true = relative)で指定しています。
もし敵によって表示させる拡大率を変えたい場合には、相対値での指定が良いでしょう。
(※x:1として横に1%残しておくと、もし一定時間後に復活させたい場合に100倍にして元のサイズに戻すことができます)
また、「scale」コマンドの最後に「wait」とちうパラメータがつけられていますが、これは「scale」コマンドが完了するまで待機させるためのものです。
最後にイベントを消去してモンスターの消滅処理完了です!
cmd erase
逃走時の移動ルート
パーティーが戦闘から逃走したときは、1秒間だけその場で点滅してから再度追いかけさせます。
移動ルートの設定は↓
@route this skippable
//トリガーを無効に
cmd trigger none
//1秒間点滅
cmd loop num:6
cmd opacity 100; wait 5
cmd opacity 255; wait 5
cmd loopend
//トリガーをイベント接触に戻す
cmd trigger event
//元の自律移動のインデックスを「ラベル:チェイス」位置に戻す
cmd originalIndex チェイス
ここでもいったんトリガーを無効にして、点滅中は触れても戦闘が開始しないようにしています。好みによって、通り抜け(through)もONにすると良いでしょう。
//トリガーを無効に
cmd trigger none
点滅処理は「loop」コマンドを使って
- 半透明(opacity 100)にして5フレーム待機
- 不透明(opacity 255)にして5フレーム待機
を6回繰り返して1秒間(60フレーム)だけ点滅させています。
//1秒間点滅
cmd loop num:6
cmd opacity 100; wait 5
cmd opacity 255; wait 5
cmd loopend
点滅終了後にトリガーを元に戻して、
//トリガーをイベント接触に戻す
cmd trigger event
元の自律移動の実行箇所を「ラベル:チェイス」の位置に戻して、再度追いかけさせます。
//元の自律移動のインデックスを「ラベル:チェイス」位置に戻す
cmd originalIndex チェイス
originalIndex:元の移動ルートの実行インデックス変更
基本的にイベントコマンドの「移動ルートの設定」での移動ルートが終わると、自律移動の実行途中の箇所に戻ります。
「originalIndex」コマンドを使うと、元の自律移動のルートに戻った際の再開箇所を変えることができます。
いくつか戻る箇所の指定方法があります。
- 「originalIndex ラベル名」:「cmd label ラベル名」の箇所
- 「originalIndex repeat」:リピート開始地点
- 「originalIndex インデックス(0~)」:指定インデックス(1つ目のコマンドが0)
ここでは「チェイス」ラベルに飛んで、即座にプレイヤーを追いかけさせています。
以上でシンボルエンカウントの解説終了です。
意外とシンプルに実装できましたね!
- 「se」コマンドでSEなんかもつけたり
- 移動速度や感知距離をメモ欄を使って設定できるように
└メモ欄に<speed:5><dist:5>、パラメータに\MT[speed]、\MT[dist]など
したりするとそれっぽくなるでしょう!
おまけ:敵の視界をなんとか再現する
プレイヤーを見つける判定が「イベントとプレイヤーの距離」のみで、後ろから近づいても反応してしまいます。
現状では「if」コマンド単体で判定することはできませんが、擬似的に「イベントの前方にプレイヤーがいるか」を判定することができます。
プレイヤーとの距離をチェックしている箇所(数カ所あります)を以下のような感じに
//前方3マス目からの距離が3以内なら「アラート開始」へジャンプ
cmd f 3 d:0; if dist 3; b 3 d:0; labeljump アラート開始
cmd b 3 d:0
「f」コマンドは「x」コマンドの親戚で、前方に判定無しで移動するコマンドで、「b」コマンドは後退するコマンドです。
何をやっているかと言うと、
- 0フレームで瞬時に前へ3マス移動
- その位置から3マス以内なら、元の位置(後方3マス)に瞬時に戻って「アラート開始」へ
- それ以外なら瞬時に後方に3マス戻るだけ
というなんとも強引なやり方です。
(「b」コマンドで戻る処理は、「if」コマンドに成功にしたときと失敗したときの2箇所に入れないといけないので注意。)
強引ではあるけど、この方法なら前後左右に限らず移動とチェックを繰り返せばどんな図形範囲だろうと感知させることが可能です!
やったね!
(複雑になる場合は「save」「restore」で元の位置に戻すのが良いでしょう)
(……シンボルエンカウントについては各種プラグインも有志により配布されてるので素直にそちらを利用するのも全然ありですが、移動ルートだけでこれだけのシステムが作れるというのは可能性を感じないでしょうか?!)