イベントコマンド周りを調べてみた

イベント置いてくハロルド

JSON ファイルを制する者は MV を制す

 RPGツクールMVのイベントという用語は、ゲーム用語のイベントともプログラミング用語のイベントとも違ってて、非常に混乱します。
 MVでのイベントは「マップ上に配置され、プログラムと画像が含まれるもの」を意味する用語です。
 その転用で大域(グローバル)関数的なものをコモンイベントと呼び、戦闘中に呼ばれる関数をバトルイベントと呼んだりしてて、もうイベントって一体…という気持ちになる。
 なんでこれにイベントって言葉を当てちゃったのか…、マップに配置するものをスプライトと呼んで、関数的なものをイベントと呼ぶとかだったら分かるんだけど。
 混乱を避けるためにMVの用語であるイベントは、今後は角カッコで囲って[イベント]と書きます。他のMVエディタで用いられている用語も角カッコで囲います。

 今回はその[イベント]を調べて整理して、多少でも自分の中の混乱を収めたいと思います。
 [イベント]は Map001.json とかの JSONファイルで定義されています。
 Class: Map が、そのファイルの構造を表現したクラスです。
 Map に関しては前回のMap関連クラスを調べてみた で書いたので、そちらを見てください。

 Mapデータの中に events プロパティがあって、ここに今回の目的である[イベント]が配列になってダーっと並んでます。
 Map001.json をエディタで開いて、events で検索すれば簡単に見つかります。
 ということは、このJSONテキストファイルをコードエディタで書き換えれば、MVのエディタを使わなくてもゲームがツクれるわけです。
 MVのエディタは検索・置換の機能が貧弱なので、これは嬉しい。

 JavaScriptを使わない人もエディタで直接 JSONファイルを扱っていかないと、中・長編のゲームになってくるともう製作不可能というレベルになると、風の噂で聞いたので、最初は極力 JavaScript は絡めない範囲で書いていきます。

イベントを大別する

 [イベント]は、マップ・コモン・バトルの3種類があり、[イベントコマンド]はこれらに共通です。
 [イベントコマンド]はMVのエディタでは[実行内容]に書かれている1行にあたります。

 [イベントコマンド]の内容は膨大なので、また別の機会に調べることにします。
 とりあえず[実行内容]は、上記3種のイベントの listプロパティに配列として定義されてることを知っておけばいいとおもいます。

 余談ですが、[実行内容]って用語も使いづらいですね。
 命令を追加するときに開くウィンドウに書いてある[イベントコマンド]って言葉をここにも使っておけば良かったのに。
 MVはネーミングセンスが悪いのが欠点のひとつなのは間違いないとおもいます。

マップの[イベント]

 村人やタンスなど、マップ上で動いていたり操作に反応があるものです。
 先ほど書いた通り、Map001.json の中を events で検索すると出てきます。
 その中にに EventPage が含まれ、さらその中に Conditions、Image、EventCommand が含まれています。
 細かい説明は以下のページを参照してください(丸投げ)

 MVのエディタ上では、EventPage は[EVページ]、Conditions は[出現条件]、Image は[画像]に対応します。

[コモンイベント]

 [コモンイベント]はズバリ CommonEvents.json というファイルに保存されています。
 このファイルは[コモンイベント]しか入ってないので、マップに比べて扱いやすいですね。

 このクラスは実行条件を階層化せずにその中に含んでいるので、別途 Conditions があったりしません。
 詳しい内容については例によってリンク先をどーぞ。

[バトルイベント]

 [コモンイベント]は Troops.json というファイルに保存されています。[敵グループ]を英語版では Troop と表現してるんですね。
 中身はCommonEventsに近いですが[敵グループ]のメンバーの情報が増えてます、Conditions プロパティがあるのはマップのイベントにもちょっと似てます。

 というわけで、この辺までわかるとJSONで直接書き換えることができるようになって、大量の書き換えの際に圧倒的に楽になります。
 なおエディタは必ず、JSON用のシンタックスハイライト 機能があるものを使いましょう。
 シンタックスハイライト はシンタックスカラーリングとも言って、データの文法に沿って文字の色付けしてくれる機能です。
 これがないと、クオーテーション(")やカッコの対応を間違えた場合に気づくのが遅れて「むしろMVのエディタでツクった方が楽で早かった」ってことになりかねません。
 ちなみに僕は無料で高機能で Mac版もある、マイクロソフトのVisual Studio Codeを使っています。

JavaScript側から見てみる

 今度はテキストエディタでJSONデータをいじるのではなく、JavaScript から操作する方を見て見ましょう。
 まずは大域変数として定義されているのを探してみると、マップ・コモン・バトルは全部定義がありました。

 データではなく、機能オブジェクトとしてのクラスを探して見ると、次のようなものがありました。

 Gama_Map は大域変数 $gameMap に定義されているので、簡単にアクセスできます。
 Game_Map が _events、_commonEvents プロパティを持ってて、そこからイベントのデータを辿れるんですが、頭に_が付いているプロパティは本来外に後悔しない意味を持っている(みたいな)ので使わない方がいい感じです。
 events() メソッドで現在のマップに含まれる全 Game_Event の配列を、event() メソッドに ID を指定することで Game_Event を返してくれるので、この辺のメソッドを活用して取り扱っていくのが良い手みたい。
 他にも色々とイベントを扱うためのメソッドが揃っていますが、詳しくはリンク先をどーぞ。

 で、Game_Event を見ると大量にメソッドが用意されています。
 …あー、これはもう実際に使ってみようという段階になって確認すれば良さそうですね。
 MVのエディタで操作できるものは一通り揃っているみたいです。

 Game_Troop の内部で troop() メソッドを使ってRPG.Troop を取り出して、そこから pages を辿ってイベントの判定を行ってる感じです。
 イベント関連のメソッドはなく、あんまり外からイベントをいじることは考えてないみたい。

まとめ

 JSONファイルをいじってるときに、ふわっとした理解でいじってた部分が明解になって、よかったよかった。
 JavaScriptに関しては、特にここら辺に関わるスクリプトを書く予定もプラグインを作る予定もないので、今後活用できるか微妙ですが、

 そこで結論。

JSやんなくてもJSONは分かってた方がいい!