/*
 * --------------------------------------------------
 * MNKR_SupponShopStockMZ.js
 *   Ver.0.0.7
 * Copyright (c) 2020 Munokura
 * This software is released under the MIT license.
 * http://opensource.org/licenses/mit-license.php
 * --------------------------------------------------
 */

//============================================================================
// SupponShopStock.js
//============================================================================

/*:
 * @target MZ
 * @url https://raw.githubusercontent.com/munokura/MNKR-MZ-plugins/master/MNKR_SupponShopStockMZ.js
 * 
 * @plugindesc 在庫システムを有するお店を設定します。
 * @author Suppon (改変 munokura)
 *
 * @help
 * 以下の機能をプラグインコマンドで使用してください。
 *
 * - ショップの作成
 * - アイテムの追加
 * - 武器の追加
 * - 防具の追加
 * - アイテムの削除
 * - 武器の削除
 * - 防具の削除
 * - ショップの起動
 * - ショップの削除
 * - 変数管理しないアイテムの在庫数を、指定して変数に代入
 *
 * 
 * このプラグインについて
 *   RPGツクールMV用に作成されたプラグインをMZ用に移植したものです。
 *   お問い合わせは改変者へお願いいたします。
 * 
 * 利用規約:
 *   MITライセンスです。
 *   https://licenses.opensource.jp/MIT/MIT.html
 *   作者に無断で改変、再配布が可能で、
 *   利用形態（商用、18禁利用等）についても制限はありません。
 * 
 *
 * @param Label of stock Number
 * @text 在庫数の表記
 * @desc 在庫数の表記を設定します
 * @default 在庫数
 *
 * @param Label of sold out
 * @text 売り切れの表記
 * @desc 売り切れの表記を設定します
 * @default 売り切れ
 *
 * @param Display option
 * @text 在庫数を表示
 * @type boolean
 * @on 在庫数を表示
 * @off 在庫数を非表示
 * @desc true にすると在庫数が、持っている数の横に表示されます。
 * @default false
 *
 * @param Display option space
 * @text オプション表示スペース
 * @desc 持っている数と在庫数の表示スペースです。
 * @default 12
 * 
 * 
 * @command makeShop
 * @text ショップ作成
 * @desc ショップを作成します。
 *
 * @arg shopName
 * @text ショップの名前
 * @desc ショップの名前です。数値でも構いません。
 * @default shop1
 * 
 * @arg shopType
 * @text ショップタイプ
 * @desc ショップタイプの指定。
 * @type select
 * @option 購買専門（売却不可）
 * @value 0
 * @option 購買、売却可能
 * @value 1
 * @option 購買、売却可能、売却品が商品に追加
 * @value 2
 * @default 2
 *
 * 
 * @command addItem
 * @text アイテム追加
 * @desc ショップにアイテムを追加します。
 *
 * @arg shopName
 * @text ショップの名前
 * @desc ショップの名前です。数値でも構いません。
 * @default shop1
 *
 * @arg itemId
 * @text 追加アイテム
 * @desc 追加するアイテムのIDです。
 * @type item
 * @default 1
 *
 * @arg variableId
 * @text 在庫の変数ID
 * @desc 在庫の個数を割り当てる変数のIDです。-1にする（テキストタブ指定）と変数は使わず、在庫は内部のデータで処理されます。
 * @type variable
 * @default -1
 *
 * @arg stock
 * @text 在庫数
 * @desc 在庫数の設定値です。
 * @default 1
 *
 * 
 * @command addWeapon
 * @text 武器追加
 * @desc ショップに武器を追加します。
 *
 * @arg shopName
 * @text ショップの名前
 * @desc ショップの名前です。数値でも構いません。
 * @default shop1
 *
 * @arg weaponId
 * @text 追加武器
 * @desc 追加する武器のIDです。
 * @type weapon
 * @default 1
 *
 * @arg variableId
 * @text 在庫の変数ID
 * @desc 在庫の個数を割り当てる変数のIDです。-1にする（テキストタブ指定）と変数は使わず、在庫は内部のデータで処理されます。
 * @type variable
 * @default -1
 *
 * @arg stock
 * @text 在庫数
 * @desc 在庫数の設定値です。
 * @default 1
 *
 * 
 * @command addArmor
 * @text 防具追加
 * @desc ショップに防具を追加します。
 *
 * @arg shopName
 * @text ショップの名前
 * @desc ショップの名前です。数値でも構いません。
 * @default shop1
 *
 * @arg armorId
 * @text 追加防具
 * @desc 追加する防具のIDです。
 * @type armor
 * @default 1
 *
 * @arg variableId
 * @text 在庫の変数ID
 * @desc 在庫の個数を割り当てる変数のIDです。-1にする（テキストタブ指定）と変数は使わず、在庫は内部のデータで処理されます。
 * @type variable
 * @default -1
 *
 * @arg stock
 * @text 在庫数
 * @desc 在庫数の設定値です。
 * @default 1
 *
 * 
 * @command removeItem
 * @text アイテム削除
 * @desc ショップからアイテムを削除します。
 *
 * @arg shopName
 * @text ショップの名前
 * @desc ショップの名前です。数値でも構いません。
 * @default shop1
 *
 * @arg itemId
 * @text 削除アイテム
 * @desc 削除するアイテムのIDです。
 * @type item
 * @default 1
 *
 * 
 * @command removeWeapon
 * @text 武器削除
 * @desc ショップから武器を削除します。
 *
 * @arg shopName
 * @text ショップの名前
 * @desc ショップの名前です。数値でも構いません。
 * @default shop1
 *
 * @arg weaponId
 * @text 削除武器
 * @desc 削除する武器のIDです。
 * @type weapon
 * @default 1
 *
 * 
 * @command removeArmor
 * @text 防具削除
 * @desc ショップから防具を削除します。
 *
 * @arg shopName
 * @text ショップの名前
 * @desc ショップの名前です。数値でも構いません。
 * @default shop1
 *
 * @arg armorId
 * @text 削除防具
 * @desc 削除する防具のIDです。
 * @type armor
 * @default 1
 *
 * 
 * @command openShop
 * @text ショップを開く
 * @desc ショップを開きます。
 *
 * @arg shopName
 * @text ショップの名前
 * @desc ショップの名前です。数値でも構いません。
 * @default shop1
 *
 * @arg sort
 * @text ソートオプション
 * @desc 購買時のソートオプションです。
 * @type select
 * @option 追加した順
 * @value 0
 * @option アイテムID順、武器ID順、防具ID順
 * @value 1
 * @option カテゴリー選択中でID順
 * @value 2
 * @default 2
 *
 * 
 * @command deleteShop
 * @text ショップを削除
 * @desc ショップを削除します。
 *
 * @arg shopName
 * @text ショップの名前
 * @desc ショップの名前です。数値でも構いません。
 * @default shop1
 *
 * 
 * @command getNumItem
 * @text 在庫アイテム数取得
 * @desc 在庫アイテム数を変数に代入します。
 *
 * @arg shopName
 * @text ショップの名前
 * @desc ショップの名前です。数値でも構いません。
 * @default shop1
 *
 * @arg itemId
 * @text アイテムID
 * @desc 取得するアイテムのIDです。
 * @type item
 * @default 1
 *
 * @arg variableId
 * @text 変数ID
 * @desc 在庫の個数を代入する変数のIDです。
 * @type variable
 * @default 1
 *
 * 
 * @command getNumWeapon
 * @text 在庫武器数取得
 * @desc 在庫武器数を変数に代入します。
 *
 * @arg shopName
 * @text ショップの名前
 * @desc ショップの名前です。数値でも構いません。
 * @default shop1
 *
 * @arg weaponId
 * @text 武器ID
 * @desc 取得する武器のIDです。
 * @type weapon
 * @default 1
 *
 * @arg variableId
 * @text 変数ID
 * @desc 在庫の個数を代入する変数のIDです。
 * @type variable
 * @default 1
 *
 * 
 * @command getNumArmor
 * @text 在庫防具数取得
 * @desc 在庫防具数を変数に代入します。
 *
 * @arg shopName
 * @text ショップの名前
 * @desc ショップの名前です。数値でも構いません。
 * @default shop1
 *
 * @arg armorId
 * @text 防具ID
 * @desc 取得する防具のIDです。
 * @type armor
 * @default 1
 *
 * @arg variableId
 * @text 変数ID
 * @desc 在庫の個数を代入する変数のIDです。
 * @type variable
 * @default 1
 * 
 */

(function () {

    "use strict";

    const pluginName = document.currentScript.src.split("/").pop().replace(/\.js$/, "");

    var parameters = PluginManager.parameters(pluginName);
    var StockLabel = String(parameters['Label of stock Number'] || 'Stock');
    var SoldOutLabel = String(parameters['Label of sold out'] || 'Sold Out');
    var DisplayOption1 = parameters['Display option'] === 'true';
    var Option1Space = Number(parameters['Display option space']);

    PluginManager.registerCommand(pluginName, "makeShop", arr => {
        const args = Object.entries(arr).map(([key, value]) => `${value}`);
        $gameSystem.supponSSmakeShop(args);
    });

    PluginManager.registerCommand(pluginName, "addItem", arr => {
        const args = Object.entries(arr).map(([key, value]) => `${value}`);
        args.splice(1, 0, 0);
        $gameSystem.supponSSaddGoods(args);
    });

    PluginManager.registerCommand(pluginName, "addWeapon", arr => {
        const args = Object.entries(arr).map(([key, value]) => `${value}`);
        args.splice(1, 0, 1);
        $gameSystem.supponSSaddGoods(args);
    });

    PluginManager.registerCommand(pluginName, "addArmor", arr => {
        const args = Object.entries(arr).map(([key, value]) => `${value}`);
        args.splice(1, 0, 2);
        $gameSystem.supponSSaddGoods(args);
    });

    PluginManager.registerCommand(pluginName, "removeItem", arr => {
        const args = Object.entries(arr).map(([key, value]) => `${value}`);
        args.splice(1, 0, 0);
        $gameSystem.supponSSremoveGoods(args);
    });

    PluginManager.registerCommand(pluginName, "removeWeapon", arr => {
        const args = Object.entries(arr).map(([key, value]) => `${value}`);
        args.splice(1, 0, 1);
        $gameSystem.supponSSremoveGoods(args);
    });

    PluginManager.registerCommand(pluginName, "removeArmor", arr => {
        const args = Object.entries(arr).map(([key, value]) => `${value}`);
        args.splice(1, 0, 2);
        $gameSystem.supponSSremoveGoods(args);
    });

    PluginManager.registerCommand(pluginName, "deleteShop", arr => {
        const args = Object.entries(arr).map(([key, value]) => `${value}`);
        $gameSystem.supponSSdeleteShop(args);
    });

    PluginManager.registerCommand(pluginName, "openShop", arr => {
        const args = Object.entries(arr).map(([key, value]) => `${value}`);
        $gameSystem.supponSSopenShop(args);
    });

    PluginManager.registerCommand(pluginName, "getNumItem", arr => {
        const args = Object.entries(arr).map(([key, value]) => `${value}`);
        args.splice(1, 0, 0);
        $gameSystem.supponSSgetNumItem(args);
    });

    PluginManager.registerCommand(pluginName, "getNumWeapon", arr => {
        const args = Object.entries(arr).map(([key, value]) => `${value}`);
        args.splice(1, 0, 1);
        $gameSystem.supponSSgetNumItem(args);
    });

    PluginManager.registerCommand(pluginName, "getNumArmor", arr => {
        const args = Object.entries(arr).map(([key, value]) => `${value}`);
        args.splice(1, 0, 2);
        $gameSystem.supponSSgetNumItem(args);
    });

    Game_System.prototype.supponSScheckData = function () {
        this._supponSS = this._supponSS || [];
    }

    Game_System.prototype.supponSSmakeShop = function (args) {
        this.supponSScheckData();
        var redundancy = this._supponSS.some(function (element) {
            return element[0] === args[0];
        })
        if (redundancy) { return };
        if (!args[1]) { args[1] = 1 };
        this._supponSS.push([args[0], [], args[1]]);//[shopid, goods, shoptype]
    }

    Game_System.prototype.supponSSaddGoods = function (args) {
        var shop = this.supponSSsearchShop(args);
        args.shift();
        args.splice(2, 0, 0, 0);
        if (shop) {
            var redundancy = false;
            shop[1].forEach(function (element) {
                if (element[0] == args[0] && element[1] == args[1]) {
                    element = args;
                    redundancy = true;
                }
            })
            if (args[5]) {
                args[4] > 0 ? $gameVariables.setValue(Number(args[4]), Number(args[5])) : 0;
            } else {
                args[5] = 0;
            }
            if (!redundancy) { shop[1].push(args) }
        }
    }

    Game_System.prototype.supponSSremoveGoods = function (args) {
        var shop = this.supponSSsearchShop(args);
        if (!shop) { return };
        shop[1] = shop[1].filter(function (element) {
            return !(args[1] == element[0] && args[2] == element[1]);
        })
    }

    Game_System.prototype.supponSSsearchShop = function (args) {
        this.supponSScheckData();
        var shop = null;
        this._supponSS.forEach(function (element) {
            if (args[0] === element[0]) { shop = element }
        })
        if (!shop) {
            console.log('Not exist shop of ' + args[0] + ' !!');
        }
        return shop;
    }

    Game_System.prototype.supponSSdeleteShop = function (args) {
        this._supponSS = this._supponSS.filter(function (element) {
            return !(element[0] == args[0]);
        })
    }

    Game_System.prototype.supponSSopenShop = function (args) {
        var shop = this.supponSSsearchShop(args);
        if (shop) {
            SceneManager.push(Scene_supponSSshop);
            var purchaseOnly = shop[2] == 0;
            var sortType = args[1];
            SceneManager.prepareNextScene(shop, purchaseOnly, sortType);
        }
    }

    Game_System.prototype.supponSSgetNumItem = function (args) {
        if (!args[2]) { return }
        var shop = this.supponSSsearchShop(args)
        var goodsElement = null;
        if (shop) {
            goodsElement = shop[1].find(function (element) {
                return element[0] == args[1] && element[1] == args[2];
            })
        }
        if (goodsElement) {
            if (Number(goodsElement[4]) > 0) {
                var n = $gameVariables.value(goodsElement[4]);
            } else {
                var n = goodsElement[5];
            }
            $gameVariables.setValue(Number(args[3]), Number(n));
        } else {
            $gameVariables.setValue(Number(args[3]), 0);
        }
    }

    function Scene_supponSSshop() {
        this.initialize.apply(this, arguments);
    };

    SceneManager.isSupponSS = function () {
        return this._scene.constructor === Scene_supponSSshop;
    }

    Scene_supponSSshop.prototype = Object.create(Scene_Shop.prototype);
    Scene_supponSSshop.prototype.constructor = Scene_supponSSshop;

    Scene_supponSSshop.prototype.initialize = function () {
        Scene_Shop.prototype.initialize.call(this);
        this._trade = '';// 'buy' or 'sell';
    };

    Scene_supponSSshop.prototype.prepare = function (shop, purchaseOnly, sortType) {
        this._shop = shop;
        this._sortTyep = sortType;
        this._originalGoods = this._shop[1];
        this._goods = this._shop[1];
        this._purchaseOnly = purchaseOnly;
        this._item = null;
    };

    Scene_supponSSshop.prototype.sortGoods = function () {
        this._goods = [];
        if (this._sortTyep == 1) {
            for (let i = 0; i < this._originalGoods.length; i++) {
                this._goods.push(this._originalGoods[i]);
            }
            this._goods.sort(function (a, b) {
                return a[0] - b[0] || a[0] == b[0] && a[1] - b[1]
            })
        } else if (this._sortTyep == 2) {
            const type = ["item", "weapon", "armor", "keyItem"].indexOf(this._categoryWindow.currentSymbol());  //Dark Plasma 2021.12.11
            // var type = this._categoryWindow.index();
            this._goods = this._originalGoods.filter(function (element) {
                return (element[0] == type);
            })
            this._goods.sort(function (a, b) { return a[1] - b[1] })
        } else {
            this._goods = this._originalGoods;
        }
        this._buyWindow._shopGoods = this._goods;
    }

    Scene_supponSSshop.prototype.commandBuy = function () {
        this._trade = 'buy';
        if (this._sortTyep == 2) {
            // this._categoryWindow._list[3].enabled = false;//大事なもの選択不可   MZ対策
            Window_Selectable.prototype.refresh.call(this._categoryWindow);
            this._categoryWindow.setItemWindow(null);
            this._categoryWindow.show();
            this._categoryWindow.activate();
            return;
        }
        this.sortGoods();
        Scene_Shop.prototype.commandBuy.call(this);
    };

    Scene_supponSSshop.prototype.onCategoryOk = function () {
        if (this._trade == 'sell') {
            Scene_Shop.prototype.onCategoryOk.call(this);
            return;
        }
        this._categoryWindow.hide();
        this.sortGoods();
        this._buyWindow.select(0);
        Scene_Shop.prototype.commandBuy.call(this);
    };

    Scene_supponSSshop.prototype.onCategoryCancel = function () {
        if (this._trade == 'sell') {
            Scene_Shop.prototype.onCategoryCancel.call(this);
        } else {
            this._categoryWindow.hide();
            this._categoryWindow.deactivate();
            Scene_Shop.prototype.onBuyCancel.call(this);
        }
    };

    Scene_supponSSshop.prototype.onBuyCancel = function () {
        if (this._sortTyep != 2) {
            Scene_Shop.prototype.onBuyCancel.call(this);
            return;
        }
        this._dummyWindow.show();
        this._buyWindow.hide();
        this._statusWindow.hide();
        this._statusWindow.setItem(null);
        this._helpWindow.clear();
        this._categoryWindow.show();
        this._categoryWindow.activate();
    };

    Scene_supponSSshop.prototype.commandSell = function () {
        this._trade = 'sell';
        // this._categoryWindow._list[3].enabled = true;//大事なもの選択可  MZ対策
        Window_Selectable.prototype.refresh.call(this._categoryWindow);
        this._categoryWindow.setItemWindow(this._sellWindow);
        Scene_Shop.prototype.commandSell.call(this);
    };

    Scene_supponSSshop.prototype.stockNumber = function () {
        if (this._trade == 'buy') {
            return this._buyWindow.stockNumber();
        } else if (this._trade == 'sell') {
            var goodsElement = this.goodsElement();
            if (goodsElement) {
                if (goodsElement[4] > 0) {
                    return $gameVariables.value(Number(goodsElement[4]));
                } else if (goodsElement[4] == -1) {
                    return goodsElement[5];
                }
            } else {
                return null;
            }
        }
    }

    Scene_supponSSshop.prototype.stockId = function () {
        if (this._trade == 'buy') {
            return this._buyWindow.stockId();
        } else if (this._trade == 'sell') {
            var goodsElement = this.goodsElement()
            if (goodsElement) {
                if (goodsElement[4] > 0) {
                    return goodsElement[4];
                }
            }
        }
    }

    Scene_supponSSshop.prototype.goodsElement = function () {
        if (this._trade == 'buy') {
            return this._goods[this._buyWindow.index()];
        } else if (this._trade == 'sell') {
            return this.searchGoodsElement();
        }
    }

    Scene_supponSSshop.prototype.searchGoodsElement = function () {
        var type = this.itemTypeAndId()[0];
        var id = this.itemTypeAndId()[1];
        var goodsElement = null;
        this._originalGoods.forEach(function (element) {
            if (element[0] == type && element[1] == id) {
                goodsElement = element;
            }
        })
        return goodsElement;
    }

    Scene_supponSSshop.prototype.itemTypeAndId = function () {
        if (DataManager.isItem(this._item)) {
            var type = 0;
        } else if (DataManager.isWeapon(this._item)) {
            var type = 1;
        } else if (DataManager.isArmor(this._item)) {
            var type = 2;
        } else {
            var type = null;
        }
        return [type, (this._item ? this._item.id : null)];
    }

    Scene_supponSSshop.prototype.makeGoodsElement = function () {
        var type = Number(this.itemTypeAndId()[0]);
        var id = Number(this.itemTypeAndId()[1]);
        return [type, id, 0, 0, -1, 0];
    }

    Scene_supponSSshop.prototype.doBuy = function (number) {
        Scene_Shop.prototype.doBuy.call(this, number);
        this.processStockBuy(number);
    };

    Scene_supponSSshop.prototype.processStockBuy = function (number) {
        var element = this.goodsElement();
        if (this.stockId() > 0) {
            $gameVariables.setValue(this.stockId(), this.stockNumber() - number)
        } else if (this.stockId() == -1) {
            var lastStock = element[5];
            element[5] = lastStock - number;
        }
    }

    Scene_supponSSshop.prototype.maxBuy = function () {
        var max = $gameParty.maxItems(this._item) - $gameParty.numItems(this._item);
        max = Math.min(max, this.stockNumber());
        var price = this.buyingPrice();
        if (price > 0) {
            return Math.min(max, Math.floor(this.money() / price));
        } else {
            return max;
        }
    };

    Scene_supponSSshop.prototype.doSell = function (number) {
        $gameParty.gainGold(number * this.sellingPrice());
        $gameParty.loseItem(this._item, number);
        this.processStockSell(number);
    };

    Scene_supponSSshop.prototype.processStockSell = function (number) {
        var goodsElement = this.goodsElement();
        if (goodsElement) {
            if (goodsElement[4] > 0) {
                var lastNumber = $gameVariables.value(goodsElement[4]);
                $gameVariables.setValue(goodsElement[4], lastNumber + number);
            } else if (goodsElement[4] == -1) {
                goodsElement[5] = Number(goodsElement[5]) + number;
            }
        } else if (this._shop[2] == 2) {
            goodsElement = this.makeGoodsElement();
            goodsElement[5] = number;
            this._originalGoods.push(goodsElement);
            this.sortGoods();
        }
    }

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

    Window_ShopBuy.prototype.stockNumber = function () {
        if (this.stockId() > 0) {
            return $gameVariables.value(this.stockId());
        } else if (this.stockId() == -1) {
            return this._shopGoods[this._index][5];
        }
    };

    var _Window_ShopBuy_drawItem = Window_ShopBuy.prototype.drawItem;
    Window_ShopBuy.prototype.drawItem = function (index) {
        if (!SceneManager.isSupponSS()) {
            _Window_ShopBuy_drawItem.call(this, index);
            return;
        }
        var item = this._data[index];
        var rect = this.itemRect(index);
        var priceWidth = 96;
        rect.width -= this.textPadding();
        if (this._shopGoods[index][4] > 0) {
            var stockNumber = $gameVariables.value(this._shopGoods[index][4]);
        } else if (this._shopGoods[index][4] == -1) {
            var stockNumber = this._shopGoods[index][5]
        }
        this.changePaintOpacity(this.isEnabled(item) && stockNumber > 0);
        this.drawItemName(item, rect.x, rect.y, rect.width - priceWidth);
        var text = (stockNumber > 0 ? this.price(item) : SoldOutLabel);
        this.drawText(text, rect.x + rect.width - priceWidth,
            rect.y, priceWidth, 'right');
        this.changePaintOpacity(true);
    };

    var _Window_ShopBuy_isCurrentItemEnabled = Window_ShopBuy.prototype.isCurrentItemEnabled;
    Window_ShopBuy.prototype.isCurrentItemEnabled = function () {
        if (SceneManager.isSupponSS()) {
            return (_Window_ShopBuy_isCurrentItemEnabled.call(this) && this.stockNumber() > 0)
        } else {
            return _Window_ShopBuy_isCurrentItemEnabled.call(this)
        }
    };

    var _Window_ShopBuy_updateHelp = Window_ShopBuy.prototype.updateHelp;
    Window_ShopBuy.prototype.updateHelp = function () {
        if (this._statusWindow && SceneManager.isSupponSS()) {
            this._statusWindow.setStock(this.stockNumber());
        }
        _Window_ShopBuy_updateHelp.call(this);
    };

    var _Window_ShopSell_updateHelp = Window_ShopSell.prototype.updateHelp;
    Window_ShopSell.prototype.updateHelp = function () {
        if (this._statusWindow && SceneManager.isSupponSS()) {
            SceneManager._scene._item = this.item();
            this._statusWindow.setStock(SceneManager._scene.stockNumber());
        }
        _Window_ShopSell_updateHelp.call(this);
    };

    var _Window_ShopStatus_initialize = Window_ShopStatus.prototype.initialize;
    Window_ShopStatus.prototype.initialize = function (x, y, width, height) {
        this._stockNumber = null;
        _Window_ShopStatus_initialize.call(this, x, y, width, height);
    };

    Window_ShopStatus.prototype.setStock = function (number) {
        this._stockNumber = number;
    };

    Window_ShopStatus.prototype.stockNumber = function () {
        return SceneManager._scene.stockNumber();
    }

    var _Window_ShopStatus_drawPossession = Window_ShopStatus.prototype.drawPossession;
    Window_ShopStatus.prototype.drawPossession = function (x, y) {
        if (DisplayOption1) {
            this.drawPossession2(x, y);
        } else {
            _Window_ShopStatus_drawPossession.call(this, x, y);
        }
    };

    Window_ShopStatus.prototype.isNeedDrawStock = function () {
        return (SceneManager.isSupponSS() && this._stockNumber);
    }

    Window_ShopStatus.prototype.drawStockNumber = function (x, y, width) {
        var possessionWidth = this.textWidth('0000');
        this.changeTextColor(this.systemColor());
        this.drawText(StockLabel, x, y, width - possessionWidth);
        this.resetTextColor();
        var n = this._stockNumber || 0;
        this.drawText(this._stockNumber, x, y, width, 'right');
    }

    Window_ShopStatus.prototype.drawPossession2 = function (x, y) {
        var width = (this.contents.width - x) / 2;
        var possessionWidth = this.textWidth('0000');
        this.changeTextColor(this.systemColor());
        this.drawText(TextManager.possession, x, y, width - possessionWidth);
        this.resetTextColor();
        this.drawText($gameParty.numItems(this._item), x, y, width, 'right');
        if (this.isNeedDrawStock()) {
            this.drawStockNumber(x + width + Option1Space, y, width - Option1Space);
        }
    }

    var _Scene_Shop_onSellOk = Scene_Shop.prototype.onSellOk;
    Scene_Shop.prototype.onSellOk = function () {
        _Scene_Shop_onSellOk.call(this);
        if (this._statusWindow && SceneManager.isSupponSS()) {
            this._statusWindow.setStock(this._statusWindow.stockNumber());
            this._statusWindow.refresh();
        }
    };

    // MVJoint

    Window_Base.prototype.textPadding = function () {
        return 6;
    };

})();
