【解決済】バトル時に同じスキルを追加した時、スキル欄で複数のスキルとして表示できるようにしたい

VON
記事: 2
登録日時: 2023年12月10日(日) 04:24

【解決済】バトル時に同じスキルを追加した時、スキル欄で複数のスキルとして表示できるようにしたい

投稿記事by VON » 2023年12月10日(日) 09:10

初めて書き込ませていただきます。
プラグインは導入経験ありますが、改変などは未経験の初心者です。

ご質問は表題のとおりで、例えば「アタック」という名のスキルを
「スキル追加」により複数回追加しても、スキルウィンドウ内には「アタック」は一つしか表示されませんが、
これを三回追加したら、「アタック」「アタック」「アタック」と
別個のものとして表示できるようにしたいという事です。

現在、
「毎ターン、スキルが五つランダムで配られる。スキルは一回のみ利用可能。
 所持MP内ならばターン内で何回でも使える」システムのゲームを作っております。
毎ターンMPが3となり、「アタック(消費1)」「アタック(消費1)」「アタック(消費1)」
「ファイア(消費2)」「ガード(消費1)」の5スキルが配られたら、
消費が3になるまで自ターンでスキルが使える、といったような形です。

上記バトルを表現する為に、所持武器を毎ターン五つランダムで装備する形とし、
武器についている「スキル追加」で、五つのスキルを毎ターン覚えるようにしたのですが、
表題のところ、要は「アタック」が三つあっても一つしか表示されない部分の改善が出来ず、つまづいています。

自分なりに解決するプラグインを探したのですが、ニッチすぎる要望のためか見当たらず。
これを解決するプラグイン、もしくは、具体的に、「ここをこう改変すれば良い」という事を
教えて下さる方がいれば、ぜひよろしくおねがいします。
最後に編集したユーザー VON on 2023年12月10日(日) 13:09 [ 編集 1 回目 ]

アバター
Plasma Dark
記事: 669
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: バトル時に同じスキルを追加した時、スキル欄で複数のスキルとして表示できるようにしたい

投稿記事by Plasma Dark » 2023年12月10日(日) 11:59

複雑でニッチなことをする場合、既存の仕組みでできる範囲で妥協しないのであれば、プラグインを書く必要があります。

JavaScriptの読み書き・文法に関しては、jsprimerやMDNのページが参考になります。
https://jsprimer.net/
https://developer.mozilla.org/ja/docs/Web/JavaScript

JavaScriptを読み書きする際のエディタは、特にこだわりがなければVisual Studio Codeがおすすめです。
https://code.visualstudio.com/

今回は比較的わかりやすいところなので、読むべきコードと、どういう実装をすれば良いかの方針を示しておきます。

rmmz_objects.js (Game_***クラス) と rmmz_windows.js (Window_***クラス) の特定の関数を読んで、それらを拡張するプラグインを書くのがシンプルなやり方です。

スキル一覧ウィンドウの表示に使われるスキル一覧はGame_Actor.prototype.skills関数から返しています。
習得しているスキルと、特徴によって追加されたスキルから、重複なくスキル一覧を返す関数です。
Game_Actor.prototype.addedSkills関数が、特徴によって追加されたスキルのID一覧を返します。

スキル一覧の表示ウィンドウはWindow_SkillListクラスと、戦闘中はそれを継承したWindow_BattleSkillクラスで行っています。
表示するスキル一覧はWindow_SkillList.prototype.makeItemListで作っています。

コード: 全て選択

this._data = this._actor.skills().filter(item => this.includes(item));


こんなコードが書いてありますが、これで対象アクターのskills関数を呼び出し、返ってきたスキル一覧について、Window_SkillListクラス内のincludes関数が真になるもののみ残すようフィルタする、ということをしています。
デフォルトではincludes関数はスキルタイプが選んだものと一致しているかどうかを確認しているだけです。

表示するスキル一覧を何らか変更したい (今回のケースでは、特徴によって複数回追加されたスキルを追加された回数分表示したい) のであれば、これらウィンドウクラスのmakeItemListで作られる一覧をどうにかしてカスタマイズすることになるでしょう。
戦闘中に関わらず同様の表示をしたいのであればWindow_SkillListクラス、戦闘中のみ表示を変えたいのであればWindow_BattleSkillクラスが対象です。

戦闘中に関わらず変更するなら、Game_Actor.prototype.skillsのほうを変えてしまう手もあります。
この関数が返す内容によって、ウィンドウクラス側のmakeItemList関数が一覧を作るためです。

以下、シンプルな実装例です。あくまで例なので、求めている仕様に応じて適宜変更してください。

コード: 全て選択

(() => {
  'use strict';

  Game_Actor.prototype.skills = function () {
    return this.addedSkills().map(skillId => $dataSkills[skillId]);
  };
})();


アクターのスキル一覧を、特徴によって追加されたスキルのみにして、追加された回数分表示されるようにするプラグインを、最もシンプルに書くとこうなります。

戦闘中だけ表示を変えたいのであれば、Window_BattleSkill.prototype.makeItemListをプラグインで上書きするのが楽だと思います。

コード: 全て選択

(() => {
  'use strict';

  Window_BattleSkill.prototype.makeItemList = function () {
    this._data = this._actor?.addedSkills().map(id => $dataSkills[id]) || [];
  };
})();


戦闘中、アクターのスキル一覧を特徴によって追加されたスキルのみにして、追加された回数分表示されるようにするプラグインはこう書けます。
VON
記事: 2
登録日時: 2023年12月10日(日) 04:24

Re: バトル時に同じスキルを追加した時、スキル欄で複数のスキルとして表示できるようにしたい

投稿記事by VON » 2023年12月10日(日) 13:08

>Plasma Dark さま
丁寧なご返信、ありがとうございます!
ご提示のコードでやりたい事が完全に達成できました。
本当にありがとうございました!

“MZ:質問” へ戻る