diff --git a/js/plugins/YEP_TargetCore.js b/js/plugins/YEP_TargetCore.js new file mode 100644 index 0000000..9367f41 --- /dev/null +++ b/js/plugins/YEP_TargetCore.js @@ -0,0 +1,1058 @@ +//============================================================================= +// Yanfly Engine Plugins - Target Core +// YEP_TargetCore.js +//============================================================================= + +var Imported = Imported || {}; +Imported.YEP_TargetCore = true; + +var Yanfly = Yanfly || {}; +Yanfly.Target = Yanfly.Target || {}; +Yanfly.Target.version = 1.03; + +//============================================================================= + /*: + * @plugindesc v1.03 目标核心☁️ + * @author Yanfly Engine Plugins + * + * @param ---战斗引擎--- + * @default + * + * @param Everybody Text + * @text 所有人的帮助文本 + * @desc The help text for Everybody scope. + * @default 所有队友和敌人 + * + * @param All But User Text + * @text 除用户帮助文本外的所有文本 + * @desc The help text for all All But User scope. + * %1 - Allies %2 - User + * @default All %1 But %2 + * + * @param Random Any Text + * @text 任意帮助文本 + * @desc The help text used for the Random Any scope. + * %1 - Number + * @default %1 Random + * + * @param ---倍数--- + * @default + * + * @param Multiple Text + * @text 多文本 + * @desc The help text used for Multiple of x scope. + * %1 - Targets %2 - Parameters %3 - Number + * @default %1 with %2 as a Multiple of %3 + * + * @param Multiple Everybody + * @text 多人 + * @desc The text to use for Everybody in this format. + * @default Anyone + * + * @param Multiple Allies + * @text 多个队友 + * @desc The text to use for Allies in this format. + * @default Any Ally + * + * @param Multiple Foes + * @text 多个敌人 + * @desc The text to use for Foes in this format. + * @default Any Foe + * + * @param ---成排--- + * @default + * + * @param Target Row Text + * @text 目标行文本 + * @desc The help text used to target the target's row. + * %1 - Target Name + * @default %1's Row + * + * @param Front Row Text + * @text 前排文字 + * @desc The help text used to target the front row. + * %1 - Target Type + * @default %1 Front Row + * + * @param Back Row Text + * @text 后排文本 + * @desc The help text used to target the back row. + * %1 - Target Type + * @default %1 Back Row + * + * @param Specific Row Text + * @text 特定行文本 + * @desc The help text used to target specific rows. + * %1 - Target Type + * @default Specific %1 Row + * + * @param Row Enemies + * @text 排敌人 + * @desc The help text used for enemies for Row Targets. + * @default Enemy + * + * @param Row Allies + * @text 排队友 + * @desc The help text used for enemies for Row Targets. + * @default Allied + * + * @help + * ============================================================================ + * Introduction + * ============================================================================ + * + * 这个插件独立于YEP_BattleEngineCore.js,如果你想使用额外的效果,请放于 + * YEP_BattleEngineCore.js下面 + * + * 目标核心插件是用来拓展目标范围的。这个插件可以让你使用目标范围,可以结合 + * 编队插件一起使用 + * + * ============================================================================ + * Notetags + * ============================================================================ + * + * 如果你想定义你技能或者物品的攻击范围,可以使用这些标签: + * + * Skill and Item Notetags: + * + * 重复x次 + * This determines the number of times an action is repeatedly used on each + * target. This can go beyond the default editor's limit of 9. + * + * 目标所有人 + * This targets all alive opponent and friendly members with the user being + * the very last target. + * + * 随机目标 + * This adds x random alive opponents and/or allies. + * + * 所有敌方 + * This targets a single foe and then adds all alive opponent members. + * + * 随机敌方 + * This targets a single foe and then adds x random alive opponent members. + * + * 随机敌方 + * This adds x random alive opponent members. This can go beyond the editor's + * default limit of 4 randomf oes. + * + * 除了使用者的其余队友 + * This will target all friendly alive members except for the user. + * + * 所有队友 + * This will target a single ally and then adds all alive friendly members. + * + * 随机队友 + * This will target a single ally and then adds x random alive allies. + * + * 随机角色 + * This adds x random alive allied members. + * + * 符合特定状态的角色 + * Replace 'param' with 'level', 'maxhp', 'maxmp', 'atk', 'def', 'mat', + * 'mdf', 'agi', 'luk', 'hp', 'mp', or 'tp'. This will make the skill or item + * indiscriminately target any living battler on the battlefield whose + * parameter value is a multiple of x. + * *NOTE: If you are using 'level', make sure you have YEP_EnemyLevels.js. + * + * 符合特定状态的队友 + * Replace 'param' with 'level', 'maxhp', 'maxmp', 'atk', 'def', 'mat', + * 'mdf', 'agi', 'luk', 'hp', 'mp', or 'tp'. This will make the skill or item + * target any living allied party member on the battlefield whose parameter + * value is a multiple of x. + * *NOTE: If you are using 'level', make sure you have YEP_EnemyLevels.js. + * + * 符合特定状态的敌方 + * Replace 'param' with 'level', 'maxhp', 'maxmp', 'atk', 'def', 'mat', + * 'mdf', 'agi', 'luk', 'hp', 'mp', or 'tp'. This will make the skill or item + * target any living enemy battler on the battlefield whose parameter value + * is a multiple of x. + * *NOTE: If you are using 'level', make sure you have YEP_EnemyLevels.js. + * + * --- YEP_RowFormation.js and YEP_BattleEngineCore.js Required --- + * + * 目标敌人排 + * This will target the enemy row equal to that of the currently selected + * target enemy. The entire row will be selected as a whole. + * + * 目标敌人x排 + * This will target specifically the enemy row x for the enemy unit. The + * entire row will be selected as a whole. + * + * 目标敌人前 + * This will target the front-most enemy row with alive members. If there is + * a row without any alive members, this will target the next row with an + * alive member. + * + * 目标敌人后排 + * This will target the back-most enemy row with alive members. If there is + * a row without any alive members, this will target the next row with an + * alive member. + * + * 队友排列 + * This will target the enemy row equal to that of the currently selected + * target enemy. The entire row will be selected as a whole. + * + * 队友x排 + * This will target specifically the allied row x for the allied unit. The + * entire row will be selected as a whole. + * + * 队友前排 + * This will target the front-most ally row with alive members. If there is + * a row without any alive members, this will target the next row with an + * alive member. + * + * 队友后排 + * This will target the back-most ally row with alive members. If there is + * a row without any alive members, this will target the next row with an + * alive member. + * + * ============================================================================ + * Lunatic Mode - Custom Target Help Text + * ============================================================================ + * + * For users that are proficient with JavaScript, these notetags can be used to + * provide custom help window text if you are also the Battle Engine Core. + * + * Skill and Item Notetags: + * + * + * text = $gameActors.actor(1).name(); + * text += ' and ' + $gameActors.actor(2).name(); + * + * The 'text' variable is the text that will appear in the help window. Any + * changes made to it will be what is visibly displayed. + * + * ============================================================================ + * Lunatic Mode - Custom Target Eval + * ============================================================================ + * + * For users that are proficient with JavaScript, these notetags can be used to + * make custom target selections. For the targeting aspect, this will refer to + * the skill/item's current scope and the targets made here will be made + * independent of the scope with the exception of the target, where if a target + * is selected, it will become the 'target' value. + * + * + * for (var i = 0; i < foes.aliveMembers().length; ++i) { + * var member = foes.aliveMembers()[i]; + * if (member.level % 3 === 0) targets.push(member); + * } + * + * The 'targets' variable is an array that determines which are the targets + * to be used during the selection process. Push the desired targets into + * the 'targets' array. + * + * ============================================================================ + * Changelog + * ============================================================================ + * + * Version 1.03: + * - Lunatic Mode fail safes added. + * + * Version 1.02a: + * - will now have allies highlighted as well. + * - and will no longer highlight edead + * enemies causing them to reappear. + * + * Version 1.01: + * - Updated for RPG Maker MV version 1.1.0. + * + * Version 1.00: + * - Finished Plugin! + */ +//============================================================================= + +//============================================================================= +// Parameter Variables +//============================================================================= + +Yanfly.Parameters = PluginManager.parameters('YEP_TargetCore'); +Yanfly.Param = Yanfly.Param || {}; + +Yanfly.Param.BECHlpEverybodyTx = String(Yanfly.Parameters['Everybody Text']); +Yanfly.Param.BECHlpAllBTx = String(Yanfly.Parameters['All But User Text']); +Yanfly.Param.BECHlpRandomAnyTx = String(Yanfly.Parameters['Random Any Text']); + +Yanfly.Param.TargetMultipleTx = String(Yanfly.Parameters['Multiple Text']); +Yanfly.Param.TargetMultiEvery = String(Yanfly.Parameters['Multiple Everybody']); +Yanfly.Param.TargetMultiAllies = String(Yanfly.Parameters['Multiple Allies']); +Yanfly.Param.TargetMultiFoes = String(Yanfly.Parameters['Multiple Foes']); + +Yanfly.Param.TargetHlpRowTx = String(Yanfly.Parameters['Target Row Text']); +Yanfly.Param.TargetFrontRow = String(Yanfly.Parameters['Front Row Text']); +Yanfly.Param.TargetBackRow = String(Yanfly.Parameters['Back Row Text']); +Yanfly.Param.TargetSpcRow = String(Yanfly.Parameters['Specific Row Text']); +Yanfly.Param.TargetRowEnemies = String(Yanfly.Parameters['Row Enemies']); +Yanfly.Param.TargetRowAllies = String(Yanfly.Parameters['Row Allies']); + +//============================================================================= +// DataManager +//============================================================================= + +Yanfly.Target.DataManager_isDatabaseLoaded = DataManager.isDatabaseLoaded; +DataManager.isDatabaseLoaded = function() { + if (!Yanfly.Target.DataManager_isDatabaseLoaded.call(this)) return false; + if (!Imported.YEP_BattleEngineCore) { + this.processTargetNotetags1($dataSkills); + this.processTargetNotetags1($dataItems); + } + return true; +}; + +if (Imported.YEP_BattleEngineCore) { + +Yanfly.Target.DataManager_processMELODYNotetags = + DataManager.processMELODYNotetags; +DataManager.processMELODYNotetags = function(group) { + this.processTargetNotetags1(group); + Yanfly.Target.DataManager_processMELODYNotetags.call(this, group); +}; + +Yanfly.Target.DataManager_addActionEffects = DataManager.addActionEffects; +DataManager.addActionEffects = function(obj, array) { + this.processTargetRepeatNotetags(obj); + Yanfly.Target.DataManager_addActionEffects.call(this, obj, array); +}; + +Yanfly.Target.DataManager_isWholeAction = DataManager.isWholeAction; +DataManager.isWholeAction = function(obj) { + if (obj.scope === 'MULTIPLE') return true; + if (obj.scope === 'EVERYBODY') return true; + if (obj.scope === 'RANDOM ANY') return false; + if (obj.scope === 'TARGET ALL FOES') return false; + if (obj.scope === 'TARGET RANDOM FOES') return false; + if (obj.scope === 'ALL BUT USER') return true; + if (obj.scope === 'TARGET ALL ALLIES') return false; + if (obj.scope === 'TARGET RANDOM ALLIES') return false; + if (obj.scope === 'RANDOM ALLIES') return false; + if (obj.scope === 'ENEMY ROW') return true; + if (obj.scope === 'ALLY ROW') return true; + if (obj.scope === 'FRONT ENEMY ROW') return true; + if (obj.scope === 'FRONT ALLY ROW') return true; + if (obj.scope === 'BACK ENEMY ROW') return true; + if (obj.scope === 'BACK ALLY ROW') return true; + if (obj.scope === 'SPECIFIC ENEMY ROW') return true; + if (obj.scope === 'SPECIFIC ALLY ROW') return true; + return Yanfly.Target.DataManager_isWholeAction.call(this, obj); +}; + +}; // Imported.YEP_BattleEngineCore + +DataManager.processTargetRepeatNotetags = function(obj) { + var notedata = obj.note.split(/[\r\n]+/); + for (var i = 0; i < notedata.length; i++) { + var line = notedata[i]; + if (line.match(/<(?:REPEAT|REPEATS|REPEAT TIMES):[ ](\d+)>/i)) { + obj.repeats = parseInt(RegExp.$1); + } + } +}; + +DataManager.processTargetNotetags1 = function(group) { + for (var n = 1; n < group.length; n++) { + var obj = group[n]; + var notedata = obj.note.split(/[\r\n]+/); + + this.makeRandomTargets(obj); + var evalMode = 'none'; + obj.customTargetText = ''; + obj.customTargetEval = ''; + + if (!Imported.YEP_BattleEngineCore) this.processTargetRepeatNotetags(obj); + for (var i = 0; i < notedata.length; i++) { + var line = notedata[i]; + if (line.match(/<(?:TARGET|targets):[ ](.*)>/i)) { + var type = String(RegExp.$1).toUpperCase(); + this.makeTargetTypes(obj, type); + } else if (line.match(//i)) { + evalMode = 'custom target text'; + } else if (line.match(/<\/CUSTOM TARGET TEXT>/i)) { + evalMode = 'none'; + } else if (evalMode === 'custom target text') { + obj.customTargetText = obj.customTargetText + line + '\n'; + } else if (line.match(//i)) { + evalMode = 'custom target eval'; + } else if (line.match(/<\/CUSTOM TARGET EVAL>/i)) { + evalMode = 'none'; + } else if (evalMode === 'custom target eval') { + obj.customTargetEval = obj.customTargetEval + line + '\n'; + } + } + } +}; + +DataManager.makeRandomTargets = function(obj) { + obj.randomTargets = 0; + if ([3, 4, 5, 6].contains(obj.scope)) { + obj.randomTargets = obj.scope - 2; + } +}; + +DataManager.makeTargetTypes = function(obj, type) { + if (type.match(/(.*?)[ ](.*?)[ ]MULTIPLE OF[ ](\d+)/i)) { + var targets = String(RegExp.$1).toUpperCase(); + var stat = String(RegExp.$2).toUpperCase(); + var number = Math.max(0, parseInt(RegExp.$3)); + this.makeTargetMultipleOfType(obj, targets, stat, number); + } else if (type.match(/EVERYBODY/i)) { + obj.scope = 'EVERYBODY'; + } else if (type.match(/(\d+)[ ]RANDOM ANY/i)) { + obj.randomTargets = parseInt(RegExp.$1); + obj.scope = 'RANDOM ANY'; + } else if (type.match(/TARGET ALL FOE/i)) { + obj.scope = 'TARGET ALL FOES'; + } else if (type.match(/TARGET[ ](\d+)[ ]RANDOM FOE/i)) { + obj.randomTargets = parseInt(RegExp.$1); + obj.scope = 'TARGET RANDOM FOES'; + } else if (type.match(/(\d+)[ ]RANDOM FOE/i)) { + obj.randomTargets = parseInt(RegExp.$1); + obj.scope = 3; + } else if (type.match(/ALL BUT USER/i)) { + obj.scope = 'ALL BUT USER'; + } else if (type.match(/ALL ALLIES BUT USER/i)) { + obj.scope = 'ALL BUT USER'; + } else if (type.match(/TARGET ALL ALL/i)) { + obj.scope = 'TARGET ALL ALLIES'; + } else if (type.match(/TARGET[ ](\d+)[ ]RANDOM ALL/i)) { + obj.randomTargets = parseInt(RegExp.$1); + obj.scope = 'TARGET RANDOM ALLIES'; + } else if (type.match(/(\d+)[ ]RANDOM ALL/i)) { + obj.randomTargets = parseInt(RegExp.$1); + obj.scope = 'RANDOM ALLIES'; + } else if (type.match(/FRONT ENEMY ROW/i)) { + if (!Imported.YEP_RowFormation) return; + obj.scope = 'FRONT ENEMY ROW'; + } else if (type.match(/FRONT ALLY ROW/i)) { + if (!Imported.YEP_RowFormation) return; + obj.scope = 'FRONT ALLY ROW'; + } else if (type.match(/BACK ENEMY ROW/i)) { + if (!Imported.YEP_RowFormation) return; + obj.scope = 'BACK ENEMY ROW'; + } else if (type.match(/BACK ALLY ROW/i)) { + if (!Imported.YEP_RowFormation) return; + obj.scope = 'BACK ALLY ROW'; + } else if (type.match(/ENEMY ROW[ ](\d+)/i)) { + if (!Imported.YEP_RowFormation) return; + obj.scope = 'SPECIFIC ENEMY ROW'; + obj.rowTarget = parseInt(RegExp.$1).clamp(1, 10); + } else if (type.match(/ALLY ROW[ ](\d+)/i)) { + if (!Imported.YEP_RowFormation) return; + obj.scope = 'SPECIFIC ALLY ROW'; + obj.rowTarget = parseInt(RegExp.$1).clamp(1, 10); + } else if (type.match(/ENEMY ROW/i)) { + if (!Imported.YEP_RowFormation) return; + obj.scope = 'ENEMY ROW'; + } else if (type.match(/ALLY ROW/i)) { + if (!Imported.YEP_RowFormation) return; + obj.scope = 'ALLY ROW'; + } +}; + +DataManager.makeTargetMultipleOfType = function(obj, targets, stat, number) { + obj.multipleOf = []; + if (['ALL', 'ANY', 'ANYBODY', 'EVERYBODY'].contains(targets)) { + obj.multipleOf.push('EVERYBODY'); + } else if (['ALLY', 'ALLIES', 'FRIENDS'].contains(targets)) { + obj.multipleOf.push('FRIENDS'); + } else if (['FOE', 'FOES', 'ENEMIES', 'OPPONENTS'].contains(targets)) { + obj.multipleOf.push('OPPONENTS'); + } else { + return; + } + if (['MAXHP', 'MAX HP'].contains(stat)) { + obj.multipleOf.push(0); + } else if (['MAXMP', 'MAX MP', 'MAXSP', 'MAX SP'].contains(stat)) { + obj.multipleOf.push(1); + } else if (['ATK', 'STR'].contains(stat)) { + obj.multipleOf.push(2); + } else if (['DEF'].contains(stat)) { + obj.multipleOf.push(3); + } else if (['MAT', 'INT'].contains(stat)) { + obj.multipleOf.push(4); + } else if (['MDF', 'RES'].contains(stat)) { + obj.multipleOf.push(5); + } else if (['AGI', 'SPD'].contains(stat)) { + obj.multipleOf.push(6); + } else if (['LUK'].contains(stat)) { + obj.multipleOf.push(7); + } else if (['LEVEL', 'LV', 'LVL'].contains(stat)) { + obj.multipleOf.push('LEVEL'); + } else if (['HP'].contains(stat)) { + obj.multipleOf.push('HP'); + } else if (['MP'].contains(stat)) { + obj.multipleOf.push('MP'); + } else if (['TP'].contains(stat)) { + obj.multipleOf.push('TP'); + } else { + return; + } + obj.multipleOf.push(number); + obj.scope = 'MULTIPLE'; +}; + +//============================================================================= +// BattleManager +//============================================================================= + +if (Imported.YEP_BattleEngineCore) { + +Yanfly.Target.BattleManager_startAllSelection = BattleManager.startAllSelection; +BattleManager.startAllSelection = function() { + if (this.inputtingAction().isForMultiple()) { + var targets = this.inputtingAction().makeMultipleOfTargets(); + this._customTargetSelectGroup = targets; + } else if (this.inputtingAction().isForRow()) { + var targets = this.inputtingAction().makeRowTypeTargets(); + this._customTargetSelectGroup = targets; + } else { + Yanfly.Target.BattleManager_startAllSelection.call(this); + } +}; + +}; // Imported.YEP_BattleEngineCore + +BattleManager.customTargetSelectGroup = function() { + this._customTargetSelectGroup = this._customTargetSelectGroup || []; + return this._customTargetSelectGroup; +}; + +BattleManager.clearCustomTargetSelectGroup = function() { + this._customTargetSelectGroup = []; +}; + +//============================================================================= +// Game_System +//============================================================================= + +Yanfly.Target.Game_System_onBattleStart = Game_System.prototype.onBattleStart; +Game_System.prototype.onBattleStart = function() { + BattleManager.clearCustomTargetSelectGroup(); + Yanfly.Target.Game_System_onBattleStart.call(this); +}; + +//============================================================================= +// Game_Battler +//============================================================================= + +Yanfly.Target.Game_Battler_isSelected = Game_Battler.prototype.isSelected; +Game_Battler.prototype.isSelected = function() { + if (BattleManager.customTargetSelectGroup().length > 0) { + return BattleManager.customTargetSelectGroup().contains(this); + } + return Yanfly.Target.Game_Battler_isSelected.call(this); +}; + +//============================================================================= +// Game_Action +//============================================================================= + +Yanfly.Target.Game_Action_isForOpponent = Game_Action.prototype.isForOpponent; +Game_Action.prototype.isForOpponent = function() { + if (this.item().scope === 'EVERYBODY') return true; + if (this.item().scope === 'RANDOM ANY') return true; + if (this.item().scope === 'TARGET ALL FOES') return true; + if (this.item().scope === 'TARGET RANDOM FOES') return true; + if (this.item().scope === 'MULTIPLE') { + if (this.item().multipleOf.contains('EVERYBODY')) return true; + if (this.item().multipleOf.contains('OPPONENTS')) return true; + } + if (this.item().scope === 'ENEMY ROW') return true; + if (this.item().scope === 'FRONT ENEMY ROW') return true; + if (this.item().scope === 'BACK ENEMY ROW') return true; + if (this.item().scope === 'SPECIFIC ENEMY ROW') return true; + return Yanfly.Target.Game_Action_isForOpponent.call(this); +}; + +Yanfly.Target.Game_Action_isForFriend = Game_Action.prototype.isForFriend; +Game_Action.prototype.isForFriend = function() { + if (this.item().scope === 'EVERYBODY') return true; + if (this.item().scope === 'ALL BUT USER') return true; + if (this.item().scope === 'TARGET ALL ALLIES') return true; + if (this.item().scope === 'TARGET RANDOM ALLIES') return true; + if (this.item().scope === 'RANDOM ALLIES') return true; + if (this.item().scope === 'MULTIPLE') { + if (this.item().multipleOf.contains('FRIENDS')) return true; + } + if (this.item().scope === 'ALLY ROW') return true; + if (this.item().scope === 'FRONT ALLY ROW') return true; + if (this.item().scope === 'BACK ALLY ROW') return true; + if (this.item().scope === 'SPECIFIC ALLY ROW') return true; + return Yanfly.Target.Game_Action_isForFriend.call(this); +}; + +Game_Action.prototype.isForCustom = function() { + if (this.isForEval()) return true; + return typeof this.item().scope === 'string'; +}; + +Game_Action.prototype.isForEval = function() { + return this.item().customTargetEval !== ''; +}; + +Game_Action.prototype.isForEverybody = function() { + if (this.item().scope === 'MULTIPLE') { + if (this.item().multipleOf.contains('EVERYBODY')) return true; + } + return this.item().scope === 'EVERYBODY'; +}; + +Game_Action.prototype.isForRandomAny = function() { + return this.item().scope === 'RANDOM ANY'; +}; + +Game_Action.prototype.isForTargetAllFoes = function() { + return this.item().scope === 'TARGET ALL FOES'; +}; + +Game_Action.prototype.isForTargetRandomFoes = function() { + return this.item().scope === 'TARGET RANDOM FOES'; +}; + +Game_Action.prototype.isForAllButUser = function() { + return this.item().scope === 'ALL BUT USER'; +}; + +Game_Action.prototype.isForTargetAllAllies = function() { + return this.item().scope === 'TARGET ALL ALLIES'; +}; + +Game_Action.prototype.isForTargetRandomAllies = function() { + return this.item().scope === 'TARGET RANDOM ALLIES'; +}; + +Game_Action.prototype.isForRandomAllies = function() { + return this.item().scope === 'RANDOM ALLIES'; +}; + +Yanfly.Target.Game_Action_isForRandom = Game_Action.prototype.isForRandom; +Game_Action.prototype.isForRandom = function() { + if (this.item().randomTargets > 0) return true; + return Yanfly.Target.Game_Action_isForRandom.call(this); +}; + +Game_Action.prototype.isForMultiple = function() { + return this.item().scope === 'MULTIPLE'; +}; + +Game_Action.prototype.isForRow = function() { + if (this.item().scope === 'ENEMY ROW') return true; + if (this.item().scope === 'ALLY ROW') return true; + if (this.item().scope === 'FRONT ENEMY ROW') return true; + if (this.item().scope === 'FRONT ALLY ROW') return true; + if (this.item().scope === 'BACK ENEMY ROW') return true; + if (this.item().scope === 'BACK ALLY ROW') return true; + if (this.item().scope === 'SPECIFIC ENEMY ROW') return true; + if (this.item().scope === 'SPECIFIC ALLY ROW') return true; + return false; +}; + +Yanfly.Target.Game_Action_needsSelection = Game_Action.prototype.needsSelection; +Game_Action.prototype.needsSelection = function() { + if (this.item().scope === 'TARGET ALL FOES') return true; + if (this.item().scope === 'TARGET RANDOM FOES') return true; + if (this.item().scope === 'TARGET ALL ALLIES') return true; + if (this.item().scope === 'TARGET RANDOM ALLIES') return true; + if (this.item().scope === 'ENEMY ROW') return true; + if (this.item().scope === 'ALLY ROW') return true; + return Yanfly.Target.Game_Action_needsSelection.call(this); +}; + +Yanfly.Target.Game_Action_numTargets = Game_Action.prototype.numTargets; +Game_Action.prototype.numTargets = function() { + if (this.isForRandom()) return this.item().randomTargets; + return Yanfly.Target.Game_Action_numTargets.call(this); +}; + +Yanfly.Target.Game_Action_makeTargets = Game_Action.prototype.makeTargets; +Game_Action.prototype.makeTargets = function() { + var targets = []; + if (!this._forcing && this.subject().isConfused()) { + targets = Yanfly.Target.Game_Action_makeTargets.call(this); + } else if (this.isForCustom()) { + targets = this.makeCustomTargets(); + } else { + targets = Yanfly.Target.Game_Action_makeTargets.call(this); + } + return targets; +}; + +Game_Action.prototype.makeCustomTargets = function() { + var targets = []; + if (this.isForEval()) { + targets = this.makeEvalTargets(); + } else if (this.isForMultiple()) { + targets = this.makeMultipleOfTargets(); + } else if (this.isForRow()) { + targets = this.makeRowTypeTargets(); + } else if (this.isForRandomAny()) { + var number = this.numTargets(); + var group = $gameParty.aliveMembers().concat($gameTroop.aliveMembers()); + for (var i = 0; i < number; ++i) { + var member = group[Math.floor(Math.random() * group.length)]; + targets.push(member); + } + } else if (this.isForEverybody()) { + targets = this.opponentsUnit().aliveMembers(); + var length = this.friendsUnit().aliveMembers().length; + for (var i = 0; i < length; ++i) { + var member = this.friendsUnit().aliveMembers()[i]; + if (member && member !== this.subject()) targets.push(member); + } + targets.push(this.subject()); + } else if (this.isForTargetAllFoes()) { + var unit = this.opponentsUnit(); + targets.push(unit.smoothTarget(this._targetIndex)); + targets = targets.concat(unit.aliveMembers()); + } else if (this.isForTargetRandomFoes()) { + var unit = this.opponentsUnit(); + var number = this.numTargets(); + targets.push(unit.smoothTarget(this._targetIndex)); + targets = targets.concat(this.getRandomTargets(number, unit)) + } else if (this.isForAllButUser()) { + var length = this.friendsUnit().aliveMembers().length; + for (var i = 0; i < length; ++i) { + var member = this.friendsUnit().aliveMembers()[i]; + if (member && member !== this.subject()) targets.push(member); + } + } else if (this.isForTargetAllAllies()) { + var unit = this.friendsUnit(); + targets.push(unit.smoothTarget(this._targetIndex)); + targets = targets.concat(unit.aliveMembers()); + } else if (this.isForTargetRandomAllies()) { + var unit = this.friendsUnit(); + var number = this.numTargets(); + targets.push(unit.smoothTarget(this._targetIndex)); + targets = targets.concat(this.getRandomTargets(number, unit)) + } else if (this.isForRandomAllies()) { + var unit = this.friendsUnit(); + var number = this.numTargets(); + targets = targets.concat(this.getRandomTargets(number, unit)) + } + return targets; +}; + +Game_Action.prototype.makeEvalTargets = function() { + var targets = []; + var a = this.subject(); + var user = this.subject(); + var subject = this.subject(); + if (this.isForOpponent()) { + var targetUnit = this.opponentsUnit(); + } else { + var targetUnit = this.friendsUnit(); + } + var b = targetUnit.smoothTarget(this._targetIndex); + var target = targetUnit.smoothTarget(this._targetIndex); + var s = $gameSwitches._data; + var v = $gameVariables._data; + var allies = this.friendsUnit(); + var friends = allies; + var foes = this.opponentsUnit(); + var opponents = foes; + var code = this.item().customTargetEval; + try { + eval(code); + } catch (e) { + Yanfly.Util.displayError(e, code, 'MAKE CUSTOM TARGETS ERROR'); + } + return targets; +}; + +Game_Action.prototype.getRandomTargets = function(number, unit) { + var targets = []; + for (var i = 0; i < number; ++i) { + targets.push(unit.randomTarget()); + } + return targets; +}; + +Game_Action.prototype.makeMultipleOfTargets = function() { + var targets = []; + var unit = []; + var type = this.item().multipleOf[0]; + var param = this.item().multipleOf[1]; + var number = this.item().multipleOf[2]; + if (['EVERYBODY', 'OPPONENTS'].contains(type)) { + unit = unit.concat(this.opponentsUnit().aliveMembers()); + } + if (['EVERYBODY', 'FRIENDS'].contains(type)) { + unit = unit.concat(this.friendsUnit().aliveMembers()); + } + var length = unit.length; + for (var i = 0; i < length; ++i) { + var member = unit[i]; + if (param === 'LEVEL') { + if (member.level % number === 0) targets.push(member); + } else if (param === 'HP') { + if (member.hp % number === 0) targets.push(member); + } else if (param === 'MP') { + if (member.mp % number === 0) targets.push(member); + } else if (param === 'TP') { + if (member.tp % number === 0) targets.push(member); + } else { + if (member.param(param) % number === 0) targets.push(member); + } + } + return targets; +}; + +Game_Action.prototype.makeRowTypeTargets = function() { + var targets = []; + var scope = this.item().scope; + if (scope === 'ENEMY ROW') { + var unit = this.opponentsUnit(); + var target = unit.smoothTarget(this._targetIndex); + var row = target.row(); + targets = unit.rowAliveMembers(row); + } else if (scope === 'ALLY ROW') { + var unit = this.friendsUnit(); + var target = unit.smoothTarget(this._targetIndex); + var row = target.row(); + targets = unit.rowAliveMembers(row); + } else if (scope === 'FRONT ENEMY ROW') { + var unit = this.opponentsUnit(); + for (var i = 1; i < Yanfly.Param.RowMaximum + 1; ++i) { + if (unit.rowAliveSize(i) > 0) return unit.rowAliveMembers(i); + } + } else if (scope === 'FRONT ALLY ROW') { + var unit = this.friendsUnit(); + for (var i = 1; i < Yanfly.Param.RowMaximum + 1; ++i) { + if (unit.rowAliveSize(i) > 0) return unit.rowAliveMembers(i); + } + } else if (scope === 'BACK ENEMY ROW') { + var unit = this.opponentsUnit(); + for (var i = 10; i > 0; --i) { + if (unit.rowAliveSize(i) > 0) return unit.rowAliveMembers(i); + } + } else if (scope === 'BACK ALLY ROW') { + var unit = this.friendsUnit(); + for (var i = 10; i > 0; --i) { + if (unit.rowAliveSize(i) > 0) return unit.rowAliveMembers(i); + } + } else if (scope === 'SPECIFIC ENEMY ROW') { + var unit = this.opponentsUnit(); + var i = this.item().rowTarget; + return unit.rowAliveMembers(i); + } else if (scope === 'SPECIFIC ALLY ROW') { + var unit = this.friendsUnit(); + var i = this.item().rowTarget; + return unit.rowAliveMembers(i); + } + return targets; +}; + +//============================================================================= +// Window_Help +//============================================================================= + +if (Imported.YEP_BattleEngineCore) { + +Yanfly.Target.Window_Help_setBattler = Window_Help.prototype.setBattler; +Window_Help.prototype.setBattler = function(battler) { + this._battler = battler; + Yanfly.Target.Window_Help_setBattler.call(this, battler); +}; + +Yanfly.Target.Window_Help_specialSelectionText = + Window_Help.prototype.specialSelectionText; +Window_Help.prototype.specialSelectionText = function(action) { + BattleManager.resetSelection(); + if (!action) return false; + if (action.item().customTargetText !== '') return true; + if (action.isForRow()) return true; + return Yanfly.Target.Window_Help_specialSelectionText.call(this, action); +}; + +Yanfly.Target.Window_Help_drawSpecialSelectionText = + Window_Help.prototype.drawSpecialSelectionText; +Window_Help.prototype.drawSpecialSelectionText = function(action) { + if (action.item().customTargetText !== '') { + BattleManager.startAllSelection(); + var wx = 0; + var wy = (this.contents.height - this.lineHeight()) / 2; + var text = this.makeCustomTargetText(action); + this.drawText(text, wx, wy, this.contents.width, 'center'); + } else if (action.isForMultiple()) { + BattleManager.startAllSelection(); + var wx = 0; + var wy = (this.contents.height - this.lineHeight()) / 2; + var text = this.makeTargetMultipleOfText(action); + this.drawText(text, wx, wy, this.contents.width, 'center'); + } else if (action.isForRow()) { + this.makeTargetRowText(action); + } else if (action.isForRandomAny()) { + var wx = 0; + var wy = (this.contents.height - this.lineHeight()) / 2; + var fmt = Yanfly.Param.BECHlpRandomAnyTx; + var number = action.item().randomTargets; + var text = fmt.format(Yanfly.Util.toGroup(number)); + this.drawText(text, wx, wy, this.contents.width, 'center'); + } else if (action.isForEverybody()) { + BattleManager.startAllSelection(); + var wx = 0; + var wy = (this.contents.height - this.lineHeight()) / 2; + var text = Yanfly.Param.BECHlpEverybodyTx; + this.drawText(text, wx, wy, this.contents.width, 'center'); + } else if (action.isForAllButUser()) { + BattleManager.startAllSelection(); + var wx = 0; + var wy = (this.contents.height - this.lineHeight()) / 2; + var fmt = Yanfly.Param.BECHlpAllBTx; + var allies = Yanfly.Param.BECHelpAlliesTx; + var user = Yanfly.Param.BECHelpUserTx + var text = fmt.format(allies, user); + this.drawText(text, wx, wy, this.contents.width, 'center'); + } else { + Yanfly.Target.Window_Help_drawSpecialSelectionText.call(this, action); + } +}; + +}; // Imported.YEP_BattleEngineCore + +Window_Help.prototype.makeCustomTargetText = function(action) { + var text = '' + var s = $gameSwitches._data; + var v = $gameVariables._data; + var user = BattleManager._subject; + var a = user; + var subject = user; + var b = user; + var target = user; + var code = action.item().customTargetText; + try { + eval(code); + } catch (e) { + Yanfly.Util.displayError(e, code, 'MAKE CUSTOM TARGET TEXT ERROR'); + } + return text; +}; + +Window_Help.prototype.makeTargetMultipleOfText = function(action) { + var fmt = Yanfly.Param.TargetMultipleTx; + if (action.isForEverybody()) { + var targets = Yanfly.Param.TargetMultiEvery; + } else if (action.isForFriend()) { + var targets = Yanfly.Param.TargetMultiAllies; + } else { + var targets = Yanfly.Param.TargetMultiFoes; + } + var param = action.item().multipleOf[1]; + if (param === 'LEVEL') { + param = TextManager.level; + } else if (param === 'HP') { + param = TextManager.hp; + } else if (param === 'MP') { + param = Textmanager.mp; + } else if (param === 'TP') { + param = Textmanager.tp; + } else { + param = TextManager.param(param); + } + var number = action.item().multipleOf[2]; + var text = fmt.format(targets, param, Yanfly.Util.toGroup(number)); + return text; +}; + +Window_Help.prototype.makeTargetRowText = function(action) { + action.setTarget(this._battler.index()); + BattleManager.startAllSelection(); + var wx = 0; + var wy = (this.contents.height - this.lineHeight()) / 2; + var scope = action.item().scope; + if (scope === 'ENEMY ROW' || scope === 'ALLY ROW') { + var fmt = Yanfly.Param.TargetHlpRowTx; + var text = fmt.format(this._battler.name()); + } else if (scope === 'FRONT ENEMY ROW') { + var fmt = Yanfly.Param.TargetFrontRow; + var text = fmt.format(Yanfly.Param.TargetRowEnemies); + } else if (scope === 'BACK ENEMY ROW') { + var fmt = Yanfly.Param.TargetBackRow; + var text = fmt.format(Yanfly.Param.TargetRowEnemies); + } else if (scope === 'SPECIFIC ENEMY ROW') { + var fmt = Yanfly.Param.TargetSpcRow; + var text = fmt.format(Yanfly.Param.TargetRowEnemies); + } else if (scope === 'FRONT ALLY ROW') { + var fmt = Yanfly.Param.TargetFrontRow; + var text = fmt.format(Yanfly.Param.TargetRowAllies); + } else if (scope === 'BACK ALLY ROW') { + var fmt = Yanfly.Param.TargetBackRow; + var text = fmt.format(Yanfly.Param.TargetRowAllies); + } else if (scope === 'SPECIFIC ALLY ROW') { + var fmt = Yanfly.Param.TargetSpcRow; + var text = fmt.format(Yanfly.Param.TargetRowAllies); + } + this.drawText(text, wx, wy, this.contents.width, 'center'); +}; + +//============================================================================= +// Window_EnemyVisualSelect +//============================================================================= + +if (Imported.YEP_BattleEngineCore) { + +Yanfly.Target.Window_EnemyVisualSelect_isShowWindow = + Window_EnemyVisualSelect.prototype.isShowWindow; +Window_EnemyVisualSelect.prototype.isShowWindow = function() { + if (BattleManager.customTargetSelectGroup().length > 0) { + return BattleManager.customTargetSelectGroup().contains(this._battler); + } + return Yanfly.Target.Window_EnemyVisualSelect_isShowWindow.call(this); +}; + +}; // Imported.YEP_BattleEngineCore + +//============================================================================= +// Scene_Battle +//============================================================================= + +Yanfly.Target.Scene_Battle_onEnemyOk = Scene_Battle.prototype.onEnemyOk; +Scene_Battle.prototype.onEnemyOk = function() { + BattleManager.clearCustomTargetSelectGroup(); + Yanfly.Target.Scene_Battle_onEnemyOk.call(this); +}; + +Yanfly.Target.Scene_Battle_onEnemyCancel = Scene_Battle.prototype.onEnemyCancel; +Scene_Battle.prototype.onEnemyCancel = function() { + BattleManager.clearCustomTargetSelectGroup(); + Yanfly.Target.Scene_Battle_onEnemyCancel.call(this); +}; + +Yanfly.Target.Scene_Battle_onActorOk = Scene_Battle.prototype.onActorOk; +Scene_Battle.prototype.onActorOk = function() { + BattleManager.clearCustomTargetSelectGroup(); + Yanfly.Target.Scene_Battle_onActorOk.call(this); +}; + +Yanfly.Target.Scene_Battle_onActorCancel = Scene_Battle.prototype.onActorCancel; +Scene_Battle.prototype.onActorCancel = function() { + BattleManager.clearCustomTargetSelectGroup(); + Yanfly.Target.Scene_Battle_onActorCancel.call(this); +}; + +//============================================================================= +// Utilities +//============================================================================= + +Yanfly.Util = Yanfly.Util || {}; + +if (!Yanfly.Util.toGroup) { + Yanfly.Util.toGroup = function(inVal) { + return inVal; + } +}; + +Yanfly.Util.displayError = function(e, code, message) { + console.log(message); + console.log(code || 'NON-EXISTENT'); + console.error(e); + if (Utils.isNwjs() && Utils.isOptionValid('test')) { + if (!require('nw.gui').Window.get().isDevToolsOpen()) { + require('nw.gui').Window.get().showDevTools(); + } + } +}; + +//============================================================================= +// End of File +//=============================================================================