気ままなタンス*プログラミングなどのノートブック

プログラミングやRPGツクール、DTM等について、学んだことや備忘録をアウトプットとして残し、情報を必要としている誰かにとって「かゆいところに手が届く」ブログとなることを願いながら記事を書いています。

【RPGツクールMV】超簡単!アイテム合成プラグイン「ItemCombination.js」に、「アイテムが作成済みかどうかがわかる表示」を追加する手順を解説!

スポンサーリンク

ItemCombination.jsとは?

Jeremy Cannadyさんが作成されたツクールMVのプラグイン。

アイテムに対して、「必要なレシピ」を設定することで、 素敵な合成システムが簡単に使えてしまう優れものです。

概要や使い方については、過去に記事を書きましたので、そちらをご参照ください。 rinnegrid.hatenablog.com

目次

プラグインに対する個人的な希望

これから作成しようとするアイテムのレシピはわかるのですが、

対象のアイテムがすでに作成済みかどうかに関しては判断ができません。 f:id:rinne_grid2_1:20180307235314p:plain

そこで、ItemCombinationに対して少し修正を加え 作成済みかどうかがわかる文字列を追加してみます。

完成イメージ

右上に[作成済み]という文字が表示されているのが確認いただけるかと思います。

f:id:rinne_grid2_1:20180307235342p:plain

拙作であるBirth Worldというゲームの画面です。

実装方法

ItemCombination.jsの346行目に以下のソースコードを追加します

    var _myItemObj = Game_Party.prototype._craftingRecipes[recipeKeyName];
    var _myItemData = $dataItems[_myItemObj[0]];
    if($gameParty.hasItem(_myItemData)) {
        this.changeTextColor(this.hpGaugeColor1());
        this.drawText("[作成済み]", 400, 50, 300, 60);
        this.resetTextColor();
    }

これで、対象のアイテムを持っている場合に、「[作成済み]」という文字が表示されるようになります。

・・・もしかすると、疑問に思われた方がいらっしゃるかもしれません。

なんで「レシピからアイテムを作成した場合」ではなく、 「対象のアイテムを持っている場合」と記述しているのだろうかと。

上記のソースコードで判断しているのは 「アイテムの作成実績」ではなく、あくまでも「アイテムの所有」になっています。

つまり、レシピから作成したアイテムを使ってしまった場合は 「作成済み」という文字は表示されなくなります。

  • ソースコードの概要
    • 1行目: レシピとして指定されているアイテムレシピ情報(作成対象のアイテムIDや成功率、作成に必要なアイテムID)を取得する
    • 2行目: アイテムID(_myItemObj[0])を元に、データベースからアイテム情報を取得する
    • 3行目: 主人公パーティが対象のアイテムを持っている場合
    • 4行目: 文字の色を指定(HPゲージの色1を利用する)
    • 5行目: [作成済み]を表示する
    • 6行目: 文字の色をリセット

もっとシンプルに考えて、 アイテムを持っているかどうかを判断するのではなく「アイテムの保有数を表示する」とした方が良いかもしれません。

そこで、実装方法2です。

実装方法2:アイテムの保有数を表示する

ItemCombination.jsの346行目に以下のソースコードを追加します

   var _myItemCnt = $gameParty.numItems(_myItemData);
    this.changeTextColor(this.tpGaugeColor1());
    this.drawText("保有数:" + _myItemCnt, 400, 80, 300, 60);

実装方法2のイメージ

f:id:rinne_grid2_1:20180307235857p:plain

3番目に欲しいもの・・・

_人人人人人人人人_
> オライリー本 <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^ ̄

その他

メニュー説明等の文言を変更したい場合は、下記のように修正するとうまくいきます。

「メニュー説明」を変更したい

  • 81行目 "Item Combination Menu"を変更します
    this.drawText("Item Combination Menu", x, y, width - unitWidth - 6, 'left');

僕のゲームではItem Combination Menuの部分を 「祝福でモノ作り!!!」という文言に変えています

f:id:rinne_grid2_1:20180308000026p:plain

「必要なアイテムの説明」を変更したい

  • 323行目 "Required Ingredients"を変更します
     this.drawText('Required Ingredients :', x, y-this.lineHeight(), this.windowWidth()/2+this.textWidth(':')+6, 'right');

僕のゲームではRequired Ingredientsの部分を 「必要なアイテム」という文言に変えています

f:id:rinne_grid2_1:20180308000046p:plain

「成功率」を非表示にしたい

  • 364行目をコメントアウトします
// this.drawText(chance + ' %', x, y, this.windowWidth() - 32 , 'center');

ボタンの名称を変更したい

  • 404行目: "Combine"を変更します
   this.addCommand("Combine", "Combine", $gameParty.canCombine(recipeKeyName));

僕のゲームでは「作成する」という文言に変えています

f:id:rinne_grid2_1:20180308000102p:plain

メニューに表示するアイテム名に、アクターの名前を使いたい

ユーザに入力して、決めてもらったアイテム名を利用する場合は、 以下のような対応を行うことで、実現可能です

  • ある番号のアクターの名前をアイテム保存用の文字列として利用する(例の場合、20番~24番) f:id:rinne_grid2_1:20180308000128p:plain

  • 名前入力の処理で、例えば20番のアクターの名前を入力させる

(この画面イメージで表示されている入力処理については、別途対応が必要です。いつか記事として投稿するかもしれません。) f:id:rinne_grid2_1:20180308002555p:plain

  • アイテムの名前を\n[20]にしておく(アクター名を参照するための置換文字列)

f:id:rinne_grid2_1:20180308000144p:plain

  • 下記[1]、[2]の対応を行う

[1] ItemCombinationの237行目に以下の修正を加える

  • 237行目をコメントアウト
//this.addCommand($dataItems[itemNumber].name, $dataItems[itemNumber].name, enabled);
  • 下記のソースコードを238行目に追加
    this._textState = {};
    this._textState.index = 0;
    this._textState.text = this.convertEscapeCharacters($dataItems[itemNumber].name);
    this.addCommand(this._textState.text, $dataItems[itemNumber].name, enabled);

[2] ItemCombinationの298行目に以下の修正を加える

  • 298行目をコメントアウト
//this.drawText($dataItems[itemNumber].name, x, y, width - 32, 'center');
  • 下記のソースコードを299行目に追加
this._myTextState = {};
this._myTextState.index = 0;
this._myTextState.text = this.convertEscapeCharacters($dataItems[itemNumber].name);
this.drawText(this._myTextState.text, x, y, width - 32, 'center');

アイテム作成時の効果音を変更したい

  • 524行目を以下のソースコードで上書きする (Item1と記載している部分に効果音(SE)ファイル名を指定します)
$gameParty.gainItem($dataItems[itemNumber], 1);
    var seInfo = {
        "se": {
        "name"  : "Item1", // ここにSEファイル名を指定
        "pan"   : 0,
        "pitch" : 100,
        "volume": 90
    }
};
AudioManager.playSe(seInfo.se);

それでは、皆様も良いツクールライフを!