From d5cb6419f122e4c36c471d8cae6e7551053a3283 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=8B=E6=B0=B4?= <1123993881@qq.com> Date: Wed, 1 Mar 2023 17:30:12 +0800 Subject: [PATCH] fix: try to add PLD. --- RotationSolver/Data/ActionID.cs | 2 + RotationSolver/Data/StatusID.cs | 4 + RotationSolver/Rotations/Basic/PLD_Base.cs | 9 +- .../Rotations/Tank/PLD/PLD_Default.cs | 5 +- RotationSolver/Rotations/Tank/PLD/PLD_Test.cs | 123 ++++++++++++++++++ 5 files changed, 139 insertions(+), 4 deletions(-) create mode 100644 RotationSolver/Rotations/Tank/PLD/PLD_Test.cs diff --git a/RotationSolver/Data/ActionID.cs b/RotationSolver/Data/ActionID.cs index fbf2c1330..7629083f5 100644 --- a/RotationSolver/Data/ActionID.cs +++ b/RotationSolver/Data/ActionID.cs @@ -2020,6 +2020,8 @@ public enum ActionID : uint /// IronWill = 28, + Bulwark = 22, + /// /// 先锋剑 /// diff --git a/RotationSolver/Data/StatusID.cs b/RotationSolver/Data/StatusID.cs index 00c755856..21a33db82 100644 --- a/RotationSolver/Data/StatusID.cs +++ b/RotationSolver/Data/StatusID.cs @@ -656,6 +656,8 @@ internal enum StatusID : ushort /// BladeofValor = 2721, + DivineMight = 2673, + /// /// 赎罪剑 /// @@ -1115,4 +1117,6 @@ internal enum StatusID : ushort CircleOfPower = 738, Aetherpact = 1223, + + ConfiteorReady = 3019, } diff --git a/RotationSolver/Rotations/Basic/PLD_Base.cs b/RotationSolver/Rotations/Basic/PLD_Base.cs index 0f67ec69f..c5dd00bcf 100644 --- a/RotationSolver/Rotations/Basic/PLD_Base.cs +++ b/RotationSolver/Rotations/Basic/PLD_Base.cs @@ -168,7 +168,10 @@ internal abstract class PLD_Base : CustomRotation.CustomRotation /// /// ���� /// - public static IBaseAction Confiteor { get; } = new BaseAction(ActionID.Confiteor); + public static IBaseAction Confiteor { get; } = new BaseAction(ActionID.Confiteor) + { + StatusNeed = new StatusID[] {StatusID.ConfiteorReady}, + }; /// /// ʥ�� @@ -202,10 +205,12 @@ internal abstract class PLD_Base : CustomRotation.CustomRotation ActionCheck = Cover.ActionCheck, }; + public static IBaseAction Bulwark { get; } = new BaseAction(ActionID.Bulwark, isTimeline: true); + + private protected override bool EmergencyAbility(byte abilitiesRemaining, IAction nextGCD, out IAction act) { if (HallowedGround.CanUse(out act) && BaseAction.TankBreakOtherCheck(JobIDs[0], HallowedGround.Target)) return true; - //��ʥ���� ���л�����ˡ� return base.EmergencyAbility(abilitiesRemaining, nextGCD, out act); } diff --git a/RotationSolver/Rotations/Tank/PLD/PLD_Default.cs b/RotationSolver/Rotations/Tank/PLD/PLD_Default.cs index 9f8d565bf..bd36684f8 100644 --- a/RotationSolver/Rotations/Tank/PLD/PLD_Default.cs +++ b/RotationSolver/Rotations/Tank/PLD/PLD_Default.cs @@ -15,8 +15,9 @@ internal sealed class PLD_Default : PLD_Base private protected override IRotationConfigSet CreateConfiguration() { - return base.CreateConfiguration().SetBool("UseDivineVeilPre", false, "DivineVeilPre in 15 seconds.") - .SetBool("UseHolySpiritPre", true, "use HolySpirit in 2 seconds"); + return base.CreateConfiguration() + .SetBool("UseDivineVeilPre", false, "DivineVeilPre in 15 seconds.") + .SetBool("UseHolySpiritPre", true, "use HolySpirit in 2 seconds"); } private protected override IAction CountDownAction(float remainTime) { diff --git a/RotationSolver/Rotations/Tank/PLD/PLD_Test.cs b/RotationSolver/Rotations/Tank/PLD/PLD_Test.cs new file mode 100644 index 000000000..91f52ed33 --- /dev/null +++ b/RotationSolver/Rotations/Tank/PLD/PLD_Test.cs @@ -0,0 +1,123 @@ +using RotationSolver.Actions; +using RotationSolver.Attributes; +using RotationSolver.Configuration.RotationConfig; +using RotationSolver.Data; +using RotationSolver.Helpers; +using RotationSolver.Rotations.Basic; +using RotationSolver.Updaters; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace RotationSolver.Rotations.Tank.PLD; + +internal class PLD_Test : PLD_Base +{ + public override string GameVersion => "6.31"; + public override string RotationName => "Test"; + + public override string Description => "NO PRE-PULL FOF OPENER"; + private protected override IRotationConfigSet CreateConfiguration() + { + return base.CreateConfiguration() + .SetBool("UseDivineVeilPre", false, "DivineVeilPre in 15 seconds counting down."); + } + private protected override IAction CountDownAction(float remainTime) + { + if (remainTime <= HolySpirit.CastTime + Service.Configuration.CountDownAhead + && HolySpirit.CanUse(out var act)) return act; + + if (Configs.GetBool("UseDivineVeilPre") && remainTime <= 15 + && DivineVeil.CanUse(out act)) return act; + + return base.CountDownAction(remainTime); + } + + private protected override bool EmergencyAbility(byte abilitiesRemaining, IAction nextGCD, out IAction act) + { + if (abilitiesRemaining == 1 && nextGCD.IsTheSameTo(true, RiotBlade, GoringBlade)) + { + if (FightorFlight.CanUse(out act)) return true; + } + return base.EmergencyAbility(abilitiesRemaining, nextGCD, out act); + } + + private protected override bool AttackAbility(byte abilitiesRemaining, out IAction act) + { + if(CombatElapsedLess(6) ) + { + if(FightorFlight.CanUse(out act)) return true; + } + else if(InBurst) + { + if(UseTincture(out act)) return true; + } + + if (CircleofScorn.CanUse(out act, mustUse: true)) return true; + if (SpiritsWithin.CanUse(out act, mustUse: true)) return true; + if (Expiacion.CanUse(out act, mustUse: true)) return true; + act = null; + return false; + } + + private protected override bool GeneralGCD(out IAction act) + { + if (BladeofValor.CanUse(out act, mustUse: true)) return true; + if (BladeofTruth.CanUse(out act, mustUse: true)) return true; + if (BladeofFaith.CanUse(out act, mustUse: true)) return true; + if (Confiteor.CanUse(out act, mustUse: true)) return true; + + //AOE + if (Player.HasStatus(true, StatusID.Requiescat) + && HolyCircle.CanUse(out act)) return true; + if (Prominence.CanUse(out act)) return true; + if (TotalEclipse.CanUse(out act)) return true; + + //Single + if (GoringBlade.CanUse(out act)) return true; // Dot + if (RageofHalone.CanUse(out act)) return true; + if (RiotBlade.CanUse(out act)) return true; + if (FastBlade.CanUse(out act)) return true; + + //Range + if (HolySpirit.CanUse(out act)) return true; + if (ShieldLob.CanUse(out act)) return true; + + return false; + } + + [RotationDesc(ActionID.Reprisal, ActionID.DivineVeil, ActionID.PassageofArms)] + private protected override bool DefenceAreaAbility(byte abilitiesRemaining, out IAction act) + { + if (Reprisal.CanUse(out act, mustUse: true)) return true; + if (DivineVeil.CanUse(out act)) return true; + if (PassageofArms.CanUse(out act)) return true; + return false; + } + + [RotationDesc(ActionID.Sentinel, ActionID.Rampart, ActionID.Bulwark, ActionID.Sheltron, ActionID.Reprisal)] + private protected override bool DefenceSingleAbility(byte abilitiesRemaining, out IAction act) + { + if (abilitiesRemaining == 2) + { + //10 + if (OathGauge >= 90 && Sheltron.CanUse(out act)) return true; + + //30 + if (Sentinel.CanUse(out act)) return true; + + //20 + if (Rampart.CanUse(out act)) return true; + + //10 + if (Bulwark.CanUse(out act)) return true; + if (Sheltron.CanUse(out act)) return true; + } + + if (Reprisal.CanUse(out act)) return true; + + return false; + } +}