ページ 11

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

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

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

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

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

などなどで、自力での実装は断念した次第です。
もしもこのようなシステムを実装する場合、どのようにやるのが最善なのでしょうか。
どうか、どうか皆様のお力をお貸しください。

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

Posted: 2024年10月29日(火) 23:16
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);
    };
})();
最善かどうかは何とも言えませんがこんな感じで叶うかもしれないです
あまり細かく見てないので考慮が漏れていたらすみません

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

Posted: 2024年10月30日(水) 14:26
by miyomi
ありがとうございます!
無事にアイテムを防具として装備出来ました!
防具一覧に表示されないようにしてくださったのも完璧です、感謝しかありません!

大切に使わせていただきます。
本当にありがとうございました!

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

Posted: 2024年11月17日(日) 23:34
by miyomi
追記失礼いたします。

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

一度解決済みにした手前、非常に言いにくいのですが、
上記の不具合に対応して頂くことは可能でしょうか。

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

Posted: 2024年11月18日(月) 21:28
by WTR
なんと初歩的な確認漏れ…
上の投稿を修正しました。ご確認ください。

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

Posted: 2024年11月19日(火) 22:48
by miyomi
お手数おかけし申し訳ありません。
無事にアイテム欄に表示されるようになりました!

本当にありがとうございました!