diff --git a/BossMod/Autorotation/Standard/akechi/AkechiTools.cs b/BossMod/Autorotation/Standard/akechi/AkechiTools.cs
index 21aafa674..f7e2c1a01 100644
--- a/BossMod/Autorotation/Standard/akechi/AkechiTools.cs
+++ b/BossMod/Autorotation/Standard/akechi/AkechiTools.cs
@@ -610,9 +610,9 @@ P targetPrio(Actor potentialTarget)
/// The initial target to consider for applying the DoT effect.
/// A function that retrieves the timer value associated with a given actor.
/// The maximum number of valid targets to evaluate.
- protected (Enemy? Best, P Timer) GetDOTTarget
(Enemy? initial, Func getTimer, int maxAllowedTargets) where P : struct, IComparable
+ protected (Enemy? Best, P Timer) GetDOTTarget(Enemy? initial, Func getTimer, int maxAllowedTargets, float range = 30) where P : struct, IComparable
{
- if (initial == null || maxAllowedTargets <= 0)
+ if (initial == null || maxAllowedTargets <= 0 || Player.DistanceToHitbox(initial.Actor) > range)
{
return (null, getTimer(null));
}
@@ -624,7 +624,7 @@ P targetPrio(Actor potentialTarget)
foreach (var dotTarget in Hints.PriorityTargets)
{
- if (dotTarget.ForbidDOTs)
+ if (dotTarget.ForbidDOTs || Player.DistanceToHitbox(dotTarget.Actor) > range)
continue;
if (++numTargets > maxAllowedTargets)
@@ -770,12 +770,12 @@ public sealed override void Execute(StrategyValues strategy, ref Actor? primaryT
DowntimeIn = Manager.Planner?.EstimateTimeToNextDowntime().Item2 ?? float.MaxValue;
CombatTimer = (float)(World.CurrentTime - Manager.CombatStart).TotalSeconds;
CountdownRemaining = World.Client.CountdownRemaining;
- CanTrueNorth = ActionUnlocked(ActionID.MakeSpell(ClassShared.AID.TrueNorth)) && World.Client.Cooldowns[ActionDefinitions.Instance.Spell(ClassShared.AID.TrueNorth)!.MainCooldownGroup].Remaining < 45.6f;
HasTrueNorth = StatusRemaining(Player, ClassShared.SID.TrueNorth, 15) > 0.1f;
- CanSwiftcast = ActionUnlocked(ActionID.MakeSpell(ClassShared.AID.Swiftcast)) && World.Client.Cooldowns[ActionDefinitions.Instance.Spell(ClassShared.AID.Swiftcast)!.MainCooldownGroup].Remaining < 0.6f;
+ CanTrueNorth = !HasTrueNorth && ActionUnlocked(ActionID.MakeSpell(ClassShared.AID.TrueNorth)) && World.Client.Cooldowns[ActionDefinitions.Instance.Spell(ClassShared.AID.TrueNorth)!.MainCooldownGroup].Remaining < 45.6f;
HasSwiftcast = StatusRemaining(Player, ClassShared.SID.Swiftcast, 10) > 0.1f;
- CanPeloton = !Player.InCombat && ActionUnlocked(ActionID.MakeSpell(ClassShared.AID.Peloton)) && World.Client.Cooldowns[ActionDefinitions.Instance.Spell(ClassShared.AID.Peloton)!.MainCooldownGroup].Remaining < 0.6f;
+ CanSwiftcast = ActionUnlocked(ActionID.MakeSpell(ClassShared.AID.Swiftcast)) && World.Client.Cooldowns[ActionDefinitions.Instance.Spell(ClassShared.AID.Swiftcast)!.MainCooldownGroup].Remaining < 0.6f;
HasPeloton = PlayerHasAnyEffect(ClassShared.SID.Peloton);
+ CanPeloton = !Player.InCombat && !HasPeloton && ActionUnlocked(ActionID.MakeSpell(ClassShared.AID.Peloton)) && World.Client.Cooldowns[ActionDefinitions.Instance.Spell(ClassShared.AID.Peloton)!.MainCooldownGroup].Remaining < 0.6f;
if (Player.MountId is not (103 or 117 or 128))
Execution(strategy, PlayerTarget);
diff --git a/BossMod/Autorotation/Standard/akechi/DPS/AkechiDRG.cs b/BossMod/Autorotation/Standard/akechi/DPS/AkechiDRG.cs
index 4990ef138..a0de31644 100644
--- a/BossMod/Autorotation/Standard/akechi/DPS/AkechiDRG.cs
+++ b/BossMod/Autorotation/Standard/akechi/DPS/AkechiDRG.cs
@@ -10,7 +10,7 @@ public sealed class AkechiDRG(RotationModuleManager manager, Actor player) : Ake
{
#region Enums: Abilities / Strategies
public enum Track { AOE, Hold, Dives, Potion, LifeSurge, Jump, DragonfireDive, Geirskogul, Stardiver, PiercingTalon, TrueNorth, LanceCharge, BattleLitany, MirageDive, Nastrond, WyrmwindThrust, RiseOfTheDragon, Starcross }
- public enum AOEStrategy { AutoTargetHitPrimary, AutoTargetHitMost, ForceST, Force123ST, ForceBuffsST, ForceAOE }
+ public enum AOEStrategy { AutoFinish, AutoBreak, ForceST, Force123ST, ForceBuffsST, ForceAOE }
public enum HoldStrategy { Allow, Forbid }
public enum DivesStrategy { AllowMaxMelee, AllowCloseMelee, Allow, Forbid }
public enum PotionStrategy { Manual, AlignWithRaidBuffs, Immediate }
@@ -26,18 +26,11 @@ public enum TrueNorthStrategy { Automatic, ASAP, Rear, Flank, Force, Delay }
#region Module Definitions
public static RotationModuleDefinition Definition()
{
- var res = new RotationModuleDefinition(
- "Akechi DRG", //Name
- "Standard Rotation Module", //Type
- "Standard rotation (Akechi)|DPS", //Category
- "Akechi", //Contributor of module
- RotationModuleQuality.Good, //Quality
- BitMask.Build(Class.LNC, Class.DRG), //Class and Job
- 100); //Max Level supported
+ var res = new RotationModuleDefinition("Akechi DRG", "Standard Rotation Module", "Standard rotation (Akechi)|DPS", "Akechi", RotationModuleQuality.Excellent, BitMask.Build(Class.LNC, Class.DRG), 100);
res.Define(Track.AOE).As("Combo Option", "AOE", uiPriority: 200)
- .AddOption(AOEStrategy.AutoTargetHitPrimary, "AutoTargetHitPrimary", "Use AOE actions if profitable, select best target that ensures primary target is hit", supportedTargets: ActionTargets.Hostile)
- .AddOption(AOEStrategy.AutoTargetHitMost, "AutoTargetHitMost", "Use AOE actions if profitable, select a target that ensures maximal number of targets are hit", supportedTargets: ActionTargets.Hostile)
+ .AddOption(AOEStrategy.AutoFinish, "Auto (Finish combo)", "Automatically execute optimal rotation based on targets; finishes combo if possible", supportedTargets: ActionTargets.Hostile)
+ .AddOption(AOEStrategy.AutoBreak, "Auto (Break combo)", "Automatically execute optimal rotation based on targets; breaks combo if necessary", supportedTargets: ActionTargets.Hostile)
.AddOption(AOEStrategy.ForceST, "Force ST", "Force Single-Target rotation", supportedTargets: ActionTargets.Hostile)
.AddOption(AOEStrategy.Force123ST, "Only 1-2-3 ST", "Force only ST 1-2-3 rotation (No Buff or DoT)", supportedTargets: ActionTargets.Hostile)
.AddOption(AOEStrategy.ForceBuffsST, "Only 1-4-5 ST", "Force only ST 1-4-5 rotation (Buff & DoT only)", supportedTargets: ActionTargets.Hostile)
@@ -121,77 +114,74 @@ public static RotationModuleDefinition Definition()
#endregion
#region Priorities
-
- public enum GCDPriority //Priorities for Global Cooldowns (GCDs)
-
+ public enum GCDPriority
{
- None = 0, //No priority
- Combo123 = 350, //Priority for the first three combo actions
- NormalGCD = 500, //Standard priority for normal GCD actions
- ForcedGCD = 900, //High priority for forced GCD actions
+ None = 0,
+ Combo123 = 350,
+ NormalGCD = 500,
+ ForcedGCD = 900,
}
-
- public enum OGCDPriority //Priorities for Off Global Cooldowns (oGCDs)
-
+ public enum OGCDPriority
{
- None = 0, //No priority
- //Flexible actions with varying priorities
- MirageDive = 500, //Priority for Mirage Dive
- Nastrond = 540, //Priority for Nastrond
- Stardiver = 550, //Priority for Stardiver
- RiseOfTheDragon = 560, //Priority for Rise of the Dragon
- Starcross = 560, //Priority for Starcross
- WyrmwindThrust = 570, //Priority for Wyrmwind Thrust (normal)
- TrueNorth = 580, //Priority for True North
- //Non-flexible actions with fixed priorities
- Jump = 660, //Priority for Jump
- WyrmwindThrustOpti = 670, //Priority for Wyrmwind Thrust (optimal)
- DragonfireDive = 680, //Priority for Dragonfire Dive
- Geirskogul = 700, //Priority for Geirskogul
- Buffs = 800, //Priority for buffs
- ForcedOGCD = 900, //High priority for forced oGCD actions
+ None = 0,
+ MirageDive = 500,
+ Nastrond = 540,
+ Stardiver = 550,
+ RiseOfTheDragon = 560,
+ Starcross = 560,
+ WyrmwindThrust = 570,
+ TrueNorth = 580,
+ Jump = 660,
+ WyrmwindThrustOpti = 670,
+ DragonfireDive = 680,
+ Geirskogul = 700,
+ Buffs = 800,
+ ForcedOGCD = 900,
}
-
+ private OGCDPriority OGCDPrio(OGCDStrategy strat, OGCDPriority defaultPrio) => strat is OGCDStrategy.Force or OGCDStrategy.AnyWeave or OGCDStrategy.EarlyWeave or OGCDStrategy.LateWeave ? OGCDPriority.ForcedOGCD : defaultPrio;
#endregion
#region Module Variables
- private bool hasLOTD; //Flag for Life of the Dragon status
- private bool hasLC; //Flag for Lance Charge status
- private bool hasBL; //Flag for Battle Litany status
- private bool hasMD; //Flag for Mirage Dive status
- private bool hasDF; //Flag for Dragon's Flight status
- private bool hasSC; //Flag for Starcross status
- private bool hasNastrond; //Flag for Nastrond status
- private bool canLC; //Ability to use Lance Charge
- private bool canBL; //Ability to use Battle Litany
- private bool canLS; //Ability to use Life Surge
- private bool canJump; //Ability to use Jump
- private bool canDD; //Ability to use Dragonfire Dive
- private bool canGeirskogul; //Ability to use Geirskogul
- private bool canMD; //Ability to use Mirage Dive
- private bool canNastrond; //Ability to use Nastrond
- private bool canSD; //Ability to use Stardiver
- private bool canWT; //Ability to use Wyrmwind Thrust
- private bool canROTD; //Ability to use Rise of the Dragon
- private bool canSC; //Ability to use Starcross
- private float GCDLength; //Length of the global cooldown
- private float blCD; //Cooldown for Battle Litany
- private float lcLeft; //Time remaining for Lance Charge
- private float lcCD; //Cooldown for Lance Charge
- private float powerLeft; //Time remaining for Power Surge
- private float chaosLeft; //Remaining time for Chaotic Spring DoT
- public float downtimeIn; //Duration of downtime in combat
- private int focusCount; //Count of Firstmind's Focus gauge
- public int NumAOETargets;
- public int NumSpearTargets;
- public int NumDiveTargets;
+ private bool hasLOTD;
+ private bool hasLC;
+ private bool hasBL;
+ private bool hasMD;
+ private bool hasDF;
+ private bool hasSC;
+ private bool hasNastrond;
+ private bool canLC;
+ private bool canBL;
+ private bool canLS;
+ private bool canJump;
+ private bool canDD;
+ private bool canGeirskogul;
+ private bool canMD;
+ private bool canNastrond;
+ private bool canSD;
+ private bool canWT;
+ private bool canROTD;
+ private bool canSC;
+ private float blCD;
+ private float lcLeft;
+ private float lcCD;
+ private float powerLeft;
+ private float chaosLeft;
+ private int focusCount;
+ private int NumAOETargets;
+ private int NumSpearTargets;
+ private int NumDiveTargets;
+ private bool ShouldUseAOE;
+ private bool ShouldUseSpears;
+ private bool ShouldUseDives;
+ private bool ShouldUseDOT;
private Enemy? BestAOETargets;
private Enemy? BestSpearTargets;
private Enemy? BestDiveTargets;
+ private Enemy? BestDOTTargets;
private Enemy? BestAOETarget;
private Enemy? BestSpearTarget;
private Enemy? BestDiveTarget;
-
+ private Enemy? BestDOTTarget;
#endregion
public override void Execution(StrategyValues strategy, Enemy? primaryTarget)
@@ -200,36 +190,41 @@ public override void Execution(StrategyValues strategy, Enemy? primaryTarget)
var gauge = World.Client.GetGauge();
focusCount = gauge.FirstmindsFocusCount;
hasLOTD = gauge.LotdTimer > 0;
+ blCD = TotalCD(AID.BattleLitany);
lcCD = TotalCD(AID.LanceCharge);
lcLeft = SelfStatusLeft(SID.LanceCharge, 20);
powerLeft = SelfStatusLeft(SID.PowerSurge, 30);
chaosLeft = MathF.Max(StatusDetails(primaryTarget?.Actor, SID.ChaosThrust, Player.InstanceID).Left, StatusDetails(primaryTarget?.Actor, SID.ChaoticSpring, Player.InstanceID).Left);
- blCD = TotalCD(AID.BattleLitany);
- GCDLength = ActionSpeed.GCDRounded(World.Client.PlayerStats.SkillSpeed, World.Client.PlayerStats.Haste, Player.Level);
hasMD = PlayerHasEffect(SID.DiveReady);
hasNastrond = PlayerHasEffect(SID.NastrondReady);
hasLC = lcCD is >= 40 and <= 60;
hasBL = blCD is >= 100 and <= 120;
hasDF = PlayerHasEffect(SID.DragonsFlight);
hasSC = PlayerHasEffect(SID.StarcrossReady);
- canLC = Unlocked(AID.LanceCharge) && ActionReady(AID.LanceCharge);
- canBL = Unlocked(AID.BattleLitany) && ActionReady(AID.BattleLitany);
- canLS = Unlocked(AID.LifeSurge);
- canJump = Unlocked(AID.Jump) && ActionReady(AID.Jump);
- canDD = Unlocked(AID.DragonfireDive) && ActionReady(AID.DragonfireDive);
- canGeirskogul = Unlocked(AID.Geirskogul) && ActionReady(AID.Geirskogul);
+ canLC = ActionReady(AID.LanceCharge);
+ canBL = ActionReady(AID.BattleLitany);
+ canLS = Unlocked(AID.LifeSurge) && (Unlocked(TraitID.EnhancedLifeSurge) ? TotalCD(AID.LifeSurge) < 40.6f : TotalCD(AID.LifeSurge) < 0.6f) && !PlayerHasEffect(SID.LifeSurge);
+ canJump = ActionReady(AID.Jump);
+ canDD = ActionReady(AID.DragonfireDive);
+ canGeirskogul = ActionReady(AID.Geirskogul);
canMD = Unlocked(AID.MirageDive) && hasMD;
canNastrond = Unlocked(AID.Nastrond) && hasNastrond;
- canSD = Unlocked(AID.Stardiver) && ActionReady(AID.Stardiver);
- canWT = Unlocked(AID.WyrmwindThrust) && ActionReady(AID.WyrmwindThrust) && focusCount == 2;
+ canSD = ActionReady(AID.Stardiver);
+ canWT = ActionReady(AID.WyrmwindThrust) && focusCount == 2;
canROTD = Unlocked(AID.RiseOfTheDragon) && hasDF;
canSC = Unlocked(AID.Starcross) && hasSC;
+ ShouldUseAOE = Unlocked(AID.DoomSpike) && NumAOETargets > 2;
+ ShouldUseSpears = Unlocked(AID.Geirskogul) && NumSpearTargets > 1;
+ ShouldUseDives = Unlocked(AID.Stardiver) && NumDiveTargets > 1;
+ ShouldUseDOT = Unlocked(AID.ChaosThrust) && Hints.NumPriorityTargetsInAOECircle(Player.Position, 3.5f) == 2 && ComboLastMove is AID.Disembowel or AID.SpiralBlow;
(BestAOETargets, NumAOETargets) = GetBestTarget(primaryTarget, 10, Is10yRectTarget);
(BestSpearTargets, NumSpearTargets) = GetBestTarget(primaryTarget, 15, Is15yRectTarget);
(BestDiveTargets, NumDiveTargets) = GetBestTarget(primaryTarget, 20, IsSplashTarget);
- BestAOETarget = Unlocked(AID.DoomSpike) && NumAOETargets > 2 ? BestAOETargets : primaryTarget;
- BestSpearTarget = Unlocked(AID.Geirskogul) && NumSpearTargets > 1 ? BestSpearTargets : primaryTarget;
- BestDiveTarget = Unlocked(AID.Stardiver) && NumDiveTargets > 1 ? BestDiveTargets : primaryTarget;
+ (BestDOTTargets, chaosLeft) = GetDOTTarget(primaryTarget, ChaosRemaining, 2, 3.5f);
+ BestAOETarget = ShouldUseAOE ? BestAOETargets : BestDOTTarget;
+ BestSpearTarget = ShouldUseSpears ? BestSpearTargets : primaryTarget;
+ BestDiveTarget = ShouldUseDives ? BestDiveTargets : primaryTarget;
+ BestDOTTarget = ShouldUseDOT ? BestDOTTargets : primaryTarget;
#region Strategy Definitions
var hold = strategy.Option(Track.Hold).As() == HoldStrategy.Forbid;
@@ -272,9 +267,9 @@ public override void Execution(StrategyValues strategy, Enemy? primaryTarget)
//Dive strategy
var diveStrategy = dive switch
{
- DivesStrategy.AllowMaxMelee => In3y(primaryTarget?.Actor), //Only allow max melee if target is within 3 yalms
- DivesStrategy.AllowCloseMelee => In0y(primaryTarget?.Actor), //Only allow close melee if target is within 1 yalm
- DivesStrategy.Allow => In20y(primaryTarget?.Actor), //Always allow dives
+ DivesStrategy.AllowMaxMelee => In3y(BestDiveTarget?.Actor), //Only allow max melee if target is within 3 yalms
+ DivesStrategy.AllowCloseMelee => In0y(BestDiveTarget?.Actor), //Only allow close melee if target is within 1 yalm
+ DivesStrategy.Allow => In20y(BestDiveTarget?.Actor), //Always allow dives
DivesStrategy.Forbid => false, //Never allow dives
_ => false,
};
@@ -286,256 +281,129 @@ public override void Execution(StrategyValues strategy, Enemy? primaryTarget)
#endregion
#region Standard Rotations
- //Force specific actions based on the AOE strategy selected
- if (AOEStrategy == AOEStrategy.ForceST) //if forced single target
- QueueGCD(NextFullST(), TargetChoice(AOE) ?? primaryTarget?.Actor, GCDPriority.ForcedGCD); //Queue the next single target action
- if (AOEStrategy == AOEStrategy.Force123ST) //if forced 123 combo
- QueueGCD(UseOnly123ST(), TargetChoice(AOE) ?? primaryTarget?.Actor, GCDPriority.ForcedGCD); //Queue the 123 combo action
- if (AOEStrategy == AOEStrategy.ForceBuffsST) //if forced buffs combo
- QueueGCD(UseOnly145ST(), TargetChoice(AOE) ?? primaryTarget?.Actor, GCDPriority.ForcedGCD); //Queue the buffed 145 combo action
- if (AOEStrategy == AOEStrategy.ForceAOE) //if forced AOE action
- QueueGCD(NextFullAOE(), TargetChoice(AOE) ?? (NumAOETargets > 1 ? BestAOETargets?.Actor : primaryTarget?.Actor), GCDPriority.ForcedGCD); //Queue the next AOE action
- //Combo Action evecution
- QueueGCD(NumAOETargets > 2 ? NextFullAOE() : NextFullST(),
- BestAOETarget?.Actor,
- GCDPriority.Combo123);
+ if (AOEStrategy is AOEStrategy.AutoFinish)
+ QueueGCD(FullRotation(), BestAOETarget?.Actor, GCDPriority.Combo123);
+ if (AOEStrategy is AOEStrategy.AutoBreak)
+ QueueGCD(ShouldUseAOE ? FullAOE() : ShouldUseDOT ? STBuffs() : FullST(), BestAOETarget?.Actor, GCDPriority.Combo123);
+ if (AOEStrategy == AOEStrategy.ForceST)
+ QueueGCD(FullST(), TargetChoice(AOE) ?? primaryTarget?.Actor, GCDPriority.ForcedGCD);
+ if (AOEStrategy == AOEStrategy.Force123ST)
+ QueueGCD(STNormal(), TargetChoice(AOE) ?? primaryTarget?.Actor, GCDPriority.ForcedGCD);
+ if (AOEStrategy == AOEStrategy.ForceBuffsST)
+ QueueGCD(STBuffs(), TargetChoice(AOE) ?? BestDOTTarget?.Actor, GCDPriority.ForcedGCD);
+ if (AOEStrategy == AOEStrategy.ForceAOE)
+ QueueGCD(FullAOE(), TargetChoice(AOE) ?? (NumAOETargets > 1 ? BestAOETargets?.Actor : primaryTarget?.Actor), GCDPriority.ForcedGCD);
#endregion
#region Cooldowns
-
if (!hold)
{
+ if (divesGood)
+ {
+ if (ShouldUseJump(jumpStrat, primaryTarget?.Actor))
+ QueueOGCD(Unlocked(AID.HighJump) ? AID.HighJump : AID.Jump, TargetChoice(jump) ?? primaryTarget?.Actor, jumpStrat is JumpStrategy.Force or JumpStrategy.ForceEX or JumpStrategy.ForceEX2 or JumpStrategy.ForceWeave ? OGCDPriority.ForcedOGCD : OGCDPriority.Jump);
+ if (ShouldUseDragonfireDive(ddStrat, primaryTarget?.Actor))
+ QueueOGCD(AID.DragonfireDive, TargetChoice(dd) ?? BestDiveTarget?.Actor, ddStrat is DragonfireStrategy.Force or DragonfireStrategy.ForceWeave ? OGCDPriority.ForcedOGCD : OGCDPriority.DragonfireDive);
+ if (ShouldUseStardiver(sdStrat, primaryTarget?.Actor))
+ QueueOGCD(AID.Stardiver, TargetChoice(sd) ?? BestDiveTarget?.Actor, sdStrat is StardiverStrategy.Force or StardiverStrategy.ForceEX or StardiverStrategy.ForceWeave ? OGCDPriority.ForcedOGCD : OGCDPriority.Stardiver);
+ }
if (ShouldUseLanceCharge(lcStrat, primaryTarget?.Actor))
- QueueOGCD(AID.LanceCharge, Player,
- lcStrat is OGCDStrategy.Force or OGCDStrategy.AnyWeave or OGCDStrategy.EarlyWeave or OGCDStrategy.LateWeave
- ? OGCDPriority.ForcedOGCD : OGCDPriority.Buffs);
-
+ QueueOGCD(AID.LanceCharge, Player, OGCDPrio(lcStrat, OGCDPriority.Buffs));
if (ShouldUseBattleLitany(blStrat, primaryTarget?.Actor))
- QueueOGCD(AID.BattleLitany, Player,
- blStrat is OGCDStrategy.Force or OGCDStrategy.AnyWeave or OGCDStrategy.EarlyWeave or OGCDStrategy.LateWeave
- ? OGCDPriority.ForcedOGCD : OGCDPriority.Buffs);
-
+ QueueOGCD(AID.BattleLitany, Player, OGCDPrio(blStrat, OGCDPriority.Buffs));
if (ShouldUseLifeSurge(lsStrat, primaryTarget?.Actor))
- QueueOGCD(AID.LifeSurge, Player,
- lsStrat is SurgeStrategy.Force or SurgeStrategy.ForceWeave or SurgeStrategy.ForceNextOpti or SurgeStrategy.ForceNextOptiWeave
- ? OGCDPriority.ForcedOGCD : OGCDPriority.Buffs);
-
- if (divesGood && ShouldUseJump(jumpStrat, primaryTarget?.Actor))
- QueueOGCD(Unlocked(AID.HighJump) ? AID.HighJump : AID.Jump,
- TargetChoice(jump) ?? primaryTarget?.Actor,
- jumpStrat is JumpStrategy.Force or JumpStrategy.ForceEX or JumpStrategy.ForceEX2 or JumpStrategy.ForceWeave
- ? OGCDPriority.ForcedOGCD : OGCDPriority.Jump);
-
- if (divesGood && ShouldUseDragonfireDive(ddStrat, primaryTarget?.Actor))
- QueueOGCD(AID.DragonfireDive,
- TargetChoice(dd) ?? BestDiveTarget?.Actor,
- ddStrat is DragonfireStrategy.Force or DragonfireStrategy.ForceWeave
- ? OGCDPriority.ForcedOGCD : OGCDPriority.DragonfireDive);
-
+ QueueOGCD(AID.LifeSurge, Player, lsStrat is SurgeStrategy.Force or SurgeStrategy.ForceWeave or SurgeStrategy.ForceNextOpti or SurgeStrategy.ForceNextOptiWeave ? OGCDPriority.ForcedOGCD : OGCDPriority.Buffs);
if (ShouldUseGeirskogul(geirskogulStrat, primaryTarget?.Actor))
- QueueOGCD(AID.Geirskogul,
- TargetChoice(geirskogul) ?? BestSpearTarget?.Actor,
- geirskogulStrat is GeirskogulStrategy.Force or GeirskogulStrategy.ForceEX or GeirskogulStrategy.ForceWeave
- ? OGCDPriority.ForcedOGCD : OGCDPriority.Geirskogul);
-
+ QueueOGCD(AID.Geirskogul, TargetChoice(geirskogul) ?? BestSpearTarget?.Actor, geirskogulStrat is GeirskogulStrategy.Force or GeirskogulStrategy.ForceEX or GeirskogulStrategy.ForceWeave ? OGCDPriority.ForcedOGCD : OGCDPriority.Geirskogul);
if (ShouldUseMirageDive(mdStrat, primaryTarget?.Actor))
- QueueOGCD(AID.MirageDive,
- TargetChoice(md) ?? primaryTarget?.Actor,
- mdStrat is OGCDStrategy.Force or OGCDStrategy.AnyWeave or OGCDStrategy.EarlyWeave or OGCDStrategy.LateWeave
- ? OGCDPriority.ForcedOGCD : OGCDPriority.MirageDive);
-
+ QueueOGCD(AID.MirageDive, TargetChoice(md) ?? primaryTarget?.Actor, OGCDPrio(mdStrat, OGCDPriority.MirageDive));
if (ShouldUseNastrond(nastrondStrat, primaryTarget?.Actor))
- QueueOGCD(AID.Nastrond,
- TargetChoice(nastrond) ?? BestSpearTarget?.Actor,
- nastrondStrat is OGCDStrategy.Force or OGCDStrategy.AnyWeave or OGCDStrategy.EarlyWeave or OGCDStrategy.LateWeave
- ? OGCDPriority.ForcedOGCD : OGCDPriority.Nastrond);
-
- if (divesGood && ShouldUseStardiver(sdStrat, primaryTarget?.Actor))
- QueueOGCD(AID.Stardiver,
- TargetChoice(sd) ?? BestDiveTarget?.Actor,
- sdStrat is StardiverStrategy.Force or StardiverStrategy.ForceEX or StardiverStrategy.ForceWeave
- ? OGCDPriority.ForcedOGCD : OGCDPriority.Stardiver);
-
+ QueueOGCD(AID.Nastrond, TargetChoice(nastrond) ?? BestSpearTarget?.Actor, OGCDPrio(nastrondStrat, OGCDPriority.Nastrond));
if (ShouldUseWyrmwindThrust(wtStrat, primaryTarget?.Actor))
- QueueOGCD(AID.WyrmwindThrust,
- TargetChoice(wt) ?? BestSpearTarget?.Actor,
- wtStrat is OGCDStrategy.Force or OGCDStrategy.AnyWeave or OGCDStrategy.EarlyWeave or OGCDStrategy.LateWeave
- ? OGCDPriority.ForcedOGCD : PlayerHasEffect(SID.LanceCharge)
- ? OGCDPriority.WyrmwindThrustOpti : OGCDPriority.WyrmwindThrust);
-
+ QueueOGCD(AID.WyrmwindThrust, TargetChoice(wt) ?? BestSpearTarget?.Actor, wtStrat is OGCDStrategy.Force or OGCDStrategy.AnyWeave or OGCDStrategy.EarlyWeave or OGCDStrategy.LateWeave ? OGCDPriority.ForcedOGCD : PlayerHasEffect(SID.LanceCharge) ? OGCDPriority.WyrmwindThrustOpti : OGCDPriority.WyrmwindThrust);
if (ShouldUseRiseOfTheDragon(rotdStrat, primaryTarget?.Actor))
- QueueOGCD(AID.RiseOfTheDragon,
- TargetChoice(rotd) ?? BestDiveTarget?.Actor,
- rotdStrat is OGCDStrategy.Force or OGCDStrategy.AnyWeave or OGCDStrategy.EarlyWeave or OGCDStrategy.LateWeave
- ? OGCDPriority.ForcedOGCD : OGCDPriority.Buffs);
-
+ QueueOGCD(AID.RiseOfTheDragon, TargetChoice(rotd) ?? BestDiveTarget?.Actor, OGCDPrio(rotdStrat, OGCDPriority.RiseOfTheDragon));
if (ShouldUseStarcross(scStrat, primaryTarget?.Actor))
- QueueOGCD(AID.Starcross,
- TargetChoice(sc) ?? BestDiveTarget?.Actor,
- scStrat is OGCDStrategy.Force or OGCDStrategy.AnyWeave or OGCDStrategy.EarlyWeave or OGCDStrategy.LateWeave
- ? OGCDPriority.ForcedOGCD : OGCDPriority.Starcross);
-
+ QueueOGCD(AID.Starcross, TargetChoice(sc) ?? BestDiveTarget?.Actor, OGCDPrio(scStrat, OGCDPriority.Starcross));
if (ShouldUsePotion(strategy.Option(Track.Potion).As()))
- Hints.ActionsToExecute.Push(ActionDefinitions.IDPotionStr,
- Player, ActionQueue.Priority.VeryHigh + (int)OGCDPriority.ForcedOGCD, 0, GCD - 0.9f);
-
+ Hints.ActionsToExecute.Push(ActionDefinitions.IDPotionStr, Player, ActionQueue.Priority.VeryHigh + (int)OGCDPriority.ForcedOGCD, 0, GCD - 0.9f);
if (ShouldUseTrueNorth(strategy.Option(Track.TrueNorth).As(), primaryTarget?.Actor))
QueueOGCD(AID.TrueNorth, Player, OGCDPriority.TrueNorth);
}
-
if (ShouldUsePiercingTalon(primaryTarget?.Actor, ptStrat))
- QueueGCD(AID.PiercingTalon,
- TargetChoice(pt) ?? primaryTarget?.Actor,
- ptStrat is PiercingTalonStrategy.Force or PiercingTalonStrategy.ForceEX
- ? GCDPriority.ForcedGCD : GCDPriority.NormalGCD);
+ QueueGCD(AID.PiercingTalon, TargetChoice(pt) ?? primaryTarget?.Actor, ptStrat is PiercingTalonStrategy.Force or PiercingTalonStrategy.ForceEX ? GCDPriority.ForcedGCD : GCDPriority.NormalGCD);
#endregion
#endregion
#region AI
- //AI hints for positioning
- var goalST = primaryTarget?.Actor != null ? Hints.GoalSingleTarget(primaryTarget!.Actor, 3) : null; //Set goal for single target
- var goalAOE = primaryTarget?.Actor != null ? Hints.GoalAOECone(primaryTarget!.Actor, 10, 45.Degrees()) : null; //Set goal for AOE
- var goal = AOEStrategy switch //Set goal based on AOE strategy
+ var goalST = primaryTarget?.Actor != null ? Hints.GoalSingleTarget(primaryTarget!.Actor, 3) : null;
+ var goalAOE = primaryTarget?.Actor != null ? Hints.GoalAOECone(primaryTarget!.Actor, 10, 45.Degrees()) : null;
+ var goal = AOEStrategy switch
{
- AOEStrategy.ForceST => goalST, //if forced single target
- AOEStrategy.Force123ST => goalST, //if forced 123 combo
- AOEStrategy.ForceBuffsST => goalST, //if forced buffs combo
- AOEStrategy.ForceAOE => goalAOE, //if forced AOE action
- _ => goalST != null && goalAOE != null ? Hints.GoalCombined(goalST, goalAOE, 2) : goalAOE //otherwise, combine goals
+ AOEStrategy.ForceST => goalST,
+ AOEStrategy.Force123ST => goalST,
+ AOEStrategy.ForceBuffsST => goalST,
+ AOEStrategy.ForceAOE => goalAOE,
+ _ => goalST != null && goalAOE != null ? Hints.GoalCombined(goalST, goalAOE, 2) : goalAOE
};
- if (goal != null) //if goal is set
- Hints.GoalZones.Add(goal); //add goal to zones
+ if (goal != null)
+ Hints.GoalZones.Add(goal);
#endregion
}
#region Rotation Helpers
- #region Single-Target Helpers
-
- //Determines the next skill in the single-target (ST) combo chain based on the last used action.
- private AID NextFullST() => ComboLastMove switch
+ private AID FullRotation() => ComboLastMove switch
{
- //Starting combo with TrueThrust or RaidenThrust
- AID.TrueThrust or AID.RaidenThrust =>
- //if Disembowel is Unlocked and power is low or Chaotic Spring is 0, use Disembowel or SpiralBlow, else VorpalThrust or LanceBarrage
- Unlocked(AID.Disembowel) && (powerLeft <= GCDLength * 6 || chaosLeft <= GCDLength * 4)
- ? Unlocked(AID.SpiralBlow) ? AID.SpiralBlow : AID.Disembowel
- : Unlocked(AID.LanceBarrage) ? AID.LanceBarrage : AID.VorpalThrust,
-
- //Follow-up after Disembowel or SpiralBlow
- AID.Disembowel or AID.SpiralBlow =>
- Unlocked(AID.ChaoticSpring) ? AID.ChaoticSpring //Use ChaoticSpring if Unlocked
- : Unlocked(AID.ChaosThrust) ? AID.ChaosThrust //Use ChaosThrust if Unlocked
- : AID.TrueThrust, //Return to TrueThrust otherwise
-
- //Follow-up after VorpalThrust or LanceBarrage
- AID.VorpalThrust or AID.LanceBarrage =>
- Unlocked(AID.HeavensThrust) ? AID.HeavensThrust //Use HeavensThrust if Unlocked
- : Unlocked(AID.FullThrust) ? AID.FullThrust //Use FullThrust if Unlocked
- : AID.TrueThrust, //Return to TrueThrust otherwise
-
- //After FullThrust or HeavensThrust in the combo
- AID.FullThrust or AID.HeavensThrust =>
- Unlocked(AID.FangAndClaw) ? AID.FangAndClaw //Use FangAndClaw if Unlocked
- : AID.TrueThrust, //Return to TrueThrust otherwise
+ AID.Drakesbane or AID.CoerthanTorment => ShouldUseAOE ? FullAOE() : ShouldUseDOT ? STBuffs() : FullST(),
+ AID.DoomSpike or AID.DraconianFury or AID.SonicThrust => FullAOE(),
+ AID.TrueThrust or AID.RaidenThrust or AID.VorpalThrust or AID.LanceBarrage or AID.Disembowel or AID.SpiralBlow or AID.HeavensThrust or AID.FullThrust or AID.WheelingThrust or AID.FangAndClaw => FullST(),
+ _ => ShouldUseAOE ? FullAOE() : ShouldUseDOT ? STBuffs() : FullST()
+ };
- //After ChaosThrust or ChaoticSpring in the combo
- AID.ChaosThrust or AID.ChaoticSpring =>
- Unlocked(AID.WheelingThrust) ? AID.WheelingThrust //Use WheelingThrust if Unlocked
- : AID.TrueThrust, //Return to TrueThrust otherwise
+ #region Single-Target Helpers
- //After WheelingThrust or FangAndClaw in the combo
- AID.WheelingThrust or AID.FangAndClaw =>
- Unlocked(AID.Drakesbane) ? AID.Drakesbane //Use Drakesbane if Unlocked
- : AID.TrueThrust, //Return to TrueThrust otherwise
+ #region DOT
+ private static SID[] GetDotStatus() => [SID.ChaosThrust, SID.ChaoticSpring];
+ private float ChaosRemaining(Actor? target) => target == null ? float.MaxValue : GetDotStatus().Select(stat => StatusDetails(target, (uint)stat, Player.InstanceID).Left).FirstOrDefault(dur => dur > 6);
+ #endregion
- //if no combo active and Draconian Fire buff is up, use RaidenThrust
- _ => PlayerHasEffect(SID.DraconianFire) ? AID.RaidenThrust //RaidenThrust if DraconianFire is active
- : AID.TrueThrust, //No combo, start with TrueThrust
+ private AID FullST() => ComboLastMove switch
+ {
+ AID.TrueThrust or AID.RaidenThrust => Unlocked(AID.Disembowel) && (powerLeft <= SkSGCDLength * 6 || chaosLeft <= SkSGCDLength * 4) ? Unlocked(AID.SpiralBlow) ? AID.SpiralBlow : AID.Disembowel : Unlocked(AID.LanceBarrage) ? AID.LanceBarrage : AID.VorpalThrust,
+ AID.Disembowel or AID.SpiralBlow => Unlocked(AID.ChaoticSpring) ? AID.ChaoticSpring : Unlocked(AID.ChaosThrust) ? AID.ChaosThrust : AID.TrueThrust,
+ AID.VorpalThrust or AID.LanceBarrage => Unlocked(AID.HeavensThrust) ? AID.HeavensThrust : Unlocked(AID.FullThrust) ? AID.FullThrust : AID.TrueThrust,
+ AID.FullThrust or AID.HeavensThrust => Unlocked(AID.FangAndClaw) ? AID.FangAndClaw : AID.TrueThrust,
+ AID.ChaosThrust or AID.ChaoticSpring => Unlocked(AID.WheelingThrust) ? AID.WheelingThrust : AID.TrueThrust,
+ AID.WheelingThrust or AID.FangAndClaw => Unlocked(AID.Drakesbane) ? AID.Drakesbane : AID.TrueThrust,
+ _ => PlayerHasEffect(SID.DraconianFire) ? AID.RaidenThrust : AID.TrueThrust,
};
-
- //Limits the combo sequence to just 1-2-3 ST skills, ignoring other Unlocked actions.
- private AID UseOnly123ST() => ComboLastMove switch
+ private AID STNormal() => ComboLastMove switch
{
- //Start combo with TrueThrust
- AID.TrueThrust or AID.RaidenThrust =>
- Unlocked(AID.LanceBarrage) ? AID.LanceBarrage //LanceBarrage if Unlocked
- : Unlocked(AID.VorpalThrust) ? AID.VorpalThrust //VorpalThrust otherwise
- : AID.TrueThrust, //Else return to TrueThrust
-
- //After VorpalThrust or LanceBarrage
- AID.VorpalThrust or AID.LanceBarrage =>
- Unlocked(AID.HeavensThrust) ? AID.HeavensThrust //HeavensThrust if Unlocked
- : Unlocked(AID.FullThrust) ? AID.FullThrust //FullThrust to end combo
- : AID.TrueThrust, //Else return to TrueThrust
-
- //After FullThrust or HeavensThrust
- AID.FullThrust or AID.HeavensThrust =>
- Unlocked(AID.FangAndClaw) ? AID.FangAndClaw //FangAndClaw if Unlocked
- : AID.TrueThrust, //Else return to TrueThrust
-
- //After WheelingThrust or FangAndClaw
- AID.WheelingThrust or AID.FangAndClaw =>
- Unlocked(AID.Drakesbane) ? AID.Drakesbane //Drakesbane if Unlocked
- : AID.TrueThrust, //Else return to TrueThrust
-
- //if Draconian Fire buff is up, use RaidenThrust
- _ => PlayerHasEffect(SID.DraconianFire) ? AID.RaidenThrust //RaidenThrust if DraconianFire is active
- : AID.TrueThrust, //No combo, start with TrueThrust
+ AID.TrueThrust or AID.RaidenThrust => Unlocked(AID.LanceBarrage) ? AID.LanceBarrage : Unlocked(AID.VorpalThrust) ? AID.VorpalThrust : AID.TrueThrust,
+ AID.VorpalThrust or AID.LanceBarrage => Unlocked(AID.HeavensThrust) ? AID.HeavensThrust : Unlocked(AID.FullThrust) ? AID.FullThrust : AID.TrueThrust,
+ AID.FullThrust or AID.HeavensThrust => Unlocked(AID.FangAndClaw) ? AID.FangAndClaw : AID.TrueThrust,
+ AID.WheelingThrust or AID.FangAndClaw => Unlocked(AID.Drakesbane) ? AID.Drakesbane : AID.TrueThrust,
+ _ => PlayerHasEffect(SID.DraconianFire) ? AID.RaidenThrust : AID.TrueThrust,
};
-
- //Limits the combo sequence to 1-4-5 ST skills, focusing on Disembowel and Chaos/ChaoticSpring.
- private AID UseOnly145ST() => ComboLastMove switch
+ private AID STBuffs() => ComboLastMove switch
{
- //Start combo with TrueThrust
- AID.TrueThrust or AID.RaidenThrust =>
- Unlocked(AID.Disembowel)
- ? Unlocked(AID.SpiralBlow) ? AID.SpiralBlow : AID.Disembowel //Disembowel/SpiralBlow if Unlocked
- : AID.TrueThrust, //Else return to TrueThrust
-
- //After Disembowel or SpiralBlow
- AID.Disembowel or AID.SpiralBlow =>
- Unlocked(AID.ChaoticSpring) ? AID.ChaoticSpring //ChaoticSpring if Unlocked
- : Unlocked(AID.ChaosThrust) ? AID.ChaosThrust //ChaosThrust if Unlocked
- : AID.TrueThrust, //Else return to TrueThrust
-
- //After ChaosThrust or ChaoticSpring
- AID.ChaosThrust or AID.ChaoticSpring =>
- Unlocked(AID.WheelingThrust) ? AID.WheelingThrust //WheelingThrust if Unlocked
- : AID.TrueThrust, //Else return to TrueThrust
-
- //After WheelingThrust or FangAndClaw
- AID.WheelingThrust or AID.FangAndClaw =>
- Unlocked(AID.Drakesbane) ? AID.Drakesbane //Drakesbane if Unlocked
- : AID.TrueThrust, //Else return to TrueThrust
-
- //if Draconian Fire buff is up, use RaidenThrust
- _ => PlayerHasEffect(SID.DraconianFire) ? AID.RaidenThrust //RaidenThrust if DraconianFire is active
- : AID.TrueThrust, //No combo, start with TrueThrust
+ AID.TrueThrust or AID.RaidenThrust => Unlocked(AID.Disembowel) ? (Unlocked(AID.SpiralBlow) ? AID.SpiralBlow : AID.Disembowel) : AID.TrueThrust,
+ AID.Disembowel or AID.SpiralBlow => Unlocked(AID.ChaoticSpring) ? AID.ChaoticSpring : Unlocked(AID.ChaosThrust) ? AID.ChaosThrust : AID.TrueThrust,
+ AID.ChaosThrust or AID.ChaoticSpring => Unlocked(AID.WheelingThrust) ? AID.WheelingThrust : AID.TrueThrust,
+ AID.WheelingThrust or AID.FangAndClaw => Unlocked(AID.Drakesbane) ? AID.Drakesbane : AID.TrueThrust,
+ _ => PlayerHasEffect(SID.DraconianFire) ? AID.RaidenThrust : AID.TrueThrust,
};
-
#endregion
#region AOE Helpers
-
- //Determines the next action in the AOE combo based on the last action used.
- private AID NextFullAOE() => ComboLastMove switch
+ private AID FullAOE() => ComboLastMove switch
{
- //Start AOE combo with DoomSpike
- AID.DoomSpike =>
- Unlocked(AID.SonicThrust) ? AID.SonicThrust : AID.DoomSpike, //SonicThrust if Unlocked, else DoomSpike
-
- //Continue AOE combo with SonicThrust
- AID.SonicThrust =>
- Unlocked(AID.CoerthanTorment) ? AID.CoerthanTorment : AID.DoomSpike, //CoerthanTorment if Unlocked, else DoomSpike
-
- //if Draconian Fire buff is up, use DraconianFury
- _ => PlayerHasEffect(SID.DraconianFire)
- ? Unlocked(AID.DraconianFury) ? AID.DraconianFury : AID.DoomSpike //DraconianFury if Unlocked, else DoomSpike
- : AID.DoomSpike, //No DraconianFire active, default to DoomSpike
+ AID.DoomSpike => Unlocked(AID.SonicThrust) ? AID.SonicThrust : AID.DoomSpike,
+ AID.SonicThrust => Unlocked(AID.CoerthanTorment) ? AID.CoerthanTorment : AID.DoomSpike,
+ _ => PlayerHasEffect(SID.DraconianFire) ? AID.DraconianFury : AID.DoomSpike,
};
-
#endregion
#endregion
@@ -644,7 +512,7 @@ ptStrat is PiercingTalonStrategy.Force or PiercingTalonStrategy.ForceEX
};
private bool ShouldUseWyrmwindThrust(OGCDStrategy strategy, Actor? target) => strategy switch
{
- OGCDStrategy.Automatic => Player.InCombat && target != null && In15y(target) && canWT && lcCD > GCDLength * 2,
+ OGCDStrategy.Automatic => Player.InCombat && target != null && In15y(target) && canWT && lcCD > SkSGCDLength * 2,
OGCDStrategy.Force => canWT,
OGCDStrategy.AnyWeave => canWT && CanWeaveIn,
OGCDStrategy.EarlyWeave => canWT && CanEarlyWeaveIn,
@@ -691,15 +559,15 @@ ptStrat is PiercingTalonStrategy.Force or PiercingTalonStrategy.ForceEX
};
private bool ShouldUseTrueNorth(TrueNorthStrategy strategy, Actor? target) => strategy switch
{
- TrueNorthStrategy.Automatic => target != null && Player.InCombat && !PlayerHasEffect(SID.TrueNorth) && GCD < 1.25f &&
+ TrueNorthStrategy.Automatic => target != null && Player.InCombat && CanTrueNorth && GCD < 1.25f &&
(!IsOnRear(target) && ComboLastMove is AID.Disembowel or AID.SpiralBlow or AID.ChaosThrust or AID.ChaoticSpring ||
!IsOnFlank(target) && ComboLastMove is AID.HeavensThrust or AID.FullThrust),
- TrueNorthStrategy.ASAP => target != null && Player.InCombat && !PlayerHasEffect(SID.TrueNorth) &&
+ TrueNorthStrategy.ASAP => target != null && Player.InCombat && CanTrueNorth &&
(!IsOnRear(target) && ComboLastMove is AID.Disembowel or AID.SpiralBlow or AID.ChaosThrust or AID.ChaoticSpring ||
!IsOnFlank(target) && ComboLastMove is AID.HeavensThrust or AID.FullThrust),
- TrueNorthStrategy.Flank => target != null && Player.InCombat && !PlayerHasEffect(SID.TrueNorth) && GCD < 1.25f &&
+ TrueNorthStrategy.Flank => target != null && Player.InCombat && CanTrueNorth && GCD < 1.25f &&
!IsOnFlank(target) && ComboLastMove is AID.HeavensThrust or AID.FullThrust,
- TrueNorthStrategy.Rear => target != null && Player.InCombat && !PlayerHasEffect(SID.TrueNorth) && GCD < 1.25f &&
+ TrueNorthStrategy.Rear => target != null && Player.InCombat && CanTrueNorth && GCD < 1.25f &&
!IsOnRear(target) && ComboLastMove is AID.Disembowel or AID.SpiralBlow or AID.ChaosThrust or AID.ChaoticSpring,
TrueNorthStrategy.Force => !PlayerHasEffect(SID.TrueNorth),
TrueNorthStrategy.Delay => false,
diff --git a/BossMod/Autorotation/Standard/akechi/Tank/AkechiGNB.cs b/BossMod/Autorotation/Standard/akechi/Tank/AkechiGNB.cs
index 3c2230576..014130707 100644
--- a/BossMod/Autorotation/Standard/akechi/Tank/AkechiGNB.cs
+++ b/BossMod/Autorotation/Standard/akechi/Tank/AkechiGNB.cs
@@ -10,7 +10,7 @@ public sealed class AkechiGNB(RotationModuleManager manager, Actor player) : Ake
{
#region Enums: Abilities / Strategies
public enum Track { AOE, Cooldowns, Cartridges, Potion, LightningShot, NoMercy, SonicBreak, GnashingFang, Reign, Bloodfest, DoubleDown, Zone, BowShock }
- public enum AOEStrategy { AutoFinishCombo, AutoBreakCombo, ForceSTwithO, ForceSTwithoutO, ForceAOEwithO, ForceAOEwithoutO, GenerateDowntime }
+ public enum AOEStrategy { AutoFinish, AutoBreak, ForceSTwithO, ForceSTwithoutO, ForceAOEwithO, ForceAOEwithoutO, GenerateDowntime }
public enum CooldownStrategy { Allow, Forbid }
public enum CartridgeStrategy { Automatic, OnlyBS, OnlyFC, ForceBS, ForceBS1, ForceBS2, ForceBS3, ForceFC, ForceFC1, ForceFC2, ForceFC3, Conserve }
public enum PotionStrategy { Manual, AlignWithRaidBuffs, Immediate }
@@ -35,8 +35,8 @@ public static RotationModuleDefinition Definition()
100); //Level supported
res.Define(Track.AOE).As("AOE", uiPriority: 200)
- .AddOption(AOEStrategy.AutoFinishCombo, "Auto (Finish Combo)", "Auto-selects best rotation dependant on targets; Finishes combo first", supportedTargets: ActionTargets.Hostile)
- .AddOption(AOEStrategy.AutoBreakCombo, "Auto (Break Combo)", "Auto-selects best rotation dependant on targets; Breaks combo if needed", supportedTargets: ActionTargets.Hostile)
+ .AddOption(AOEStrategy.AutoFinish, "Auto (Finish combo)", "Automatically execute optimal rotation based on targets; finishes combo if possible", supportedTargets: ActionTargets.Hostile)
+ .AddOption(AOEStrategy.AutoBreak, "Auto (Break combo)", "Automatically execute optimal rotation based on targets; breaks combo if necessary", supportedTargets: ActionTargets.Hostile)
.AddOption(AOEStrategy.ForceSTwithO, "Force ST with Overcap", "Force single-target rotation with overcap protection", supportedTargets: ActionTargets.Hostile)
.AddOption(AOEStrategy.ForceSTwithoutO, "Force ST without Overcap", "Force ST rotation without overcap protection", supportedTargets: ActionTargets.Hostile)
.AddOption(AOEStrategy.ForceAOEwithO, "Force AOE with Overcap", "Force AOE rotation with overcap protection")
@@ -350,7 +350,7 @@ public override void Execution(StrategyValues strategy, Enemy? primaryTarget)
#endregion
#region Standard Execution
- if (AOEStrategy == AOEStrategy.AutoBreakCombo) //if Break Combo option is selected
+ if (AOEStrategy == AOEStrategy.AutoBreak) //if Break Combo option is selected
{
if (ShouldUseAOE) //if AOE rotation should be used
QueueGCD(AOEwithoutOvercap(), //queue the next AOE combo action
@@ -362,7 +362,7 @@ public override void Execution(StrategyValues strategy, Enemy? primaryTarget)
?? primaryTarget?.Actor, //if none, choose primary target
GCDPriority.Standard); //with priority for 123/12 combo actions
}
- if (AOEStrategy == AOEStrategy.AutoFinishCombo) //if Finish Combo option is selected
+ if (AOEStrategy == AOEStrategy.AutoFinish) //if Finish Combo option is selected
{
QueueGCD(BestRotation(), //queue the next single-target combo action only if combo is finished
TargetChoice(AOE) //Get target choice