paradise-succubus-ac/www/js/plugins/YEP_AbsorptionBarrier.js
2026-06-24 05:29:56 -05:00

1489 lines
54 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 - Absorption Barrier
// YEP_AbsorptionBarrier.js
//=============================================================================
var Imported = Imported || {};
Imported.YEP_AbsorptionBarrier = true;
var Yanfly = Yanfly || {};
Yanfly.ABR = Yanfly.ABR || {};
Yanfly.ABR.version = 1.08;
//=============================================================================
/*:ja
* @plugindesc v1.08 バトラーがHPダメージを軽減できる緩衝バリアを持てるシステムを追加
* @author Yanfly Engine Plugins
*
* @param Barrier State
* @type state
* @desc バトラーが1つでもバリアポイントを持っている場合、バトラーはこのステートの影響を受けます。無ステートの場合は0
* @default 0
*
* @param Barrier Color 1
* @type number
* @min 0
* @max 31
* @desc バリアに使用されるテキスト色1
* @default 13
*
* @param Barrier Color 2
* @type number
* @min 0
* @max 31
* @desc バリアに使用されるテキスト色2
* @default 5
*
* @param Barrier Animation
* @type animation
* @desc バリアポイントが失われるとアニメーションが再生されます。 アニメーションがない場合は0
* @default 0
*
* @param Break Animation
* @type animation
* @desc バリアポイントが空になるとアニメーションが再生されます。 アニメーションがない場合は0
* @default 0
*
* @param Barrier Popup
* @desc YEP_BattleEngineCore.jsを使用している場合、バリアダメージのために表示されるポップアップカラーです。RGBO
* @default 255, 0, 255, 160
*
* @param Display 0 HP Damage
* @type boolean
* @on 表示
* @off 非表示
* @desc HPに0のダメージが与えられたら0のHPダメージを表示
* 非表示 - false 表示 - true
* @default false
*
* @param Clear Per Battle
* @type boolean
* @on YES
* @off NO
* @desc 戦闘の開始時と終了時にバリアポイントを消去
* NO - false YES - true
* @default true
*
* @param Clear on Death
* @type boolean
* @on YES
* @off NO
* @desc バトラーが死んだ場合、バリアポイントを消去しますか
* NO - false YES - true
* @default true
*
* @param Default Penetration Rate
* @desc すべてのアクションのデフォルトのバリア透過率
* 例50%の場合、0.50を使用
* @default 0
*
* @param Default Penetration Flat
* @desc すべてのアクションに対するデフォルトのBarrier Penetration Flat。
* 例100平らな貫通をしたい場合、100を使用してください。
* @default 0
*
* @help
* 翻訳:ムノクラ
* https://fungamemake.com/
* https://twitter.com/munokura/
*
* ============================================================================
* Introduction
* ============================================================================
*
* 緩衝バリアは戦闘のために追加された新しいシステムです。
* 新しいタイプのステータスであるバリアポイントは、
* バトラーを保護するための障壁を提供します。
* 通常HPに与えられる直接的なダメージは、
* まずバトラーのバリアポイントに与えられ、
* バトラーに与えられる本当のダメージを軽減します。
* 残りのダメージはバトラーに与えられます。
*
* このシステムを利用して、期限切れのバリア、期限切れのバリア、バリアの侵入、
* バリアの通過など、様々なシステムを利用することができます。
* 次の章で詳しく説明します。
*
* ============================================================================
* Barrier Points - Explanation
* ============================================================================
*
* バリアポイントは、バトラーのHPの上に置かれるバッファです。
* スキルやアイテムからの直接的な損害は、バトラーのHPに与えられる前に、
* まずバトラーのバリアポイントに与えられます。
* 次の例でシステムがどのように機能するのかを見てみましょう。
*
* --- 例 1 ----
*
* 例えば、対象に100のバリアポイントがあるとします。
* 150のダメージはスキルやアイテムを通して対象のHPに与えられます。
*
* 150 DMG vs 100 Barrier Points: 50 DMG goes through
*
* その結果、対象のバリアポイントは0になり、
* 対象のHPは50ダメージしか被りません。
*
* --- 例 2---
*
* 目標は100バリアポイントを持っています。
* 50のダメージは、スキルやアイテムを通して対象のHPに与えられます。
*
* 50 DMG vs 100 Barrier Points: 0 DMG goes through
*
* その結果、対象のバリアポイントは50になり、
* 使用者のHPにダメージを与えることはありません。
*
* ============================================================================
* Barrier Penetration - Explanation
* ============================================================================
*
* いくつかのスキルとアイテムは、
* バリア通過と呼ばれるユニークな特性を持つことができます。
* バリア通過は、割合・一定量のダメージを通過させ、
* 対象の緩衝バリアを無視することを可能にします。
* アクションに対するバリアの侵入が多いほど、
* 対象のバリアポイントの多くは無視されます。
*
* --- 例 ---
*
* 目標は500バリアポイントを持っています。
* 100のダメージは、スキルやアイテムを通して対象のHPに与えられます。
* 攻撃者は75%の壁貫通力を持っています。
*
* 100 DMG vs 500 Barrier Points: 75 DMG goes through
*
* その結果、ダメージの75%が通過します。
* つまり、対象となるHPに正確に75のダメージが与えられます。
* しかし、その25%が対象のバリアポイントに吸収され、
* バリアポイントは合計で475ポイントに減少します。
*
* ============================================================================
* Unexpiring Barriers vs Timed Barriers - Explanation
* ============================================================================
*
* 緩衝バリアには、2つのタイプがあります。
* 継続バリアと時限バリアです。
* 継続バリアは戦闘の間に失効しません。
* 手に入れても、獲得したバリアポイントはその値のままです。
* その一方で、時限バリアは一定量のターンを持続します。
* 使用者の再生フェイズ中にターンが0になると、バリアポイントは取り除かれます。
*
* --- 例 ---
*
* Turn 1 - 100 Barrier Points
* Turn 2 - 200 Barrier Points
* Turn 3 - 300 Barrier Points
*
* 今のところ、使用者は合計600バリアポイントを持っています。
* 再生フェーズの後は、これになります。
*
* Turn 1 - 200 Barrier Points
* Turn 2 - 300 Barrier Points
*
* そして、使用者は合計500バリアポイントを獲得します。
*
* ---
*
* ダメージが与えられた時、バリアポイントはどのように機能しますか?
* それが最高に達するまで、ダメージは常に最低のターン、
* そして次に最低のターンなどに与えられます。
* 最高値を超えた後、それからバリアポイントにダメージが与えられます。
*
* --- 例 ---
*
* Turn 1 - 100 Barrier Points
* Turn 2 - 200 Barrier Points
* Unexpiring - 300 Barrier Points
*
* 今度は、500のダメージが与えられるとしましょう。
* これは次のようになります。
*
* Turn 1 - 0 Barrier Points
* Turn 2 - 0 Barrier Points
* Unexpiring - 100 Barrier Points
*
* ============================================================================
* Notetags
* ============================================================================
*
* 以下のメモタグを使用して、バリアポイントの様々なシステムを変更してください。
*
* スキルとアイテムのメモタグ
*
* <User Barrier: +x>
* <Target Barrier: +x>
* 使用者・対象のバリアポイントがそれぞれ+x調整されます。
* このメモタグ用に変更されたバリアポイントは、
* 時間が経っても消えない、継続バリアポイントです。
*
* <User Barrier: -x>
* <Target Barrier: -x>
* 使用者・対象からx個のバリアポイントが削除されます。
* 失効していない時限バリアポイントにも同様に当てはまります。
*
* <User Barrier x Turns: +y>
* <Target Barrier x Turns: +y>
* 使用者・対象のバリアポイントがそれぞれxターンで+y量だけ調整されます。
* これらのバリアポイントは、xターン後に失効します。
* 各ターンはバトラーの回生タイミングの間に通ります。
*
* <User Barrier x Turns: -y>
* <Target Barrier x Turns: -y>
* 使用者・対象からyバリアポイントが削除され、最大xターンになります。
*
* <Bypass Barrier>
* スキルはバリアポイントを無視して対象に直接ダメージを与えることができます。
*
* <Barrier Penetration: x%>
* スキルやアイテムのダメージのx%がアクション対象の
* バリアポイントを無視するようにします。
* 対象に十分なバリアポイントがない場合、より多くのダメージが与えられます。
* これは割合の値です。
*
* <Barrier Penetration: x>
* スキル・アイテムのダメージのx値が、
* アクション対象のバリアポイントを回避するようにします。
* 対象に十分なバリアポイントがない場合、より多くのダメージが与えられます。
* これは固定的な値です。
*
* アクター、職業、敵、武器、防具、ステートのメモタグ
*
* <Barrier Penetration: +x%>
* <Barrier Penetration: -x%>
* 攻撃者によるあらゆる有害な行動により、
* +x%・-x%のボーナスバリア透過率が得られます。
* これは乗法的なボーナスであり、固定的ボーナスが行われる前に適用されます。
*
* <Barrier Penetration: +x>
* <Barrier Penetration: -x>
* 攻撃者による有害な行動により、+x・-xのボーナスバリア通過が得られます。
* これは固定的ボーナスで、乗法的な変更が行われた後に適用されます。
*
* <Barrier Points: +x>
* <Barrier Points: -x>
* 影響を受けていない使用者のための新しい戦闘の開始時に、
* 価値のあるバリアポイントが獲得されます。
*
* <Barrier Points x Turns: +y>
* <Barrier Points x Turns: -y>
* バリアポイントの量は、
* 影響を受けた使用者のための新しい戦闘の開始時にxターン継続します。
*
* <Barrier Regen: +x>
* <Barrier Regen: -x>
* 再生成フェーズでは、
* 使用者は+x/-xの有効期限が切れていないバリアポイントを再生成します。
*
* <Barrier Regen x Turns: +y>
* <Barrier Regen x Turns: -y>
* 再生段階では、
* 最後のxターンが+y/-yの値になるバリアポイントを再生します。
*
* ============================================================================
* Lunatic Mode - Custom Barrier Points
* ============================================================================
*
* JavaScript と、これらのメモタグを活用して、
* スキルやアイテムでカスタムのバリアポイントの合計を
* 得られるようにすることができます。
*
* スキルとアイテムのメモタグ
*
* --- Target ---
*
* <Custom Target Barrier>
* value = target.level;
* </Custom Target Barrier>
* 'value'変数は、対象の期限切れでないバリアポイントの合計に
* 追加されるバリアポイントの合計量を決定します。
*
* <Custom Target Barrier x Turns>
* value = target.level;
* </Custom Target Barrier x Turns>
* 'value'変数はx回のターンの間対象に追加される
* バリアポイントの合計量を決定します。
*
* --- User ---
*
* <Custom User Barrier>
* value = user.level;
* </Custom User Barrier>
* 'value'変数は、
* 使用者の期限切れになっていないバリアポイントの合計に追加される
* バリアポイントの合計量を決定します。
*
* <Custom User Barrier x Turns>
* value = user.level;
* </Custom User Barrier x Turns>
* 'value'変数はx回のターンの間に使用者に追加される
* バリアポイントの合計量を決定します。
*
* ============================================================================
* Lunatic Mode - Custom Barrier Penetration
* ============================================================================
*
* JavaScript とこれらのメモを利用してスキル、アイテム、アクター、職業、
* 敵、武器、防具、カスタムのバリア通過効果を付与できます。
*
* スキル、アイテム、アクター、職業、敵、武器、防具、ステートのメモタグ
*
* --- Rate ---
*
* <Custom Barrier Penetration Rate>
* rate = target.hpRate();
* </Custom Barrier Penetration Rate>
* 'rate'変数は、対象のバリアポイントに対して
* 使用者が無視するダメージの割合を決定します。
* これは乗法的ボーナスであり、固定的ボーナスの前に適用されます。
*
* --- Flat ---
*
* <Custom Barrier Penetration Flat>
* flat = target.level;
* </Custom Barrier Penetration Flat>
* 'flat'変数は、対象のバリアポイントのために
* 使用者が無視するダメージの一定量を決定します。
* これは固定的ボーナスであり、全ての乗法ボーナスの後に適用されます。
*
* ============================================================================
* Lunatic Mode - Custom Barrier Points on Battle Start
* ============================================================================
*
* JavaScriptとこれらのメモを利用して、
* 戦闘開始時に動的な量のバリアポイントを追加することができます。
*
* アクター、職業、敵、武器、防具、ステートのメモタグ
*
* --- Unexpiring ---
*
* <Custom Barrier Points>
* value += user.hp;
* </Custom Barrier Points>
* 'value'変数は、
* 使用者が何回バリアポイントを獲得するかを決定します。
* このメモタグを通して追加されたバリアポイントは、
* 継続バリアポイントです。
*
* --- Timed ---
*
* <Custom Barrier Points x Turns>
* value += user.hp;
* </Custom Barrier Points x Turns>
* 'value'変数は、
* 使用者が何回バリアポイントを獲得するかを決定しますが、
* xターン後に失効します。
*
* ============================================================================
* Lunatic Mode - Custom Barrier Regeneration
* ============================================================================
*
* JavaScriptとこれらのメモタグを利用して、
* 使用者の再生段階で動的な量のバリアポイントを追加できます。
*
* アクター、職業、敵、武器、防具、ステートのメモタグ
*
* --- Unexpiring ---
*
* <Custom Barrier Regen>
* value += user.hp / 4;
* </Custom Barrier Regen>
* 'value'変数は、
* 使用者の再生段階中に使用者が獲得するバリアポイントの数を決定します。
* このメモタグで追加されたバリアポイントは、
* 継続バリアポイントです。
*
* --- Timed ---
*
* <Custom Barrier Regen x Turns>
* value += user.hp / 4;
* </Custom Barrier Regen x Turns>
* 'value'変数は、
* 使用者の再生段階中に使用者が獲得するバリアポイントの数を決定します。
* このメモタグで追加されたバリアポイントはxターン持続しがますのこ。
*
* ============================================================================
* Lunatic Mode - New JavaScript Functions
* ============================================================================
*
* JavaScriptに精通している人のために、
* ここに独自のコードやLunaticモードで使える
* 新しいJavaScript機能のクイックリファレンスリストがあります。
*
* JavaScript functions:
*
* battler.barrierPoints()
* - バトラーが持っているバリアポイントの合計額を返します。
*
* battler.barrierPoints(-1)
* - バトラーが持っている失効していないバリアポイントの量を返します。
*
* battler.barrierPoints(x)
* - そのターンにバトラーが持っていたバリアポイントの量を返す。
*
* battler.gainBarrier(value, turn)
* - バトラーの得るバリアポイントを一定量の'ターン'続く'value'に等しくします。
* ターン数が0のままの場合、その値は期待外のバリアポイントになります。
*
* battler.loseBarrier(value)
* - バトラーが'value'に相当するバリアポイントを失うようにします。
*
* battler.startBarrierAnimation()
* - バトラーにバリアを打たせてアニメーションにさせます。
*
* battler.updateBarrierTurns()
* - バトラーのバリアポイントに自分のターンを更新させる。
*
* ============================================================================
* Changelog
* ============================================================================
*
* Version 1.08:
* - 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.07:
* - Updated for RPG Maker MV version 1.5.0.
*
* Version 1.06:
* - Fixed a bug that caused shields to regenerate outside of battle.
*
* Version 1.05:
* - Lunatic Mode fail safes added.
*
* Version 1.04:
* - <User Barrier: -x>, <Target Barrier: -x>, <User Barrier x Turns: -y>, and
* <Target Barrier x Turns: -y> notetags have been revamped. They will also
* show popups now. If <Target Barrier x Turns: -y> is used, it will remove y
* barrier points up to x turns.
*
* Version 1.03:
* - Updated for RPG Maker MV version 1.1.0.
*
* Version 1.02:
* - Fixed a bug where if Barrier Penetration was at 100%, it would be treated
* as 0%.
* - Added 'Barrier State' parameter. This parameter will passively apply a
* certain state to the battler if the battler has barrier points. This can be
* turned off by leaving this plugin parameter value at 0.
*
* Version 1.01:
* - Fixed a bug that prevented Barrier Points to be gained at the start of
* battle properly.
* - When a user grants an Absorption Barrier to itself, the user will gain 1
* additional turn for the Barrier to stay up so it won't dissolve immediately.
*
* Version 1.00:
* - Finished Plugin!
*/
//=============================================================================
//=============================================================================
// Parameter Variables
//=============================================================================
Yanfly.Parameters = PluginManager.parameters('YEP_AbsorptionBarrier');
Yanfly.Param = Yanfly.Param || {};
Yanfly.Param.ABRState = Number(Yanfly.Parameters['Barrier State']);
Yanfly.Param.ABRColor1 = Number(Yanfly.Parameters['Barrier Color 1']);
Yanfly.Param.ABRColor2 = Number(Yanfly.Parameters['Barrier Color 2']);
Yanfly.Param.ABRAni1 = Number(Yanfly.Parameters['Barrier Animation']);
Yanfly.Param.ABRAni2 = Number(Yanfly.Parameters['Break Animation']);
Yanfly.Param.ABRPop = String(Yanfly.Parameters['Barrier Popup']);
Yanfly.Param.ABRPop = eval('[' + Yanfly.Param.ABRPop + ']');
Yanfly.Param.ABRDisplay0 = String(Yanfly.Parameters['Display 0 HP Damage']);
Yanfly.Param.ABRDisplay0 = eval(Yanfly.Param.ABRDisplay0);
Yanfly.Param.ABRClear = eval(String(Yanfly.Parameters['Clear Per Battle']));
Yanfly.Param.ABRDeath = eval(String(Yanfly.Parameters['Clear on Death']));
Yanfly.Param.ABRPenRate = Number(Yanfly.Parameters['Default Penetration Rate']);
Yanfly.Param.ABRPenFlat = Number(Yanfly.Parameters['Default Penetration Flat']);
//=============================================================================
// DataManager
//=============================================================================
Yanfly.ABR.DataManager_isDatabaseLoaded = DataManager.isDatabaseLoaded;
DataManager.isDatabaseLoaded = function() {
if (!Yanfly.ABR.DataManager_isDatabaseLoaded.call(this)) return false;
if (!Yanfly._loaded_YEP_AbsorptionBarrier) {
this.processABRNotetags1($dataSkills);
this.processABRNotetags1($dataItems);
this.processABRNotetags2($dataActors);
this.processABRNotetags2($dataClasses);
this.processABRNotetags2($dataEnemies);
this.processABRNotetags2($dataWeapons);
this.processABRNotetags2($dataArmors);
this.processABRNotetags2($dataStates);
Yanfly._loaded_YEP_AbsorptionBarrier = true;
}
return true;
};
DataManager.processABRNotetags1 = function(group) {
var noteA1 = /<TARGET BARRIER:[ ]([\+\-]\d+)>/i;
var noteA2 = /<TARGET BARRIER[ ](\d+)[ ](?:TURN|TURNS):[ ]([\+\-]\d+)>/i;
var noteB1 = /<USER BARRIER:[ ]([\+\-]\d+)>/i;
var noteB2 = /<USER BARRIER[ ](\d+)[ ](?:TURN|TURNS):[ ]([\+\-]\d+)>/i;
var noteC1 = /<CUSTOM TARGET BARRIER[ ](\d+)[ ](?:TURN|TURNS)>/i;
var noteC2 = /<\/CUSTOM TARGET BARRIER[ ](\d+)[ ](?:TURN|TURNS)>/i;
var noteD1 = /<CUSTOM USER BARRIER[ ](\d+)[ ](?:TURN|TURNS)>/i;
var noteD2 = /<\/CUSTOM USER BARRIER[ ](\d+)[ ](?:TURN|TURNS)>/i;
for (var n = 1; n < group.length; n++) {
var obj = group[n];
var notedata = obj.note.split(/[\r\n]+/);
obj.targetBarrier = [];
obj.userBarrier = [];
obj.barrierPenetrationRate = Yanfly.Param.ABRPenRate;
obj.barrierPenetrationFlat = Yanfly.Param.ABRPenFlat;
var evalMode = 'none';
var evalTurn = 0;
obj.targetBarrierEval = [];
obj.userBarrierEval = [];
obj.barrierPenetrationRateEval = '';
obj.barrierPenetrationFlatEval = '';
for (var i = 0; i < notedata.length; i++) {
var line = notedata[i];
if (line.match(noteA1)) {
obj.targetBarrier[0] = parseInt(RegExp.$1);
} else if (line.match(noteA2)) {
var index = parseInt(RegExp.$1);
var value = parseInt(RegExp.$2);
obj.targetBarrier[index] = value;
} else if (line.match(noteB1)) {
obj.userBarrier[0] = parseInt(RegExp.$1);
} else if (line.match(noteB2)) {
var index = parseInt(RegExp.$1);
var value = parseInt(RegExp.$2);
obj.userBarrier[index] = value;
} else if (line.match(/<BYPASS BARRIER>/i)) {
obj.barrierPenetrationRate = 1;
} else if (line.match(/<BARRIER PENETRATION:[ ](\d+)([%])>/i)) {
obj.barrierPenetrationRate = parseFloat(RegExp.$1) * 0.01;
} else if (line.match(/<BARRIER PENETRATION:[ ](\d+)>/i)) {
obj.barrierPenetrationFlat = parseInt(RegExp.$1);
} else if (line.match(/<CUSTOM TARGET BARRIER>/i)) {
evalMode = 'custom target barrier';
evalTurn = 0;
obj.targetBarrierEval[0] = '';
} else if (line.match(/<\/CUSTOM TARGET BARRIER>/i)) {
evalMode = 'none';
evalTurn = 0;
} else if (line.match(noteC1)) {
evalMode = 'custom target barrier';
evalTurn = parseInt(RegExp.$1);
obj.targetBarrierEval[evalTurn] = '';
} else if (line.match(noteC2)) {
evalMode = 'none';
evalTurn = 0;
} else if (evalMode === 'custom target barrier') {
obj.targetBarrierEval[evalTurn] = obj.targetBarrierEval[evalTurn] +
line + '\n';
} else if (line.match(/<CUSTOM USER BARRIER>/i)) {
evalMode = 'custom user barrier';
evalTurn = 0;
obj.userBarrierEval[0] = '';
} else if (line.match(/<\/CUSTOM USER BARRIER>/i)) {
evalMode = 'none';
evalTurn = 0;
} else if (line.match(noteD1)) {
evalMode = 'custom user barrier';
evalTurn = parseInt(RegExp.$1);
obj.userBarrierEval[evalTurn] = '';
} else if (line.match(noteD2)) {
evalMode = 'none';
evalTurn = 0;
} else if (evalMode === 'custom user barrier') {
obj.userBarrierEval[evalTurn] = obj.userBarrierEval[evalTurn] +
line + '\n';
} else if (line.match(/<CUSTOM BARRIER PENETRATION RATE>/i)) {
evalMode = 'custom barrier penetration rate';
} else if (line.match(/<\/CUSTOM BARRIER PENETRATION RATE>/i)) {
evalMode = 'none';
} else if (evalMode === 'custom barrier penetration rate') {
obj.barrierPenetrationRateEval = obj.barrierPenetrationRateEval +
line + '\n';
} else if (line.match(/<CUSTOM BARRIER PENETRATION FLAT>/i)) {
evalMode = 'custom barrier penetration flat';
} else if (line.match(/<\/CUSTOM BARRIER PENETRATION flat>/i)) {
evalMode = 'none';
} else if (evalMode === 'custom barrier penetration flat') {
obj.barrierPenetrationFlatEval = obj.barrierPenetrationFlatEval +
line + '\n';
}
}
}
};
DataManager.processABRNotetags2 = function(group) {
var noteA1 = /<BARRIER POINTS:[ ]([\+\-]\d+)>/i;
var noteA2 = /<BARRIER POINTS[ ](\d+)[ ](?:TURN|TURNS):[ ]([\+\-]\d+)>/i;
var noteB1 = /<CUSTOM BARRIER POINTS[ ](\d+)[ ](?:TURN|TURNS)>/i;
var noteB2 = /<\/CUSTOM BARRIER POINTS[ ](\d+)[ ](?:TURN|TURNS)>/i;
var noteC1 = /<BARRIER REGEN:[ ]([\+\-]\d+)>/i;
var noteC2 = /<BARRIER REGEN[ ](\d+)[ ](?:TURN|TURNS):[ ]([\+\-]\d+)>/i;
var noteD1 = /<CUSTOM BARRIER REGEN>/i;
var noteD2 = /<\/CUSTOM BARRIER REGEN>/i;
var noteE1 = /<CUSTOM BARRIER REGEN[ ](\d+)[ ](?:TURN|TURNS)>/i;
var noteE2 = /<\/CUSTOM BARRIER REGEN[ ](\d+)[ ](?:TURN|TURNS)>/i;
for (var n = 1; n < group.length; n++) {
var obj = group[n];
var notedata = obj.note.split(/[\r\n]+/);
obj.barrierPenetrationRate = 0;
obj.barrierPenetrationFlat = 0;
obj.battleStartBarrierPoints = [];
obj.barrierRegen = [];
var evalMode = 'none';
var evalTurn = 0;
obj.barrierPenetrationRateEval = '';
obj.barrierPenetrationFlatEval = '';
obj.battleStartBarrierPointsEval = [];
obj.barrierRegenEval = [];
for (var i = 0; i < notedata.length; i++) {
var line = notedata[i];
if (line.match(/<BARRIER PENETRATION:[ ]([\+\-]\d+)([%])>/i)) {
obj.barrierPenetrationRate = parseFloat(RegExp.$1) * 0.01;
} else if (line.match(/<BARRIER PENETRATION:[ ]([\+\-]\d+)>/i)) {
obj.barrierPenetrationFlat = parseInt(RegExp.$1);
} else if (line.match(noteA1)) {
obj.battleStartBarrierPoints[0] = parseInt(RegExp.$1);
} else if (line.match(noteA2)) {
var id = parseInt(RegExp.$1);
var value = parseInt(RegExp.$2);
obj.battleStartBarrierPoints[id] = value;
} else if (line.match(/<CUSTOM BARRIER PENETRATION RATE>/i)) {
evalMode = 'custom barrier penetration rate';
} else if (line.match(/<\/CUSTOM BARRIER PENETRATION RATE>/i)) {
evalMode = 'none';
} else if (evalMode === 'custom barrier penetration rate') {
obj.barrierPenetrationRateEval = obj.barrierPenetrationRateEval +
line + '\n';
} else if (line.match(/<CUSTOM BARRIER PENETRATION FLAT>/i)) {
evalMode = 'custom barrier penetration flat';
} else if (line.match(/<\/CUSTOM BARRIER PENETRATION flat>/i)) {
evalMode = 'none';
} else if (evalMode === 'custom barrier penetration flat') {
obj.barrierPenetrationFlatEval = obj.barrierPenetrationFlatEval +
line + '\n';
} else if (line.match(/<CUSTOM BARRIER POINTS>/i)) {
evalMode = 'custom barrier points';
evalTurn = 0;
obj.battleStartBarrierPointsEval[0] = '';
} else if (line.match(/<\/CUSTOM BARRIER POINTS>/i)) {
evalMode = 'none';
evalTurn = 0;
} else if (line.match(noteB1)) {
evalMode = 'custom barrier points';
evalTurn = parseInt(RegExp.$1);
obj.battleStartBarrierPointsEval[evalTurn] = '';
} else if (line.match(noteB2)) {
evalMode = 'none';
evalTurn = 0;
} else if (evalMode === 'custom barrier points') {
obj.battleStartBarrierPointsEval[evalTurn] =
obj.battleStartBarrierPointsEval[evalTurn] + line + '\n';
} else if (line.match(noteC1)) {
obj.barrierRegen[0] = parseInt(RegExp.$1);
} else if (line.match(noteC2)) {
var id = parseInt(RegExp.$1);
var value = parseInt(RegExp.$2);
obj.barrierRegen[id] = value;
} else if (line.match(noteD1)) {
evalMode = 'custom barrier regen';
evalTurn = 0;
obj.barrierRegenEval[0] = '';
} else if (line.match(noteD2)) {
evalMode = 'none';
evalTurn = 0;
} else if (line.match(noteE1)) {
evalMode = 'custom barrier regen';
evalTurn = parseInt(RegExp.$1);
obj.barrierRegenEval[evalTurn] = '';
} else if (line.match(noteE2)) {
evalMode = 'none';
evalTurn = 0;
} else if (evalMode === 'custom barrier regen') {
obj.barrierRegenEval[evalTurn] = obj.barrierRegenEval[evalTurn] +
line + '\n';
}
}
}
};
//=============================================================================
// Game_BattlerBase
//=============================================================================
Yanfly.ABR.Game_BattlerBase_initMembers =
Game_BattlerBase.prototype.initMembers;
Game_BattlerBase.prototype.initMembers = function() {
Yanfly.ABR.Game_BattlerBase_initMembers.call(this);
this.clearAbsorptionBarrier();
};
Game_BattlerBase.prototype.clearAbsorptionBarrier = function() {
this._turnBarrier = [];
this._permBarrier = 0;
};
Game_BattlerBase.prototype.initAbsorptionBarrier = function() {
this._turnBarrier = this._turnBarrier || [];
this._permBarrier = this._permBarrier || 0;
};
if (Yanfly.Param.ABRState) {
Yanfly.ABR.Game_BattlerBase_refresh = Game_BattlerBase.prototype.refresh;
Game_BattlerBase.prototype.refresh = function() {
this._barrierState = undefined;
Yanfly.ABR.Game_BattlerBase_refresh.call(this);
};
Yanfly.ABR.Game_BattlerBase_states = Game_BattlerBase.prototype.states;
Game_BattlerBase.prototype.states = function() {
var array = Yanfly.ABR.Game_BattlerBase_states.call(this);
if (this._barrierState === undefined) {
this._barrierState = this.barrierPoints() > 0;
}
if (this._barrierState) {
array.push($dataStates[Yanfly.Param.ABRState]);
this.sortBarrierStates(array);
}
return array;
};
Game_BattlerBase.prototype.sortBarrierStates = function(array) {
array.sort(function(a, b) {
var p1 = a.priority;
var p2 = b.priority;
if (p1 !== p2) return p2 - p1;
return a - b;
});
};
}; // Yanfly.Param.ABRState
//=============================================================================
// Game_Battler
//=============================================================================
Game_Battler.prototype.barrierPoints = function(turn) {
this.initAbsorptionBarrier();
if (turn < 0) {
return this._permBarrier;
} else if (turn >= 0) {
this._turnBarrier[turn] = this._turnBarrier[turn] || 0;
return this._turnBarrier[turn];
}
var value = this._permBarrier;
var length = this._turnBarrier.length;
for (var i = 0; i < length; ++i) {
this._turnBarrier[i] = this._turnBarrier[i] || 0;
value += this._turnBarrier[i];
}
return value;
};
Game_Battler.prototype.barrierPointsTotal = function(turn) {
this.initAbsorptionBarrier();
var total = this._permBarrier || 0;
var length = turn;
for (var i = 0; i < length; ++i) {
total += this._turnBarrier[i] || 0;
}
return total;
};
Game_Battler.prototype.gainBarrier = function(value, turn) {
this.initAbsorptionBarrier();
value = Math.floor(value);
if (turn > 0) {
turn -= 1;
this._turnBarrier[turn] = this._turnBarrier[turn] || 0;
this._turnBarrier[turn] += value;
this._turnBarrier[turn] = Math.max(0, this._turnBarrier[turn]);
} else {
this._permBarrier = this._permBarrier || 0;
this._permBarrier += value;
this._permBarrier = Math.max(0, this._permBarrier);
}
this._barrierAltered = true;
this.refresh();
};
Game_Battler.prototype.gainBarrierEval = function(formula, turn, user, target) {
if (formula === '') return 0;
this.initAbsorptionBarrier();
value = 0;
var a = user;
var b = target;
var subject = user;
var s = $gameSwitches._data;
var v = $gameVariables._data;
try {
eval(formula);
} catch (e) {
Yanfly.Util.displayError(e, formula, 'GAIN BARRIER CUSTOM CODE ERROR');
}
value = Math.floor(value);
return value;
};
Game_Battler.prototype.loseBarrier = function(value, penRate, penFlat) {
if (penRate === undefined) penRate = 1;
if (penFlat === undefined) penFlat = 0;
value = Math.ceil(value);
if (value <= 0) return 0;
this.initAbsorptionBarrier();
var initValue = value;
var result = JsonEx.makeDeepCopy(this._result);
var calcValue = Math.ceil(value * penRate - penFlat);
this._result = new Game_ActionResult();
var length = this._turnBarrier.length;
for (var i = 0; i < length; ++i) {
this._turnBarrier[i] = this._turnBarrier[i] || 0;
var reduction = Math.min(this._turnBarrier[i], calcValue);
if (reduction > 0) {
this._turnBarrier[i] -= reduction;
this._result.hpDamage += reduction;
value -= reduction;
calcValue -= reduction;
}
if (value <= 0) break;
}
var reduction = Math.min(this._permBarrier, calcValue);
if (reduction > 0) {
this._permBarrier -= reduction;
this._result.hpDamage += reduction;
value -= reduction;
calcValue -= reduction;
}
if (initValue !== value) {
this._barrierAltered = true;
this.startBarrierAnimation();
if (Imported.YEP_BattleEngineCore) {
this._result._barrierAffected = true;
this._result.hpAffected = true;
this.startDamagePopup();
}
}
this._result = result;
return value;
};
Game_Battler.prototype.loseBarrierTurn = function(value, turn) {
value = Math.abs(value);
var barrierPoints = this.barrierPointsTotal(turn);
var dmg = Math.min(value, barrierPoints);
this.loseBarrier(dmg);
};
Game_Battler.prototype.startBarrierAnimation = function() {
if (this.barrierPoints() > 0) {
if (Yanfly.Param.ABRAni1 > 0) this.startAnimation(Yanfly.Param.ABRAni1);
} else {
if (Yanfly.Param.ABRAni2 > 0) this.startAnimation(Yanfly.Param.ABRAni2);
$gameSwitches.setValue(104,true)
}
};
Yanfly.ABR.Game_Battler_regenerateAll = Game_Battler.prototype.regenerateAll;
Game_Battler.prototype.regenerateAll = function() {
Yanfly.ABR.Game_Battler_regenerateAll.call(this);
if (!$gameParty.inBattle()) return;
if (this.isAlive()) {
this.updateBarrierTurns();
this.regenBarriers();
}
};
Game_Battler.prototype.updateBarrierTurns = function() {
this.initAbsorptionBarrier();
if (this.barrierPoints() <= 0) return;
this._turnBarrier.shift();
this.initAbsorptionBarrier();
this._barrierAltered = true;
this.refresh();
};
Yanfly.ABR.Game_Battler_onBattleStart = Game_Battler.prototype.onBattleStart;
Game_Battler.prototype.onBattleStart = function() {
if (Yanfly.Param.ABRClear) this.clearAbsorptionBarrier();
Yanfly.ABR.Game_Battler_onBattleStart.call(this);
this.makeOnBattleStartBarrierPoints();
};
Yanfly.ABR.Game_Battler_onBattleEnd = Game_Battler.prototype.onBattleEnd;
Game_Battler.prototype.onBattleEnd = function() {
if (Yanfly.Param.ABRClear) this.clearAbsorptionBarrier();
Yanfly.ABR.Game_Battler_onBattleEnd.call(this);
};
Game_Battler.prototype.barrierPenetrationRate = function() {
var rate = 1;
var length = this.states().length;
for (var i = 0; i < length; ++i) {
var obj = this.states()[i];
if (obj && obj.barrierPenetrationRate !== undefined) {
rate *= (1 - obj.barrierPenetrationRate);
}
}
return 1 - rate;
};
Game_Battler.prototype.barrierPenetrationRateEval = function(c1, c2, c3, c4) {
var rate = 1;
var length = this.states().length;
for (var i = 0; i < length; ++i) {
var obj = this.states()[i];
if (obj && obj.barrierPenetrationRateEval !== undefined) {
var formula = obj.barrierPenetrationRateEval;
rate *= (1 - this.getbarrierPenRateEval(formula, c1, c2, c3, c4));
}
}
return 1 - rate;
};
Game_Battler.prototype.getbarrierPenRateEval = function(f1, c1, c2, c3, c4) {
if (f1 === '') return 0;
var rate = 0;
var item = c1;
var skill = c1;
var a = c2;
var user = c2;
var subject = c2;
var b = c3;
var target = c3;
var value = c4;
var damage = c4;
var s = $gameSwitches._data;
var v = $gameVariables._data;
try {
eval(f1);
} catch (e) {
Yanfly.Util.displayError(e, f1, 'BARRIER PEN RATE CUSTOM CODE ERROR');
}
return rate;
};
Game_Battler.prototype.barrierPenetrationFlat = function() {
var value = 0;
var length = this.states().length;
for (var i = 0; i < length; ++i) {
var obj = this.states()[i];
if (obj && obj.barrierPenetrationFlat !== undefined) {
value += obj.barrierPenetrationFlat;
}
}
return value;
};
Game_Battler.prototype.barrierPenetrationFlatEval = function(c1, c2, c3, c4) {
var value = 0;
var length = this.states().length;
for (var i = 0; i < length; ++i) {
var obj = this.states()[i];
if (obj && obj.barrierPenetrationFlatEval !== undefined) {
var formula = obj.barrierPenetrationFlatEval;
value += this.getbarrierPenFlatEval(formula, c1, c2, c3, c4);
}
}
return value;
};
Game_Battler.prototype.getbarrierPenFlatEval = function(f1, c1, c2, c3, c4) {
if (f1 === '') return 0;
var flat = 0;
var item = c1;
var skill = c1;
var a = c2;
var user = c2;
var subject = c2;
var b = c3;
var target = c3;
var value = c4;
var damage = c4;
var s = $gameSwitches._data;
var v = $gameVariables._data;
try {
eval(f1);
} catch (e) {
Yanfly.Util.displayError(e, f1, 'BARRIER PEN FLAT CUSTOM CODE ERROR');
}
return flat;
};
if (Yanfly.Param.ABRDeath) {
Yanfly.ABR.Game_Battler_addState = Game_Battler.prototype.addState;
Game_Battler.prototype.addState = function(stateId) {
var deathState = (stateId === this.deathStateId());
var lifeState = this.isAlive();
Yanfly.ABR.Game_Battler_addState.call(this, stateId);
if (deathState && lifeState !== this.isAlive()) this.clearAbsorptionBarrier();
};
}; // Yanfly.Param.ABRDeath
Game_Battler.prototype.makeOnBattleStartBarrierPoints = function() {
var barriers = this.battleStartBarrierPoints();
var length = barriers.length;
for (var i = 0; i < length; ++i) {
var value = barriers[i] || 0;
this.gainBarrier(value, i);
}
};
Game_Battler.prototype.battleStartBarrierPoints = function() {
var array = [];
var length = this.states().length;
for (var i = 0; i < length; ++i) {
var obj = this.states()[i];
if (obj) this.makeBattleStartBarrierPoints(array, obj);
}
return array;
};
Game_Battler.prototype.makeBattleStartBarrierPoints = function(array, obj) {
if (obj.battleStartBarrierPoints !== undefined) {
var length = obj.battleStartBarrierPoints.length;
for (var i = 0; i < length; ++i) {
var iteration = obj.battleStartBarrierPoints[i] || 0;
array[i] = array[i] || 0;
array[i] += iteration;
}
}
if (obj.battleStartBarrierPointsEval !== undefined) {
var length = obj.battleStartBarrierPointsEval.length;
for (var i = 0; i < length; ++i) {
var formula = obj.battleStartBarrierPointsEval[i] || '';
array[i] = array[i] || 0;
array[i] += this.makeBattleStartBarrierPointsEval(formula);
}
}
return array;
};
Game_Battler.prototype.makeBattleStartBarrierPointsEval = function(formula) {
var value = 0;
var a = this;
var user = this;
var subject = this;
var s = $gameSwitches._data;
var v = $gameVariables._data;
try {
eval(formula);
} catch (e) {
Yanfly.Util.displayError(e, formula, 'BARRIER START CUSTOM CODE ERROR');
}
return value;
};
Game_Battler.prototype.regenBarriers = function() {
var barriers = this.getRegenBarriers();
var length = barriers.length;
for (var i = 0; i < length; ++i) {
var value = barriers[i] || 0;
this.gainBarrier(value, i);
}
};
Game_Battler.prototype.getRegenBarriers = function() {
var array = [];
var length = this.states().length;
for (var i = 0; i < length; ++i) {
var obj = this.states()[i];
if (obj) this.makeRegenBarrierPoints(array, obj);
}
return array;
};
Game_Battler.prototype.makeRegenBarrierPoints = function(array, obj) {
if (obj.barrierRegen !== undefined) {
var length = obj.barrierRegen.length;
for (var i = 0; i < length; ++i) {
var iteration = obj.barrierRegen[i] || 0;
array[i] = array[i] || 0;
array[i] += iteration;
}
}
if (obj.barrierRegenEval !== undefined) {
var length = obj.barrierRegenEval.length;
for (var i = 0; i < length; ++i) {
var formula = obj.barrierRegenEval[i] || '';
array[i] = array[i] || 0;
array[i] += this.makeBattleStartBarrierPointsEval(formula);
}
}
};
Game_Battler.prototype.makeRegenBarrierPointsEval = function(formula) {
var value = 0;
var a = this;
var user = this;
var subject = this;
var s = $gameSwitches._data;
var v = $gameVariables._data;
try {
eval(formula);
} catch (e) {
Yanfly.Util.displayError(e, formula, 'BARRIER REGEN CUSTOM CODE ERROR');
}
return value;
};
//=============================================================================
// Game_Actor
//=============================================================================
Yanfly.ABR.Game_Actor_setup = Game_Actor.prototype.setup;
Game_Actor.prototype.setup = function(actorId) {
Yanfly.ABR.Game_Actor_setup.call(this, actorId);
this.clearAbsorptionBarrier();
};
Game_Actor.prototype.barrierPenetrationRate = function() {
var rate = 1 - Game_Battler.prototype.barrierPenetrationRate.call(this);
var length = this.equips().length;
for (var i = 0; i < length; ++i) {
var obj = this.equips()[i];
if (obj && obj.barrierPenetrationRate !== undefined) {
rate *= (1 - obj.barrierPenetrationRate);
}
}
rate *= (1 - this.actor().barrierPenetrationRate);
rate *= (1 - this.currentClass().barrierPenetrationRate);
return 1 - rate;
};
Game_Actor.prototype.barrierPenetrationRateEval = function(c1, c2, c3, c4) {
var rate = 1 - Game_Battler.prototype.barrierPenetrationRateEval.call(this,
c1, c2, c3, c4);
var length = this.equips().length;
for (var i = 0; i < length; ++i) {
var obj = this.equips()[i];
if (obj && obj.barrierPenetrationRateEval !== undefined) {
var formula = obj.barrierPenetrationRateEval;
rate *= (1 - this.getbarrierPenRateEval(formula, c1, c2, c3, c4));
}
}
var formula = this.actor().barrierPenetrationRateEval;
rate *= (1 - this.getbarrierPenRateEval(formula, c1, c2, c3, c4));
var formula = this.currentClass().barrierPenetrationRateEval;
rate *= (1 - this.getbarrierPenRateEval(formula, c1, c2, c3, c4));
return 1 - rate;
};
Game_Actor.prototype.barrierPenetrationFlat = function() {
var value = Game_Battler.prototype.barrierPenetrationFlat.call(this);
var length = this.equips().length;
for (var i = 0; i < length; ++i) {
var obj = this.equips()[i];
if (obj && obj.barrierPenetrationFlat !== undefined) {
value += obj.barrierPenetrationFlat;
}
}
value += this.actor().barrierPenetrationFlat;
value += this.currentClass().barrierPenetrationFlat;
return value;
};
Game_Actor.prototype.barrierPenetrationFlatEval = function(c1, c2, c3, c4) {
var value = Game_Battler.prototype.barrierPenetrationFlatEval.call(this,
c1, c2, c3, c4);
var length = this.equips().length;
for (var i = 0; i < length; ++i) {
var obj = this.equips()[i];
if (obj && obj.barrierPenetrationFlatEval !== undefined) {
var formula = obj.barrierPenetrationFlatEval;
value += this.getbarrierPenFlatEval(formula, c1, c2, c3, c4);
}
}
var formula = this.actor().barrierPenetrationFlatEval;
value += this.getbarrierPenFlatEval(formula, c1, c2, c3, c4);
var formula = this.currentClass().barrierPenetrationFlatEval;
value += this.getbarrierPenFlatEval(formula, c1, c2, c3, c4);
return value;
};
Game_Actor.prototype.battleStartBarrierPoints = function() {
var array = Game_Battler.prototype.battleStartBarrierPoints.call(this);
var length = this.equips().length;
for (var i = 0; i < length; ++i) {
var obj = this.equips()[i];
if (obj) this.makeBattleStartBarrierPoints(array, obj);
}
this.makeBattleStartBarrierPoints(array, this.actor());
this.makeBattleStartBarrierPoints(array, this.currentClass());
return array;
};
Game_Actor.prototype.getRegenBarriers = function() {
var array = Game_Battler.prototype.getRegenBarriers.call(this);
var length = this.equips().length;
for (var i = 0; i < length; ++i) {
var obj = this.equips()[i];
if (obj) this.makeRegenBarrierPoints(array, obj);
}
this.makeRegenBarrierPoints(array, this.actor());
this.makeRegenBarrierPoints(array, this.currentClass());
return array;
};
//=============================================================================
// Game_Enemy
//=============================================================================
Game_Enemy.prototype.barrierPenetrationRate = function() {
var rate = 1 - Game_Battler.prototype.barrierPenetrationRate.call(this);
rate *= (1 - this.enemy().barrierPenetrationRate);
return 1 - rate;
};
Game_Enemy.prototype.barrierPenetrationRateEval = function(c1, c2, c3, c4) {
var rate = 1 - Game_Battler.prototype.barrierPenetrationRateEval.call(this,
c1, c2, c3, c4);
var formula = this.enemy().barrierPenetrationRateEval;
rate *= (1 - this.getbarrierPenRateEval(formula, c1, c2, c3, c4));
return 1 - rate;
};
Game_Enemy.prototype.barrierPenetrationFlat = function() {
var value = Game_Battler.prototype.barrierPenetrationFlat.call(this);
value += this.enemy().barrierPenetrationFlat;
return value;
};
Game_Enemy.prototype.barrierPenetrationFlatEval = function(c1, c2, c3, c4) {
var value = Game_Battler.prototype.barrierPenetrationFlatEval.call(this,
c1, c2, c3, c4);
var formula = this.enemy().barrierPenetrationFlatEval;
value += this.getbarrierPenFlatEval(formula, c1, c2, c3, c4);
return value;
};
Game_Enemy.prototype.battleStartBarrierPoints = function() {
var array = Game_Battler.prototype.battleStartBarrierPoints.call(this);
this.makeBattleStartBarrierPoints(array, this.enemy());
return array;
};
Game_Enemy.prototype.getRegenBarriers = function() {
var array = Game_Battler.prototype.getRegenBarriers.call(this);
this.makeRegenBarrierPoints(array, this.enemy());
return array;
};
//=============================================================================
// Game_Action
//=============================================================================
Yanfly.ABR.Game_Action_applyItemUserEffect =
Game_Action.prototype.applyItemUserEffect;
Game_Action.prototype.applyItemUserEffect = function(target) {
Yanfly.ABR.Game_Action_applyItemUserEffect.call(this, target);
if (this.item()) this.applyItemBarrierEffect(target);
};
Game_Action.prototype.applyItemBarrierEffect = function(target) {
var item = this.item();
if (target) this.gainBarrierBonus(target, true);
this.gainBarrierBonus(this.subject(), false);
};
Game_Action.prototype.gainBarrierBonus = function(target, isTarget) {
var item = this.item();
var barriers = isTarget ? item.targetBarrier : item.userBarrier;
var evalBarriers = isTarget ? item.targetBarrierEval : item.userBarrierEval;
var length = Math.max(barriers.length, evalBarriers.length);
if (length <= 0) return;
for (var i = 0; i < length; ++i) {
var t = i;
if (t > 0 && target === this.subject()) t += 1;
var value = barriers[i] || 0;
value += target.gainBarrierEval(evalBarriers[i] || '', t, this.subject(),
target);
if (value > 0) {
target.gainBarrier(value, t);
} else if (value < 0) {
target.loseBarrierTurn(value, t);
}
}
target.refresh();
};
Yanfly.ABR.Game_Action_executeHpDamage = Game_Action.prototype.executeHpDamage;
Game_Action.prototype.executeHpDamage = function(target, value) {
var barrier = false;
if (this.isAffectBarrierPoints(target, value)) {
barrier = true;
var penRate = this.calcBarrierPenetrationRate(target, value);
var penFlat = this.calcBarrierPenetrationFlat(target, value);
value = target.loseBarrier(value, penRate, penFlat);
}
Yanfly.ABR.Game_Action_executeHpDamage.call(this, target, value);
if (Yanfly.Param.ABRDisplay0) return;
if (barrier && target && target._result.hpDamage === 0) {
target._result.hpAffected = false;
}
};
Game_Action.prototype.isAffectBarrierPoints = function(target, value) {
if (value <= 0) return false;
return target.barrierPoints() > 0;
};
Game_Action.prototype.calcBarrierPenetrationRate = function(target, value) {
var value = 1 - this.item().barrierPenetrationRate;
value *= 1 - this.barrierPenetrationRateEval(target, value);
value *= 1 - this.subject().barrierPenetrationRate();
value *= 1 - this.subject().barrierPenetrationRateEval(this, this.subject(),
target, value);
return value.clamp(0, 1);
};
Game_Action.prototype.barrierPenetrationRateEval = function(target, value) {
var item = this.item();
if (item.barrierPenetrationRateEval === '') return 0;
var rate = 0;
var skill = item;
var a = this.subject();
var user = this.subject();
var subject = this.subject();
var b = target;
var damage = value;
var s = $gameSwitches._data;
var v = $gameVariables._data;
var code = item.barrierPenetrationRateEval;
try {
eval(code);
} catch (e) {
Yanfly.Util.displayError(e, code, 'BARRIER PEN RATE CUSTOM CODE ERROR');
}
return rate;
};
Game_Action.prototype.calcBarrierPenetrationFlat = function(target, value) {
var value = this.item().barrierPenetrationFlat;
value += this.barrierPenetrationFlatEval(target, value);
value += this.subject().barrierPenetrationFlat();
value += this.subject().barrierPenetrationFlatEval(this, this.subject(),
target, value);
return value.clamp(0, target.barrierPoints());
};
Game_Action.prototype.barrierPenetrationFlatEval = function(target, value) {
var item = this.item();
if (item.barrierPenetrationFlatEval === '') return 0;
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 code = item.barrierPenetrationFlatEval;
try {
eval(code);
} catch (e) {
Yanfly.Util.displayError(e, code, 'BARRIER PEN FLAT CUSTOM CODE ERROR');
}
return flat;
};
//=============================================================================
// Sprite_Damage
//=============================================================================
if (Imported.YEP_BattleEngineCore) {
Yanfly.ABR.Sprite_Damage_setup = Sprite_Damage.prototype.setup;
Sprite_Damage.prototype.setup = function(target) {
var result = target._damagePopup[0];
Yanfly.ABR.Sprite_Damage_setup.call(this, target);
if (result._barrierAffected) this.setupBarrierEffect();
};
} // Imported.YEP_BattleEngineCore
Sprite_Damage.prototype.setupBarrierEffect = function() {
this._flashColor = Yanfly.Param.ABRPop.slice();
this._flashDuration = 180;
};
//=============================================================================
// Window_Base
//=============================================================================
Window_Base.prototype.drawActorHp = function(actor, wx, wy, ww) {
ww = ww || 186;
var color1 = this.hpGaugeColor1();
var color2 = this.hpGaugeColor2();
if (actor.barrierPoints() > 0) {
ww = this.drawBarrierGauge(actor, wx, wy, ww);
} else {
this.drawGauge(wx, wy, ww, actor.hpRate(), color1, color2);
}
this.changeTextColor(this.systemColor());
this.drawText(TextManager.hpA, wx, wy, 44);
var c1 = this.hpColor(actor);
var c2 = this.normalColor();
this.drawCurrentAndMax(actor.hp, actor.mhp, wx, wy, ww, c1, c2);
};
Window_Base.prototype.barrierColor1 = function() {
return this.textColor(Yanfly.Param.ABRColor1);
};
Window_Base.prototype.barrierColor2 = function() {
return this.textColor(Yanfly.Param.ABRColor2);
};
Window_Base.prototype.drawBarrierGauge = function(actor, wx, wy, ww) {
if (actor.hp + actor.barrierPoints() > actor.mhp) {
var max = actor.mhp + actor.barrierPoints();
var rate1 = actor.hp / max;
} else {
var max = actor.mhp;
var rate1 = actor.hpRate();
}
var rate2 = (actor.barrierPoints() + actor.hp) / max;
var color1 = this.barrierColor1();
var color2 = this.barrierColor2();
this.drawGauge(wx, wy, ww, rate2, color1, color2);
var color1 = this.hpGaugeColor1();
var color2 = this.hpGaugeColor2();
var ww2 = ww * rate1;
this.drawGauge(wx, wy, ww2, 1, color1, color2);
return ww;
};
//=============================================================================
// 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
//=============================================================================