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

1542 lines
56 KiB
JavaScript

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

//=============================================================================
// Yanfly Engine Plugins - Enemy Levels
// YEP_EnemyLevels.js
//=============================================================================
var Imported = Imported || {};
Imported.YEP_EnemyLevels = true;
var Yanfly = Yanfly || {};
Yanfly.ELV = Yanfly.ELV || {};
Yanfly.ELV.version = 1.09;
//=============================================================================
/*:
* @plugindesc v1.09 This plugin enables giving your enemies levels and
* parameter changes with those levels.
* @author Yanfly Engine Plugins
*
* @param ---General---
* @default
*
* @param Show Level
* @parent ---General---
* @type boolean
* @on Show
* @off Hide
* @desc Show enemy levels by default?
* NO - false YES - true
* @default true
*
* @param Level Format
* @parent ---General---
* @desc How to format enemy names with levels.
* %1 - Level %2 - Name
* @default Lv%1 %2
*
* @param Minimum Level
* @parent ---General---
* @type number
* @min 1
* @desc Default lowest level an enemy can be.
* @default 1
*
* @param Maximum Level
* @parent ---General---
* @type number
* @min 1
* @desc Default highest level an enemy can be.
* @default 9999
*
* @param Maximum Cap
* @parent ---General---
* @type number
* @min 1
* @desc Highest possible level an enemy can be.
* @default 9999
*
* @param Preserve Rate
* @parent ---General---
* @type boolean
* @on Preserve
* @off Don't Preserve
* @desc If level changing, preserve the enemy's HP/MP rates?
* NO - false YES - true
* @default true
*
* @param ---Level Setup---
* @default
*
* @param Default Type
* @parent ---Level Setup---
* @type select
* @option Lowest level of all actors that have joined the player party.
* @value 0
* @option Lowest level of all actors that are in the battling party.
* @value 1
* @option Average level of all actors that have joined the player party.
* @value 2
* @option Average level of all actors that are in the battling party.
* @value 3
* @option Highest level of all actors that have joined the player party.
* @value 4
* @option Highest level of all actors that are in the battling party.
* @value 5
* @desc Default level calculated relative to the player party:
* Refer to the Help File for Default Level Types.
* @default 5
*
* @param Positive Fluctuation
* @parent ---Level Setup---
* @type number
* @min 0
* @desc Default positive level fluctuation for all enemies.
* @default 2
*
* @param Negative Fluctuation
* @parent ---Level Setup---
* @type number
* @min 0
* @desc Default negative level fluctuation for all enemies.
* @default 2
*
* @param ---MaxHP Growth---
* @default
*
* @param MaxHP Formula
* @parent ---MaxHP Growth---
* @desc The formula used for this parameter's calculations.
* @default base * (1 + (level - 1) * rate) + (flat * (level - 1))
*
* @param MaxHP Rate Growth
* @parent ---MaxHP Growth---
* @type number
* @min 0
* @decimals 2
* @desc The growth rate for this parameter per level.
* @default 0.15
*
* @param MaxHP Flat Growth
* @parent ---MaxHP Growth---
* @type number
* @min 0
* @decimals 2
* @desc The flat growth value for this parameter per level.
* @default 50.0
*
* @param ---MaxMP Growth---
* @default
*
* @param MaxMP Formula
* @parent ---MaxMP Growth---
* @desc The formula used for this parameter's calculations.
* @default base * (1 + (level - 1) * rate) + (flat * (level - 1))
*
* @param MaxMP Rate Growth
* @parent ---MaxMP Growth---
* @type number
* @min 0
* @decimals 2
* @desc The growth rate for this parameter per level.
* @default 0.10
*
* @param MaxMP Flat Growth
* @parent ---MaxMP Growth---
* @type number
* @min 0
* @decimals 2
* @desc The flat growth value for this parameter per level.
* @default 10.0
*
* @param ---ATK Growth---
* @default
*
* @param ATK Formula
* @parent ---ATK Growth---
* @desc The formula used for this parameter's calculations.
* @default base * (1 + (level - 1) * rate) + (flat * (level - 1))
*
* @param ATK Rate Growth
* @parent ---ATK Growth---
* @type number
* @min 0
* @decimals 2
* @desc The growth rate for this parameter per level.
* @default 0.05
*
* @param ATK Flat Growth
* @parent ---ATK Growth---
* @type number
* @min 0
* @decimals 2
* @desc The flat growth value for this parameter per level.
* @default 2.5
*
* @param ---DEF Growth---
* @default
*
* @param DEF Formula
* @parent ---DEF Growth---
* @desc The formula used for this parameter's calculations.
* @default base * (1 + (level - 1) * rate) + (flat * (level - 1))
*
* @param DEF Rate Growth
* @parent ---DEF Growth---
* @type number
* @min 0
* @decimals 2
* @desc The growth rate for this parameter per level.
* @default 0.05
*
* @param DEF Flat Growth
* @parent ---DEF Growth---
* @type number
* @min 0
* @decimals 2
* @desc The flat growth value for this parameter per level.
* @default 2.5
*
* @param ---MAT Growth---
* @default
*
* @param MAT Formula
* @parent ---MAT Growth---
* @desc The formula used for this parameter's calculations.
* @default base * (1 + (level - 1) * rate) + (flat * (level - 1))
*
* @param MAT Rate Growth
* @parent ---MAT Growth---
* @type number
* @min 0
* @decimals 2
* @desc The growth rate for this parameter per level.
* @default 0.05
*
* @param MAT Flat Growth
* @parent ---MAT Growth---
* @type number
* @min 0
* @decimals 2
* @desc The flat growth value for this parameter per level.
* @default 2.5
*
* @param ---MDF Growth---
* @default
*
* @param MDF Formula
* @parent ---MDF Growth---
* @desc The formula used for this parameter's calculations.
* @default base * (1 + (level - 1) * rate) + (flat * (level - 1))
*
* @param MDF Rate Growth
* @parent ---MDF Growth---
* @type number
* @min 0
* @decimals 2
* @desc The growth rate for this parameter per level.
* @default 0.05
*
* @param MDF Flat Growth
* @parent ---MDF Growth---
* @type number
* @min 0
* @decimals 2
* @desc The flat growth value for this parameter per level.
* @default 2.5
*
* @param ---AGI Growth---
* @default
*
* @param AGI Formula
* @parent ---AGI Growth---
* @desc The formula used for this parameter's calculations.
* @default base * (1 + (level - 1) * rate) + (flat * (level - 1))
*
* @param AGI Rate Growth
* @parent ---AGI Growth---
* @type number
* @min 0
* @decimals 2
* @desc The growth rate for this parameter per level.
* @default 0.05
*
* @param AGI Flat Growth
* @parent ---AGI Growth---
* @type number
* @min 0
* @decimals 2
* @desc The flat growth value for this parameter per level.
* @default 2.5
*
* @param ---LUK Growth---
* @default
*
* @param LUK Formula
* @parent ---LUK Growth---
* @desc The formula used for this parameter's calculations.
* @default base * (1 + (level - 1) * rate) + (flat * (level - 1))
*
* @param LUK Rate Growth
* @parent ---LUK Growth---
* @type number
* @min 0
* @decimals 2
* @desc The growth rate for this parameter per level.
* @default 0.05
*
* @param LUK Flat Growth
* @parent ---LUK Growth---
* @type number
* @min 0
* @decimals 2
* @desc The flat growth value for this parameter per level.
* @default 2.5
*
* @param ---EXP Growth---
* @default
*
* @param EXP Formula
* @parent ---EXP Growth---
* @desc The formula used for this parameter's calculations.
* @default base * (1 + (level - 1) * rate) + (flat * (level - 1))
*
* @param EXP Rate Growth
* @parent ---EXP Growth---
* @type number
* @min 0
* @decimals 2
* @desc The growth rate for this parameter per level.
* @default 0.15
*
* @param EXP Flat Growth
* @parent ---EXP Growth---
* @type number
* @min 0
* @decimals 2
* @desc The flat growth value for this parameter per level.
* @default 10.0
*
* @param ---Gold Growth---
* @default
*
* @param Gold Formula
* @parent ---Gold Growth---
* @desc The formula used for this parameter's calculations.
* @default base * (1 + (level - 1) * rate) + (flat * (level - 1))
*
* @param Gold Rate Growth
* @parent ---Gold Growth---
* @type number
* @min 0
* @decimals 2
* @desc The growth rate for this parameter per level.
* @default 0.15
*
* @param Gold Flat Growth
* @parent ---Gold Growth---
* @type number
* @min 0
* @decimals 2
* @desc The flat growth value for this parameter per level.
* @default 10.0
*
* @help
* ============================================================================
* Introduction
* ============================================================================
*
* This plugin allows enemies to function off of a leveling system. An enemy's
* level will be increased relative to the player under specific rulings and
* will increase its stats based on its level.
*
* ============================================================================
* Default Level Types
* ============================================================================
*
* When an enemy is made in battle, it will create its initial level off of a
* set of rules. These are the various rules you can change the 'Default Type'
* plugin parameter to reflect.
*
* Type:
*
* - Type 0 - Lowest level of all actors that have joined the player party.
* - Type 1 - Lowest level of all actors that are in the battling party.
* - Type 2 - Average level of all actors that have joined the player party.
* - Type 3 - Average level of all actors that are in the battling party.
* - Type 4 - Highest level of all actors that have joined the player party.
* - Type 5 - Highest level of all actors that are in the battling party.
*
* After the level type has been determined for the enemy, random level
* fluctuations are then added.
*
* ============================================================================
* Notetags
* ============================================================================
*
* You can use these notetags to adjust how enemy levels are handled
* individually per enemy.
*
* Enemy Notetags:
*
* <Show Level>
* <Hide Level>
* This will cause the enemy to show or hide its level upon target selection.
* 这将导致敌人在角色选择目标时显示或隐藏其等级。
*
* <Minimum Level: x>
* <Maximum Level: x>
* This sets the enemy's minimum and maximum levels respectively to x. This
* will cause the enemy, upon the start of battle, to adjust levels within
* this particular range. Any skills that alter enemy levels are able to
* bypass these limits unless if it were to bypass the maximum cap.
* 这会将敌人的最低和最高等级分别设置为 x。这将导致敌人在战斗开始时
* 调整此特定范围内的级别。任何改变敌人等级的技能都可以绕过这些限制,
* 除非它绕过了最大上限。
*
* <Static Level: x>
* This sets the enemy's starting level to exactly x. This will cause the
* enemy, upon the start of battle, to adjust levels within this particular
* range. Any skills that alter enemy levels are able to bypass these limits
* unless if it were to bypass the maximum cap.
* 这会将敌人的起始等级设置为正好 x。这将导致敌人在战斗开始时调整此特定范围内
* 的级别。任何改变敌人等级的技能都可以绕过这些限制,除非它绕过了最大上限。
*
* <Starting Level Type: x>
* This sets the enemy's starting level type to x from 0 to 5. Refer to the
* 'Default Level Types' party of the Help File.
* 这会将敌人的起始等级类型设置为 x范围为 0 到 5。
* 请参阅帮助文件的“默认级别类型”方。
*
* <Positive Level Fluctuation: x>
* <Negative Level Fluctuation: x>
* This sets the positive/negative level fluctuation for the enemy. Any level
* fluctuation is calculated at the start of battle, but after the starting
* level type has been determined.
* 这将设置敌人的等级正/负水平波动。任何等级波动都是在战斗开始时计算的,
* 但在确定起始等级类型之后。
*
* <Level Fluctuation: x>
* This sets both the positive and negative level fluctuation for the enemy
* to x. Any level fluctuation is calculated at the start of battle, but
* after the starting level type has been determined.
* 这会将敌人的正和负等级波动都设置为 x。任何等级波动都是在战斗开始时计算的
* 但在确定起始等级类型之后。
*
* <stat Rate: +x% per level>
* <stat Rate: -x% per level>
* <stat Rate: +x.y per level>
* <stat Rate: -x.y per level>
* Replace 'stat' with 'maxhp', 'maxmp', 'atk', 'def', 'mat', 'mdf', 'agi',
* 'luk', 'exp', or 'gold'. This will set this enemy to have an increase or
* decrease of x% rate per level. If you use the x.y formula, it will have a
* rate increase of +x.y or -x.y per level.
* 将“stat”替换为“maxhp”、“maxmp”、“atk”、“def”、“mat”、“mdf”、“agi”、“luk”、
* “exp”或“gold”。这将设置这个敌人每级增加或减少x%的比率。如果使用 x.y 公式,
* 则每个级别的比率将增加 +x.y 或 -x.y。
*
* <stat Flat: +x per level>
* <stat Flat: -x per level>
* <stat Flat: +x.y per level>
* <stat Flat: -x.y per level>
* Replace 'stat' with 'maxhp', 'maxmp', 'atk', 'def', 'mat', 'mdf', 'agi',
* 'luk', 'exp', or 'gold'. This will set this enemy to have an increase or
* decrease of flat x value per level. If you use the x.y formula, it will
* have a flat increase of +x.y or -x.y per level.
* 将“stat”替换为“maxhp”、“maxmp”、“atk”、“def”、“mat”、“mdf”、“agi”、
* “luk”、“exp”或“gold”。这将设置这个敌人每级增加或减少属性x值。
* 如果使用 x.y 公式,则每个级别将平坦增加 +x.y 或 -x.y。
*
* <Resist Level Change>
* This will cause the enemy to be immune to any form of level changing
* through skills and items. However, the enemy is not immune to any level
* changing through script calls.
* 这将使敌人对通过技能和物品进行的任何形式的等级变化免疫。
* 但是,敌人不能幸免于通过脚本调用更改任何级别。
*
* <Skill x Require Level: y>
* <Skill name Require Level: y>
* If this enemy is to use skill x (or named skill), it must be at least
* level y to be able to use it. If the enemy is under level y, the skill
* will be sealed and cannot be used.
* 如果这个敌人要使用技能x或命名技能它必须至少达到y级才能使用它。
* 如果敌人低于y级则该技能将被封印无法使用。
*
* <Ignore Level Bonus>
* This will cause the enemy to ignore all the stat changes added by levels
* and use its base stats as its current level stats. Any changes to its
* current level will not alter the enemy's stats.
* 这将导致敌人忽略关卡添加的所有属性变化,并将其基础属性用作当前等级属性。
* 对当前等级的任何更改都不会改变敌人的属性。
*
* Skill and Item Notetags:
*
* <Reset Enemy Level>
* This will reset the target enemy's level back to what it was at the start
* of battle.
* 这会将目标敌人的等级重置回战斗开始时的水平。
*
* <Change Enemy Level: +x>
* <Change Enemy Level: -x>
* If this action is used against an enemy, it will change the enemy's level
* by +x or -x. If an action contains both a reset and level change, the
* reset will occur first before the level change.
* 如果对敌人使用这个动作,它会将敌人的等级改变+x或-x。
* 如果操作同时包含重置和级别更改,则重置将在级别更改之前首先发生。
*
* ============================================================================
* Lunatic Mode - Custom Starting Level
* ============================================================================
*
* For those with JavaScript experience, you can have enemies have conditional
* starting levels. Place these Lunatic Mode notetags into the enemy notebox:
*
* Enemy Notetags:
*
* <Custom Starting Level>
* level = $gameActors.actor(1).level + 5;
* </Custom Starting Level>
* The 'level' variable will become the enemy's starting level. This level is
* still affected by the enemy's minimum and maximum starting level barriers.
* After the starting levels are decided, it will still be affected by the
* random level fluctuation.
* “level”变量将成为敌人的起始等级。这个等级仍然受到敌人最小和最大起始等级限制
* 的影响。确定起始级别后,仍会受到随机级别波动的影响。
*
* ============================================================================
* Lunatic Mode - Custom Parameter Formulas
* ============================================================================
*
* For those with JavaScript experience, you can have different formulas for
* the ways parameters are calculated in regards to the enemy's level. Use the
* notetags below:
*
* Enemy Notetags:
*
* <Custom Parameter stat Formula>
* base * (1 + (level - 1) * rate) + (flat * (level - 1))
* </Custom Parameter stat Formula>
* Replace 'stat' with 'maxhp', 'maxmp', 'atk', 'def', 'mat', 'mdf', 'agi',
* 'luk', 'exp', or 'gold'. Whatever is calculated for the formula on the
* last line will become the parameter value for the stat.
* 将“stat”替换为“maxhp”、“maxmp”、“atk”、“def”、“mat”、“mdf”、“agi”、
* “luk”、“exp”或“gold”。为最后一行的公式计算的任何内容都将成为
* 统计信息的参数值。
*
* ============================================================================
* Lunatic Mode - Custom Change Enemy Level
* ============================================================================
*
* For those with JavaScript experience and would like to have more dynamic
* ways of altering enemy levels instead of flat values, you can use these
* notetags to do so:
*
* Skill and Item Notetags:
*
* <Custom Change Enemy Level>
* level += user.atk;
* level -= target.agi;
* </Custom Change Enemy Level>
* The 'level' variable will be the enemy's current level. Any changes made
* to the 'level' variable will be what the enemy's level will become after
* this effect finishes taking place. If the skill has a reset level effect,
* it is applied first. If the skill has a flat level changing effect, that
* effect is applied next. After those two effects are applied, this custom
* enemy level change will take place.
* “等级”变量将是敌人的当前等级。对“等级”变量所做的任何更改都将是
* 此效果发生后敌人的等级。如果技能具有重置等级效果,则首先应用该技能。
* 如果技能具有平坦的关卡变化效果,则接下来应用该效果。应用这两种效果后,
* 将发生此自定义敌人等级更改。
*
* ============================================================================
* Lunatic Mode - New JavaScript Functions
* ============================================================================
*
* Here are some new JavaScript functions that have been added by this plugin.
*
* enemy.level
* - This will return the enemy's current level.
* - 这将返回敌人的当前等级。
*
* enemy.originalLevel()
* - This will return the enemy's original level from the start of battle.
* - 这将从战斗开始恢复敌人的原始等级。
*
* enemy.changeLevel(x)
* - This will change the enemy's level to x.
* - 这会将敌人的等级更改为 x。
*
* enemy.gainLevel(x)
* - This will cause the enemy to gain x levels.
* - 这将导致敌人增加x级。
*
* enemy.loseLevel(x)
* - This will cause the enemy to lose x levels.
* - 这将导致敌人减少x级。
*
* enemy.resetLevel()
* - Changes the enemy's level back to what it was at the start of battle.
* - 将敌人的等级变回战斗开始时的水平。
*
* $gameParty.lowestLevelAllMembers()
* - This will return the lowest level of all party members.
* - 这将返回所有队员的最低等级。
*
* $gameParty.lowestLevelBattleMembers()
* - This will return the lowest level of all battle members.
* - 这将返回所有战斗成员中最低等级。
*
* $gameParty.averageLevelAllMembers()
* - This will return the average level of all party members.
* - 这将返回所有队员的平均等级。
*
* $gameParty.averageLevelBattleMembers()
* - This will return the average level of all battle members.
* - 这将返回所有战斗成员的平均水平。
*
* $gameParty.highestLevelAllMembers()
* - This will return the highest level of all party members.
* - 这将返回所有队员的最高等级。
*
* $gameParty.highestLevelBattleMembers()
* - This will return the highest level of all battle members.
* - 这将返回所有战斗成员的最高等级。
*
* $gameTroop.changeLevel(x)
* - Changes the levels of all enemies to x.
* - 将所有敌人的等级更改为x。
*
* $gameTroop.gainLevel(x)
* - Raises the levels of all enemies by x.
* - 将所有敌人的等级提高 x。
*
* $gameTroop.loseLevel(x)
* - Lowers the levels of all enemies by x.
* - 将所有敌人的等级降低x。
*
* $gameTroop.resetLevel()
* - Resets the levels of all enemies to their original levels at battle start.
* - 将所有敌人的等级重置为战斗开始时的原始等级。
*
* $gameTroop.lowestLevel()
* - This will return the lowest level of the enemy party.
* - 这将返回敌方的最低等级。
*
* $gameTroop.averageLevel()
* - This will return the average level of the enemy party.
* - 这将返回敌方的平均等级。
*
* $gameTroop.highestLevel()
* - This will return the highest level of the enemy party.
* - 这将返回敌方的最高等级。
*
* ============================================================================
* Plugin Commands
* ============================================================================
*
* If you wish to change enemy levels through plugin commands, you can use the
* following plugin commands to alter them. These plugin commands are only used
* inside battle.
* 如果你想通过插件命令改变敌人的等级,你可以使用以下插件命令来改变它们。
* 这些插件命令仅在战斗中使用。
*
* Plugin Command:
*
* EnemyLevelChange 2 to 50
* - This will reset the enemy in position 2's level to 50.
* - 这会将位置 2 的敌人等级重置为 50。
*
* EnemyLevelChangeAll 50
* - This will change the levels of all enemies to 50.
* - 这会将所有敌人的等级更改为 50。
*
* EnemyGainLevel 3 by 20
* - This will cause the enemy in positon 3 to gain 20 levels.
* - 这将导致位置 3 中的敌人增加 20 级。
*
* EnemyGainLevelAll 20
* - This will cause all enemies to gain 20 levels.
* - 这将导致所有敌人增加 20 级。
*
* EnemyLoseLevel 4 by 10
* - This will cause the enemy in positon 4 to lose 10 levels.
* - 这将导致位置 4 中的敌人减少 10 级。
*
* EnemyLoseLevelAll 10
* - This will cause all enemies to lose 10 levels.
* - 这将导致所有敌人减少10个等级。
*
* EnemyLevelReset 5
* - This will reset the enemy in position 5's level to the level it had at
* the start of battle.
* - 这会将位置 5 的敌人重置为战斗开始时的等级。
*
* EnemyLevelResetAll
* - This will reset all enemy levels to their original levels.
* - 这会将所有敌人等级重置为原始等级。
*
* ============================================================================
* Changelog
* ============================================================================
*
* Version 1.09:
* - Bypass the isDevToolsOpen() error when bad code is inserted into a script
* call or custom Lunatic Mode code segment due to updating to MV 1.6.1.
*
* Version 1.08:
* - Updated for RPG Maker MV version 1.5.0.
*
* Version 1.07:
* - Enemy Transform event now adjusts for stat changes when transforming into
* a different enemy.
*
* Version 1.06:
* - Lunatic Mode fail safes added.
*
* Version 1.05:
* - Updated the custom level formula to have the formulas 'b', 'r', and 'f' to
* be able to use the formulas from FlyingDream's calculator.
*
* Version 1.04:
* - Updated for RPG Maker MV version 1.1.0.
*
* Version 1.03:
* - Fixed a bug with average level calculation types for enemies.
*
* Version 1.02:
* - Fixed a bug regarding a line of code that wasn't added properly.
*
* Version 1.01:
* - Added <Ignore Level Bonus> notetag. This causes enemies to maintain their
* current level but ignore any bonus stats applied by the level difference. If
* the enemy's level is altered, its stats remain static and unchanging.
*
* Version 1.00:
* - Finished Plugin!
*/
//=============================================================================
//=============================================================================
// Parameter Variables
//=============================================================================
Yanfly.Parameters = PluginManager.parameters("YEP_EnemyLevels");
Yanfly.Param = Yanfly.Param || {};
Yanfly.Param.ELVShow = eval(String(Yanfly.Parameters["Show Level"]));
Yanfly.Param.ELVFmt = String(Yanfly.Parameters["Level Format"]);
Yanfly.Param.ELVMinLv = Number(Yanfly.Parameters["Minimum Level"]);
Yanfly.Param.ELVMaxLv = Number(Yanfly.Parameters["Maximum Level"]);
Yanfly.Param.ELVMaxCap = Number(Yanfly.Parameters["Maximum Cap"]);
Yanfly.Param.ELVPreserveRate = eval(String(Yanfly.Parameters["Preserve Rate"]));
Yanfly.Param.ELVDefaultType = Number(Yanfly.Parameters["Default Type"]);
Yanfly.Param.ELVPosFluc = Number(Yanfly.Parameters["Positive Fluctuation"]);
Yanfly.Param.ELVNegFluc = Number(Yanfly.Parameters["Negative Fluctuation"]);
Yanfly.Param.ELVFormula = [
String(Yanfly.Parameters["MaxHP Formula"]),
String(Yanfly.Parameters["MaxMP Formula"]),
String(Yanfly.Parameters["ATK Formula"]),
String(Yanfly.Parameters["DEF Formula"]),
String(Yanfly.Parameters["MAT Formula"]),
String(Yanfly.Parameters["MDF Formula"]),
String(Yanfly.Parameters["AGI Formula"]),
String(Yanfly.Parameters["LUK Formula"]),
String(Yanfly.Parameters["EXP Formula"]),
String(Yanfly.Parameters["Gold Formula"]),
];
Yanfly.Param.ELVRate = [
Number(Yanfly.Parameters["MaxHP Rate Growth"]),
Number(Yanfly.Parameters["MaxMP Rate Growth"]),
Number(Yanfly.Parameters["ATK Rate Growth"]),
Number(Yanfly.Parameters["DEF Rate Growth"]),
Number(Yanfly.Parameters["MAT Rate Growth"]),
Number(Yanfly.Parameters["MDF Rate Growth"]),
Number(Yanfly.Parameters["AGI Rate Growth"]),
Number(Yanfly.Parameters["LUK Rate Growth"]),
Number(Yanfly.Parameters["EXP Rate Growth"]),
Number(Yanfly.Parameters["Gold Rate Growth"]),
];
Yanfly.Param.ELVFlat = [
Number(Yanfly.Parameters["MaxHP Flat Growth"]),
Number(Yanfly.Parameters["MaxMP Flat Growth"]),
Number(Yanfly.Parameters["ATK Flat Growth"]),
Number(Yanfly.Parameters["DEF Flat Growth"]),
Number(Yanfly.Parameters["MAT Flat Growth"]),
Number(Yanfly.Parameters["MDF Flat Growth"]),
Number(Yanfly.Parameters["AGI Flat Growth"]),
Number(Yanfly.Parameters["LUK Flat Growth"]),
Number(Yanfly.Parameters["EXP Flat Growth"]),
Number(Yanfly.Parameters["Gold Flat Growth"]),
];
//=============================================================================
// DataManager
//=============================================================================
Yanfly.ELV.DataManager_isDatabaseLoaded = DataManager.isDatabaseLoaded;
DataManager.isDatabaseLoaded = function () {
if (!Yanfly.ELV.DataManager_isDatabaseLoaded.call(this)) return false;
if (!Yanfly._loaded_YEP_EnemyLevels) {
this.processELVNotetagsS($dataSkills);
this.processELVNotetags1($dataEnemies);
this.processELVNotetags2($dataSkills);
this.processELVNotetags2($dataItems);
Yanfly._loaded_YEP_EnemyLevels = true;
}
return true;
};
DataManager.processELVNotetagsS = function (group) {
if (Yanfly.SkillIdRef) return;
Yanfly.SkillIdRef = {};
for (var n = 1; n < group.length; n++) {
var obj = group[n];
if (obj.name.length <= 0) continue;
Yanfly.SkillIdRef[obj.name.toUpperCase()] = n;
}
};
DataManager.processELVNotetags1 = function (group) {
var note1a = /<(.*)[ ]RATE:[ ]([\+\-]\d+)([%])[ ]PER LEVEL>/i;
var note1b = /<(.*)[ ]RATE:[ ]([\+\-]\d+).(\d+)[ ]PER LEVEL>/i;
var note2a = /<(.*)[ ]FLAT:[ ]([\+\-]\d+)[ ]PER LEVEL>/i;
var note2b = /<(.*)[ ]FLAT:[ ]([\+\-]\d+).(\d+)[ ]PER LEVEL>/i;
for (var n = 1; n < group.length; n++) {
var obj = group[n];
var notedata = obj.note.split(/[\r\n]+/);
obj.showLevel = Yanfly.Param.ELVShow;
obj.ignoreLevelBonuses = false;
obj.minLevel = Yanfly.Param.ELVMinLv;
obj.maxLevel = Yanfly.Param.ELVMaxLv;
obj.levelType = Yanfly.Param.ELVDefaultType;
obj.positiveLevelFluctuation = Yanfly.Param.ELVPosFluc;
obj.negativeLevelFluctuation = Yanfly.Param.ELVPosFluc;
obj.baseParamFormula = Yanfly.Param.ELVFormula.slice();
obj.baseParamRate = Yanfly.Param.ELVRate.slice();
obj.baseParamFlat = Yanfly.Param.ELVFlat.slice();
obj.resistLevelChange = false;
obj.skillLevelRequirements = {};
var evalMode = "none";
var evalParam = 0;
for (var i = 0; i < notedata.length; i++) {
var line = notedata[i];
if (line.match(/<(?:SHOW LEVEL)>/i)) {
obj.showLevel = true;
} else if (line.match(/<(?:HIDE LEVEL)>/i)) {
obj.showLevel = false;
} else if (line.match(/<(?:IGNORE LEVEL BONUS|IGNORE LEVEL BONUSES)>/i)) {
obj.ignoreLevelBonuses = true;
} else if (line.match(/<(?:MIN LEVEL|MINIMUM LEVEL):[ ](\d+)>/i)) {
obj.minLevel = parseInt(RegExp.$1);
} else if (line.match(/<(?:MAX LEVEL|MAXIMUM LEVEL):[ ](\d+)>/i)) {
obj.maxLevel = parseInt(RegExp.$1);
} else if (line.match(/<(?:SET LEVEL|STATIC LEVEL):[ ](\d+)>/i)) {
obj.minLevel = parseInt(RegExp.$1);
obj.maxLevel = parseInt(RegExp.$1);
} else if (line.match(/<(?:LEVEL TYPE|STARTING LEVEL TYPE):[ ](\d+)>/i)) {
obj.levelType = parseInt(RegExp.$1).clamp(0, 5);
} else if (line.match(/<POSITIVE LEVEL FLUCTUATION:[ ](\d+)>/i)) {
obj.positiveLevelFluctuation = parseInt(RegExp.$1);
} else if (line.match(/<NEGATIVE LEVEL FLUCTUATION:[ ](\d+)>/i)) {
obj.negativeLevelFluctuation = parseInt(RegExp.$1);
} else if (line.match(/<LEVEL FLUCTUATION:[ ](\d+)>/i)) {
obj.positiveLevelFluctuation = parseInt(RegExp.$1);
obj.negativeLevelFluctuation = parseInt(RegExp.$1);
} else if (line.match(note1a)) {
var param = String(RegExp.$1).toUpperCase();
var rate = parseFloat(RegExp.$2) * 0.01;
if (["MAXHP", "MAX HP", "MHP", "HP"].contains(param)) {
param = 0;
} else if (["MAXMP", "MAX MP", "MMP", "MP", "MAXSP", "MAX SP", "MSP", "SP"].contains(param)) {
param = 1;
} else if (["ATK", "STR"].contains(param)) {
param = 2;
} else if (["DEF"].contains(param)) {
param = 3;
} else if (["MAT", "INT", "SPI"].contains(param)) {
param = 4;
} else if (["MDF", "RES"].contains(param)) {
param = 5;
} else if (["AGI", "SPD"].contains(param)) {
param = 6;
} else if (["LUK"].contains(param)) {
param = 7;
} else if (["EXP", "XP"].contains(param)) {
param = 8;
} else if (["GOLD"].contains(param)) {
param = 9;
} else {
continue;
}
obj.baseParamRate[param] = rate;
} else if (line.match(note1b)) {
var param = String(RegExp.$1).toUpperCase();
var rate = parseFloat(String(RegExp.$2) + "." + String(RegExp.$3));
if (["MAXHP", "MAX HP", "MHP", "HP"].contains(param)) {
param = 0;
} else if (["MAXMP", "MAX MP", "MMP", "MP", "MAXSP", "MAX SP", "MSP", "SP"].contains(param)) {
param = 1;
} else if (["ATK", "STR"].contains(param)) {
param = 2;
} else if (["DEF"].contains(param)) {
param = 3;
} else if (["MAT", "INT", "SPI"].contains(param)) {
param = 4;
} else if (["MDF", "RES"].contains(param)) {
param = 5;
} else if (["AGI", "SPD"].contains(param)) {
param = 6;
} else if (["LUK"].contains(param)) {
param = 7;
} else if (["EXP", "XP"].contains(param)) {
param = 8;
} else if (["GOLD"].contains(param)) {
param = 9;
} else {
continue;
}
obj.baseParamRate[param] = rate;
} else if (line.match(note2a)) {
var param = String(RegExp.$1).toUpperCase();
var flat = parseFloat(RegExp.$2);
if (["MAXHP", "MAX HP", "MHP", "HP"].contains(param)) {
param = 0;
} else if (["MAXMP", "MAX MP", "MMP", "MP", "MAXSP", "MAX SP", "MSP", "SP"].contains(param)) {
param = 1;
} else if (["ATK", "STR"].contains(param)) {
param = 2;
} else if (["DEF"].contains(param)) {
param = 3;
} else if (["MAT", "INT", "SPI"].contains(param)) {
param = 4;
} else if (["MDF", "RES"].contains(param)) {
param = 5;
} else if (["AGI", "SPD"].contains(param)) {
param = 6;
} else if (["LUK"].contains(param)) {
param = 7;
} else if (["EXP", "XP"].contains(param)) {
param = 8;
} else if (["GOLD"].contains(param)) {
param = 9;
} else {
continue;
}
obj.baseParamFlat[param] = flat;
} else if (line.match(note2b)) {
var param = String(RegExp.$1).toUpperCase();
var flat = parseFloat(String(RegExp.$2) + "." + String(RegExp.$3));
if (["MAXHP", "MAX HP", "MHP", "HP"].contains(param)) {
param = 0;
} else if (["MAXMP", "MAX MP", "MMP", "MP", "MAXSP", "MAX SP", "MSP", "SP"].contains(param)) {
param = 1;
} else if (["ATK", "STR"].contains(param)) {
param = 2;
} else if (["DEF"].contains(param)) {
param = 3;
} else if (["MAT", "INT", "SPI"].contains(param)) {
param = 4;
} else if (["MDF", "RES"].contains(param)) {
param = 5;
} else if (["AGI", "SPD"].contains(param)) {
param = 6;
} else if (["LUK"].contains(param)) {
param = 7;
} else if (["EXP", "XP"].contains(param)) {
param = 8;
} else if (["GOLD"].contains(param)) {
param = 9;
} else {
continue;
}
obj.baseParamFlat[param] = flat;
} else if (line.match(/<\/CUSTOM PARAMETER[ ](.*)[ ]FORMULA>/i)) {
evalMode = "none";
evalParam = 0;
} else if (line.match(/<CUSTOM PARAMETER[ ](.*)[ ]FORMULA>/i)) {
var param = String(RegExp.$1).toUpperCase();
if (["MAXHP", "MAX HP", "MHP", "HP"].contains(param)) {
param = 0;
} else if (["MAXMP", "MAX MP", "MMP", "MP", "MAXSP", "MAX SP", "MSP", "SP"].contains(param)) {
evalParam = 1;
} else if (["ATK", "STR"].contains(param)) {
evalParam = 2;
} else if (["DEF"].contains(param)) {
evalParam = 3;
} else if (["MAT", "INT", "SPI"].contains(param)) {
evalParam = 4;
} else if (["MDF", "RES"].contains(param)) {
evalParam = 5;
} else if (["AGI", "SPD"].contains(param)) {
evalParam = 6;
} else if (["LUK"].contains(param)) {
evalParam = 7;
} else if (["EXP", "XP"].contains(param)) {
evalParam = 8;
} else if (["GOLD"].contains(param)) {
evalParam = 9;
} else {
continue;
}
obj.baseParamFormula[evalParam] = "";
evalMode = "custom param level formula";
} else if (evalMode === "custom param level formula") {
var pId = evalParam;
obj.baseParamFormula[pId] = obj.baseParamFormula[pId] + line + "\n";
} else if (line.match(/<(?:RESIST LEVEL CHANGE)>/i)) {
obj.resistLevelChange = true;
} else if (line.match(/<SKILL[ ](\d+)[ ]REQUIRE LEVEL:[ ](\d+)>/i)) {
var skillId = parseInt(RegExp.$1);
var level = parseInt(RegExp.$2);
obj.skillLevelRequirements[skillId] = level;
} else if (line.match(/<SKILL[ ](.*)[ ]REQUIRE LEVEL:[ ](\d+)>/i)) {
var name = String(RegExp.$1).toUpperCase();
var level = parseInt(RegExp.$2);
if (Yanfly.SkillIdRef[name]) {
var skillId = Yanfly.SkillIdRef[name];
} else {
continue;
}
obj.skillLevelRequirements[skillId] = level;
}
}
evalMode = "none";
if (obj.levelType === 0) {
obj.startingLevel = "level = $gameParty.lowestLevelAllMembers()";
} else if (obj.levelType === 1) {
obj.startingLevel = "level = $gameParty.lowestLevelBattleMembers()";
} else if (obj.levelType === 2) {
obj.startingLevel = "level = $gameParty.averageLevelAllMembers()";
} else if (obj.levelType === 3) {
obj.startingLevel = "level = $gameParty.averageLevelBattleMembers()";
} else if (obj.levelType === 4) {
obj.startingLevel = "level = $gameParty.highestLevelAllMembers()";
} else if (obj.levelType === 5) {
obj.startingLevel = "level = $gameParty.highestLevelBattleMembers()";
}
for (var i = 0; i < notedata.length; i++) {
var line = notedata[i];
if (line.match(/<(?:CUSTOM STARTING LEVEL)>/i)) {
obj.startingLevel = "";
evalMode = "custom starting level";
} else if (line.match(/<\/(?:CUSTOM STARTING LEVEL)>/i)) {
evalMode = "none";
} else if (evalMode === "custom starting level") {
obj.startingLevel = obj.startingLevel + line + "\n";
}
}
}
};
DataManager.processELVNotetags2 = function (group) {
for (var n = 1; n < group.length; n++) {
var obj = group[n];
var notedata = obj.note.split(/[\r\n]+/);
obj.resetEnemyLevel = false;
obj.changeEnemyLevel = 0;
obj.enemyLevelEval = "";
var evalMode = "none";
for (var i = 0; i < notedata.length; i++) {
var line = notedata[i];
if (line.match(/<(?:CHANGE ENEMY LEVEL):[ ]([\+\-]\d+)>/i)) {
obj.changeEnemyLevel = parseInt(RegExp.$1);
} else if (line.match(/<(?:RESET ENEMY LEVEL)>/i)) {
obj.resetEnemyLevel = true;
} else if (line.match(/<(?:CUSTOM CHANGE ENEMY LEVEL)>/i)) {
var evalMode = "custom change enemy level";
} else if (line.match(/<\/(?:CUSTOM CHANGE ENEMY LEVEL)>/i)) {
var evalMode = "none";
} else if (evalMode === "custom change enemy level") {
obj.enemyLevelEval = obj.enemyLevelEval + line + "\n";
}
}
}
};
//=============================================================================
// Game_BattlerBase
//=============================================================================
Yanfly.ELV.Game_BattlerBase_isSkillSealed = Game_BattlerBase.prototype.isSkillSealed;
Game_BattlerBase.prototype.isSkillSealed = function (skillId) {
if (this.isEnemySkillLevelSealed(skillId)) return true;
return Yanfly.ELV.Game_BattlerBase_isSkillSealed.call(this, skillId);
};
Game_BattlerBase.prototype.isEnemySkillLevelSealed = function (skillId) {
if (!this.isEnemy()) return false;
if (!this.enemy().skillLevelRequirements[skillId]) return false;
var reqLevel = this.enemy().skillLevelRequirements[skillId];
return this.level < reqLevel;
};
//=============================================================================
// Game_Enemy
//=============================================================================
Object.defineProperty(Game_Enemy.prototype, "level", {
get: function () {
return this._level;
},
configurable: true,
});
Yanfly.ELV.Game_Enemy_initMembers = Game_Enemy.prototype.initMembers;
Game_Enemy.prototype.initMembers = function () {
Yanfly.ELV.Game_Enemy_initMembers.call(this);
this._level = 0;
};
Yanfly.ELV.Game_Enemy_setup = Game_Enemy.prototype.setup;
Game_Enemy.prototype.setup = function (enemyId, x, y) {
this._enemyId = enemyId;
this.setupEnemyLevel();
Yanfly.ELV.Game_Enemy_setup.call(this, enemyId, x, y);
};
Game_Enemy.prototype.setupEnemyLevel = function () {
var min = this.setupMinimumLevel();
var max = this.setupMaximumLevel();
this._level = this.getSetupLevel().clamp(min, max);
this.applySetupLevelFluctuation();
this._level = this._level.clamp(1, Yanfly.Param.ELVMaxCap);
this._originalLevel = this._level;
};
Game_Enemy.prototype.setupMinimumLevel = function () {
return this.enemy().minLevel;
};
Game_Enemy.prototype.setupMaximumLevel = function () {
return this.enemy().maxLevel;
};
Game_Enemy.prototype.originalLevel = function () {
return this._originalLevel;
};
Game_Enemy.prototype.getSetupLevel = function () {
var level = 0;
var code = this.enemy().startingLevel;
try {
eval(code);
} catch (e) {
Yanfly.Util.displayError(e, code, "ENEMY STARTING LEVEL ERROR");
}
return Math.floor(level);
};
Game_Enemy.prototype.applySetupLevelFluctuation = function () {
var min = this._level - this.negativeLevelFluctuation();
var max = this._level + this.positiveLevelFluctuation();
this._level = Math.floor(Math.random() * (max - min + 1) + min);
};
Game_Enemy.prototype.negativeLevelFluctuation = function () {
return this.enemy().negativeLevelFluctuation;
};
Game_Enemy.prototype.positiveLevelFluctuation = function () {
return this.enemy().positiveLevelFluctuation;
};
Yanfly.ELV.Game_Enemy_name = Game_Enemy.prototype.name;
Game_Enemy.prototype.name = function () {
var name = Yanfly.ELV.Game_Enemy_name.call(this);
if (this.enemy().showLevel) {
var fmt = Yanfly.Param.ELVFmt;
name = fmt.format(this.level, name);
}
return name;
};
Yanfly.ELV.Game_Enemy_paramBase = Game_Enemy.prototype.paramBase;
Game_Enemy.prototype.paramBase = function (paramId) {
this._cacheBaseParam = this._cacheBaseParam || {};
if (this._cacheBaseParam[paramId]) return this._cacheBaseParam[paramId];
var base = Yanfly.ELV.Game_Enemy_paramBase.call(this, paramId);
if (this.enemy().ignoreLevelBonuses) {
this._cacheBaseParam[paramId] = base;
return this._cacheBaseParam[paramId];
}
var level = this.level;
var formula = this.enemy().baseParamFormula[paramId];
var rate = this.enemy().baseParamRate[paramId];
var flat = this.enemy().baseParamFlat[paramId];
var user = this;
var s = $gameSwitches._data;
var v = $gameVariables._data;
try {
this._cacheBaseParam[paramId] = eval(formula);
} catch (e) {
this._cacheBaseParam[paramId] = 0;
Yanfly.Util.displayError(e, formula, "ENEMY PARAM BASE FORMULA ERROR");
}
return this._cacheBaseParam[paramId];
};
Yanfly.ELV.Game_Enemy_exp = Game_Enemy.prototype.exp;
Game_Enemy.prototype.exp = function () {
var paramId = 8;
this._cacheBaseParam = this._cacheBaseParam || {};
if (this._cacheBaseParam[paramId]) return this._cacheBaseParam[paramId];
var base = Yanfly.ELV.Game_Enemy_exp.call(this);
if (this.enemy().ignoreLevelBonuses) {
this._cacheBaseParam[paramId] = base;
return this._cacheBaseParam[paramId];
}
var level = this.level;
var formula = this.enemy().baseParamFormula[paramId];
var rate = this.enemy().baseParamRate[paramId];
var flat = this.enemy().baseParamFlat[paramId];
var user = this;
var b = base;
var l = level;
var f = flat;
var r = rate;
var s = $gameSwitches._data;
var v = $gameVariables._data;
try {
this._cacheBaseParam[paramId] = Math.floor(eval(formula));
} catch (e) {
this._cacheBaseParam[paramId] = 0;
Yanfly.Util.displayError(e, formula, "ENEMY EXP FORMULA ERROR");
}
return this._cacheBaseParam[paramId];
};
Yanfly.ELV.Game_Enemy_gold = Game_Enemy.prototype.gold;
Game_Enemy.prototype.gold = function () {
var paramId = 9;
this._cacheBaseParam = this._cacheBaseParam || {};
if (this._cacheBaseParam[paramId]) return this._cacheBaseParam[paramId];
var base = Yanfly.ELV.Game_Enemy_gold.call(this);
if (this.enemy().ignoreLevelBonuses) {
this._cacheBaseParam[paramId] = base;
return this._cacheBaseParam[paramId];
}
var level = this.level;
var formula = this.enemy().baseParamFormula[paramId];
var rate = this.enemy().baseParamRate[paramId];
var flat = this.enemy().baseParamFlat[paramId];
var user = this;
var s = $gameSwitches._data;
var v = $gameVariables._data;
try {
this._cacheBaseParam[paramId] = Math.floor(eval(formula));
} catch (e) {
this._cacheBaseParam[paramId] = 0;
Yanfly.Util.displayError(e, formula, "ENEMY GOLD FORMULA ERROR");
}
return this._cacheBaseParam[paramId];
};
Game_Enemy.prototype.changeLevel = function (level) {
if (level === this._level) return;
if (Yanfly.Param.ELVPreserveRate) {
var hpRate = this.hp / Math.max(1, this.mhp);
var mpRate = this.mp / Math.max(1, this.mmp);
var prevHp = Math.min(this.hp, 1);
}
this._level = level.clamp(1, Yanfly.Param.ELVMaxCap);
this._cacheBaseParam = {};
this.refresh();
if (Yanfly.Param.ELVPreserveRate) {
var max = this.isDead() ? 0 : prevHp;
var hpAmount = Math.max(max, parseInt(this.mhp * hpRate));
this.setHp(hpAmount);
this.setMp(parseInt(this.mmp * mpRate));
}
};
Game_Enemy.prototype.gainLevel = function (value) {
this.changeLevel(this.level + value);
};
Game_Enemy.prototype.loseLevel = function (value) {
this.changeLevel(this.level - value);
};
Game_Enemy.prototype.isResistLevelChange = function () {
return this.enemy().resistLevelChange;
};
Game_Enemy.prototype.resetLevel = function () {
this.changeLevel(this.originalLevel());
};
Yanfly.ELV.Game_Enemy_transform = Game_Enemy.prototype.transform;
Game_Enemy.prototype.transform = function (enemyId) {
Yanfly.ELV.Game_Enemy_transform.call(this, enemyId);
this._cacheBaseParam = {};
};
//=============================================================================
// Game_Party
//=============================================================================
Game_Party.prototype.lowestLevelAllMembers = function () {
var length = this.allMembers().length;
var value = Yanfly.Param.ELVMaxCap;
for (var i = 0; i < length; ++i) {
var member = this.allMembers()[i];
value = Math.min(value, member.level);
}
return value;
};
Game_Party.prototype.lowestLevelBattleMembers = function () {
var length = this.battleMembers().length;
var value = Yanfly.Param.ELVMaxCap;
for (var i = 0; i < length; ++i) {
var member = this.battleMembers()[i];
value = Math.min(value, member.level);
}
return value;
};
Game_Party.prototype.averageLevelAllMembers = function () {
var length = this.allMembers().length;
var value = 0;
for (var i = 0; i < length; ++i) {
var member = this.allMembers()[i];
value += member.level;
}
return Math.ceil(value / length);
};
Game_Party.prototype.averageLevelBattleMembers = function () {
var length = this.battleMembers().length;
var value = 0;
for (var i = 0; i < length; ++i) {
var member = this.battleMembers()[i];
value += member.level;
}
return Math.ceil(value / length);
};
Game_Party.prototype.highestLevelAllMembers = function () {
var length = this.allMembers().length;
var value = 0;
for (var i = 0; i < length; ++i) {
var member = this.allMembers()[i];
value = Math.max(value, member.level);
}
return value;
};
Game_Party.prototype.highestLevelBattleMembers = function () {
var length = this.battleMembers().length;
var value = 0;
for (var i = 0; i < length; ++i) {
var member = this.battleMembers()[i];
value = Math.max(value, member.level);
}
return value;
};
//=============================================================================
// Game_Troop
//=============================================================================
Game_Troop.prototype.changeLevel = function (value) {
var length = this.members().length;
for (var i = 0; i < length; ++i) {
var member = this.members()[i];
if (member) member.changeLevel(value);
}
};
Game_Troop.prototype.gainLevel = function (value) {
var length = this.members().length;
for (var i = 0; i < length; ++i) {
var member = this.members()[i];
if (member) member.gainLevel(value);
}
};
Game_Troop.prototype.loseLevel = function (value) {
var length = this.members().length;
for (var i = 0; i < length; ++i) {
var member = this.members()[i];
if (member) member.loseLevel(value);
}
};
Game_Troop.prototype.resetLevel = function () {
var length = this.members().length;
for (var i = 0; i < length; ++i) {
var member = this.members()[i];
if (member) member.resetLevel();
}
};
Game_Troop.prototype.lowestLevel = function () {
var length = this.members().length;
var value = Yanfly.Param.ELVMaxCap;
for (var i = 0; i < length; ++i) {
var member = this.members()[i];
value = Math.min(value, member.level);
}
return value;
};
Game_Troop.prototype.averageLevel = function () {
var length = this.members().length;
var value = 0;
for (var i = 0; i < length; ++i) {
var member = this.members()[i];
value = member.level;
}
return Math.ceil(value / length);
};
Game_Troop.prototype.highestLevel = function () {
var length = this.members().length;
var value = 0;
for (var i = 0; i < length; ++i) {
var member = this.members()[i];
value = Math.max(value, member.level);
}
return value;
};
//=============================================================================
// Game_Action
//=============================================================================
Yanfly.ELV.Game_Action_applyItemUserEffect = Game_Action.prototype.applyItemUserEffect;
Game_Action.prototype.applyItemUserEffect = function (target) {
Yanfly.ELV.Game_Action_applyItemUserEffect.call(this, target);
if (target && target.isEnemy()) this.applyItemEnemyLevelEffects(target);
};
Game_Action.prototype.applyItemEnemyLevelEffects = function (target) {
if (!this.item()) return;
if (target.isResistLevelChange()) return;
if (this.item().resetEnemyLevel) target.resetLevel();
var level = target.level + this.item().changeEnemyLevel;
if (this.item().enemyLevelEval !== "") {
level = this.itemEnemyLevelEval(target, level);
}
target.changeLevel(level);
};
Game_Action.prototype.itemEnemyLevelEval = function (target, level) {
var item = this.item();
var a = this.subject();
var b = target;
var user = this.subject();
var subject = this.subject();
var s = $gameSwitches._data;
var v = $gameVariables._data;
var code = this.item().enemyLevelEval;
try {
eval(code);
} catch (e) {
Yanfly.Util.displayError(e, code, "ENEMY LEVEL ITEM ALTER CODE ERROR");
}
return level;
};
//=============================================================================
// Game_Interpreter
//=============================================================================
Yanfly.ELV.Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
Game_Interpreter.prototype.pluginCommand = function (command, args) {
Yanfly.ELV.Game_Interpreter_pluginCommand.call(this, command, args);
if (!$gameParty.inBattle()) return;
if (command === "EnemyLevelReset") this.resetEnemyLevel(args);
if (command === "EnemyLevelResetAll") $gameTroop.resetLevel();
if (command === "EnemyLevelChange") this.changeEnemyLevel(args);
if (command === "EnemyLevelChangeAll") this.changeEnemyLevelAll(args);
if (command === "EnemyGainLevel") this.gainEnemyLevel(args);
if (command === "EnemyGainLevelAll") this.gainEnemyLevelAll(args);
if (command === "EnemyLoseLevel") this.loseEnemyLevel(args);
if (command === "EnemyLoseLevelAll") this.loseEnemyLevelAll(args);
};
Game_Interpreter.prototype.resetEnemyLevel = function (args) {
if (!args) return;
var index = parseInt(args[0]) - 1;
var enemy = $gameTroop.members()[index];
if (enemy) enemy.resetLevel();
};
Game_Interpreter.prototype.changeEnemyLevel = function (args) {
if (!args) return;
var index = parseInt(args[0]) - 1;
var level = parseInt(args[2]);
var enemy = $gameTroop.members()[index];
if (enemy) enemy.changeLevel(level);
};
Game_Interpreter.prototype.changeEnemyLevelAll = function (args) {
if (!args) return;
var level = parseInt(args[0]);
$gameTroop.changeLevel(level);
};
Game_Interpreter.prototype.gainEnemyLevel = function (args) {
if (!args) return;
var index = parseInt(args[0]) - 1;
var level = parseInt(args[2]);
var enemy = $gameTroop.members()[index];
if (enemy) enemy.gainLevel(level);
};
Game_Interpreter.prototype.gainEnemyLevelAll = function (args) {
if (!args) return;
var level = parseInt(args[0]);
$gameTroop.gainLevel(level);
};
Game_Interpreter.prototype.loseEnemyLevel = function (args) {
if (!args) return;
var index = parseInt(args[0]) - 1;
var level = parseInt(args[2]);
var enemy = $gameTroop.members()[index];
if (enemy) enemy.loseLevel(level);
};
Game_Interpreter.prototype.loseEnemyLevelAll = function (args) {
if (!args) return;
var level = parseInt(args[0]);
$gameTroop.loseLevel(level);
};
//=============================================================================
// 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.RPGMAKER_VERSION && Utils.RPGMAKER_VERSION >= "1.6.0") return;
if (Utils.isNwjs() && Utils.isOptionValid("test")) {
if (!require("nw.gui").Window.get().isDevToolsOpen()) {
require("nw.gui").Window.get().showDevTools();
}
}
};
//=============================================================================
// End of File
//=============================================================================