OMORI_Android/www.eng/js/plugins/YEP_LifeSteal.js
2024-01-15 18:44:53 +03:00

828 lines
27 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//=============================================================================
// Yanfly Engine Plugins - Life Steal
// YEP_LifeSteal.js
//=============================================================================
var Imported = Imported || {};
Imported.YEP_LifeSteal = true;
var Yanfly = Yanfly || {};
Yanfly.LS = Yanfly.LS || {};
Yanfly.LS.version = 1.04;
//=============================================================================
/*:
* @plugindesc v1.04 Enables passive life steal traits without them being
* active abilities but instead as passive traits.
* @author Yanfly Engine Plugins
*
* @param Enable HP Overheal
* @type boolean
* @on Enable
* @off Disable
* @desc Allow Life Steal to drain more HP than damage?
* NO - false YES - true
* @default false
*
* @param Enable MP Overheal
* @type boolean
* @on Enable
* @off Disable
* @desc Allow Life Steal to drain more MP than damage?
* NO - false YES - true
* @default false
*
* @param Negative HP LifeSteal
* @type boolean
* @on Enable
* @off Disable
* @desc Allow HP Life Steal values to go negative and damage
* the attacker? NO - false YES - true
* @default false
*
* @param Negative MP LifeSteal
* @type boolean
* @on Enable
* @off Disable
* @desc Allow MP Life Steal values to go negative and damage
* the attacker? NO - false YES - true
* @default false
*
* @help
* ============================================================================
* Introduction
* ============================================================================
*
* Life Steal is a mechanic in RPG Maker MV that only exists in the form of
* specific skills or items. There is no way to passively gain Life Steal from
* physical, magical, or certain hit attacks. This plugin will allow you to set
* passive Life Steal traits for physical, magical, and certain hit attacks for
* both HP and MP values.
*
* ============================================================================
* Notetags
* ============================================================================
*
* You can use the following notetags to alter how Life Stealing works for the
* various database entries.
*
* ---
*
* Skill and Item Notetags:
*
* <HP Life Steal: x%>
* <MP Life Steal: x%>
* This causes this attack to life steal x% of HP or MP back relative to the
* amount of damage dealt.
*
* <HP Life Steal: x>
* <MP Life Steal: x>
* This causes this attack to life steal exactly x amount of HP or MP back
* regardless of damage dealt.
*
* <Cancel Life Steal>
* Makes this skill or item cancel any Life Steal effects from passively
* activating for this action. However, HP Drain and MP Drain will still
* still occur.
*
* <Cancel HP Life Steal>
* <Cancel MP Life Steal>
* Specifically cancels out HP Life Steal or MP Life Steal effects from
* passively activating for this action. However, HP Drain and MP Drain will
* still occur.
*
* ---
*
* Actor, Class, Enemy, Weapon, Armor, State Notetags:
*
* <HP Life Steal Physical: +x%>
* <HP Life Steal Magical: +x%>
* <HP Life Steal Certain: +x%>
*
* <MP Life Steal Physical: +x%>
* <MP Life Steal Magical: +x%>
* <MP Life Steal Certain: +x%>
*
* <HP Life Steal Physical: -x%>
* <HP Life Steal Magical: -x%>
* <HP Life Steal Certain: -x%>
*
* <MP Life Steal Physical: -x%>
* <MP Life Steal Magical: -x%>
* <MP Life Steal Certain: -x%>
* This causes the related battler to multiplicatively increase its passive
* Life Steal by +x% or -x% of the damage dealt towards Physical, Magical, or
* Certain Hit type of attacks. This effect stacks multiplicatively.
*
* <HP Life Steal Physical: +x>
* <HP Life Steal Magical: +x>
* <HP Life Steal Certain: +x>
*
* <MP Life Steal Physical: +x>
* <MP Life Steal Magical: +x>
* <MP Life Steal Certain: +x>
*
* <HP Life Steal Physical: -x>
* <HP Life Steal Magical: -x>
* <HP Life Steal Certain: -x>
*
* <MP Life Steal Physical: -x>
* <MP Life Steal Magical: -x>
* <MP Life Steal Certain: -x>
* This causes the related battler to additively increase its passive Life
* Steal by a flat +x or -x of the damage dealt towards Physical, Magical, or
* Certain Hit type of attacks. This effect stacks additively.
*
* <Guard Life Steal>
* The related battler cannot be life stolen from for both HP and MP.
*
* <Guard HP Life Steal>
* <Guard MP Life Steal>
* The related battler cannot be life stolen from for either HP or MP.
*
* <Cancel Life Steal>
* The related battler cannot passively life steal both HP and MP.
*
* <Cancel HP Life Steal>
* <Cancel MP Life Steal>
* The related battler cannot passively life steal HP or MP specifically.
*
* ---
*
* ============================================================================
* Lunatic Mode - Custom Life Steal
* ============================================================================
*
* For those with JavaScript proficiency, you can utilize these notetags to
* have your various database objects have dynamic Life Steal values.
*
* --- Skill and Item Notetags ---
*
* <Custom HP Life Steal Rate>
* rate = user.hpRate();
* </Custom HP Life Steal Rate>
*
* <Custom MP Life Steal Rate>
* rate = user.hpRate();
* </Custom MP Life Steal Rate>
* The 'rate' variable is the amount of HP/MP that the skill/item will life
* steal from the target based on the damage dealt to the target. This is a
* percentile value.
*
* --- --- ---
*
* <Custom HP Life Steal Flat>
* flat = user.mhp;
* </Custom HP Life Steal Flat>
*
* <Custom MP Life Steal Flat>
* flat = user.mhp;
* </Custom MP Life Steal Flat>
* The 'flat' variable is the amount of HP/MP that the skill/item will life
* steal from the target based on the damage dealt to the target. This is a
* flat value.
*
* --- Actor, Class, Enemy, Weapon, Armor, State Notetags ---
*
* <Custom HP Life Steal Physical Rate>
* rate = user.hpRate();
* </Custom HP Life Steal Physical Rate>
*
* <Custom HP Life Steal Magical Rate>
* rate = user.hpRate();
* </Custom HP Life Steal Magical Rate>
*
* <Custom HP Life Steal Certain Rate>
* rate = user.hpRate();
* </Custom HP Life Steal Certain Rate>
*
* <Custom MP Life Steal Physical Rate>
* rate = user.hpRate();
* </Custom MP Life Steal Physical Rate>
*
* <Custom MP Life Steal Magical Rate>
* rate = user.hpRate();
* </Custom MP Life Steal Magical Rate>
*
* <Custom MP Life Steal Certain Rate>
* rate = user.hpRate();
* </Custom MP Life Steal Certain Rate>
* The 'rate' variable is the bonus amount of multiplicative rate the related
* user will life steal HP/MP from its target relative to the damage dealt.
* This is a percentile value and stacks multiplicatively.
*
* --- --- ---
*
* <Custom HP Life Steal Physical Flat>
* flat = user.mhp;
* </Custom HP Life Steal Physical Flat>
*
* <Custom HP Life Steal Magical Flat>
* flat = user.mhp;
* </Custom HP Life Steal Magical Flat>
*
* <Custom HP Life Steal Certain Flat>
* flat = user.mhp;
* </Custom HP Life Steal Certain Flat>
*
* <Custom MP Life Steal Physical Flat>
* flat = user.mhp;
* </Custom MP Life Steal Physical Flat>
*
* <Custom MP Life Steal Magical Flat>
* flat = user.mhp;
* </Custom MP Life Steal Magical Flat>
*
* <Custom MP Life Steal Certain Flat>
* flat = user.mhp;
* </Custom MP Life Steal Certain Flat>
* The 'flat' variable is the bonus amount of flat bonus the related user
* will life steal HP/MP from its target relative to the damage dealt. This
* is a flat bonus value and stacks additively.
*
* ============================================================================
* Changelog
* ============================================================================
*
* Version 1.04:
* - 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.03:
* - Updated for RPG Maker MV version 1.5.0.
*
* Version 1.02:
* - Lunatic Mode fail safes added.
*
* Version 1.01:
* - Updated for RPG Maker MV version 1.1.0.
*
* Version 1.00:
* - Finished Plugin!
*/
//=============================================================================
//=============================================================================
// Parameter Variables
//=============================================================================
Yanfly.Parameters = PluginManager.parameters('YEP_LifeSteal');
Yanfly.Param = Yanfly.Param || {};
Yanfly.Param.LSHPOver = eval(String(Yanfly.Parameters['Enable HP Overheal']));
Yanfly.Param.LSMPOver = eval(String(Yanfly.Parameters['Enable MP Overheal']));
Yanfly.Param.LSHPNeg = eval(String(Yanfly.Parameters['Negative HP LifeSteal']));
Yanfly.Param.LSMPNeg = eval(String(Yanfly.Parameters['Negative MP LifeSteal']));
//=============================================================================
// DataManager
//=============================================================================
Yanfly.LS.DataManager_isDatabaseLoaded = DataManager.isDatabaseLoaded;
DataManager.isDatabaseLoaded = function () {
if (!Yanfly.LS.DataManager_isDatabaseLoaded.call(this)) return false;
if (!Yanfly._loaded_YEP_LifeSteal) {
this.processLSNotetags1($dataActors);
this.processLSNotetags1($dataClasses);
this.processLSNotetags1($dataEnemies);
this.processLSNotetags1($dataWeapons);
this.processLSNotetags1($dataArmors);
this.processLSNotetags1($dataStates);
this.processLSNotetags2($dataSkills);
this.processLSNotetags2($dataItems);
Yanfly._loaded_YEP_LifeSteal = true;
}
return true;
};
DataManager.processLSNotetags1 = function (group) {
var noteA1 = /<(.*)[ ]LIFE STEAL[ ](.*):[ ]([\+\-]\d+)([%])>/i;
var noteA2 = /<(.*)[ ]LIFE STEAL[ ](.*):[ ]([\+\-]\d+)>/i;
for (var n = 1; n < group.length; n++) {
var obj = group[n];
var notedata = obj.note.split(/[\r\n]+/);
obj.lifeSteal = {
hpPhysicalRate: 0,
hpMagicalRate: 0,
hpCertainRate: 0,
hpPhysicalFlat: 0,
hpMagicalFlat: 0,
hpCertainFlat: 0,
mpPhysicalRate: 0,
mpMagicalRate: 0,
mpCertainRate: 0,
mpPhysicalFlat: 0,
mpMagicalFlat: 0,
mpCertainFlat: 0,
allGuard: false,
hpGuard: false,
mpGuard: false,
allNull: false,
hpNull: false,
mpNull: false
}
var evalMode = 'none';
var evalKey = '';
for (var i = 0; i < notedata.length; i++) {
var line = notedata[i];
if (line.match(noteA1)) {
var type = String(RegExp.$1);
var hit = String(RegExp.$2);
var value = parseFloat(RegExp.$3) * 0.01;
this.makeLifeStealKey(obj, type, hit, 'Rate', value);
} else if (line.match(noteA2)) {
var type = String(RegExp.$1);
var hit = String(RegExp.$2);
var value = parseInt(RegExp.$3);
this.makeLifeStealKey(obj, type, hit, 'Flat', value);
} else if (line.match(/<CUSTOM[ ](.*)[ ]LIFE STEAL[ ](.*)[ ](.*)>/i)) {
var type = String(RegExp.$1).toLowerCase();
var hit = String(RegExp.$2);
var param = String(RegExp.$3);
if (hit.match(/physical/i)) {
hit = 'Physical';
} else if (hit.match(/magical/i)) {
hit = 'Magical';
} else if (hit.match(/certain/i)) {
hit = 'Certain';
} else {
continue;
}
if (param.match(/rate/i)) {
param = 'Rate';
} else if (param.match(/flat/i)) {
param = 'Flat';
} else {
continue;
}
evalMode = 'custom lifesteal';
evalKey = type + hit + param + 'Eval';
obj.lifeSteal[evalKey] = '';
} else if (line.match(/<\/CUSTOM[ ](.*)[ ]LIFE STEAL[ ](.*)[ ](.*)>/i)) {
evalMode = 'none';
evalKey = '';
} else if (evalMode === 'custom lifesteal') {
obj.lifeSteal[evalKey] = obj.lifeSteal[evalKey] + line + '\n';
} else if (line.match(/<GUARD LIFE STEAL>/i)) {
obj.lifeSteal['allGuard'] = true;
} else if (line.match(/<GUARD HP LIFE STEAL>/i)) {
obj.lifeSteal['hpGuard'] = true;
} else if (line.match(/<GUARD MP LIFE STEAL>/i)) {
obj.lifeSteal['mpGuard'] = true;
} else if (line.match(/<CANCEL LIFE STEAL>/i)) {
obj.lifeSteal['allNull'] = true;
} else if (line.match(/<CANCEL HP LIFE STEAL>/i)) {
obj.lifeSteal['hpNull'] = true;
} else if (line.match(/<CANCEL MP LIFE STEAL>/i)) {
obj.lifeSteal['mpNull'] = true;
}
}
}
};
DataManager.makeLifeStealKey = function (obj, type, hit, param, value) {
type = type.toLowerCase();
if (!['hp', 'mp'].contains(type)) return;
if (hit.match(/physical/i)) {
hit = 'Physical';
} else if (hit.match(/magical/i)) {
hit = 'Magical';
} else if (hit.match(/certain/i)) {
hit = 'Certain';
} else {
return;
}
var key = type + hit + param;
obj.lifeSteal[key] = value;
};
DataManager.processLSNotetags2 = function (group) {
for (var n = 1; n < group.length; n++) {
var obj = group[n];
var notedata = obj.note.split(/[\r\n]+/);
obj.lifeSteal = {
rate: 0,
flat: 0,
allNull: false,
hpNull: false,
mpNull: false
}
var evalMode = 'none';
var evalKey = '';
for (var i = 0; i < notedata.length; i++) {
var line = notedata[i];
if (line.match(/<(.*)[ ]LIFE STEAL:[ ](\d+)([%])>/i)) {
var type = String(RegExp.$1).toLowerCase();
var value = parseFloat(RegExp.$2) * 0.01;
var key = type + 'Rate';
obj.lifeSteal[key] = value;
} else if (line.match(/<(.*)[ ]LIFE STEAL:[ ](\d+)>/i)) {
var type = String(RegExp.$1).toLowerCase();
var value = parseInt(RegExp.$2);
var key = type + 'Flat';
obj.lifeSteal[key] = value;
} else if (line.match(/<CUSTOM[ ](.*)[ ]LIFE STEAL[ ](.*)>/i)) {
var type = String(RegExp.$1).toLowerCase();
var param = String(RegExp.$2);
if (param.match(/rate/i)) {
param = 'Rate';
} else if (param.match(/flat/i)) {
param = 'Flat';
} else {
continue;
}
evalMode = 'custom lifesteal';
evalKey = type + param + 'Eval';
obj.lifeSteal[evalKey] = '';
} else if (line.match(/<\/CUSTOM[ ](.*)[ ]LIFE STEAL[ ](.*)>/i)) {
evalMode = 'none';
evalKey = '';
} else if (evalMode === 'custom lifesteal') {
obj.lifeSteal[evalKey] = obj.lifeSteal[evalKey] + line + '\n';
} else if (line.match(/<CANCEL LIFE STEAL>/i)) {
obj.lifeSteal['allNull'] = true;
} else if (line.match(/<CANCEL HP LIFE STEAL>/i)) {
obj.lifeSteal['hpNull'] = true;
} else if (line.match(/<CANCEL MP LIFE STEAL>/i)) {
obj.lifeSteal['mpNull'] = true;
}
}
}
};
//=============================================================================
// Game_Battler
//=============================================================================
Game_Battler.prototype.lifeSteal = function (damage, type, target, rate, flat) {
if (!type) return;
rate = 1 - (rate || 0);
flat = flat || 0;
rate *= 1 - this.getLifeStealRate(type + 'Rate', target);
flat += this.getLifeStealFlat(type + 'Flat', target);
if (Yanfly.Param.LSHPNeg) {
var lifeSteal = Math.floor(damage * (1 - rate) + flat);
} else {
var lifeSteal = Math.max(0, Math.floor(damage * (1 - rate) + flat));
}
if (Yanfly.Param.LSHPOver) lifeSteal = Math.min(lifeSteal, damage);
if (lifeSteal <= 0) return;
this.gainHp(lifeSteal);
};
Game_Battler.prototype.magicSteal = function (damage, type, target, rate, flat) {
if (!type) return;
rate = 1 - (rate || 0);
flat = flat || 0;
rate *= 1 - this.getLifeStealRate(type + 'Rate', target);
flat += this.getLifeStealFlat(type + 'Flat', target);
if (Yanfly.Param.LSMPNeg) {
var lifeSteal = Math.floor(damage * (1 - rate) + flat);
} else {
var lifeSteal = Math.max(0, Math.floor(damage * (1 - rate) + flat));
}
if (Yanfly.Param.LSMPOver) lifeSteal = Math.min(lifeSteal, damage);
if (lifeSteal <= 0) return;
this.gainMp(lifeSteal);
};
Game_Battler.prototype.getLifeStealRate = function (type, target) {
rate = 1;
var length = this.states().length;
for (var i = 0; i < length; ++i) {
var obj = this.states()[i];
if (obj && obj.lifeSteal && obj.lifeSteal[type]) {
rate *= (1 - obj.lifeSteal[type]);
}
if (obj && obj.lifeSteal && obj.lifeSteal[type + 'Eval']) {
var formula = obj.lifeSteal[type + 'Eval'];
rate *= (1 - this.getLifeStealRateEval(formula, target));
}
}
return 1 - rate;
};
Game_Battler.prototype.getLifeStealFlat = function (type, target) {
value = 0;
var length = this.states().length;
for (var i = 0; i < length; ++i) {
var obj = this.states()[i];
if (obj && obj.lifeSteal && obj.lifeSteal[type]) {
value += obj.lifeSteal[type];
}
if (obj && obj.lifeSteal && obj.lifeSteal[type + 'Eval']) {
var formula = obj.lifeSteal[type + 'Eval'];
value += this.getLifeStealFlatEval(formula, target);
}
}
return value;
};
Game_Battler.prototype.getLifeStealRateEval = function (formula, target) {
target = target || this;
var rate = 0;
var a = this;
var user = this;
var subject = this;
var b = target;
var s = $gameSwitches._data;
var v = $gameVariables._data;
try {
eval(formula);
} catch (e) {
Yanfly.Util.displayError(e, formula, 'LIFE STEAL RATE FORMULA ERROR');
}
return rate;
};
Game_Battler.prototype.getLifeStealFlatEval = function (formula, target) {
target = target || this;
var flat = 0;
var a = this;
var user = this;
var subject = this;
var b = target;
var s = $gameSwitches._data;
var v = $gameVariables._data;
try {
eval(formula);
} catch (e) {
Yanfly.Util.displayError(e, formula, 'LIFE STEAL FLAT FORMULA ERROR');
}
return flat;
};
Game_Battler.prototype.isLifeStealState = function (type) {
var length = this.states().length;
for (var i = 0; i < length; ++i) {
var obj = this.states()[i];
if (obj && obj.lifeSteal && obj.lifeSteal[type]) return true;
}
return false;
};
//=============================================================================
// Game_Actor
//=============================================================================
Game_Actor.prototype.getLifeStealRate = function (type, target) {
rate = 1 - Game_Battler.prototype.getLifeStealRate.call(this, type, target);
var length = this.equips().length;
for (var i = 0; i < length; ++i) {
var obj = this.equips()[i];
if (obj && obj.lifeSteal && obj.lifeSteal[type]) {
rate *= (1 - obj.lifeSteal[type]);
}
if (obj && obj.lifeSteal && obj.lifeSteal[type + 'Eval']) {
var formula = obj.lifeSteal[type + 'Eval'];
rate *= (1 - this.getLifeStealRateEval(formula, target));
}
}
rate *= (1 - this.actor().lifeSteal[type]);
if (this.actor().lifeSteal[type + 'Eval']) {
var formula = this.actor().lifeSteal[type + 'Eval'];
rate *= (1 - this.getLifeStealRateEval(formula, target));
}
rate *= (1 - this.currentClass().lifeSteal[type]);
if (this.currentClass().lifeSteal[type + 'Eval']) {
var formula = this.currentClass().lifeSteal[type + 'Eval'];
rate *= (1 - this.getLifeStealRateEval(formula, target));
}
return 1 - rate;
};
Game_Actor.prototype.getLifeStealFlat = function (type, target) {
value = Game_Battler.prototype.getLifeStealFlat.call(this, type, target);
var length = this.equips().length;
for (var i = 0; i < length; ++i) {
var obj = this.equips()[i];
if (obj && obj.lifeSteal && obj.lifeSteal[type]) {
value += obj.lifeSteal[type];
}
if (obj && obj.lifeSteal && obj.lifeSteal[type + 'Eval']) {
var formula = obj.lifeSteal[type + 'Eval'];
value += this.getLifeStealFlatEval(formula, target);
}
}
value += this.actor().lifeSteal[type];
if (this.actor().lifeSteal[type + 'Eval']) {
var formula = this.actor().lifeSteal[type + 'Eval'];
value += this.getLifeStealFlatEval(formula, target);
}
value += this.currentClass().lifeSteal[type];
if (this.currentClass().lifeSteal[type + 'Eval']) {
var formula = this.currentClass().lifeSteal[type + 'Eval'];
value += this.getLifeStealFlatEval(formula, target);
}
return value;
};
Game_Actor.prototype.isLifeStealState = function (type) {
if (Game_Battler.prototype.isLifeStealState.call(this, type)) return true;
var length = this.equips().length;
for (var i = 0; i < length; ++i) {
var obj = this.equips()[i];
if (obj && obj.lifeSteal && obj.lifeSteal[type]) return true;
}
if (this.actor().lifeSteal[type]) return true;
if (this.currentClass().lifeSteal[type]) return true;
return false;
};
//=============================================================================
// Game_Enemy
//=============================================================================
Game_Enemy.prototype.getLifeStealRate = function (type, target) {
rate = 1 - Game_Battler.prototype.getLifeStealRate.call(this, type, target);
rate *= (1 - this.enemy().lifeSteal[type]);
if (this.enemy().lifeSteal[type + 'Eval']) {
var formula = this.enemy().lifeSteal[type + 'Eval'];
rate *= (1 - this.getLifeStealRateEval(formula, target));
}
return 1 - rate;
};
Game_Enemy.prototype.getLifeStealFlat = function (type, target) {
value = Game_Battler.prototype.getLifeStealFlat.call(this, type, target);
value += this.enemy().lifeSteal[type];
if (this.enemy().lifeSteal[type + 'Eval']) {
var formula = this.enemy().lifeSteal[type + 'Eval'];
value += this.getLifeStealFlatEval(formula, target);
}
return value;
};
Game_Enemy.prototype.isLifeStealState = function (type) {
if (Game_Battler.prototype.isLifeStealState.call(this, type)) return true;
if (this.enemy().lifeSteal[type]) return true;
return false;
};
//=============================================================================
// Game_Action
//=============================================================================
Yanfly.LS.Game_Action_executeHpDamage = Game_Action.prototype.executeHpDamage;
Game_Action.prototype.executeHpDamage = function (target, value) {
Yanfly.LS.Game_Action_executeHpDamage.call(this, target, value);
var damage = target._result.hpDamage;
this.performLifeSteal(damage, target, value);
};
Yanfly.LS.Game_Action_executeMpDamage = Game_Action.prototype.executeMpDamage;
Game_Action.prototype.executeMpDamage = function (target, value) {
Yanfly.LS.Game_Action_executeMpDamage.call(this, target, value);
var damage = target._result.mpDamage;
this.performLifeSteal(damage, target, value);
};
Game_Action.prototype.canLifeStealHp = function (damage, target, value) {
if (this.item().lifeSteal) {
if (this.item().lifeSteal['allNull']) return false;
if (this.item().lifeSteal['hpNull']) return false;
}
if (this.subject().isLifeStealState('allNull')) return false;
if (this.subject().isLifeStealState('hpNull')) return false;
if (target.isLifeStealState('allGuard')) return false;
if (target.isLifeStealState('hpGuard')) return false;
return damage > 0;
};
Game_Action.prototype.canLifeStealMp = function (damage, target, value) {
if (this.item().lifeSteal) {
if (this.item().lifeSteal['allNull']) return false;
if (this.item().lifeSteal['mpNull']) return false;
}
if (this.subject().isLifeStealState('allNull')) return false;
if (this.subject().isLifeStealState('mpNull')) return false;
if (target.isLifeStealState('allGuard')) return false;
if (target.isLifeStealState('mpGuard')) return false;
return damage > 0;
};
Game_Action.prototype.performLifeSteal = function (damage, target, value) {
this.performHpLifeSteal(damage, target, value);
this.performMpLifeSteal(damage, target, value);
};
Game_Action.prototype.performHpLifeSteal = function (damage, target, value) {
if (this.canLifeStealHp(damage, target, value)) {
var rate = this.getLifeStealRate(target, value, 'hp');
var flat = this.getLifeStealFlat(target, value, 'hp');
if (this.isPhysical()) {
this.subject().lifeSteal(damage, 'hpPhysical', target, rate, flat);
} else if (this.isMagical()) {
this.subject().lifeSteal(damage, 'hpMagical', target, rate, flat);
} else if (this.isCertainHit()) {
this.subject().lifeSteal(damage, 'hpCertain', target, rate, flat);
}
}
};
Game_Action.prototype.performMpLifeSteal = function (damage, target, value) {
if (this.canLifeStealMp(damage, target, value)) {
var rate = this.getLifeStealRate(target, value, 'mp');
var flat = this.getLifeStealFlat(target, value, 'mp');
if (this.isPhysical()) {
this.subject().magicSteal(damage, 'mpPhysical', target, rate, flat);
} else if (this.isMagical()) {
this.subject().magicSteal(damage, 'mpMagical', target, rate, flat);
} else if (this.isCertainHit()) {
this.subject().magicSteal(damage, 'mpCertain', target, rate, flat);
}
}
};
Game_Action.prototype.getLifeStealRate = function (target, value, type) {
var rate = 1;
if (this.item().lifeSteal[type + 'Rate']) {
rate *= 1 - this.item().lifeSteal[type + 'Rate'];
}
if (this.item().lifeSteal[type + 'RateEval']) {
var formula = this.item().lifeSteal[type + 'RateEval'];
rate *= 1 - this.getLifeStealRateEval(formula, target, value);
}
return 1 - rate;
};
Game_Action.prototype.getLifeStealFlat = function (target, value, type) {
var flat = 0;
if (this.item().lifeSteal[type + 'Flat']) {
flat += this.item().lifeSteal[type + 'Flat'];
}
if (this.item().lifeSteal[type + 'RateFlat']) {
var formula = this.item().lifeSteal[type + 'RateFlat'];
flat += this.getLifeStealFlatEval(formula, target, value);
}
return flat;
};
Game_Action.prototype.getLifeStealRateEval = function (formula, target, value) {
var rate = 0;
var a = this.subject();
var user = this.subject();
var subject = this.subject();
var b = target;
var s = $gameSwitches._data;
var v = $gameVariables._data;
var damage = value;
var item = this.item();
var skill = this.item();
try {
eval(formula);
} catch (e) {
Yanfly.Util.displayError(e, formula, 'LIFE STEAL RATE FORMULA ERROR');
}
return rate;
};
Game_Action.prototype.getLifeStealFlatEval = function (formula, target, value) {
var flat = 0;
var a = this.subject();
var user = this.subject();
var subject = this.subject();
var b = target;
var s = $gameSwitches._data;
var v = $gameVariables._data;
var damage = value;
var item = this.item();
var skill = this.item();
try {
eval(formula);
} catch (e) {
Yanfly.Util.displayError(e, formula, 'LIFE STEAL FLAT FORMULA ERROR');
}
return flat;
};
//=============================================================================
// 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.RPGMAKER_VERSION && Utils.RPGMAKER_VERSION >= "1.6.0") return;
if (Utils.isNwjs() && Utils.isOptionValid('test')) {
if (!require('nw.gui').window.isDevToolsOpen()) {
require('nw.gui').window.showDevTools();
}
}
};
//=============================================================================
// End of File
//=============================================================================