From 7d8ab8829b601689f383800a7506e9ff9dc83fa8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=8B=E6=B0=B4?= <1123993881@qq.com> Date: Fri, 31 Mar 2023 22:47:59 +0800 Subject: [PATCH] feat: new War rotation. --- RotationSolver.Basic/Data/StatusID.cs | 2 + RotationSolver.Default/Tank/DRK_Default.cs | 14 ++- RotationSolver.Default/Tank/WAR_Default.cs | 121 ++++++++++++------- RotationSolver.Old/RotationSolver.Old.csproj | 1 - RotationSolver.Old/Tank/WAR_Old.cs | 96 +++++++++++++++ 5 files changed, 188 insertions(+), 46 deletions(-) create mode 100644 RotationSolver.Old/Tank/WAR_Old.cs diff --git a/RotationSolver.Basic/Data/StatusID.cs b/RotationSolver.Basic/Data/StatusID.cs index 4456aaa32..9fa8505ff 100644 --- a/RotationSolver.Basic/Data/StatusID.cs +++ b/RotationSolver.Basic/Data/StatusID.cs @@ -281,6 +281,8 @@ public enum StatusID : ushort /// NascentChaos = 1897, + InnerStrength = 2663, + /// /// 战场风暴 /// diff --git a/RotationSolver.Default/Tank/DRK_Default.cs b/RotationSolver.Default/Tank/DRK_Default.cs index c1daa318d..fd147d0c4 100644 --- a/RotationSolver.Default/Tank/DRK_Default.cs +++ b/RotationSolver.Default/Tank/DRK_Default.cs @@ -53,8 +53,18 @@ protected override IRotationConfigSet CreateConfiguration() protected override IAction CountDownAction(float remainTime) { //Provoke when has Shield. - if (HasTankStance && remainTime <= Service.Config.AbilitiesInterval && Provoke.CanUse(out var act)) return act; - if (remainTime <= 2 && UseBurstMedicine(out act)) return act; + if(remainTime <= Service.Config.AbilitiesInterval) + { + if (HasTankStance) + { + if (Provoke.CanUse(out var act1)) return act1; + } + else + { + if (Unmend.CanUse(out var act1)) return act1; + } + } + if (remainTime <= 2 && UseBurstMedicine(out var act)) return act; if (remainTime <= 3 && TheBlackestNight.CanUse(out act)) return act; if (remainTime <= 4 && BloodWeapon.CanUse(out act)) return act; return base.CountDownAction(remainTime); diff --git a/RotationSolver.Default/Tank/WAR_Default.cs b/RotationSolver.Default/Tank/WAR_Default.cs index 01e766194..f28a5f063 100644 --- a/RotationSolver.Default/Tank/WAR_Default.cs +++ b/RotationSolver.Default/Tank/WAR_Default.cs @@ -1,39 +1,44 @@ namespace RotationSolver.Default.Tank; [SourceCode("https://github.com/ArchiDog1998/RotationSolver/blob/main/RotationSolver.Default/Tank/WAR_Default.cs")] +[LinkDescription("https://cdn.discordapp.com/attachments/277962807813865472/963548326433796116/unknown.png")] public sealed class WAR_Default : WAR_Base { - public override string GameVersion => "6.0"; + public override string GameVersion => "6.35"; - public override string RotationName => "Default"; + public override string RotationName => "All-Around"; - [RotationDesc(ActionID.ShakeItOff, ActionID.Reprisal)] - protected override bool DefenseAreaAbility(byte abilitiesRemaining, out IAction act) - { - if (ShakeItOff.CanUse(out act, CanUseOption.MustUse)) return true; - if (Reprisal.CanUse(out act, CanUseOption.MustUse)) return true; - return false; - } + private static bool InBurstStatus => !Player.WillStatusEndGCD(0, 0, false, StatusID.InnerStrength); - [RotationDesc(ActionID.PrimalRend)] - protected override bool MoveForwardGCD(out IAction act) + protected override IAction CountDownAction(float remainTime) { - if (PrimalRend.CanUse(out act, CanUseOption.MustUse)) return true; - return false; + if (remainTime <= Service.Config.AbilitiesInterval) + { + if (HasTankStance) + { + if (Provoke.CanUse(out var act1)) return act1; + } + else + { + if (Tomahawk.CanUse(out var act1)) return act1; + } + } + return base.CountDownAction(remainTime); } protected override bool GeneralGCD(out IAction act) { - //��㹥�� - if (PrimalRend.CanUse(out act, CanUseOption.MustUse) && !IsMoving) - { - if (PrimalRend.Target.DistanceToPlayer() < 1) return true; - } - - if (SteelCyclone.CanUse(out act)) return true; if(!Player.WillStatusEndGCD(3, 0, true, StatusID.SurgingTempest)) { - if (InnerBeast.CanUse(out act)) return true; + if (!IsMoving && InBurstStatus && PrimalRend.CanUse(out act, CanUseOption.MustUse)) + { + if (PrimalRend.Target.DistanceToPlayer() < 1) return true; + } + if (InBurstStatus || !Player.HasStatus(false, StatusID.NascentChaos) || BeastGauge > 80) + { + if (SteelCyclone.CanUse(out act)) return true; + if (InnerBeast.CanUse(out act)) return true; + } } if (MythrilTempest.CanUse(out act)) return true; @@ -45,12 +50,59 @@ protected override bool GeneralGCD(out IAction act) if (HeavySwing.CanUse(out act)) return true; if (SpecialType == SpecialCommandType.MoveForward && MoveForwardAbility(1, out act)) return true; - if (Tomahawk.CanUse(out act)) return true; return false; } + protected override bool AttackAbility(byte abilitiesRemaining, out IAction act) + { + if (Infuriate.CanUse(out act, gcdCountForAbility: 3)) return true; + + if (CombatElapsedLessGCD(1)) return false; + + if (abilitiesRemaining == 1) + { + if (UseBurstMedicine(out act)) return true; + if (Player.HasStatus(false, StatusID.SurgingTempest) + && !Player.WillStatusEndGCD(6, 0, true, StatusID.SurgingTempest) + || !MythrilTempest.EnoughLevel) + { + if (Berserk.CanUse(out act)) return true; + } + } + + if (InBurstStatus) + { + if (Infuriate.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true; + } + + if (CombatElapsedLessGCD(4)) return false; + + if (Orogeny.CanUse(out act)) return true; + if (Upheaval.CanUse(out act)) return true; + + var option = CanUseOption.MustUse; + if (InBurstStatus) option |= CanUseOption.EmptyOrSkipCombo; + if (Onslaught.CanUse(out act, option) && !IsMoving) return true; + + return false; + } + + protected override bool GeneralAbility(byte abilitiesRemaining, out IAction act) + { + //Auto healing + if (Player.GetHealthRatio() < 0.6f) + { + if (ThrillOfBattle.CanUse(out act)) return true; + if (Equilibrium.CanUse(out act)) return true; + } + + if (!HasTankStance && NascentFlash.CanUse(out act)) return true; + + return base.GeneralAbility(abilitiesRemaining, out act); + } + [RotationDesc(ActionID.RawIntuition, ActionID.Vengeance, ActionID.Rampart, ActionID.RawIntuition, ActionID.Reprisal)] protected override bool DefenseSingleAbility(byte abilitiesRemaining, out IAction act) { @@ -76,28 +128,11 @@ protected override bool DefenseSingleAbility(byte abilitiesRemaining, out IActio return false; } - protected override bool AttackAbility(byte abilitiesRemaining, out IAction act) + [RotationDesc(ActionID.ShakeItOff, ActionID.Reprisal)] + protected override bool DefenseAreaAbility(byte abilitiesRemaining, out IAction act) { - if (!Player.WillStatusEndGCD(3, 0, true, StatusID.SurgingTempest) || !MythrilTempest.EnoughLevel) - { - if (!InnerRelease.IsCoolingDown && Berserk.CanUse(out act)) return true; - } - - if (Player.GetHealthRatio() < 0.6f) - { - if (ThrillOfBattle.CanUse(out act)) return true; - if (Equilibrium.CanUse(out act)) return true; - } - - if (!HasTankStance && NascentFlash.CanUse(out act)) return true; - - if (Infuriate.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true; - - if (Orogeny.CanUse(out act)) return true; - if (Upheaval.CanUse(out act)) return true; - - if (Onslaught.CanUse(out act, CanUseOption.MustUse) && !IsMoving) return true; - + if (ShakeItOff.CanUse(out act, CanUseOption.MustUse)) return true; + if (Reprisal.CanUse(out act, CanUseOption.MustUse)) return true; return false; } } diff --git a/RotationSolver.Old/RotationSolver.Old.csproj b/RotationSolver.Old/RotationSolver.Old.csproj index c77c8c661..73267580c 100644 --- a/RotationSolver.Old/RotationSolver.Old.csproj +++ b/RotationSolver.Old/RotationSolver.Old.csproj @@ -54,7 +54,6 @@ - diff --git a/RotationSolver.Old/Tank/WAR_Old.cs b/RotationSolver.Old/Tank/WAR_Old.cs new file mode 100644 index 000000000..98181afbe --- /dev/null +++ b/RotationSolver.Old/Tank/WAR_Old.cs @@ -0,0 +1,96 @@ +namespace RotationSolver.Default.Tank; + +[SourceCode("https://github.com/ArchiDog1998/RotationSolver/blob/main/RotationSolver.Default/Tank/WAR_Default.cs")] +public sealed class WAR_Old : WAR_Base +{ + public override string GameVersion => "6.0"; + + public override string RotationName => "Old"; + + [RotationDesc(ActionID.ShakeItOff, ActionID.Reprisal)] + protected override bool DefenseAreaAbility(byte abilitiesRemaining, out IAction act) + { + if (ShakeItOff.CanUse(out act, CanUseOption.MustUse)) return true; + if (Reprisal.CanUse(out act, CanUseOption.MustUse)) return true; + return false; + } + + protected override bool GeneralGCD(out IAction act) + { + //��㹥�� + if (PrimalRend.CanUse(out act, CanUseOption.MustUse) && !IsMoving) + { + if (PrimalRend.Target.DistanceToPlayer() < 1) return true; + } + + if (SteelCyclone.CanUse(out act)) return true; + if(!Player.WillStatusEndGCD(3, 0, true, StatusID.SurgingTempest)) + { + if (InnerBeast.CanUse(out act)) return true; + } + + if (MythrilTempest.CanUse(out act)) return true; + if (Overpower.CanUse(out act)) return true; + + if (StormsEye.CanUse(out act)) return true; + if (StormsPath.CanUse(out act)) return true; + if (Maim.CanUse(out act)) return true; + if (HeavySwing.CanUse(out act)) return true; + + if (SpecialType == SpecialCommandType.MoveForward && MoveForwardAbility(1, out act)) return true; + + if (Tomahawk.CanUse(out act)) return true; + + return false; + } + + [RotationDesc(ActionID.RawIntuition, ActionID.Vengeance, ActionID.Rampart, ActionID.RawIntuition, ActionID.Reprisal)] + protected override bool DefenseSingleAbility(byte abilitiesRemaining, out IAction act) + { + if (abilitiesRemaining == 2) + { + if (HostileTargets.Count() > 1) + { + //10 + if (RawIntuition.CanUse(out act)) return true; + } + + //30 + if (Vengeance.CanUse(out act)) return true; + + //20 + if (Rampart.CanUse(out act)) return true; + + //10 + if (RawIntuition.CanUse(out act)) return true; + } + if (Reprisal.CanUse(out act)) return true; + + return false; + } + + protected override bool AttackAbility(byte abilitiesRemaining, out IAction act) + { + if (!Player.WillStatusEndGCD(3, 0, true, StatusID.SurgingTempest) || !MythrilTempest.EnoughLevel) + { + if (Berserk.CanUse(out act)) return true; + } + + if (Player.GetHealthRatio() < 0.6f) + { + if (ThrillOfBattle.CanUse(out act)) return true; + if (Equilibrium.CanUse(out act)) return true; + } + + if (!HasTankStance && NascentFlash.CanUse(out act)) return true; + + if (Infuriate.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true; + + if (Orogeny.CanUse(out act)) return true; + if (Upheaval.CanUse(out act)) return true; + + if (Onslaught.CanUse(out act, CanUseOption.MustUse) && !IsMoving) return true; + + return false; + } +}