Skip to content
This repository has been archived by the owner on Aug 28, 2024. It is now read-only.

Commit

Permalink
feat: add duty action choice.
Browse files Browse the repository at this point in the history
  • Loading branch information
ArchiDog1998 committed Feb 4, 2024
1 parent 99c7da3 commit 008550d
Show file tree
Hide file tree
Showing 13 changed files with 1,920 additions and 88 deletions.
64 changes: 64 additions & 0 deletions DefaultRotations/Duty/BozjaDefault.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
using RotationSolver.Basic.Rotations.Duties;

namespace DefaultRotations.Duty;

[Rotation("Bozja Default")]
internal class BozjaDefault : BozjaRotation
{
public override bool ProvokeAbility(out IAction? act)
{
if (VariantUltimatumPvE.CanUse(out act)) return true;
return base.ProvokeAbility(out act);
}

public override bool AttackAbility(out IAction? act)
{
if (VariantSpiritDartPvE.CanUse(out act, skipAoeCheck: true)) return true;
if (VariantSpiritDartPvE_33863.CanUse(out act, skipAoeCheck: true)) return true;
if (VariantRampartPvE.CanUse(out act)) return true;
if (VariantRampartPvE_33864.CanUse(out act)) return true;
return base.AttackAbility(out act);
}

public override bool HealSingleGCD(out IAction? act)
{
if (VariantCurePvE.CanUse(out act)) return true;
if (VariantCurePvE_33862.CanUse(out act)) return true;
return base.HealSingleGCD(out act);
}

public override bool DefenseSingleGCD(out IAction? act)
{
if (LostStoneskinPvE.CanUse(out act)) return true;
return base.DefenseSingleGCD(out act);
}

public override bool DefenseAreaGCD(out IAction? act)
{
if (LostStoneskinIiPvE.CanUse(out act)) return true;
return base.DefenseAreaGCD(out act);
}

public override 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
return base.EmergencyGCD(out act);
}
}
8 changes: 8 additions & 0 deletions RotationSolver.Basic/Attributes/DutyTerritoryAttribute.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
namespace RotationSolver.Basic.Attributes;

[AttributeUsage(AttributeTargets.Class)]
public class DutyTerritoryAttribute(params uint[] territoryIds) : Attribute
{
public uint[] TerritoryIds => territoryIds;
}

7 changes: 7 additions & 0 deletions RotationSolver.Basic/Attributes/IDAttribute.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
namespace RotationSolver.Basic.Attributes;

[AttributeUsage(AttributeTargets.Property)]
public class IDAttribute(uint id) : Attribute
{
public uint ID => id;
}
4 changes: 2 additions & 2 deletions RotationSolver.Basic/Attributes/RotationAttribute.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@
namespace RotationSolver.Basic.Attributes;

[AttributeUsage(AttributeTargets.Class)]
public class RotationAttribute : Attribute
public class RotationAttribute(string name) : Attribute
{
public string? Name { get; set; }
public string Name => name;
public string? Description { get; set; }
public CombatType Type { get; set; } = CombatType.None;

Expand Down
2 changes: 2 additions & 0 deletions RotationSolver.Basic/Configuration/Configs.cs
Original file line number Diff line number Diff line change
Expand Up @@ -735,6 +735,8 @@ public const string
[JobChoiceConfig]
private readonly Dictionary<string, string> _rotationsConfigurations = [];

public Dictionary<uint, string> DutyRotationChoice { get; set; } = [];

public void Save()
{
#if DEBUG
Expand Down
11 changes: 10 additions & 1 deletion RotationSolver.Basic/Helpers/ReflectionHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ where typeof(T).IsAssignableFrom(prop.PropertyType)

internal static IEnumerable<MethodInfo> GetAllMethodInfo(this Type? type)
{
if (type == null) return Array.Empty<MethodInfo>();
if (type == null) return [];

var methods = from method in type.GetRuntimeMethods()
where !method.IsConstructor
Expand All @@ -27,6 +27,15 @@ internal static IEnumerable<MethodInfo> GetAllMethodInfo(this Type? type)
return methods.Union(type.BaseType.GetAllMethodInfo());
}

internal static IEnumerable<PropertyInfo> GetAllPropertyInfo(this Type? type)
{
if (type == null) return [];

var methods = type.GetRuntimeProperties();

return methods.Union(type.BaseType.GetAllPropertyInfo());
}

internal static PropertyInfo? GetPropertyInfo(this Type type, string name)
{
if (type == null) return null;
Expand Down
69 changes: 6 additions & 63 deletions RotationSolver.Basic/Rotations/Duties/BozjaRotation.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
namespace RotationSolver.Basic.Rotations.Duties;

partial class DutyRotation
[DutyTerritory] //TODO: the bozja territory ids!
public abstract class BozjaRotation : DutyRotation
{
}

partial class DutyRotation
{
static partial void ModifyLostSpellforgePvE(ref ActionSetting setting)
{
setting.TargetType = TargetType.Physical;
Expand Down Expand Up @@ -87,65 +91,4 @@ static partial void ModifyLostSeraphStrikePvE(ref ActionSetting setting)
{
setting.TargetStatusProvide = [StatusID.ClericStance_2484];
}
}

[DutyTerritory] //TODO: the bozja territory ids!
public class BozjaRotation : DutyRotation
{
public override bool ProvokeAbility(out IAction? act)
{
if (VariantUltimatumPvE.CanUse(out act)) return true;
return base.ProvokeAbility(out act);
}

public override bool AttackAbility(out IAction? act)
{
if (VariantSpiritDartPvE.CanUse(out act, skipAoeCheck: true)) return true;
if (VariantSpiritDartPvE_33863.CanUse(out act, skipAoeCheck: true)) return true;
if (VariantRampartPvE.CanUse(out act)) return true;
if (VariantRampartPvE_33864.CanUse(out act)) return true;
return base.AttackAbility(out act);
}

public override bool HealSingleGCD(out IAction? act)
{
if (VariantCurePvE.CanUse(out act)) return true;
if (VariantCurePvE_33862.CanUse(out act)) return true;
return base.HealSingleGCD(out act);
}

public override bool DefenseSingleGCD(out IAction? act)
{
if (LostStoneskinPvE.CanUse(out act)) return true;
return base.DefenseSingleGCD(out act);
}

public override bool DefenseAreaGCD(out IAction? act)
{
if (LostStoneskinIiPvE.CanUse(out act)) return true;
return base.DefenseAreaGCD(out act);
}

public override 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
return base.EmergencyGCD(out act);
}
}
}
17 changes: 11 additions & 6 deletions RotationSolver.Basic/Rotations/Duties/DutyRotation.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,5 @@
namespace RotationSolver.Basic.Rotations.Duties;

[AttributeUsage(AttributeTargets.Class)]
public class DutyTerritoryAttribute(params uint[] territoryIds) : Attribute
{
public uint[] TerritoryIds => territoryIds;
}

partial class DutyRotation
{
#region GCD
Expand Down Expand Up @@ -122,4 +116,15 @@ public virtual bool AttackAbility(out IAction? act)
act = null; return false;
}
#endregion

internal IAction[] AllActions
{
get
{
var properties = this.GetType().GetAllPropertyInfo()
.Where(p => DataCenter.DutyActions.Contains(p.GetCustomAttribute<IDAttribute>()?.ID ?? 0));

return [.. properties.Select(p => (IAction)p.GetValue(this)!)];
}
}
}
1 change: 1 addition & 0 deletions RotationSolver.GameData/Util.cs
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ public static string ToCode(this Lumina.Excel.GeneratedSheets.Action item,
/// {{actionDescName}}
/// {{desc}}
/// </summary>
{{(isDuty ? $"[ID({item.RowId})]" : string.Empty)}}
{{(item.ActionCategory.Row is 9 or 15 ? "private" : "public")}} IBaseAction {{actionName}} => _{{actionName}}Creator.Value;
""";
}
Expand Down
Loading

0 comments on commit 008550d

Please sign in to comment.