diff --git a/Craftimizer/Plugin/Icons.cs b/Craftimizer/Plugin/Icons.cs new file mode 100644 index 0000000..37ebeb0 --- /dev/null +++ b/Craftimizer/Plugin/Icons.cs @@ -0,0 +1,19 @@ +using ImGuiScene; +using System.Collections.Generic; + +namespace Craftimizer.Plugin; + +internal static class Icons +{ + private static readonly Dictionary Cache = new(); + + public static TextureWrap GetIconFromPath(string path) + { + if (!Cache.TryGetValue(path, out var ret)) + Cache.Add(path, ret = Service.DataManager.GetImGuiTexture(path)!); + return ret; + } + + public static TextureWrap GetIconFromId(ushort id) => + GetIconFromPath($"ui/icon/{id / 1000 * 1000:000000}/{id:000000}_hr1.tex"); +} diff --git a/Craftimizer/Plugin/LuminaSheets.cs b/Craftimizer/Plugin/LuminaSheets.cs index 2efe7d0..d941681 100644 --- a/Craftimizer/Plugin/LuminaSheets.cs +++ b/Craftimizer/Plugin/LuminaSheets.cs @@ -8,4 +8,6 @@ public static class LuminaSheets public static readonly ExcelSheet RecipeSheet = Service.DataManager.GetExcelSheet()!; public static readonly ExcelSheet RecipeLevelTableSheet = Service.DataManager.GetExcelSheet()!; public static readonly ExcelSheet ParamGrowSheet = Service.DataManager.GetExcelSheet()!; + public static readonly ExcelSheet ActionSheet = Service.DataManager.GetExcelSheet()!; + public static readonly ExcelSheet CraftActionSheet = Service.DataManager.GetExcelSheet()!; } diff --git a/Craftimizer/Simulator/Actions/AdvancedTouch.cs b/Craftimizer/Simulator/Actions/AdvancedTouch.cs index bcd9647..775ac5e 100644 --- a/Craftimizer/Simulator/Actions/AdvancedTouch.cs +++ b/Craftimizer/Simulator/Actions/AdvancedTouch.cs @@ -6,6 +6,7 @@ internal class AdvancedTouch : BaseAction public override ActionCategory Category => ActionCategory.Quality; public override int Level => 84; + public override int ActionId => 100411; public override int CPCost => Simulation.GetPreviousAction() is StandardTouch && Simulation.GetPreviousAction(2) is BasicTouch ? 18 : 46; public override float Efficiency => 1.50f; diff --git a/Craftimizer/Simulator/Actions/BaseAction.cs b/Craftimizer/Simulator/Actions/BaseAction.cs index 0e1728d..5c23df3 100644 --- a/Craftimizer/Simulator/Actions/BaseAction.cs +++ b/Craftimizer/Simulator/Actions/BaseAction.cs @@ -1,7 +1,17 @@ +using Craftimizer.Plugin; +using ImGuiScene; +using Lumina.Excel.GeneratedSheets; +using System; +using System.Linq; +using Action = Lumina.Excel.GeneratedSheets.Action; + namespace Craftimizer.Simulator.Actions; -internal abstract class BaseAction +public abstract class BaseAction { + public static readonly Type[] Actions = typeof(BaseAction).Assembly.GetTypes() + .Where(type => type.IsAssignableTo(typeof(BaseAction)) && !type.IsAbstract).ToArray(); + protected Simulation Simulation { get; } public BaseAction(Simulation simulation) @@ -11,12 +21,65 @@ internal abstract class BaseAction public abstract ActionCategory Category { get; } public abstract int Level { get; } + // Doesn't matter from which class, we'll use the sheet to extrapolate the rest + public abstract int ActionId { get; } public abstract int CPCost { get; } public abstract float Efficiency { get; } public virtual float SuccessRate => 1f; public virtual int DurabilityCost => 10; + private (CraftAction? CraftAction, Action? Action) GetActionRow(ClassJob classJob) + { + if (LuminaSheets.CraftActionSheet.GetRow((uint)ActionId) is CraftAction baseCraftAction) + { + return (classJob switch + { + ClassJob.Carpenter => baseCraftAction.CRP.Value!, + ClassJob.Blacksmith => baseCraftAction.BSM.Value!, + ClassJob.Armorer => baseCraftAction.ARM.Value!, + ClassJob.Goldsmith => baseCraftAction.GSM.Value!, + ClassJob.Leatherworker => baseCraftAction.LTW.Value!, + ClassJob.Weaver => baseCraftAction.WVR.Value!, + ClassJob.Alchemist => baseCraftAction.ALC.Value!, + ClassJob.Culinarian => baseCraftAction.CUL.Value!, + _ => baseCraftAction + }, null); + } + else if (LuminaSheets.ActionSheet.GetRow((uint)ActionId) is Action baseAction) + { + return (null, + LuminaSheets.ActionSheet.First(r => + r.Icon == baseAction.Icon && + r.ActionCategory.Row == baseAction.ActionCategory.Row && + r.Name.RawString == baseAction.Name.RawString && + (r.ClassJobCategory.Value?.IsClassJob(classJob) ?? false) + )); + } + return (null, null); + } + + public string GetName(ClassJob classJob) + { + var (craftAction, action) = GetActionRow(classJob); + if (craftAction != null) + return craftAction.Name; + else if (action != null) + return action.Name; + return "Unknown"; + } + + public TextureWrap GetIcon(ClassJob classJob) + { + var (craftAction, action) = GetActionRow(classJob); + if (craftAction != null) + return Icons.GetIconFromId(craftAction.Icon); + else if (action != null) + return Icons.GetIconFromId(action.Icon); + // Old "Steady Hand" action icon + return Icons.GetIconFromId(1953); + } + public virtual bool CanUse => Simulation.Stats.Level >= Level && Simulation.CP >= CPCost; @@ -24,10 +87,13 @@ internal abstract class BaseAction { Simulation.ReduceCP(CPCost); Simulation.ReduceDurability(DurabilityCost); + if (Simulation.RollSuccess(SuccessRate)) UseSuccess(); + + if (Simulation.HasEffect(Effect.Manipulation)) + Simulation.RestoreDurability(5); } public abstract void UseSuccess(); - } diff --git a/Craftimizer/Simulator/Actions/BasicSynthesis.cs b/Craftimizer/Simulator/Actions/BasicSynthesis.cs index 59a2c0b..56ab3e3 100644 --- a/Craftimizer/Simulator/Actions/BasicSynthesis.cs +++ b/Craftimizer/Simulator/Actions/BasicSynthesis.cs @@ -6,6 +6,7 @@ internal class BasicSynthesis : BaseAction public override ActionCategory Category => ActionCategory.Synthesis; public override int Level => 1; + public override int ActionId => 100001; public override int CPCost => 0; // Basic Synthesis Mastery Trait diff --git a/Craftimizer/Simulator/Actions/BasicTouch.cs b/Craftimizer/Simulator/Actions/BasicTouch.cs index 0689217..f6fdfc1 100644 --- a/Craftimizer/Simulator/Actions/BasicTouch.cs +++ b/Craftimizer/Simulator/Actions/BasicTouch.cs @@ -6,6 +6,7 @@ internal class BasicTouch : BaseAction public override ActionCategory Category => ActionCategory.Quality; public override int Level => 5; + public override int ActionId => 100002; public override int CPCost => 18; public override float Efficiency => 1.00f; diff --git a/Craftimizer/Simulator/Actions/ByregotsBlessing.cs b/Craftimizer/Simulator/Actions/ByregotsBlessing.cs index 705ee62..3df5782 100644 --- a/Craftimizer/Simulator/Actions/ByregotsBlessing.cs +++ b/Craftimizer/Simulator/Actions/ByregotsBlessing.cs @@ -6,6 +6,7 @@ internal class ByregotsBlessing : BaseAction public override ActionCategory Category => ActionCategory.Quality; public override int Level => 50; + public override int ActionId => 100339; public override int CPCost => 24; public override float Efficiency => 1.00f + 0.20f * (Simulation.GetEffect(Effect.InnerQuiet)?.Strength ?? 0); diff --git a/Craftimizer/Simulator/Actions/CarefulSynthesis.cs b/Craftimizer/Simulator/Actions/CarefulSynthesis.cs index f9b8dff..ac7420f 100644 --- a/Craftimizer/Simulator/Actions/CarefulSynthesis.cs +++ b/Craftimizer/Simulator/Actions/CarefulSynthesis.cs @@ -6,6 +6,7 @@ internal class CarefulSynthesis : BaseAction public override ActionCategory Category => ActionCategory.Synthesis; public override int Level => 62; + public override int ActionId => 100203; public override int CPCost => 7; // Careful Synthesis Mastery Trait diff --git a/Craftimizer/Simulator/Actions/DelicateSynthesis.cs b/Craftimizer/Simulator/Actions/DelicateSynthesis.cs index ff720b9..53d3da1 100644 --- a/Craftimizer/Simulator/Actions/DelicateSynthesis.cs +++ b/Craftimizer/Simulator/Actions/DelicateSynthesis.cs @@ -6,6 +6,7 @@ internal class DelicateSynthesis : BaseAction public override ActionCategory Category => ActionCategory.Synthesis; public override int Level => 76; + public override int ActionId => 100323; public override int CPCost => 32; public override float Efficiency => 1.00f; diff --git a/Craftimizer/Simulator/Actions/FinalAppraisal.cs b/Craftimizer/Simulator/Actions/FinalAppraisal.cs index 5e880f2..5e1fe5a 100644 --- a/Craftimizer/Simulator/Actions/FinalAppraisal.cs +++ b/Craftimizer/Simulator/Actions/FinalAppraisal.cs @@ -6,6 +6,7 @@ internal class FinalAppraisal : BaseAction public override ActionCategory Category => ActionCategory.Synthesis; public override int Level => 42; + public override int ActionId => 19012; public override int CPCost => 1; public override float Efficiency => 0f; diff --git a/Craftimizer/Simulator/Actions/FocusedSynthesis.cs b/Craftimizer/Simulator/Actions/FocusedSynthesis.cs index 517cf86..123aeb5 100644 --- a/Craftimizer/Simulator/Actions/FocusedSynthesis.cs +++ b/Craftimizer/Simulator/Actions/FocusedSynthesis.cs @@ -6,6 +6,7 @@ internal class FocusedSynthesis : BaseAction public override ActionCategory Category => ActionCategory.Synthesis; public override int Level => 67; + public override int ActionId => 100235; public override int CPCost => 5; public override float Efficiency => 2.00f; diff --git a/Craftimizer/Simulator/Actions/FocusedTouch.cs b/Craftimizer/Simulator/Actions/FocusedTouch.cs index 6b1b7fe..af6474f 100644 --- a/Craftimizer/Simulator/Actions/FocusedTouch.cs +++ b/Craftimizer/Simulator/Actions/FocusedTouch.cs @@ -6,6 +6,7 @@ internal class FocusedTouch : BaseAction public override ActionCategory Category => ActionCategory.Quality; public override int Level => 68; + public override int ActionId => 100243; public override int CPCost => 18; public override float Efficiency => 1.50f; diff --git a/Craftimizer/Simulator/Actions/GreatStrides.cs b/Craftimizer/Simulator/Actions/GreatStrides.cs index ef86dd3..0225b53 100644 --- a/Craftimizer/Simulator/Actions/GreatStrides.cs +++ b/Craftimizer/Simulator/Actions/GreatStrides.cs @@ -6,6 +6,7 @@ internal class GreatStrides : BaseAction public override ActionCategory Category => ActionCategory.Buffs; public override int Level => 21; + public override int ActionId => 260; public override int CPCost => 32; public override float Efficiency => 0f; diff --git a/Craftimizer/Simulator/Actions/Groundwork.cs b/Craftimizer/Simulator/Actions/Groundwork.cs index 95db78c..446386f 100644 --- a/Craftimizer/Simulator/Actions/Groundwork.cs +++ b/Craftimizer/Simulator/Actions/Groundwork.cs @@ -6,6 +6,7 @@ internal class Groundwork : BaseAction public override ActionCategory Category => ActionCategory.Synthesis; public override int Level => 72; + public override int ActionId => 100403; public override int CPCost => 18; // Groundwork Mastery Trait diff --git a/Craftimizer/Simulator/Actions/HastyTouch.cs b/Craftimizer/Simulator/Actions/HastyTouch.cs index 6987de0..eac9550 100644 --- a/Craftimizer/Simulator/Actions/HastyTouch.cs +++ b/Craftimizer/Simulator/Actions/HastyTouch.cs @@ -6,6 +6,7 @@ internal class HastyTouch : BaseAction public override ActionCategory Category => ActionCategory.Quality; public override int Level => 9; + public override int ActionId => 100355; public override int CPCost => 0; public override float Efficiency => 1.00f; diff --git a/Craftimizer/Simulator/Actions/Innovation.cs b/Craftimizer/Simulator/Actions/Innovation.cs index e39bb9d..d3126f2 100644 --- a/Craftimizer/Simulator/Actions/Innovation.cs +++ b/Craftimizer/Simulator/Actions/Innovation.cs @@ -6,6 +6,7 @@ internal class Innovation : BaseAction public override ActionCategory Category => ActionCategory.Buffs; public override int Level => 26; + public override int ActionId => 19004; public override int CPCost => 18; public override float Efficiency => 0f; diff --git a/Craftimizer/Simulator/Actions/IntensiveSynthesis.cs b/Craftimizer/Simulator/Actions/IntensiveSynthesis.cs index 1ba49b8..311edd0 100644 --- a/Craftimizer/Simulator/Actions/IntensiveSynthesis.cs +++ b/Craftimizer/Simulator/Actions/IntensiveSynthesis.cs @@ -6,6 +6,7 @@ internal class IntensiveSynthesis : BaseAction public override ActionCategory Category => ActionCategory.Synthesis; public override int Level => 78; + public override int ActionId => 100315; public override int CPCost => 6; public override float Efficiency => 4.00f; diff --git a/Craftimizer/Simulator/Actions/Manipulation.cs b/Craftimizer/Simulator/Actions/Manipulation.cs index b783d5a..3941f75 100644 --- a/Craftimizer/Simulator/Actions/Manipulation.cs +++ b/Craftimizer/Simulator/Actions/Manipulation.cs @@ -6,6 +6,7 @@ internal class Manipulation : BaseAction public override ActionCategory Category => ActionCategory.Durability; public override int Level => 65; + public override int ActionId => 4574; public override int CPCost => 96; public override float Efficiency => 0f; diff --git a/Craftimizer/Simulator/Actions/MastersMend.cs b/Craftimizer/Simulator/Actions/MastersMend.cs index f828319..b999b90 100644 --- a/Craftimizer/Simulator/Actions/MastersMend.cs +++ b/Craftimizer/Simulator/Actions/MastersMend.cs @@ -6,6 +6,7 @@ internal class MastersMend : BaseAction public override ActionCategory Category => ActionCategory.Durability; public override int Level => 7; + public override int ActionId => 100003; public override int CPCost => 88; public override float Efficiency => 0f; diff --git a/Craftimizer/Simulator/Actions/MuscleMemory.cs b/Craftimizer/Simulator/Actions/MuscleMemory.cs index 8264730..158a952 100644 --- a/Craftimizer/Simulator/Actions/MuscleMemory.cs +++ b/Craftimizer/Simulator/Actions/MuscleMemory.cs @@ -6,6 +6,7 @@ internal class MuscleMemory : BaseAction public override ActionCategory Category => ActionCategory.FirstTurn; public override int Level => 54; + public override int ActionId => 100379; public override int CPCost => 6; public override float Efficiency => 3.00f; diff --git a/Craftimizer/Simulator/Actions/Observe.cs b/Craftimizer/Simulator/Actions/Observe.cs index f280283..f88cdde 100644 --- a/Craftimizer/Simulator/Actions/Observe.cs +++ b/Craftimizer/Simulator/Actions/Observe.cs @@ -6,6 +6,7 @@ internal class Observe : BaseAction public override ActionCategory Category => ActionCategory.Other; public override int Level => 13; + public override int ActionId => 100010; public override int CPCost => 7; public override float Efficiency => 0f; diff --git a/Craftimizer/Simulator/Actions/PreciseTouch.cs b/Craftimizer/Simulator/Actions/PreciseTouch.cs index 2bb27e2..a96f5ed 100644 --- a/Craftimizer/Simulator/Actions/PreciseTouch.cs +++ b/Craftimizer/Simulator/Actions/PreciseTouch.cs @@ -6,6 +6,7 @@ internal class PreciseTouch : BaseAction public override ActionCategory Category => ActionCategory.Quality; public override int Level => 53; + public override int ActionId => 100128; public override int CPCost => 18; public override float Efficiency => 1.50f; diff --git a/Craftimizer/Simulator/Actions/PreparatoryTouch.cs b/Craftimizer/Simulator/Actions/PreparatoryTouch.cs index d321081..d9e9126 100644 --- a/Craftimizer/Simulator/Actions/PreparatoryTouch.cs +++ b/Craftimizer/Simulator/Actions/PreparatoryTouch.cs @@ -6,6 +6,7 @@ internal class PreparatoryTouch : BaseAction public override ActionCategory Category => ActionCategory.Quality; public override int Level => 71; + public override int ActionId => 100299; public override int CPCost => 40; public override float Efficiency => 2.00f; diff --git a/Craftimizer/Simulator/Actions/PrudentSynthesis.cs b/Craftimizer/Simulator/Actions/PrudentSynthesis.cs index bbc4a11..5979470 100644 --- a/Craftimizer/Simulator/Actions/PrudentSynthesis.cs +++ b/Craftimizer/Simulator/Actions/PrudentSynthesis.cs @@ -6,6 +6,7 @@ internal class PrudentSynthesis : BaseAction public override ActionCategory Category => ActionCategory.Synthesis; public override int Level => 88; + public override int ActionId => 100427; public override int CPCost => 18; public override float Efficiency => 1.80f; diff --git a/Craftimizer/Simulator/Actions/PrudentTouch.cs b/Craftimizer/Simulator/Actions/PrudentTouch.cs index d7095ba..fe5828b 100644 --- a/Craftimizer/Simulator/Actions/PrudentTouch.cs +++ b/Craftimizer/Simulator/Actions/PrudentTouch.cs @@ -6,6 +6,7 @@ internal class PrudentTouch : BaseAction public override ActionCategory Category => ActionCategory.Quality; public override int Level => 66; + public override int ActionId => 100227; public override int CPCost => 25; public override float Efficiency => 1.00f; diff --git a/Craftimizer/Simulator/Actions/RapidSynthesis.cs b/Craftimizer/Simulator/Actions/RapidSynthesis.cs index 65bf794..25bf241 100644 --- a/Craftimizer/Simulator/Actions/RapidSynthesis.cs +++ b/Craftimizer/Simulator/Actions/RapidSynthesis.cs @@ -6,6 +6,7 @@ internal class RapidSynthesis : BaseAction public override ActionCategory Category => ActionCategory.Synthesis; public override int Level => 9; + public override int ActionId => 100363; public override int CPCost => 0; // Rapid Synthesis Mastery Trait diff --git a/Craftimizer/Simulator/Actions/Reflect.cs b/Craftimizer/Simulator/Actions/Reflect.cs index 3060c6d..275802f 100644 --- a/Craftimizer/Simulator/Actions/Reflect.cs +++ b/Craftimizer/Simulator/Actions/Reflect.cs @@ -6,6 +6,7 @@ internal class Reflect : BaseAction public override ActionCategory Category => ActionCategory.FirstTurn; public override int Level => 69; + public override int ActionId => 100387; public override int CPCost => 6; public override float Efficiency => 1.00f; diff --git a/Craftimizer/Simulator/Actions/StandardTouch.cs b/Craftimizer/Simulator/Actions/StandardTouch.cs index 9b1f498..c22b922 100644 --- a/Craftimizer/Simulator/Actions/StandardTouch.cs +++ b/Craftimizer/Simulator/Actions/StandardTouch.cs @@ -6,6 +6,7 @@ internal class StandardTouch : BaseAction public override ActionCategory Category => ActionCategory.Quality; public override int Level => 18; + public override int ActionId => 100004; public override int CPCost => Simulation.GetPreviousAction() is BasicTouch ? 18 : 32; public override float Efficiency => 1.25f; diff --git a/Craftimizer/Simulator/Actions/TrainedEye.cs b/Craftimizer/Simulator/Actions/TrainedEye.cs index fa4c978..d571c20 100644 --- a/Craftimizer/Simulator/Actions/TrainedEye.cs +++ b/Craftimizer/Simulator/Actions/TrainedEye.cs @@ -6,6 +6,7 @@ internal class TrainedEye : BaseAction public override ActionCategory Category => ActionCategory.FirstTurn; public override int Level => 80; + public override int ActionId => 100283; public override int CPCost => 250; public override float Efficiency => 0f; diff --git a/Craftimizer/Simulator/Actions/TrainedFinesse.cs b/Craftimizer/Simulator/Actions/TrainedFinesse.cs index 6350764..15a0f4d 100644 --- a/Craftimizer/Simulator/Actions/TrainedFinesse.cs +++ b/Craftimizer/Simulator/Actions/TrainedFinesse.cs @@ -6,6 +6,7 @@ internal class TrainedFinesse : BaseAction public override ActionCategory Category => ActionCategory.Quality; public override int Level => 90; + public override int ActionId => 100435; public override int CPCost => 32; public override float Efficiency => 1.00f; diff --git a/Craftimizer/Simulator/Actions/TricksOfTheTrade.cs b/Craftimizer/Simulator/Actions/TricksOfTheTrade.cs index 16dc656..e775e19 100644 --- a/Craftimizer/Simulator/Actions/TricksOfTheTrade.cs +++ b/Craftimizer/Simulator/Actions/TricksOfTheTrade.cs @@ -6,6 +6,7 @@ internal class TricksOfTheTrade : BaseAction public override ActionCategory Category => ActionCategory.Other; public override int Level => 13; + public override int ActionId => 100371; public override int CPCost => 0; public override float Efficiency => 0f; diff --git a/Craftimizer/Simulator/Actions/Veneration.cs b/Craftimizer/Simulator/Actions/Veneration.cs index 2dbb5a2..a428c16 100644 --- a/Craftimizer/Simulator/Actions/Veneration.cs +++ b/Craftimizer/Simulator/Actions/Veneration.cs @@ -6,6 +6,7 @@ internal class Veneration : BaseAction public override ActionCategory Category => ActionCategory.Buffs; public override int Level => 15; + public override int ActionId => 19297; public override int CPCost => 18; public override float Efficiency => 0f; diff --git a/Craftimizer/Simulator/Actions/WasteNot.cs b/Craftimizer/Simulator/Actions/WasteNot.cs index 13fae8a..c2bc238 100644 --- a/Craftimizer/Simulator/Actions/WasteNot.cs +++ b/Craftimizer/Simulator/Actions/WasteNot.cs @@ -6,6 +6,7 @@ internal class WasteNot : BaseAction public override ActionCategory Category => ActionCategory.Durability; public override int Level => 15; + public override int ActionId => 4631; public override int CPCost => 56; public override float Efficiency => 0f; diff --git a/Craftimizer/Simulator/Actions/WasteNot2.cs b/Craftimizer/Simulator/Actions/WasteNot2.cs index 1f9e7f4..e9374be 100644 --- a/Craftimizer/Simulator/Actions/WasteNot2.cs +++ b/Craftimizer/Simulator/Actions/WasteNot2.cs @@ -6,6 +6,7 @@ internal class WasteNot2 : BaseAction public override ActionCategory Category => ActionCategory.Durability; public override int Level => 47; + public override int ActionId => 4639; public override int CPCost => 98; public override float Efficiency => 0f; diff --git a/Craftimizer/Simulator/ClassJob.cs b/Craftimizer/Simulator/ClassJob.cs new file mode 100644 index 0000000..4174c31 --- /dev/null +++ b/Craftimizer/Simulator/ClassJob.cs @@ -0,0 +1,34 @@ +using Lumina.Excel.GeneratedSheets; + +namespace Craftimizer.Simulator; + +public enum ClassJob +{ + Carpenter, + Blacksmith, + Armorer, + Goldsmith, + Leatherworker, + Weaver, + Alchemist, + Culinarian +} + +internal static class ClassJobExtensions +{ + public static bool IsClassJob(this ClassJobCategory me, ClassJob classJob) + { + return classJob switch + { + ClassJob.Carpenter => me.CRP, + ClassJob.Blacksmith => me.BSM, + ClassJob.Armorer => me.ARM, + ClassJob.Goldsmith => me.GSM, + ClassJob.Leatherworker => me.LTW, + ClassJob.Weaver => me.WVR, + ClassJob.Alchemist => me.ALC, + ClassJob.Culinarian => me.CUL, + _ => false + }; + } +}