You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ycrpg/js/plugins/YEP_ShopMenuCore.js

1373 lines
46 KiB
JavaScript

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

//=============================================================================
// Yanfly Engine Plugins - Shop Menu Core
// YEP_ShopMenuCore.js
//=============================================================================
var Imported = Imported || {};
Imported.YEP_ShopMenuCore = true;
var Yanfly = Yanfly || {};
Yanfly.Shop = Yanfly.Shop || {};
Yanfly.Shop.version = 1.05;
//=============================================================================
/*:
* @plugindesc v1.05 商店菜单核心☁️
* @author Yanfly Engine Plugins
*
* @param ---General---
* @text ---全局---
* @default
*
* @param Command Order
* @text 命令菜单顺序
* @parent ---General---
* @desc This is the order in which the command menu will appear. Use
* a space to separate the individual commands.
* @default Buy Sell Equip Custom Cancel
*
* @param Shop List Width
* @text 商店列表宽度
* @parent ---General---
* @desc This allows you to adjust the formula to determine the window width
* for the main shop list windows.
* @default Graphics.boxWidth / 2 + Graphics.boxWidth / 10
*
* @param Command Alignment
* @text 命令对齐
* @parent ---General---
* @type combo
* @option left
* @option center
* @option right
* @desc Text alignment used for the command windows.
* left center right
* @default center
*
* @param Status Window
* @text ---状态窗口---
* @default
*
* @param Default Mode
* @text 默认模式
* @parent ---Status Window---
* @type combo
* @option default
* @option actor
* @desc Display a comparison for all actors per stat or per actor?
* default - All Actors actor - Individual Actors
* @default actor
*
* @param Stat Switching
* @text 统计开关
* @parent ---Status Window---
* @type boolean
* @on Enable
* @off Disable
* @desc Enable stat comparison switching by pressing left/right?
* NO - false YES - true
* @default true
*
* @param Cannot Equip
* @text 无法装备
* @parent ---Status Window---
* @desc If an actor cannot equip an item, this text is shown.
* @default Can't Equip
*
* @param Stat Font Size
* @text 统计字号
* @parent ---Status Window---
* @desc The font size used for stat comparisons.
* Default: 28
* @default 20
*
* @param Cannot Equip Font Size
* @text 无法设置字体大小
* @parent ---Status Window---
* @type number
* @min 1
* @desc The font size used for cannot equip text.
* Default: 28
* @default 20
*
* @param ---Info Window---
* @text ---信息窗口---
* @default
*
* @param Show Icon
* @text 显示图标
* @parent ---Info Window---
* @type boolean
* @on Show
* @off Hide
* @desc Show the icon in the info window?
* NO - false YES - true
* @default true
*
* @param Icon Size
* @text 图标大小
* @parent ---Info Window---
* @type number
* @min 0
* @desc This will be the width and height of the icon to be drawn.
* This is normally 4x the default Icon Width and Icon Height.
* @default 128
*
* @param Font Size
* @text 字体大小
* @parent ---Info Window---
* @type number
* @min 1
* @desc This changes the font size for description items.
* Default: 28
* @default 20
*
* @param Recovery Format
* @text 恢复格式
* @parent ---Info Window---
* @desc This is the text format for HP/MP Recovery.
* @default %1 Heal
*
* @param Add State
* @text 添加状态
* @parent ---Info Window---
* @desc This is the text for adding states.
* @default +State
*
* @param Add Buff
* @text 添加Buff
* @parent ---Info Window---
* @desc This is the text for adding buffs.
* @default +Buff
*
* @param Remove State
* @text 移除状态
* @parent ---Info Window---
* @desc This is the text for remove states.
* @default -State
*
* @param Remove Buff
* @text 移除Buff
* @parent ---Info Window---
* @desc This is the text for remove buffs.
* @default -Buff
*
* @param Maximum Icons
* @text 最大图标数
* @parent ---Info Window---
* @type number
* @min 0
* @desc Maximum number of icons drawn for states and buffs.
* @default 4
*
* @help
* ============================================================================
* 导言
* ============================================================================
*
* RPG Maker MV中的商店菜单与RPG Maker VX和RPG中的相同
* 制造者VX Ace。它是相对基本的提供了足够的信息但是
* 不足以让玩家知道他们到底在买什么或买什么
* 甚至卖。这个插件使商店能够显示不仅仅是基本的
* RPG Maker MV中显示的信息甚至允许自定义命令
* 插入到命令窗口中。
*
* 这个插件还为玩家提供了在一个参数之间制表符的选项
* 比较模式,全队一次显示个人数据
* 或者单个演员一次显示所有数据。玩家可以切换
* 按键盘上的“tab”按钮或
* 触摸输入参与者或参数的名称。
*
* ============================================================================
* 说明
* ============================================================================
*
* 通过更改
* “命令顺序”参数。以下是您可以使用的命令列表:
*
* Buy
* - 这是“购买项目”命令。
*
* Sell
* - 这是销售物品命令。
*
* Equip
* - 这是直接访问演员装备的装备命令。
*
* Custom
* - 如果您有任何自定义商店菜单项,它们将显示在这里。
*
* Cancel
* - 这是商店的出口。
*
* ============================================================================
* 便签
* ============================================================================
*
* 您可以使用下面的notetag来更改各个商店方面
*
* 物品、武器和盔甲标签:
*
* <Price: x>
* 此notetag允许您超过商品价格999999黄金的默认编辑器限制。
*
* <Sell Price: x>
* 这将商品的售价设置为x。
*
* <Cannot Sell>
* 这使得商品无法出售。
*
* <Can Sell>
* 这使得它可以出售即使它是在0金币。
*
* ============================================================================
* Changelog
* ============================================================================
*
* Version 1.05:
* - Updated for RPG Maker MV version 1.5.0.
*
* Version 1.04:
* - Compatibility Update with YEP_X_ItemPictureImg.js
*
* Version 1.03:
* - Updated for RPG Maker MV version 1.1.0.
*
* Version 1.02:
* - Fixed a visual bug that listed actor stats in the wrong order.
*
* Version 1.01a:
* - Disabled LEFT/RIGHT movement from the status window while inputting an
* item quantity to buy.
* - Added a font reset on the number window upon refresh.
* - Fixed a visual error with MP recovery displaying a 0 instead of ---.
*
* Version 1.00:
* - Finished Plugin!
*/
//=============================================================================
//=============================================================================
// Parameter Variables
//=============================================================================
Yanfly.Parameters = PluginManager.parameters("YEP_ShopMenuCore");
Yanfly.Param = Yanfly.Param || {};
Yanfly.Param.ShopCommandOrder = String(Yanfly.Parameters["Command Order"]);
Yanfly.Param.ShopListWidth = String(Yanfly.Parameters["Shop List Width"]);
Yanfly.Param.ShopCommandAlign = String(Yanfly.Parameters["Command Alignment"]);
Yanfly.Param.ShopDefaultMode = String(Yanfly.Parameters["Default Mode"]);
Yanfly.Param.ShopDefaultMode = Yanfly.Param.ShopDefaultMode.toLowerCase();
Yanfly.Param.ShopStatSwitch = eval(String(Yanfly.Parameters["Stat Switching"]));
Yanfly.Param.ShopCantEquip = String(Yanfly.Parameters["Cannot Equip"]);
Yanfly.Param.ShopStatFontSize = Number(Yanfly.Parameters["Stat Font Size"]);
Yanfly.Param.ShopCantSize = Number(Yanfly.Parameters["Cannot Equip Font Size"]);
if (!Imported.YEP_ItemCore) {
Yanfly.Param.ItemFontSize = Number(Yanfly.Parameters["Font Size"]);
Yanfly.Param.ItemShowIcon = String(Yanfly.Parameters["Show Icon"]);
Yanfly.Param.ItemIconSize = Number(Yanfly.Parameters["Icon Size"]);
Yanfly.Param.ItemRecoverFmt = String(Yanfly.Parameters["Recovery Format"]);
Yanfly.Param.ItemAddState = String(Yanfly.Parameters["Add State"]);
Yanfly.Param.ItemAddBuff = String(Yanfly.Parameters["Add Buff"]);
Yanfly.Param.ItemRemoveState = String(Yanfly.Parameters["Remove State"]);
Yanfly.Param.ItemRemoveBuff = String(Yanfly.Parameters["Remove Buff"]);
Yanfly.Param.ItemMaxIcons = Number(Yanfly.Parameters["Maximum Icons"]);
}
//=============================================================================
// DataManager
//=============================================================================
Yanfly.Shop.DataManager_isDatabaseLoaded = DataManager.isDatabaseLoaded;
DataManager.isDatabaseLoaded = function () {
if (!Yanfly.Shop.DataManager_isDatabaseLoaded.call(this)) return false;
if (!Yanfly._loaded_YEP_ShopMenuCore) {
this.processShopNotetags($dataItems);
this.processShopNotetags($dataWeapons);
this.processShopNotetags($dataArmors);
Yanfly._loaded_YEP_ShopMenuCore = true;
}
return true;
};
DataManager.processShopNotetags = function (group) {
for (var n = 1; n < group.length; n++) {
var obj = group[n];
var notedata = obj.note.split(/[\r\n]+/);
obj.cannotSell = false;
obj.canSell = false;
obj.sellPrice = undefined;
for (var i = 0; i < notedata.length; i++) {
var line = notedata[i];
if (line.match(/<(?:PRICE):[ ](\d+)>/i)) {
obj.price = parseInt(RegExp.$1);
} else if (line.match(/<(?:SELL PRICE|SELLING PRICE):[ ](\d+)>/i)) {
obj.sellPrice = parseInt(RegExp.$1);
} else if (line.match(/<(?:CANNOT SELL)>/i)) {
obj.cannotSell = true;
} else if (line.match(/<(?:CAN SELL)>/i)) {
obj.canSell = true;
}
}
}
};
//=============================================================================
// Game_Temp
//=============================================================================
Game_Temp.prototype.registerShopGoods = function () {
var scene = SceneManager._scene;
this._shopGoods = scene._goods;
this._shopPurchaseOnly = scene._purchaseOnly;
};
Game_Temp.prototype.clearShopGoods = function () {
this._shopGoods = undefined;
this._shopPurchaseOnly = undefined;
};
//=============================================================================
// Window_ShopCommand
//=============================================================================
Window_ShopCommand.prototype.windowWidth = function () {
return 240;
};
Window_ShopCommand.prototype.maxCols = function () {
return 1;
};
Window_ShopCommand.prototype.numVisibleRows = function () {
return 4;
};
Window_ShopCommand.prototype.makeCommandList = function () {
this._commandOrder = Yanfly.Param.ShopCommandOrder.split(" ");
for (var i = 0; i < this._commandOrder.length; ++i) {
var command = this._commandOrder[i];
this.createCommand(command);
}
};
Window_ShopCommand.prototype.createCommand = function (command) {
command = command.toUpperCase();
if (command === "BUY") {
this.addCommand(TextManager.buy, "buy");
} else if (command === "SELL") {
this.addCommand(TextManager.sell, "sell", !this._purchaseOnly);
} else if (command === "CANCEL") {
this.addCommand(TextManager.cancel, "cancel");
} else if (["CUSTOM", "ORIGINAL"].contains(command)) {
this.addCustomCommands();
} else if (command === "EQUIP") {
this.addCommand(TextManager.equip, "equip");
}
};
Window_ShopCommand.prototype.addCustomCommands = function () {};
Window_ShopCommand.prototype.itemTextAlign = function () {
return Yanfly.Param.ShopCommandAlign;
};
//=============================================================================
// Window_ShopInfo
//=============================================================================
function Window_ShopInfo() {
this.initialize.apply(this, arguments);
}
Window_ShopInfo.prototype = Object.create(Window_Base.prototype);
Window_ShopInfo.prototype.constructor = Window_ShopInfo;
Window_ShopInfo.prototype.initialize = function (x, y, width, height) {
Window_Base.prototype.initialize.call(this, x, y, width, height);
this._item = null;
this.deactivate();
this.refresh();
};
Window_ShopInfo.prototype.setItem = function (item) {
if (this._item === item) return;
this._item = item;
this.refresh();
};
Window_ShopInfo.prototype.refresh = function () {
this.contents.clear();
this.drawDarkRectEntries();
if (!this._item) return;
this.contents.fontSize = Yanfly.Param.ItemFontSize;
this.drawItemEntry();
};
Window_ShopInfo.prototype.drawDarkRectEntries = function () {
var rect = new Rectangle();
if (eval(Yanfly.Param.ItemShowIcon)) {
rect.width = Window_Base._faceWidth;
rect.height = Window_Base._faceHeight;
this.drawDarkRect(rect.x, rect.y, rect.width, rect.height);
rect.width = (this.contents.width - Window_Base._faceWidth) / 2;
} else {
rect.width = this.contents.width / 2;
}
rect.height = this.lineHeight();
for (var i = 0; i < 8; ++i) {
rect = this.getRectPosition(rect, i);
this.drawDarkRect(rect.x, rect.y, rect.width, rect.height);
}
};
Window_ShopInfo.prototype.drawDarkRect = function (dx, dy, dw, dh) {
var color = this.gaugeBackColor();
this.changePaintOpacity(false);
this.contents.fillRect(dx + 1, dy + 1, dw - 2, dh - 2, color);
this.changePaintOpacity(true);
};
Window_ShopInfo.prototype.getRectPosition = function (rect, i) {
if (i % 2 === 0) {
if (eval(Yanfly.Param.ItemShowIcon)) {
rect.x = Window_Base._faceWidth;
} else {
rect.x = 0;
}
rect.y = (i / 2) * this.lineHeight();
} else {
if (eval(Yanfly.Param.ItemShowIcon)) {
rect.x = Window_Base._faceWidth + rect.width;
} else {
rect.x = rect.width;
}
}
return rect;
};
Window_ShopInfo.prototype.drawItemEntry = function () {
var item = this._item;
if (eval(Yanfly.Param.ItemShowIcon)) this.drawItemIcon(item);
if (DataManager.isItem(item)) this.drawItemInfo(item);
if (DataManager.isWeapon(item)) this.drawEquipInfo(item);
if (DataManager.isArmor(item)) this.drawEquipInfo(item);
};
Window_ShopInfo.prototype.drawItemIcon = function () {
this.drawLargeIcon();
};
if (Imported.YEP_X_ItemPictureImg) {
Yanfly.IPI.Window_ShopInfo_drawItemIcon = Window_ShopInfo.prototype.drawItemIcon;
Window_ShopInfo.prototype.drawItemIcon = function () {
if (this.itemHasPictureImage()) {
this.readyItemPictureImage(this._item);
} else {
Yanfly.IPI.Window_ShopInfo_drawItemIcon.call(this);
}
};
Window_ShopInfo.prototype.itemHasPictureImage = function () {
if (!this._item) return false;
var filename = ItemManager.getItemPictureImageFilename(this._item);
return filename !== "";
};
Window_ShopInfo.prototype.readyItemPictureImage = function (item) {
if (item !== this._item) return;
var bitmap = ItemManager.getItemPictureImage(item);
if (bitmap.width <= 0) {
return setTimeout(this.readyItemPictureImage.bind(this, item), 250);
} else {
this.drawItemPictureImage(bitmap);
}
};
Window_ShopInfo.prototype.drawItemPictureImage = function (bitmap) {
var pw = bitmap.width;
var ph = bitmap.height;
var sx = 0;
var sy = 0;
var dw = pw;
var dh = ph;
if (dw > Yanfly.Param.ItemImageMaxWidth) {
var rate = Yanfly.Param.ItemImageMaxWidth / dw;
dw = Math.floor(dw * rate);
dh = Math.floor(dh * rate);
}
if (dh > Yanfly.Param.ItemImageMaxHeight) {
var rate = Yanfly.Param.ItemImageMaxHeight / dh;
dw = Math.floor(dw * rate);
dh = Math.floor(dh * rate);
}
var dx = (Window_Base._faceWidth - dw) / 2;
var dy = (Window_Base._faceHeight - dh) / 2;
this.contents.blt(bitmap, sx, sy, pw, ph, dx, dy, dw, dh);
};
} // Imported.YEP_X_ItemPictureImg
Window_ShopInfo.prototype.drawLargeIcon = function () {
var iconIndex = this._item.iconIndex;
var bitmap = ImageManager.loadSystem("IconSet");
var pw = Window_Base._iconWidth;
var ph = Window_Base._iconHeight;
var sx = (iconIndex % 16) * pw;
var sy = Math.floor(iconIndex / 16) * ph;
var dw = Yanfly.Param.ItemIconSize;
var dh = Yanfly.Param.ItemIconSize;
var dx = (Window_Base._faceWidth - dw) / 2;
var dy = (Window_Base._faceHeight - dh) / 2;
this.contents._context.imageSmoothingEnabled = false;
this.contents.blt(bitmap, sx, sy, pw, ph, dx, dy, dw, dh);
this.contents._context.imageSmoothingEnabled = true;
};
Window_ShopInfo.prototype.drawEquipInfo = function (item) {
var rect = new Rectangle();
if (eval(Yanfly.Param.ItemShowIcon)) {
rect.width = (this.contents.width - Window_Base._faceWidth) / 2;
} else {
rect.width = this.contents.width / 2;
}
for (var i = 0; i < 8; ++i) {
rect = this.getRectPosition(rect, i);
var dx = rect.x + this.textPadding();
var dw = rect.width - this.textPadding() * 2;
this.changeTextColor(this.systemColor());
this.drawText(TextManager.param(i), dx, rect.y, dw);
this.changeTextColor(this.paramchangeTextColor(item.params[i]));
var text = Yanfly.Util.toGroup(item.params[i]);
if (item.params[i] >= 0) text = "+" + text;
if (text === "+0") this.changePaintOpacity(false);
this.drawText(text, dx, rect.y, dw, "right");
this.changePaintOpacity(true);
}
};
Window_ShopInfo.prototype.drawItemInfo = function (item) {
var rect = new Rectangle();
if (eval(Yanfly.Param.ItemShowIcon)) {
rect.width = (this.contents.width - Window_Base._faceWidth) / 2;
} else {
rect.width = this.contents.width / 2;
}
for (var i = 0; i < 8; ++i) {
rect = this.getRectPosition(rect, i);
var dx = rect.x + this.textPadding();
var dw = rect.width - this.textPadding() * 2;
this.changeTextColor(this.systemColor());
var text = this.getItemInfoCategory(i);
this.drawText(text, dx, rect.y, dw);
this.drawItemData(i, dx, rect.y, dw);
}
};
Window_ShopInfo.prototype.getItemInfoCategory = function (i) {
var fmt = Yanfly.Param.ItemRecoverFmt;
if (i === 0) return fmt.format(TextManager.param(0));
if (i === 1) return fmt.format(TextManager.hp);
if (i === 2) return fmt.format(TextManager.param(1));
if (i === 3) return fmt.format(TextManager.mp);
if (i === 4) return Yanfly.Param.ItemAddState;
if (i === 5) return Yanfly.Param.ItemRemoveState;
if (i === 6) return Yanfly.Param.ItemAddBuff;
if (i === 7) return Yanfly.Param.ItemRemoveBuff;
return "";
};
Window_ShopInfo.prototype.drawItemData = function (i, dx, dy, dw) {
if (!this._item) return;
var effect;
var value = "---";
var pre = "";
var text = "";
var icons = [];
if (i === 0) {
effect = this.getEffect(Game_Action.EFFECT_RECOVER_HP);
value = effect ? effect.value1 : "---";
if (value === 0) value = "---";
if (value !== "---" && value !== 0) value *= 100;
}
if (i === 1) {
effect = this.getEffect(Game_Action.EFFECT_RECOVER_HP);
value = effect ? effect.value2 : "---";
if (value === 0) value = "---";
}
if (i === 2) {
effect = this.getEffect(Game_Action.EFFECT_RECOVER_MP);
value = effect ? effect.value1 : "---";
if (value === 0) value = "---";
if (value !== "---" && value !== 0) value *= 100;
}
if (i === 3) {
effect = this.getEffect(Game_Action.EFFECT_RECOVER_MP);
value = effect ? effect.value2 : "---";
if (value === 0) value = "---";
}
if (i >= 4) {
icons = this.getItemIcons(i, icons);
}
this.changeTextColor(this.normalColor());
if (value === "---") {
this.changePaintOpacity(false);
} else if (i < 4) {
if (value > 0) pre = "+";
value = Yanfly.Util.toGroup(parseInt(value));
if ([0, 2].contains(i)) text = "%";
}
if (icons.length > 0) {
this.changePaintOpacity(true);
dx = dx + dw - icons.length * Window_Base._iconWidth;
dx += this.textPadding() - 2;
for (var j = 0; j < icons.length; ++j) {
var icon = icons[j];
this.drawIcon(icon, dx, dy + 2);
dx += Window_Base._iconWidth;
}
} else {
text = pre + value + text;
this.drawText(text, dx, dy, dw, "right");
this.changePaintOpacity(true);
}
};
Window_ShopInfo.prototype.getEffect = function (code) {
var targetEffect;
this._item.effects.forEach(function (effect) {
if (effect.code === code) targetEffect = effect;
}, this);
return targetEffect;
};
Window_ShopInfo.prototype.getItemIcons = function (i, array) {
this._item.effects.forEach(function (effect) {
if (i === 4 && effect.code === Game_Action.EFFECT_ADD_STATE) {
var state = $dataStates[effect.dataId];
if (state && state.iconIndex !== 0) array.push(state.iconIndex);
}
if (i === 5 && effect.code === Game_Action.EFFECT_REMOVE_STATE) {
var state = $dataStates[effect.dataId];
if (state && state.iconIndex !== 0) array.push(state.iconIndex);
}
if (i === 6 && effect.code === Game_Action.EFFECT_ADD_BUFF) {
var icon = Game_BattlerBase.ICON_BUFF_START + effect.dataId;
array.push(icon);
}
if (i === 6 && effect.code === Game_Action.EFFECT_ADD_DEBUFF) {
var icon = Game_BattlerBase.ICON_DEBUFF_START + effect.dataId;
array.push(icon);
}
if (i === 7 && effect.code === Game_Action.EFFECT_REMOVE_BUFF) {
var icon = Game_BattlerBase.ICON_BUFF_START + effect.dataId;
array.push(icon);
}
if (i === 7 && effect.code === Game_Action.EFFECT_REMOVE_DEBUFF) {
var icon = Game_BattlerBase.ICON_DEBUFF_START + effect.dataId;
array.push(icon);
}
}, this);
array = array.slice(0, Yanfly.Param.ItemMaxIcons);
return array;
};
//=============================================================================
// Window_ShopNumber
//=============================================================================
Window_ShopNumber.prototype.windowWidth = function () {
return Math.ceil(eval(Yanfly.Param.ShopListWidth));
};
Window_ShopNumber.prototype.refresh = function () {
this.contents.clear();
this._index = 0;
this.resetFontSettings();
this.drawItemName(this._item, 0, this.lineHeight(), this.contents.width);
this.drawMultiplicationSign();
this.drawNumber();
this.drawTotalPrice();
};
Window_ShopNumber.prototype.itemY = function () {
return this.lineHeight() * 2;
};
Window_ShopNumber.prototype.drawTotalPrice = function () {
var ww = this.contents.width - this.textPadding();
var wy = this.itemY();
this.drawHorzLine(this.lineHeight() * 3);
this.drawTotalCurrency(ww, wy + this.lineHeight() * 1);
this.drawTotalCost(ww, wy + this.lineHeight() * 2);
this.drawHorzLine(wy + this.lineHeight() * 3);
this.drawTotalAfter(ww, wy + this.lineHeight() * 3);
};
Window_ShopNumber.prototype.drawTotalCurrency = function (ww, wy) {
var value = Yanfly.Util.toGroup(this.getTotalCurrency());
this.drawCurrencyValue(value, this._currencyUnit, 0, wy, ww);
};
Window_ShopNumber.prototype.getTotalCurrency = function () {
if (this._currencyUnit === TextManager.currencyUnit) {
return $gameParty.gold();
}
return 0;
};
Window_ShopNumber.prototype.drawTotalCost = function (ww, wy) {
var value = this._price * this._number;
if (!this.isSelling()) value *= -1;
value = Yanfly.Util.toGroup(value);
if (this.isSelling()) value = "+" + value;
this.drawCurrencyValue(value, this._currencyUnit, 0, wy, ww);
};
Window_ShopNumber.prototype.drawHorzLine = function (y) {
this.contents.paintOpacity = 128;
this.contents.fillRect(0, y, this.contentsWidth(), 2, this.normalColor());
this.contents.paintOpacity = 255;
};
Window_ShopNumber.prototype.drawTotalAfter = function (ww, wy) {
var value = this.getTotalCurrency();
value += this._price * this._number * (!this.isSelling() ? -1 : 1);
value = Yanfly.Util.toGroup(value);
this.drawCurrencyValue(value, this._currencyUnit, 0, wy, ww);
};
Window_ShopNumber.prototype.isSelling = function () {
var scene = SceneManager._scene;
return scene.isSelling();
};
Window_ShopNumber.prototype.cursorWidth = function () {
this.resetFontSettings();
var item = this._item;
if (this._item && this._item.proxyBuy) {
var id = this._item.proxyBuy;
if (DataManager.isItem(this._item)) item = $dataItems[id];
if (DataManager.isWeapon(this._item)) item = $dataWeapons[id];
if (DataManager.isArmor(this._item)) item = $dataArmors[id];
}
var value = $gameParty.maxItems(item);
var digitWidth = this.textWidth(Yanfly.Util.toGroup(value));
return digitWidth + this.textPadding() * 2;
};
//=============================================================================
// Window_ShowBuy
//=============================================================================
Window_ShopBuy.prototype.windowWidth = function () {
return Math.ceil(eval(Yanfly.Param.ShopListWidth));
};
Window_ShopBuy.prototype.setInfoWindow = function (infoWindow) {
this._infoWindow = infoWindow;
this.callUpdateHelp();
};
Yanfly.Shop.Window_ShopBuy_updateHelp = Window_ShopBuy.prototype.updateHelp;
Window_ShopBuy.prototype.updateHelp = function () {
Yanfly.Shop.Window_ShopBuy_updateHelp.call(this);
if (this._infoWindow) this._infoWindow.setItem(this.item());
};
//=============================================================================
// Window_ShopCategory
//=============================================================================
function Window_ShopCategory() {
this.initialize.apply(this, arguments);
}
Window_ShopCategory.prototype = Object.create(Window_ItemCategory.prototype);
Window_ShopCategory.prototype.constructor = Window_ShopCategory;
Window_ShopCategory.prototype.initialize = function () {
Window_ItemCategory.prototype.initialize.call(this);
};
Window_ShopCategory.prototype.windowWidth = function () {
return 240;
};
Window_ShopCategory.prototype.numVisibleRows = function () {
return 4;
};
Window_ShopCategory.prototype.maxCols = function () {
return 1;
};
Window_ShopCategory.prototype.itemTextAlign = function () {
return Yanfly.Param.ShopCommandAlign;
};
//=============================================================================
// Window_ShopBuy
//=============================================================================
Window_ShopBuy.prototype.drawItem = function (index) {
var item = this._data[index];
var rect = this.itemRect(index);
rect.width -= this.textPadding();
this.changePaintOpacity(this.isEnabled(item));
this.drawBuyItem(item, rect);
this.drawBuyPrice(item, rect);
this.changePaintOpacity(true);
this.resetFontSettings();
};
Window_ShopBuy.prototype.drawBuyItem = function (item, rect) {
this.drawItemName(item, rect.x, rect.y, rect.width);
};
Window_ShopBuy.prototype.drawBuyPrice = function (item, rect) {
if (Imported.YEP_CoreEngine) {
this.contents.fontSize = Yanfly.Param.GoldFontSize;
}
var itemPrice = Yanfly.Util.toGroup(this.price(item));
this.drawCurrencyValue(itemPrice, this.currencyUnit(), rect.x, rect.y, rect.width);
};
Window_ShopBuy.prototype.currencyUnit = function () {
return TextManager.currencyUnit;
};
//=============================================================================
// Window_ShopSell
//=============================================================================
Window_ShopSell.prototype.maxCols = function () {
return 1;
};
Window_ShopSell.prototype.setInfoWindow = function (infoWindow) {
this._infoWindow = infoWindow;
this.callUpdateHelp();
};
Window_ShopSell.prototype.setStatusWindow = function (statusWindow) {
this._statusWindow = statusWindow;
this.callUpdateHelp();
};
Yanfly.Shop.Window_ShopSell_updateHelp = Window_ShopSell.prototype.updateHelp;
Window_ShopSell.prototype.updateHelp = function () {
Yanfly.Shop.Window_ShopSell_updateHelp.call(this);
if (this._infoWindow) this._infoWindow.setItem(this.item());
if (this._statusWindow) this._statusWindow.setItem(this.item());
};
Yanfly.Shop.Window_ShopSell_isEnabled = Window_ShopSell.prototype.isEnabled;
Window_ShopSell.prototype.isEnabled = function (item) {
if (item) {
if ($gamePlayer.isDebugThrough()) return true;
if (item.cannotSell) return false;
if (item.canSell) return true;
}
return Yanfly.Shop.Window_ShopSell_isEnabled.call(this, item);
};
//=============================================================================
// Window_ShopStatus
//=============================================================================
Yanfly.Shop.Window_ShopStatus_initialize = Window_ShopStatus.prototype.initialize;
Window_ShopStatus.prototype.initialize = function (x, y, width, height) {
Yanfly.Shop.Window_ShopStatus_initialize.call(this, x, y, width, height);
if (Yanfly.Param.ShopStatSwitch) this._paramId = 2;
this._displayMode = Yanfly.Param.ShopDefaultMode;
this._actorIndex = 0;
this._maxActorIndex = $gameParty.members().length - 1;
this._clickZoneX = this.textWidth("<<") + this.standardPadding();
this._clickZoneY = this.standardPadding() + this.lineHeight() * 2;
};
Window_ShopStatus.prototype.displayMode = function () {
return this._displayMode;
};
Window_ShopStatus.prototype.setDisplayMode = function (mode) {
this._displayMode = mode;
};
Window_ShopStatus.prototype.isDefaultMode = function () {
return this.displayMode() === "default";
};
Window_ShopStatus.prototype.isActorMode = function () {
return this.displayMode() === "actor";
};
Window_ShopStatus.prototype.refresh = function () {
this.contents.clear();
if (!this._item) return;
this.resetTextColor();
this.resetFontSettings();
var x = this.textPadding();
this.drawPossession(x, 0);
if (!this.isEquipItem()) return;
this.resetTextColor();
this.resetFontSettings();
if (this.isDefaultMode()) this.drawDefaultData();
if (this.isActorMode()) this.drawActorData();
};
Window_ShopStatus.prototype.drawDefaultData = function () {
this.drawStatDisplayed();
this.drawEquipInfo(this.textPadding(), this.lineHeight() * 2);
};
Window_ShopStatus.prototype.drawStatDisplayed = function () {
var paramId = this.paramId();
var text = TextManager.param(paramId);
this.changeTextColor(this.normalColor());
this.drawText(text, 0, this.lineHeight(), this.contents.width, "center");
if (!Yanfly.Param.ShopStatSwitch) return;
this.changeTextColor(this.systemColor());
var text = "<<";
this.drawText(text, 0, this.lineHeight(), this.contents.width, "left");
var text = ">>";
this.drawText(text, 0, this.lineHeight(), this.contents.width, "right");
};
Window_ShopStatus.prototype.drawActorData = function () {
var actor = this.getActor();
this.drawActorDisplayed(actor);
this.drawDarkRectEntries();
this.drawActorStatInfo(actor);
};
Window_ShopStatus.prototype.getActor = function () {
return $gameParty.members()[this._actorIndex];
};
Window_ShopStatus.prototype.drawActorDisplayed = function (actor) {
var text = actor.name();
this.changeTextColor(this.normalColor());
this.drawText(text, 0, this.lineHeight(), this.contents.width, "center");
this.changeTextColor(this.systemColor());
var text = "<<";
this.drawText(text, 0, this.lineHeight(), this.contents.width, "left");
var text = ">>";
this.drawText(text, 0, this.lineHeight(), this.contents.width, "right");
};
Window_ShopStatus.prototype.drawDarkRectEntries = function () {
for (var i = 0; i < 8; ++i) {
var rect = this.getRectPosition(i);
this.drawDarkRect(rect.x, rect.y, rect.width, rect.height);
}
};
Window_ShopStatus.prototype.getRectPosition = function (index) {
var rect = new Rectangle();
rect.width = Math.floor(this.contents.width / 2);
rect.height = this.lineHeight();
rect.x = index % 2 === 0 ? 0 : rect.width;
rect.y = Math.floor(index / 2) * this.lineHeight() + this.lineHeight() * 2;
return rect;
};
Window_ShopStatus.prototype.drawDarkRect = function (dx, dy, dw, dh) {
var color = this.gaugeBackColor();
this.changePaintOpacity(false);
this.contents.fillRect(dx + 1, dy + 1, dw - 2, dh - 2, color);
this.changePaintOpacity(true);
};
Window_ShopStatus.prototype.drawActorStatInfo = function (actor) {
this.contents.fontSize = Yanfly.Param.ShopStatFontSize;
var item1 = this.currentEquippedItem(actor, this._item.etypeId);
var canEquip = actor.canEquip(this._item);
for (var i = 0; i < 8; ++i) {
this.changePaintOpacity(true);
var rect = this.getRectPosition(i);
rect.x += this.textPadding();
rect.width -= this.textPadding() * 2;
this.changeTextColor(this.systemColor());
var text = TextManager.param(i);
this.drawText(text, rect.x, rect.y, rect.width);
if (!canEquip) this.drawActorCantEquip(actor, rect);
if (canEquip) this.drawActorChange(actor, rect, item1, i);
}
this.changePaintOpacity(true);
};
Window_ShopStatus.prototype.drawActorCantEquip = function (actor, rect) {
this.changePaintOpacity(false);
this.resetTextColor();
this.contents.fontSize = Yanfly.Param.ShopCantSize;
var text = "-";
this.drawText(text, rect.x, rect.y, rect.width, "right");
};
Window_ShopStatus.prototype.drawActorChange = function (actor, rect, item1, i) {
var change = this._item.params[i];
change -= item1 ? item1.params[i] : 0;
this.changePaintOpacity(change !== 0);
this.changeTextColor(this.paramchangeTextColor(change));
var text = (change > 0 ? "+" : "") + Yanfly.Util.toGroup(change);
this.drawText(text, rect.x, rect.y, rect.width, "right");
};
Window_ShopStatus.prototype.drawEquipInfo = function (x, y) {
var members = this.statusMembers();
for (var i = 0; i < members.length; i++) {
var wy = y;
wy += i * this.lineHeight();
this.drawActorEquipInfo(x, wy, members[i]);
}
};
Window_ShopStatus.prototype.drawActorEquipInfo = function (x, y, actor) {
var enabled = actor.canEquip(this._item);
this.changePaintOpacity(enabled);
this.resetTextColor();
this.resetFontSettings();
this.drawText(actor.name(), x, y, this.contents.width - x);
var item1 = this.currentEquippedItem(actor, this._item.etypeId);
if (enabled) {
this.contents.fontSize = Yanfly.Param.ShopStatFontSize;
this.drawActorParamChange(x, y, actor, item1);
} else {
this.contents.fontSize = Yanfly.Param.ShopCantSize;
var ww = this.contents.width - this.textPadding();
this.drawText(Yanfly.Param.ShopCantEquip, x, y, ww, "right");
}
this.changePaintOpacity(true);
};
Window_ShopStatus.prototype.drawActorParamChange = function (x, y, actor, item1) {
var width = this.contents.width - this.textPadding() - x;
var paramId = this.paramId();
var change = this._item.params[paramId];
change -= item1 ? item1.params[paramId] : 0;
this.changeTextColor(this.paramchangeTextColor(change));
var text = (change > 0 ? "+" : "") + Yanfly.Util.toGroup(change);
this.drawText(text, x, y, width, "right");
};
Yanfly.Shop.Window_ShopStatus_update = Window_ShopStatus.prototype.update;
Window_ShopStatus.prototype.update = function () {
Yanfly.Shop.Window_ShopStatus_update.call(this);
if (this.isUpdateTrigger()) this.updateParamSwitch();
};
Window_ShopStatus.prototype.isUpdateTrigger = function () {
if (this.isDefaultMode() && Yanfly.Param.ShopStatSwitch) return true;
if (this.isActorMode()) return true;
return false;
};
Window_ShopStatus.prototype.updateParamSwitch = function () {
if (!this.isEquipItem()) return;
if (this.isTouched(-1) || this.getInput("left")) {
SoundManager.playCursor();
this.adjustLeft();
this.refresh();
} else if (this.isTouched(1) || this.getInput("right")) {
SoundManager.playCursor();
this.adjustRight();
this.refresh();
} else if (Input.isRepeated("tab") || this.isTouched(0)) {
SoundManager.playCursor();
this.adjustMode();
this.refresh();
}
};
Window_ShopStatus.prototype.getInput = function (input) {
if (SceneManager._scene._numberWindow.active) return false;
return Input.isRepeated(input);
};
Window_ShopStatus.prototype.adjustLeft = function () {
if (this.isDefaultMode()) {
this._paramId -= 1;
if (this._paramId < 0) this._paramId = 7;
} else if (this.isActorMode()) {
this._actorIndex -= 1;
if (this._actorIndex < 0) this._actorIndex = this._maxActorIndex;
}
};
Window_ShopStatus.prototype.adjustRight = function () {
if (this.isDefaultMode()) {
this._paramId += 1;
if (this._paramId > 7) this._paramId = 0;
} else if (this.isActorMode()) {
this._actorIndex += 1;
if (this._actorIndex > this._maxActorIndex) this._actorIndex = 0;
}
};
Window_ShopStatus.prototype.adjustMode = function () {
if (this.isDefaultMode()) {
this.setDisplayMode("actor");
} else if (this.isActorMode()) {
this.setDisplayMode("default");
}
};
Window_ShopStatus.prototype.isTouched = function (position) {
if (!TouchInput.isTriggered()) return false;
if (!this.isTouchedInsideFrame()) return false;
var y = this.canvasToLocalY(TouchInput.y);
if (y > this._clickZoneY) return false;
var x = this.canvasToLocalX(TouchInput.x);
if (position === -1 && x < this._clickZoneX) return true;
if (position === 1 && x > this.width - this._clickZoneX) return true;
if (position === 0) return true;
return false;
};
Yanfly.Shop.Window_ShopStatus_paramId = Window_ShopStatus.prototype.paramId;
Window_ShopStatus.prototype.paramId = function () {
if (Yanfly.Param.ShopStatSwitch) return this._paramId;
return Yanfly.Shop.Window_ShopStatus_paramId.call(this);
};
Window_ShopStatus.prototype.isPageChangeRequested = function () {
if (Input.isTriggered("shift")) return true;
return false;
};
//=============================================================================
// Scene_Shop
//=============================================================================
Scene_Shop.prototype.failSafeGoods = function () {
if (this._goods === undefined) {
var goods = $gameTemp._shopGoods;
var purchaseOnly = $gameTemp._shopPurchaseOnly;
this.prepare(goods, purchaseOnly);
}
$gameTemp.clearShopGoods();
};
Scene_Shop.prototype.create = function () {
Scene_MenuBase.prototype.create.call(this);
this.failSafeGoods();
this.createHelpWindow();
this.createCommandWindow();
this.createInfoWindow();
this.createDummyWindow();
this.createNumberWindow();
this.createBuyWindow();
this.createCategoryWindow();
this.createSellWindow();
this.createGoldWindow();
this.createStatusWindow();
this.createActorWindow();
};
Scene_Shop.prototype.createCommandWindow = function () {
this._commandWindow = new Window_ShopCommand(0, this._purchaseOnly);
this._commandWindow.y = this._helpWindow.height;
this.addWindow(this._commandWindow);
this.setCommandWindowHandlers();
};
Scene_Shop.prototype.setCommandWindowHandlers = function () {
this._commandWindow.setHandler("buy", this.commandBuy.bind(this));
this._commandWindow.setHandler("sell", this.commandSell.bind(this));
this._commandWindow.setHandler("cancel", this.popScene.bind(this));
this._commandWindow.setHandler("equip", this.commandEquip.bind(this));
};
Scene_Shop.prototype.createInfoWindow = function () {
var wx = this._commandWindow.width;
var wy = this._commandWindow.y;
var ww = Graphics.boxWidth - wx;
var wh = this._commandWindow.height;
this._infoWindow = new Window_ShopInfo(wx, wy, ww, wh);
this.addWindow(this._infoWindow);
};
Scene_Shop.prototype.createDummyWindow = function () {
var wy = this._commandWindow.y + this._commandWindow.height;
var wh = Graphics.boxHeight - wy;
var ww = Math.ceil(eval(Yanfly.Param.ShopListWidth));
this._dummyWindow = new Window_Base(0, wy, ww, wh);
this.addWindow(this._dummyWindow);
};
Scene_Shop.prototype.createBuyWindow = function () {
var wy = this._dummyWindow.y;
var wh = this._dummyWindow.height;
this._buyWindow = new Window_ShopBuy(0, wy, wh, this._goods);
this._buyWindow.setHelpWindow(this._helpWindow);
this._buyWindow.setInfoWindow(this._infoWindow);
this._buyWindow.hide();
this._buyWindow.setHandler("ok", this.onBuyOk.bind(this));
this._buyWindow.setHandler("cancel", this.onBuyCancel.bind(this));
this.addWindow(this._buyWindow);
};
Scene_Shop.prototype.createCategoryWindow = function () {
this._categoryWindow = new Window_ShopCategory();
this._categoryWindow.setHelpWindow(this._helpWindow);
this._categoryWindow.y = this._commandWindow.y;
this._categoryWindow.hide();
this._categoryWindow.deactivate();
this._categoryWindow.setHandler("ok", this.onCategoryOk.bind(this));
this._categoryWindow.setHandler("cancel", this.onCategoryCancel.bind(this));
this.addWindow(this._categoryWindow);
};
Scene_Shop.prototype.createSellWindow = function () {
var wy = this._dummyWindow.y;
var ww = this._dummyWindow.width;
var wh = this._dummyWindow.height;
this._sellWindow = new Window_ShopSell(0, wy, ww, wh);
this._sellWindow.setHelpWindow(this._helpWindow);
this._sellWindow.hide();
this._sellWindow.setInfoWindow(this._infoWindow);
this._sellWindow.setHandler("ok", this.onSellOk.bind(this));
this._sellWindow.setHandler("cancel", this.onSellCancel.bind(this));
this._categoryWindow.setItemWindow(this._sellWindow);
this.addWindow(this._sellWindow);
};
Scene_Shop.prototype.createGoldWindow = function () {
this._goldWindow = new Window_Gold(0, 0);
this._goldWindow.x = this._buyWindow.width;
this._goldWindow.y = Graphics.boxHeight - this._goldWindow.height;
this._goldWindow.width = Graphics.boxWidth - this._goldWindow.x;
this._goldWindow.createContents();
this._goldWindow.refresh();
this.addWindow(this._goldWindow);
};
Scene_Shop.prototype.createStatusWindow = function () {
var wx = this._dummyWindow.width;
var wy = this._dummyWindow.y;
var ww = Graphics.boxWidth - wx;
var wh = this._dummyWindow.height - this._goldWindow.height;
this._statusWindow = new Window_ShopStatus(wx, wy, ww, wh);
this.addWindow(this._statusWindow);
this._buyWindow.setStatusWindow(this._statusWindow);
this._sellWindow.setStatusWindow(this._statusWindow);
};
Yanfly.Shop.Scene_Shop_onBuyCancel = Scene_Shop.prototype.onBuyCancel;
Scene_Shop.prototype.onBuyCancel = function () {
Yanfly.Shop.Scene_Shop_onBuyCancel.call(this);
this._statusWindow.show();
this._infoWindow.setItem(null);
};
Scene_Shop.prototype.doBuy = function (number) {
if (Imported.YEP_ItemCore) $gameTemp.enableVarianceStock();
this.doBuyGold(number);
this.doBuyItem(number);
if (Imported.YEP_ItemCore) $gameTemp.disableVarianceStock();
};
Scene_Shop.prototype.doBuyGold = function (number) {
$gameParty.loseGold(number * this.buyingPrice());
};
Scene_Shop.prototype.doBuyItem = function (number) {
$gameParty.gainItem(this._item, number);
};
Scene_Shop.prototype.doSell = function (number) {
this.doSellGold(number);
this.doSellItem(number);
if (!Imported.YEP_ItemCore) return;
if (!DataManager.isIndependent(this._item)) return;
DataManager.removeIndependentItem(this._item);
};
Scene_Shop.prototype.doSellGold = function (number) {
$gameParty.gainGold(number * this.sellingPrice());
};
Scene_Shop.prototype.doSellItem = function (number) {
$gameParty.loseItem(this._item, number);
};
Yanfly.Shop.Scene_Shop_activateSellWindow = Scene_Shop.prototype.activateSellWindow;
Scene_Shop.prototype.activateSellWindow = function () {
Yanfly.Shop.Scene_Shop_activateSellWindow.call(this);
this._statusWindow.show();
};
Yanfly.Shop.Scene_Shop_onSellCancel = Scene_Shop.prototype.onSellCancel;
Scene_Shop.prototype.onSellCancel = function () {
Yanfly.Shop.Scene_Shop_onSellCancel.call(this);
this._infoWindow.setItem(null);
};
Scene_Shop.prototype.isSelling = function () {
return this._commandWindow.currentSymbol() === "sell";
};
Scene_Shop.prototype.createActorWindow = function () {
this._actorWindow = new Window_MenuActor();
this._actorWindow.setHandler("ok", this.onActorOk.bind(this));
this._actorWindow.setHandler("cancel", this.onActorCancel.bind(this));
this.addWindow(this._actorWindow);
};
Scene_Shop.prototype.commandEquip = function () {
this._actorWindow.activate();
this._actorWindow.show();
this._actorWindow.select(0);
};
Scene_Shop.prototype.onActorOk = function () {
this.onActorCommon();
if (this._commandWindow.currentSymbol() === "equip") {
SceneManager.push(Scene_Equip);
}
};
Scene_Shop.prototype.onActorCancel = function () {
this._actorWindow.hide();
this._actorWindow.deselect();
this._commandWindow.activate();
};
Scene_Shop.prototype.onActorCommon = function () {
$gameTemp.registerShopGoods();
var index = this._actorWindow.index();
var actor = $gameParty.members()[index];
$gameParty.setMenuActor(actor);
SoundManager.playOk();
};
Yanfly.Shop.Scene_Shop_sellingPrice = Scene_Shop.prototype.sellingPrice;
Scene_Shop.prototype.sellingPrice = function () {
if (this._item && this._item.sellPrice !== undefined) {
return this._item.sellPrice;
}
return Yanfly.Shop.Scene_Shop_sellingPrice.call(this);
};
//=============================================================================
// Utilities
//=============================================================================
Yanfly.Util = Yanfly.Util || {};
if (!Yanfly.Util.toGroup) {
Yanfly.Util.toGroup = function (inVal) {
return inVal;
};
}
//=============================================================================
// End of File
//=============================================================================