//=============================================================================
// Yanfly Engine Plugins - Battle System - Active Turn Battle
// YEP_X_BattleSysATB.js
//=============================================================================
var Imported = Imported || {};
Imported.YEP_X_BattleSysATB = true;
var Yanfly = Yanfly || {};
Yanfly.ATB = Yanfly.ATB || {};
Yanfly.ATB.version = 1.25;
//=============================================================================
/*:
* @plugindesc v1.25 时间槽战斗系统☁️
* @author Yanfly Engine Plugins
*
* @param ---ATB 设置---
* @default
*
* @param Per Tick
* @text 每刻时
* @desc This is how much speed is gained per tick.
* @default user.agi
*
* @param Initial Speed
* @text 初始速度
* @desc 战斗开始时战斗者的速度位置。
* 这是一个计算公式。
* @default 0
*
* @param Full Gauge
* @desc ATB仪表的目标速度为满。
* 这是一个计算公式。
* @default Math.max(5000, BattleManager.highestBaseAgi() * 100)
*
* @param Charge Gauge
* @desc 选择动作后的结束时间。
* 这是一个计算公式。
* @default Math.max(2000, BattleManager.highestBaseAgi() * 20)
*
* @param Pre-Emptive Bonuses
* @text 先发制人奖励
* @desc How much of the ATB bar do you want filled up for an
* ATB pre-emptive bonus from 0 to 1.
* @default 0.8
*
* @param Surprise Bonuses
* @text 惊喜奖励
* @desc How much of the ATB bar do you want filled up for an
* ATB surprise bonus from 0 to 1.
* @default 0.8
*
* @param ---逃跑---
* @default
*
* @param Escape Ratio
* @text 逃跑率
* @desc How ATB calculates escape ratios.
* Default: 0.5 * $gameParty.agility() / $gameTroop.agility()
* @default 0.125 * $gameParty.agility() / $gameTroop.agility()
*
* @param Fail Escape Boost
* @text 失败+逃跑率
* @desc Each time the player fails escape, increase the success
* rate by this much. Default: 0.1
* @default 0.025
*
* @param ---Turn---
* @default
*
* @param Full Turn
* @desc 这就是多少滴答,等于一个完整的战斗回合。
* 这是一个计算公式。
* @default Math.min(200, BattleManager.lowestBaseAgi() * 8)
*
* @param Flash Enemy
* @text 闪光敌人
* @desc 当敌人开始使用他们的技能时闪光?
* NO - false YES - true
* @default true
*
* @param ---Rubberband---
* @default
*
* @param Enable Rubberband
* @desc This is an auto-balance mechanic for AGI.
* Disable - false Enable - true
* @default true
*
* @param Minimum Speed
* @text 最小速度
* @desc If rubberbanding is enabled, what is the minimum
* speed increase? This is a formula.
* @default 0.5 * BattleManager.highestBaseAgi()
*
* @param Maximum Speed
* @text 最大速度
* @desc If rubberbanding is enabled, what is the maximum
* speed increase? This is a formula.
* @default 1.5 * BattleManager.highestBaseAgi()
*
* @param ---准备音乐---
* @default
*
* @param Ready Sound
* @desc This is the sound played when the battler is ready.
* @default Decision1
*
* @param Ready Volume
* @desc This is the volume of the ready sound.
* @default 90
*
* @param Ready Pitch
* @desc This is the pitch of the ready sound.
* @default 120
*
* @param Ready Pan
* @desc This is the pan of the ready sound.
* @default 0
*
* @param ---选项---
* @default
*
* @param ATB Speed Text
* @text ATB速度文本
* @desc Text used for ATB speed in options window.
* @default ATB速度
*
* @param Default ATB Speed
* @text 默认ATB速度
* @desc Default speed at which the gauges fill up.
* 1 - slowest 10 - fastest
* @default 10
*
* @param ---窗口---
* @default
*
* @param Lock Status Window
* @text 锁定状态窗口
* @desc While ATB is active, lock the status window from moving?
* OFF - false ON - true
* @default true
*
* @param Gauge Style
* @desc This is the style of the ATB gauges:
* 0 - None 1 - Under Name 2 - Right Side
* @default 1
*
* @param Gauge Text
* @text
* @desc If style 2 is used, this is the text displayed.
* @default Turn
*
* @param Gauge Text Align
* @desc If style 2 is used, this is the text alignment.
* left center right
* @default center
*
* @param ATB Gauge Color 1
* @desc The 1st gauge color of the ATB gauge as it loads up.
* @default 13
*
* @param ATB Gauge Color 2
* @desc The 2nd gauge color of the ATB gauge as it loads up.
* @default 5
*
* @param Slow Gauge Color 1
* @desc 1st gauge color of the ATB gauge if actor is slowed.
* @default 12
*
* @param Slow Gauge Color 2
* @desc 2nd gauge color of the ATB gauge if actor is slowed.
* @default 4
*
* @param Fast Gauge Color 1
* @desc 1st gauge color of the ATB gauge if actor is hasted.
* @default 26
*
* @param Fast Gauge Color 2
* @desc 2nd gauge color of the ATB gauge if actor is hasted.
* @default 27
*
* @param Stop Gauge Color 1
* @desc 1st gauge color of the ATB gauge if actor is stopped.
* @default 7
*
* @param Stop Gauge Color 2
* @desc 2nd gauge color of the ATB gauge if actor is stopped.
* @default 8
*
* @param Full Gauge Color 1
* @desc The 1st gauge color of the ATB gauge when full.
* @default 14
*
* @param Full Gauge Color 2
* @desc The 2nd gauge color of the ATB gauge when full.
* @default 6
*
* @param Charge Gauge Color 1
* @desc The 1st gauge color of the ATB gauge when charging.
* @default 2
*
* @param Charge Gauge Color 2
* @desc The 2nd gauge color of the ATB gauge when charging.
* @default 10
*
* @help
* ============================================================================
* Introduction
* ============================================================================
*
* The Battle System - Active Turn Battle是一个基于Yanfly大神Battle Engine
* Core插件的拓展插件,所以它无法脱离核心战斗插件独立工作,安装时务必将该插件
* 放置于战斗核心插件-Battle Engine Core下方,要启用ATB战斗系统,请在战斗核心
* 插件的配置中,将Default System 选项由dtb修改为atb即可。
* ATB战斗系统是一个出色的动态战斗系统,它给角色定义了一个行动槽,当行动槽填
* 充时,角色不能进行任何操作,只有行动槽充满时,才可以进行相关操作如攻击、技
* 能等等,行动后清空行动槽,当行动槽再次充满后,角色才可进行下一次行动。
* 角色选择技能以后,会进入第二阶段行动槽填充,通常被成为咏唱时间条的填充,
* 第二阶段行动槽填满后,角色才会释放技能。这种经典的战斗系统被很频繁用到了如
* 最终幻想系列等很多游戏当中,这也使得传统RPG原本枯燥的回合战斗变得更加
* 紧张、刺激和有趣味,使用本系统,将使回合战斗中的更多战术和策略技能的设计研
* 发成为可能。
* ATB战斗系统使各角色的敏捷属性不再是花瓶,敏捷将直接决定角色的出手顺序和出
* 手速度,通常来说敏捷高的角色比敏捷低的角色更具备优势,前提是你不要弄个负
* 敏神兽出来...
*
* ============================================================================
* Plugin Commands 插件命令
* ============================================================================
*
* To change your battle system to Active Turn Battle if it isn't the default
* battle system, you can use the following Plugin Command:
*
* Plugin Command:
* setBattleSys ATB 将战斗模式改为 ATB 动态回合战斗系统.
* setBattleSys DTB 将战斗模式改为 DTB 默认回合战斗系统.
*
* 使用这个命令可以实现游戏对战斗模式的实时切换。
*
* ============================================================================
* Notetags 注释命令
* ============================================================================
*
* 以下为影响的ATB系统的相关注释命令
*
* 技能与道具注释:
*
* text
* text
*
* 这个命令可以给技能或道具添加专有的ATB说明信息,即如果启用了ATB战斗系统,
* 则在技能/道具说明中显示中的text文字说明,如果使用DTB系统,则显
* 示默认说明。
*
*
*
*
* 仅在ATB模式启用时可用。可以将目标单位的ATB行动值-speed、
* 咏唱值-Charge、综合值-Gauge的设置为一个固定数值。简单解释:
* speed参数-决定了行动阶段行动槽的值
* Charge参数-咏唱阶段的行动槽的值
* Gauge参数-这个参数会同时影响以上两个阶段的行动槽值
* 例子:道具注释中写上 即表示使用该道具后,目标的行动槽值
* 将被设置为1000
* 你要注意的是,如果你的行动槽值已经积攒到了10000,使用该道具后,将被置于
* 1000,相当于减速,如果为0则反之。
*
*
*
*
* 参照上面的命令,你可以将具体的X数值更换为百分比,这样ATB系统将根据行动槽最
* 大值来计算你要实现的具体数值大小
* 例子:道具注释中写明 表示该道具使用后咏唱槽数值将被设置
* 为50%,如果目标未咏唱,则不生效。如果目标咏唱超过50%,则将被强制重置为50%
* ,相当于减速,如果为0反之
*
* or
* or
* or
* 仅在 ATB 期间可用。这会增加或减少目标的行动槽或咏唱槽 。
* 如果使用“Speed”或“Charge”,则只会影响
* 在各自的阶段影响目标。如果使用“Gauge”,它将
* 在相应阶段影响其中之一。
*
* or
* or
* or
* 同上,你可以将x参数上加入+号或者-号来表示在当前行动槽基础上增加或者减少,
* 这个命令通常被用于加速/减速道具或技能的设计。
* 例子: 同上,你同样可以把增加减少数值修改为百分比。
*
*
*
* 顾名思义,你可以在道具和技能注释中加入这个命令,标识使用该道具或技能后,
* 对使用者行动槽的影响。因为使用技能或道具后,行动槽必定会被清空,所以+/-就
* 有意义了,你要把X替换为数值或百分比。
* 例子:我在电光火石这个技能的注释中加入了这个命令,表示我
* 使用电光火石技能后,使用者的回合结束后,行动槽将从50%处开始增加,
* 相当于下回合行动更快速了,是不是很吊?
*
*
*
* 这个命令比较强悍,就是打断!没错,Iterrupt命令会在对进入咏唱条的角色使用
* 后生效,打断对方目标咏唱,清空目标行动槽。如果你使用了百分比参数,
* 则表示有多少百分比的几率成功。
* 例子:我在小石头这个道具的注释命令中添加了这个命令,
* 表示当我使用这个道具后,目标如果正在咏唱,则有50%概率被打断,技能释放失
* 败。如果目标没有在咏唱,则道具无效。
*
*
* 当然你可以在技能中加入这个注释,表示该技能无法被打断,
* 如果有这个命令,任何带有打断命令的技能和道具都不会对这个技能生效了,请叫BOSS
*
* 下面这些命令可以用在角色、职业、敌人、武器、护甲和状态注释命令中,不要用
* 错地方哦:
* Actor, Class, Enemy, Weapon, Armor, and State Notetags:
*
*
* 上面的命令可以让你在回合开始时,获得行动槽的加成,x为数值或者百分比。第一
* 回合结束后,行动槽将从0开始计算。
* 例子:哈罗德的角色注释中我加入了命令,表示哈罗德每次战斗
* 开始时行动槽都会从20%开始计算,而不是0
* 在第一回合之后,哈罗德的行动槽恢复正常,与其他角色一样从0开始。
*
* the ATB gauge filled up.
*
*
*
* 这个命令表示每个回合的行动槽获得行动力加成,x为数值或者百分比。包括第一回
* 合在内的每一个回合,行动槽都会从X或x%开始计算。
* 例子:我在时魔法师的职业注释中加入了这个命令,然后我把玛
* 莎转职成了时魔法师,但是悲剧的小明还是黑魔法师所以小明的行动槽每回合是从
* 头开始计算的,而玛莎美女每回合的行动力都是从50%处开始计算,所以,
* 玛莎比小明更快,此题得证。
*
* ============================================================================
* Lunatic Mode - Conditional ATB Speed and Conditional ATB Charge
* ============================================================================
*
* 等等,上面那些基本命令已经满足不了你的编程小心脏了吗?我们为您提供了可以
* 在注释区域混合JavaScript脚本拓展命令的专用模式已经开启,Lunatic Mode 可以让
* 你在注释命令区间内按你们的想法设置条件和触发器,前提是,你要懂
*
* 技能和道具命令:
*
* speed = x;
* charge = x;
*
* 不同于直接的命令,这段命令的格式如上,你可以在注释
* 区的Lunatic Mode中使用更复杂的语句和公式定义speed charge参数,
* 也支持if else while for等javascript脚本命令。
*
* 给一个例子:
*
*
* speed = target.hp / target.mhp * max;
* charge = target.hp / target.mhp * max;
*
* 上面这段代码实现了speed和charge按照目标单位的hp和最大hp的百分比进行修改,
* 即目标血越少行动条填充的越多。延伸一点,你也可以使用触发器,使用if target.hp
* < target.mhp 30% 这种条件来决定这个技能什么时候可以被触发。
*
* --- --- --- --- ---
*
*
* speed = x;
*
* 这个命令类似于 可以让你设计动作完毕后,该动作对角色行动槽的影响
* ,当然你也可以设计的很复杂。
* 例子君出现了:
*
*
* speed = user.mp / user.mmp * max;
*
* 上面的代码实现了按照人物MP最大百分比来加成施法后行动条的回复量的功能。
*
* --- --- --- --- ---
*
*
* interrupt = true;
*
* 打断,没什么好说的,加入各种触发器和公式命令都是可以的。
*
* 例子君出现了:
*
*
* if (user.hp > target.hp) {
* interrupt = true;
* }
*
* 上面的命令实现了当使用者的当前hp大于目标的hp时,打断才能成功。给一个延伸的
* 例子,通常我们想要给打断技能一个固定几率,然后增加一个附加值比如,默
* 认50%的概率
*
* ============================================================================
* Yanfly Engine Plugins - Battle Engine Extension - Action Sequence Commands
* ============================================================================
*
* 下面部分的命令将会与Battle Engine带来的基础Action行为密切相关,在学习命令时
* 建议先去Battle Engine插件中掌握如何使用Action Sequence的相关命令和内容
* 本插件提供了更多的关于atb系统的action sequences命令,快把他们加入到你的
* 技能和战斗中来吧。
*
*=============================================================================
* ATB CHARGE: target, X
* ATB CHARGE: target, X%
* ATB CHARGE: targets, +X
* ATB CHARGE: targets, +X%
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* 上面的命令参照charge咏唱条的设定,不过你可以把targets更换为其他值了,
* 具体请参照action sequence的帮助文件
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* Usage Example: atb charge: targets, +5000
* atb charge: target, -50%
*=============================================================================
*
*=============================================================================
* ATB GAUGE: target, X
* ATB GAUGE: target, X%
* ATB GAUGE: targets, +X
* ATB GAUGE: targets, +X%
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* 参照Gauge设置,针对speed和charge两个参数同时生效。
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* Usage Example: atb gauge: targets, +5000
* atb gauge: target, -50%
*=============================================================================
*
*=============================================================================
* ATB INTERRUPT: target
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* 打断命令,没什么好说的,用sequence系统可以做成群体打断,全体打断,打断
* 自己人,好开心
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* Usage Example: atb interrupt: targets
*=============================================================================
*
*=============================================================================
* ATB SPEED: target, X
* ATB SPEED: target, X%
* ATB SPEED: targets, +X
* ATB SPEED: targets, +X% 参照speed参数设置,你可以实现更多目标
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* Usable only for ATB. Sets the target's ATB speed to X or X%. This only
* applies when the target is filling up its ATB gauge. This will not affect
* the user to prevent mechanical issues.
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* Usage Example: atb speed: targets, +5000
* atb speed: target, -50%
*=============================================================================
*
* ============================================================================
* Changelog
* ============================================================================
*
* Version 1.25:
* - Lunatic Mode fail safes added.
*
* Version 1.24:
* - During action end, a single tick will be forced to occur to prevent clash
* amongst actors with similar AGI values and make tick values more unique.
*
* Version 1.23:
* - Timing has been changed for states that update turns at Turn Start. Now,
* the states will update prior to the actor's command box opening or the enemy
* make a decision on which action it will use.
*
* Version 1.22:
* - Updated for RPG Maker MV version 1.1.0.
*
* Version 1.21:
* - Counterattacks no longer cause interrupts if attack actions have interrupt
* functionality.
*
* Version 1.20:
* - Updated plugin to update the AI more accordingly with Battle AI Core.
*
* Version 1.19:
* - Fixed a bug where forced actions clear out an action's effects before the
* turn is over, making post-turn effects to not occur.
*
* Version 1.18:
* - Fixed a bug where changing back and forth between the Fight/Escape window
* would prompt on turn start effects.
*
* Version 1.17:
* - Made a mechanic change so that turn 0 ends immediately upon battle start
* rather than requiring a full turn to end.
*
* Version 1.16:
* - Added a fail safe setting up ATB Charges when the Cannot Move restriction
* is imposed upon an actor.
*
* Verison 1.15:
* - Implemented a Forced Action queue list. This means if a Forced Action
* takes place in the middle of an action, the action will resume after the
* forced action finishes rather than cancels it out like MV does.
*
* Version 1.14:
* - Added a speed position check for Instant Casts to maintain order position.
*
* Version 1.13:
* - Fixed a bug that doesn't update state turns properly.
* - Removed 'Turn Structure parameter' as it goes against the nature of a
* Tick-Based battle system.
*
* Version 1.12:
* - Added speed rebalance formulas for tick-based systems (innate).
*
* Version 1.11:
* - Fixed a bug that would still allow battlers to perform actions even if the
* actions got sealed midway through charging the action.
*
* Version 1.10:
* - Fixed a bug that would cause AutoBattlers to stall if they got added into
* the party mid-battle.
*
* Version 1.09:
* - Mechanic change for states that update on Action End to end at the end of
* a battler's turn instead of at the start.
*
* Version 1.08a:
* - Fixed a bug that crashed the game when enemies were confused.
* - Preparation for Enemy ATB Gauges.
*
* Version 1.07:
* - Added 'Flash Enemy' to plugin parameters to flash the enemy once when it
* starts charging a skill.
*
* Version 1.06:
* - Added pre-emptive and surprise attack mechanic plugin parameters!
*
* Version 1.05:
* - Fixed a bug with Forced Actions locking out the battle.
*
* Version 1.04:
* - Added the 'Per Tick' parameter for you to adjust the formula that governs
* the speed rate at which the ATB gauge fills up.
*
* Version 1.03:
* - Fixed a bug that caused the ATB Gauge appear slow with maxed AGI.
*
* Version 1.02c:
* - Fixed a bug with the ATB GAUGE and ATB CHARGE action sequences.
* - Fixed a bug with battlers still getting a turn after the battle is over.
* - Fixed a bug that prevented escaping.
* - Added math fail safes for calculating ATB charging.
*
* Version 1.01:
* - Fixed a bug with escaping causing battlers to go into infinite lock.
* - Fixed a bug with multiple victory messages.
* - Added fail safe to prevent infinite charging.
* - Added .
*
* Version 1.00:
* - It's doooooooone!
*/
//=============================================================================
if (Imported.YEP_BattleEngineCore) {
if (Yanfly.BEC.version && Yanfly.BEC.version >= 1.42) {
//=============================================================================
// Parameter Variables
//=============================================================================
Yanfly.Parameters = PluginManager.parameters("YEP_X_BattleSysATB");
Yanfly.Param = Yanfly.Param || {};
Yanfly.Param.ATBPerTick = String(Yanfly.Parameters["Per Tick"]);
Yanfly.Param.ATBInitSpeed = String(Yanfly.Parameters["Initial Speed"]);
Yanfly.Param.ATBFullGauge = String(Yanfly.Parameters["Full Gauge"]);
Yanfly.Param.ATBChargeGauge = String(Yanfly.Parameters["Charge Gauge"]);
Yanfly.Param.ATBPreEmptive = Number(Yanfly.Parameters["Pre-Emptive Bonuses"]);
Yanfly.Param.ATBSurprise = Number(Yanfly.Parameters["Surprise Bonuses"]);
Yanfly.Param.ATBEscapeRatio = String(Yanfly.Parameters["Escape Ratio"]);
Yanfly.Param.ATBEscapeBoost = String(Yanfly.Parameters["Fail Escape Boost"]);
Yanfly.Param.ATBFullTurn = String(Yanfly.Parameters["Full Turn"]);
Yanfly.Param.ATBTurnStructure = false;
Yanfly.Param.ATBFlashEnemy = eval(String(Yanfly.Parameters["Flash Enemy"]));
Yanfly.Param.ATBRubberband = String(Yanfly.Parameters["Enable Rubberband"]);
Yanfly.Param.ATBMinSpeed = String(Yanfly.Parameters["Minimum Speed"]);
Yanfly.Param.ATBMaxSpeed = String(Yanfly.Parameters["Maximum Speed"]);
Yanfly.Param.ATBReadyName = String(Yanfly.Parameters["Ready Sound"]);
Yanfly.Param.ATBReadyVol = Number(Yanfly.Parameters["Ready Volume"]);
Yanfly.Param.ATBReadyPitch = Number(Yanfly.Parameters["Ready Pitch"]);
Yanfly.Param.ATBReadyPan = Number(Yanfly.Parameters["Ready Pan"]);
Yanfly.Param.ATBOptionSpeedTx = String(Yanfly.Parameters["ATB Speed Text"]);
Yanfly.Param.ATBDefaultSpeed = Number(Yanfly.Parameters["Default ATB Speed"]);
Yanfly.Param.ATBLockStatusWin = String(Yanfly.Parameters["Lock Status Window"]);
Yanfly.Param.ATBGaugeStyle = Number(Yanfly.Parameters["Gauge Style"]);
Yanfly.Param.ATBGaugeText = String(Yanfly.Parameters["Gauge Text"]);
Yanfly.Param.ATBGaugeAlign = String(Yanfly.Parameters["Gauge Text Align"]);
Yanfly.Param.ATBColorAtb1 = Number(Yanfly.Parameters["ATB Gauge Color 1"]);
Yanfly.Param.ATBColorAtb2 = Number(Yanfly.Parameters["ATB Gauge Color 2"]);
Yanfly.Param.ATBColorSlow1 = Number(Yanfly.Parameters["Slow Gauge Color 1"]);
Yanfly.Param.ATBColorSlow2 = Number(Yanfly.Parameters["Slow Gauge Color 2"]);
Yanfly.Param.ATBColorFast1 = Number(Yanfly.Parameters["Fast Gauge Color 1"]);
Yanfly.Param.ATBColorFast2 = Number(Yanfly.Parameters["Fast Gauge Color 2"]);
Yanfly.Param.ATBColorStop1 = Number(Yanfly.Parameters["Stop Gauge Color 1"]);
Yanfly.Param.ATBColorStop2 = Number(Yanfly.Parameters["Stop Gauge Color 2"]);
Yanfly.Param.ATBColorFull1 = Number(Yanfly.Parameters["Full Gauge Color 1"]);
Yanfly.Param.ATBColorFull2 = Number(Yanfly.Parameters["Full Gauge Color 2"]);
Yanfly.Param.ATBColorChar1 = Number(Yanfly.Parameters["Charge Gauge Color 1"]);
Yanfly.Param.ATBColorChar2 = Number(Yanfly.Parameters["Charge Gauge Color 2"]);
//=============================================================================
// DataManager
//=============================================================================
Yanfly.ATB.DataManager_isDatabaseLoaded = DataManager.isDatabaseLoaded;
DataManager.isDatabaseLoaded = function () {
if (!Yanfly.ATB.DataManager_isDatabaseLoaded.call(this)) return false;
if (!Yanfly._loaded_YEP_X_BattleSysATB) {
this.processATBNotetags1($dataSkills);
this.processATBNotetags1($dataItems);
this.processATBNotetags2($dataActors);
this.processATBNotetags2($dataClasses);
this.processATBNotetags2($dataEnemies);
this.processATBNotetags2($dataWeapons);
this.processATBNotetags2($dataArmors);
this.processATBNotetags2($dataStates);
Yanfly._loaded_YEP_X_BattleSysATB = true;
}
return true;
};
DataManager.processATBNotetags1 = function (group) {
var noteA1 = /<(?:ATB GAUGE):[ ](\d+)>/i;
var noteA2 = /<(?:ATB GAUGE):[ ]([\+\-]\d+)>/i;
var noteA3 = /<(?:ATB GAUGE):[ ](\d+)([%%])>/i;
var noteA4 = /<(?:ATB GAUGE):[ ]([\+\-]\d+)([%%])>/i;
var noteB1 = /<(?:ATB SPEED):[ ](\d+)>/i;
var noteB2 = /<(?:ATB SPEED):[ ]([\+\-]\d+)>/i;
var noteB3 = /<(?:ATB SPEED):[ ](\d+)([%%])>/i;
var noteB4 = /<(?:ATB SPEED):[ ]([\+\-]\d+)([%%])>/i;
var noteC1 = /<(?:ATB CHARGE):[ ](\d+)>/i;
var noteC2 = /<(?:ATB CHARGE):[ ]([\+\-]\d+)>/i;
var noteC3 = /<(?:ATB CHARGE):[ ](\d+)([%%])>/i;
var noteC4 = /<(?:ATB CHARGE):[ ]([\+\-]\d+)([%%])>/i;
var noteS1 = /<(?:AFTER ATB):[ ](\d+)>/i;
var noteS2 = /<(?:AFTER ATB):[ ](\d+)([%%])>/i;
var noteI1 = /<(?:ATB INTERRUPT)>/i;
var noteI2 = /<(?:ATB INTERRUPT):[ ](\d+)([%%])>/i;
var noteI3 = /<(?:CANNOT ATB INTERRUPT)>/i;
for (var n = 1; n < group.length; n++) {
var obj = group[n];
var notedata = obj.note.split(/[\r\n]+/);
obj.setATBGaugeFlat = undefined;
obj.addATBGaugeFlat = 0;
obj.setATBGaugeRate = undefined;
obj.addATBGaugeRate = 0.0;
obj.setATBSpeedFlat = undefined;
obj.addATBSpeedFlat = 0;
obj.setATBSpeedRate = undefined;
obj.addATBSpeedRate = 0.0;
obj.setATBChargeFlat = undefined;
obj.addATBChargeFlat = 0;
obj.setATBChargeRate = undefined;
obj.addATBChargeRate = 0.0;
obj.afterATBFlat = undefined;
obj.afterATBRate = undefined;
obj.atbInterruptRate = 0;
obj.cannotAtbInterrupt = false;
var evalMode = "none";
obj.atbEval = "";
obj.atbAfterEval = "";
obj.atbInterruptEval = "";
obj.atbHelp = undefined;
for (var i = 0; i < notedata.length; i++) {
var line = notedata[i];
if (line.match(noteA1)) {
obj.setATBGaugeFlat = parseInt(RegExp.$1);
} else if (line.match(noteA2)) {
obj.addATBGaugeFlat = parseInt(RegExp.$1);
} else if (line.match(noteA3)) {
obj.setATBGaugeRate = parseFloat(RegExp.$1 * 0.01);
} else if (line.match(noteA4)) {
obj.addATBGaugeRate = parseFloat(RegExp.$1 * 0.01);
} else if (line.match(noteB1)) {
obj.setATBSpeedFlat = parseInt(RegExp.$1);
} else if (line.match(noteB2)) {
obj.addATBSpeedFlat = parseInt(RegExp.$1);
} else if (line.match(noteB3)) {
obj.setATBSpeedRate = parseFloat(RegExp.$1 * 0.01);
} else if (line.match(noteB4)) {
obj.addATBSpeedRate = parseFloat(RegExp.$1 * 0.01);
} else if (line.match(noteC1)) {
obj.setATBChargeFlat = parseInt(RegExp.$1);
} else if (line.match(noteC2)) {
obj.addATBChargeFlat = parseInt(RegExp.$1);
} else if (line.match(noteC3)) {
obj.setATBChargeRate = parseFloat(RegExp.$1 * 0.01);
} else if (line.match(noteC4)) {
obj.addATBChargeRate = parseFloat(RegExp.$1 * 0.01);
} else if (line.match(noteS1)) {
obj.afterATBFlat = parseInt(RegExp.$1);
} else if (line.match(noteS2)) {
obj.afterATBRate = parseFloat(RegExp.$1 * 0.01);
} else if (line.match(noteI1)) {
obj.atbInterruptRate = 1;
} else if (line.match(noteI2)) {
obj.atbInterruptRate = parseFloat(RegExp.$1 * 0.01);
} else if (line.match(noteI3)) {
obj.cannotAtbInterrupt = true;
} else if (line.match(/<(?:TARGET ATB EVAL)>/i)) {
evalMode = "atb eval";
} else if (line.match(/<\/(?:TARGET ATB EVAL)>/i)) {
evalMode = "none";
} else if (line.match(/<(?:AFTER ATB EVAL)>/i)) {
evalMode = "after atb eval";
} else if (line.match(/<\/(?:AFTER ATB EVAL)>/i)) {
evalMode = "none";
} else if (line.match(/<(?:ATB INTERRUPT EVAL)>/i)) {
evalMode = "atb interrupt eval";
} else if (line.match(/<\/(?:ATB INTERRUPT EVAL)>/i)) {
evalMode = "none";
} else if (line.match(/<(?:ATB HELP)>/i)) {
evalMode = "atb help";
obj.atbHelp = "";
} else if (line.match(/<\/(?:ATB HELP)>/i)) {
evalMode = "none";
} else if (evalMode === "atb help") {
obj.atbHelp = obj.atbHelp + line + "\n";
} else if (evalMode === "atb eval") {
obj.atbEval = obj.atbEval + line + "\n";
} else if (evalMode === "after atb eval") {
obj.atbAfterEval = obj.atbAfterEval + line + "\n";
} else if (evalMode === "atb interrupt eval") {
obj.atbInterruptEval = obj.atbInterruptEval + line + "\n";
}
}
}
};
DataManager.processATBNotetags2 = function (group) {
var noteA1 = /<(?:ATB START):[ ]([\+\-]\d+)>/i;
var noteA2 = /<(?:ATB START):[ ]([\+\-]\d+)([%%])>/i;
var noteB1 = /<(?:ATB TURN):[ ]([\+\-]\d+)>/i;
var noteB2 = /<(?:ATB TURN):[ ]([\+\-]\d+)([%%])>/i;
for (var n = 1; n < group.length; n++) {
var obj = group[n];
var notedata = obj.note.split(/[\r\n]+/);
obj.atbStartFlat = 0;
obj.atbStartRate = 0;
obj.atbTurnFlat = 0;
obj.atbTurnRate = 0;
var evalMode = "none";
obj.atbHelp = undefined;
for (var i = 0; i < notedata.length; i++) {
var line = notedata[i];
if (line.match(noteA1)) {
obj.atbStartFlat = parseInt(RegExp.$1);
} else if (line.match(noteA2)) {
obj.atbStartRate = parseFloat(RegExp.$1 * 0.01);
} else if (line.match(noteB1)) {
obj.atbTurnFlat = parseInt(RegExp.$1);
} else if (line.match(noteB2)) {
obj.atbTurnRate = parseFloat(RegExp.$1 * 0.01);
} else if (line.match(/<(?:ATB HELP)>/i)) {
evalMode = "atb help";
obj.atbHelp = "";
} else if (line.match(/<\/(?:ATB HELP)>/i)) {
evalMode = "none";
} else if (evalMode === "atb help") {
obj.atbHelp = obj.atbHelp + line + "\n";
}
}
}
};
//=============================================================================
// ConfigManager
//=============================================================================
ConfigManager.atbSpeed = Yanfly.Param.ATBDefaultSpeed;
Yanfly.ATB.ConfigManager_makeData = ConfigManager.makeData;
ConfigManager.makeData = function () {
var config = Yanfly.ATB.ConfigManager_makeData.call(this);
config.atbSpeed = this.atbSpeed;
return config;
};
Yanfly.ATB.ConfigManager_applyData = ConfigManager.applyData;
ConfigManager.applyData = function (config) {
Yanfly.ATB.ConfigManager_applyData.call(this, config);
this.atbSpeed = this.readConfigATBSpeed(config, "atbSpeed");
};
ConfigManager.readConfigATBSpeed = function (config, name) {
var value = config[name];
if (value !== undefined) {
return Number(value).clamp(1, 10);
} else {
return Yanfly.Param.ATBDefaultSpeed.clamp(1, 10);
}
};
//=============================================================================
// BattleManager
//=============================================================================
BattleManager.isATB = function () {
return this.isBattleSystem("atb");
};
Yanfly.ATB.BattleManager_isTurnBased = BattleManager.isTurnBased;
BattleManager.isTurnBased = function () {
if (this.isATB()) return false;
return Yanfly.ATB.BattleManager_isTurnBased.call(this);
};
Yanfly.ATB.BattleManager_tickRate = BattleManager.tickRate;
BattleManager.tickRate = function () {
var rate = Yanfly.ATB.BattleManager_tickRate.call(this);
if (this.isATB()) rate *= this.atbTickRate();
return rate;
};
BattleManager.atbTickRate = function () {
var rate = 0.1 * ConfigManager.atbSpeed;
return rate;
};
Yanfly.ATB.BattleManager_makeEscapeRatio = BattleManager.makeEscapeRatio;
BattleManager.makeEscapeRatio = function () {
if (this.isATB()) {
var code = Yanfly.Param.ATBEscapeRatio;
try {
this._escapeRatio = eval(code);
} catch (e) {
this._escapeRatio = 0;
Yanfly.Util.displayError(e, code, "ATB ESCAPE RATIO ERROR");
}
var code = Yanfly.Param.ATBEscapeBoost;
try {
this._escapeFailBoost = eval(code);
} catch (e) {
this._escapeFailBoost = 0;
Yanfly.Util.displayError(e, code, "ATB ESCAPE BOOST ERROR");
}
} else {
this._escapeFailBoost = 0.1;
Yanfly.ATB.BattleManager_makeEscapeRatio.call(this);
}
};
Yanfly.ATB.BattleManager_startBattle = BattleManager.startBattle;
BattleManager.startBattle = function () {
Yanfly.ATB.BattleManager_startBattle.call(this);
if (this.isATB()) {
this._phase = null;
this._counterAttacking = false;
this.startATB();
}
};
Yanfly.ATB.BattleManager_endBattle = BattleManager.endBattle;
BattleManager.endBattle = function (result) {
Yanfly.ATB.BattleManager_endBattle.call(this, result);
this.clearATBData();
};
BattleManager.startATB = function () {
if (this._phase === "battleEnd") return;
this.clearATBData();
this._atbTarget = Math.max(1, eval(Yanfly.Param.ATBFullGauge));
this._atbCharge = Math.max(1, eval(Yanfly.Param.ATBChargeGauge));
this._atbFullTurn = Math.max(1, eval(Yanfly.Param.ATBFullTurn));
this._atbRubberband = eval(Yanfly.Param.ATBRubberband);
if (this.atbRubberband()) {
this._atbMinimumSpeed = Math.max(1, eval(Yanfly.Param.ATBMinSpeed));
this._atbMaximumSpeed = Math.max(1, eval(Yanfly.Param.ATBMaxSpeed));
}
this._atbTicks = this._atbFullTurn;
this._atbReadySound = {
name: Yanfly.Param.ATBReadyName,
volume: Yanfly.Param.ATBReadyVol,
pitch: Yanfly.Param.ATBReadyPitch,
pan: Yanfly.Param.ATBReadyPan,
};
$gameParty.onATBStart();
$gameTroop.onATBStart();
this._phase = "start";
};
BattleManager.clearATBData = function () {
this._highestBaseAgi = undefined;
this._averageBaseAgi = undefined;
this._lowestBaseAgi = undefined;
this._atbTarget = undefined;
this._atbCharge = undefined;
this._atbTarget = undefined;
this._atbCharge = undefined;
this._atbFullTurn = undefined;
this._atbRubberband = undefined;
this._atbMinimumSpeed = undefined;
this._atbMaximumSpeed = undefined;
this._atbTicks = 0;
};
BattleManager.atbTarget = function () {
if (!this._atbTarget) this.startATB();
return this._atbTarget;
};
BattleManager.atbCharge = function () {
if (!this._atbCharge) this.startATB();
return this._atbCharge;
};
BattleManager.atbRubberband = function () {
return this._atbRubberband;
};
BattleManager.atbMinimumSpeed = function () {
return this._atbMinimumSpeed;
};
BattleManager.atbMaximumSpeed = function () {
return this._atbMaximumSpeed;
};
BattleManager.highestBaseAgi = function () {
if (this._highestBaseAgi) return this._highestBaseAgi;
var agi = 0;
for (var i = 0; i < $gameParty.battleMembers().length; ++i) {
var battler = $gameParty.battleMembers()[i];
if (battler) agi = Math.max(agi, battler.agi);
}
for (var i = 0; i < $gameTroop.members().length; ++i) {
var battler = $gameTroop.members()[i];
if (battler) agi = Math.max(agi, battler.agi);
}
this._highestBaseAgi = agi;
return this._highestBaseAgi;
};
BattleManager.averageBaseAgi = function () {
if (this._averageBaseAgi) return this._averageBaseAgi;
var agi = 0;
for (var i = 0; i < $gameParty.battleMembers().length; ++i) {
var battler = $gameParty.battleMembers()[i];
if (battler) agi += battler.agi;
}
for (var i = 0; i < $gameTroop.members().length; ++i) {
var battler = $gameTroop.members()[i];
if (battler) agi += battler.agi;
}
var sum = $gameParty.battleMembers().length;
sum += $gameTroop.members().length;
this._averageBaseAgi = agi / sum;
return this._averageBaseAgi;
};
BattleManager.lowestBaseAgi = function () {
if (this._lowestBaseAgi) return this._lowestBaseAgi;
var agi = this.highestBaseAgi();
for (var i = 0; i < $gameParty.battleMembers().length; ++i) {
var battler = $gameParty.battleMembers()[i];
if (battler) agi = Math.min(agi, battler.agi);
}
for (var i = 0; i < $gameTroop.members().length; ++i) {
var battler = $gameTroop.members()[i];
if (battler) agi = Math.min(agi, battler.agi);
}
this._lowestBaseAgi = agi;
return this._lowestBaseAgi;
};
Yanfly.ATB.BattleManager_update = BattleManager.update;
BattleManager.update = function () {
if (this.isATB()) {
if (this.isBusy()) return;
if (this.updateEvent()) return;
if (this._phase === "battleEnd") {
return Yanfly.ATB.BattleManager_update.call(this);
}
if (this.checkBattleEnd()) return;
if (this._phase === "atb") {
this.updateATBPhase();
} else {
Yanfly.ATB.BattleManager_update.call(this);
}
} else {
Yanfly.ATB.BattleManager_update.call(this);
}
};
Yanfly.ATB.BattleManager_updateEventMain = BattleManager.updateEventMain;
BattleManager.updateEventMain = function () {
if (this.isATB()) {
$gameTroop.updateInterpreter();
$gameParty.requestMotionRefresh();
if ($gameTroop.isEventRunning()) {
return true;
}
$gameTroop.setupBattleEvent();
if ($gameTroop.isEventRunning() || SceneManager.isSceneChanging()) {
return true;
}
return false;
} else {
return Yanfly.ATB.BattleManager_updateEventMain.call(this);
}
};
BattleManager.updateATBPhase = function () {
var chargedBattler = this.getChargedATBBattler();
if (chargedBattler) return this.startATBAction(chargedBattler);
var readyBattler = this.getReadyATBBattler();
if (readyBattler) {
return this.startATBInput(readyBattler);
} else {
this.updateATBTicks();
this.updateBattlerATB();
}
};
BattleManager.updateATBTicks = function () {
this._atbTicks += 1 * this.tickRate();
if (this._atbTicks < this._atbFullTurn) return;
$gameTroop.increaseTurn();
this._atbTicks = 0;
if (this.isTurnBased()) {
this.endTurn();
} else {
this.endTurn();
}
};
BattleManager.getChargedATBBattler = function () {
if ($gameParty.aliveMembers() <= 0 || $gameTroop.aliveMembers() <= 0) {
return false;
}
var fastest = false;
for (var i = 0; i < this.allBattleMembers().length; ++i) {
var battler = this.allBattleMembers()[i];
if (!battler) continue;
if (!this.isBattlerATBCharged(battler)) continue;
if (!fastest) {
fastest = battler;
} else if (battler.atbCharge() > fastest.atbCharge()) {
fastest = battler;
}
}
return fastest;
};
BattleManager.isBattlerATBCharged = function (battler) {
if (!battler.isATBCharging()) return false;
if (battler.atbChargeRate() < 1) return false;
if (battler.isConfused()) {
battler.makeActions();
if (battler.isActor()) battler.makeConfusionActions();
}
return battler.currentAction() && battler.currentAction().item();
};
BattleManager.getReadyATBBattler = function () {
var fastest = false;
for (var i = 0; i < this.allBattleMembers().length; ++i) {
var battler = this.allBattleMembers()[i];
if (!battler) continue;
if (!this.isBattlerATBReady(battler)) continue;
if (!fastest) {
fastest = battler;
} else if (battler.atbSpeed() > fastest.atbSpeed()) {
fastest = battler;
}
}
return fastest;
};
BattleManager.isBattlerATBReady = function (battler) {
if (battler.atbRate() < 1) return false;
if (battler.isATBCharging()) return false;
if (battler.currentAction() && battler.currentAction().item()) {
battler.makeActions();
battler.setupATBCharge();
return false;
}
return true;
};
BattleManager.updateBattlerATB = function (ignore) {
$gameParty.updateTick();
$gameTroop.updateTick();
if (ignore) return;
if (this._statusWindow) this.statusUpdateATB();
};
BattleManager.setATBPhase = function () {
this._phase = "atb";
};
Yanfly.ATB.BattleManager_startInput = BattleManager.startInput;
BattleManager.startInput = function () {
if (this.isATB()) {
this.setATBPhase();
} else {
Yanfly.ATB.BattleManager_startInput.call(this);
}
};
Yanfly.ATB.BattleManager_selectNextCommand = BattleManager.selectNextCommand;
BattleManager.selectNextCommand = function () {
if (this.isATB()) {
if (!this.actor()) return this.setATBPhase();
this.resetNonPartyActorATB();
this.actor().setupATBCharge();
this.actor().spriteStepBack();
this.actor().requestMotionRefresh();
this._actorIndex = undefined;
var chargedBattler = this.getChargedATBBattler();
if (chargedBattler) {
this.startATBAction(chargedBattler);
} else {
this.setATBPhase();
}
} else {
Yanfly.ATB.BattleManager_selectNextCommand.call(this);
}
};
BattleManager.resetNonPartyActorATB = function () {
for (var i = 0; i < $gameParty.allMembers().length; ++i) {
var actor = $gameParty.allMembers()[i];
if (!actor) continue;
if ($gameParty.battleMembers().contains(actor)) continue;
actor.resetAllATB();
}
};
Yanfly.ATB.BattleManager_selectPreviousCommand = BattleManager.selectPreviousCommand;
BattleManager.selectPreviousCommand = function () {
if (this.isATB()) {
var actorIndex = this._actorIndex;
var scene = SceneManager._scene;
this._bypassAtbEndTurn = true;
scene.startPartyCommandSelection();
this._actorIndex = actorIndex;
BattleManager.actor().setActionState("undecided");
BattleManager.actor().requestMotionRefresh();
this._bypassAtbEndTurn = undefined;
} else {
Yanfly.ATB.BattleManager_selectPreviousCommand.call(this);
}
};
Yanfly.ATB.BattleManager_startTurn = BattleManager.startTurn;
BattleManager.startTurn = function () {
if (this.isATB() && !this.isTurnBased()) return;
Yanfly.ATB.BattleManager_startTurn.call(this);
};
Yanfly.ATB.BattleManager_updateTurnEnd = BattleManager.updateTurnEnd;
BattleManager.updateTurnEnd = function () {
if (this.isATB()) {
this.setATBPhase();
} else {
Yanfly.ATB.BattleManager_updateTurnEnd.call(this);
}
};
BattleManager.startATBInput = function (battler) {
if (battler.isDead()) return;
battler.onTurnStart();
battler.makeActions();
if (battler.isEnemy()) {
battler.setupATBCharge();
if (Yanfly.Param.ATBFlashEnemy) battler.requestEffect("whiten");
var chargedBattler = this.getChargedATBBattler();
if (chargedBattler) this.startATBAction(chargedBattler);
} else if (battler.canInput()) {
this._actorIndex = battler.index();
this.playATBReadySound();
battler.setActionState("inputting");
battler.spriteStepForward();
this._phase = "input";
} else if (battler.isConfused()) {
battler.makeConfusionActions();
battler.setupATBCharge();
} else {
battler.makeAutoBattleActions();
battler.setupATBCharge();
}
};
BattleManager.playATBReadySound = function () {
AudioManager.playSe(this._atbReadySound);
};
BattleManager.startATBAction = function (battler) {
this._subject = battler;
var action = this._subject.currentAction();
if (action && action.isValid()) {
this.startAction();
} else {
this.endAction();
}
};
Yanfly.ATB.BattleManager_processForcedAction = BattleManager.processForcedAction;
BattleManager.processForcedAction = function () {
var forced = false;
if (this._actionForcedBattler && this.isATB()) {
var action = this._actionForcedBattler.currentAction();
forced = true;
}
Yanfly.ATB.BattleManager_processForcedAction.call(this);
if (forced) this._subject.setAction(0, action);
};
Yanfly.ATB.BattleManager_endAction = BattleManager.endAction;
BattleManager.endAction = function () {
if (this.isATB()) {
this.endATBAction();
} else {
Yanfly.ATB.BattleManager_endAction.call(this);
}
};
BattleManager.endATBAction = function () {
if (Imported.YEP_BattleEngineCore) {
if (this._processingForcedAction) this._phase = this._preForcePhase;
this._processingForcedAction = false;
}
if (this._subject) this._subject.onAllActionsEnd();
if (this.updateEventMain()) return;
this._subject.endTurnAllATB();
if (this.loadPreForceActionSettings()) return;
this.updateBattlerATB(true);
var chargedBattler = this.getChargedATBBattler();
if (chargedBattler) {
this.startATBAction(chargedBattler);
} else {
this.setATBPhase();
}
};
Yanfly.ATB.BattleManager_invokeCounterAttack = BattleManager.invokeCounterAttack;
BattleManager.invokeCounterAttack = function (subject, target) {
if (this.isATB()) this._counterAttacking = true;
Yanfly.ATB.BattleManager_invokeCounterAttack.call(this, subject, target);
if (this.isATB()) this._counterAttacking = false;
};
BattleManager.isCounterAttacking = function () {
return this._counterAttacking;
};
BattleManager.statusUpdateATB = function () {
this._statusWindow.redrawATB();
};
Yanfly.ATB.BattleManager_processEscape = BattleManager.processEscape;
BattleManager.processEscape = function () {
if (this.isATB()) {
return this.processEscapeATB();
} else {
return Yanfly.ATB.BattleManager_processEscape.call(this);
}
};
BattleManager.processEscapeATB = function () {
$gameParty.performEscape();
SoundManager.playEscape();
var success = this._preemptive ? true : Math.random() < this._escapeRatio;
if (success) {
$gameParty.removeBattleStates();
$gameParty.performEscapeSuccess();
this.displayEscapeSuccessMessage();
this._escaped = true;
this.processAbort();
} else {
this.actor().spriteStepBack();
this.actor().clearActions();
this.displayEscapeFailureMessage();
this._escapeRatio += this._escapeFailBoost;
this.startTurn();
this.processFailEscapeATB();
}
return success;
};
BattleManager.processFailEscapeATB = function () {
var actor = $gameParty.members()[this._actorIndex];
if (!actor) return;
actor.resetAllATB();
};
Yanfly.ATB.BattleManager_processActionSequence = BattleManager.processActionSequence;
BattleManager.processActionSequence = function (actionName, actionArgs) {
if (this.isATB()) {
// ATB CHARGE
if (actionName === "ATB CHARGE") {
return this.actionATBCharge(actionArgs);
}
// ATB GAUGE
if (actionName === "ATB GAUGE") {
return this.actionATBCharge(actionArgs) && this.actionATBSpeed(actionArgs);
}
// ATB INTERRUPT
if (actionName === "ATB INTERRUPT") {
return this.actionATBInterrupt(actionArgs);
}
// ATB SPEED
if (actionName === "ATB SPEED") {
return this.actionATBSpeed(actionArgs);
}
}
return Yanfly.ATB.BattleManager_processActionSequence.call(this, actionName, actionArgs);
};
BattleManager.actionATBCharge = function (actionArgs) {
var targets = this.makeActionTargets(actionArgs[0]);
if (targets.length < 1) return true;
var cmd = actionArgs[1];
if (cmd.match(/([\+\-]\d+)([%%])/i)) {
var rate = parseFloat(RegExp.$1 * 0.01);
for (var i = 0; i < targets.length; ++i) {
var target = targets[i];
if (!target) continue;
if (target === this._subject) continue;
if (!target.isATBCharging()) continue;
var max = target.atbChargeDenom();
var value = rate * max + target.atbCharge();
target.setATBCharge(value);
target.refresh();
}
} else if (cmd.match(/([\+\-]\d+)/i)) {
var plus = parseInt(RegExp.$1);
for (var i = 0; i < targets.length; ++i) {
var target = targets[i];
if (!target) continue;
if (target === this._subject) continue;
if (!target.isATBCharging()) continue;
var value = plus + target.atbCharge();
target.setATBCharge(value);
target.refresh();
}
} else if (cmd.match(/(\d+)([%%])/i)) {
var rate = parseFloat(RegExp.$1 * 0.01);
for (var i = 0; i < targets.length; ++i) {
var target = targets[i];
if (!target) continue;
if (target === this._subject) continue;
if (!target.isATBCharging()) continue;
var max = target.atbChargeDenom();
var value = rate * max;
target.setATBCharge(value);
target.refresh();
}
} else if (cmd.match(/(\d+)/i)) {
var value = parseInt(RegExp.$1);
for (var i = 0; i < targets.length; ++i) {
var target = targets[i];
if (!target) continue;
if (target === this._subject) continue;
if (!target.isATBCharging()) continue;
target.setATBCharge(value);
target.refresh();
}
}
return true;
};
BattleManager.actionATBInterrupt = function (actionArgs) {
var targets = this.makeActionTargets(actionArgs[0]);
if (targets.length < 1) return true;
for (var i = 0; i < targets.length; ++i) {
var target = targets[i];
if (!target) continue;
if (target === this._subject) continue;
if (!target.isATBCharging()) continue;
target.processATBInterrupt();
}
return true;
};
BattleManager.actionATBSpeed = function (actionArgs) {
var targets = this.makeActionTargets(actionArgs[0]);
if (targets.length < 1) return true;
var cmd = actionArgs[1];
if (cmd.match(/([\+\-]\d+)([%%])/i)) {
var rate = parseFloat(RegExp.$1 * 0.01);
var max = this.atbTarget();
for (var i = 0; i < targets.length; ++i) {
var target = targets[i];
if (!target) continue;
if (target === this._subject) continue;
if (target.isATBCharging()) continue;
var value = rate * max + target.atbSpeed();
target.setATBSpeed(value);
target.refresh();
}
} else if (cmd.match(/([\+\-]\d+)/i)) {
var plus = parseInt(RegExp.$1);
for (var i = 0; i < targets.length; ++i) {
var target = targets[i];
if (!target) continue;
if (target === this._subject) continue;
if (target.isATBCharging()) continue;
var value = plus + target.atbSpeed();
target.setATBSpeed(value);
target.refresh();
}
} else if (cmd.match(/(\d+)([%%])/i)) {
var rate = parseFloat(RegExp.$1 * 0.01);
var max = this.atbTarget();
for (var i = 0; i < targets.length; ++i) {
var target = targets[i];
if (!target) continue;
if (target === this._subject) continue;
if (target.isATBCharging()) continue;
var value = rate * max;
target.setATBSpeed(value);
target.refresh();
}
} else if (cmd.match(/(\d+)/i)) {
var value = parseInt(RegExp.$1);
for (var i = 0; i < targets.length; ++i) {
var target = targets[i];
if (!target) continue;
if (target === this._subject) continue;
if (target.isATBCharging()) continue;
target.setATBSpeed(value);
target.refresh();
}
}
return true;
};
//=============================================================================
// Game_Action
//=============================================================================
Yanfly.ATB.Game_Action_applyItemUserEffect = Game_Action.prototype.applyItemUserEffect;
Game_Action.prototype.applyItemUserEffect = function (target) {
Yanfly.ATB.Game_Action_applyItemUserEffect.call(this, target);
if (BattleManager.isATB() && $gameParty.inBattle()) {
this.applyItemATBEffect(target);
}
};
Game_Action.prototype.applyItemATBEffect = function (target) {
if (!target) return;
this.applyItemATBSetEffects(target);
this.applyItemATBAddEffects(target);
this.applyItemATBEvalEffect(target);
if (BattleManager.isCounterAttacking()) return;
this.applyItemATBInterrupt(target);
this.applyItemATBInterruptEval(target);
};
Game_Action.prototype.applyItemATBSetEffects = function (target) {
var item = this.item();
if (!item) return;
var value = undefined;
if (target.isATBCharging()) {
var max = target.atbChargeDenom();
if (item.setATBChargeFlat !== undefined) {
value = item.setATBChargeFlat;
} else if (item.setATBGaugeFlat !== undefined) {
value = item.setATBGaugeFlat;
} else if (item.setATBChargeRate !== undefined) {
value = item.setATBChargeRate * max;
} else if (item.setATBGaugeRate !== undefined) {
value = item.setATBGaugeRate * max;
}
if (value !== undefined) target.setATBCharge(value);
} else {
var max = BattleManager.atbTarget();
if (item.setATBSpeedFlat !== undefined) {
value = item.setATBSpeedFlat;
} else if (item.setATBGaugeFlat !== undefined) {
value = item.setATBGaugeFlat;
} else if (item.setATBSpeedRate !== undefined) {
value = item.setATBSpeedRate * max;
} else if (item.setATBGaugeRate !== undefined) {
value = item.setATBGaugeRate * max;
}
if (value !== undefined) target.setATBSpeed(value);
}
if (value !== undefined && target.isActor()) BattleManager.statusUpdateATB();
};
Game_Action.prototype.applyItemATBAddEffects = function (target) {
var item = this.item();
if (!item) return;
if (target.isATBCharging()) {
var value = target.atbCharge();
var max = target.atbChargeDenom();
value += item.addATBChargeRate * max;
value += item.addATBGaugeRate * max;
value += item.addATBChargeFlat;
value += item.addATBGaugeFlat;
target.setATBCharge(value);
} else {
var value = target.atbSpeed();
var max = BattleManager.atbTarget();
value += item.addATBSpeedRate * max;
value += item.addATBGaugeRate * max;
value += item.addATBSpeedFlat;
value += item.addATBGaugeFlat;
target.setATBSpeed(value);
}
if (value !== 0 && target.isActor()) BattleManager.statusUpdateATB();
};
Game_Action.prototype.applyItemATBEvalEffect = function (target) {
var a = this.subject();
var user = this.subject();
var b = target;
var item = this.item();
var skill = this.item();
var s = $gameSwitches._data;
var v = $gameVariables._data;
var speed = target.atbSpeed();
var charge = target.atbCharge();
if (target.isATBCharging()) {
var max = target.atbChargeDenom();
} else {
var max = BattleManager.atbTarget();
}
var code = item.atbEval;
try {
eval(code);
} catch (e) {
Yanfly.Util.displayError(e, code, "ATB EVAL ERROR");
}
target.setATBSpeed(speed);
target.setATBCharge(charge);
};
Game_Action.prototype.applyItemATBInterrupt = function (target) {
var item = this.item();
if (!item) return;
if (target === this.subject()) return;
if (!target.isATBCharging()) return;
if (item.atbInterruptRate <= 0) return;
var success = Math.random() < item.atbInterruptRate;
if (success) target.processATBInterrupt();
};
Game_Action.prototype.applyItemATBInterruptEval = function (target) {
var item = this.item();
if (!item) return;
if (target === this.subject()) return;
if (!target.isATBCharging()) return;
if (item.atbInterruptEval === "") return;
var interrupt = false;
var a = this.subject();
var user = this.subject();
var b = target;
var item = this.item();
var skill = this.item();
var s = $gameSwitches._data;
var v = $gameVariables._data;
var speed = target.atbSpeed();
var charge = target.atbCharge();
var code = item.atbInterruptEval;
try {
eval(code);
} catch (e) {
Yanfly.Util.displayError(e, code, "ATB INTERRUPT EVAL ERROR");
}
if (interrupt) target.processATBInterrupt();
};
Game_Action.prototype.rebalanceATBSpeed = function (target) {
var speed = this.subject().atbSpeed();
var offset = 00000000001;
speed = Math.max(speed + offset, target.atbSpeed() + target.atbCharge());
this.subject().setATBSpeed(speed);
};
//=============================================================================
// Game_Battlerbase
//=============================================================================
Yanfly.ATB.Game_BattlerBase_refresh = Game_BattlerBase.prototype.refresh;
Game_BattlerBase.prototype.refresh = function () {
Yanfly.ATB.Game_BattlerBase_refresh.call(this);
if (BattleManager.isATB() && $gameParty.inBattle()) {
this._atbTickValue = undefined;
}
};
Yanfly.ATB.Game_BattlerBase_die = Game_BattlerBase.prototype.die;
Game_BattlerBase.prototype.die = function () {
Yanfly.ATB.Game_BattlerBase_die.call(this);
if (BattleManager.isATB() && $gameParty.inBattle()) this.resetAllATB();
};
//=============================================================================
// Game_Battler
//=============================================================================
Game_Battler.prototype.onATBStart = function () {
this._atbSpeed = eval(Yanfly.Param.ATBInitSpeed);
this._atbSpeed += BattleManager.atbTarget() * this.atbStartRate();
this._atbSpeed += this.atbStartFlat();
this._atbCharge = 0;
this._atbCharging = false;
this._atbChargeMod = 0;
this.applyPreemptiveBonusATB();
this.applySurpriseBonusATB();
this.refresh();
};
Game_Battler.prototype.applyPreemptiveBonusATB = function () {
if (!BattleManager._preemptive) return;
if (!this.isActor()) return;
var rate = Yanfly.Param.ATBPreEmptive;
this._atbSpeed += rate * BattleManager.atbTarget();
};
Game_Battler.prototype.applySurpriseBonusATB = function () {
if (!BattleManager._surprise) return;
if (!this.isEnemy()) return;
var rate = Yanfly.Param.ATBSurprise;
this._atbSpeed += rate * BattleManager.atbTarget();
};
Yanfly.ATB.Game_Battler_onBattleEnd = Game_Battler.prototype.onBattleEnd;
Game_Battler.prototype.onBattleEnd = function () {
Yanfly.ATB.Game_Battler_onBattleEnd.call(this);
this._atbSpeed = 0;
this._atbCharge = 0;
this._atbCharging = false;
this._atbChargeMod = 0;
};
Game_Battler.prototype.atbSpeed = function () {
if (this._atbSpeed === undefined) this.onATBStart();
return this._atbSpeed;
};
Game_Battler.prototype.atbRate = function () {
if (this._atbSpeed === undefined) this.onATBStart();
var rate = this._atbSpeed / BattleManager.atbTarget();
return rate.clamp(0, 1);
};
Game_Battler.prototype.isATBCharging = function () {
return this._atbCharging;
};
Game_Battler.prototype.setATBCharging = function (value) {
this._atbCharging = value;
};
Game_Battler.prototype.atbCharge = function () {
if (this._atbCharge === undefined) this.onATBStart();
return this._atbCharge;
};
Game_Battler.prototype.atbChargeDenom = function () {
var denom = Math.max(1, BattleManager.atbCharge() - this._atbChargeMod);
return denom;
};
Game_Battler.prototype.atbChargeRate = function () {
if (this._atbCharge === undefined) this.onATBStart();
if (!this.isATBCharging()) return 0;
var rate = this._atbCharge / this.atbChargeDenom();
return rate.clamp(0, 1);
};
Game_Battler.prototype.setATBSpeed = function (value) {
this._atbSpeed = Math.max(0, value);
};
Game_Battler.prototype.setATBCharge = function (value) {
if (this.isATBCharging()) this._atbCharge = Math.max(0, value);
};
Game_Battler.prototype.setupATBCharge = function () {
if (this._bypassAtbEndTurn) return;
this.setATBCharging(true);
if (!this.currentAction()) this.makeActions();
if (this.currentAction()) {
var item = this.currentAction().item();
if (item) {
this._atbChargeMod = item.speed;
} else {
this._atbChargeMod = 0;
}
} else {
this._atbChargeMod = 0;
}
this.setATBCharge(0);
this.setActionState("waiting");
};
Yanfly.ATB.Game_Battler_updateTick = Game_Battler.prototype.updateTick;
Game_Battler.prototype.updateTick = function () {
Yanfly.ATB.Game_Battler_updateTick.call(this);
if (BattleManager.isATB()) this.updateATB();
};
Game_Battler.prototype.updateATB = function () {
if (this.isDead()) return this.resetAllATB();
if (!this.canMove()) {
this.updateATBStates();
return;
}
if (this.isATBCharging()) {
if (!this.currentAction()) this.resetAllATB();
if (this.currentAction() && this.currentAction().item() === null) {
this.resetAllATB();
}
}
if (this.isATBCharging()) {
var value = this.atbCharge() + this.atbSpeedTick();
this.setATBCharge(value);
} else if (this.atbRate() < 1) {
var value = this.atbSpeed() + this.atbSpeedTick();
this.setATBSpeed(value);
}
};
Game_Battler.prototype.updateATBStates = function () {
if (BattleManager.timeBasedBuffs()) return;
for (var i = 0; i < this._states.length; ++i) {
var stateId = this._states[i];
var state = $dataStates[stateId];
if (!state) continue;
if (!this._stateTurns[stateId]) continue;
if (state.restriction >= 4 && state.autoRemovalTiming !== 0) {
var value = BattleManager.tickRate() / Yanfly.Param.BECTurnTime;
this._stateTurns[stateId] -= value;
if (this._stateTurns[stateId] <= 0) this.removeState(stateId);
}
}
};
Game_Battler.prototype.resetAllATB = function () {
this._atbCharge = 0;
this._atbChargeMod = 0;
this._atbCharging = false;
this._atbSpeed = 0;
this.clearActions();
};
Game_Battler.prototype.endTurnAllATB = function () {
this._atbCharge = 0;
this._atbChargeMod = 0;
this._atbCharging = false;
if (this.checkATBEndInstantCast()) return;
this.setEndActionATBSpeed();
this.clearActions();
this.setActionState("undecided");
if (this.battler()) this.battler().refreshMotion();
if (BattleManager.isTickBased()) this.onTurnEnd();
};
Game_Battler.prototype.checkATBEndInstantCast = function () {
if (!Imported.YEP_InstantCast) return false;
var action = this.currentAction();
if (!action) return false;
var item = action.item();
if (!item) return false;
if (!this.isInstantCast(item)) return false;
var length = BattleManager.allBattleMembers().length;
for (var i = 0; i < length; ++i) {
var member = BattleManager.allBattleMembers()[i];
if (!member) continue;
var max = member.atbSpeed() + member.atbCharge();
this._atbSpeed = Math.max(this._atbSpeed, max);
}
this._atbSpeed = Math.max(this._atbSpeed, BattleManager.atbTarget());
this._atbSpeed += 0.00000000001;
return true;
};
Game_Battler.prototype.atbSpeedRate = function () {
if (!this.canMove()) return 0;
var base = this.paramBase(6) + this.paramPlus(6);
if (base >= this.paramMax(6) && this.agi >= this.paramMax(6)) return 1;
var rate = this.agi / base;
return rate;
};
Game_Battler.prototype.atbSpeedTick = function () {
var value = this.atbTickValue();
if (BattleManager.atbRubberband()) {
var min = BattleManager.atbMinimumSpeed();
var max = BattleManager.atbMaximumSpeed();
value = value.clamp(min, max);
}
return value * BattleManager.tickRate();
};
Game_Battler.prototype.atbTickValue = function () {
if (this._atbTickValue !== undefined) return this._atbTickValue;
var a = this;
var user = this;
var subject = this;
this._atbTickValue = eval(Yanfly.Param.ATBPerTick);
return this._atbTickValue;
};
Game_Battler.prototype.setEndActionATBSpeed = function () {
this._atbSpeed = 0;
var action = this.currentAction();
if (!action) return;
var item = action.item();
if (item) {
if (item.afterATBFlat !== undefined) this.setATBSpeed(item.afterATBFlat);
if (item.afterATBRate !== undefined) {
this.setATBSpeed(item.afterATBRate * BattleManager.atbTarget());
}
}
this._atbSpeed += BattleManager.atbTarget() * this.atbTurnRate();
this._atbSpeed += this.atbTurnFlat();
if (item) this.afterATBEval(item);
};
Game_Battler.prototype.afterATBEval = function (item) {
if (!item) return;
var a = this;
var user = this;
var skill = item;
var s = $gameSwitches._data;
var v = $gameVariables._data;
var speed = this._atbSpeed;
var max = BattleManager.atbTarget();
eval(item.atbAfterEval);
this.setATBSpeed(speed);
};
Game_Battler.prototype.processATBInterrupt = function () {
if (this.currentAction()) {
var item = this.currentAction().item();
if (item && item.cannotAtbInterrupt) return;
}
this.resetAllATB();
this.refresh();
};
Game_Battler.prototype.atbStartFlat = function () {
var value = 0;
for (var i = 0; i < this.states().length; ++i) {
var state = this.states()[i];
if (state) value += state.atbStartFlat;
}
return value;
};
Game_Battler.prototype.atbStartRate = function () {
var value = 0;
for (var i = 0; i < this.states().length; ++i) {
var state = this.states()[i];
if (state) value += state.atbStartRate;
}
return value;
};
Game_Battler.prototype.atbTurnFlat = function () {
var value = 0;
for (var i = 0; i < this.states().length; ++i) {
var state = this.states()[i];
if (state) value += state.atbTurnFlat;
}
return value;
};
Game_Battler.prototype.atbTurnRate = function () {
var value = 0;
for (var i = 0; i < this.states().length; ++i) {
var state = this.states()[i];
if (state) value += state.atbTurnRate;
}
return value;
};
Yanfly.ATB.Game_Battler_removeState = Game_Battler.prototype.removeState;
Game_Battler.prototype.removeState = function (stateId) {
if (BattleManager.isATB()) {
var confuseCondition = this.isConfused();
}
Yanfly.ATB.Game_Battler_removeState.call(this, stateId);
if (BattleManager.isATB()) {
if (confuseCondition !== this.isConfused()) this.resetAllATB();
}
};
//=============================================================================
// Game_Actor
//=============================================================================
Game_Actor.prototype.atbStartFlat = function () {
var value = Game_Battler.prototype.atbStartFlat.call(this);
value += this.actor().atbStartFlat;
value += this.currentClass().atbStartFlat;
for (var i = 0; i < this.equips().length; ++i) {
var equip = this.equips()[i];
if (equip && equip.atbStartFlat) value += equip.atbStartFlat;
}
return value;
};
Game_Actor.prototype.atbStartRate = function () {
var value = Game_Battler.prototype.atbStartRate.call(this);
value += this.actor().atbStartRate;
value += this.currentClass().atbStartRate;
for (var i = 0; i < this.equips().length; ++i) {
var equip = this.equips()[i];
if (equip && equip.atbStartRate) value += equip.atbStartRate;
}
return value;
};
Game_Actor.prototype.atbTurnFlat = function () {
var value = Game_Battler.prototype.atbTurnFlat.call(this);
value += this.actor().atbTurnFlat;
value += this.currentClass().atbTurnFlat;
for (var i = 0; i < this.equips().length; ++i) {
var equip = this.equips()[i];
if (equip && equip.atbTurnFlat) value += equip.atbTurnFlat;
}
return value;
};
Game_Actor.prototype.atbTurnRate = function () {
var value = Game_Battler.prototype.atbTurnRate.call(this);
value += this.actor().atbTurnRate;
value += this.currentClass().atbTurnRate;
for (var i = 0; i < this.equips().length; ++i) {
var equip = this.equips()[i];
if (equip && equip.atbTurnRate) value += equip.atbTurnRate;
}
return value;
};
//=============================================================================
// Game_Enemy
//=============================================================================
Game_Enemy.prototype.atbStartFlat = function () {
var value = Game_Battler.prototype.atbStartFlat.call(this);
value += this.enemy().atbStartFlat;
return value;
};
Game_Enemy.prototype.atbStartRate = function () {
var value = Game_Battler.prototype.atbStartRate.call(this);
value += this.enemy().atbStartRate;
return value;
};
Game_Enemy.prototype.atbTurnFlat = function () {
var value = Game_Battler.prototype.atbTurnFlat.call(this);
value += this.enemy().atbTurnFlat;
return value;
};
Game_Enemy.prototype.atbTurnRate = function () {
var value = Game_Battler.prototype.atbTurnRate.call(this);
value += this.enemy().atbTurnRate;
return value;
};
//=============================================================================
// Game_Unit
//=============================================================================
Game_Unit.prototype.onATBStart = function () {
if (!BattleManager.isATB()) return;
for (var i = 0; i < this.members().length; ++i) {
var member = this.members()[i];
if (member) member.onATBStart();
}
};
Game_Unit.prototype.increaseTurnTimeBasedATB = function () {
for (var i = 0; i < this.members().length; ++i) {
var member = this.members()[i];
if (!member) continue;
if (member.isDead()) continue;
if (member.isHidden()) continue;
if (member.canMove()) continue;
member.onTurnEnd();
}
};
//=============================================================================
// Game_Party
//=============================================================================
Yanfly.ATB.Game_Party_performEscape = Game_Party.prototype.performEscape;
Game_Party.prototype.performEscape = function () {
if (BattleManager.isATB()) return;
Yanfly.ATB.Game_Party_performEscape.call(this);
};
//=============================================================================
// Game_Troop
//=============================================================================
Yanfly.ATB.Game_Troop_increaseTurn = Game_Troop.prototype.increaseTurn;
Game_Troop.prototype.increaseTurn = function () {
Yanfly.ATB.Game_Troop_increaseTurn.call(this);
if (BattleManager.isATB() && BattleManager.timeBasedStates()) {
$gameParty.increaseTurnTimeBasedATB();
this.increaseTurnTimeBasedATB();
}
};
//=============================================================================
// Window_Base
//=============================================================================
Window_Base.prototype.atbGaugeStyle = function () {
return Yanfly.Param.ATBGaugeStyle;
};
Window_Base.prototype.atbGaugeColor1 = function (actor) {
if (actor.atbRate() < 1) {
if (actor.atbSpeedRate() === 0) {
return this.textColor(Yanfly.Param.ATBColorStop1);
} else if (actor.atbSpeedRate() > 1) {
return this.textColor(Yanfly.Param.ATBColorFast1);
} else if (actor.atbSpeedRate() < 1) {
return this.textColor(Yanfly.Param.ATBColorSlow1);
} else {
return this.textColor(Yanfly.Param.ATBColorAtb1);
}
} else if (actor.atbRate() >= 1 && actor.atbChargeRate() >= 0) {
return this.textColor(Yanfly.Param.ATBColorFull1);
} else {
return this.gaugeBackColor();
}
};
Window_Base.prototype.atbGaugeColor2 = function (actor) {
if (actor.atbRate() < 1) {
if (actor.atbSpeedRate() === 0) {
return this.textColor(Yanfly.Param.ATBColorStop2);
} else if (actor.atbSpeedRate() > 1) {
return this.textColor(Yanfly.Param.ATBColorFast2);
} else if (actor.atbSpeedRate() < 1) {
return this.textColor(Yanfly.Param.ATBColorSlow2);
} else {
return this.textColor(Yanfly.Param.ATBColorAtb2);
}
} else if (actor.atbRate() >= 1 && actor.atbChargeRate() >= 0) {
return this.textColor(Yanfly.Param.ATBColorFull2);
} else {
return this.gaugeBackColor();
}
};
Window_Base.prototype.drawActorAtbGauge = function (actor, wx, wy, ww) {
ww = ww || 96;
if (!actor) return;
var color1 = this.atbGaugeColor1(actor);
var color2 = this.atbGaugeColor2(actor);
if (actor.atbRate() < 1) {
var rate = actor.atbRate();
} else if (actor.atbRate() >= 1 && actor.atbChargeRate() >= 0) {
var rate = 1;
} else {
var rate = 0;
}
this.drawGauge(wx, wy, ww, rate, color1, color2);
if (actor.atbChargeRate() > 0) this.drawAtbChargeGauge(actor, wx, wy, ww);
if (this.atbGaugeStyle() === 2) {
var text = Yanfly.Param.ATBGaugeText;
var align = Yanfly.Param.ATBGaugeAlign;
if (actor.atbRate() >= 1) {
this.changeTextColor(this.normalColor());
} else {
this.changeTextColor(this.systemColor());
}
this.drawText(text, wx, wy, ww, align);
this.resetTextColor();
}
};
Window_Base.prototype.drawAtbChargeGauge = function (actor, wx, wy, ww) {
var color1 = this.textColor(Yanfly.Param.ATBColorChar1);
var color2 = this.textColor(Yanfly.Param.ATBColorChar2);
var rate = actor.atbChargeRate();
this.drawGauge(wx, wy, ww * rate, 1, color1, color2);
};
//=============================================================================
// Window_Help
//=============================================================================
Yanfly.ATB.Window_Help_setItem = Window_Help.prototype.setItem;
Window_Help.prototype.setItem = function (item) {
if (this.meetATBConditions(item)) return this.setText(item.atbHelp);
Yanfly.ATB.Window_Help_setItem.call(this, item);
};
Window_Help.prototype.meetATBConditions = function (item) {
if (!item) return false;
if (!BattleManager.isATB()) return false;
return item.atbHelp !== undefined;
};
//=============================================================================
// Window_BattleStatus
//=============================================================================
Window_BattleStatus.prototype.redrawATB = function () {
if (this.isATBGaugeStyle(0)) return;
var rect;
for (var i = 0; i < $gameParty.battleMembers().length; ++i) {
var actor = $gameParty.battleMembers()[i];
if (this.isATBGaugeStyle(1)) {
rect = this.basicAreaRect(i);
this.contents.clearRect(rect.x - 1, rect.y, rect.width + 2, rect.height);
this.drawBasicArea(rect, actor);
} else if (this.isATBGaugeStyle(2)) {
this.redrawATBGaugeRect(i, actor);
}
}
};
Window_BattleStatus.prototype.redrawATBGaugeRect = function (index, actor) {
var rect = this.gaugeAreaRect(index);
var clrect = this.gaugeAreaRect(index);
var totalArea = this.gaugeAreaWidth();
if ($dataSystem.optDisplayTp) {
var gw = totalArea / 4 - 15;
clrect.x = rect.x + gw * 3 + 44;
clrect.y = rect.y;
clrect.width = gw + 2;
this.contents.clearRect(clrect.x, clrect.y, clrect.width, clrect.height);
this.drawActorAtbGauge(actor, rect.x + gw * 3 + 45, rect.y, gw);
} else {
totalArea -= 30;
var hpW = parseInt((totalArea * 108) / 300);
var otW = parseInt((totalArea * 96) / 300);
clrect.x = rect.x + hpW + otW + 29;
clrect.y = rect.y;
clrect.width = otW + 2;
this.contents.clearRect(clrect.x, clrect.y, clrect.width, clrect.height);
this.drawActorAtbGauge(actor, rect.x + hpW + otW + 30, rect.y, otW);
}
};
Window_BattleStatus.prototype.isATBGaugeStyle = function (type) {
if (this.atbGaugeStyle() !== type) return false;
if (!BattleManager.isATB()) return false;
return SceneManager._scene instanceof Scene_Battle;
};
Yanfly.ATB.Window_BattleStatus_drawBasicArea = Window_BattleStatus.prototype.drawBasicArea;
Window_BattleStatus.prototype.drawBasicArea = function (rect, actor) {
if (this.isATBGaugeStyle(1)) {
this.drawActorAtbGauge(actor, rect.x, rect.y, rect.width);
}
Yanfly.ATB.Window_BattleStatus_drawBasicArea.call(this, rect, actor);
};
Yanfly.ATB.Window_BattleStatus_drawGaugeAreaWithTp = Window_BattleStatus.prototype.drawGaugeAreaWithTp;
Window_BattleStatus.prototype.drawGaugeAreaWithTp = function (rect, actor) {
if (this.isATBGaugeStyle(2)) {
var totalArea = this.gaugeAreaWidth();
var gw = totalArea / 4 - 15;
this.drawActorHp(actor, rect.x + 0, rect.y, gw);
this.drawActorMp(actor, rect.x + gw * 1 + 15, rect.y, gw);
this.drawActorTp(actor, rect.x + gw * 2 + 30, rect.y, gw);
this.drawActorAtbGauge(actor, rect.x + gw * 3 + 45, rect.y, gw);
} else {
Yanfly.ATB.Window_BattleStatus_drawGaugeAreaWithTp.call(this, rect, actor);
}
};
Yanfly.ATB.Window_BattleStatus_drawGaugeAreaWOTp = Window_BattleStatus.prototype.drawGaugeAreaWithoutTp;
Window_BattleStatus.prototype.drawGaugeAreaWithoutTp = function (rect, actor) {
if (this.isATBGaugeStyle(2)) {
var totalArea = this.gaugeAreaWidth() - 30;
var hpW = parseInt((totalArea * 108) / 300);
var otW = parseInt((totalArea * 96) / 300);
this.drawActorHp(actor, rect.x + 0, rect.y, hpW);
this.drawActorMp(actor, rect.x + hpW + 15, rect.y, otW);
this.drawActorAtbGauge(actor, rect.x + hpW + otW + 30, rect.y, otW);
} else {
Yanfly.ATB.Window_BattleStatus_drawGaugeAreaWOTp.call(this, rect, actor);
}
};
//=============================================================================
// Window_Options
//=============================================================================
Yanfly.ATB.Window_Options_addGeneralOptions = Window_Options.prototype.addGeneralOptions;
Window_Options.prototype.addGeneralOptions = function () {
Yanfly.ATB.Window_Options_addGeneralOptions.call(this);
if ($gameSystem.getBattleSystem() === "atb") this.addATBOptions();
};
Window_Options.prototype.addATBOptions = function () {
var text = Yanfly.Param.ATBOptionSpeedTx;
this.addCommand(text, "atbSpeed");
};
Yanfly.ATB.Window_Options_statusText = Window_Options.prototype.statusText;
Window_Options.prototype.statusText = function (index) {
var symbol = this.commandSymbol(index);
if (symbol === "atbSpeed") {
return this.getConfigValue("atbSpeed");
} else {
return Yanfly.ATB.Window_Options_statusText.call(this, index);
}
};
Yanfly.ATB.Window_Options_processOk = Window_Options.prototype.processOk;
Window_Options.prototype.processOk = function () {
var index = this.index();
var symbol = this.commandSymbol(index);
if (symbol === "atbSpeed") {
var value = this.getConfigValue(symbol);
value += 1;
if (value > 10) value = 1;
this.changeValue(symbol, value);
} else {
Yanfly.ATB.Window_Options_processOk.call(this);
}
};
Yanfly.ATB.Window_Options_cursorRight = Window_Options.prototype.cursorRight;
Window_Options.prototype.cursorRight = function (wrap) {
var index = this.index();
var symbol = this.commandSymbol(index);
if (symbol === "atbSpeed") {
var value = this.getConfigValue(symbol);
value += 1;
if (value > 10) value = 1;
this.changeValue(symbol, value);
} else {
Yanfly.ATB.Window_Options_cursorRight.call(this, wrap);
}
};
Yanfly.ATB.Window_Options_cursorLeft = Window_Options.prototype.cursorLeft;
Window_Options.prototype.cursorLeft = function (wrap) {
var index = this.index();
var symbol = this.commandSymbol(index);
if (symbol === "atbSpeed") {
var value = this.getConfigValue(symbol);
value -= 1;
if (value < 1) value = 10;
this.changeValue(symbol, value);
} else {
Yanfly.ATB.Window_Options_cursorLeft.call(this, wrap);
}
};
//=============================================================================
// Scene_Battle
//=============================================================================
Yanfly.ATB.Scene_Battle_updateWindowPositions = Scene_Battle.prototype.updateWindowPositions;
Scene_Battle.prototype.updateWindowPositions = function () {
if (BattleManager.isATB() && !this._atbLockStatusWin) {
this._atbLockStatusWin = eval(Yanfly.Param.ATBLockStatusWin);
}
if (BattleManager.isATB() && this._atbLockStatusWin) {
this.updateWindowPositionsATB();
} else {
Yanfly.ATB.Scene_Battle_updateWindowPositions.call(this);
}
};
Yanfly.ATB.Scene_Battle_isStartActorCommand = Scene_Battle.prototype.isStartActorCommand;
Scene_Battle.prototype.isStartActorCommand = function () {
if (BattleManager.isATB()) return true;
return Yanfly.ATB.Scene_Battle_isStartActorCommand.call(this);
};
Scene_Battle.prototype.updateWindowPositionsATB = function () {
var activeWin = null;
if (this._partyCommandWindow.active) activeWin = this._partyCommandWindow;
if (this._actorCommandWindow.active) activeWin = this._actorCommandWindow;
if (activeWin === null) return;
if (activeWin.x <= Graphics.boxWidth / 2) {
this._statusWindow.x = Graphics.boxWidth - this._statusWindow.width;
} else {
this._statusWindow.x = 0;
}
};
Yanfly.ATB.Scene_Battle_commandFight = Scene_Battle.prototype.commandFight;
Scene_Battle.prototype.commandFight = function () {
if (BattleManager.isATB()) {
this.startActorCommandSelection();
BattleManager._phase = "input";
} else {
Yanfly.ATB.Scene_Battle_commandFight.call(this);
}
};
Yanfly.ATB.Scene_Battle_startActorCommandSelection = Scene_Battle.prototype.startActorCommandSelection;
Scene_Battle.prototype.startActorCommandSelection = function () {
Yanfly.ATB.Scene_Battle_startActorCommandSelection.call(this);
if (BattleManager.isATB()) {
BattleManager._bypassAtbEndTurn = true;
BattleManager.actor().spriteStepForward();
BattleManager.actor().setActionState("undecided");
BattleManager.actor().requestMotionRefresh();
BattleManager.actor().makeActions();
BattleManager._bypassAtbEndTurn = undefined;
}
};
//=============================================================================
// Utilities
//=============================================================================
Yanfly.Util = Yanfly.Util || {};
Yanfly.Util.displayError = function (e, code, message) {
console.log(message);
console.log(code || "NON-EXISTENT");
console.error(e);
if (Utils.isNwjs() && Utils.isOptionValid("test")) {
if (!require("nw.gui").Window.get().isDevToolsOpen()) {
require("nw.gui").Window.get().showDevTools();
}
}
};
//=============================================================================
// End of File
//=============================================================================
} else {
// Yanfly.BEC.version
var text = "================================================================\n";
text += "YEP_X_AnimatedSVEnemies requires YEP_BattleEngineCore to be at the ";
text += "latest version to run properly.\n\nPlease go to www.yanfly.moe and ";
text += "update to the latest version for the YEP_BattleEngineCore plugin.\n";
text += "================================================================\n";
console.log(text);
require("nw.gui").Window.get().showDevTools();
} // Yanfly.BEC.version
} // YEP_BattleEngineCore