プラグインの作り方入門その1:コアスクリプトを書き換えるならプラグインにしてしまおう
では、コアスクリプトを直接書き換えて挙動を変更するのを止めて、プラグイン化する方法をまとめました。
順序が逆だ!と思う方もいるかと思いますが「書き換える場所を探す」方法をまとめます。
検索する元コードの場所
RPGツクールMZでプラグイン化できる箇所は基本的に、下記のファイルに書かれています。
プロジェクトフォルダ/js内
- rmmz_core.js
- rmmz_managers.js
- rmmz_objects.js
- rmmz_scenes.js
- rmmz_sprites.js
- rmmz_windows.js
RPGツクールMVでは下記です。
プロジェクトフォルダ/js内
- rpg_core.js
- rpg_managers.js
- rpg_objects.js
- rpg_scenes.js
- rpg_sprites.js
- rpg_windows.js
今回の目標
レベルと経験値がないゲームを作りたいので、対象の表示を消すことにします。
システムとしては残しますが、経験値を別用途に流用したシステムを作ろうとしなければ、メニューの表示を消すだけで事は足りると考えます。
検索するキーワードの選定
コアスクリプト内を検索するキーワードは、「既存のプラグインで近い機能に触れていそうなもの」の中や、下記のような「リファレンス」を見ると参考になると思います。
ちょっと量が多いのと、全部見て回るのが大変だと思うので、ここだけを詳細にした別記事を作成しました。
プラグインの作り方入門:資料編:検索するキーワードを探せるサイト
検索にGrepを使う
6ファイルを順番に検索するのも1つの方法なのですが、今回はGrepという機能を紹介します。
wikipediaより引用
ja.wikipedia.org/wiki/Grep
テキストファイル中から、正規表現に一致する行を検索して出力する。
ざっくりいうと、検索キーワードを入れると検索対象ファイルの中からキーワードが含まれる行の一覧が表示される機能です。
王道はリファレンスを読んで、その箇所を見つけることだと思いますが、筆者は気が短いので、いきなりGrepしています。
リファレンス内容がよく分からないレベルというのもあります。
筆者はサクラエディタというエディタのGrep機能を使用しています。
Visual Studio Code にもGrep機能はありますが、デフォルトでは1ファイル毎のGrepしかできないようです。
フォルダを指定してのGrep方法は「Visual Studio Code の便利な機能・設定」にまとめました。
筆者は6ファイル全部を探したいので、サクラエディタを使用しています。
サクラエディタ
sakura-editor.github.io/
サクラエディタでコアスクリプトのファイルを1つ開きます。 メニュー>検索>Grep をクリックします。
(Ctrl+G) Grep条件入力のダイアログが出ます。 「現フォルダ」ボタンを押します。
これで、検索対象の場所がコアスクリプトのフォルダ内になりました。
「条件」にキーワードを入れます。
今回は「level」です。
「ファイル」は「*.js」にします。 *はワイルドカード(下記リンク参照)です。 ja.wikipedia.org/wiki/%E3%83%AF%E3%82%A4%E3%83%AB%E3%83%89%E3%82%AB%E3%83%BC%E3%83%89_(%E6%83%85%E5%A0%B1%E5%87%A6%E7%90%86)
「除外ファイル」はデフォルトのままです。
ここまで設定をしたら、「検索」ボタンを押します。 下記のような検索結果一覧が別ウィンドウに表示されます。 このままでは少し読みにくいので、「折返し方法」を「折り返ししない」に変更します。
メニュー>設定>折返し方法>折り返さない
(Ctrl+Alt+X)
関数(function)を探す
リストは左側が記述場所、右側が書かれている行の内容が表示されています。
先の記事の補足になりますが、下記のような「function」と書かれている行が「関数」の始まりの行です。
多くは下記のような書かれ方をしています。
~.prototype.~ = function
基本的には、この関数を書き換えることで、ゲーム内の挙動が変わります。
ですので、このGrep結果内で function を検索します。
サクラエディタでは検索対象のマークを表示できるので、この機能を使います。
メニュー>検索>検索 (Ctrl+F) 「条件」に function を入力します。
「該当行マーク」ボタンを押します。 ウィンドウの左側にある行番号にマークが表示されます。
これが表示された行の関数名を見ていき、該当しそうな行を探します。 今回は下記です。
Window_StatusBase.prototype.drawActorLevel = function
この行をダブルクリックすると別ウィンドウにそのファイルが開かれ、該当行にフォーカスされます。
関数をプラグイン化(編集)
この関数をまとめて、プラグインのテンプレートにコピーします。
/*:
* @target MZ
* @plugindesc 一覧に表示される概要
* @author 作者名
*
* @help
* 動作内容をメモ
*/
(() => {
"use strict";
Window_StatusBase.prototype.drawActorLevel = function (actor, x, y) {
this.changeTextColor(ColorManager.systemColor());
this.drawText(TextManager.levelA, x, y, 48);
this.resetTextColor();
this.drawText(actor.level, x + 84, y, 36, "right");
};
})();
これがアクターのレベル表示をする内容なので、関数の中全てをコメントアウトします。
Visual Studio Code では、複数行を選択し、
メニュー>編集>行コメントの切り替え
(Ctrl+/(め))
で、まとめてコメントアウトができます。
コメントアウトした行を元に戻すのも同じ操作です。
動作確認
このプラグインを使用して表示を確認しましょう。
下記が比較画像です。
左がプラグイン未使用、右がプラグイン使用です。
まとめ
残りはステータス画面での経験値ですが、同じ手法で作ったのが下記のプラグインになります。
fungamemake.com/archives/12221
このプラグインは質問があったので、作ったものです。
作り方としては熟練者から見たら乱暴な内容(競合対策などの考慮が足りないという意味)かも知れませんが、入門ということで「まず動かせる」ということに注力しているということで、お目溢しください。
(筆者が思いつくのは、この関数を呼び出す側を変更することくらいですが、その方法だと変更箇所が増えそうなので…)
ここまでの内容を実践できた方には、「既にある要素を削除や場所変更するのは難しくない」という事がご理解いただけたかと思います。
これを応用すると、既にあるプラグインにも同じことができます。
「このプラグイン使いたいんだけど、表示したくない要素がある」ような状況では、プラグイン内を検索してコメントアウトすることで、同様のことが可能です。
そして、プラグインは「コアの関数を上書き」するのが基本的な動作なので、同じ関数を上書きするプラグイン同士は非常に競合しやすいです。
(書き方で回避できるケースもありますが、この記事を読んでいる時点では難しいでしょう。)
似た機能のプラグインで別のプラグインと競合したり、しなかったりするのは、上書きしている関数が異なるためです。
次のステップ
既存のメニューにコマンドを追加する方法をまとめます。
(書き換え箇所の探し方の裏道も…)
コメントを投稿するにはログインしてください。