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

1921 lines
67 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 - Skill Learn System
// YEP_SkillLearnSystem.js
//=============================================================================
var Imported = Imported || {};
Imported.YEP_SkillLearnSystem = true;
var Yanfly = Yanfly || {};
Yanfly.SLS = Yanfly.SLS || {};
Yanfly.SLS.version = 1.13;
//=============================================================================
/*:
* @plugindesc v1.13 技能学习系统☁️
* @author Yanfly Engine Plugins
*
* @param ---命令---
* @default
*
* @param Learn Command
* @text 学习命令
* @desc How the command for learning skills appear in the skill
* command window.
* @default 学习技能
*
* @param Show Command
* @text 显示命令
* @desc Show the Learn command in the main menu by default?
* NO - false YES - true
* @default true
*
* @param Enable Command
* @text 启用命令
* @desc Enable the Learn command in the main menu by default?
* NO - false YES - true
* @default true
*
* @param Integrate
* @text 整合
* @desc Integrate Learn Skills into the Skill scene?
* NO - false YES - true
* @default false
*
* @param ---确认学习---
* @default
*
* @param Confirm Window
* @text 确认窗口
* @desc For non-integrated menu, show a learn confirmation?
* NO - false YES - true
* @default true
*
* @param Confirm Text
* @text 确认文本
* @desc If using the confirm window, this is the text used.
* %1 - Actor %2 - Skill Name
* @default %1 学习 %2吗
*
* @param Confirm Yes
* @text 确认是
* @desc Text used to display yes.
* @default 学习
*
* @param Confirm No
* @text 确认否
* @desc Text used to display no.
* @default 不学习
*
* @param ---技能学习---
* @default
*
* @param Learned Text
* @text 学习的文本
* @desc Text showing the skill has been learned.
* @default 学习
*
* @param Learned Size
* @text 学习的大小
* @desc Font size for the text showing the skill has been learned.
* Default: 28
* @default 20
*
* @param Learn Cost
* @text 学习费用
* @desc Text used to list what are the learn costs for the skill.
* @default 学习技能费用
*
* @param Cost Size
* @text 费用大小
* @desc Font size used for the cost of learning a skill.
* Default: 28
* @default 20
*
* @param Show Gold Window
* @text 显示金币窗口
* @desc Shows the gold window when learning a new skill.
* NO - false YES - true
* @default true
*
* @param ---默认---
* @default
*
* @param Default Gold Cost
* @text 默认金币费用
* @desc Default gold cost of learning new skills.
* @default 1000
*
* @param Default JP Cost
* @text 默认JP费用
* @desc Default JP cost of learning new skills.
* Requires YEP_JobPoints.js
* @default 100
*
* @help
* ============================================================================
* Introduction
* ============================================================================
*
* 此插件可以让游戏中的角色在技能菜单中学习技能。学习技能的代价可以
* 是金钱、物品或所谓的“职业点数”Job Point。它能够提供除了
* 升级以外的获得技能的可选方式。
*
* Fox的JP职业点数等级——这个插件向Yanfly的JP系统中添加了
* 等级概念,就像《最终幻想战略版》中那样。根据你当前职业的“职业等级”
* Job Level你可以在SkillLearnSystem中获取相应的技能也可以在
* ClassChangeCore中更换相应的业。而职业等级只是通过增加JP来提高的。
*
* 此插件可以通过YEP_JobPoints.js使用。
* 在插件管理页面中我们建议把这个插件放在YEP_JobPoints.js的下面。
*
* ============================================================================
* Notetags
* ============================================================================
*
* 通过下述注释来使用技能学习系统。
*
* 职业的注释:
* <Learn Skill: x>
* <Learn Skill: x, x, x>
* <Learn Skill: x to y>
* 让此职业能够在菜单中学习技能x。如果是第三种情形x to y
* 它允许职业学习从x到y的所有技能其中x和y是技能的ID。
*
* 技能注释:
* <Learn Cost: x Gold>
* 设置学习此技能所要花费的金钱为x。
*
* <Learn Cost: x JP>
* 设置学习此技能所要花费的JP为x。
* 这一条需要YEP_JobPoints.js插件才能运行。
*
* <Learn Cost> or <Learn Cost>
* Item x: y item name: y
* Weapon x: y item name: y
* Armor x: y </Learn Cost>
* </Learn Cost>
* 设置学习此技能所要花费的物品、武器和防具其中x是物品的ID
* y是所需物品的数量。如果你打算用物品的名称作为变量那么把
* item name换为物品在数据库中的名称。但如果有多个物品的名称
* 相同那么将会使用ID最大的东西按照“物品武器防具”
* 的顺序)作为费用。
* *注意如果你在使用YEP_ItemCore.js插件及“独立物品”
* Independent Items那么学习费用将不包括那些独立物品。
*
* <Learn Require Level: x>
* 角色等级到达x之后此技能才会出现在可学习技能的列表上。
*
* <Learn Require Skill: x>
* <Learn Require Skill: x, x, x>
* <Learn Require Skill: x to y>
* 角色必须已经掌握其他技能x此技能才会出现在列表上。如果是
* 第三种情形x to y角色必须已经掌握从x到y的所有技能
* 其中x和/或y是技能的ID。
*
* <Learn Require Switch: x>
* <Learn Require Switch: x, x, x>
* <Learn Require Switch: x to y>
* 开关x必须已被打开此技能才会出现。如果是第三种情形x to y
* 从x到y的所有开关必须已被打开技能才会出现其中x和/或y是开关的ID。
*
* ============================================================================
* “疯狂模式”——自定义要求和花费
* ============================================================================
*
* 如果你只有很少的JavaScript使用经验并且希望更好地定做技能学习的
* 方法,那么你可以用下列注释:
*
* 技能的注释:
*
* <Learn Show Eval>
* value = true;
* value = false;
* </Learn Show Eval>
* 如果想用一串代码来隐藏或显示此技能,你可以使用这些注释。若
* 返回value的值为true那么即使其它要求不被满足技能也会出现
* 在列表上。而若返回value的值为false那么即使其它
* 要求被满足,技能也不会出现。
*
* <Learn Require Eval>
* value = true;
* value = false;
* </Learn Require Eval>
* 给希望通过代码设置自己特定的技能学习要求的人使用。只有返回
* value的值为true技能才会显示为可学的。请避免使用可以停止
* 后续代码工作的命令。code.
*
* <Learn Cost Eval>
* code
* code
* </Learn Cost Eval>
* 如果你熟悉JavaScript你可以在通过学习技能菜单
* 学习技能之后自定义一些功能。
*
* <Learn Custom Text>
* text
* text
* </Learn Custom Text>
* 在主要花费的下面显示自定义文字。可以在这里使用文本代码。
*
* ============================================================================
* Lunatic Mode - Custom JP Costs
* ============================================================================
*
* For those who have basic JavaScript knowledge and would like to make the JP
* costs for skills dynamic, you can use the following notetags:
*
* Skill Notetags:
*
* <Custom Learn JP Cost>
* cost = user.level * 100;
* </Custom Learn JP Cost>
* The 'cost' variable is the value that will be returned as a result of this
* Lunatic Mode notetag. The value returned here from this code will be added
* on top of the <Learn Cost: x JP> value.
*
* ============================================================================
* Plugin Commands 插件命令
* ============================================================================
*
* 可以从事件编辑器Event Editor中使用下列插件命令来确定
* 你是否想让“学习技能”命令出现在技能界面以使之可行。
*
* Plugin Command:
* ShowLearnSkill 显示“学习技能”命令。
* HideLearnSkill 隐藏“学习技能”命令。
* EnableLearnSkill 使“学习技能”命令可行。
* DisableLearnSkill 使“学习技能”命令不可行。
* OpenLearnSkill actor x 为角色x打开学习技能菜单。
* OpenLearnSkill party x 为队伍成员x打开学习技能菜单。
*
* ============================================================================
* Changelog
* ============================================================================
*
* Version 1.13:
* - Lunatic Mode fail safes added.
*
* Version 1.12:
* - Updated for RPG Maker MV version 1.3.2.
*
* Version 1.11:
* - Removed dependency on YEP_JobPoints.js if using Integrated skill learn.
*
* Version 1.10:
* - Added <Custom Learn JP Cost> Lunatic Mode notetag. Look in the plugin's
* helpfile for more details!
*
* Version 1.09:
* - Compatibility update with Class Change Core's <Use Nickname> notetag.
*
* Version 1.08:
* - Updated for RPG Maker MV version 1.1.0.
*
* Version 1.07:
* - Updated the <Learn Require Level: x> notetag. If you are using the Class
* Change Core, the requirement will now depend on the level of the class.
*
* Version 1.06b:
* - Added 'Confirm Window', 'Confirm Text', 'Confirm Yes', 'Confirm No' to the
* plugin's parameters. This confirm window only appears for non-integrated
* menus as the integrated menus have a class confirmation window already.
* - Confirm Text now supports text codes.
* - Fixed a visual bug when learning skills.
*
* Version 1.05:
* - Fixed a bug with the 'OpenLearnSkill party x' plugin command not opening
* the correct party member.
*
* Version 1.04:
* - Fixed a bug that would duplicate non-independent items.
* - Fixed a bug with class portraits not updating properly.
*
* Version 1.03a:
* - Fixed a bug where JP values weren't updated upon learning.
* - Fixed a bug where the help description didn't update if a skill vanished.
*
* Version 1.02:
* - Reversed the display for item requirements so it is now Held/Needed.
* - Preparations for compatibility for Class Change Core.
*
* Version 1.01:
* - Added an actor refresh to learn and forget skills.
*
* Version 1.00:
* - Finished Plugin!
*/
//=============================================================================
//=============================================================================
// Parameter Variables
//=============================================================================
Yanfly.Parameters = PluginManager.parameters('YEP_SkillLearnSystem');
Yanfly.Param = Yanfly.Param || {};
Yanfly.Param.SLSCommand = String(Yanfly.Parameters['Learn Command']);
Yanfly.Param.SLSShowLearn = String(Yanfly.Parameters['Show Command']);
Yanfly.Param.SLSShowLearn = eval(Yanfly.Param.SLSShowLearn);
Yanfly.Param.SLSEnableLearn = String(Yanfly.Parameters['Enable Command']);
Yanfly.Param.SLSEnableLearn = eval(Yanfly.Param.SLSEnableLearn);
Yanfly.Param.SLSIntegrate = String(Yanfly.Parameters['Integrate']);
Yanfly.Param.SLSIntegrate = eval(Yanfly.Param.SLSIntegrate);
Yanfly.Param.SLSConfirmWin = eval(String(Yanfly.Parameters['Confirm Window']));
Yanfly.Param.SLSConfirmText = String(Yanfly.Parameters['Confirm Text']);
Yanfly.Param.SLSConfirmYes = String(Yanfly.Parameters['Confirm Yes']);
Yanfly.Param.SLSConfirmNo = String(Yanfly.Parameters['Confirm No']);
Yanfly.Param.SLSLearnText = String(Yanfly.Parameters['Learned Text']);
Yanfly.Param.SLSLearnSize = Number(Yanfly.Parameters['Learned Size']);
Yanfly.Param.SLSLearnCost = String(Yanfly.Parameters['Learn Cost']);
Yanfly.Param.SLSCostSize = Number(Yanfly.Parameters['Cost Size']);
Yanfly.Param.SLSItemCostFmt = String(Yanfly.Parameters['Item Cost']);
Yanfly.Param.SLSGoldWindow = String(Yanfly.Parameters['Show Gold Window']);
Yanfly.Param.SLSGoldWindow = eval(Yanfly.Param.SLSGoldWindow);
Yanfly.Param.SLSDefaultGold = Number(Yanfly.Parameters['Default Gold Cost']);
Yanfly.Param.SLSDefaultJp = Number(Yanfly.Parameters['Default JP Cost']);
//=============================================================================
// DataManager
//=============================================================================
Yanfly.SLS.DataManager_isDatabaseLoaded = DataManager.isDatabaseLoaded;
DataManager.isDatabaseLoaded = function() {
if (!Yanfly.SLS.DataManager_isDatabaseLoaded.call(this)) return false;
if (!Yanfly._loaded_YEP_SkillLearnSystem) {
this.processSLSNotetagsI($dataItems);
this.processSLSNotetagsW($dataWeapons);
this.processSLSNotetagsA($dataArmors);
this.processSLSNotetags1($dataClasses);
this.processSLSNotetags2($dataSkills);
Yanfly._loaded_YEP_SkillLearnSystem = true;
}
return true;
};
DataManager.processSLSNotetagsI = function(group) {
if (Yanfly.ItemIdRef) return;
Yanfly.ItemIdRef = {};
for (var n = 1; n < group.length; n++) {
var obj = group[n];
if (obj.name.length <= 0) continue;
Yanfly.ItemIdRef[obj.name.toUpperCase()] = n;
}
};
DataManager.processSLSNotetagsW = function(group) {
if (Yanfly.WeaponIdRef) return;
Yanfly.WeaponIdRef = {};
for (var n = 1; n < group.length; n++) {
var obj = group[n];
if (obj.name.length <= 0) continue;
Yanfly.WeaponIdRef[obj.name.toUpperCase()] = n;
}
};
DataManager.processSLSNotetagsA = function(group) {
if (Yanfly.ArmorIdRef) return;
Yanfly.ArmorIdRef = {};
for (var n = 1; n < group.length; n++) {
var obj = group[n];
if (obj.name.length <= 0) continue;
Yanfly.ArmorIdRef[obj.name.toUpperCase()] = n;
}
};
DataManager.processSLSNotetags1 = function(group) {
var note1 = /<(?:LEARN SKILL|learn skills):[ ]*(\d+(?:\s*,\s*\d+)*)>/i;
var note2 =
/<(?:LEARN SKILL|learn skills):[ ](\d+)[ ](?:THROUGH|to)[ ](\d+)>/i;
for (var n = 1; n < group.length; n++) {
var obj = group[n];
var notedata = obj.note.split(/[\r\n]+/);
obj.learnSkills = [];
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.learnSkills = obj.learnSkills.concat(array);
} else if (line.match(note2)) {
var range = Yanfly.Util.getRange(parseInt(RegExp.$1),
parseInt(RegExp.$2));
obj.learnSkills = obj.learnSkills.concat(range);
}
}
}
};
DataManager.processSLSNotetags2 = function(group) {
var note1 = /<(?:LEARN COST)>/i;
var note2 = /<\/(?:LEARN COST)>/i;
var note3 = /<(?:LEARN COST):[ ](\d+)[ ](?:GOLD)>/i;
var note4 = /<(?:LEARN COST):[ ](\d+)[ ](?:JP)>/i;
var note5 = /<(?:LEARN REQUIRE LEVEL):[ ](\d+)>/i;
var note6 = /<(?:LEARN REQUIRE SKILL):[ ]*(\d+(?:\s*,\s*\d+)*)>/i;
var note7 = /<(?:LEARN REQUIRE SKILL):[ ](\d+)[ ](?:THROUGH|to)[ ](\d+)>/i;
var note8 = /<(?:LEARN REQUIRE SWITCH):[ ]*(\d+(?:\s*,\s*\d+)*)>/i;
var note9 = /<(?:LEARN REQUIRE SWITCH):[ ](\d+)[ ](?:THROUGH|to)[ ](\d+)>/i;
var note10 = /<(?:LEARN REQUIRE EVAL)>/i;
var note11 = /<\/(?:LEARN REQUIRE EVAL)>/i;
var note12 = /<(?:LEARN COST EVAL)>/i;
var note13 = /<\/(?:LEARN COST EVAL)>/i;
var note14 = /<(?:LEARN CUSTOM TEXT)>/i;
var note15 = /<\/(?:LEARN CUSTOM TEXT)>/i;
var note16 = /<(?:LEARN SHOW EVAL)>/i;
var note17 = /<\/(?:LEARN SHOW EVAL)>/i;
for (var n = 1; n < group.length; n++) {
var obj = group[n];
var notedata = obj.note.split(/[\r\n]+/);
obj.learnCost = [];
obj.learnCostGold = Yanfly.Param.SLSDefaultGold;
obj.learnCostJp = Yanfly.Param.SLSDefaultJp;
obj.learnRequireLevel = 0;
obj.learnRequireSkill = [];
obj.learnRequireSwitch = [];
obj.learnRequireEval = '';
obj.learnCostEval = '';
obj.learnShowEval = '';
obj.learnCustomText = '';
var mode = 'none';
obj.customLearnJpCostEval = '';
for (var i = 0; i < notedata.length; i++) {
var line = notedata[i];
if (line.match(note1)) {
mode = 'learn';
} else if (line.match(note2)) {
mode = 'none';
} else if (mode === 'learn') {
this.addLearnSkillCost(obj, line);
} else if (line.match(note3)) {
obj.learnCostGold = parseInt(RegExp.$1);
} else if (line.match(note4)) {
obj.learnCostJp = parseInt(RegExp.$1);
} else if (line.match(note5)) {
obj.learnRequireLevel = parseInt(RegExp.$1);
} else if (line.match(note6)) {
var array = JSON.parse('[' + RegExp.$1.match(/\d+/g) + ']');
obj.learnRequireSkill = obj.learnRequireSkill.concat(array);
} else if (line.match(note7)) {
var range = Yanfly.Util.getRange(parseInt(RegExp.$1),
parseInt(RegExp.$2));
obj.learnRequireSkill = obj.learnRequireSkill.concat(range);
} else if (line.match(note8)) {
var array = JSON.parse('[' + RegExp.$1.match(/\d+/g) + ']');
obj.learnRequireSwitch = obj.learnRequireSwitch.concat(array);
} else if (line.match(note9)) {
var range = Yanfly.Util.getRange(parseInt(RegExp.$1),
parseInt(RegExp.$2));
obj.learnRequireSwitch = obj.learnRequireSwitch.concat(range);
} else if (line.match(note10)) {
mode = 'learnRequireEval';
} else if (line.match(note11)) {
mode = 'none';
} else if (line.match(note12)) {
mode = 'learnCostEval';
} else if (line.match(note13)) {
mode = 'none';
} else if (line.match(note14)) {
mode = 'learnCustomText';
} else if (line.match(note15)) {
mode = 'none';
} else if (line.match(note16)) {
mode = 'learnShowEval';
} else if (line.match(note17)) {
mode = 'none';
} else if (mode === 'learnRequireEval') {
obj.learnRequireEval = obj.learnRequireEval + line + '\n';
} else if (mode === 'learnCostEval') {
obj.learnCostEval = obj.learnCostEval + line + '\n';
} else if (mode === 'learnCustomText') {
obj.learnCustomText = obj.learnCustomText + line + '\n';
} else if (mode === 'learnShowEval') {
obj.learnShowEval = obj.learnShowEval + line + '\n';
} else if (line.match(/<(?:CUSTOM LEARN JP COST)>/i)) {
mode = 'customLearnJpCost';
} else if (line.match(/<\/(?:CUSTOM LEARN JP COST)>/i)) {
mode = 'none';
} else if (mode === 'customLearnJpCost') {
obj.customLearnJpCostEval = obj.customLearnJpCostEval + line + '\n';
}
}
}
};
DataManager.addLearnSkillCost = function(obj, line) {
if (!obj) return;
if (!line) return;
if (line.match(/ITEM[ ](\d+):[ ](\d+)/i)) {
var item = $dataItems[parseInt(RegExp.$1)];
if (!item) return;
if (Imported.YEP_ItemCore && DataManager.isIndependent(item)) return;
obj.learnCost.push(line);
} else if (line.match(/WEAPON[ ](\d+):[ ](\d+)/i)) {
var item = $dataWeapons[parseInt(RegExp.$1)];
if (!item) return;
if (Imported.YEP_ItemCore && DataManager.isIndependent(item)) return;
obj.learnCost.push(line);
} else if (line.match(/ARMOR[ ](\d+):[ ](\d+)/i)) {
var item = $dataArmors[parseInt(RegExp.$1)];
if (!item) return;
if (Imported.YEP_ItemCore && DataManager.isIndependent(item)) return;
obj.learnCost.push(line);
} else if (line.match(/GOLD:[ ](\d+)/i)) {
obj.learnCostGold = parseInt(RegExp.$1);
} else if (line.match(/JP:[ ](\d+)/i)) {
obj.learnCostJp = parseInt(RegExp.$1);
} else if (line.match(/(.*):[ ](\d+)/i)) {
var name = String(RegExp.$1).toUpperCase();
var amount = parseInt(RegExp.$2);
if (Yanfly.ItemIdRef[name]) {
var id = Yanfly.ItemIdRef[name];
var item = $dataItems[id];
if (!item) return;
if (Imported.YEP_ItemCore && DataManager.isIndependent(item)) return;
obj.learnCost.push('ITEM ' + id + ': ' + amount);
} else if (Yanfly.WeaponIdRef[name]) {
var id = Yanfly.WeaponIdRef[name];
var item = $dataWeapons[id];
if (!item) return;
if (Imported.YEP_ItemCore && DataManager.isIndependent(item)) return;
obj.learnCost.push('WEAPON ' + id + ': ' + amount);
} else if (Yanfly.ArmorIdRef[name]) {
var id = Yanfly.ArmorIdRef[name];
var item = $dataArmors[id];
if (!item) return;
if (Imported.YEP_ItemCore && DataManager.isIndependent(item)) return;
obj.learnCost.push('ARMOR ' + id + ': ' + amount);
}
}
};
//=============================================================================
// Game_System
//=============================================================================
Yanfly.SLS.Game_System_initialize = Game_System.prototype.initialize;
Game_System.prototype.initialize = function() {
Yanfly.SLS.Game_System_initialize.call(this);
this.initSkillLearnSystem();
};
Game_System.prototype.initSkillLearnSystem = function() {
this._showLearnSkill = Yanfly.Param.SLSShowLearn;
this._enableLearnSkill = Yanfly.Param.SLSEnableLearn;
};
Game_System.prototype.isShowLearnSkill = function() {
if (this._showLearnSkill === undefined) this.initSkillLearnSystem();
return this._showLearnSkill;
};
Game_System.prototype.isEnableLearnSkill = function() {
if (this._enableLearnSkill === undefined) this.initSkillLearnSystem();
return this._enableLearnSkill;
};
//=============================================================================
// Game_Actor
//=============================================================================
Game_Actor.prototype.availableClasses = function() {
if (!Imported.YEP_ClassChangeCore) return 1;
return this.unlockedClasses().length;
};
Game_Actor.prototype.sufficientJpLearnSkill = function(skill, classId) {
if (!skill) return false;
if (!Imported.YEP_JobPoints) return true;
var jpCost = skill.learnCostJp;
jpCost += this.customLearnSkillJpCost(skill);
if (this.currentClass().learnSkills.contains(skill.id)) {
if (this.jp(classId) >= jpCost) return true;
}
if (Imported.YEP_ClassChangeCore && Yanfly.Param.SLSIntegrate) {
for (var i = 0; i < this.unlockedClasses().length; ++i) {
classId = this.unlockedClasses()[i];
if (!$dataClasses[classId]) continue;
if (!$dataClasses[classId].learnSkills.contains(skill.id)) continue;
if (this.jp(classId) >= jpCost) return true;
}
} else if (Imported.YEP_ClassChangeCore && $dataClasses[classId]) {
if ($dataClasses[classId].learnSkills.contains(skill.id)) {
if (this.jp(classId) >= jpCost) return true;
}
}
return false;
};
Game_Actor.prototype.isLearnedSkillRaw = function(skillId) {
return this._skills.contains(skillId);
};
Game_Actor.prototype.canLearnSkill = function(skill, classId) {
if (!skill) return false;
if (skill.learnCostGold > $gameParty.gold()) return false;
if (!this.sufficientJpLearnSkill(skill, classId)) return false;
if (!$gameParty.sufficientItemLearnSkill(skill)) return false;
return true;
};
Yanfly.SLS.Game_Actor_releaseUnequippableItems =
Game_Actor.prototype.releaseUnequippableItems;
Game_Actor.prototype.releaseUnequippableItems = function(forcing) {
if (Yanfly.SLS.PreventReleaseItem) return;
Yanfly.SLS.Game_Actor_releaseUnequippableItems.call(this, forcing);
};
Game_Actor.prototype.customLearnSkillJpCost = function(skill) {
if (!skill) return 0;
if (skill.customLearnJpCostEval === '') return 0;
var cost = 0;
var item = skill;
var a = this;
var b = this;
var user = this;
var target = this;
var s = $gameSwitches._data;
var v = $gameVariables._data;
var code = skill.customLearnJpCostEval;
try {
eval(code);
} catch (e) {
Yanfly.Util.displayError(e, code, 'CUSTOM SKILL LEARN JP COST ERROR');
}
return cost;
};
//=============================================================================
// Game_Party
//=============================================================================
Game_Party.prototype.sufficientItemLearnSkill = function(skill) {
if (!skill) return false;
for (var i = 0; i < skill.learnCost.length; ++i) {
var line = skill.learnCost[i];
var obj = null;
var value = 0;
if (line.match(/ITEM[ ](\d+):[ ](\d+)/i)) {
obj = $dataItems[parseInt(RegExp.$1)];
value = parseInt(RegExp.$2);
} else if (line.match(/WEAPON[ ](\d+):[ ](\d+)/i)) {
obj = $dataWeapons[parseInt(RegExp.$1)];
value = parseInt(RegExp.$2);
} else if (line.match(/ARMOR[ ](\d+):[ ](\d+)/i)) {
obj = $dataArmors[parseInt(RegExp.$1)];
value = parseInt(RegExp.$2);
}
if (!obj) continue;
if (value > $gameParty.numItems(obj)) return false;
}
return true;
};
Game_Party.prototype.processLearnSkillCost = function(skill) {
if (!skill) return false;
for (var i = 0; i < skill.learnCost.length; ++i) {
var line = skill.learnCost[i];
var obj = null;
var value = 0;
if (line.match(/ITEM[ ](\d+):[ ](\d+)/i)) {
obj = $dataItems[parseInt(RegExp.$1)];
value = parseInt(RegExp.$2);
} else if (line.match(/WEAPON[ ](\d+):[ ](\d+)/i)) {
obj = $dataWeapons[parseInt(RegExp.$1)];
value = parseInt(RegExp.$2);
} else if (line.match(/ARMOR[ ](\d+):[ ](\d+)/i)) {
obj = $dataArmors[parseInt(RegExp.$1)];
value = parseInt(RegExp.$2);
}
if (!obj) continue;
$gameParty.loseItem(obj, value, false);
}
return true;
};
Yanfly.SLS.Game_Party_setupBattleTest = Game_Party.prototype.setupBattleTest;
Game_Party.prototype.setupBattleTest = function() {
Yanfly.SLS.Game_Party_setupBattleTest.call(this);
this.setupLearnSkillBattleTest();
};
Game_Party.prototype.setupLearnSkillBattleTest = function() {
for (var i = 0; i < this.members().length; ++i) {
var actor = this.members()[i];
if (!actor) continue;
var classData = actor.currentClass();
for (var j = 0; j < classData.learnSkills.length; ++j) {
var skillId = classData.learnSkills[j];
if (!$dataSkills[skillId]) continue;
if ($dataSkills[skillId].name === '') continue;
actor.learnSkill(skillId);
}
actor.refresh();
}
};
//=============================================================================
// Game_Interpreter
//=============================================================================
Yanfly.SLS.Game_Interpreter_pluginCommand =
Game_Interpreter.prototype.pluginCommand;
Game_Interpreter.prototype.pluginCommand = function(command, args) {
Yanfly.SLS.Game_Interpreter_pluginCommand.call(this, command, args)
if (command === 'ShowLearnSkill') $gameSystem._showLearnSkill = true;
if (command === 'HideLearnSkill') $gameSystem._showLearnSkill = false;
if (command === 'EnableLearnSkill') $gameSystem._enableLearnSkill = true;
if (command === 'DisableLearnSkill') $gameSystem._enableLearnSkill = false;
if (command === 'OpenLearnSkill') this.openLearnSkill(args);
};
Game_Interpreter.prototype.openLearnSkill = function(args) {
if ($gameParty.inBattle()) return;
if (!args) return;
if (!args[0]) return;
if (args[0].toLowerCase() === 'actor') {
var actorId = parseInt(args[1]);
var actor = $gameActors.actor(actorId)
} else if (args[0].toLowerCase() === 'party') {
var index = parseInt(args[1]) - 1;
index = index.clamp(0, $gameParty.members().length - 1);
var actor = $gameParty.members()[index];
} else {
return;
}
ImageManager.loadFace(actor.faceName());
this.loadPartyFaces();
$gameParty.setMenuActor(actor);
SceneManager.push(Scene_LearnSkill);
};
Game_Interpreter.prototype.loadPartyFaces = function() {
for (var i = 0; i < $gameParty.members().length; ++i) {
var actor = $gameParty.members()[i];
if (actor) ImageManager.loadFace(actor.faceName());
}
};
//=============================================================================
// Window_SkillType
//=============================================================================
Yanfly.SLS.Window_SkillType_makeCommandList =
Window_SkillType.prototype.makeCommandList;
Window_SkillType.prototype.makeCommandList = function() {
Yanfly.SLS.Window_SkillType_makeCommandList.call(this);
if (this.findExt('learnSkills') === -1) this.addLearnSkillsCommand();
};
Window_SkillType.prototype.addLearnSkillsCommand = function() {
if (!$gameSystem.isShowLearnSkill()) return;
var name = Yanfly.Param.SLSCommand;
var enabled = $gameSystem.isEnableLearnSkill();
this.addCommand(name, 'skill', enabled, 'learnSkills');
};
Window_SkillType.prototype.setClassListWindow = function(classWindow) {
this._classListWindow = classWindow;
};
Window_SkillType.prototype.setSkillLearnWindow = function(learnWindow) {
this._skillLearnWindow = learnWindow;
};
Window_SkillType.prototype.setGoldWindow = function(goldWindow) {
this._goldWindow = goldWindow;
};
Window_SkillType.prototype.setSkillLearnDataWindow = function(learnDataWindow) {
this._skillLearnDataWindow = learnDataWindow;
this.update();
};
Yanfly.SLS.Window_SkillType_update = Window_SkillType.prototype.update;
Window_SkillType.prototype.update = function() {
if (this.currentExt() === 'learnSkills' && this._actor) {
Window_Command.prototype.update.call(this);
if (this.isSkillLearnIntegrated()) {
this._classListWindow.show();
} else if (this._skillLearnWindow) {
this._skillLearnWindow.show();
}
this._skillWindow.hide();
if (this._goldWindow) this._goldWindow.show();
this._skillLearnDataWindow.show();
} else {
Yanfly.SLS.Window_SkillType_update.call(this);
this._skillWindow.show();
if (this._classListWindow) this._classListWindow.hide();
if (this._skillLearnWindow) this._skillLearnWindow.hide();
if (this._goldWindow) this._goldWindow.hide();
if (this._skillLearnDataWindow) this._skillLearnDataWindow.hide();
}
};
Window_SkillType.prototype.isSkillLearnIntegrated = function() {
if (!this._classListWindow) return false;
if (this._actor.availableClasses() <= 1) return false;
return Yanfly.Param.SLSIntegrate;
};
//=============================================================================
// Window_SkillLearn
//=============================================================================
function Window_SkillLearn() {
this.initialize.apply(this, arguments);
}
Window_SkillLearn.prototype = Object.create(Window_SkillList.prototype);
Window_SkillLearn.prototype.constructor = Window_SkillLearn;
Window_SkillLearn.prototype.maxCols = function() {
return 1;
};
Window_SkillLearn.prototype.setActor = function(actor) {
if (this._actor === actor) return;
this.contents.clear();
this.setClass(null);
this._actor = actor;
this.refresh();
this.resetScroll();
this.setClass(this._actor.currentClass().id);
};
Window_SkillLearn.prototype.setClass = function(classId) {
if (this._classId === classId) return;
this._classId = classId;
this.makeItemList();
this.refresh();
};
Window_SkillLearn.prototype.getClass = function() {
return $dataClasses[this._classId];
};
Window_SkillLearn.prototype.makeItemList = function() {
if (this._actor && this.getClass()) {
this.createSkillLearnData();
} else {
this._data = [];
}
};
Window_SkillLearn.prototype.createSkillLearnData = function() {
this._data = [];
for (var i = 0; i < this.getClass().learnSkills.length; ++i) {
var skillId = this.getClass().learnSkills[i];
var skill = $dataSkills[skillId];
if (skill && this.includes(skill)) this._data.push(skill);
}
this._data = this._data.sort(function(a, b) { return a.id - b.id; });
this._data = this._data.filter(Yanfly.Util.onlyUnique);
};
Window_SkillLearn.prototype.includes = function(skill) {
if (skill.name === '') return false;
if (!this.meetsRequirements(skill)) return false;
return true;
};
Window_SkillLearn.prototype.meetsRequirements = function(skill) {
var evalValue = this.getEvalLine(skill.learnShowEval);
if (evalValue !== undefined) return evalValue;
if (Imported.YEP_ClassChangeCore) {
var classLevel = this._actor.classLevel(this._classId);
if (skill.learnRequireLevel > classLevel) return false;
} else {
if (skill.learnRequireLevel > this._actor.level) return false;
}
for (var i = 0; i < skill.learnRequireSkill.length; ++i) {
var skillId = skill.learnRequireSkill[i];
if (!$dataSkills[skillId]) continue;
if (!this._actor.isLearnedSkillRaw(skillId)) return false;
}
for (var i = 0; i < skill.learnRequireSwitch.length; ++i) {
var switchId = skill.learnRequireSwitch[i];
if (!$gameSwitches.value(switchId)) return false;
}
return true;
};
Window_SkillLearn.prototype.isEnabled = function(item) {
if (!this._actor) return false;
if (!item) return false;
if (this._actor.isLearnedSkillRaw(item.id)) return false;
if ($gamePlayer.isDebugThrough()) return true;
if (!this._actor.canLearnSkill(item, this._classId)) return false;
if (!this.meetsRequirements(item)) return false;
var evalValue = this.getEvalLine(item.learnRequireEval);
if (evalValue !== undefined) return evalValue;
return true;
};
Window_SkillLearn.prototype.getEvalLine = function(evalLine) {
if (evalLine.length <= 0) return undefined;
var value = undefined;
var a = this._actor;
var user = this._actor;
var subject = this._actor;
var s = $gameSwitches._data;
var v = $gameVariables._data;
var code = evalLine;
try {
eval(code);
} catch (e) {
Yanfly.Util.displayError(e, code, 'SKILL LEARN EVAL LINE ERROR');
}
return value;
};
Window_SkillLearn.prototype.drawItem = function(index) {
var skill = this._data[index];
if (!skill) return;
var rect = this.itemRect(index);
rect.width -= this.textPadding();
this.changePaintOpacity(this.isEnabled(skill));
this.drawItemName(skill, rect.x, rect.y, rect.width);
this.drawItemLearned(skill, rect.x, rect.y, rect.width);
this.changePaintOpacity(true);
};
Window_SkillLearn.prototype.drawItemLearned = function(skill, wx, wy, ww) {
if (!this._actor.isLearnedSkillRaw(skill.id)) {
this.drawSkillCost(skill, wx, wy, ww);
return;
}
var text = Yanfly.Param.SLSLearnText;
this.contents.fontSize = Yanfly.Param.SLSLearnSize;
this.drawText(text, wx, wy, ww, 'right');
this.resetFontSettings();
};
Window_SkillLearn.prototype.setDataWindow = function(learnDataWindow) {
this._skillLearnDataWindow = learnDataWindow;
this.update();
};
Window_SkillLearn.prototype.update = function() {
Window_SkillList.prototype.update.call(this);
if (this._skillLearnDataWindow && this.item()) {
this._skillLearnDataWindow.setSkill(this.item());
if (this._classId) this._skillLearnDataWindow.setClass(this._classId);
}
};
//=============================================================================
// Window_SkillLearnClass
//=============================================================================
if (Imported.YEP_ClassChangeCore) {
function Window_SkillLearnClass() {
this.initialize.apply(this, arguments);
}
Window_SkillLearnClass.prototype = Object.create(Window_ClassList.prototype);
Window_SkillLearnClass.prototype.constructor = Window_SkillLearnClass;
Window_SkillLearnClass.prototype.initialize = function(x, y, width, height) {
Window_ClassList.prototype.initialize.call(this, x, y, width, height);
this._skill = null;
};
Window_SkillLearnClass.prototype.setSkill = function(skill) {
if (this._skill === skill) return;
this._skill = skill;
this.refresh();
this.resetScroll();
};
Window_SkillLearnClass.prototype.makeItemList = function() {
if (this._actor && this._skill) {
this._data = [];
for (var i = 0; i < this._actor.unlockedClasses().length; ++i) {
var classId = this._actor.unlockedClasses()[i];
var item = $dataClasses[classId];
if (!item) continue;
if (item.learnSkills.contains(this._skill.id)) {
this._data.push(classId);
}
}
} else {
this._data = [];
}
this._data.sort(function(a, b) { return a - b });
};
Window_SkillLearnClass.prototype.isEnabled = function(classId) {
if (!this._skill) return false;
var item = $dataClasses[classId];
if (!item) return false;
if (Imported.YEP_JobPoints) {
var jpCost = this._skill.learnCostJp;
jpCost += this._actor.customLearnSkillJpCost(this._skill);
if (jpCost > this._actor.jp(item.id)) return false;
}
return Window_ClassList.prototype.isEnabled.call(this, classId);
};
Window_SkillLearnClass.prototype.drawClassLevel = function(item, wx, wy, ww) {
if (!Imported.YEP_JobPoints) return;
var value = Yanfly.Util.toGroup(this._actor.jp(item.id));
var icon = '\\i[' + Yanfly.Icon.Jp + ']';
var fmt = Yanfly.Param.JpMenuFormat;
var text = fmt.format(value, Yanfly.Param.Jp, icon);
this.resetFontSettings();
this.changeTextColor(this.normalColor());
this.contents.fontSize = Yanfly.Param.CCCLvFontSize;
wx += ww - this.textWidthEx(text);
this.drawTextEx(text, wx, wy);
};
Window_SkillLearnClass.prototype.selectLast = function() {
this._index = this._data.indexOf(this._actor._classId);
if (this._index < 0) this._index = 0;
this.select(this._index);
};
} // Imported.YEP_ClassChangeCore
//=============================================================================
// Window_SkillLearnData
//=============================================================================
function Window_SkillLearnData() {
this.initialize.apply(this, arguments);
}
Window_SkillLearnData.prototype = Object.create(Window_Base.prototype);
Window_SkillLearnData.prototype.constructor = Window_SkillLearnData;
Window_SkillLearnData.prototype.initialize = function(wx, wy, ww, wh) {
Window_Base.prototype.initialize.call(this, wx, wy, ww, wh);
this._actor = null;
this._classId = null;
this._skill = null;
this.refresh();
};
Window_SkillLearnData.prototype.setActor = function(actor) {
if (this._actor === actor) return;
this.setClass(null);
this.setSkill(null);
this.contents.clear();
this._actor = actor;
this.refresh();
};
Window_SkillLearnData.prototype.setClass = function(classId) {
if (this._classId === classId) return;
this._classId = classId;
this.refresh();
};
Window_SkillLearnData.prototype.setSkill = function(skill) {
if (this._skill === skill) return;
this._skill = skill;
this.refresh();
};
Window_SkillLearnData.prototype.refresh = function() {
this.contents.clear();
this.resetFontSettings();
this.resetTextColor();
this.drawDarkRectangles();
if (!this._skill) return;
this.drawSkillData();
};
Window_SkillLearnData.prototype.drawDarkRectangles = function(dx, dy, dw, dh) {
var wx = 0;
var wy = 0;
var ww = this.contents.width;
var wh = this.lineHeight();
for (;;) {
if (wy + wh > this.contents.height) break;
this.drawDarkRect(wx, wy, ww, wh);
wy += this.lineHeight();
}
};
Window_SkillLearnData.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_SkillLearnData.prototype.drawSkillData = function() {
this.drawItemName(this._skill, 0, 0, this.contents.width);
var wy = this.lineHeight();
wy = this.drawRequirements(wy);
wy = this.drawCostText(wy);
wy = this.drawGoldCosts(wy);
wy = this.drawJpCosts(wy);
wy = this.drawOtherCosts(wy);
wy = this.drawCustomText(wy);
return wy;
};
Window_SkillLearnData.prototype.drawRequirements = function(wy) {
return wy;
};
Window_SkillLearnData.prototype.drawCostText = function(wy) {
if (!this.hasLearnCost()) return wy;
var text = Yanfly.Param.SLSLearnCost;
this.changeTextColor(this.systemColor());
this.drawText(text, 0, wy, this.contents.width, 'center');
wy += this.lineHeight();
return wy;
};
Window_SkillLearnData.prototype.hasLearnCost = function() {
if (this._skill.learnCostGold > 0) return true;
if (Imported.YEP_JobPoints) {
var cost = this._skill.learnCostJp;
cost += this._actor.customLearnSkillJpCost(this._skill);
return cost > 0;
}
if (this._skill.learnCost.length > 0) return true;
return false;
};
Window_SkillLearnData.prototype.drawGoldCosts = function(wy) {
if (this._skill.learnCostGold <= 0) return wy;
var text = '';
if (Imported.YEP_CoreEngine && Yanfly.Icon.Gold > 0) {
text = '\\i[' + Yanfly.Icon.Gold + ']';
}
text += TextManager.currencyUnit;
var wx = this.drawTextEx(text, 0, wy);
var ww = this.contents.width - wx - 4;
var costText = Yanfly.Util.toGroup(this._skill.learnCostGold);
this.contents.fontSize = Yanfly.Param.SLSCostSize;
if (this._skill.learnCostGold > $gameParty.gold()) {
this.changeTextColor(this.powerDownColor());
} else {
this.changeTextColor(this.powerUpColor());
}
this.drawText(costText, wx, wy, ww, 'right');
this.resetFontSettings();
this.resetTextColor();
wy += this.lineHeight();
return wy;
};
Window_SkillLearnData.prototype.drawJpCosts = function(wy) {
if (!Imported.YEP_JobPoints) return wy;
var cost = this._skill.learnCostJp;
cost += this._actor.customLearnSkillJpCost(this._skill);
if (cost <= 0) return wy;
var text = '';
if (Yanfly.Icon.Jp > 0) text = '\\i[' + Yanfly.Icon.Jp + ']';
text += Yanfly.Param.Jp;
var wx = this.drawTextEx(text, 0, wy);
var ww = this.contents.width - wx - 4;
var costText = Yanfly.Util.toGroup(cost);
this.contents.fontSize = Yanfly.Param.SLSCostSize;
if (this._actor.sufficientJpLearnSkill(this._skill, this._classId)) {
this.changeTextColor(this.powerUpColor());
} else {
this.changeTextColor(this.powerDownColor());
}
this.drawText(costText, wx, wy, ww, 'right');
this.resetFontSettings();
this.resetTextColor();
wy += this.lineHeight();
return wy;
};
Window_SkillLearnData.prototype.drawOtherCosts = function(wy) {
if (this._skill.learnCost.length <= 0) return wy;
for (var i = 0; i < this._skill.learnCost.length; ++i) {
if (wy + this.lineHeight() > this.contents.height) break;
this.resetFontSettings();
this.resetTextColor();
var ww = this.contents.width;
var line = this._skill.learnCost[i];
var obj = null;
var value = 0;
if (line.match(/ITEM[ ](\d+):[ ](\d+)/i)) {
obj = $dataItems[parseInt(RegExp.$1)];
value = parseInt(RegExp.$2);
} else if (line.match(/WEAPON[ ](\d+):[ ](\d+)/i)) {
obj = $dataWeapons[parseInt(RegExp.$1)];
value = parseInt(RegExp.$2);
} else if (line.match(/ARMOR[ ](\d+):[ ](\d+)/i)) {
obj = $dataArmors[parseInt(RegExp.$1)];
value = parseInt(RegExp.$2);
}
if (!obj) continue;
this.drawItemName(obj, 0, wy, ww);
this.contents.fontSize = Yanfly.Param.SLSCostSize;
var text = '/' + Yanfly.Util.toGroup(value);
this.drawText(text, 0, wy, ww - 4, 'right');
if ($gameParty.numItems(obj) >= value) {
this.changeTextColor(this.powerUpColor());
} else {
this.changeTextColor(this.powerDownColor());
}
ww -= this.textWidth(text);
var held = Yanfly.Util.toGroup($gameParty.numItems(obj))
this.drawText(held, 0, wy, ww - 4, 'right');
this.resetFontSettings();
this.resetTextColor();
wy += this.lineHeight();
}
return wy;
};
Window_SkillLearnData.prototype.drawCustomText = function(wy) {
if (this._skill.learnCustomText === '') return wy;
this.drawTextEx(this._skill.learnCustomText, 4, wy);
return wy;
};
//=============================================================================
// Window_SkillLearnCommand
//=============================================================================
function Window_SkillLearnCommand() {
this.initialize.apply(this, arguments);
}
Window_SkillLearnCommand.prototype = Object.create(Window_Command.prototype);
Window_SkillLearnCommand.prototype.constructor = Window_SkillType;
Window_SkillLearnCommand.prototype.initialize = function(x, y) {
Window_Command.prototype.initialize.call(this, x, y);
this._actor = null;
};
Window_SkillLearnCommand.prototype.windowWidth = function() {
return 240;
};
Window_SkillLearnCommand.prototype.numVisibleRows = function() {
return 4;
};
Window_SkillLearnCommand.prototype.itemTextAlign = function() {
if (Imported.YEP_SkillCore) return Yanfly.Param.SCCTextAlign;
return Window_Command.prototype.itemTextAlign.call(this);
};
Window_SkillLearnCommand.prototype.setActor = function(actor) {
if (this._actor === actor) return;
this.contents.clear();
this._actor = actor;
this.refresh();
};
Window_SkillLearnCommand.prototype.setStatusWindow = function(w) {
this._statusWindow = w;
};
Window_SkillLearnCommand.prototype.setSkillLearnWindow = function(w) {
this._skillLearnWindow = w;
};
Window_SkillLearnCommand.prototype.setSkillLearnDataWindow = function(w) {
this._skillLearnDataWindow = w;
this.update();
};
Window_SkillLearnCommand.prototype.makeCommandList = function() {
if (!this._actor) return;
this.addClassCommand(this._actor.currentClass().id);
this._currentClass = this._actor.currentClass().id;
if (!Imported.YEP_ClassChangeCore) return;
for (var i = 0; i < this._actor.unlockedClasses().length; ++i) {
classId = this._actor.unlockedClasses()[i];
if (classId === this._actor.currentClass().id) continue;
if ($dataClasses[classId]) this.addClassCommand(classId);
}
};
Window_SkillLearnCommand.prototype.addClassCommand = function(classId) {
var actorClass = $dataClasses[classId];
if (!actorClass) return;
var name = actorClass.name;
if (actorClass.useNickname) {
name = this._actor.nickname();
}
this.addCommand(name, 'class', true, classId);
};
Window_SkillLearnCommand.prototype.update = function() {
Window_Command.prototype.update.call(this);
if (this._helpWindow && this.active) {
var classId = this.currentExt();
this._helpWindow.setItem($dataClasses[classId]);
}
if (this._skillLearnWindow) {
var classId = this.currentExt();
this._skillLearnWindow.setClass(classId);
}
if (this._statusWindow && this._currentClassIndex !== this.index()) {
this._currentClassIndex = this.index();
var actor = JsonEx.makeDeepCopy(this._actor);
if (!actor) return;
var classId = this.currentExt();
this._currentClass = this.currentExt();
var hpRate = actor.hp / actor.mhp;
var mpRate = actor.mp / Math.max(1, actor.mmp);
Yanfly.SLS.PreventReleaseItem = true;
if (Imported.YEP_ClassChangeCore) {
actor.changeClass(classId, Yanfly.Param.CCCMaintainLv);
} else {
actor.changeClass(classId, false);
}
var max = actor.isDead() ? 0 : 1;
var hpAmount = Math.max(max, parseInt(actor.mhp * hpRate));
actor.setHp(hpAmount);
actor.setMp(parseInt(actor.mmp * mpRate));
this._statusWindow.setActor(actor);
Yanfly.SLS.PreventReleaseItem = false;
}
};
Yanfly.SLS.Window_Command_drawItem = Window_Command.prototype.drawItem;
Window_SkillLearnCommand.prototype.drawItem = function(index) {
if (Imported.YEP_ClassChangeCore) {
this.drawItemEx(index);
} else {
Yanfly.SLS.Window_Command_drawItem.call(this, index);
}
};
Window_SkillLearnCommand.prototype.drawItemEx = function(index) {
var rect = this.itemRectForText(index);
var align = this.itemTextAlign();
this.resetTextColor();
this.changePaintOpacity(this.isCommandEnabled(index));
var classId = this._list[index].ext;
this.drawIcon($dataClasses[classId].iconIndex, rect.x, rect.y);
rect.x += Window_Base._iconWidth + 4;
rect.width -= Window_Base._iconWidth + 4;
this.drawText(this.commandName(index), rect.x, rect.y, rect.width);
};
//=============================================================================
// Window_SkillLearnConfirm
//=============================================================================
function Window_SkillLearnConfirm() {
this.initialize.apply(this, arguments);
}
Window_SkillLearnConfirm.prototype = Object.create(Window_Command.prototype);
Window_SkillLearnConfirm.prototype.constructor = Window_SkillLearnConfirm;
Window_SkillLearnConfirm.prototype.initialize = function() {
Window_Command.prototype.initialize.call(this, 0, 0);
this.openness = 0;
};
Window_SkillLearnConfirm.prototype.makeCommandList = function() {
this.addCommand(Yanfly.Param.SLSConfirmYes, 'confirm');
this.addCommand(Yanfly.Param.SLSConfirmNo, 'cancel');
};
Window_SkillLearnConfirm.prototype.setData = function(actor, skill) {
var fmt = Yanfly.Param.SLSConfirmText;
this._text = fmt.format(actor.name(), skill.name);
var ww = this.textWidthEx(this._text) + this.standardPadding() * 4;
this.width = ww;
this.refresh();
this.x = (Graphics.boxWidth - this.width) / 2;
this.y = (Graphics.boxHeight - this.height) / 2;
this.drawTextEx(this._text, this.textPadding(), 0);
};
Window_SkillLearnConfirm.prototype.textWidthEx = function(text) {
return this.drawTextEx(text, 0, this.contents.height);
};
Window_SkillLearnConfirm.prototype.itemTextAlign = function() {
return 'center';
};
Window_SkillLearnConfirm.prototype.windowHeight = function() {
return this.fittingHeight(3);
};
Window_SkillLearnConfirm.prototype.itemRect = function(index) {
var rect = Window_Selectable.prototype.itemRect.call(this, index);
rect.y += this.lineHeight();
return rect;
};
//=============================================================================
// Scene_Skill
//=============================================================================
Yanfly.SLS.Scene_Skill_create = Scene_Skill.prototype.create;
Scene_Skill.prototype.create = function() {
Yanfly.SLS.Scene_Skill_create.call(this);
this.createClassListWindow();
this.createSkillLearnWindow();
this.createGoldWindow();
this.createSkillLearnClassWindow();
this.createSkillLearnDataWindow();
};
Yanfly.SLS.Scene_Skill_refreshActor = Scene_Skill.prototype.refreshActor;
Scene_Skill.prototype.refreshActor = function() {
Yanfly.SLS.Scene_Skill_refreshActor.call(this);
var actor = this.actor();
if (this._classListWindow) this._classListWindow.setActor(actor);
if (this._skillLearnWindow) this._skillLearnWindow.setActor(actor);
if (this._skillLearnClassWindow) this._skillLearnClassWindow.setActor(actor);
if (this._skillLearnDataWindow) this._skillLearnDataWindow.setActor(actor);
};
Scene_Skill.prototype.createClassListWindow = function() {
if (!Imported.YEP_ClassChangeCore) return;
if (this._classListWindow) return;
var wx = 0;
var wy = this._statusWindow.y + this._statusWindow.height;
var ww = Graphics.boxWidth / 2;
var wh = Graphics.boxHeight - wy;
this._classListWindow = new Window_ClassList(wx, wy, ww, wh);
this._classListWindow.setHelpWindow(this._helpWindow);
this._classListWindow.setHandler('ok', this.onClassOk.bind(this));
this._classListWindow.setHandler('cancel', this.onClassCancel.bind(this));
this._skillTypeWindow.setClassListWindow(this._classListWindow);
this._classListWindow.hide();
this._classListWindow.setActor(this.actor());
this.addWindow(this._classListWindow);
};
Scene_Skill.prototype.createSkillLearnWindow = function() {
var wx = 0;
var wy = this._statusWindow.y + this._statusWindow.height;
var ww = Graphics.boxWidth / 2;
var wh = Graphics.boxHeight - wy;
this._skillLearnWindow = new Window_SkillLearn(wx, wy, ww, wh);
this._skillLearnWindow.setHelpWindow(this._helpWindow);
this._skillLearnWindow.setHandler('ok', this.onLearnOk.bind(this));
this._skillLearnWindow.setHandler('cancel', this.onLearnCancel.bind(this));
this._skillTypeWindow.setSkillLearnWindow(this._skillLearnWindow);
this._skillLearnWindow.hide();
this._skillLearnWindow.setActor(this.actor());
this._skillLearnWindow.setClass(this.actor().currentClass().id);
this.addWindow(this._skillLearnWindow);
};
Scene_Skill.prototype.createGoldWindow = function() {
if (!Yanfly.Param.SLSGoldWindow) return;
var wx = Graphics.boxWidth / 2;
this._goldWindow = new Window_Gold(wx, 0);
this._goldWindow.width = Graphics.boxWidth / 2;
this._goldWindow.y = Graphics.boxHeight - this._goldWindow.height;
this._skillTypeWindow.setGoldWindow(this._goldWindow);
this._goldWindow.hide();
this._goldWindow.createContents();
this._goldWindow.refresh();
this.addWindow(this._goldWindow);
};
Scene_Skill.prototype.createSkillLearnClassWindow = function() {
if (!Imported.YEP_ClassChangeCore) return;
if (this._skillLearnClassWindow) return;
var wx = 0;
var wy = this._statusWindow.y + this._statusWindow.height;
var ww = Graphics.boxWidth / 2;
var wh = Graphics.boxHeight - wy;
this._skillLearnClassWindow = new Window_SkillLearnClass(wx, wy, ww, wh);
this._skillLearnClassWindow.setHelpWindow(this._helpWindow);
this._skillLearnClassWindow.setHandler('ok',
this.onSLCOk.bind(this));
this._skillLearnClassWindow.setHandler('cancel',
this.onSLCCancel.bind(this));
this._skillLearnClassWindow.hide();
this._skillLearnClassWindow.setActor(this.actor());
this.addWindow(this._skillLearnClassWindow);
};
Scene_Skill.prototype.createSkillLearnDataWindow = function() {
var wx = Graphics.boxWidth / 2;
var wy = this._statusWindow.y + this._statusWindow.height;
var ww = Graphics.boxWidth / 2;
var wh = Graphics.boxHeight - wy;
if (this._goldWindow) wh -= this._goldWindow.height;
this._skillLearnDataWindow = new Window_SkillLearnData(wx, wy, ww, wh);
this._skillTypeWindow.setSkillLearnDataWindow(this._skillLearnDataWindow);
this._skillLearnWindow.setDataWindow(this._skillLearnDataWindow);
this._skillLearnDataWindow.setActor(this.actor());
this._skillLearnDataWindow.hide();
this.addWindow(this._skillLearnDataWindow);
};
Yanfly.SLS.Scene_Skill_commandSkill = Scene_Skill.prototype.commandSkill;
Scene_Skill.prototype.commandSkill = function() {
if (this._skillTypeWindow.currentExt() === 'learnSkills') {
this.commandLearnSkill();
} else {
Yanfly.SLS.Scene_Skill_commandSkill.call(this);
}
};
Scene_Skill.prototype.commandLearnSkill = function() {
if (!eval(Yanfly.Param.SLSIntegrate)) {
SceneManager.push(Scene_LearnSkill);
} else if (this._classListWindow && this.actor().availableClasses() > 1) {
this._classListWindow.activate();
this._classListWindow.selectLast();
} else if (this._skillLearnWindow) {
this._skillLearnWindow.activate();
this._skillLearnWindow.selectLast();
}
};
Scene_Skill.prototype.onClassOk = function() {
var item = this._classListWindow.item();
this._skillLearnWindow.setClass(item);
this._classListWindow.hide();
this._skillLearnWindow.show();
this._skillLearnWindow.activate();
this._skillLearnWindow.selectLast();
};
Scene_Skill.prototype.onClassCancel = function() {
this._classListWindow.deselect();
this._skillTypeWindow.activate();
this._helpWindow.setItem(null);
};
Scene_Skill.prototype.onLearnOk = function() {
var skill = this._skillLearnWindow.item();
if (this.actor().availableClasses() === 1) {
var classId = this.actor().currentClass().id;
this.processLearnSkill(skill, classId);
} else if (this._skillLearnClassWindow) {
this._skillLearnWindow.hide();
this._skillLearnClassWindow.show();
this._skillLearnClassWindow.setSkill(skill);
this._skillLearnClassWindow.activate();
this._skillLearnClassWindow.selectLast();
}
};
Scene_Skill.prototype.processLearnSkill = function(skill, classId) {
this._skillLearnWindow.activate();
this.actor().learnSkill(skill.id);
SoundManager.playUseSkill();
$gameParty.loseGold(skill.learnCostGold);
$gameParty.processLearnSkillCost(skill);
if (Imported.YEP_JobPoints) {
var cost = skill.learnCostJp;
cost += this.actor().customLearnSkillJpCost(skill);
this.actor().loseJp(cost, classId);
}
this.processLearnCostEval(skill, classId);
this.actor().refresh();
this._skillLearnWindow.refresh();
this._skillLearnWindow.updateHelp();
this._statusWindow.refresh();
if (this._goldWindow) this._goldWindow.refresh();
if (this._classListWindow) this._classListWindow.refresh();
this._skillLearnDataWindow.refresh();
this._skillTypeWindow.refresh();
};
Scene_Skill.prototype.processLearnCostEval = function(skill, classId) {
if (skill.learnCostEval === '') return;
var a = this.actor();
var user = this.actor();
var subject = this.actor();
var s = $gameSwitches._data;
var v = $gameVariables._data;
var code = skill.learnCostEval;
try {
eval(code);
} catch (e) {
Yanfly.Util.displayError(e, code, 'SKILL LEARN CUSTOM COST ERROR');
}
};
Scene_Skill.prototype.onLearnCancel = function() {
this._skillLearnWindow.deselect();
this._skillLearnDataWindow.setSkill(null);
if (this._classListWindow && this._actor.availableClasses() > 1) {
this._skillLearnWindow.hide();
this._classListWindow.show();
this._classListWindow.activate();
this._classListWindow.selectLast();
} else {
this._skillTypeWindow.activate();
this._helpWindow.setItem(null);
}
};
Scene_Skill.prototype.onSLCOk = function() {
var skill = this._skillLearnWindow.item();
var classId = this._skillLearnClassWindow.item();
this.processLearnSkill(skill, classId);
this.onSLCCancel();
};
Scene_Skill.prototype.onSLCCancel = function() {
this._skillLearnClassWindow.hide();
this._skillLearnWindow.activate();
this._skillLearnWindow.show();
};
//=============================================================================
// Scene_LearnSkill
//=============================================================================
function Scene_LearnSkill() {
this.initialize.apply(this, arguments);
}
Scene_LearnSkill.prototype = Object.create(Scene_ItemBase.prototype);
Scene_LearnSkill.prototype.constructor = Scene_LearnSkill;
Scene_LearnSkill.prototype.initialize = function() {
Scene_ItemBase.prototype.initialize.call(this);
};
Scene_LearnSkill.prototype.onActorChange = function() {
this.refreshActor();
this.adjustSelection();
};
Scene_LearnSkill.prototype.adjustSelection = function() {
if (Imported.YEP_ClassChangeCore) {
this._commandWindow.activate();
} else {
this.commandClass();
this._commandWindow.deactivate();
}
};
Scene_LearnSkill.prototype.start = function() {
Scene_ItemBase.prototype.start.call(this);
};
Scene_LearnSkill.prototype.create = function() {
Scene_ItemBase.prototype.create.call(this);
this.createHelpWindow();
this.createCommandWindow();
this.createStatusWindow();
this.createSkillLearnWindow();
this.createGoldWindow();
this.createSkillLearnDataWindow();
this.createConfirmWindow();
this.refreshActor();
this.adjustSelection();
};
Scene_LearnSkill.prototype.refreshActor = function() {
var actor = this.actor();
this._commandWindow.setActor(actor);
this._statusWindow.setActor(actor);
this._skillLearnWindow.setActor(actor);
this._skillLearnDataWindow.setActor(actor);
};
Scene_LearnSkill.prototype.createCommandWindow = function() {
var wy = this._helpWindow.height;
this._commandWindow = new Window_SkillLearnCommand(0, wy);
this._commandWindow.setHelpWindow(this._helpWindow);
this._commandWindow.setHandler('class', this.commandClass.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._commandWindow.setHelpWindow(this._helpWindow);
this.addWindow(this._commandWindow);
};
Scene_LearnSkill.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._commandWindow.setStatusWindow(this._statusWindow);
this.addWindow(this._statusWindow);
};
Scene_LearnSkill.prototype.createSkillLearnWindow = function() {
var wx = 0;
var wy = this._statusWindow.y + this._statusWindow.height;
var ww = Graphics.boxWidth / 2;
var wh = Graphics.boxHeight - wy;
this._skillLearnWindow = new Window_SkillLearn(wx, wy, ww, wh);
this._skillLearnWindow.setHelpWindow(this._helpWindow);
this._skillLearnWindow.setHandler('ok', this.onLearnOk.bind(this));
this._skillLearnWindow.setHandler('cancel', this.onLearnCancel.bind(this));
if (!Imported.YEP_ClassChangeCore) {
var win = this._skillLearnWindow
win.setHandler('pagedown', this.onLearnPageDn.bind(this));
win.setHandler('pageup', this.onLearnPageUp.bind(this));
}
this._commandWindow.setSkillLearnWindow(this._skillLearnWindow);
this._skillLearnWindow.setActor(this.actor());
this._skillLearnWindow.setClass(this.actor().currentClass().id);
this.addWindow(this._skillLearnWindow);
};
Scene_LearnSkill.prototype.createGoldWindow = function() {
if (!eval(Yanfly.Param.SLSGoldWindow)) return;
var wx = Graphics.boxWidth / 2;
this._goldWindow = new Window_Gold(wx, 0);
this._goldWindow.width = Graphics.boxWidth / 2;
this._goldWindow.y = Graphics.boxHeight - this._goldWindow.height;
this._goldWindow.createContents();
this._goldWindow.refresh();
this.addWindow(this._goldWindow);
};
Scene_LearnSkill.prototype.createSkillLearnDataWindow = function() {
var wx = Graphics.boxWidth / 2;
var wy = this._statusWindow.y + this._statusWindow.height;
var ww = Graphics.boxWidth / 2;
var wh = Graphics.boxHeight - wy;
if (this._goldWindow) wh -= this._goldWindow.height;
this._skillLearnDataWindow = new Window_SkillLearnData(wx, wy, ww, wh);
this._commandWindow.setSkillLearnDataWindow(this._skillLearnDataWindow);
this._skillLearnWindow.setDataWindow(this._skillLearnDataWindow);
this._skillLearnDataWindow.setActor(this.actor());
this.addWindow(this._skillLearnDataWindow);
};
Scene_LearnSkill.prototype.createConfirmWindow = function() {
this._confirmWindow = new Window_SkillLearnConfirm();
var win = this._confirmWindow;
win.setHandler('confirm', this.onConfirmOk.bind(this));
win.setHandler('cancel', this.onConfirmCancel.bind(this));
this.addWindow(this._confirmWindow);
};
Scene_LearnSkill.prototype.commandClass = function() {
var item = this._commandWindow.currentExt();
this._skillLearnWindow.setClass(item);
this._skillLearnWindow.show();
this._skillLearnWindow.activate();
this._skillLearnWindow.selectLast();
};
Scene_LearnSkill.prototype.onLearnOk = function() {
var skill = this._skillLearnWindow.item();
var classId = this._commandWindow.currentExt();
this.confirmLearnSkill(skill, classId);
};
Scene_LearnSkill.prototype.refreshStatus = function() {
var actor = JsonEx.makeDeepCopy(this.actor());
if (!actor) return;
var classId = this._commandWindow.currentExt();
this._commandWindow._currentClass = this._commandWindow.currentExt();
var hpRate = actor.hp / actor.mhp;
var mpRate = actor.mp / Math.max(1, actor.mmp);
Yanfly.SLS.PreventReleaseItem = true;
if (Imported.YEP_ClassChangeCore) {
actor.changeClass(classId, Yanfly.Param.CCCMaintainLv);
} else {
actor.changeClass(classId, false);
}
var max = actor.isDead() ? 0 : 1;
var hpAmount = Math.max(max, parseInt(actor.mhp * hpRate));
actor.setHp(hpAmount);
actor.setMp(parseInt(actor.mmp * mpRate));
this._statusWindow.setActor(actor);
Yanfly.SLS.PreventReleaseItem = false;
};
Scene_LearnSkill.prototype.processLearnSkill = function(skill, classId) {
this._skillLearnWindow.activate();
this.actor().learnSkill(skill.id);
SoundManager.playUseSkill();
$gameParty.loseGold(skill.learnCostGold);
$gameParty.processLearnSkillCost(skill);
if (Imported.YEP_JobPoints) {
var cost = skill.learnCostJp;
cost += this.actor().customLearnSkillJpCost(skill);
this.actor().loseJp(cost, classId);
}
this.processLearnCostEval(skill, classId);
this.actor().refresh();
this._skillLearnWindow.refresh();
this._skillLearnWindow.updateHelp();
this.refreshStatus();
if (this._goldWindow) this._goldWindow.refresh();
if (this._classListWindow) this._classListWindow.refresh();
this._skillLearnDataWindow.refresh();
this._commandWindow.refresh();
};
Scene_LearnSkill.prototype.confirmLearnSkill = function(skill, classId) {
if (Yanfly.Param.SLSConfirmWin) {
this.startConfirmWindow(skill)
} else {
this.processLearnSkill(skill, classId);
}
};
Scene_LearnSkill.prototype.processLearnCostEval = function(skill, classId) {
if (skill.learnCostEval === '') return;
var a = this.actor();
var user = this.actor();
var subject = this.actor();
var s = $gameSwitches._data;
var v = $gameVariables._data;
var code = skill.learnCostEval;
try {
eval(code);
} catch (e) {
Yanfly.Util.displayError(e, code, 'SKILL LEARN COST ERROR');
}
};
Scene_LearnSkill.prototype.onLearnCancel = function() {
if (Imported.YEP_ClassChangeCore) {
this._skillLearnWindow.deselect();
this._skillLearnDataWindow.setSkill(null);
this._commandWindow.activate();
this._helpWindow.setItem(null);
} else {
this.popScene();
}
};
Scene_LearnSkill.prototype.onLearnPageDn = function() {
this.nextActor();
};
Scene_LearnSkill.prototype.onLearnPageUp = function() {
this.previousActor();
};
Scene_LearnSkill.prototype.startConfirmWindow = function(skill) {
this._confirmWindow.setData(this._actor, skill);
this._confirmWindow.open();
this._confirmWindow.activate();
this._confirmWindow.select(0);
};
Scene_LearnSkill.prototype.onConfirmOk = function() {
var skill = this._skillLearnWindow.item();
var classId = this._commandWindow.currentExt();
this.processLearnSkill(skill, classId);
this._confirmWindow.close();
};
Scene_LearnSkill.prototype.onConfirmCancel = function() {
this._confirmWindow.deactivate();
this._confirmWindow.close();
this._skillLearnWindow.activate();
};
//=============================================================================
// Utilities
//=============================================================================
Yanfly.Util = Yanfly.Util || {};
if (!Yanfly.Util.toGroup) {
Yanfly.Util.toGroup = function(inVal) {
return inVal;
}
};
Yanfly.Util.getRange = function(n, m) {
var result = [];
for (var i = n; i <= m; ++i) result.push(i);
return result;
};
Yanfly.Util.onlyUnique = function(value, index, self) {
return self.indexOf(value) === index;
};
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
//=============================================================================