見出し画像

戦闘中どうぐとしてつかうと効果がある武具

いかずちのつえとかちからのたてとか

あるじゃないですか。戦闘中にどうぐ欄からつかうと特殊な効果が発生する武器とか防具。あれをやりたいのでつくりました。

スクリーンショット 2021-08-08 11.55.25

他のキャラが装備中の武具を使用可能にするかは、そんなに手間でもなかったので一応選択可能にしました。まぁ手に持ってるものならわかるけど鎧とかいちいちはずして使わせるのかみたいなのはあるだろうし。

スクリーンショット 2021-08-08 11.58.35

こういう感じになります。実際に使うと、メタタグに書いておいたスキルが発動します。

実装はそこそこ大変でした

まず、戦闘中のどうぐのリスト窓ですが、これは Window_BattleItem というクラスがあります。ただ、このクラスは大半のメソッドを Window_ItemList から継承して使っているので、そっちに手を入れて、戦闘中だけはもともとの処理のあとさらに、メンバーの装備を見てメタタグ<AsItem>が入っているものを項目として追加しています。

   const _Window_ItemList_makeItemList = Window_ItemList.prototype.makeItemList;
   Window_ItemList.prototype.makeItemList = function() {
       _Window_ItemList_makeItemList.call(this);

       if (SceneManager.isSceneBattle()) {
           for (const member of $gameParty.members()) {
               if (!params.othersEquip) {
                   if (!BattleManager.actor()) {
                       continue;
                   }
                   if (member.actorId() != BattleManager.actor().actorId()) {
                       continue;
                   }
               }

               for (const equip of member.equips()) {
                   if (equip && equip.meta && equip.meta.AsItem) {
                       this._data.push(equip);
                   }
               }
           }
       }
   };

params.othersEquip の分岐は、他キャラが装備中の武具を使用可能にするかどうかを見ています。

なおこのとき武具の数は描画する必要がないので、Window_ItemList.drawItemNumber に手を入れて、戦闘中はその項目が武器とか防具とかではない場合のみ処理をするようにしています。そうすると上のスクショのように武具だけは数が入らなくなります。

   const _Window_ItemList_drawItemNumber = Window_ItemList.prototype.drawItemNumber;
   Window_ItemList.prototype.drawItemNumber = function(item, x, y, width) {
       if (SceneManager.isSceneBattle()) {
           if (!DataManager.isWeapon(item) && !DataManager.isArmor(item)) {
               _Window_ItemList_drawItemNumber.call(this, item, x, y, width);
           }
       } else {
           _Window_ItemList_drawItemNumber.call(this, item, x, y, width);
       }
   };

ここでも DataManager.isWeapon とかがちゃんと機能していますね。有能。あとは使用可能でない武具が入ってもめんどうなので、Game_BattlerBase.canUse もいじったりしています。

あとは実際に使用したときの挙動です。これは Scene_Battle.onItemOk に書いてあるのでここをいじります。

   const _Scene_Battle_onItemOk = Scene_Battle.prototype.onItemOk;
   Scene_Battle.prototype.onItemOk = function() {
       if (DataManager.isWeapon(this._itemWindow.item())
        || DataManager.isArmor(this._itemWindow.item())) {
           const item = this._itemWindow.item();
           const skillId = Number(item.meta.AsItem);
           const action = BattleManager.inputtingAction();
           action.setSkill(skillId);
           $gameParty.setLastItem(item);
           this.onSelectAction();
       } else {
           _Scene_Battle_onItemOk.call(this);
       }
   };

武器や防具だったらそこに設定されてるスキルを発動させて、それ以外はいままでどおり道具として効果を出すようにしているわけですね。スキル発動の時の処理は onSkillOk に書いてあるのでそれと同じようにすればOKです。

ダウンロードはこちら

CSVN_armsAsSpecialEffectItem.js
※右クリックでDL。

ほかにつくったやつはこちら

cursed-steven/rmmz: RPGツクールMZ用のプラグインスクリプトをおいていきます。


いいなと思ったら応援しよう!