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;
}