//============================================================================= // 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 * ============================================================================ * * 通过下述注释来使用技能学习系统。 * * 职业的注释: * * * * 让此职业能够在菜单中学习技能x。如果是第三种情形x to y, * 它允许职业学习从x到y的所有技能,其中x和y是技能的ID。 * * 技能注释: * * 设置学习此技能所要花费的金钱为x。 * * * 设置学习此技能所要花费的JP为x。 * 这一条需要YEP_JobPoints.js插件才能运行。 * * or * Item x: y item name: y * Weapon x: y item name: y * Armor x: y * * 设置学习此技能所要花费的物品、武器和防具,其中x是物品的ID, * y是所需物品的数量。如果你打算用物品的名称作为变量,那么把 * item name换为物品在数据库中的名称。但如果有多个物品的名称 * 相同,那么将会使用ID最大的东西(按照“物品>武器>防具” * 的顺序)作为费用。 * *注意:如果你在使用YEP_ItemCore.js插件及“独立物品” * (Independent Items),那么学习费用将不包括那些独立物品。 * * * 角色等级到达x之后,此技能才会出现在可学习技能的列表上。 * * * * * 角色必须已经掌握其他技能x,此技能才会出现(在列表上)。如果是 * 第三种情形x to y,角色必须已经掌握从x到y的所有技能, * 其中x和/或y是技能的ID。 * * * * * 开关x必须已被打开,此技能才会出现。如果是第三种情形x to y, * 从x到y的所有开关必须已被打开,技能才会出现,其中x和/或y是开关的ID。 * * ============================================================================ * “疯狂模式”——自定义要求和花费 * ============================================================================ * * 如果你只有很少的JavaScript使用经验,并且希望更好地定做技能学习的 * 方法,那么你可以用下列注释: * * 技能的注释: * * * value = true; * value = false; * * 如果想用一串代码来隐藏或显示此技能,你可以使用这些注释。若 * 返回value的值为true,那么即使其它要求不被满足,技能也会出现 * (在列表上)。而若返回value的值为false,那么即使其它 * 要求被满足,技能也不会出现。 * * * value = true; * value = false; * * 给希望通过代码设置自己特定的技能学习要求的人使用。只有返回 * value的值为true,技能才会显示为可学的。请避免使用可以停止 * 后续代码工作的命令。code. * * * code * code * * 如果你熟悉JavaScript,你可以在通过学习技能菜单 * 学习技能之后自定义一些功能。 * * * text * 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: * * * cost = user.level * 100; * * 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 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 Lunatic Mode notetag. Look in the plugin's * helpfile for more details! * * Version 1.09: * - Compatibility update with Class Change Core's notetag. * * Version 1.08: * - Updated for RPG Maker MV version 1.1.0. * * Version 1.07: * - Updated the 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 //=============================================================================