見出し画像

0905更新分

こんばんは。RMwoolです。

アモダン用のキャラ絵をほっといて、プラグインの改造に勤しんでいた。
(優先順位が有為転変してる)

今回はプラグインのムヅカシイお話。

noteだから、とりあえず備忘録も兼ねて改造したふたつのプラグインをまとめておく。
私はプラグインの知識は乏しいので、
部分的にChatGPTを使っており、間違えている場所があってもご愛敬ということで……

MNKR_SupponShopStockMZ.js の改造

このお借りしているプラグインは、ショップに在庫システムを与えるもの。
今回はこれに、備わっていなかった「在庫ショップで売る商品の値段を変更させる」機能を実装させるという改造。

このプラグインでは既存のショップとは別の仕組みでできているようなので、
通常のショップのような方法で値段をつけることができない。
(以前のGra表記もこれに悩まされていた)

1:まず、引数にこれを追加。(アイテム、武器、防具のそれぞれに)
引数の6番目に、値段の設定のガワだけを追加。内容はまだない

 * @arg price
 * @text 値段
 * @desc 値段の設定値です。-1にすると設定価格になります。
 * @default -1

2:Game_System.prototype.supponSSaddGoodsにpriceの内容を入れる
args6は値段。

    args[6] = args[6] !== undefined ? Number(args[6]) : -1;
        if (shop) {
            var redundancy = false;
            shop[1].forEach(function (element) {
                if (element[0] == args[0] && element[1] == args[1]) {
                    element = args;
                    redundancy = true;
                }
            })

3:sceneの一番下に新規メソッドを入れる

Scene_supponSSshop.prototype.buyingPrice = function () {
    var element = this.goodsElement();
    if (element) {
        // 価格が設定さていればその価格を使用する
        return element[6] > -1 ? element[6] : Scene_Shop.prototype.buyingPrice.call(this);
    }
    return Scene_Shop.prototype.buyingPrice.call(this);
};

    Window_ShopBuy.prototype.stockId = function () {
        if (this._shopGoods.length > 0) {
            return this._shopGoods[this._index][4];
        } else {
            return null
        }
    };

4:所持金不足でも白字で表示されるっぽい?Window_ShopBuy.prototype.drawItemの様子がおかしいから何とかする

        var price = this._shopGoods[index][6] !== -1 ? this._shopGoods[index][6] : this.price(item);
        var stock = this._shopGoods[index][5]; // 在庫数

        var canBuy = stock > 0 && $gameParty.gold() >= price; // 購入可能かどうか
        this.changePaintOpacity(canBuy); // 購入可能かで透明度を変更

        // 購入可能でない場合に灰色の文字にする
        if (!canBuy) {
            this.changeTextColor(ColorManager.deathColor()); // 灰色
        }

        this.drawItemName(item, rect.x, rect.y, rect.width - priceWidth);
        var text = stock > 0 ? price : SoldOutLabel;
        this.drawText(text, rect.x + rect.width - priceWidth, rect.y, priceWidth, 'right');
        this.changePaintOpacity(true);

// 色を元に戻す
    this.resetTextColor();

5:所持金不足でも買えちゃうっぽい。Window_ShopBuy.prototype.isCurrentItemEnabledの様子もなんかおかしい

        var item = this.item();
        var price = this._shopGoods[this.index()][6] !== -1 ? this._shopGoods[this.index()][6] : this.price(item); // カスタム価格を適用
        var stock = this._shopGoods[this.index()][5]; // 在庫数の確認
        return (stock > 0 && $gameParty.gold() >= price); // 所持金と在庫数を確認して有効無効を判定


で、なんやかんやあってどうにか完成。(2日かかった)

改造の仕方が本当にこれで合っているかどうかはさておき、とりあえず希望通りに動いているので良し!

イベントコマンドのプラグインコマンドでは行数が増えて見にくくなるので、スクリプトで以下のコード
$gameSystem.supponSSaddGoods(["ショップ名", カテゴリ, アイテムID, (-1固定), 在庫数,値段]);
を入れてから呼び出すことで、値段を変更することができた。
(実際にプラグインコマンドからできるかは、使わないので検証してない)

ちなみにこれは、のちに「ランダム在庫ショップ」として使う予定。
高額だけどレアアイテムも1個だけ売ってあげる、という感じ。

NYA_PH_Warehouse.js の改造

続いてこちらのプラグイン。
こちらのお借りものは倉庫関係のプラグイン。
実は初期不具合を含めて既にだいぶ改造しまくっているので、手元にあるものは相当姿が変わっている。

今回はこれに、備わっていなかった「指定した倉庫から指定したアイテムを指定した数だけ削除する」というもの。

まず、「指定した倉庫に指定したアイテムを指定した数だけ入れる」
というのは簡単で、スクリプトからこれだけでできる。

PHPlugins.PHWarehouse.addItems(`<倉庫名:アイテムID:入れる数>`, 'カテゴリ');

なら、削除ならリムーブにすればいいんじゃね?って思った。

PHPlugins.PHWarehouse.removeItems(`<倉庫名:アイテムID:削除する数>`, 'カテゴリ');

まあ、無理だった。
プラグインの中にremoveItemsの関数がないからだ。当然だった。

それなので、additemsの近くに関数を入れる改造をすることにした。
基本的にはadditemsの形式でいける。

PHWarehouseManager.prototype.removeItems = function(_sentence, category) {
    // <預かり所の名前:id:quantity> の形式の入力
    var matches = this.checkSentence(_sentence);
    if (matches) {
        var [warehouseName, itemId, quantity] = matches.split(":");
        itemId = parseInt(itemId);
        quantity = parseInt(quantity);

        if (!itemId || !quantity) {
            console.warn('アイテムIDまたは個数が正しく指定されていないため、削除できません');
            return;
        }

        const warehouse = this._warehouses[warehouseName];
        if (warehouse) {
            // デバッグ: 倉庫の中身を確認
            console.log(`倉庫「${warehouseName}」の中身:`, warehouse);

            // 現在の個数を確認
            const currentCount = warehouse.qtty[category]?.[itemId] || 0;
            console.log(`アイテムID ${itemId} の現在の個数: ${currentCount}`);

            const removeCount = Math.min(currentCount, quantity);

            if (removeCount > 0) {
                // アイテムの個数を減らす
                warehouse.qtty[category][itemId] -= removeCount;

                // 個数が0になった場合はリストから削除
                if (warehouse.qtty[category][itemId] <= 0) {
                    delete warehouse.qtty[category][itemId];
                    warehouse.items[category] = warehouse.items[category].filter(id => id !== itemId);
                }

                console.log(`アイテムID ${itemId} を倉庫「${warehouseName}」から ${removeCount} 個削除しました。`);
            } else {
                console.warn(`削除する個数が不足しています(現在の個数: ${currentCount})。`);
            }
        } else {
            console.error(`指定された倉庫「${warehouseName}」が存在しません。`);
        }
    } else {
        console.error('不正なフォーマットの入力です。<倉庫名:アイテムID:個数>の形式で指定してください。');
    }
};

改造で追加した部分をそのまま張り付けた。(2日かかった)

上記のremoveItemsなんちゃらのコードが使えるようになった。

これを使って、クロリエちゃんが冷蔵庫から勝手におほしさまチップスを食べる処理ができた(?)

クロリエちゃんポテチ食べちゃった。



とりあえず備忘録なのでざっくりと。
プラグインに詳しい人が見ればたぶん、変な処理してるな、とは思う。

ChtatGPTにお願いするにも、
ここがこういう感じにおかしいからああいう感じにしてくれ。
としっかり伝えないと、とんでもない部分を編集したり、明らかに重要な部分を削ったりしてくる。
ある程度内容を把握しておかないといけないので脳死でお願いすることはできなそう。

とりあえず次こそはちゃんとアモダンの続きを作らねば。

今回はここまで。よろしくどーぞ。

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