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

1414 lines
47 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 - Damage Core
// YEP_DamageCore.js
//=============================================================================
var Imported = Imported || {};
Imported.YEP_DamageCore = true;
var Yanfly = Yanfly || {};
Yanfly.DMG = Yanfly.DMG || {};
Yanfly.DMG.version = 1.06;
//=============================================================================
/*:
* @plugindesc v1.06 伤害核心☁️
* @author Yanfly Engine Plugins
*
* @param ---破环上限---
* @default
*
* @param Enable Cap
* @text 启用上限
* @desc Do you wish to put a cap on your damage?
* NO - false YES - true Default: false
* @default true
*
* @param Maximum Damage
* @text 伤害上限
* @desc If enabled, what is the default maximum damage?
* @default 9999
*
* @param Maximum Healing
* @text 治疗上限
* @desc If enabled, what is the default maximum healing?
* @default 9999
*
* @param ---破坏步骤---
* @default
*
* @param Damage Step 1
* @text 破坏步骤1
* @desc 这是计算完基值后的步骤。
* 上一行baseDamage=this.evalDamageFormula目标
* @default baseDamage = this.modifyBaseDamage(value, baseDamage, target);
*
* @param Damage Step 2
* @text 破坏步骤2
* @desc 这是伤害步骤的下一步。
* @default baseDamage *= this.calcElementRate(target);
*
* @param Damage Step 3
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 4
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 5
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 6
* @desc This is the next step in the damage flow.
* @default critical = this.modifyCritical(critical, baseDamage, target);
*
* @param Damage Step 7
* @desc This is the next step in the damage flow.
* @default target.result().critical = critical;
*
* @param Damage Step 8
* @desc This is the next step in the damage flow.
* @default value = baseDamage;
*
* @param Damage Step 9
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 10
* @desc This is the next step in the damage flow.
* @default if (baseDamage > 0) {
*
* @param Damage Step 11
* @desc This is the next step in the damage flow.
* @default value = this.applyDamageRate(value, baseDamage, target);
*
* @param Damage Step 12
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 13
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 14
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 15
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 16
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 17
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 18
* @desc This is the next step in the damage flow.
* @default }
*
* @param Damage Step 19
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 20
* @desc This is the next step in the damage flow.
* @default if (baseDamage < 0) {
*
* @param Damage Step 21
* @desc This is the next step in the damage flow.
* @default value = this.applyHealRate(value, baseDamage, target);
*
* @param Damage Step 22
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 23
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 24
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 25
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 26
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 27
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 28
* @desc This is the next step in the damage flow.
* @default }
*
* @param Damage Step 29
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 30
* @desc This is the next step in the damage flow.
* @default if (critical) {
*
* @param Damage Step 31
* @desc This is the next step in the damage flow.
* @default value = this.applyCriticalRate(value, baseDamage, target);
*
* @param Damage Step 32
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 33
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 34
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 35
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 36
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 37
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 38
* @desc This is the next step in the damage flow.
* @default }
*
* @param Damage Step 39
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 40
* @desc This is the next step in the damage flow.
* @default if (this.isPhysical()) {
*
* @param Damage Step 41
* @desc This is the next step in the damage flow.
* @default value = this.applyPhysicalRate(value, baseDamage, target);
*
* @param Damage Step 42
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 43
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 44
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 45
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 46
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 47
* @desc This is the next step in the damage flow.
* @default value = this.applyFlatPhysical(value, baseDamage, target);
*
* @param Damage Step 48
* @desc This is the next step in the damage flow.
* @default }
*
* @param Damage Step 49
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 50
* @desc This is the next step in the damage flow.
* @default if (this.isMagical()) {
*
* @param Damage Step 51
* @desc This is the next step in the damage flow.
* @default value = this.applyMagicalRate(value, baseDamage, target);
*
* @param Damage Step 52
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 53
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 54
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 55
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 56
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 57
* @desc This is the next step in the damage flow.
* @default value = this.applyFlatMagical(value, baseDamage, target);
*
* @param Damage Step 58
* @desc This is the next step in the damage flow.
* @default }
*
* @param Damage Step 59
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 60
* @desc This is the next step in the damage flow.
* @default if (baseDamage > 0) {
*
* @param Damage Step 61
* @desc This is the next step in the damage flow.
* @default value = this.applyFlatDamage(value, baseDamage, target);
*
* @param Damage Step 62
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 63
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 64
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 65
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 66
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 67
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 68
* @desc This is the next step in the damage flow.
* @default }
*
* @param Damage Step 69
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 70
* @desc This is the next step in the damage flow.
* @default if (baseDamage < 0) {
*
* @param Damage Step 71
* @desc This is the next step in the damage flow.
* @default value = this.applyFlatHeal(value, baseDamage, target);
*
* @param Damage Step 72
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 73
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 74
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 75
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 76
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 77
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 78
* @desc This is the next step in the damage flow.
* @default }
*
* @param Damage Step 79
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 80
* @desc This is the next step in the damage flow.
* @default if (critical) {
*
* @param Damage Step 81
* @desc This is the next step in the damage flow.
* @default value = this.applyFlatCritical(value, baseDamage, target);
*
* @param Damage Step 82
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 83
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 84
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 85
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 86
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 87
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 88
* @desc This is the next step in the damage flow.
* @default }
*
* @param Damage Step 89
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 90
* @desc This is the next step in the damage flow.
* @default value = this.applyVariance(value, item.damage.variance);
*
* @param Damage Step 91
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 92
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 93
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 94
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 95
* @desc This is the next step in the damage flow.
* @default value = this.applyGuard(value, target);
*
* @param Damage Step 96
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 97
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 98
* @desc This is the next step in the damage flow.
* @default
*
* @param Damage Step 99
* @desc This is the next step in the damage flow.
* @default value = this.applyFlatGlobal(value, baseDamage, target);
*
* @param Damage Step 100
* @desc This is the final step in the damage flow.
* Following line: return Math.round(value);
* @default value = this.applyMinimumDamage(value, baseDamage, target);
*
* @help
* ============================================================================
* Introduction
* ============================================================================
*
* 游戏中可以设置关于造成伤害的公式,但是并没有与计算伤害公式后的相关设置
* 。利用这个插件,你可以插入你自己的调整进入伤害公式。
*
* 如果你使用了YEP_BattleEngineCore.js把它放在YEP_BattleEngineCore.js下面
*
* ============================================================================
* Notetags
* ============================================================================
*
* 下面的标签你可以用来调整
*
* Skill and Item Notetag:
* <Bypass Damage Cap>
* This causes the skill/item to ignore the damage cap and go with the
* regular value of the calculated damage. This will cancel out any damage
* cap effects otherwise. This will take priority over any damage cap
* breaking effects.忽略伤害限制
*
* Actor, Class, Enemy, Weapon, Armor, and State Notetags:
* <Bypass Damage Cap> 忽略伤害限制
* This will cause the related battler to bypass any damage capping effects
* and its skills/items will go with the uncapped calculated value.
*
* <Damage Cap: x>
* <Heal Cap: x>
* This will set the skill to have a damage/healing cap of x. This will
* cancel out any damage cap bypassers. If a battler has more than one
* damage cap, it will go with the highest value. This means if an actor that
* has a weapon that brings the damage cap to 99,999 and an accessory that
* brings the damage cap to 999,999, then the battler's damage cap will be
* the highest value of 999,999.设置伤害限制和治疗限制
*
* ============================================================================
* Plugin Commands
* ============================================================================
*
* 你可以用下面的插件命令来设置伤害限制规则。请注意,装备特性,技能特性将
* 不会受影响
*
* Plugin Command:
* SetDamageCap 9999 伤害上限为9999
* SetHealingCap 9999 治疗上限为9999
* EnableDamageCap 开启伤害上限
* DisableDamageCap 关闭伤害上限
*
* ============================================================================
* Lunatic Mode - Damage Formula
* ============================================================================
*
* For those who think the damage formula box is too small and would like to
* use the notebox instead to declare the damage formula, you can use the
* notetags below:
*
* Skill and Item Notetags:
* <damage formula>
* value = 500;
* value += 2500;
* </damage formula>
* This will overwrite the damage formula found at the top and use the
* strings in the middle as the formula instead. Keep in mind that using
* comments here will cancel out anything following after. New variables can
* be used, too, to make damage calculations a bit easier.
*
* value - Refers to the amount that will become the base damage value.
* user - Refers to the actor/enemy using the skill/item.
* subject - Refers to the actor/enemy using the skill/item.
* target - Refers to the target actor/enemy on the receiving end of
* the skill/item.
*
* ============================================================================
* Lunatic Mode - Damage Steps
* ============================================================================
*
* The damage formula isn't all there is to calculating the damage that appears
* at the very end. In this plugin's parameters towards the bottom, you'll see
* a large list of Damage Steps. Each one of these steps is a line of code that
* the damage count will run through in order to calculate and finalize the
* damage output.
*
* The purpose of those parameters is to allow you ease of access on where you
* want to insert code that is your own or custom code provided by another
* plugin. Here's a quick reference on how the original damage flow looked like:
*
* Game_Action.prototype.makeDamageValue = function(target, critical) {
* var item = this.item();
* var baseDamage = this.evalDamageFormula(target);
* var value = baseDamage * this.calcElementRate(target);
* if (this.isPhysical()) {
* value *= target.pdr;
* }
* if (this.isMagical()) {
* value *= target.mdr;
* }
* if (baseDamage < 0) {
* value *= target.rec;
* }
* if (critical) {
* value = this.applyCritical(value);
* }
* value = this.applyVariance(value, item.damage.variance);
* value = this.applyGuard(value, target);
* value = Math.round(value);
* return value;
* };
*
* In the vein of keeping everything organized, the following lines have been
* incorporated into new functions:
*
* Formula New Function
* value *= target.pdr value = this.applyPhysicalRate
* value *= target.mdr value = this.applyMagicalRate
* value *= target.rec value = this.applyHealRate
* value = this.applyCritical(value) value = this.applyCriticalRate
*
* ============================================================================
* Yanfly Engine Plugins - Battle Engine Extension - Action Sequence Commands
* ============================================================================
*
* If you have YEP_BattleEngineCore.js installed with this plugin located
* underneath it in the Plugin Manager, you can make use of these extra
* damage related action sequences.
*
*=============================================================================
* BYPASS DAMAGE CAP
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* This will override all damage caps. This is applied to healing, too.
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* Usage Example: bypass damage cap
*=============================================================================
*
*=============================================================================
* DAMAGE CAP: x
* HEALING CAP: x
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* This sets the action's damage cap to x, overriding all over damage caps in
* play except its own. This will also apply to healing, too.
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* Usage Example: damage cap: 999
* healing cap: 999999
*=============================================================================
*
*=============================================================================
* DAMAGE RATE: x%
* DAMAGE RATE: x.y
* DAMAGE RATE: VARIABLE x
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* This changes the damage rate across all types of damage (physical, magical,
* and certain hit). The damage rate is reset at the end of each action
* sequence. If you use a variable, it is treated as a percentage.
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* Usage Example: damage rate: 50%
* damage rate: 8.667
* damage rate: variable 3
*=============================================================================
*
*=============================================================================
* FLAT DAMAGE: +x
* FLAT DAMAGE: -x
* FLAT DAMAGE: VARIABLE x
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* This adds a flat damage across all types of damage (physical, magical, and
* certain hit). The flat damage is reset at the end of each action sequence.
* If you use a variable, it is added onto the damage.
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* Usage Example: flat damage: +100
* flat damage: -250
* flat damage: variable 3
*=============================================================================
*
*=============================================================================
* FLAT GLOBAL: +x
* FLAT GLOBAL: -x
* FLAT GLOBAL: VARIABLE x
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* This adds a flat global damage and heal across all types of damage
* (physical, magical, and certain hit). The flat damage and heal is reset at
* the end of each action sequence. If you use a variable, it is added onto the
* damage and heal.
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* Usage Example: flat global: +100
* flat global: -250
* flat global: variable 3
*=============================================================================
*
*=============================================================================
* FLAT HEAL: +x
* FLAT HEAL: -x
* FLAT HEAL: VARIABLE x
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* This adds a flat heal across all types of damage (physical, magical, and
* certain hit). The flat heal is reset at the end of each action sequence.
* If you use a variable, it is added onto the heal.
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* Usage Example: flat heal: +100
* flat heal: -250
* flat heal: variable 3
*=============================================================================
*
*=============================================================================
* GLOBAL RATE: x%
* GLOBAL RATE: x.y
* GLOBAL RATE: VARIABLE x
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* This changes the damage and healing rates across all types of damage
* (physical, magical, and certain hit). The damage and healing rates are reset
* at the end of each action sequence. If you use a variable, it is treated as
* a percentage.
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* Usage Example: global rate: 50%
* global rate: 8.667
* global rate: variable 3
*=============================================================================
*
*=============================================================================
* HEAL RATE: x%
* HEAL RATE: x.y
* HEAL RATE: VARIABLE x
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* This changes the healing rate across all types of damage (physical, magical,
* and certain hit). The healing rate is reset at the end of each action
* sequence. If you use a variable, it is treated as a percentage.
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* Usage Example: heal rate: 50%
* heal rate: 8.667
* heal rate: variable 3
*=============================================================================
*
*=============================================================================
* RESET DAMAGE CAP
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* This will reset the damage cap implemented by the Damage Cap action
* sequence. This will also reset the effects of the Bypass Damage Cap
* action sequence.
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* Usage Example: reset damage cap
*=============================================================================
*
*=============================================================================
* RESET DAMAGE MODIFIERS
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* This will cause all damage and healing modifiers caused by action sequences
* to reset. While they normally reset at the end of each action sequence, this
* will allow you to do it manually.
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* Usage Example: reset damage modifiers
*=============================================================================
*
* ============================================================================
* Changelog
* ============================================================================
*
* Version 1.06:
* - Lunatic Mode fail safes added.
*
* Version 1.05:
* - Added failsafe for damage cap check in case Lunatic Mode effects of other
* plugins would push the damage past the capped amount.
*
* Version 1.04:
* - Rewored Damage Steps 1 through 8. If you're updating from an old version,
* please update the these manually:
* Step 1: baseDamage = this.modifyBaseDamage(value, baseDamage, target);
* Step 2: baseDamage *= this.calcElementRate(target);
* Steps 3 through 5: (empty)
* Step 6: critical = this.modifyCritical(critical, baseDamage, target);
* Step 7: target.result().critical = critical;
* Step 8: value = baseDamage;
* - This change was made to Element Absorb and Disperse Damage better. This
* damage step change is also more efficient in calculating damage effects that
* alters the baseDamage.
*
* Version 1.03:
* - Changed default parameter in Damage Step 4 from
* 'baseDamage = this.modifyBaseDamage(value, baseDamage, target);' to
* 'value = this.modifyBaseDamage(value, baseDamage, target);'
* Be sure to manually change this yourself if you want to get things like the
* Selection Control's Disperse Damage mechanic to work.
*
* Version 1.02:
* - Updated for RPG Maker MV version 1.1.0.
* - <Damage Formula> notetag now supports comments.
*
* Version 1.01:
* - Fixed a bug with <Damage Formula> not recording custom formulas correctly.
*
* Version 1.00:
* - Finished plugin!
*/
//=============================================================================
//=============================================================================
// Parameter Variables
//=============================================================================
Yanfly.Parameters = PluginManager.parameters('YEP_DamageCore');
Yanfly.Param = Yanfly.Param || {};
Yanfly.Param.DMGEnableCap = eval(String(Yanfly.Parameters['Enable Cap']));
Yanfly.Param.DMGMaxDamage = Number(Yanfly.Parameters['Maximum Damage']);
Yanfly.Param.DMGMaxHealing = Number(Yanfly.Parameters['Maximum Healing']);
Yanfly.SetupParameters = function() {
Yanfly.DMG.DamageFlow = '';
for (var i = 1; i <= 100; ++i) {
var param = 'Damage Step ' + i;
Yanfly.DMG.DamageFlow += String(Yanfly.Parameters[param]) + '\n';
}
};
Yanfly.SetupParameters();
//=============================================================================
// DataManager
//=============================================================================
Yanfly.DMG.DataManager_isDatabaseLoaded = DataManager.isDatabaseLoaded;
DataManager.isDatabaseLoaded = function() {
if (!Yanfly.DMG.DataManager_isDatabaseLoaded.call(this)) return false;
if (!Yanfly._loaded_YEP_DamageCore) {
this.processDMGNotetags1($dataSkills);
this.processDMGNotetags1($dataItems);
this.processDMGNotetags2($dataActors);
this.processDMGNotetags2($dataClasses);
this.processDMGNotetags2($dataEnemies);
this.processDMGNotetags2($dataWeapons);
this.processDMGNotetags2($dataArmors);
this.processDMGNotetags2($dataStates);
Yanfly._loaded_YEP_DamageCore = true;
}
return true;
};
DataManager.processDMGNotetags1 = function(group) {
var noteD1 = /<(?:DAMAGE CAP|HEAL CAP|HEALING CAP):[ ](\d+)>/i;
for (var n = 1; n < group.length; n++) {
var obj = group[n];
var notedata = obj.note.split(/[\r\n]+/);
var damageFormulaMode = false;
obj.damage.custom = false;
obj.breakDamageCap = false;
obj.damageCap = undefined;
for (var i = 0; i < notedata.length; i++) {
var line = notedata[i];
if (line.match(/<(?:BREAK DAMAGE CAP|BYPASS DAMAGE CAP)>/i)) {
obj.breakDamageCap = true;
obj.damageCap = undefined;
} else if (line.match(noteD1)) {
obj.damageCap = parseInt(RegExp.$1);
obj.breakDamageCap = false;
} else if (line.match(/<(?:DAMAGE FORMULA)>/i)) {
damageFormulaMode = true;
obj.damage.formula = '';
obj.damage.custom = true;
} else if (line.match(/<\/(?:DAMAGE FORMULA)>/i)) {
damageFormulaMode = false;
} else if (damageFormulaMode) {
obj.damage.formula = obj.damage.formula + line + '\n';
}
}
}
};
DataManager.processDMGNotetags2 = function(group) {
var noteD1 = /<(?:BREAK DAMAGE CAP|BYPASS DAMAGE CAP)>/i;
var noteD2 = /<(?:DAMAGE CAP):[ ](\d+)>/i;
var noteD3 = /<(?:HEAL CAP|HEALING CAP):[ ](\d+)>/i;
for (var n = 1; n < group.length; n++) {
var obj = group[n];
var notedata = obj.note.split(/[\r\n]+/);
obj.breakDamageCap = undefined;
obj.damageCap = undefined;
obj.healCap = undefined;
for (var i = 0; i < notedata.length; i++) {
var line = notedata[i];
if (line.match(noteD1)) {
obj.breakDamageCap = true;
obj.damageCap = undefined;
obj.healCap = undefined;
} else if (line.match(noteD2)) {
obj.damageCap = parseInt(RegExp.$1);
obj.breakDamageCap = undefined;
} else if (line.match(noteD3)) {
obj.healCap = parseInt(RegExp.$1) * -1;
obj.breakDamageCap = undefined;
}
}
}
};
//=============================================================================
// BattleManager
//=============================================================================
if (Imported.YEP_BattleEngineCore) {
Yanfly.DMG.BattleManager_processActionSequence =
BattleManager.processActionSequence;
BattleManager.processActionSequence = function(actionName, actionArgs) {
// BYPASS DAMAGE CAP
if (actionName === 'BYPASS DAMAGE CAP') {
return this.actionBypassDamageCap();
}
// DAMAGE CAP, HEALING CAP
if (actionName === 'DAMAGE CAP' || actionName === 'HEALING CAP') {
return this.actionDamageCap(actionArgs);
}
// DAMAGE RATE
if (actionName === 'DAMAGE RATE') {
return this.actionDamageRate(actionArgs);
}
// FLAT DAMAGE
if (actionName === 'FLAT DAMAGE') {
return this.actionFlatDamage(actionArgs);
}
// FLAT GLOBAL
if (actionName === 'FLAT GLOBAL') {
return this.actionFlatGlobal(actionArgs);
}
// FLAT HEAL
if (actionName === 'FLAT HEAL') {
return this.actionFlatHeal(actionArgs);
}
// GLOBAL RATE
if (actionName === 'GLOBAL RATE') {
return this.actionGlobalRate(actionArgs);
}
// HEAL RATE
if (actionName === 'HEAL RATE') {
return this.actionHealRate(actionArgs);
}
// RESET DAMAGE CAP
if (actionName === 'RESET DAMAGE CAP') {
return this.actionResetDamageCap();
}
// RESET DAMAGE MODIFIERS
if (actionName === 'RESET DAMAGE MODIFIERS') {
return this.actionResetDamageModifiers();
}
return Yanfly.DMG.BattleManager_processActionSequence.call(this,
actionName, actionArgs);
};
};
BattleManager.actionBypassDamageCap = function() {
$gameSystem.actSeqBypassDamageCap();
return true;
};
BattleManager.actionDamageCap = function(actionArgs) {
if (!actionArgs) return;
if (actionArgs[0]) {
var value = parseInt(actionArgs[0]);
$gameSystem.setActSeqDamageCap(value);
}
return true;
};
BattleManager.actionDamageRate = function(actionArgs) {
if (actionArgs[0].match(/(?:VARIABLE|VAR)[ ](\d+)/i)) {
var value = parseFloat($gameVariables.value(parseInt(RegExp.$1)) * 0.01);
} else if (actionArgs[0].match(/(\d+)([%])/i)) {
var value = parseFloat(RegExp.$1 * 0.01);
} else if (actionArgs[0].match(/(\d+).(\d+)/i)) {
var value = parseFloat(String(RegExp.$1) + '.' + String(RegExp.$1));
} else {
return true;
}
$gameSystem._damageRate = value;
return true;
};
BattleManager.actionFlatDamage = function(actionArgs) {
if (actionArgs[0].match(/(?:VARIABLE|VAR)[ ](\d+)/i)) {
var value = parseInt($gameVariables.value(parseInt(RegExp.$1)));
} else if (actionArgs[0].match(/([\+\-]\d+)/i)) {
var value = parseInt(RegExp.$1);
} else if (actionArgs[0].match(/(\d+)/i)) {
var value = parseInt(RegExp.$1);
} else {
return true;
}
$gameSystem._flatDamage = value;
return true;
};
BattleManager.actionFlatGlobal = function(actionArgs) {
if (actionArgs[0].match(/(?:VARIABLE|VAR)[ ](\d+)/i)) {
var value = parseInt($gameVariables.value(parseInt(RegExp.$1)));
} else if (actionArgs[0].match(/([\+\-]\d+)/i)) {
var value = parseInt(RegExp.$1);
} else if (actionArgs[0].match(/(\d+)/i)) {
var value = parseInt(RegExp.$1);
} else {
return true;
}
$gameSystem._flatDamage = value;
$gameSystem._flatHeal = value;
return true;
};
BattleManager.actionFlatHeal = function(actionArgs) {
if (actionArgs[0].match(/(?:VARIABLE|VAR)[ ](\d+)/i)) {
var value = parseInt($gameVariables.value(parseInt(RegExp.$1)));
} else if (actionArgs[0].match(/([\+\-]\d+)/i)) {
var value = parseInt(RegExp.$1);
} else if (actionArgs[0].match(/(\d+)/i)) {
var value = parseInt(RegExp.$1);
} else {
return true;
}
$gameSystem._flatHeal = value;
return true;
};
BattleManager.actionGlobalRate = function(actionArgs) {
if (actionArgs[0].match(/(?:VARIABLE|VAR)[ ](\d+)/i)) {
var value = parseFloat($gameVariables.value(parseInt(RegExp.$1)) * 0.01);
} else if (actionArgs[0].match(/(\d+)([%])/i)) {
var value = parseFloat(RegExp.$1 * 0.01);
} else if (actionArgs[0].match(/(\d+).(\d+)/i)) {
var value = parseFloat(String(RegExp.$1) + '.' + String(RegExp.$1));
} else {
return true;
}
$gameSystem._damageRate = value;
$gameSystem._healRate = value;
return true;
};
BattleManager.actionHealRate = function(actionArgs) {
if (actionArgs[0].match(/(?:VARIABLE|VAR)[ ](\d+)/i)) {
var value = parseFloat($gameVariables.value(parseInt(RegExp.$1)) * 0.01);
} else if (actionArgs[0].match(/(\d+)([%])/i)) {
var value = parseFloat(RegExp.$1 * 0.01);
} else if (actionArgs[0].match(/(\d+).(\d+)/i)) {
var value = parseFloat(String(RegExp.$1) + '.' + String(RegExp.$1));
} else {
return true;
}
$gameSystem._healRate = value;
return true;
};
BattleManager.actionResetDamageCap = function() {
$gameSystem.resetActSeqDamageCap();
return true;
};
BattleManager.actionResetDamageModifiers = function() {
$gameSystem.resetDamageSettings();
return true;
};
//=============================================================================
// Game_System
//=============================================================================
Yanfly.DMG.Game_System_initialize = Game_System.prototype.initialize;
Game_System.prototype.initialize = function() {
Yanfly.DMG.Game_System_initialize.call(this);
this.resetActSeqDamageCap();
this.resetDamageSettings();
};
Game_System.prototype.resetActSeqDamageCap = function() {
this._actSeqBypassDamageCap = false;
this._actSeqDamageCap = undefined;
};
Game_System.prototype.actSeqBypassDamageCap = function() {
this._actSeqBypassDamageCap = true;
};
Game_System.prototype.getActSeqBypassDamageCap = function() {
return this._actSeqBypassDamageCap;
};
Game_System.prototype.setActSeqDamageCap = function(value) {
this._actSeqDamageCap = value;
};
Game_System.prototype.getActSeqDamageCap = function() {
return this._actSeqDamageCap;
};
Game_System.prototype.resetDamageSettings = function() {
this._damageRate = 1.0;
this._flatDamage = 0;
this._healRate = 1.0;
this._flatHeal = 0;
this._defaultDamageCap = Yanfly.Param.DMGEnableCap;
};
Game_System.prototype.damageRate = function() {
if (this._damageRate === undefined) this.resetDamageSettings();
return this._damageRate;
};
Game_System.prototype.flatDamage = function() {
if (this._flatDamage === undefined) this.resetDamageSettings();
return this._flatDamage;
};
Game_System.prototype.healRate = function() {
if (this._healRate === undefined) this.resetDamageSettings();
return this._healRate;
};
Game_System.prototype.flatHeal = function() {
if (this._flatHeal === undefined) this.resetDamageSettings();
return this._flatHeal;
};
Game_System.prototype.isDamageCapped = function() {
return this._defaultDamageCap;
};
Game_System.prototype.maximumDamage = function() {
if (this._newDamageCap !== undefined) return this._newDamageCap;
return Yanfly.Param.DMGMaxDamage;
};
Game_System.prototype.maximumHealing = function() {
if (this._newHealingCap !== undefined) return this._newHealingCap;
return Yanfly.Param.DMGMaxHealing * -1;
};
Game_System.prototype.setNewDamageCap = function(value, damage) {
if (damage) {
this._newDamageCap = value;
} else {
this._newHealingCap = value * -1;
}
};
//=============================================================================
// Game_BattlerBase
//=============================================================================
Yanfly.DMG.Game_BattlerBase_refresh = Game_BattlerBase.prototype.refresh;
Game_BattlerBase.prototype.refresh = function() {
Yanfly.DMG.Game_BattlerBase_refresh.call(this);
this.resetDMGTempValues();
};
Game_BattlerBase.prototype.resetDMGTempValues = function() {
this._isDMGCapped = undefined;
this._maximumDamage = undefined;
this._maximumHealing = undefined;
};
//=============================================================================
// Game_Battler
//=============================================================================
Yanfly.DMG.Game_Battler_performActionEnd =
Game_Battler.prototype.performActionEnd;
Game_Battler.prototype.performActionEnd = function() {
Yanfly.DMG.Game_Battler_performActionEnd.call(this);
$gameSystem.resetDamageSettings();
};
Game_Battler.prototype.isDamageCapped = function() {
for (var i = 0; i < this.states().length; ++i) {
var state = this.states()[i];
if (state && state.breakDamageCap) return this._isDMGCapped = false;
}
return this._isDMGCapped = $gameSystem.isDamageCapped();
};
Game_Battler.prototype.maximumDamage = function() {
var value = $gameSystem.maximumDamage();
for (var i = 0; i < this.states().length; ++i) {
var state = this.states()[i];
if (state && state.damageCap) value = Math.max(value, state.damageCap);
}
return value;
};
Game_Battler.prototype.maximumHealing = function() {
var value = $gameSystem.maximumHealing();
for (var i = 0; i < this.states().length; ++i) {
var state = this.states()[i];
if (state && state.healCap) value = Math.min(value, state.healCap);
}
return value;
};
//=============================================================================
// Game_Actor
//=============================================================================
Game_Actor.prototype.isDamageCapped = function() {
if (this._isDMGCapped !== undefined) return this._isDMGCapped;
if (this.actor().breakDamageCap) return this._isDMGCapped = false;
if (this.currentClass().breakDamageCap) return this._isDMGCapped = false;
for (var i = 0; i < this.equips().length; ++i) {
var equip = this.equips()[i];
if (equip && equip.breakDamageCap) return this._isDMGCapped = false;
}
return Game_Battler.prototype.isDamageCapped.call(this);
};
Game_Actor.prototype.maximumDamage = function() {
if (this._maximumDamage !== undefined) return this._maximumDamage;
var value = Game_Battler.prototype.maximumDamage.call(this);
if (this.actor().damageCap) {
value = Math.max(value, this.actor().damageCap);
}
if (this.currentClass().damageCap) {
value = Math.max(value, this.currentClass().damageCap);
}
for (var i = 0; i < this.equips().length; ++i) {
var equip = this.equips()[i];
if (equip && equip.damageCap) value = Math.max(value, equip.damageCap);
}
return this._maximumDamage = value;
};
Game_Actor.prototype.maximumHealing = function() {
if (this._maximumHealing !== undefined) return this._maximumHealing;
var value = Game_Battler.prototype.maximumHealing.call(this);
if (this.actor().healCap) {
value = Math.min(value, this.actor().healCap);
}
if (this.currentClass().healCap) {
value = Math.min(value, this.currentClass().healCap);
}
for (var i = 0; i < this.equips().length; ++i) {
var equip = this.equips()[i];
if (equip && equip.healCap) value = Math.min(value, equip.healCap);
}
return this._maximumHealing = value;
};
//=============================================================================
// Game_Enemy
//=============================================================================
Game_Enemy.prototype.isDamageCapped = function() {
if (this._isDMGCapped !== undefined) return this._isDMGCapped;
if (this.enemy().breakDamageCap) return this._isDMGCapped = false;
return Game_Battler.prototype.isDamageCapped.call(this);
};
Game_Enemy.prototype.maximumDamage = function() {
if (this._maximumDamage !== undefined) return this._maximumDamage;
var value = Game_Battler.prototype.maximumDamage.call(this);
if (this.enemy().damageCap) {
value = Math.max(value, this.enemy().damageCap);
}
return this._maximumDamage = value;
};
Game_Enemy.prototype.maximumHealing = function() {
if (this._maximumHealing !== undefined) return this._maximumHealing;
var value = Game_Battler.prototype.maximumHealing.call(this);
if (this.enemy().healCap) {
value = Math.min(value, this.enemy().healCap);
}
return this._maximumHealing = value;
};
//=============================================================================
// Game_Action
//=============================================================================
Game_Action.prototype.makeDamageValue = function(target, critical) {
var item = this.item();
var a = this.subject();
var b = target;
var user = this.subject();
var s = $gameSwitches._data;
var v = $gameVariables._data;
var baseDamage = this.evalDamageFormula(target);
var value = baseDamage;
try {
eval(Yanfly.DMG.DamageFlow);
} catch (e) {
Yanfly.Util.displayError(e, Yanfly.DMG.DamageFlow, 'DAMAGE FLOW ERROR');
}
return Math.round(value);
};
Game_Action.prototype.evalDamageFormula = function(target) {
try {
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 sign = ([3, 4].contains(item.damage.type) ? -1 : 1);
var value = 0;
if (item.damage.custom) {
eval(item.damage.formula);
value = Math.max(value, 0) * sign;
} else {
value = Math.max(eval(item.damage.formula), 0) * sign;
}
return value;
} catch (e) {
if (item.damage.custom) {
Yanfly.Util.displayError(e, item.damage.custom, 'DAMAGE FORMULA ERROR');
} else {
Yanfly.Util.displayError(e, item.damage.formula, 'DAMAGE FORMULA ERROR');
}
return 0;
}
};
Game_Action.prototype.modifyCritical = function(critical, baseDamage, target) {
return critical;
};
Game_Action.prototype.modifyBaseDamage = function(value, baseDamage, target) {
return baseDamage;
};
Game_Action.prototype.applyDamageRate = function(value, baseDamage, target) {
value *= $gameSystem.damageRate();
value = Math.max(0, value);
return value;
};
Game_Action.prototype.applyHealRate = function(value, baseDamage, target) {
value *= $gameSystem.healRate();
value *= target.rec;
value = Math.min(0, value);
return value;
};
Game_Action.prototype.applyCriticalRate = function(value, baseDamage, target) {
value = this.applyCritical(value);
return value;
};
Game_Action.prototype.applyPhysicalRate = function(value, baseDamage, target) {
value *= target.pdr;
return value;
};
Game_Action.prototype.applyFlatPhysical = function(value, baseDamage, target) {
return value;
};
Game_Action.prototype.applyMagicalRate = function(value, baseDamage, target) {
value *= target.mdr;
return value;
};
Game_Action.prototype.applyFlatMagical = function(value, baseDamage, target) {
return value;
};
Game_Action.prototype.applyFlatDamage = function(value, baseDamage, target) {
value += $gameSystem.flatDamage();
return value;
};
Game_Action.prototype.applyFlatHeal = function(value, baseDamage, target) {
value -= $gameSystem.flatHeal();
return value;
};
Game_Action.prototype.applyFlatCritical = function(value, baseDamage, target) {
return value;
};
Game_Action.prototype.applyFlatGlobal = function(value, baseDamage, target) {
return value;
};
Game_Action.prototype.applyMinimumDamage = function(value, baseDamage, target) {
if (baseDamage > 0) {
value = Math.max(0, value);
} else if (baseDamage < 0) {
value = Math.min(0, value);
}
if (this.isDamageCapped()) {
if ($gameSystem.getActSeqDamageCap() !== undefined) {
var min = $gameSystem.getActSeqDamageCap() * -1;
var max = $gameSystem.getActSeqDamageCap();
} else if (this.item().damageCap) {
var min = this.item().damageCap * -1;
var max = this.item().damageCap;
} else {
var min = this.subject().maximumHealing();
var max = this.subject().maximumDamage();
}
value = value.clamp(min, max);
}
return value;
};
Game_Action.prototype.isDamageCapped = function() {
var item = this.item();
if ($gameSystem.getActSeqBypassDamageCap()) return false;
if ($gameSystem.getActSeqDamageCap() !== undefined) return true;
if (item.damageCap !== undefined) return true;
if (item.breakDamageCap) return false;
return this.subject().isDamageCapped();
};
Yanfly.DMG.Game_Action_executeHpDamage = Game_Action.prototype.executeHpDamage;
Game_Action.prototype.executeHpDamage = function(target, value) {
value = this.applyMinimumDamage(value, value, target);
Yanfly.DMG.Game_Action_executeHpDamage.call(this, target, value);
};
Yanfly.DMG.Game_Action_executeMpDamage = Game_Action.prototype.executeMpDamage;
Game_Action.prototype.executeMpDamage = function(target, value) {
value = this.applyMinimumDamage(value, value, target);
Yanfly.DMG.Game_Action_executeMpDamage.call(this, target, value);
};
//=============================================================================
// Game_Interpreter
//=============================================================================
Yanfly.DMG.Game_Interpreter_pluginCommand =
Game_Interpreter.prototype.pluginCommand;
Game_Interpreter.prototype.pluginCommand = function(command, args) {
Yanfly.DMG.Game_Interpreter_pluginCommand.call(this, command, args)
if (command === 'SetDamageCap') this.setDamageCap(args);
if (command === 'SetHealingCap') this.setHealingCap(args);
if (command === 'EnableDamageCap') this.setDefaultDamageCap(true);
if (command === 'DisableDamageCap') this.setDefaultDamageCap(false);
};
Game_Interpreter.prototype.setDamageCap = function(args) {
$gameSystem.setNewDamageCap(parseInt(args[0]), true);
};
Game_Interpreter.prototype.setHealingCap = function(args) {
$gameSystem.setNewDamageCap(parseInt(args[0]), false);
};
Game_Interpreter.prototype.setDefaultDamageCap = function(value) {
$gameSystem._defaultDamageCap = value;
};
//=============================================================================
// Utilities
//=============================================================================
Yanfly.Util = Yanfly.Util || {};
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
//=============================================================================