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

1047 lines
41 KiB
JavaScript

//=============================================================================
// 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:
*
* <Repeat: x> 重复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.
*
* <Target: Everybody> 目标所有人
* This targets all alive opponent and friendly members with the user being
* the very last target.
*
* <Target: x Random Any> 随机目标
* This adds x random alive opponents and/or allies.
*
* <Target: Target All Foes> 所有敌方
* This targets a single foe and then adds all alive opponent members.
*
* <Target: Target x Random Foes> 随机敌方
* This targets a single foe and then adds x random alive opponent members.
*
* <Target: x Random Foes> 随机敌方
* This adds x random alive opponent members. This can go beyond the editor's
* default limit of 4 randomf oes.
*
* <Target: All Allies But User> 除了使用者的其余队友
* This will target all friendly alive members except for the user.
*
* <Target: Target All Allies> 所有队友
* This will target a single ally and then adds all alive friendly members.
*
* <Target: Target x Random Allies> 随机队友
* This will target a single ally and then adds x random alive allies.
*
* <Target: x Random Allies> 随机角色
* This adds x random alive allied members.
*
* <Target: Everybody param Multiple Of x> 符合特定状态的角色
* 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.
*
* <Target: Allies param Multiple Of x> 符合特定状态的队友
* 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.
*
* <Target: Foes param Multiple Of x> 符合特定状态的敌方
* 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 ---
*
* <Target: Enemy Row> 目标敌人排
* This will target the enemy row equal to that of the currently selected
* target enemy. The entire row will be selected as a whole.
*
* <Target: Enemy Row x> 目标敌人x排
* This will target specifically the enemy row x for the enemy unit. The
* entire row will be selected as a whole.
*
* <Target: Front Enemy Row> 目标敌人前
* 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.
*
* <Target: Back Enemy Row> 目标敌人后排
* 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.
*
* <Target: Ally Row> 队友排列
* This will target the enemy row equal to that of the currently selected
* target enemy. The entire row will be selected as a whole.
*
* <Target: Ally Row x> 队友x排
* This will target specifically the allied row x for the allied unit. The
* entire row will be selected as a whole.
*
* <Target: Front Ally Row> 队友前排
* 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.
*
* <Target: Back Ally Row> 队友后排
* 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:
*
* <Custom Target Text>
* text = $gameActors.actor(1).name();
* text += ' and ' + $gameActors.actor(2).name();
* </Custom Target Text>
* 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.
*
* <Custom Target Eval>
* for (var i = 0; i < foes.aliveMembers().length; ++i) {
* var member = foes.aliveMembers()[i];
* if (member.level % 3 === 0) targets.push(member);
* }
* </Custom Target Eval>
* 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:
* - <Target: Everybody> will now have allies highlighted as well.
* - <Target: Enemy Row> and <Target: Ally Row> 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(/<CUSTOM TARGET TEXT>/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(/<CUSTOM TARGET EVAL>/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
//=============================================================================