//============================================================================= // 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.05; //============================================================================= /*: * @plugindesc v1.05 吸收屏障☁️ * @author Yanfly Engine Plugins * * @param Barrier State * @text 屏障状态 * @desc 如果一个战士有一个障碍点,他将受到这个状态的影响。在0处离开,不进入任何状态。 * @default 0 * * @param Barrier Color 1 * @text 屏障文本颜色1 * @desc The text code color 1 used for the barriers. * @default 13 * * @param Barrier Color 2 * @text 屏障文本颜色2 * @desc The text code color 2 used for the barriers. * @default 5 * * @param Barrier Animation * @text 屏障动画 * @desc Animation played when barrier points are lost. * Leave at 0 for no animation. * @default 0 * * @param Break Animation * @text 打断动画 * @desc Animation played when barrier points are emptied. * Leave at 0 for no animation. * @default 0 * * @param Barrier Popup * @text 屏障破坏弹出窗口 * @desc If using the Battle Engine Core, this is the popup color * shown for barrier damage. Red, Green, Blue, Opacity * @default 255, 0, 255, 160 * * @param Display 0 HP Damage * @text 显示0点生命伤害 * @desc Display 0 HP Damage if 0 Damage is dealt to HP? * NO - false YES - true * @default false * * @param Clear Per Battle * @text 每次战斗清除屏障 * @desc Clear barrier points at the start and end of battle? * NO - false YES - true * @default true * * @param Clear on Death * @text 死亡时清除屏障 * @desc Clear barrier points if the battler dies? * NO - false YES - true * @default true * * @param Default Penetration Rate * @text 默认穿透率 * @desc The default Barrier Penetration Rate for all actions. * Example: if you want 50%, use 0.50. * @default 0 * * @param Default Penetration Flat * @text 默认穿透平面 * @desc The default Barrier Penetration Flat for all actions. * Example: if you want 100 flat penetration, use 100. * @default 0 * * @help * ============================================================================ * Introduction * ============================================================================ * * 屏障吸收是一个新的战斗技巧。屏障值是一个新的状态,为玩家提供一层保护。 * 直接攻击将不会作用在血量上,而是先消减屏障值,剩余的在作用给玩家 * * 借助这个可以开发很多功能,更多请看下一部分 * * ============================================================================ * Barrier Points - Explanation * ============================================================================ * * 屏障值是一个血量增益状态。任何来自技能或者物品的攻击将会先削减屏障值 * 让我们看看它是怎么工作的 * * --- Example 1 ---- * * 例如,这里有100屏障值,150伤害 * * 150 DMG vs 100 Barrier Points: 50 DMG goes through * * 屏障值最后为0,受到50伤害 * * --- Example 2--- * * 这里有100屏障值,50伤害 * * 50 DMG vs 100 Barrier Points: 0 DMG goes through * * 屏障值最后为50,受到0伤害 * * ============================================================================ * Barrier Penetration - Explanation * ============================================================================ * * 技能或者物品有个独特的特性叫做穿透屏障。这个允许部分伤害忽略屏障直接造 * 成伤害 * * --- Example --- * * 这里有500屏障值,100伤害,75%穿透 * * 100 DMG vs 500 Barrier Points: 75 DMG goes through * * 屏障值最后为475,受到75伤害 * * ============================================================================ * Unexpiring Barriers vs Timed Barriers - Explanation * ============================================================================ * * 这里有2种类型的屏障:永久屏障和临时屏障。 * * --- Example --- * * Turn 1 - 100 Barrier Points * Turn 2 - 200 Barrier Points * Turn 3 - 300 Barrier Points * * Right now, the user has 600 Barrier Points total. After the Regeneration * Phase, it will become this: * * Turn 1 - 200 Barrier Points * Turn 2 - 300 Barrier Points * * And the user will have 500 Barrier Points total. * * --- * * 伤害优先给与最低回合数,然后慢慢变高,最后是永久屏障: * * --- Example --- * * Turn 1 - 100 Barrier Points * Turn 2 - 200 Barrier Points * Unexpiring - 300 Barrier Points * * Now, let's suppose 500 damage will be dealt. It will result in this: * * Turn 1 - 0 Barrier Points * Turn 2 - 0 Barrier Points * Unexpiring - 100 Barrier Points * * ============================================================================ * Notetags * ============================================================================ * * 使用下面标签来设置 * * Skill and Item Notetags: * * * * This adjusts the Barrier Points for user or the target respectively by +x. * The Barrier Points altered for this notetag are unexpiring Barrier Points * that do not remove themselves as time passes.设置永久屏障值 * * * * This will remove x barrier points from the user or the target. This is * applied to unexpiring and temporary barrier points alike. * * * * This adjusts the Barrier Points for the user or target respectively at x * turns by +y amount. These Barrier Points will expire after x turns. Each * turn goes by during the battler's regeneration timing.设置临时屏障值 * * * * This will remove y barrier points from the user or target up to x turns. * * * This causes this skill to be able to bypass Barrier Points to directly * deal damage to the target.忽略屏障 * * * Causes x% of this skill or item's damage to bypass the action target's * Barrier Points. If the target does not have enough Barrier Points, more * damage will be dealt. This is a percentile value.屏障穿透百分比 * * * Causes x value of this skill or item's damage to bypass action target's * Barrier Points. If the target does not have enough Barrier Points, more * damage will be dealt. This is a flat value.屏障穿透值 * * Actor, Class, Enemy, Weapon, Armor, State Notetags: * * * * This makes any damaging action by the attacker to have +x% or -x% bonus * Barrier Penetration. This is a multiplicative bonus and applied before * flat bonuses have been made.屏障穿透百分比 * * * * This makes any damaging action by the attacker to have +x or -x bonus * Barrier Penetration. This is a flat bonus and applied after multiplicative * changes have been made.屏障穿透值 * * * * The amount of unexpiring Barrier Points are gained at the start of a new * battle for the affected user.设置永久屏障值 * * * * The amount of Barrier Points are gained at the start of a new battle for * the affected user that will last x turns.设置临时屏障值 * * * * During the regeneration phase, the user will regenerate +x/-x unexpiring * Barrier Points.屏障更新值 * * * * During the regeneration phase, the user will regenerate Barrier Points * that last x turns with a +y/-y value.屏障每回合更新值 * * ============================================================================ * Lunatic Mode - Custom Barrier Points * ============================================================================ * * For those with JavaScript proficiency, you can utilize these notetags to * allow your skills and items to give battlers custom Barrier Point totals. * * Skill and Item Notetags: * * --- Target --- * * * value = target.level; * * The 'value' variable determines the total amount of Barrier Points that * will be added to the target's unexpiring Barrier Point total. * * * value = target.level; * * The 'value' variable determines the total amount of Barrier Points that * will be added to the target for x amount of turns. * * --- User --- * * * value = user.level; * * The 'value' variable determines the total amount of Barrier Points that * will be added to the user's unexpiring Barrier Point total. * * * value = user.level; * * The 'value' variable determines the total amount of Barrier Points that * will be added to the user for x amount of turns. * * ============================================================================ * Lunatic Mode - Custom Barrier Penetration * ============================================================================ * * For those with JavaScript proficiency, you can utilize these notetags to * give your skills, items, actors, classes, enemies, weapons, armors, and * states custom Barrier Penetration effects. * * Skill, Item, Actor, Class, Enemy, Weapon, Armor, State Notetags: * * --- Rate --- * * * rate = target.hpRate(); * * The 'rate' variable determines the percentile amount of damage the user * will bypass for the target's Barrier Points. This is a multiplicative * bonus and will be applied before any flat bonuses. * * --- Flat --- * * * flat = target.level; * * The 'flat' variable determines the flat amount of damage the user will * bypass for the target's Barrier Points. This is a flat bonus and will be * applied after all multiplicative bonuses. * * ============================================================================ * Lunatic Mode - Custom Barrier Points on Battle Start * ============================================================================ * * For those with JavaScript proficiency, you can utilize these notetags to * add a dynamic amount of Barrier Points during the start up of a battle. * * Actor, Class, Enemy, Weapon, Armor, and State Notetags: * * --- Unexpiring --- * * * value += user.hp; * * The 'value' variable determines how many Barrier Points the user will * start a battle with. The Barrier Points added through this notetag are * unexpiring Barrier Points. * * --- Timed --- * * * value += user.hp; * * The 'value' variable determines how many Barrier Points the user will * start a battle with but expires after x turns. * * ============================================================================ * Lunatic Mode - Custom Barrier Regeneration * ============================================================================ * * For those with JavaScript proficiency, you can utilize these notetags to * add a dynamic amount of Barrier Points during the user's regeneration phase. * * Actor, Class, Enemy, Weapon, Armor, and State Notetags: * * --- Unexpiring --- * * * value += user.hp / 4; * * The 'value' variable determines how many Barrier Points the user will * gain during the user's regeneration phase. The Barrier Points added with * this notetag are unexpiring Barrier Points. * * --- Timed --- * * * value += user.hp / 4; * * The 'value' variable determines how many Barrier Points the user will * gain during the user's regeneration phase. The Barrier Points added with * this notetag will last x turns. * * ============================================================================ * Lunatic Mode - New JavaScript Functions * ============================================================================ * * For those familiar with JavaScript, here is a quick reference list of new * JavaScript functions you can use for your own code and/or Lunatic Mode. * * JavaScript functions: * * battler.barrierPoints() * - Returns the total amount of Barrier Points the battler has. * * battler.barrierPoints(-1) * - Returns the amount of unexpiring Barrier Points the battler has. * * battler.barrierPoints(x) * - Returns the amount of Barrier Points the battler has for that turn. * * battler.gainBarrier(value, turn) * - Makes battler gain barrier points equal to 'value' that lasts a certain * amount of 'turns'. If turns is left at 0, the value will be unexpiring * Barrier Points. * * battler.loseBarrier(value) * - Makes the battler lose 'value' worth of Barrier Points. * * battler.startBarrierAnimation() * - Makes the battler play the barrier struck animation. * * battler.updateBarrierTurns() * - Makes the battler's Barrier Points update their turns. * * ============================================================================ * Changelog * ============================================================================ * * Version 1.05: * - Lunatic Mode fail safes added. * * Version 1.04: * - , , , and * notetags have been revamped. They will also * show popups now. If 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 = //i; var noteA2 = //i; var noteB1 = //i; var noteB2 = //i; var noteC1 = //i; var noteC2 = /<\/CUSTOM TARGET BARRIER[ ](\d+)[ ](?:TURN|TURNS)>/i; var noteD1 = //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(//i)) { obj.barrierPenetrationRate = 1; } else if (line.match(//i)) { obj.barrierPenetrationRate = parseFloat(RegExp.$1) * 0.01; } else if (line.match(//i)) { obj.barrierPenetrationFlat = parseInt(RegExp.$1); } else if (line.match(//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(//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(//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(//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 = //i; var noteA2 = //i; var noteB1 = //i; var noteB2 = /<\/CUSTOM BARRIER POINTS[ ](\d+)[ ](?:TURN|TURNS)>/i; var noteC1 = //i; var noteC2 = //i; var noteD1 = //i; var noteD2 = /<\/CUSTOM BARRIER REGEN>/i; var noteE1 = //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(//i)) { obj.barrierPenetrationRate = parseFloat(RegExp.$1) * 0.01; } else if (line.match(//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(//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(//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(//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); } }; Yanfly.ABR.Game_Battler_regenerateAll = Game_Battler.prototype.regenerateAll; Game_Battler.prototype.regenerateAll = function() { Yanfly.ABR.Game_Battler_regenerateAll.call(this); 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.isNwjs() && Utils.isOptionValid('test')) { if (!require('nw.gui').Window.get().isDevToolsOpen()) { require('nw.gui').Window.get().showDevTools(); } } }; //============================================================================= // End of File //=============================================================================