アイテムを防具として装備したい!

返信する
miyomi
記事: 24
登録日時: 2024年10月25日(金) 02:32

アイテムを防具として装備したい!

投稿記事 by miyomi »

件名のとおり、某神作、魔王物語物語のような、ゲーム内で入手できるアイテム(ポーションや薬草など)を全てアクセサリーとして装備できるようなシステムを作りたいです。

これを再現するには、
1、アイテムと同じ名前の防具を用意
2、コモンイベントでアイテムの所持数を変数に変換
3、防具の数に変数を代入! これで完成! 簡単!

そう思ってやってみましたが、自力では全然うまくいきません。
その際の問題点が、

・そもそも防具の所持数に直接変数を代入する方法が見つからない。
・じゃあアイテムをゲットor売った際に一旦防具の数を0にして、変数ぶん増やせれば、、、と思ってたけれど、アイテムが増減したときにだけ防具の数を0にする方法がわからない。
・そもそも膨大な数のアイテムを処理をコモンイベントの並列処理で行ったらゲームが壊れてしまうのでは、、、?

などなどで、自力での実装は断念した次第です。
もしもこのようなシステムを実装する場合、どのようにやるのが最善なのでしょうか。
どうか、どうか皆様のお力をお貸しください。
最後に編集したユーザー miyomi [ 2024年11月17日(日) 23:27 ], 累計 5 回
アバター
WTR
記事: 625
登録日時: 2015年12月22日(火) 19:14

Re: アイテムを防具として装備したい!

投稿記事 by WTR »

ちょっと考えてみましたがコモンイベントでは難しそうです
ショップとかではコモンイベント自体が使えないんですよ

ということでプラグインを書くしかなさそうなんですが
コンセプトはそのまま
アイテムと同名の防具をあらかじめ用意しておき
アイテムの増減時に同名の防具が存在していればその防具も一緒に増減させる
という処理で考えてみました
二重表示されるとたぶん嫌だと思うので防具一覧には表示されないようにしています

コード: 全て選択

(() => {
    "use strict";

    // アイテムの増減処理をフックしてアイテムと防具の所持数を同期する処理を追加
    const _Game_Party_gainItem = Game_Party.prototype.gainItem;
    Game_Party.prototype.gainItem = function(item, amount, includeEquip) {
        _Game_Party_gainItem.call(this, item, amount, includeEquip);
        this.syncItemAndArmor(item);
    };

    // 装備の着脱処理をフックしてアイテムと防具の所持数を同期する処理を追加
    const _Game_Actor_changeEquip = Game_Actor.prototype.changeEquip;
    Game_Actor.prototype.changeEquip = function(slotId, item) {
        const previousEquip = this.equips()[slotId];
        _Game_Actor_changeEquip.call(this, slotId, item);

        if (item) {
            $gameParty.syncItemAndArmor(item);
        }
        // 外れる装備がある場合
        if (previousEquip) {
            $gameParty.syncItemAndArmor(previousEquip);
        }
    };

    // アイテムと防具の所持数を同期する
    Game_Party.prototype.syncItemAndArmor = function(obj) {
        // アイテムが増減する場合
        if (DataManager.isItem(obj)) {
            const armorData = $dataArmors.find(armor => armor && armor.name === obj.name);
            if (armorData) {
                const numItem = this.numItems(obj);
                if (numItem > 0) {
                    this._armors[armorData.id] = numItem;
                } else {
                    delete this._armors[armorData.id];
                }
            }
        // 防具が増減する場合
        } else if (DataManager.isArmor(obj)) {
            const itemData = $dataItems.find(item => item && item.name === obj.name);
            if (itemData) {
                const numArmor = this.numItems(obj);
                if (numArmor > 0) {
                    this._items[itemData.id] = numArmor;
                } else {
                    delete this._items[itemData.id];
                }
            }
        }
    };

    // 防具一覧に表示されないようにする
    const _Window_ItemList_includes = Window_ItemList.prototype.includes;
    Window_ItemList.prototype.includes = function(obj) {
        if (obj && DataManager.isArmor(obj) && $dataItems.some(item => item && item.name === obj.name)) {
            return false;
        }
        return _Window_ItemList_includes.call(this, obj);
    };
})();
最善かどうかは何とも言えませんがこんな感じで叶うかもしれないです
あまり細かく見てないので考慮が漏れていたらすみません
最後に編集したユーザー WTR [ 2024年11月18日(月) 21:30 ], 累計 2 回
Twitter、はじめました。
https://twitter.com/wtr_in_reverie/
miyomi
記事: 24
登録日時: 2024年10月25日(金) 02:32

Re: アイテムを防具として装備したい!

投稿記事 by miyomi »

ありがとうございます!
無事にアイテムを防具として装備出来ました!
防具一覧に表示されないようにしてくださったのも完璧です、感謝しかありません!

大切に使わせていただきます。
本当にありがとうございました!
miyomi
記事: 24
登録日時: 2024年10月25日(金) 02:32

Re: アイテムを防具として装備したい!

投稿記事 by miyomi »

追記失礼いたします。

頂いたプラグインを使用しながら制作を進めていたのですが、
こちらを導入していると、防具を入手した際に、それがアイテムの防具欄に表示されなくなってしまうようです。
メニューのアイテムではなく、装備にばかり気を取られて気づくのが遅れてしまいました、、、申し訳ありません。

一度解決済みにした手前、非常に言いにくいのですが、
上記の不具合に対応して頂くことは可能でしょうか。
アバター
WTR
記事: 625
登録日時: 2015年12月22日(火) 19:14

Re: アイテムを防具として装備したい!

投稿記事 by WTR »

なんと初歩的な確認漏れ…
上の投稿を修正しました。ご確認ください。
Twitter、はじめました。
https://twitter.com/wtr_in_reverie/
miyomi
記事: 24
登録日時: 2024年10月25日(金) 02:32

Re: アイテムを防具として装備したい!

投稿記事 by miyomi »

お手数おかけし申し訳ありません。
無事にアイテム欄に表示されるようになりました!

本当にありがとうございました!
返信する

“MV:質問”に戻る