//============================================================================= // TDS Omori Item Shop // Version: 1.1 //============================================================================= // Add to Imported List var Imported = Imported || {} ; Imported.TDS_OmoriItemShop = true; // Initialize Alias Object var _TDS_ = _TDS_ || {} ; _TDS_.OmoriItemShop = _TDS_.OmoriItemShop || {}; //============================================================================= /*: * @plugindesc * Omori Item Shop * * @author TDS * */ //============================================================================= //============================================================================= // ** Game_Temp //----------------------------------------------------------------------------- // The game object class for temporary data that is not included in save data. //============================================================================= // Alias Listing //============================================================================= _TDS_.OmoriItemShop.Game_Temp_initialize = Game_Temp.prototype.initialize; //============================================================================= // * Object Initialization //============================================================================= Game_Temp.prototype.initialize = function() { // Run Original Function _TDS_.OmoriItemShop.Game_Temp_initialize.call(this); // Clear Shop Data this.clearShopData(); }; //============================================================================= // * Clear Shop Data //============================================================================= Game_Temp.prototype.clearShopData = function() { // Clear Shop Data this._shopData = {name: "", shopType: 0, goods: []}; }; //============================================================================= // ** Game_Interpreter //----------------------------------------------------------------------------- // The interpreter for running event commands. //============================================================================= // * Setup Shop //============================================================================= Game_Interpreter.prototype.setupShop = function(name, type = 0) { // Clear Shop Data $gameTemp.clearShopData(); // Get Data var data = $gameTemp._shopData; // Get Default Text var text = LanguageManager.getPluginText('itemShopMenu', 'defaultText'); // Get Shop keeper var shopKeeper = LanguageManager.getPluginText('itemShopMenu', 'shopKeepers')[name.toLowerCase()] // Get World Index var worldIndex = SceneManager.currentWorldIndex(); // Shop Type (0: Buy, 1: Sell) data.shopType = type; // Set Shop Name data.name = shopKeeper.shopName ? shopKeeper.shopName : text.shopName; // Show Mailbox Shop Keeper Flag data.showMailboxShopkeeper = shopKeeper.showMailboxShopkeeper !== undefined ? shopKeeper.showMailboxShopkeeper : false; // Set Transaction Header data.transactionHeader = data.shopType === 0 ? shopKeeper.buyHeader ? shopKeeper.buyHeader : text.buyHeader : shopKeeper.sellHeader ? shopKeeper.sellHeader : text.sellHeader; data.texts = {}; // // If World Index is 1 (Dream World) // if (worldIndex === 1) { // Set Texts data.texts.maxItemMessage = 'Prologue_WHITESPACE.message_3'; data.texts.notEnoughMoneyMessage = 'Prologue_WHITESPACE.message_3'; data.texts.onItemListBuyOkMessage = 'Prologue_WHITESPACE.message_3'; data.texts.onItemListSellOkMessage = 'Prologue_WHITESPACE.message_3'; data.texts.itemBuyingPromptMessage = 'Prologue_WHITESPACE.message_3' data.texts.itemSellingPromptMessage = 'Prologue_WHITESPACE.message_3' data.texts.itemBuyingConfirmationMessage = 'Prologue_WHITESPACE.message_3' data.texts.itemSellingConfirmationMessage = 'Prologue_WHITESPACE.message_3' data.texts.itemBuyingCancelMessage = 'Prologue_WHITESPACE.message_3' data.texts.itemSellingCancelMessage = 'Prologue_WHITESPACE.message_3' // } else { // }; // Go Through List of Entries and replace messages for (let [key, value] of Object.entries(shopKeeper.texts)) { data.texts[key] = value}; }; //============================================================================= // * Shop Processing //============================================================================= Game_Interpreter.prototype.command302 = function() { if (!$gameParty.inBattle()) { var goods = [this._params]; while (this.nextEventCode() === 605) { this._index++; goods.push(this.currentCommand().parameters); } // Set Shop Data Goods $gameTemp._shopData.goods = goods; // Snap Scene into bitmap /*let waitingInterval = setInterval(() => { if(SceneManager._scene._messageWindow._openness > 0) {return;} clearInterval(waitingInterval); }, 1)*/ while(!!SceneManager._scene._messageWindow && SceneManager._scene._messageWindow._openness > 0) { SceneManager._scene._messageWindow._openness -= 16; } $gameTemp._sceneSnapBitmap = SceneManager.snap(); SceneManager.push(Scene_OmoriItemShop); SceneManager.prepareNextScene(goods, this._params[4]); } return true; }; //============================================================================= // ** Scene_OmoriItemShop //----------------------------------------------------------------------------- // This scene shows the album //============================================================================= function Scene_OmoriItemShop() { this.initialize.apply(this, arguments);} Scene_OmoriItemShop.prototype = Object.create(Scene_BaseEX.prototype); Scene_OmoriItemShop.prototype.constructor = Scene_OmoriItemShop; //============================================================================= // * Object Initialization //============================================================================= Scene_OmoriItemShop.prototype.initialize = function() { // Set Image reservation Id this._imageReservationId = 'itemshop'; // Super Call Scene_BaseEX.prototype.initialize.call(this); }; //============================================================================= // * Initialize Atlas Lists //============================================================================= Scene_OmoriItemShop.prototype.initAtlastLists = function() { // Run Original Function Scene_BaseEX.prototype.initAtlastLists.call(this); // Load System Images ImageManager.reserveSystem('itemConsumables', 0, this._imageReservationId) ImageManager.reserveSystem('itemCharms', 0, this._imageReservationId) ImageManager.reserveSystem('itemWeapons', 0, this._imageReservationId) ImageManager.reserveSystem('ItemIcons1', 0, this._imageReservationId) ImageManager.reserveSystem('itemImportant', 0, this._imageReservationId) ImageManager.reserveSystem('mailbox', 0, this._imageReservationId) ImageManager.reserveSystem('mailboxLegend', 0, this._imageReservationId) }; //============================================================================= // * Prepare //============================================================================= Scene_OmoriItemShop.prototype.prepare = function(goods, purchaseOnly) { this._goods = goods; this._purchaseOnly = purchaseOnly; this._item = null; }; //============================================================================= // * Determine if Busy //============================================================================= Scene_OmoriItemShop.prototype.isBusy = function() { // Return true if window is open if (this._messageWindow.isClosing()) { return true; }; // Return original Function return Scene_Base.prototype.isBusy.call(this); }; //============================================================================= // * Start //============================================================================= Scene_OmoriItemShop.prototype.start = function() { // Run Original Function Scene_BaseEX.prototype.start.call(this); // Select first item this._itemListWindow.select(0); // Open Windows this._messageWindow.open(); this._goldWindow.open(); this._itemListWindow.open(); this._shopHeaderWindow.open(); // Set Duration var duration = 10; var obj = this._shopKeeperSprite; var data = { obj: obj, properties: ['opacity'], from: {opacity: obj.opacity}, to: {opacity: 255}, durations: {opacity: duration}} data.easing = Object_Movement.linearTween; this.move.startMove(data); }; //============================================================================= // * Terminate Scene //============================================================================= Scene_OmoriItemShop.prototype.terminate = function() { // Run Original Function Scene_BaseEX.prototype.terminate.call(this); // Clear Shop Data $gameTemp.clearShopData(); }; //============================================================================= // * Create //============================================================================= Scene_OmoriItemShop.prototype.create = function() { // Super Call Scene_BaseEX.prototype.create.call(this); // Create Background this.createBackground(); // Create Shop Keeper Sprite this.createShopKeeperSprite(); // Create Windows this.createGoldWindow(); this.createShopHeaderWindow() this.createItemListWindow() this.createTotalWindow(); this.createMessageWindow(); // this._goldWindow.y += 355 + 50; // this._goldWindow.x -= 120; // this._goldWindow.x += 145 // this._goldWindow.opacity = 0; this._shopKeeperSprite.x = (this._messageWindow.x + this._messageWindow.width) - this._shopKeeperSprite.width - 50 this._shopKeeperSprite.y = this._messageWindow.y - this._shopKeeperSprite.height + 30; }; //============================================================================= // * Create Background //============================================================================= Scene_OmoriItemShop.prototype.createBackground = function() { this._backgroundSprite = new Sprite(); this._backgroundSprite.bitmap = $gameTemp._sceneSnapBitmap; this.addChild(this._backgroundSprite); // Clear Scene Snap Bitmap $gameTemp._sceneSnapBitmap = null; }; //============================================================================= // * Create Shop Keeper Sprite //============================================================================= Scene_OmoriItemShop.prototype.createShopKeeperSprite = function() { this._shopKeeperSprite = new Sprite(ImageManager.loadSystem('mailbox')); this._shopKeeperSprite.setFrame(0, 0, 251, 344); this._shopKeeperSprite.visible = $gameTemp._shopData.showMailboxShopkeeper; this._shopKeeperSprite.opacity = 0; this.addChild(this._shopKeeperSprite); // Create shop Keepers Face Sprite this._shopKeepersFaceSprite = new Sprite(ImageManager.loadSystem('mailbox')) this._shopKeepersFaceSprite.x = 50; this._shopKeepersFaceSprite.y = 65; this._shopKeeperSprite.addChild(this._shopKeepersFaceSprite); // Set Default shop keeper face this.setShopKeeperFace(0) }; //============================================================================= // * Create Gold Window //============================================================================= Scene_OmoriItemShop.prototype.createGoldWindow = function() { this._goldWindow = new Window_Gold(0, 0); this._goldWindow.x = (Graphics.boxWidth - this._goldWindow.width) - 16; this._goldWindow.y = 10; this._goldWindow.openness = 0; this.addChild(this._goldWindow); }; //============================================================================= // * Create Shop Header Window //============================================================================= Scene_OmoriItemShop.prototype.createShopHeaderWindow = function() { this._shopHeaderWindow = new Window_OmoriShopHeader(); this._shopHeaderWindow.x = 16; this._shopHeaderWindow.y = 10; this.addChild(this._shopHeaderWindow); }; //============================================================================= // * Create Item List Window //============================================================================= Scene_OmoriItemShop.prototype.createItemListWindow = function() { this._itemListWindow = new Window_OmoriShopItemList(); this._itemListWindow.x = 16 this._itemListWindow.y = this._shopHeaderWindow.y + this._shopHeaderWindow.height; this._itemListWindow.setHandler('ok', this.onItemListOk.bind(this)); this._itemListWindow.setHandler('cancel', this.popScene.bind(this)); this._itemListWindow.callUpdateHelp(); this.addChild(this._itemListWindow); }; //============================================================================= // * Create Total Window //============================================================================= Scene_OmoriItemShop.prototype.createTotalWindow = function() { this._totalWindow = new Window_OmoriShopTotal(); this._totalWindow.x = (Graphics.width - this._totalWindow.width) - 16 this._totalWindow.y = (Graphics.height - this._totalWindow.height) - 124; this._totalWindow.setHandlers(this.onTotalWindowOk.bind(this), this.onTotalWindowCancel.bind(this)); this.addChild(this._totalWindow); }; //============================================================================= // * Create Message Window //============================================================================= Scene_OmoriItemShop.prototype.createMessageWindow = function() { // Create Message Window this._messageWindow = new WindowItemShopMessage(); this.addChild(this._messageWindow); this._messageWindow.subWindows().forEach(function(window) { this.addChild(window); }, this); // Set Message Window Extra Windows this._messageWindow._itemListWindow = this._itemListWindow; this._messageWindow._totalWindow = this._totalWindow; // Set Item List Window Message Window this._itemListWindow._messageWindow = this._messageWindow; }; //============================================================================= // * Frame Update //============================================================================= Scene_OmoriItemShop.prototype.update = function() { // Super Call Scene_BaseEX.prototype.update.call(this); }; //============================================================================= // * Set Shop Keepers Face //============================================================================= Scene_OmoriItemShop.prototype.setShopKeeperFace = function(index = 0) { // Set Shop Keepers Face Sprite this._shopKeepersFaceSprite.setFrame(251, index * 28, 79, 28); }; //============================================================================= // * Wait for Message //============================================================================= Scene_OmoriItemShop.prototype.waitForMessage = function() { return $gameMessage.isBusy(); }; //============================================================================= // * Pop Scene //============================================================================= Scene_OmoriItemShop.prototype.popScene = function() { this.queue(function() { // Close Windows this._goldWindow.close(); this._itemListWindow.close(); this._shopHeaderWindow.close(); this._messageWindow.close(); // Set Duration var duration = 10; var obj = this._shopKeeperSprite; var data = { obj: obj, properties: ['opacity'], from: {opacity: obj.opacity}, to: {opacity: 0}, durations: {opacity: duration}} data.easing = Object_Movement.linearTween; this.move.startMove(data); }.bind(this)) this.queue('wait', 10); this.queue(function() { // Run Original Function Scene_Base.prototype.popScene.call(this); }.bind(this)); }; //============================================================================= // * [OK] Item List //============================================================================= Scene_OmoriItemShop.prototype.onItemListOk = function() { // Get Item var item = this._itemListWindow.item(); var price = this._itemListWindow.price(); // Get Buying/Selling State var buying = $gameTemp._shopData.shopType === 0; var maxItems = buying ? 99 - $gameParty.numItems(item) : $gameParty.numItems(item); var canBuy = maxItems > 0 var hasGold = price <= $gameParty.gold(); // If can't buy or don't have gold if (buying && (!canBuy || !hasGold)) { // Show Max Item Message this.queue(function() { var message = ''; // Add Messages if (!canBuy) { message = $gameTemp._shopData.texts.maxItemMessage} if (!hasGold) { message = $gameTemp._shopData.texts.notEnoughMoneyMessage}; // Add Text $gameMessage.showLanguageMessage(message); }.bind(this)) // Wait for Message this.queue('startFunctionWait', this.waitForMessage.bind(this)) // Reactivate Item List Window this.queue(function() { this._itemListWindow.activate(); }.bind(this)) return; }; // Activate Total Window this._totalWindow.open(); this._totalWindow.setPrice(price, maxItems); this._totalWindow.activate(); // If Buying if (buying) { // Add Text $gameMessage.showLanguageMessage($gameTemp._shopData.texts.onItemListBuyOkMessage); } else { // Add Text $gameMessage.showLanguageMessage($gameTemp._shopData.texts.onItemListSellOkMessage); }; }; //============================================================================= // * [OK] Total Window //============================================================================= Scene_OmoriItemShop.prototype.onTotalWindowOk = function() { // Set Choice Callback Function $gameMessage.setChoiceCallback(this.onPurchaseChoice.bind(this)); // If Buying if ($gameTemp._shopData.shopType === 0) { // Add Text $gameMessage.showLanguageMessage($gameTemp._shopData.texts.itemBuyingPromptMessage); } else { // Add Text $gameMessage.showLanguageMessage($gameTemp._shopData.texts.itemSellingPromptMessage); }; // Get Buy Options Text var text = LanguageManager.getPluginText('itemShopMenu', 'buyOptions') // Set Choice Text $gameMessage.setChoices([text[0], text[1]], 0, 1) }; //============================================================================= // * [Cancel] Total Window //============================================================================= Scene_OmoriItemShop.prototype.onTotalWindowCancel = function() { // Terminate Message this._messageWindow.terminateMessage(); this._itemListWindow.activate(); }; //============================================================================= // * On Purchase Choice //============================================================================= Scene_OmoriItemShop.prototype.onPurchaseChoice = function(n) { // Clear Input Input.clear() // Initialize Message var message; // If Yes if (n === 0) { var item = this._itemListWindow.item(); var total = this._totalWindow.totalPrice(); // If Buying if ($gameTemp._shopData.shopType === 0) { // Lose Gold AudioManager.playSe({name: "SYS_cha_ching", pan: 0, pitch: 100, volume: 90}); $gameParty.loseGold(total); // Gain Items $gameParty.gainItem(item, this._totalWindow._amount); // Set Confirm Message message = $gameTemp._shopData.texts.itemBuyingConfirmationMessage; } else { // Gain Gold $gameParty.gainGold(total); // Gain Items AudioManager.playSe({name: "SYS_cha_ching", pan: 0, pitch: 100, volume: 90}); $gameParty.loseItem(item, this._totalWindow._amount); // Set Confirm Message message = $gameTemp._shopData.texts.itemSellingConfirmationMessage; // Refresh Item List Window this._itemListWindow.refresh(); }; // Refresh Gold Window this._goldWindow.refresh(); } else { // If Buying if ($gameTemp._shopData.shopType === 0) { // Set Cancel Message message = $gameTemp._shopData.texts.itemBuyingCancelMessage; } else { // Set Cancel Message message = $gameTemp._shopData.texts.itemSellingCancelMessage; }; }; // If Message Exists if (message) { // Show Max Item Message this.queue(function() { // Clear Game Message $gameMessage.clear(); // Add Text $gameMessage.showLanguageMessage(message); }.bind(this)) }; // Wait for Message this.queue('startFunctionWait', this.waitForMessage.bind(this)) this.queue(function() { // Clear Game Message $gameMessage.clear(); // Activate List Window this._itemListWindow.activate(); }.bind(this)) }; //============================================================================= // ** Window_OmoriShopHeader //----------------------------------------------------------------------------- // This window displays the shop's header. //============================================================================= function Window_OmoriShopHeader() { this.initialize.apply(this, arguments); } Window_OmoriShopHeader.prototype = Object.create(Window_Base.prototype); Window_OmoriShopHeader.prototype.constructor = Window_OmoriShopHeader; //============================================================================= // * Initialize Object //============================================================================= Window_OmoriShopHeader.prototype.initialize = function() { // Super Call Window_Base.prototype.initialize.call(this, 0, 0, 250, 45); // Set Openness this.openness = 0; // Refresh this.refresh(); }; //============================================================================= // * Settings //============================================================================= Window_OmoriShopHeader.prototype.standardPadding = function() { return 4 }; Window_OmoriShopHeader.prototype.standardFontSize = function() { return 24; }; //============================================================================= // * Refresh //============================================================================= Window_OmoriShopHeader.prototype.refresh = function() { // Clear Contents this.contents.clear(); // Draw Header Text ショップヘッダー位置 this.contents.drawText($gameTemp._shopData.name, 5, -2, this.contents.width - 10, this.contents.height); }; //============================================================================= // ** Window_OmoriShopTotal //----------------------------------------------------------------------------- // This window displays the shop's total amount to buy or sell. //============================================================================= function Window_OmoriShopTotal() { this.initialize.apply(this, arguments); } Window_OmoriShopTotal.prototype = Object.create(Window_Base.prototype); Window_OmoriShopTotal.prototype.constructor = Window_OmoriShopTotal; //============================================================================= // * Initialize Object //============================================================================= Window_OmoriShopTotal.prototype.initialize = function() { // Amount Count this._amount = 0; // Set Price this._price = 0; // Set Max Amount this._maxAmount = 0; // Super Call Window_Base.prototype.initialize.call(this, 0, 0, 215, 55); // Create Arrow Sprites this.createArrowSprites(); // Refresh this.refresh(); // Deactivate this.deactivate(); // Set Openness to 0 this.openness = 0; }; //============================================================================= // * Settings //============================================================================= Window_OmoriShopTotal.prototype.standardPadding = function() { return 4 }; Window_OmoriShopTotal.prototype.standardFontSize = function() { return 24; }; //============================================================================= // * Get Total Price //============================================================================= Window_OmoriShopTotal.prototype.totalPrice = function() { return this._price * this._amount; }; //============================================================================= // * Set Handlers //============================================================================= Window_OmoriShopTotal.prototype.setHandlers = function(okHandler, cancelHandler) { this._okhandler = okHandler; this._cancelHandler = cancelHandler; }; //============================================================================= // * Set Price //============================================================================= Window_OmoriShopTotal.prototype.setPrice = function(price, maxAmount = 99) { // Set Price this._price = price; // Reset Amount this._amount = 1; // Set Max Amount this._maxAmount = maxAmount; // Draw Shopping Values this.drawShoppingValues(); // Update Arrow Visibility this.updateArrowVisibility(); }; //============================================================================= // * Update Openness //============================================================================= Object.defineProperty(Window_OmoriShopTotal.prototype, 'openness', { get: function() { return this._openness; }, set: function(value) { if (this._openness !== value) { this._openness = value.clamp(0, 255); this._windowSpriteContainer.scale.y = this._openness / 255; this._windowSpriteContainer.y = this.height / 2 * (1 - this._openness / 255); if (this._leftArrowSprite) { this._leftArrowSprite.visible = this._openness === 255; }; if (this._rightArrowSprite) { this._rightArrowSprite.visible = this._openness === 255; }; } }, configurable: true }); //============================================================================= // * Create Arrow Sprites //============================================================================= Window_OmoriShopTotal.prototype.createArrowSprites = function() { // Get Initial Arrow Area var p = 24; var q = p/2; var sx = 96+p; var sy = 0+p; // Create Left Arrow Sprite this._leftArrowSprite = new Sprite(ImageManager.loadSystem('Window')) this._leftArrowSprite.x = this.width - 67 this._leftArrowSprite.y = 5;//this.height - 30 this._leftArrowSprite.setFrame(sx-q, sy+q, p, p); this.addChild(this._leftArrowSprite); // Create Right Arrow Sprite this._rightArrowSprite = new Sprite(ImageManager.loadSystem('Window')) this._rightArrowSprite.x = this.width - 35 this._rightArrowSprite.y = 5;//this.height - 30 this._rightArrowSprite.setFrame(sx+p, sy+q, p, p); this.addChild(this._rightArrowSprite); // Update Arrow Visibility this.updateArrowVisibility(); }; //============================================================================= // * Refresh //============================================================================= Window_OmoriShopTotal.prototype.refresh = function() { // Clear Contents this.contents.clear(); // Draw Headers this.contents.fontSize = 19; //合計金額:と購入数:のサイズ this.contents.drawText(LanguageManager.getMessageData("XX_BLUE.Omori_Item_Shop").total_price, 5, 20, this.contents.width - 10, 20); this.contents.drawText(LanguageManager.getMessageData("XX_BLUE.Omori_Item_Shop").amount, 5, 0, this.contents.width - 10, 20); // Draw Shopping Values this.drawShoppingValues(); }; //============================================================================= // * Refresh //============================================================================= Window_OmoriShopTotal.prototype.drawShoppingValues = function() { // Clear Rect this.contents.clearRect(this.contents.width - 90, 0, 90, this.contents.height); this.contents.fontSize = 19 // this.standardFontSize(); // this.contents.fillRect(this.contents.width - 90, 0, 90, this.contents.height, 'rgba(255, 0, 0, 0.5)'); // Draw Total Price // this.drawCurrencyValue(this.totalPrice(), 'C', 0, 12, this.contents.width - 10) this.contents.drawText('%1 %2'.format(Yanfly.Util.toGroup(this.totalPrice()), this.worldCurrencyUnit()), 0, 20, this.contents.width - 5, 20, 'right'); // Draw Amount this.contents.drawText(this._amount, this.contents.width - 55, 0, 50, 20, 'center'); }; //============================================================================= // * Frame Update //============================================================================= Window_OmoriShopTotal.prototype.update = function() { // Super Call Window_Base.prototype.update.call(this); // Update Amount Input this.updateAmountInput(); }; //============================================================================= // * Update Amount Input //============================================================================= Window_OmoriShopTotal.prototype.updateAmountInput = function() { // If Active if (this.active && !$gameMessage.hasText()) { if (Input.isTriggered('ok')) { this.deactivate(); this.close() // Call OK Handler this._okhandler(); return; } if (Input.isTriggered('cancel')) { this.deactivate(); this.close() // Call Cancel Hanlder this._cancelHandler(); return } if (Input.isRepeated('right')) { var gold = $gameParty.gold(); var nextPrice = $gameTemp._shopData.shopType === 0 ? (this._amount + 1) * this._price : 0; if (this._amount < this._maxAmount && gold >= nextPrice) { AudioManager.playSe({name: "sys_cursor1", pan: 0, pitch: 100, volume: 90}); this._amount++; this.drawShoppingValues(); this.updateArrowVisibility(); }; return; }; if (Input.isRepeated('up')) { var gold = $gameParty.gold(); var maxPrice = $gameTemp._shopData.shopType === 0 ? Math.min(Math.floor(gold / this._price), this._maxAmount) : this._maxAmount; if (this._amount < this._maxAmount) { AudioManager.playSe({name: "sys_cursor1", pan: 0, pitch: 100, volume: 90}); this._amount = Math.min(this._amount + 10, maxPrice); this.drawShoppingValues(); this.updateArrowVisibility(); }; return; }; if (Input.isRepeated('left')) { // If Amount is more than 0 if (this._amount > 1) { // Decrease Amount AudioManager.playSe({name: "sys_cursor1", pan: 0, pitch: 100, volume: 90}); this._amount--; this.drawShoppingValues(); this.updateArrowVisibility(); }; return } if (Input.isRepeated('down')) { // If Amount is more than 0 if (this._amount > 0) { AudioManager.playSe({name: "sys_cursor1", pan: 0, pitch: 100, volume: 90}); this._amount = Math.max(this._amount - 10, 1); this.drawShoppingValues(); this.updateArrowVisibility(); }; return }; }; }; //============================================================================= // * Update Arrow Visibility //============================================================================= Window_OmoriShopTotal.prototype.updateArrowVisibility = function() { // Get Total Price var buying = $gameTemp._shopData.shopType === 0; var totalPrice = buying ? this.totalPrice() : 0; var nextPrice = buying ? (this._amount + 1) * this._price : -1; var gold = $gameParty.gold(); if (totalPrice >= gold || gold < nextPrice || this._amount >= this._maxAmount ) { this._rightArrowSprite.opacity = 160; } else { this._rightArrowSprite.opacity = 255; }; if (this._amount <= 1) { this._leftArrowSprite.opacity = 160; } else { this._leftArrowSprite.opacity = 255; }; }; //============================================================================= // ** Window_OmoriShopItemList //----------------------------------------------------------------------------- // The window for selecting items in the shopping screen //============================================================================= function Window_OmoriShopItemList() { this.initialize.apply(this, arguments); }; Window_OmoriShopItemList.prototype = Object.create(Window_ItemList.prototype); Window_OmoriShopItemList.prototype.constructor = Window_OmoriShopItemList; //============================================================================= // * Object Initialization //============================================================================= Window_OmoriShopItemList.prototype.initialize = function(x, y, width, height) { // Super Call Window_ItemList.prototype.initialize.call(this, 0, 0, 250, 290 - 37); this.refresh() this.openness = 0; this.select(0); this.activate(); }; //============================================================================= // * Settings //============================================================================= Window_OmoriShopItemList.prototype.isUsingCustomCursorRectSprite = function() { return true; }; Window_OmoriShopItemList.prototype.includes = function(item) { return $gameParty.canUse(item); }; Window_OmoriShopItemList.prototype.maxCols = function() { return 1; }; Window_OmoriShopItemList.prototype.lineHeight = function() { return 27; }; Window_OmoriShopItemList.prototype.spacing = function() { return 0; }; Window_OmoriShopItemList.prototype.standardPadding = function() { return 10; }; Window_OmoriShopItemList.prototype.customCursorRectXOffset = function() { return 8; } //============================================================================= // * Determine if Item should be included //============================================================================= Window_OmoriShopItemList.prototype.includes = function(item) { return true; }; //============================================================================= // * Make Item List //============================================================================= Window_OmoriShopItemList.prototype.makeItemList = function() { // Clear Data this._data = []; // If Buying if ($gameTemp._shopData.shopType === 0) { // Get shop Goods var shopGoods = $gameTemp._shopData.goods; // Go through Shop Goods for (var i = 0; i < shopGoods.length; i++) { // Get Goods var goods = shopGoods[i]; // Set Item var item = null; // Goods Type case switch (goods[0]) { case 0: item = $dataItems[goods[1]] ;break; case 1: item = $dataWeapons[goods[1]] ;break; case 2: item = $dataArmors[goods[1]] ;break; }; // If Item exists if (item) { // Add Object to Data this._data.push({item: item, price: goods[2] === 0 ? item.price : goods[3] }); }; }; } else { // Get shop Goods var shopGoods = $gameParty.allItems(); // Go through Shop Goods for (var i = 0; i < shopGoods.length; i++) { // Set Item var item = shopGoods[i]; // If Item exists if (item && item.price > 0) { // Add Object to Data this._data.push({item: item, price: item.price}); }; }; }; }; //============================================================================= // * Get Item //============================================================================= Window_OmoriShopItemList.prototype.item = function() { if (this._data.length <= 0) { return null; } let index = this.index(); if (index >= this._data.length) { return null; } return this._data && index >= 0 ? this._data[index].item : null; }; //============================================================================= // * Get Item Price //============================================================================= Window_OmoriShopItemList.prototype.price = function(index = this.index()) { // Get Price let price = this._data && index >= 0 ? this._data[index].price : null; // If Selling cut price in half if ($gameTemp._shopData.shopType === 1) { price /= 2; }; // Return price return Math.round(price); }; //============================================================================= // * Determine if item is enabled //============================================================================= Window_OmoriShopItemList.prototype.isEnabled = function(item) { return item; return true }; //============================================================================= // * Item Rect //============================================================================= Window_OmoriShopItemList.prototype.itemRect = function(index) { // Get Rect var rect = Window_SkillList.prototype.itemRect.call(this, index); rect.y += 15 // rect.x += 36; return rect; }; //============================================================================= // * Draw Item //============================================================================= Window_OmoriShopItemList.prototype.drawItem = function(index) { // Get Data var data = this._data[index]; // Get Item var item = data.item; this.contents.fontSize = LanguageManager.getMessageData("XX_BLUE.Window_OmoriShopItemList").itemFontSize; if (item) { var rect = this.itemRect(index); rect.x += 32 rect.width -= 40; this.changePaintOpacity(this.isEnabled(item)); // this.contents.fillRect(rect.x, rect.y, rect.width - 50, rect.height, 'rgba(255, 0, 0, 0.5)') this.contents.drawText(item.name, rect.x, rect.y + 2, rect.width - 50, rect.height); this.contents.drawText('%1 %2'.format(this.price(index), this.worldCurrencyUnit()), rect.x, rect.y + 2, rect.width, rect.height, 'right'); this.changePaintOpacity(1); }; }; //============================================================================= // * Refresh //============================================================================= Window_OmoriShopItemList.prototype.refresh = function() { // Super Call Window_ItemList.prototype.refresh.call(this); this.contents.fontSize = LanguageManager.getMessageData("XX_BLUE.Window_OmoriShopItemList").transactionHeaderFontSize; this.contents.drawText($gameTemp._shopData.transactionHeader, 0, -3, this.contents.width - 10, 20) // Get Index let index = this.index(); let maxItems = this.maxItems(); // If Index exceeds or matches max items if (index >= maxItems) { // Set Index to last this._index = Math.max(0, maxItems-1); } }; //============================================================================= // * Refresh Arrows //============================================================================= Window_OmoriShopItemList.prototype._refreshArrows = function() { // Super Call Window_ItemList.prototype._refreshArrows.call(this); var w = this._width; var h = this._height; var p = 24; var q = p/2; this._downArrowSprite.move(w - q, (h - q) ); this._upArrowSprite.move(w - q, q + 1); }; //============================================================================= // * Call Update Help //============================================================================= Window_OmoriShopItemList.prototype.callUpdateHelp = function() { // Super Call Window_ItemList.prototype.callUpdateHelp.call(this); if (this._messageWindow) { this._messageWindow.drawItem(this.item()) }; }; //============================================================================= // ** WindowItemShopMessage //----------------------------------------------------------------------------- // This window displays shop text //============================================================================= function WindowItemShopMessage() { this.initialize.apply(this, arguments); } WindowItemShopMessage.prototype = Object.create(Window_Message.prototype); WindowItemShopMessage.prototype.constructor = WindowItemShopMessage; //============================================================================= // * Initialize Object //============================================================================= WindowItemShopMessage.prototype.initialize = function() { // Super Call Window_Message.prototype.initialize.call(this); // Fixes Name box window awkwardness // this.openness = 255; // this._nameWindow.x = 16; // this._nameWindow.open() // this.open() }; //============================================================================= // * Settings //============================================================================= // WindowItemShopMessage.prototype.standardPadding = function() { return 4; }; //============================================================================= // * Draw Item //============================================================================= WindowItemShopMessage.prototype.drawItem = function(item) { // If Item exists if (item) { // Get Item Text var itemText = item.description.replace(/<(?:BR|line break)>/gi, '\n').replace(/\[(?:BR|line break)\]/gi, '\n'); // Set Item Draw Flag to true this._drawingItemText = true; // Initialize Text State this._textState = {}; this._textState.index = 0; this._textState.text = this.convertEscapeCharacters(itemText); this.newPage(this._textState); this._textState.x = 110; this._textState.y = 24; // Set Flags this._showFast = true; this._pauseSkip = true; this._wordWrap = true; // Unpause this.pause = false; // Set Sound count to max (Prevents sound from playing) this._soundCount = 99; // Update Message this.updateMessage(); // Draw Item Icon this.drawItemIcon(item, 0, -5, 1) // Draw Item Name this.contents.drawText(item.name, 110, 0, this.contents.width - 110, 24) // Draw Owned amount this.contents.drawText('(%1: %2)'.format(LanguageManager.getPluginText('itemShopMenu', 'ownedText'),$gameParty.numItems(item)), 0, 0, this.contents.width-10, 24, 'right') // Set Item Draw Flag to false this._drawingItemText = false; }; }; //============================================================================= // * New Line X //============================================================================= WindowItemShopMessage.prototype.newLineX = function() { if (this._drawingItemText) { return 110; }; return Window_Message.prototype.newLineX.call(this); }; //============================================================================= // * Terminate Message //============================================================================= WindowItemShopMessage.prototype.terminateMessage = function() { // Run Original Function Window_Message.prototype.terminateMessage.call(this); this.open(); if (this._nameWindow.openness > 0) { this._nameWindow.open(); } }; //============================================================================= // * Convert Escape Characters //============================================================================= WindowItemShopMessage.prototype.convertEscapeCharacters = function(text) { // Get Item var item = this._itemListWindow.item(); // Convert Tags into Text text = text.replace(//gi, item ? item.name : ""); text = text.replace(//gi, this._totalWindow._amount); text = text.replace(//gi, this._totalWindow.totalPrice()); // Return Original Function return Window_Message.prototype.convertEscapeCharacters.call(this, text) }; //============================================================================= // * Draw Item //============================================================================= WindowItemShopMessage.prototype.processEscapeCharacter = function(code, textState) { // Code switch case switch (code) { case 'SHOPFACE': // Set Shop Keeper's face this.parent.setShopKeeperFace(this.obtainEscapeParam(textState)) break; } // Run Original Function Window_Message.prototype.processEscapeCharacter.call(this, code, textState); };