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_EquipCore.js

1126 lines
39 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 - Equip Core
// YEP_EquipCore.js
//=============================================================================
var Imported = Imported || {};
Imported.YEP_EquipCore = true;
var Yanfly = Yanfly || {};
Yanfly.Equip = Yanfly.Equip || {};
Yanfly.Equip.version = 1.16;
//=============================================================================
/*:
* @plugindesc v1.16 装备核心☁️
* @author Yanfly Engine Plugins
*
* @param ---全局---
* @default
*
* @param Text Align
* @text 文本对齐
* @desc How to align the text for the command window.
* left center right
* @default center
*
* @param Finish Command
* @text 完成命令
* @desc The command text used for exiting the equip scene.
* Leave empty to not include this command.
* @default 返回
*
* @param Remove Text
* @text 删除文本
* @desc The text used to display the "Remove" command in the equip
* item list.
* @default 删除
*
* @param Remove Icon
* @text 删除图标
* @desc The icon used to display next to the "Remove" command in
* the equip item list.
* @default 16
*
* @param Empty Text
* @text 空文本
* @desc The text used to display an "Empty" piece of equipment.
* @default <空>
*
* @param Empty Icon
* @text 空图标
* @desc The icon used to display next to the "Empty" piece of
* equipment in the equipment list.
* @default 16
*
* @param ---规则---
* @default
*
* @param Non-Removable Types
* @text 不可移动类型
* @desc These types must always have an item equipped and cannot
* be empty. Separate the type ID's by a space.
* @default 1
*
* @param Non-Optimized Types
* @text 非优化类型
* @desc These types will be ignored when the actor optimizes
* equips. Separate the type ID's by a space.
* @default 5
*
* @help
* ============================================================================
* Introduction
* ============================================================================
*
* 装备核心插件改变了游戏很多选项。将会影响装备菜单,装备类型索引,
* 装备规则等等。
*
* 插件改变包括如下:
*
* 1. Scene_Equip
* 装备界面:装备界面调整了一下,会略微不同。主要是制作了主菜单让人
* 看起来统一并且对于玩家更加熟悉。更长远来说,命令菜单可以更好的
* 适应未来的拓展插件,以便添加命令
*
* 2. Equipment Type Handling
* 装备类型:玩家不只有一个通用的设置。现在,不用的职业可以通过
* 简单的标签来添加不同的设置。还有,之前名字一样的装备类型视为
* 不同的类型,现在,名义一样的装备类型归为一类
*
* 3. Equipment Rulings
* 装备规则:现在,装备类型可以被选择能不能移除。
* 例如,这个插件设置了了武器必须装备,所以玩家武器栏不可以为空。
* 除此之外,可选择装备被确定类型限制,最好关闭自动决定。
*
* 4. Parameter Control
* 参数控制:装备参数可以同标签设置,来自设置一个较大的值或者自定义值。
* 这将允许装备不再是静态物品而是可以通过游戏改变的
*
* Note: Item Core Users
* For users using the Item Core plugin and the new Item Scene layout option,
* the Item Info Window is now added to the Equip Scene. Pressing Left/Right
* will toggle the stat comparison window with the info window. Pressing Tab on
* the keyboard will also switch them as well as clicking on those windows.
*
* ============================================================================
* Notetags
* ============================================================================
*
* 你可以用下面的标签改变职业装备设置
*
* Class Notetags:
* <Equip Slot: x> Example: <Equip Slot: 1, 2, 3, 4, 5, 5, 5, 5>
* <Equip Slot: x, x, x>
* Changes this class's equipment slots to x. Using repeating numbers makes
* it so that equipment type is duplicated and that the class can equip
* multiple equipment of that type. To find the Equipment Type ID, go to your
* 例如改变角色可以装备的类型ID
*
* 如果你不喜欢这个方法,你可以用下面方法替代:
*
* <Equip Slot> Example: <Equip Slot>
* string Weapon
* string Armor
* string Accessory
* string Accessory
* </Equip Slot> </Equip Slot>
* Replace 'string' with the Equipment type's name entry. This is case
* sensitive so if the string does not match a name entry perfectly, the slot
* will not be granted to the class. Multiple copies of a name entry would
* mean the class can equip multiple equipment of that type. Everything works
* 用特定的物品类型放入代码即可。
*
* Weapon and Armor Notetags:
* <stat: +x>
* <stat: -x>
* 允许武器装备或者或者失去某些值。你可以用血量、魔法值、攻击力
* 、防御力、魔法攻击力、魔法防御力、速度或者幸运值来代替。
* 这将允许装备可以突破默认编辑器的限制。
*
* ============================================================================
* Lunatic Mode - Custom Parameters
* ============================================================================
*
* <Custom Parameters> Example: <Custom Parameters>
* code atk = $gameVariables.value(1);
* code mat = atk / 2;
* code all = $gameParty.members().length;
* code </Custom Parameters>
* </Code Parameters>
* Allows for parameters to have custom rates adjusted by code. The following
* parameters are defined: 'maxhp', 'maxmp', 'atk', 'def', 'mat', 'mdf',
* 'agi', 'luk', and 'all'. The 'all' parameter will affect all parameters.
* Changes made here do not alter the base parameters, but instead, are added
* onto the base parameters.允许玩家自定义参数。
*
* ============================================================================
* Changelog
* ============================================================================
*
* Version 1.16:
* - Lunatic Mode fail safes added.
*
* Version 1.15:
* - Optimization update.
*
* Version 1.14:
* - Added an actor refresh upon listing the various equip slots to ensure that
* all slots are updated in case any cache'd instances may have been missed.
*
* Version 1.13:
* - Fixed a bug that caused a crash for those who weren't using the Item Core
* in addition to this plugin.
*
* Version 1.12:
* - Added optional functionality. Leaving 'Finish Command' empty will remove
* it from being added to the command list.
*
* Version 1.11:
* - Updated for RPG Maker MV version 1.1.0.
*
* Version 1.10:
* - Fixed a bug that did not clear changes made to an actor's stats after
* having unequipped them and then switching actors.
*
* Version 1.09:
* - For users using the Item Core plugin and the new Item Scene layout option,
* the Item Info Window is now added to the Equip Scene. Pressing Left/Right
* will toggle the stat comparison window with the info window. Pressing Tab on
* the keyboard will also switch them as well as clicking on those windows.
*
* Version 1.08:
* - Fixed a bug where changing an actor's equips would revive them if dead.
*
* Version 1.07:
* - Fixed a bug with 'Optimize' and 'Remove All' not refreshing windows.
*
* Version 1.06:
* - Fixed a bug with 'Change Equipment' event where it would only change the
* slot of the marked equipment rather than the slot type.
*
* Version 1.05:
* - Fixed an issue where unequipping items can kill actors.
*
* Version 1.04a:
* - Fixed a bug and rewrote the initializing equipment process.
*
* Version 1.03:
* - Fixed an bug that resulted in null object errors.
*
* Version 1.02:
* - Fixed an issue that did not keep HP and MP rates the same when using the
* optimize and clear commands.
*
* Version 1.01:
* - Fixed a bug that did not update the stats properly when compared.
*
* Version 1.00:
* - Finished plugin!
*/
//=============================================================================
//=============================================================================
// Parameter Variables
//=============================================================================
Yanfly.Parameters = PluginManager.parameters('YEP_EquipCore');
Yanfly.Param = Yanfly.Param || {};
Yanfly.Icon = Yanfly.Icon || {};
Yanfly.Param.EquipTextAlign = String(Yanfly.Parameters['Text Align']);
Yanfly.Param.EquipFinishCmd = String(Yanfly.Parameters['Finish Command']);
Yanfly.Param.EquipRemoveText = String(Yanfly.Parameters['Remove Text']);
Yanfly.Icon.RemoveEquip = Number(Yanfly.Parameters['Remove Icon']);
Yanfly.Param.EquipEmptyText = String(Yanfly.Parameters['Empty Text']);
Yanfly.Icon.EmptyEquip = Number(Yanfly.Parameters['Empty Icon']);
Yanfly.Data = String(Yanfly.Parameters['Non-Removable Types']);
Yanfly.Data = Yanfly.Data.split(' ');
Yanfly.Param.EquipNonRemove = [];
for (Yanfly.i = 0; Yanfly.i < Yanfly.Data.length; ++Yanfly.i) {
Yanfly.Param.EquipNonRemove.push(parseInt(Yanfly.Data[Yanfly.i]));
};
Yanfly.Data = String(Yanfly.Parameters['Non-Optimized Types']);
Yanfly.Data = Yanfly.Data.split(' ');
Yanfly.Param.EquipNonOptimized = [];
for (Yanfly.i = 0; Yanfly.i < Yanfly.Data.length; ++Yanfly.i) {
Yanfly.Param.EquipNonOptimized.push(parseInt(Yanfly.Data[Yanfly.i]));
};
//=============================================================================
// DataManager
//=============================================================================
Yanfly.Equip.DataManager_isDatabaseLoaded = DataManager.isDatabaseLoaded;
DataManager.isDatabaseLoaded = function() {
if (!Yanfly.Equip.DataManager_isDatabaseLoaded.call(this)) return false;
if (!Yanfly._loaded_YEP_EquipCore) {
DataManager.processEquipNotetags1($dataClasses);
DataManager.processEquipNotetags2($dataWeapons);
DataManager.processEquipNotetags2($dataArmors);
Yanfly._loaded_YEP_EquipCore = true;
}
return true;
};
DataManager.processEquipNotetags1 = function(group) {
var note1 = /<(?:EQUIP SLOT|equip slots):[ ]*(\d+(?:\s*,\s*\d+)*)>/i;
var note2 = /<(?:EQUIP SLOT|equip slots)>/i;
var note3 = /<\/(?:EQUIP SLOT|equip slots)>/i;
for (var n = 1; n < group.length; n++) {
var obj = group[n];
var notedata = obj.note.split(/[\r\n]+/);
obj.equipSlots = [];
var equipSlots = false;
for (var i = 0; i < notedata.length; i++) {
var line = notedata[i];
if (line.match(note1)) {
var array = JSON.parse('[' + RegExp.$1.match(/\d+/g) + ']');
obj.equipSlots = obj.equipSlots.concat(array);
} else if (line.match(note2)) {
equipSlots = true;
} else if (line.match(note3)) {
equipSlots = false;
} else if (equipSlots && line.match(/[ ]*(.*)/i)) {
var name = String(RegExp.$1);
var slotId = $dataSystem.equipTypes.indexOf(name);
if (slotId >= 0) obj.equipSlots.push(slotId);
}
}
if (obj.equipSlots.length <= 0) this.setDefaultEquipSlots(obj);
}
};
DataManager.setDefaultEquipSlots = function(obj) {
for (var i = 1; i < $dataSystem.equipTypes.length; ++i) {
var name = $dataSystem.equipTypes[i];
var slotId = $dataSystem.equipTypes.indexOf(name);
if (slotId >= 0) obj.equipSlots.push(slotId);
}
};
DataManager.processEquipNotetags2 = function(group) {
var note1 = /<(?:PARAMETER EVAL|custom parameter|custom parameters)>/i;
var note2 = /<\/(?:PARAMETER EVAL|custom parameter|custom parameters)>/i;
var note3 = /<(.*):[ ]([\+\-]\d+)>/i;
for (var n = 1; n < group.length; n++) {
var obj = group[n];
var notedata = obj.note.split(/[\r\n]+/);
obj.parameterEval = '';
var parameterEval = false;
for (var i = 0; i < notedata.length; i++) {
var line = notedata[i];
if (line.match(note1)) {
parameterEval = true;
} else if (line.match(note2)) {
parameterEval = false;
} else if (parameterEval) {
obj.parameterEval = obj.parameterEval + line + '\n';
} else if (line.match(note3)) {
var stat = String(RegExp.$1).toUpperCase();
var value = parseInt(RegExp.$2);
switch (stat) {
case 'HP':
case 'MAXHP':
case 'MAX HP':
obj.params[0] = value;
break;
case 'MP':
case 'MAXMP':
case 'MAX MP':
case 'SP':
case 'MAXSP':
case 'MAX SP':
obj.params[1] = value;
break;
case 'ATK':
case 'STR':
obj.params[2] = value;
break;
case 'DEF':
obj.params[3] = value;
break;
case 'MAT':
case 'INT' || 'SPI':
obj.params[4] = value;
break;
case 'MDF':
case 'RES':
obj.params[5] = value;
break;
case 'AGI':
case 'SPD':
obj.params[6] = value;
break;
case 'LUK':
obj.params[7] = value;
break;
}
}
}
}
};
//=============================================================================
// Game_Actor
//=============================================================================
Game_Actor.prototype.initEquips = function(equips) {
var equips = this.convertInitEquips(equips);
this.equipInitEquips(equips);
this.releaseUnequippableItems(true);
this.recoverAll();
this.refresh();
};
Game_Actor.prototype.convertInitEquips = function(equips) {
var items = [];
for (var i = 0; i < equips.length; ++i) {
var equipId = equips[i];
if (equipId <= 0) continue;
var equipType = $dataSystem.equipTypes[i + 1];
if (equipType === $dataSystem.equipTypes[1] ||
(i === 1 && this.isDualWield())) {
var equip = $dataWeapons[equipId];
} else {
var equip = $dataArmors[equipId];
}
items.push(equip);
}
return items;
};
Game_Actor.prototype.equipInitEquips = function(equips) {
var slots = this.equipSlots();
var maxSlots = slots.length;
this._equips = [];
for (var i = 0; i < maxSlots; ++i) {
this._equips[i] = new Game_Item();
}
for (var i = 0; i < maxSlots; ++i) {
var slotType = slots[i];
var equip = this.grabInitEquips(equips, slotType);
if (this.canEquip(equip)) this._equips[i].setObject(equip);
}
};
Game_Actor.prototype.grabInitEquips = function(equips, slotType) {
var item = null;
for (var i = 0; i < equips.length; ++i) {
var equip = equips[i];
if (!equip) continue;
if (slotType === 1 && DataManager.isWeapon(equip)) {
item = equip;
break;
} else if (equip.etypeId === slotType) {
item = equip;
break;
}
}
if (item) equips[i] = null;
return item;
};
Game_Actor.prototype.equipSlots = function() {
var slots = this.currentClass().equipSlots.slice();
if (slots.length >= 2 && this.isDualWield()) slots[1] = 1;
return slots;
};
Yanfly.Equip.Game_Actor_equips = Game_Actor.prototype.equips;
Game_Actor.prototype.equips = function() {
for (var i = 0; i < this.currentClass().equipSlots.length; ++i) {
if (this._equips[i] === undefined || this._equips[i] === null) {
this._equips[i] = new Game_Item();
}
}
return Yanfly.Equip.Game_Actor_equips.call(this);
};
Yanfly.Equip.Game_Actor_changeEquip = Game_Actor.prototype.changeEquip;
Game_Actor.prototype.changeEquip = function(slotId, item) {
if (!this._equips[slotId]) this._equips[slotId] = new Game_Item();
Yanfly.Equip.Game_Actor_changeEquip.call(this, slotId, item);
};
Yanfly.Equip.Game_Actor_forceChangeEquip =
Game_Actor.prototype.forceChangeEquip;
Game_Actor.prototype.forceChangeEquip = function(slotId, item) {
if (!this._equips[slotId]) {
this._equips[slotId] = new Game_Item();
this._equips[slotId].setEquip(this.equipSlots()[slotId] === 1, 0);
}
Yanfly.Equip.Game_Actor_forceChangeEquip.call(this, slotId, item);
};
Yanfly.Equip.Game_Actor_isEquipChangeOk = Game_Actor.prototype.isEquipChangeOk;
Game_Actor.prototype.isEquipChangeOk = function(slotId) {
if ($gameTemp._clearEquipments) {
var typeId = this.equipSlots()[slotId];
if (Yanfly.Param.EquipNonRemove.contains(typeId)) return false;
}
if ($gameTemp._optimizeEquipments) {
var typeId = this.equipSlots()[slotId];
if (Yanfly.Param.EquipNonOptimized.contains(typeId)) return false;
}
return Yanfly.Equip.Game_Actor_isEquipChangeOk.call(this, slotId);
};
Yanfly.Equip.Game_Actor_paramPlus = Game_Actor.prototype.paramPlus;
Game_Actor.prototype.paramPlus = function(paramId) {
value = Yanfly.Equip.Game_Actor_paramPlus.call(this, paramId);
var equips = this.equips();
for (var i = 0; i < equips.length; i++) {
var item = equips[i];
if (!item) continue;
value += this.customParamPlus(item, paramId);
value += this.evalParamPlus(item, paramId);
}
return value;
};
Game_Actor.prototype.customParamPlus = function(item, paramId) {
return 0;
};
Game_Actor.prototype.evalParamPlus = function(item, paramId) {
if (!item) return 0;
if (!item.parameterEval || item.parameterEval === '') return 0;
var value = 0;
var hp = 0;
var maxhp = 0;
var mhp = 0;
var mp = 0;
var maxmp = 0;
var mmp = 0;
var sp = 0;
var maxsp = 0;
var msp = 0;
var atk = 0;
var str = 0;
var def = 0;
var mat = 0;
var int = 0;
var spi = 0;
var mdf = 0;
var res = 0;
var agi = 0;
var spd = 0;
var luk = 0;
var all = 0;
var a = this;
var user = this;
var s = $gameSwitches._data;
var v = $gameVariables._data;
var code = item.parameterEval;
try {
eval(code);
} catch (e) {
Yanfly.Util.displayError(e, code, 'CUSTOM PARAMETER FORMULA ERROR');
}
switch (paramId) {
case 0:
value += hp + maxhp + mhp;
break;
case 1:
value += mp + maxmp + mmp + sp + maxsp + msp;
break;
case 2:
value += atk + str;
break;
case 3:
value += def;
break;
case 4:
value += mat + int + spi;
break;
case 5:
value += mdf + res;
break;
case 6:
value += agi + spd;
break;
case 7:
value += luk;
break;
}
return value + all;
};
//=============================================================================
// Game_Interpreter
//=============================================================================
// Change Equipment
Game_Interpreter.prototype.command319 = function() {
var actor = $gameActors.actor(this._params[0]);
if (!actor) return true;
var index = actor.equipSlots().indexOf(this._params[1]) + 1;
actor.changeEquipById(index, this._params[2]);
return true;
};
//=============================================================================
// Window_EquipCommand
//=============================================================================
Window_EquipCommand.prototype.windowWidth = function() {
return 240;
};
Window_EquipCommand.prototype.maxCols = function() {
return 1;
};
Window_EquipCommand.prototype.windowHeight = function() {
return this.fittingHeight(this.numVisibleRows());
};
Window_EquipCommand.prototype.numVisibleRows = function() {
return 4;
};
Window_EquipCommand.prototype.itemTextAlign = function() {
return Yanfly.Param.EquipTextAlign;
};
Yanfly.Equip.Window_EquipCommand_makeCommandList =
Window_EquipCommand.prototype.makeCommandList;
Window_EquipCommand.prototype.makeCommandList = function() {
Yanfly.Equip.Window_EquipCommand_makeCommandList.call(this);
this.addCustomCommand();
this.addFinishCommand();
};
Window_EquipCommand.prototype.addCustomCommand = function() {
};
Window_EquipCommand.prototype.addFinishCommand = function() {
if (Yanfly.Param.EquipFinishCmd === '') return;
this.addCommand(Yanfly.Param.EquipFinishCmd, 'cancel');
};
//=============================================================================
// Window_EquipSlot
//=============================================================================
Yanfly.Equip.Window_EquipSlot_setActor = Window_EquipSlot.prototype.setActor;
Window_EquipSlot.prototype.setActor = function(actor) {
this.setSlotNameWidth(actor);
Yanfly.Equip.Window_EquipSlot_setActor.call(this, actor);
};
Window_EquipSlot.prototype.refresh = function() {
if (this._actor) this._actor.refresh();
Window_Selectable.prototype.refresh.call(this);
};
Window_EquipSlot.prototype.isEnabled = function(index) {
if (this._actor) {
return Yanfly.Equip.Game_Actor_isEquipChangeOk.call(this._actor, index);
} else {
return false;
}
};
Window_EquipSlot.prototype.drawItem = function(index) {
if (!this._actor) return;
var rect = this.itemRectForText(index);
this.changeTextColor(this.systemColor());
this.changePaintOpacity(this.isEnabled(index));
var ww1 = this._nameWidth;
this.drawText(this.slotName(index), rect.x, rect.y, ww1);
var ww2 = rect.width - ww1;
var item = this._actor.equips()[index];
if (item) {
this.drawItemName(item, rect.x + ww1, rect.y, ww2);
} else {
this.drawEmptySlot(rect.x + ww1, rect.y, ww2);
}
this.changePaintOpacity(true);
};
Window_EquipSlot.prototype.setSlotNameWidth = function(actor) {
if (!actor) return;
this._nameWidth = 0;
for (var i = 0; i < actor.equipSlots().length; ++i) {
var text = $dataSystem.equipTypes[actor.equipSlots()[i]] + ' ';
this._nameWidth = Math.max(this._nameWidth, this.textWidth(text));
}
};
Window_EquipSlot.prototype.drawEmptySlot = function(wx, wy, ww) {
this.changePaintOpacity(false);
var ibw = Window_Base._iconWidth + 4;
this.resetTextColor();
this.drawIcon(Yanfly.Icon.EmptyEquip, wx + 2, wy + 2);
var text = Yanfly.Param.EquipEmptyText;
this.drawText(text, wx + ibw, wy, ww - ibw);
};
Window_EquipSlot.prototype.setInfoWindow = function(infoWindow) {
this._infoWindow = infoWindow;
this.update();
};
Yanfly.Equip.Window_ItemList_updateHelp = Window_EquipSlot.prototype.updateHelp;
Window_EquipSlot.prototype.updateHelp = function() {
Yanfly.Equip.Window_ItemList_updateHelp.call(this);
if (SceneManager._scene instanceof Scene_Equip && this._infoWindow) {
this._infoWindow.setItem(this.item());
}
};
//=============================================================================
// Window_EquipItem
//=============================================================================
Window_EquipItem.prototype.maxCols = function() {
return 1;
};
Yanfly.Equip.Window_EquipItem_setSlotId = Window_EquipItem.prototype.setSlotId;
Window_EquipItem.prototype.setSlotId = function(slotId) {
// do nothing
};
Yanfly.Equip.Window_EquipItem_includes = Window_EquipItem.prototype.includes;
Window_EquipItem.prototype.includes = function(item) {
if (item === null && this._actor && this._data.length > 0) {
var typeId = this._actor.equipSlots()[this._slotId];
if (Yanfly.Param.EquipNonRemove.contains(typeId)) return false;
}
return Yanfly.Equip.Window_EquipItem_includes.call(this, item);
};
Yanfly.Equip.Window_EquipItem_isEnabled =
Window_EquipItem.prototype.isEnabled;
Window_EquipItem.prototype.isEnabled = function(item) {
if (item === null && this._actor) {
var typeId = this._actor.equipSlots()[this._slotId];
if (Yanfly.Param.EquipNonRemove.contains(typeId)) return false;
}
return Yanfly.Equip.Window_EquipItem_isEnabled.call(this, item);
};
Yanfly.Equip.Window_EquipItem_drawItem = Window_EquipItem.prototype.drawItem;
Window_EquipItem.prototype.drawItem = function(index) {
var item = this._data[index];
if (item === null) {
this.drawRemoveEquip(index);
} else {
Yanfly.Equip.Window_EquipItem_drawItem.call(this, index);
}
};
Window_EquipItem.prototype.drawRemoveEquip = function(index) {
if (!this.isEnabled(null)) return;
var rect = this.itemRect(index);
rect.width -= this.textPadding();
this.changePaintOpacity(true);
var ibw = Window_Base._iconWidth + 4;
this.resetTextColor();
this.drawIcon(Yanfly.Icon.RemoveEquip, rect.x + 2, rect.y + 2);
var text = Yanfly.Param.EquipRemoveText;
this.drawText(text, rect.x + ibw, rect.y, rect.width - ibw);
};
Window_EquipItem.prototype.setInfoWindow = function(infoWindow) {
this._infoWindow = infoWindow;
this.update();
};
Yanfly.Equip.Window_ItemList_updateHelp = Window_EquipItem.prototype.updateHelp;
Window_EquipItem.prototype.updateHelp = function() {
Yanfly.Equip.Window_ItemList_updateHelp.call(this);
if (SceneManager._scene instanceof Scene_Equip && this._infoWindow) {
this._infoWindow.setItem(this.item());
}
};
//=============================================================================
// Window_StatCompare
//=============================================================================
function Window_StatCompare() {
this.initialize.apply(this, arguments);
}
Window_StatCompare.prototype = Object.create(Window_Base.prototype);
Window_StatCompare.prototype.constructor = Window_StatCompare;
Window_StatCompare.prototype.initialize = function(wx, wy, ww, wh) {
Window_Base.prototype.initialize.call(this, wx, wy, ww, wh);
this._actor = null;
this._tempActor = null;
this.refresh();
};
Window_StatCompare.prototype.createWidths = function() {
this._paramNameWidth = 0;
this._paramValueWidth = 0;
this._arrowWidth = this.textWidth('\u2192' + ' ');
var buffer = this.textWidth(' ');
for (var i = 0; i < 8; ++i) {
var value1 = this.textWidth(TextManager.param(i));
var value2 = this.textWidth(Yanfly.Util.toGroup(this._actor.paramMax(i)));
this._paramNameWidth = Math.max(value1, this._paramNameWidth);
this._paramValueWidth = Math.max(value2, this._paramValueWidth);
}
this._bonusValueWidth = this._paramValueWidth;
this._bonusValueWidth += this.textWidth('(+)') + buffer;
this._paramNameWidth += buffer;
this._paramValueWidth;
if (this._paramNameWidth + this._paramValueWidth * 2 + this._arrowWidth +
this._bonusValueWidth > this.contents.width) this._bonusValueWidth = 0;
};
Window_StatCompare.prototype.setActor = function(actor) {
if (this._actor === actor) return;
this._actor = actor;
this.createWidths();
this.refresh();
};
Window_StatCompare.prototype.refresh = function() {
this.contents.clear();
if (!this._actor) return;
for (var i = 0; i < 8; ++i) {
this.drawItem(0, this.lineHeight() * i, i);
}
};
Window_StatCompare.prototype.setTempActor = function(tempActor) {
if (this._tempActor === tempActor) return;
this._tempActor = tempActor;
this.refresh();
};
Window_StatCompare.prototype.drawItem = function(x, y, paramId) {
this.drawDarkRect(x, y, this.contents.width, this.lineHeight());
this.drawParamName(y, paramId);
this.drawCurrentParam(y, paramId);
this.drawRightArrow(y);
if (!this._tempActor) return;
this.drawNewParam(y, paramId);
this.drawParamDifference(y, paramId);
};
Window_StatCompare.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_StatCompare.prototype.drawParamName = function(y, paramId) {
var x = this.textPadding();
this.changeTextColor(this.systemColor());
this.drawText(TextManager.param(paramId), x, y, this._paramNameWidth);
};
Window_StatCompare.prototype.drawCurrentParam = function(y, paramId) {
var x = this.contents.width - this.textPadding();
x -= this._paramValueWidth * 2 + this._arrowWidth + this._bonusValueWidth;
this.resetTextColor();
var actorparam = Yanfly.Util.toGroup(this._actor.param(paramId));
this.drawText(actorparam, x, y, this._paramValueWidth, 'right');
};
Window_StatCompare.prototype.drawRightArrow = function(y) {
var x = this.contents.width - this.textPadding();
x -= this._paramValueWidth + this._arrowWidth + this._bonusValueWidth;
var dw = this.textWidth('\u2192' + ' ');
this.changeTextColor(this.systemColor());
this.drawText('\u2192', x, y, dw, 'center');
};
Window_StatCompare.prototype.drawNewParam = function(y, paramId) {
var x = this.contents.width - this.textPadding();
x -= this._paramValueWidth + this._bonusValueWidth;
var newValue = this._tempActor.param(paramId);
var diffvalue = newValue - this._actor.param(paramId);
var actorparam = Yanfly.Util.toGroup(newValue);
this.changeTextColor(this.paramchangeTextColor(diffvalue));
this.drawText(actorparam, x, y, this._paramValueWidth, 'right');
};
Window_StatCompare.prototype.drawParamDifference = function(y, paramId) {
var x = this.contents.width - this.textPadding();
x -= this._bonusValueWidth;
var newValue = this._tempActor.param(paramId);
var diffvalue = newValue - this._actor.param(paramId);
if (diffvalue === 0) return;
var actorparam = Yanfly.Util.toGroup(newValue);
this.changeTextColor(this.paramchangeTextColor(diffvalue));
var text = Yanfly.Util.toGroup(diffvalue);
if (diffvalue > 0) {
text = ' (+' + text + ')';
} else {
text = ' (' + text + ')';
}
this.drawText(text, x, y, this._bonusValueWidth, 'left');
};
//=============================================================================
// Scene_Equip
//=============================================================================
Scene_Equip.prototype.create = function() {
Scene_MenuBase.prototype.create.call(this);
this.createHelpWindow();
this.createCommandWindow();
this.createStatusWindow();
this.createSlotWindow();
this.createItemWindow();
this.createCompareWindow();
this._lowerRightVisibility = true;
this.updateLowerRightWindows();
this.refreshActor();
};
Scene_Equip.prototype.createCommandWindow = function() {
var wy = this._helpWindow.height;
this._commandWindow = new Window_EquipCommand(0, wy, 240);
this._commandWindow.setHelpWindow(this._helpWindow);
this._commandWindow.setHandler('equip', this.commandEquip.bind(this));
this._commandWindow.setHandler('optimize', this.commandOptimize.bind(this));
this._commandWindow.setHandler('clear', this.commandClear.bind(this));
this._commandWindow.setHandler('cancel', this.popScene.bind(this));
this._commandWindow.setHandler('pagedown', this.nextActor.bind(this));
this._commandWindow.setHandler('pageup', this.previousActor.bind(this));
this.addWindow(this._commandWindow);
};
Scene_Equip.prototype.createStatusWindow = function() {
var wx = this._commandWindow.width;
var wy = this._helpWindow.height;
var ww = Graphics.boxWidth - wx;
var wh = this._commandWindow.height;
this._statusWindow = new Window_SkillStatus(wx, wy, ww, wh);
this.addWindow(this._statusWindow);
};
Scene_Equip.prototype.createSlotWindow = function() {
var wy = this._commandWindow.y + this._commandWindow.height;
var ww = Graphics.boxWidth / 2;
var wh = Graphics.boxHeight - wy;
this._slotWindow = new Window_EquipSlot(0, wy, ww, wh);
this._slotWindow.setHelpWindow(this._helpWindow);
this._slotWindow.setHandler('ok', this.onSlotOk.bind(this));
this._slotWindow.setHandler('cancel', this.onSlotCancel.bind(this));
this.addWindow(this._slotWindow);
};
Scene_Equip.prototype.createItemWindow = function() {
var wy = this._slotWindow.y;
var ww = Graphics.boxWidth / 2;
var wh = Graphics.boxHeight - wy;
this._itemWindow = new Window_EquipItem(0, wy, ww, wh);
this._itemWindow.setHelpWindow(this._helpWindow);
this._itemWindow.setHandler('ok', this.onItemOk.bind(this));
this._itemWindow.setHandler('cancel', this.onItemCancel.bind(this));
this._slotWindow.setItemWindow(this._itemWindow);
this.addWindow(this._itemWindow);
this._itemWindow.hide();
};
Scene_Equip.prototype.createCompareWindow = function() {
this._lowerRightWindows = [];
var wx = this._itemWindow.width;
var wy = this._itemWindow.y;
var ww = Graphics.boxWidth - wx;
var wh = Graphics.boxHeight - wy;
this._compareWindow = new Window_StatCompare(wx, wy, ww, wh);
this._slotWindow.setStatusWindow(this._compareWindow);
this._itemWindow.setStatusWindow(this._compareWindow);
this.addWindow(this._compareWindow);
this._lowerRightWindows.push(this._compareWindow);
if (Imported.YEP_ItemCore && eval(Yanfly.Param.ItemSceneItem)) {
this.createItemInfoWindow();
}
};
Scene_Equip.prototype.createItemInfoWindow = function() {
var wx = this._itemWindow.width;
var wy = this._itemWindow.y;
var ww = Graphics.boxWidth - wx;
var wh = this._itemWindow.height;
this._infoWindow = new Window_ItemInfo(wx, wy, ww, wh);
this._slotWindow.setInfoWindow(this._infoWindow);
this._itemWindow.setInfoWindow(this._infoWindow);
this.addWindow(this._infoWindow);
this._lowerRightWindows.push(this._infoWindow);
};
Yanfly.Equip.Scene_Equip_refreshActor = Scene_Equip.prototype.refreshActor;
Scene_Equip.prototype.refreshActor = function() {
Yanfly.Equip.Scene_Equip_refreshActor.call(this);
this._compareWindow.setActor(this.actor());
};
Yanfly.Equip.Scene_Equip_commandOptimize =
Scene_Equip.prototype.commandOptimize;
Scene_Equip.prototype.commandOptimize = function() {
$gameTemp._optimizeEquipments = true;
var hpRate = this.actor().hp / Math.max(1, this.actor().mhp);
var mpRate = this.actor().mp / Math.max(1, this.actor().mmp);
Yanfly.Equip.Scene_Equip_commandOptimize.call(this);
$gameTemp._optimizeEquipments = false;
var max = this.actor().isDead() ? 0 : 1;
var hpAmount = Math.max(max, parseInt(this.actor().mhp * hpRate));
this.actor().setHp(hpAmount);
this.actor().setMp(parseInt(this.actor().mmp * mpRate));
this._compareWindow.refresh();
this._statusWindow.refresh();
this.refreshActor();
};
Yanfly.Equip.Scene_Equip_commandClear = Scene_Equip.prototype.commandClear;
Scene_Equip.prototype.commandClear = function() {
$gameTemp._clearEquipments = true;
var hpRate = this.actor().hp / Math.max(1, this.actor().mhp);
var mpRate = this.actor().mp / Math.max(1, this.actor().mmp);
Yanfly.Equip.Scene_Equip_commandClear.call(this);
$gameTemp._clearEquipments = false;
var max = this.actor().isDead() ? 0 : 1;
var hpAmount = Math.max(max, parseInt(this.actor().mhp * hpRate));
this.actor().setHp(hpAmount);
this.actor().setMp(parseInt(this.actor().mmp * mpRate));
this._compareWindow.refresh();
this._statusWindow.refresh();
this.refreshActor();
};
Yanfly.Equip.Scene_Equip_onSlotOk = Scene_Equip.prototype.onSlotOk;
Scene_Equip.prototype.onSlotOk = function() {
this._itemWindow._slotId = -1;
var slotId = this._slotWindow.index();
Yanfly.Equip.Window_EquipItem_setSlotId.call(this._itemWindow, slotId);
Yanfly.Equip.Scene_Equip_onSlotOk.call(this);
this._itemWindow.show();
};
Yanfly.Equip.Scene_Equip_onSlotCancel = Scene_Equip.prototype.onSlotCancel;
Scene_Equip.prototype.onSlotCancel = function() {
Yanfly.Equip.Scene_Equip_onSlotCancel.call(this);
if (this._infoWindow) this._infoWindow.setItem(null);
this._compareWindow.setTempActor(null);
};
Yanfly.Equip.Scene_Equip_onItemOk = Scene_Equip.prototype.onItemOk;
Scene_Equip.prototype.onItemOk = function() {
var hpRate = this.actor().hp / Math.max(1, this.actor().mhp);
var mpRate = this.actor().mp / Math.max(1, this.actor().mmp);
Yanfly.Equip.Scene_Equip_onItemOk.call(this);
var max = this.actor().isDead() ? 0 : 1;
var hpAmount = Math.max(max, parseInt(this.actor().mhp * hpRate));
this.actor().setHp(hpAmount);
this.actor().setMp(parseInt(this.actor().mmp * mpRate));
this._itemWindow.hide();
this._statusWindow.refresh();
};
Yanfly.Equip.Scene_Equip_onItemCancel = Scene_Equip.prototype.onItemCancel;
Scene_Equip.prototype.onItemCancel = function() {
Yanfly.Equip.Scene_Equip_onItemCancel.call(this);
this._compareWindow.setTempActor(null);
this._itemWindow.hide();
};
Scene_Equip.prototype.update = function() {
Scene_MenuBase.prototype.update.call(this);
if (this.isActive()) this.updateLowerRightWindowTriggers();
};
Scene_Equip.prototype.updateLowerRightWindowTriggers = function() {
if (!this._lowerRightVisibility) return;
if (Input.isRepeated('right')) {
this.shiftLowerRightWindows();
} else if (Input.isRepeated('left')) {
this.unshiftLowerRightWindows();
} else if (Input.isRepeated('tab')) {
this.shiftLowerRightWindows();
} else if (this.isLowerWindowTouched()) {
this.shiftLowerRightWindows();
}
};
Scene_Equip.prototype.isLowerWindowTouched = function() {
if (!TouchInput.isTriggered()) return false;
var x = TouchInput.x;
var y = TouchInput.y;
var rect = new Rectangle();
rect.x = this._compareWindow.x;
rect.y = this._compareWindow.y;
rect.width = this._compareWindow.x + this._compareWindow.width;
rect.height = this._compareWindow.y + this._compareWindow.height;
return (x >= rect.x && y >= rect.y && x < rect.width && y < rect.height);
};
Scene_Equip.prototype.updateLowerRightWindows = function() {
var length = this._lowerRightWindows.length;
for (var i = 0; i < length; ++i) {
var win = this._lowerRightWindows[i];
win.visible = false;
}
this._lowerRightWindows[0].visible = this._lowerRightVisibility;
};
Scene_Equip.prototype.shiftLowerRightWindows = function() {
var win = this._lowerRightWindows.shift();
this._lowerRightWindows.push(win);
this.updateLowerRightWindows();
this.playLowerRightWindowSound();
};
Scene_Equip.prototype.unshiftLowerRightWindows = function() {
var win = this._lowerRightWindows.pop();
this._lowerRightWindows.unshift(win);
this.updateLowerRightWindows();
this.playLowerRightWindowSound();
};
Scene_Equip.prototype.playLowerRightWindowSound = function() {
if (this._lowerRightWindows.length <= 1) return;
SoundManager.playCursor();
};
Yanfly.Equip.Scene_Equip_onActorChange = Scene_Equip.prototype.onActorChange;
Scene_Equip.prototype.onActorChange = function() {
Yanfly.Equip.Scene_Equip_onActorChange.call(this);
this._compareWindow.setTempActor(null);
if (this._infoWindow) this._infoWindow.setItem(null);
};
//=============================================================================
// Utilities
//=============================================================================
Yanfly.Util = Yanfly.Util || {};
if (!Yanfly.Util.toGroup) {
Yanfly.Util.toGroup = function(inVal) {
return inVal;
}
};
Yanfly.Util.displayError = function(e, code, message) {
console.log(message);
console.log(code || 'NON-EXISTENT');
console.error(e);
if (Utils.isNwjs() && Utils.isOptionValid('test')) {
if (!require('nw.gui').Window.get().isDevToolsOpen()) {
require('nw.gui').Window.get().showDevTools();
}
}
};
//=============================================================================
// End of File
//=============================================================================