diff --git a/RotationSolver.Basic/Actions/BaseAction_BasicInfo.cs b/RotationSolver.Basic/Actions/BaseAction_BasicInfo.cs index 4b1b353ac..0d9a14ac7 100644 --- a/RotationSolver.Basic/Actions/BaseAction_BasicInfo.cs +++ b/RotationSolver.Basic/Actions/BaseAction_BasicInfo.cs @@ -57,7 +57,7 @@ public partial class BaseAction : IBaseAction /// /// Is this duty action on the slot. /// - public bool IsDutyActionOnSlot => DataCenter.BluSlots.Contains(AdjustedID); + public bool IsDutyActionOnSlot => DataCenter.DutyActions.Contains(AdjustedID); /// /// How many gcd left to add the dot. diff --git a/RotationSolver.Basic/Configuration/MacroInfo.cs b/RotationSolver.Basic/Configuration/MacroInfo.cs index 5525119cb..a89a2824f 100644 --- a/RotationSolver.Basic/Configuration/MacroInfo.cs +++ b/RotationSolver.Basic/Configuration/MacroInfo.cs @@ -20,10 +20,13 @@ public unsafe bool AddMacro(GameObject tar = null) try { +#if DEBUG +#else var shared = RaptureMacroModule.Instance()->SharedSpan[MacroIndex]; var individual = RaptureMacroModule.Instance()->IndividualSpan[MacroIndex]; DataCenter.Macros.Enqueue(new MacroItem(tar, IsShared ? &shared : &individual)); +#endif return true; } catch (Exception ex) diff --git a/RotationSolver.Basic/Data/ActionID.cs b/RotationSolver.Basic/Data/ActionID.cs index 0a8a87255..dea27aeea 100644 --- a/RotationSolver.Basic/Data/ActionID.cs +++ b/RotationSolver.Basic/Data/ActionID.cs @@ -3562,7 +3562,7 @@ public enum ActionID : uint Sprint = 3, #endregion - #region VariantActions + #region Variant Actions /// /// /// @@ -3608,4 +3608,77 @@ public enum ActionID : uint /// VariantRampart2 = 33864, #endregion + + #region Bozja Actions + + /// + /// + /// + LostSpellforge = 20706, + + /// + /// + /// + LostSteelsting = 20707, + + /// + /// + /// + LostRampage = 23910, + + /// + /// + /// + LostBurst = 23909, + + /// + /// + /// + LostBravery = 20713, + + /// + /// + /// + LostProtect = 20719, + + /// + /// + /// + LostShell = 20710, + + /// + /// + /// + LostProtect2 = 23915, + + /// + /// + /// + LostShell2 = 23916, + + /// + /// + /// + LostBubble = 23917, + + /// + /// + /// + LostStoneskin = 20712, + + /// + /// + /// + LostStoneskin2 = 23908, + + /// + /// + /// + LostFlarestar = 22352, + + /// + /// + /// + LostSeraphStrike = 22354, + #endregion } diff --git a/RotationSolver.Basic/Data/StatusID.cs b/RotationSolver.Basic/Data/StatusID.cs index 44d212d20..071be6b1e 100644 --- a/RotationSolver.Basic/Data/StatusID.cs +++ b/RotationSolver.Basic/Data/StatusID.cs @@ -1356,4 +1356,80 @@ public enum StatusID : ushort /// /// CollectiveUnconscious = 849, + + /// + /// + /// + LostSpellforge = 2338, + + /// + /// + /// + MagicalAversion = 2370, + + /// + /// + /// + LostSteelsting = 2339, + + /// + /// + /// + PhysicalAversion = 2369, + + /// + /// + /// + LostRampage = 2559, + + /// + /// + /// + LostBurst = 2558, + + /// + /// + /// + LostBravery = 2341, + + /// + /// + /// + LostProtect = 2333, + + /// + /// + /// + LostShell = 2334, + + /// + /// + /// + LostProtect2 = 2561, + + /// + /// + /// + LostShell2 = 2562, + + /// + /// + /// + LostBubble = 2563, + + /// + /// + /// + LostStoneskin = 151, + + /// + /// + /// + LostFlarestar = 2440, + + /// + /// + /// + LostSeraphStrike = 2484, + } diff --git a/RotationSolver.Basic/Rotations/CustomRotation_Actions.cs b/RotationSolver.Basic/Rotations/CustomRotation_Actions.cs index 0fb8b5712..62e75b9ae 100644 --- a/RotationSolver.Basic/Rotations/CustomRotation_Actions.cs +++ b/RotationSolver.Basic/Rotations/CustomRotation_Actions.cs @@ -1,4 +1,5 @@ -using ECommons.GameFunctions; +using ECommons.ExcelServices; +using ECommons.GameFunctions; using RotationSolver.Basic.Traits; namespace RotationSolver.Basic.Rotations; @@ -286,6 +287,179 @@ public override bool CanUse(out IAction act, CanUseOption option = CanUseOption. /// public static IBaseAction VariantRampart2 { get; } = new RoleAction(ActionID.VariantRampart2, new JobRole[] { JobRole.Melee, JobRole.Healer, JobRole.RangedMagical, JobRole.RangedPhysical }, ActionOption.Buff | ActionOption.DutyAction); + + /// + /// + /// + public static IBaseAction LostSpellforge { get; } = new BaseAction(ActionID.LostSpellforge, + ActionOption.DutyAction | ActionOption.Friendly) + { + StatusProvide = new StatusID[] {StatusID.LostSpellforge }, + ActionCheck = (b, m) => Target?.HasStatus(false, StatusID.MagicalAversion) ?? false, + ChoiceTarget = (targets, mustUse) => targets.FirstOrDefault(t => + { + switch((Job)t.ClassJob.Id) + { + case Job.WAR: + case Job.GNB: + case Job.MNK: + case Job.SAM: + case Job.DRG: + case Job.MCH: + case Job.DNC: + + case Job.PLD: + case Job.DRK: + case Job.NIN: + case Job.BRD: + case Job.RDM: + return true; + } + return false; + }), + }; + + /// + /// + /// + public static IBaseAction LostSteelsting { get; } = new BaseAction(ActionID.LostSteelsting, + ActionOption.DutyAction | ActionOption.Friendly) + { + StatusProvide = new StatusID[] { StatusID.LostSteelsting }, + ActionCheck = (b, m) => Target?.HasStatus(false, StatusID.PhysicalAversion) ?? false, + ChoiceTarget = (targets, mustUse) => targets.FirstOrDefault(t => + { + switch ((Job)t.ClassJob.Id) + { + case Job.WHM: + case Job.SCH: + case Job.AST: + case Job.SGE: + case Job.BLM: + case Job.SMN: + + case Job.PLD: + case Job.DRK: + case Job.NIN: + case Job.BRD: + case Job.RDM: + return true; + } + + return false; + }), + }; + + /// + /// + /// + public static IBaseAction LostRampage { get; } = new BaseAction(ActionID.LostRampage, + ActionOption.DutyAction | ActionOption.Friendly) + { + StatusProvide = new StatusID[] { StatusID.LostRampage }, + ActionCheck = (b, m) => Target?.HasStatus(false, StatusID.PhysicalAversion) ?? false, + }; + + /// + /// + /// + public static IBaseAction LostBurst { get; } = new BaseAction(ActionID.LostBurst, + ActionOption.DutyAction | ActionOption.Friendly) + { + StatusProvide = new StatusID[] { StatusID.LostBurst }, + ActionCheck = (b, m) => Target?.HasStatus(false, StatusID.MagicalAversion) ?? false, + }; + + /// + /// + /// + public static IBaseAction LostBravery { get; } = new BaseAction(ActionID.LostBravery, + ActionOption.DutyAction | ActionOption.Friendly) + { + StatusProvide = new StatusID[] { StatusID.LostBravery }, + }; + + /// + /// + /// + public static IBaseAction LostProtect { get; } = new BaseAction(ActionID.LostProtect, + ActionOption.DutyAction | ActionOption.Friendly) + { + StatusProvide = new StatusID[] { StatusID.LostProtect, StatusID.LostProtect2 }, + }; + + /// + /// + /// + public static IBaseAction LostShell { get; } = new BaseAction(ActionID.LostShell, + ActionOption.DutyAction | ActionOption.Friendly) + { + StatusProvide = new StatusID[] { StatusID.LostShell, StatusID.LostShell2 }, + }; + + /// + /// + /// + public static IBaseAction LostProtect2 { get; } = new BaseAction(ActionID.LostProtect2, + ActionOption.DutyAction | ActionOption.Friendly) + { + StatusProvide = new StatusID[] { StatusID.LostProtect2 }, + }; + + /// + /// + /// + public static IBaseAction LostShell2 { get; } = new BaseAction(ActionID.LostShell2, + ActionOption.DutyAction | ActionOption.Friendly) + { + StatusProvide = new StatusID[] { StatusID.LostShell2 }, + }; + + /// + /// + /// + public static IBaseAction LostBubble { get; } = new BaseAction(ActionID.LostBubble, + ActionOption.DutyAction | ActionOption.Friendly) + { + StatusProvide = new StatusID[] { StatusID.LostBubble }, + }; + + /// + /// + /// + public static IBaseAction LostStoneskin { get; } = new BaseAction(ActionID.LostStoneskin, + ActionOption.DutyAction | ActionOption.Defense) + { + ChoiceTarget = TargetFilter.FindAttackedTarget, + StatusProvide = new StatusID[] { StatusID.LostStoneskin }, + }; + + /// + /// + /// + public static IBaseAction LostStoneskin2 { get; } = new BaseAction(ActionID.LostStoneskin2, + ActionOption.DutyAction | ActionOption.Defense) + { + StatusProvide = new StatusID[] { StatusID.LostStoneskin }, + }; + + /// + /// + /// + public static IBaseAction LostFlarestar { get; } = new BaseAction(ActionID.LostFlarestar, + ActionOption.DutyAction) + { + StatusProvide = new StatusID[] { StatusID.LostFlarestar }, + }; + + /// + /// + /// + public static IBaseAction LostSeraphStrike { get; } = new BaseAction(ActionID.LostSeraphStrike, + ActionOption.DutyAction) + { + StatusProvide = new StatusID[] { StatusID.LostSeraphStrike }, + }; #endregion IBaseAction[] _allBaseActions; diff --git a/RotationSolver.Basic/Rotations/CustomRotation_GCD.cs b/RotationSolver.Basic/Rotations/CustomRotation_GCD.cs index 7df399c16..1c0cef86c 100644 --- a/RotationSolver.Basic/Rotations/CustomRotation_GCD.cs +++ b/RotationSolver.Basic/Rotations/CustomRotation_GCD.cs @@ -144,6 +144,24 @@ private bool RaiseAction(out IAction act, CanUseOption option = CanUseOption.Non /// protected virtual bool EmergencyGCD(out IAction act) { + #region Bozja + if (LostSpellforge.CanUse(out act)) return true; + if (LostSteelsting.CanUse(out act)) return true; + if (LostRampage.CanUse(out act)) return true; + if (LostBurst.CanUse(out act)) return true; + + if (LostBravery.CanUse(out act)) return true; + if (LostBubble.CanUse(out act)) return true; + if (LostShell2.CanUse(out act)) return true; + if (LostShell.CanUse(out act)) return true; + if (LostProtect2.CanUse(out act)) return true; + if (LostProtect.CanUse(out act)) return true; + + //Add your own logic here. + //if (LostFlarestar.CanUse(out act)) return true; + //if (LostSeraphStrike.CanUse(out act)) return true; + + #endregion act = null; return false; } @@ -190,6 +208,8 @@ protected virtual bool HealAreaGCD(out IAction act) [RotationDesc(DescType.DefenseSingleGCD)] protected virtual bool DefenseSingleGCD(out IAction act) { + if (LostStoneskin.CanUse(out act)) return true; + act = null; return false; } @@ -201,6 +221,8 @@ protected virtual bool DefenseSingleGCD(out IAction act) [RotationDesc(DescType.DefenseAreaGCD)] protected virtual bool DefenseAreaGCD(out IAction act) { + if (LostStoneskin2.CanUse(out act)) return true; + act = null; return false; }