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

Commit

Permalink
fix: add aoeCount to CanUse method.
Browse files Browse the repository at this point in the history
  • Loading branch information
ArchiDog1998 committed Jul 29, 2023
1 parent 47d35f6 commit 16eebc5
Show file tree
Hide file tree
Showing 8 changed files with 167 additions and 57 deletions.
5 changes: 3 additions & 2 deletions RotationSolver.Basic/Actions/BaseAction_ActionInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,9 +66,10 @@ private bool WillCooldown
/// </summary>
/// <param name="act"></param>
/// <param name="option"></param>
/// <param name="aoeCount"></param>
/// <param name="gcdCountForAbility"></param>
/// <returns></returns>
public unsafe virtual bool CanUse(out IAction act, CanUseOption option = CanUseOption.None, byte gcdCountForAbility = 0)
public unsafe virtual bool CanUse(out IAction act, CanUseOption option = CanUseOption.None, byte aoeCount = 0, byte gcdCountForAbility = 0)
{
option |= OtherOption;

Expand Down Expand Up @@ -139,7 +140,7 @@ public unsafe virtual bool CanUse(out IAction act, CanUseOption option = CanUseO
if (IsGeneralGCD && IsEot && IsFriendly && IActionHelper.IsLastGCD(true, this)
&& DataCenter.TimeSinceLastAction.TotalSeconds < 3) return false;

if (!FindTarget(mustUse, out var target) || target == null) return false;
if (!FindTarget(mustUse, aoeCount, out var target) || target == null) return false;

if (ActionCheck != null && !ActionCheck(target, mustUse)) return false;

Expand Down
4 changes: 2 additions & 2 deletions RotationSolver.Basic/Actions/BaseAction_Target.cs
Original file line number Diff line number Diff line change
Expand Up @@ -82,9 +82,9 @@ internal static bool TankBreakOtherCheck(Job id)
&& DataCenter.PartyMembersAverHP > tankHealth + 0.01f;
}

private bool FindTarget(bool mustUse, out BattleChara target)
private bool FindTarget(bool mustUse, byte aoeCount, out BattleChara target)
{
int aoeCount = mustUse ? 1 : AOECount;
aoeCount = Math.Max(aoeCount, mustUse ? (byte)1 : AOECount);

Position = Player.Object.Position;
var player = Player.Object;
Expand Down
3 changes: 2 additions & 1 deletion RotationSolver.Basic/Actions/IBaseAction.cs
Original file line number Diff line number Diff line change
Expand Up @@ -83,9 +83,10 @@ public interface IBaseAction : IAction
/// </summary>
/// <param name="act"></param>
/// <param name="option">Options about using this method.</param>
/// <param name="aoeCount">How many targets do you want this skill to affect</param>
/// <param name="gcdCountForAbility">The count of gcd for ability to delay. Only used in BLM right now</param>
/// <returns>Should I use.</returns>
bool CanUse(out IAction act, CanUseOption option = CanUseOption.None, byte gcdCountForAbility = 0);
bool CanUse(out IAction act, CanUseOption option = CanUseOption.None, byte aoeCount = 0, byte gcdCountForAbility = 0);

#region CoolDown
/// <summary>
Expand Down
2 changes: 1 addition & 1 deletion RotationSolver.Basic/Rotations/Basic/BLM_Base.cs
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ internal ElementAction(ActionID actionID) : base(actionID)
/// <param name="option"></param>
/// <param name="gcdCountForAbility"></param>
/// <returns></returns>
public override bool CanUse(out IAction act, CanUseOption option = CanUseOption.None, byte gcdCountForAbility = 0)
public override bool CanUse(out IAction act, CanUseOption option = CanUseOption.None, byte aoeCount = 0, byte gcdCountForAbility = 0)
{
if (ElementTimeEndAfter(CastTime - 0.1f))
{
Expand Down
2 changes: 1 addition & 1 deletion RotationSolver.Basic/Rotations/Basic/BLU_Base.cs
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ internal BLUAction(ActionID actionID, ActionOption option = ActionOption.None)
/// <param name="option"></param>
/// <param name="gcdCountForAbility"></param>
/// <returns></returns>
public override bool CanUse(out IAction act, CanUseOption option = CanUseOption.None, byte gcdCountForAbility = 0)
public override bool CanUse(out IAction act, CanUseOption option = CanUseOption.None, byte aoeCount = 0, byte gcdCountForAbility = 0)
{
act = null;

Expand Down
1 change: 1 addition & 0 deletions RotationSolver.Basic/Rotations/CustomRotation_OtherInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -399,6 +399,7 @@ protected static float GCDTime(uint gcdCount = 0, float offset = 0)
/// </summary>
/// <param name="range"></param>
/// <returns></returns>
[Obsolete]
protected static int NumberOfHostilesIn(float range)
=> DataCenter.HostileTargets.Count(o => o.DistanceToPlayer() <= range);

Expand Down
193 changes: 143 additions & 50 deletions RotationSolver/UI/RotationConfigWindowNew.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Dalamud.Interface.Windowing;
using Dalamud.Utility;
using ECommons.ExcelServices;
using ECommons.GameHelpers;
using RotationSolver.Helpers;
Expand All @@ -10,8 +11,14 @@ namespace RotationSolver.UI;
public class RotationConfigWindowNew : Window
{
private static float _scale => ImGuiHelpers.GlobalScale;

private RotationConfigWindowTab _activeTab;

private const float MIN_COLUMN_WIDTH = 30;
private const float JOB_ICON_WIDTH = 50;

public RotationConfigWindowNew()
: base(nameof(RotationConfigWindowNew), 0, false)
: base(nameof(RotationConfigWindowNew), ImGuiWindowFlags.NoScrollbar, false)
{
SizeCondition = ImGuiCond.FirstUseEver;
Size = new Vector2(740f, 490f);
Expand All @@ -20,11 +27,17 @@ public RotationConfigWindowNew()

public override void Draw()
{
ImGui.Columns(2);
DrawSideBar();
ImGui.NextColumn();
DrawBody();
ImGui.Columns(1);
if(ImGui.BeginTable("Rotation Config Table", 2, ImGuiTableFlags.Resizable))
{
ImGui.TableSetupColumn("Rotation Config Side Bar", ImGuiTableColumnFlags.WidthFixed, 100 * _scale);
ImGui.TableNextColumn();
DrawSideBar();
ImGui.TableNextColumn();

DrawBody();

ImGui.EndTable();
}
}

private void DrawSideBar()
Expand All @@ -37,6 +50,17 @@ private void DrawSideBar()

ImGui.Separator();

ImGui.PushStyleVar(ImGuiStyleVar.SelectableTextAlign, new Vector2(0.5f, 0.5f));
foreach (var item in Enum.GetValues<RotationConfigWindowTab>())
{
if (item.GetAttribute<TabSkipAttribute>() != null) continue;

if(ImGui.Selectable(item.ToString(), _activeTab == item, ImGuiSelectableFlags.None, new Vector2(0, 20)))
{
_activeTab = item;
}
}
ImGui.PopStyleVar();
ImGui.EndChild();
}
}
Expand All @@ -46,98 +70,109 @@ private void DrawHeader(float wholeWidth)
var rotations = RotationUpdater.CustomRotations.FirstOrDefault(i => i.ClassJobIds.Contains((Job)Player.Object.ClassJob.Id))?.Rotations ?? Array.Empty<ICustomRotation>();
var rotation = RotationUpdater.RightNowRotation;

var size = MathF.Max(_scale * MathF.Min(wholeWidth, _scale * 150), 100);
var size = MathF.Max(_scale * MathF.Min(wholeWidth, _scale * 120), _scale * MIN_COLUMN_WIDTH);

var logo = IconSet.GetTexture("https://raw.githubusercontent.com/ArchiDog1998/RotationSolver/main/docs/RotationSolverIcon_128.png");
logo = IconSet.GetTexture("https://raw.githubusercontent.com/ArchiDog1998/RotationSolver/main/docs/assets/HowAndWhenToClick.svg");


if (logo != null)
{
DrawItemMiddle(() =>
{
if (SilenceImageButton(logo.ImGuiHandle, Vector2.One * size))
if (SilenceImageButton(logo.ImGuiHandle, Vector2.One * size,
_activeTab == RotationConfigWindowTab.About))
{

_activeTab = RotationConfigWindowTab.About;
}
}, wholeWidth, size);

ImGui.Spacing();
}

var iconSize = _scale * 50;
var iconSize = Math.Max(_scale * MIN_COLUMN_WIDTH, Math.Min(wholeWidth, _scale * JOB_ICON_WIDTH));
var comboSize = ImGui.CalcTextSize(rotation.RotationName).X + _scale * 30;
size = comboSize + iconSize + ImGui.GetStyle().ItemSpacing.X;

DrawItemMiddle(() =>
{
var rotationIcon = rotation.GetTexture();
if (rotationIcon != null && SilenceImageButton(rotationIcon.ImGuiHandle, Vector2.One * iconSize))
if (rotationIcon != null && SilenceImageButton(rotationIcon.ImGuiHandle,
Vector2.One * iconSize, _activeTab == RotationConfigWindowTab.Rotation))
{

_activeTab = RotationConfigWindowTab.Rotation;
}
var desc = rotation.Name + $" ({rotation.RotationName})";
if (!string.IsNullOrEmpty(rotation.Description)) desc += "\n \n" + rotation.Description;
ImguiTooltips.HoveredTooltip(desc);

ImGui.SameLine();
if (wholeWidth > _scale * JOB_ICON_WIDTH)
{
ImGui.SameLine();

ImGui.BeginGroup();
ImGui.SetNextItemWidth(comboSize);
ImGui.PushStyleColor(ImGuiCol.Text, rotation.GetColor());
var isStartCombo = ImGui.BeginCombo("##RotationName:" + rotation.Name, rotation.RotationName);
ImGui.PopStyleColor();
ImGui.BeginGroup();
ImGui.SetNextItemWidth(comboSize);
ImGui.PushStyleColor(ImGuiCol.Text, rotation.GetColor());
var isStartCombo = ImGui.BeginCombo("##RotationName:" + rotation.Name, rotation.RotationName);
ImGui.PopStyleColor();

if (isStartCombo)
{
foreach (var r in rotations)
if (isStartCombo)
{
ImGui.PushStyleColor(ImGuiCol.Text, r.GetColor());
if (ImGui.Selectable(r.RotationName))
foreach (var r in rotations)
{
Service.Config.RotationChoices[rotation.ClassJob.RowId] = r.GetType().FullName;
Service.Config.Save();
ImGui.PushStyleColor(ImGuiCol.Text, r.GetColor());
if (ImGui.Selectable(r.RotationName))
{
Service.Config.RotationChoices[rotation.ClassJob.RowId] = r.GetType().FullName;
Service.Config.Save();
}
ImguiTooltips.HoveredTooltip(r.Description);
ImGui.PopStyleColor();
}
if (ImGui.IsItemHovered())
{
//showToolTip?.Invoke(r);
}
ImGui.PopStyleColor();
ImGui.EndCombo();
}
ImGui.EndCombo();
}

var warning = !rotation.IsValid ? string.Format(LocalizationManager.RightLang.ConfigWindow_Rotation_InvalidRotation,
rotation.GetType().Assembly.GetInfo().Author)
: rotation.IsBeta() ? LocalizationManager.RightLang.ConfigWindow_Rotation_BetaRotation : string.Empty;
var warning = !rotation.IsValid ? string.Format(LocalizationManager.RightLang.ConfigWindow_Rotation_InvalidRotation,
rotation.GetType().Assembly.GetInfo().Author)
: rotation.IsBeta() ? LocalizationManager.RightLang.ConfigWindow_Rotation_BetaRotation : string.Empty;

warning = string.IsNullOrEmpty(warning) ? LocalizationManager.RightLang.ConfigWindow_Helper_SwitchRotation
: warning + "\n \n" + LocalizationManager.RightLang.ConfigWindow_Helper_SwitchRotation;
ImguiTooltips.HoveredTooltip(warning);
warning = string.IsNullOrEmpty(warning) ? LocalizationManager.RightLang.ConfigWindow_Helper_SwitchRotation
: warning + "\n \n" + LocalizationManager.RightLang.ConfigWindow_Helper_SwitchRotation;
ImguiTooltips.HoveredTooltip(warning);

ImGui.TextDisabled(" - " + LocalizationManager.RightLang.ConfigWindow_Helper_GameVersion + ": ");
ImGui.SameLine();
ImGui.Text(rotation.GameVersion);
ImGui.EndGroup();
var slash = " - ";
ImGui.TextDisabled(slash);
ImGui.SameLine();

}, wholeWidth, size, true);
var gameVersion = LocalizationManager.RightLang.ConfigWindow_Helper_GameVersion + ": ";
if(ImGui.CalcTextSize(slash + gameVersion + rotation.GameVersion).X + ImGui.GetCursorPosX() - ImGui.GetStyle().ItemSpacing.X < wholeWidth)
{
ImGui.TextDisabled(gameVersion);
ImGui.SameLine();
}
ImGui.Text(rotation.GameVersion);
ImGui.EndGroup();
}
}, wholeWidth, size);

}

private static bool SilenceImageButton(IntPtr handle, Vector2 size)
private unsafe static bool SilenceImageButton(IntPtr handle, Vector2 size, bool selected)
{
ImGui.PushStyleColor(ImGuiCol.ButtonActive, 0);
ImGui.PushStyleColor(ImGuiCol.Button, 0);
ImGui.PushStyleColor(ImGuiCol.ButtonActive,ImGui.ColorConvertFloat4ToU32(*ImGui.GetStyleColorVec4(ImGuiCol.HeaderActive)));
ImGui.PushStyleColor(ImGuiCol.ButtonHovered, ImGui.ColorConvertFloat4ToU32(*ImGui.GetStyleColorVec4(ImGuiCol.HeaderHovered)));
ImGui.PushStyleColor(ImGuiCol.Button, selected ? ImGui.ColorConvertFloat4ToU32(*ImGui.GetStyleColorVec4(ImGuiCol.Header)) : 0);

var padding = ImGui.GetStyle().FramePadding;
ImGui.GetStyle().FramePadding = Vector2.Zero;

var result = ImGui.ImageButton(handle, size);

ImGui.GetStyle().FramePadding = padding;
ImGui.PopStyleColor(2);
ImGui.PopStyleColor(3);

return result;
}

private static void DrawItemMiddle(Action drawAction, float wholeWidth, float width, bool leftAlign = false)
private static void DrawItemMiddle(Action drawAction, float wholeWidth, float width, bool leftAlign = true)
{
if (drawAction == null) return;
var distance = (wholeWidth - width) / 2;
Expand All @@ -150,7 +185,65 @@ private void DrawBody()
{
if (ImGui.BeginChild("Rotation Solver Body"))
{
switch (_activeTab)
{
case RotationConfigWindowTab.About:
DrawAbout();
break;

case RotationConfigWindowTab.Rotation:
DrawRotation();
break;
}
ImGui.EndChild();
}
}

private void DrawAbout()
{
ImGui.Text("About Tab");

ImGui.PushStyleVar(ImGuiStyleVar.ItemSpacing, new Vector2(0f, 5f));

StateCommandType.Auto.DisplayCommandHelp(getHelp: EnumTranslations.ToHelp);

StateCommandType.Manual.DisplayCommandHelp(getHelp: EnumTranslations.ToHelp);

StateCommandType.Cancel.DisplayCommandHelp(getHelp: EnumTranslations.ToHelp);

OtherCommandType.NextAction.DisplayCommandHelp(getHelp: i => LocalizationManager.RightLang.ConfigWindow_HelpItem_NextAction);

ImGui.NewLine();

SpecialCommandType.EndSpecial.DisplayCommandHelp(getHelp: EnumTranslations.ToHelp);

SpecialCommandType.HealArea.DisplayCommandHelp(getHelp: EnumTranslations.ToHelp);

SpecialCommandType.HealSingle.DisplayCommandHelp(getHelp: EnumTranslations.ToHelp);

SpecialCommandType.DefenseArea.DisplayCommandHelp(getHelp: EnumTranslations.ToHelp);

SpecialCommandType.DefenseSingle.DisplayCommandHelp(getHelp: EnumTranslations.ToHelp);

SpecialCommandType.MoveForward.DisplayCommandHelp(getHelp: EnumTranslations.ToHelp);

SpecialCommandType.MoveBack.DisplayCommandHelp(getHelp: EnumTranslations.ToHelp);

SpecialCommandType.Speed.DisplayCommandHelp(getHelp: EnumTranslations.ToHelp);

SpecialCommandType.EsunaStanceNorth.DisplayCommandHelp(getHelp: EnumTranslations.ToHelp);

SpecialCommandType.RaiseShirk.DisplayCommandHelp(getHelp: EnumTranslations.ToHelp);

SpecialCommandType.AntiKnockback.DisplayCommandHelp(getHelp: EnumTranslations.ToHelp);

SpecialCommandType.Burst.DisplayCommandHelp(getHelp: EnumTranslations.ToHelp);

ImGui.PopStyleVar();
}

private void DrawRotation()
{
ImGui.Text("Rotation Tab");
}
}
14 changes: 14 additions & 0 deletions RotationSolver/UI/RotationConfigWindowTab.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
namespace RotationSolver.UI;

[AttributeUsage(AttributeTargets.Field)]
internal class TabSkipAttribute : Attribute
{

}

internal enum RotationConfigWindowTab : byte
{
[TabSkip] About,
[TabSkip] Rotation,
Actions,
}

0 comments on commit 16eebc5

Please sign in to comment.