ブラウンチップ☆ 2019/09/22 10:35

プラグイン改変入門~コマンドを追加してみる~

はいどーもこんにちは人生もコマンド制を希望するツミオです。
本日は先日改変したプラグインに「新規のコマンド」を追加してみたいと思います。

  • コマンドの追加ってなに
  • 追加するコマンド
  • メニューにコマンドを追加する
  • コマンド名を変えてみる
  • 残りの実装
  • コードの問題点
  • まとめ

    コマンドの追加ってなに

コマンドとは、メニュー画面を開いたときに出てくる「アイテム」や「スキル」のことです。
具体的に全て列挙すると、現在のコマンド一覧は以下の通りです。

  • アイテム
  • スキル
  • 装備
  • ステータス
  • 並び替え
  • オプション
  • セーブ
  • ゲーム終了

ここに何か別のコマンドを追加してみたいというわけですね。
ちなみにですが、メニュー画面にコマンドを追加するたぐいのプラグインは結構出ています。
自作するのが目的ではなく、メニュー画面にコマンドを追加すること自体が目的の方はそちらの利用を検討してみてもよいかもしれません。

追加するコマンド

今回は「本拠地にワープするコマンド」を作ってみましょう。
想定しているシチュエーションとしては、以下の通りです。

  • プレイヤーは「本拠地」があり、そこを拠点としてマップ上でクエストをこなす
  • プレイヤーはクエストをこなしたあと、本拠地に戻る必要がある
  • いちいち本拠地に手動で歩くのは面倒くさいので、ショートカットコマンドをメニュー画面に追加したい
  • ただし特定の状態時(例えばダンジョン突入時やイベント時)は本拠地に飛ぶのは禁止したい。これはスイッチで管理する(特定のスイッチがONのときだけ本拠地に戻れるようにする)

こんな感じですね。
実装してみましょう。

メニューにコマンドを追加する

メニュー画面のウィンドウをコントロールしているのは、rpg_window.jsファイル内の「Window_MenuCommand」というクラスです。
ファイルを開いて検索してみてください。
ざっと眺めてみると、以下のコードが見つかるかと思います。

Window_MenuCommand.prototype.makeCommandList = function() {
    this.addMainCommands();
    this.addFormationCommand();
    this.addOriginalCommands();
    this.addOptionsCommand();
    this.addSaveCommand();
    this.addGameEndCommand();
};

makeCommandListとなっていて、まさにここでコマンドのリストを作成しているようですね。
書かれているものを一つ一つ見ていくと(単なる英語ですから、プログラミングの知識は不要です。落ち着いて見ていってください)、addOriginalCommandsなるものがあることがわかるかと思います。
オリジナルのコマンドを追加する、とのことなので、ここを変更すればよさそうですね。

具体的なコードはこうなっています。
Window_MenuCommand.prototype.addOriginalCommands = function() { };

中身空じゃん!
ということで、これだけでは参考になるものがないので、どんなコードを書けばいいかわかりませんよね。
他のもの、ここでは試しにaddGameEndCommandも見てみましょう。

Window_MenuCommand.prototype.addGameEndCommand = function() {
    var enabled = this.isGameEndEnabled();
    this.addCommand(TextManager.gameEnd, 'gameEnd', enabled);
};

どうやらaddComandなるものを利用すると、コマンドを追加できそうということがわかりました!
addCommandとそのままの名前なのでわかりやすいですね。
ではまずはそのままコピーしてみましょう。
SimpleMenuLayout.jsに以下のコードを追加してください。

    const _Window_MenuCommand_addOriginalCommands = Window_MenuCommand.prototype.addOriginalCommands;
    Window_MenuCommand.prototype.addOriginalCommands = function() {
        _Window_MenuCommand_addOriginalCommands.call(this);
        
        var enabled = this.isGameEndEnabled();
        this.addCommand(TextManager.gameEnd, 'gameEnd', enabled);
    };

ちょっとややこしいですね。
最初の行の

const _Window_MenuCommand_addOriginalCommands = Window_MenuCommand.prototype.addOriginalCommands;

_Window_MenuCommand_addOriginalCommands.call(this);

コアスクリプトのコードを上書きする際のお約束のようなものです(が、場合によってはあえて書かない場合もあります)。
ここでは詳しい説明は省きますので、もし詳しく知りたい方がいれば「JavaScript call apply」などで検索してみてください。

さて残りのコードを見ていきましょう。

        var enabled = this.isGameEndEnabled();
        this.addCommand(TextManager.gameEnd, 'gameEnd', enabled);

一行目は「ゲーム終了は利用可能かどうか?」をenabledに保存(代入)しています。
二行目がまさに「コマンドの追加」ですね。こちらを詳しく見ていきます。

addCommandは以下の引数(カンマで区切られているやつのことです)を受け取ります。
注:正確にはextという引数も受け取りますが、ここでは関係ないのと、コアスクリプト内でもほとんど利用されていないのでここでは省略します。

ゲーム画面で表示するコマンドテキスト, プログラム内で使用する識別名(ゲーム画面には表示されない), 利用可能かどうかを示すフラグ

つまり現状は

TextManager.gameEnd(これはツクールのデータベースにある「ゲーム終了」で設定した文字列になります)をゲーム画面に表示して、プログラム内ではそれを「gameEnd」として扱い、isGameEndEnabledで利用可能かどうかを決める(通常は常に「利用可能」)ということになります。

実際にゲームを動かしてみてください。
こんな画面になるかと思います。


「ゲーム終了」が変なところにも追加されていますね。

フォロワー以上限定無料

続き

無料

【 プラグイン制作応援プラン 】プラン以上限定 支援額:300円

まとめと完成したプラグインの配布

このバックナンバーを購入すると、このプランの2019/09に投稿された限定特典を閲覧できます。 バックナンバーとは?

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

記事のタグから探す

月別アーカイブ

記事を検索