diff --git a/Benchmark/Bench.cs b/Benchmark/Bench.cs index d6a2fe6..f3bcae7 100644 --- a/Benchmark/Bench.cs +++ b/Benchmark/Bench.cs @@ -1,4 +1,5 @@ using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Diagnosers; using BenchmarkDotNet.Diagnostics.dotTrace; using BenchmarkDotNet.Jobs; using Craftimizer.Simulator; @@ -9,7 +10,9 @@ namespace Craftimizer.Benchmark; [SimpleJob(RuntimeMoniker.Net80, baseline: true)] [SimpleJob(RuntimeMoniker.Net90)] [MinColumn, Q1Column, Q3Column, MaxColumn] -[DotTraceDiagnoser] +//[DotTraceDiagnoser] +[MemoryDiagnoser] +[DisassemblyDiagnoser(maxDepth: 500, exportGithubMarkdown: false, exportHtml: true)] public class Bench { public record struct HashWrapper(T Data) where T : notnull @@ -96,12 +99,25 @@ public class Bench [ParamsSource(nameof(Configs))] public HashWrapper Config { get; set; } - [Benchmark] - public async Task Solve() + // [Benchmark] + public async Task SolveAsync() { var solver = new Solver.Solver(Config, State); solver.Start(); var (_, s) = await solver.GetTask().ConfigureAwait(false); return (float)s.Quality / s.Input.Recipe.MaxQuality; } + + [Benchmark] + public (float MaxScore, SolverSolution Solution) Solve() + { + var config = new MCTSConfig(Config.Data); + + var solver = new MCTS(config, State); + var progress = 0; + solver.Search(Config.Data.Iterations, ref progress, CancellationToken.None); + var solution = solver.Solution(); + + return (solver.MaxScore, solution); + } } diff --git a/Simulator/Actions/AdvancedTouch.cs b/Simulator/Actions/AdvancedTouch.cs index ec1f0af..69a7ede 100644 --- a/Simulator/Actions/AdvancedTouch.cs +++ b/Simulator/Actions/AdvancedTouch.cs @@ -1,13 +1,10 @@ namespace Craftimizer.Simulator.Actions; -internal sealed class AdvancedTouch : BaseAction +internal sealed class AdvancedTouch() : BaseAction( + ActionCategory.Quality, level: 84, actionId: 100411, + increasesQuality: true, + defaultCPCost: 46, defaultEfficiency: 150) { - public override ActionCategory Category => ActionCategory.Quality; - public override int Level => 84; - public override uint ActionId => 100411; - - public override bool IncreasesQuality => true; - - public override int CPCost(Simulator s) => s.ActionStates.TouchComboIdx == 2 ? 18 : 46; - public override int Efficiency(Simulator s) => 150; + public override int CPCost(Simulator s) => + s.ActionStates.TouchComboIdx == 2 ? 18 : 46; } diff --git a/Simulator/Actions/AdvancedTouchCombo.cs b/Simulator/Actions/AdvancedTouchCombo.cs index 66e6123..aa80a4b 100644 --- a/Simulator/Actions/AdvancedTouchCombo.cs +++ b/Simulator/Actions/AdvancedTouchCombo.cs @@ -1,9 +1,8 @@ namespace Craftimizer.Simulator.Actions; -internal sealed class AdvancedTouchCombo : BaseComboAction +internal sealed class AdvancedTouchCombo() : BaseComboAction( + ActionType.StandardTouchCombo, ActionType.AdvancedTouch, 18 * 3 + ) { - public override ActionType ActionTypeA => ActionType.StandardTouchCombo; - public override ActionType ActionTypeB => ActionType.AdvancedTouch; - public override int CPCost(Simulator s) => 18 * 3; } diff --git a/Simulator/Actions/BaseAction.cs b/Simulator/Actions/BaseAction.cs index e650a00..70c40c5 100644 --- a/Simulator/Actions/BaseAction.cs +++ b/Simulator/Actions/BaseAction.cs @@ -2,28 +2,46 @@ using System.Text; namespace Craftimizer.Simulator.Actions; -public abstract class BaseAction +public abstract class BaseAction( + ActionCategory category, int level, uint actionId, + int macroWaitTime = 3, + bool increasesProgress = false, bool increasesQuality = false, + int durabilityCost = 10, bool increasesStepCount = true, + int defaultCPCost = 0, + int defaultEfficiency = 0, + float defaultSuccessRate = 1) { // Non-instanced properties // Metadata - public abstract ActionCategory Category { get; } - public abstract int Level { get; } + public readonly ActionCategory Category = category; + + public readonly int Level = level; // Doesn't matter from which class, we'll use the sheet to extrapolate the rest - public abstract uint ActionId { get; } + public readonly uint ActionId = actionId; // Seconds - public virtual int MacroWaitTime => 3; + public readonly int MacroWaitTime = macroWaitTime; // Action properties - public virtual bool IncreasesProgress => false; - public virtual bool IncreasesQuality => false; - public virtual int DurabilityCost => 10; - public virtual bool IncreasesStepCount => true; + public readonly bool IncreasesProgress = increasesProgress; + public readonly bool IncreasesQuality = increasesQuality; + public readonly int DurabilityCost = durabilityCost; + public readonly bool IncreasesStepCount = increasesStepCount; // Instanced properties - public abstract int CPCost(Simulator s); - public virtual int Efficiency(Simulator s) => 0; - public virtual float SuccessRate(Simulator s) => 1f; + public readonly int DefaultCPCost = defaultCPCost; + public readonly int DefaultEfficiency = defaultEfficiency; + public readonly float DefaultSuccessRate = defaultSuccessRate; + + // Instanced properties + public virtual int CPCost(Simulator s) => + DefaultCPCost; + + public virtual int Efficiency(Simulator s) => + DefaultEfficiency; + + public virtual float SuccessRate(Simulator s) => + DefaultSuccessRate; // Return true if it can be in the action pool now or in the future // e.g. if Heart and Soul is already used, it is impossible to use it again @@ -65,36 +83,41 @@ public abstract class BaseAction public virtual void UseSuccess(Simulator s) { - if (Efficiency(s) != 0f) + var eff = Efficiency(s); + if (eff != 0) { if (IncreasesProgress) - s.IncreaseProgress(Efficiency(s)); + s.IncreaseProgress(eff); if (IncreasesQuality) - s.IncreaseQuality(Efficiency(s)); + s.IncreaseQuality(eff); } } public virtual string GetTooltip(Simulator s, bool addUsability) { + var cost = CPCost(s); + var eff = Efficiency(s); + var success = SuccessRate(s); + var builder = new StringBuilder(); if (addUsability && !CanUse(s)) builder.AppendLine($"Cannot Use"); builder.AppendLine($"Level {Level}"); - if (CPCost(s) != 0) - builder.AppendLine($"-{s.CalculateCPCost(CPCost(s))} CP"); + if (cost != 0) + builder.AppendLine($"-{s.CalculateCPCost(cost)} CP"); if (DurabilityCost != 0) builder.AppendLine($"-{s.CalculateDurabilityCost(DurabilityCost)} Durability"); - if (Efficiency(s) != 0) + if (eff != 0) { if (IncreasesProgress) - builder.AppendLine($"+{s.CalculateProgressGain(Efficiency(s))} Progress"); + builder.AppendLine($"+{s.CalculateProgressGain(eff)} Progress"); if (IncreasesQuality) - builder.AppendLine($"+{s.CalculateQualityGain(Efficiency(s))} Quality"); + builder.AppendLine($"+{s.CalculateQualityGain(eff)} Quality"); } if (!IncreasesStepCount) builder.AppendLine($"Does Not Increase Step Count"); - if (SuccessRate(s) != 1f) - builder.AppendLine($"{s.CalculateSuccessRate(SuccessRate(s)) * 100:##}% Success Rate"); + if (success != 1) + builder.AppendLine($"{s.CalculateSuccessRate(success) * 100:##}% Success Rate"); return builder.ToString(); } } diff --git a/Simulator/Actions/BaseBuffAction.cs b/Simulator/Actions/BaseBuffAction.cs index dbabd50..64be9fb 100644 --- a/Simulator/Actions/BaseBuffAction.cs +++ b/Simulator/Actions/BaseBuffAction.cs @@ -2,14 +2,25 @@ using System.Text; namespace Craftimizer.Simulator.Actions; -internal abstract class BaseBuffAction : BaseAction +internal abstract class BaseBuffAction( + ActionCategory category, int level, uint actionId, + EffectType effect, int duration, + int macroWaitTime = 2, + bool increasesProgress = false, bool increasesQuality = false, + int durabilityCost = 0, bool increasesStepCount = true, + int defaultCPCost = 0, + int defaultEfficiency = 0, + float defaultSuccessRate = 1) : + BaseAction( + category, level, actionId, + macroWaitTime, + increasesProgress, increasesQuality, + durabilityCost, increasesStepCount, + defaultCPCost, defaultEfficiency, defaultSuccessRate) { // Non-instanced properties - public abstract EffectType Effect { get; } - public virtual byte Duration => 1; - public override int MacroWaitTime => 2; - - public sealed override int DurabilityCost => 0; + public readonly EffectType Effect = effect; + public readonly int Duration = duration; public override void UseSuccess(Simulator s) => s.AddEffect(Effect, Duration); diff --git a/Simulator/Actions/BaseComboAction.cs b/Simulator/Actions/BaseComboAction.cs index 5151f4b..cfe1a24 100644 --- a/Simulator/Actions/BaseComboAction.cs +++ b/Simulator/Actions/BaseComboAction.cs @@ -1,11 +1,17 @@ namespace Craftimizer.Simulator.Actions; -public abstract class BaseComboAction : BaseAction +public abstract class BaseComboAction( + ActionType actionTypeA, ActionType actionTypeB, + BaseAction actionA, BaseAction actionB, + int? defaultCPCost = null) : + BaseAction( + ActionCategory.Combo, Math.Max(actionA.Level, actionA.Level), actionB.ActionId, + increasesProgress: actionA.IncreasesProgress || actionB.IncreasesProgress, + increasesQuality: actionA.IncreasesQuality || actionB.IncreasesQuality, + defaultCPCost: defaultCPCost ?? (actionA.DefaultCPCost + actionB.DefaultCPCost)) { - public abstract ActionType ActionTypeA { get; } - public abstract ActionType ActionTypeB { get; } - - public sealed override ActionCategory Category => ActionCategory.Combo; + public readonly ActionType ActionTypeA = actionTypeA; + public readonly ActionType ActionTypeB = actionTypeB; protected bool BaseCouldUse(Simulator s) => base.CouldUse(s); diff --git a/Simulator/Actions/BaseComboActionImpl.cs b/Simulator/Actions/BaseComboActionImpl.cs index 6f87f35..c071d76 100644 --- a/Simulator/Actions/BaseComboActionImpl.cs +++ b/Simulator/Actions/BaseComboActionImpl.cs @@ -1,18 +1,17 @@ namespace Craftimizer.Simulator.Actions; -internal abstract class BaseComboAction : BaseComboAction where A : BaseAction, new() where B : BaseAction, new() +internal abstract class BaseComboAction( + ActionType actionTypeA, ActionType actionTypeB, + int? baseCPCost = null) : + BaseComboAction( + actionTypeA, actionTypeB, + ActionA, ActionB, + baseCPCost + ) where A : BaseAction, new() where B : BaseAction, new() { protected static readonly A ActionA = new(); protected static readonly B ActionB = new(); - public override int Level => ActionB.Level; - public override uint ActionId => ActionB.ActionId; - - public override bool IncreasesProgress => ActionA.IncreasesProgress || ActionB.IncreasesProgress; - public override bool IncreasesQuality => ActionA.IncreasesQuality || ActionB.IncreasesQuality; - - public override int CPCost(Simulator s) => ActionA.CPCost(s) + ActionB.CPCost(s); - public override bool IsPossible(Simulator s) => ActionA.IsPossible(s) && ActionB.IsPossible(s); public override bool CouldUse(Simulator s) => diff --git a/Simulator/Actions/BasicSynthesis.cs b/Simulator/Actions/BasicSynthesis.cs index 2ad8d82..b76a38c 100644 --- a/Simulator/Actions/BasicSynthesis.cs +++ b/Simulator/Actions/BasicSynthesis.cs @@ -1,14 +1,13 @@ namespace Craftimizer.Simulator.Actions; -internal sealed class BasicSynthesis : BaseAction +internal sealed class BasicSynthesis() : BaseAction( + ActionCategory.Synthesis, 1, 100001, + increasesProgress: true, + defaultCPCost: 0, + defaultEfficiency: 100 + ) { - public override ActionCategory Category => ActionCategory.Synthesis; - public override int Level => 1; - public override uint ActionId => 100001; - - public override bool IncreasesProgress => true; - - public override int CPCost(Simulator s) => 0; // Basic Synthesis Mastery Trait - public override int Efficiency(Simulator s) => s.Input.Stats.Level >= 31 ? 120 : 100; + public override int Efficiency(Simulator s) => + s.Input.Stats.Level >= 31 ? 120 : 100; } diff --git a/Simulator/Actions/BasicTouch.cs b/Simulator/Actions/BasicTouch.cs index e3a2434..39b392a 100644 --- a/Simulator/Actions/BasicTouch.cs +++ b/Simulator/Actions/BasicTouch.cs @@ -1,13 +1,10 @@ namespace Craftimizer.Simulator.Actions; -internal sealed class BasicTouch : BaseAction +internal sealed class BasicTouch() : BaseAction( + ActionCategory.Quality, 5, 100002, + increasesQuality: true, + defaultCPCost: 18, + defaultEfficiency: 100) { - public override ActionCategory Category => ActionCategory.Quality; - public override int Level => 5; - public override uint ActionId => 100002; - public override bool IncreasesQuality => true; - - public override int CPCost(Simulator s) => 18; - public override int Efficiency(Simulator s) => 100; } diff --git a/Simulator/Actions/ByregotsBlessing.cs b/Simulator/Actions/ByregotsBlessing.cs index 7e29798..fb8164b 100644 --- a/Simulator/Actions/ByregotsBlessing.cs +++ b/Simulator/Actions/ByregotsBlessing.cs @@ -1,17 +1,16 @@ namespace Craftimizer.Simulator.Actions; -internal sealed class ByregotsBlessing : BaseAction +internal sealed class ByregotsBlessing() : BaseAction( + ActionCategory.Quality, 50, 100339, + increasesQuality: true, + defaultCPCost: 24, + defaultEfficiency: 100) { - public override ActionCategory Category => ActionCategory.Quality; - public override int Level => 50; - public override uint ActionId => 100339; + public override int Efficiency(Simulator s) => + 100 + (20 * s.GetEffectStrength(EffectType.InnerQuiet)); - public override bool IncreasesQuality => true; - - public override int CPCost(Simulator s) => 24; - public override int Efficiency(Simulator s) => 100 + (20 * s.GetEffectStrength(EffectType.InnerQuiet)); - - public override bool CouldUse(Simulator s) => s.HasEffect(EffectType.InnerQuiet) && base.CouldUse(s); + public override bool CouldUse(Simulator s) => + s.HasEffect(EffectType.InnerQuiet) && base.CouldUse(s); public override void UseSuccess(Simulator s) { diff --git a/Simulator/Actions/CarefulObservation.cs b/Simulator/Actions/CarefulObservation.cs index 5ae64d8..78d8b51 100644 --- a/Simulator/Actions/CarefulObservation.cs +++ b/Simulator/Actions/CarefulObservation.cs @@ -1,23 +1,19 @@ namespace Craftimizer.Simulator.Actions; -internal sealed class CarefulObservation : BaseAction +internal sealed class CarefulObservation() : BaseAction( + ActionCategory.Other, 55, 100395, + durabilityCost: 0, increasesStepCount: false, + defaultCPCost: 0 + ) { - public override ActionCategory Category => ActionCategory.Other; - public override int Level => 55; - public override uint ActionId => 100395; - public override int MacroWaitTime => 3; - - public override int DurabilityCost => 0; - public override bool IncreasesStepCount => false; - - public override int CPCost(Simulator s) => 0; - public override bool IsPossible(Simulator s) => base.IsPossible(s) && s.Input.Stats.IsSpecialist && s.ActionStates.CarefulObservationCount < 3; - public override bool CouldUse(Simulator s) => s.ActionStates.CarefulObservationCount < 3; + public override bool CouldUse(Simulator s) => + s.ActionStates.CarefulObservationCount < 3; - public override void UseSuccess(Simulator s) => s.StepCondition(); + public override void UseSuccess(Simulator s) => + s.StepCondition(); public override string GetTooltip(Simulator s, bool addUsability) => $"{base.GetTooltip(s, addUsability)}Specialist Only\n"; diff --git a/Simulator/Actions/CarefulSynthesis.cs b/Simulator/Actions/CarefulSynthesis.cs index 4449583..eeb4e15 100644 --- a/Simulator/Actions/CarefulSynthesis.cs +++ b/Simulator/Actions/CarefulSynthesis.cs @@ -1,14 +1,13 @@ namespace Craftimizer.Simulator.Actions; -internal sealed class CarefulSynthesis : BaseAction +internal sealed class CarefulSynthesis() : BaseAction( + ActionCategory.Synthesis, 62, 100203, + increasesProgress: true, + defaultCPCost: 7, + defaultEfficiency: 150 + ) { - public override ActionCategory Category => ActionCategory.Synthesis; - public override int Level => 62; - public override uint ActionId => 100203; - - public override bool IncreasesProgress => true; - - public override int CPCost(Simulator s) => 7; // Careful Synthesis Mastery Trait - public override int Efficiency(Simulator s) => s.Input.Stats.Level >= 82 ? 180 : 150; + public override int Efficiency(Simulator s) => + s.Input.Stats.Level >= 82 ? 180 : 150; } diff --git a/Simulator/Actions/DelicateSynthesis.cs b/Simulator/Actions/DelicateSynthesis.cs index 688352f..5f0fc3a 100644 --- a/Simulator/Actions/DelicateSynthesis.cs +++ b/Simulator/Actions/DelicateSynthesis.cs @@ -1,14 +1,11 @@ namespace Craftimizer.Simulator.Actions; -internal sealed class DelicateSynthesis : BaseAction +internal sealed class DelicateSynthesis() : BaseAction( + ActionCategory.Synthesis, 76, 100323, + increasesProgress: true, increasesQuality: true, + defaultCPCost: 32, + defaultEfficiency: 100 + ) { - public override ActionCategory Category => ActionCategory.Synthesis; - public override int Level => 76; - public override uint ActionId => 100323; - public override bool IncreasesProgress => true; - public override bool IncreasesQuality => true; - - public override int CPCost(Simulator s) => 32; - public override int Efficiency(Simulator s) => 100; } diff --git a/Simulator/Actions/FinalAppraisal.cs b/Simulator/Actions/FinalAppraisal.cs index 10c852f..6ca7772 100644 --- a/Simulator/Actions/FinalAppraisal.cs +++ b/Simulator/Actions/FinalAppraisal.cs @@ -1,17 +1,10 @@ namespace Craftimizer.Simulator.Actions; -internal sealed class FinalAppraisal : BaseBuffAction +internal sealed class FinalAppraisal() : BaseBuffAction( + ActionCategory.Synthesis, 42, 19012, + EffectType.FinalAppraisal, duration: 4, + increasesStepCount: false, + defaultCPCost: 1) { - public override ActionCategory Category => ActionCategory.Synthesis; - public override int Level => 42; - public override uint ActionId => 19012; - public override bool IncreasesStepCount => false; - - public override EffectType Effect => EffectType.FinalAppraisal; - // This is set to 4 since IncreaseStepCount is false. - // Usually it adds 1 extra duration and then it would tick it down, but IncreaseStepCount prevents that. - public override byte Duration => 4; - - public override int CPCost(Simulator s) => 1; } diff --git a/Simulator/Actions/FocusedSynthesis.cs b/Simulator/Actions/FocusedSynthesis.cs index 407077e..9ddde41 100644 --- a/Simulator/Actions/FocusedSynthesis.cs +++ b/Simulator/Actions/FocusedSynthesis.cs @@ -1,14 +1,13 @@ namespace Craftimizer.Simulator.Actions; -internal sealed class FocusedSynthesis : BaseAction +internal sealed class FocusedSynthesis() : BaseAction( + ActionCategory.Synthesis, 67, 100235, + increasesProgress: true, + defaultCPCost: 5, + defaultEfficiency: 200, + defaultSuccessRate: 0.50f + ) { - public override ActionCategory Category => ActionCategory.Synthesis; - public override int Level => 67; - public override uint ActionId => 100235; - - public override bool IncreasesProgress => true; - - public override int CPCost(Simulator s) => 5; - public override int Efficiency(Simulator s) => 200; - public override float SuccessRate(Simulator s) => s.ActionStates.Observed ? 1.00f : 0.50f; + public override float SuccessRate(Simulator s) => + s.ActionStates.Observed ? 1.00f : 0.50f; } diff --git a/Simulator/Actions/FocusedSynthesisCombo.cs b/Simulator/Actions/FocusedSynthesisCombo.cs index 819b586..f3951fb 100644 --- a/Simulator/Actions/FocusedSynthesisCombo.cs +++ b/Simulator/Actions/FocusedSynthesisCombo.cs @@ -1,7 +1,8 @@ namespace Craftimizer.Simulator.Actions; -internal sealed class FocusedSynthesisCombo : BaseComboAction +internal sealed class FocusedSynthesisCombo() : BaseComboAction( + ActionType.Observe, ActionType.FocusedSynthesis + ) { - public override ActionType ActionTypeA => ActionType.Observe; - public override ActionType ActionTypeB => ActionType.FocusedSynthesis; + } diff --git a/Simulator/Actions/FocusedTouch.cs b/Simulator/Actions/FocusedTouch.cs index 1afde89..5798590 100644 --- a/Simulator/Actions/FocusedTouch.cs +++ b/Simulator/Actions/FocusedTouch.cs @@ -1,14 +1,13 @@ namespace Craftimizer.Simulator.Actions; -internal sealed class FocusedTouch : BaseAction +internal sealed class FocusedTouch() : BaseAction( + ActionCategory.Quality, 68, 100243, + increasesQuality: true, + defaultCPCost: 18, + defaultEfficiency: 150, + defaultSuccessRate: 0.50f + ) { - public override ActionCategory Category => ActionCategory.Quality; - public override int Level => 68; - public override uint ActionId => 100243; - - public override bool IncreasesQuality => true; - - public override int CPCost(Simulator s) => 18; - public override int Efficiency(Simulator s) => 150; - public override float SuccessRate(Simulator s) => s.ActionStates.Observed ? 1.00f : 0.50f; + public override float SuccessRate(Simulator s) => + s.ActionStates.Observed ? 1.00f : 0.50f; } diff --git a/Simulator/Actions/FocusedTouchCombo.cs b/Simulator/Actions/FocusedTouchCombo.cs index 98f7a15..f1c16c8 100644 --- a/Simulator/Actions/FocusedTouchCombo.cs +++ b/Simulator/Actions/FocusedTouchCombo.cs @@ -1,7 +1,8 @@ namespace Craftimizer.Simulator.Actions; -internal sealed class FocusedTouchCombo : BaseComboAction +internal sealed class FocusedTouchCombo() : BaseComboAction( + ActionType.Observe, ActionType.FocusedTouch + ) { - public override ActionType ActionTypeA => ActionType.Observe; - public override ActionType ActionTypeB => ActionType.FocusedTouch; + } diff --git a/Simulator/Actions/GreatStrides.cs b/Simulator/Actions/GreatStrides.cs index 2dd964c..507a714 100644 --- a/Simulator/Actions/GreatStrides.cs +++ b/Simulator/Actions/GreatStrides.cs @@ -1,13 +1,10 @@ namespace Craftimizer.Simulator.Actions; -internal sealed class GreatStrides : BaseBuffAction +internal sealed class GreatStrides() : BaseBuffAction( + ActionCategory.Buffs, 21, 260, + EffectType.GreatStrides, duration: 3, + increasesStepCount: false, + defaultCPCost: 32) { - public override ActionCategory Category => ActionCategory.Buffs; - public override int Level => 21; - public override uint ActionId => 260; - public override EffectType Effect => EffectType.GreatStrides; - public override byte Duration => 3; - - public override int CPCost(Simulator s) => 32; } diff --git a/Simulator/Actions/Groundwork.cs b/Simulator/Actions/Groundwork.cs index 118b3ec..dbd1824 100644 --- a/Simulator/Actions/Groundwork.cs +++ b/Simulator/Actions/Groundwork.cs @@ -1,19 +1,19 @@ namespace Craftimizer.Simulator.Actions; -internal sealed class Groundwork : BaseAction +internal sealed class Groundwork() : BaseAction( + ActionCategory.Synthesis, 72, 100403, + increasesProgress: true, + durabilityCost: 20, + defaultCPCost: 18, + defaultEfficiency: 300 + ) { - public override ActionCategory Category => ActionCategory.Synthesis; - public override int Level => 72; - public override uint ActionId => 100403; - - public override bool IncreasesProgress => true; - public override int DurabilityCost => 20; - - public override int CPCost(Simulator s) => 18; public override int Efficiency(Simulator s) { // Groundwork Mastery Trait - var ret = s.Input.Stats.Level >= 86 ? 360 : 300; - return s.Durability < s.CalculateDurabilityCost(DurabilityCost) ? ret / 2 : ret; + var eff = s.Input.Stats.Level >= 86 ? 360 : 300; + if (s.Durability < s.CalculateDurabilityCost(DurabilityCost)) + eff /= 2; + return eff; } } diff --git a/Simulator/Actions/HastyTouch.cs b/Simulator/Actions/HastyTouch.cs index cfa179d..66b7897 100644 --- a/Simulator/Actions/HastyTouch.cs +++ b/Simulator/Actions/HastyTouch.cs @@ -1,14 +1,12 @@ namespace Craftimizer.Simulator.Actions; -internal sealed class HastyTouch : BaseAction +internal sealed class HastyTouch() : BaseAction( + ActionCategory.Quality, 9, 100355, + increasesQuality: true, + defaultCPCost: 0, + defaultEfficiency: 100, + defaultSuccessRate: 0.60f + ) { - public override ActionCategory Category => ActionCategory.Quality; - public override int Level => 9; - public override uint ActionId => 100355; - public override bool IncreasesQuality => true; - - public override int CPCost(Simulator s) => 0; - public override int Efficiency(Simulator s) => 100; - public override float SuccessRate(Simulator s) => 0.60f; } diff --git a/Simulator/Actions/HeartAndSoul.cs b/Simulator/Actions/HeartAndSoul.cs index 06e183b..bca6a63 100644 --- a/Simulator/Actions/HeartAndSoul.cs +++ b/Simulator/Actions/HeartAndSoul.cs @@ -1,22 +1,17 @@ namespace Craftimizer.Simulator.Actions; -internal sealed class HeartAndSoul : BaseBuffAction +internal sealed class HeartAndSoul() : BaseBuffAction( + ActionCategory.Other, 86, 100419, + EffectType.HeartAndSoul, duration: 1, + macroWaitTime: 3, + increasesStepCount: false + ) { - public override ActionCategory Category => ActionCategory.Other; - public override int Level => 86; - public override uint ActionId => 100419; - public override int MacroWaitTime => 3; - - public override bool IncreasesStepCount => false; - - public override EffectType Effect => EffectType.HeartAndSoul; - - public override int CPCost(Simulator s) => 0; - public override bool IsPossible(Simulator s) => base.IsPossible(s) && s.Input.Stats.IsSpecialist && !s.ActionStates.UsedHeartAndSoul; - public override bool CouldUse(Simulator s) => !s.ActionStates.UsedHeartAndSoul; + public override bool CouldUse(Simulator s) => + !s.ActionStates.UsedHeartAndSoul; public override string GetTooltip(Simulator s, bool addUsability) => $"{GetBaseTooltip(s, addUsability)}Specialist Only\n"; diff --git a/Simulator/Actions/Innovation.cs b/Simulator/Actions/Innovation.cs index 1f60160..7e06706 100644 --- a/Simulator/Actions/Innovation.cs +++ b/Simulator/Actions/Innovation.cs @@ -1,13 +1,9 @@ namespace Craftimizer.Simulator.Actions; -internal sealed class Innovation : BaseBuffAction +internal sealed class Innovation() : BaseBuffAction( + ActionCategory.Buffs, 26, 19004, + EffectType.Innovation, duration: 4, + defaultCPCost: 18) { - public override ActionCategory Category => ActionCategory.Buffs; - public override int Level => 26; - public override uint ActionId => 19004; - public override EffectType Effect => EffectType.Innovation; - public override byte Duration => 4; - - public override int CPCost(Simulator s) => 18; } diff --git a/Simulator/Actions/IntensiveSynthesis.cs b/Simulator/Actions/IntensiveSynthesis.cs index e54f3d2..bb66c95 100644 --- a/Simulator/Actions/IntensiveSynthesis.cs +++ b/Simulator/Actions/IntensiveSynthesis.cs @@ -1,16 +1,12 @@ namespace Craftimizer.Simulator.Actions; -internal sealed class IntensiveSynthesis : BaseAction +internal sealed class IntensiveSynthesis() : BaseAction( + ActionCategory.Synthesis, 78, 100315, + increasesProgress: true, + defaultCPCost: 6, + defaultEfficiency: 400 + ) { - public override ActionCategory Category => ActionCategory.Synthesis; - public override int Level => 78; - public override uint ActionId => 100315; - - public override bool IncreasesProgress => true; - - public override int CPCost(Simulator s) => 6; - public override int Efficiency(Simulator s) => 400; - public override bool CouldUse(Simulator s) => (s.Condition == Condition.Good || s.Condition == Condition.Excellent || s.HasEffect(EffectType.HeartAndSoul)) && base.CouldUse(s); diff --git a/Simulator/Actions/Manipulation.cs b/Simulator/Actions/Manipulation.cs index 56dfa30..571d296 100644 --- a/Simulator/Actions/Manipulation.cs +++ b/Simulator/Actions/Manipulation.cs @@ -1,16 +1,10 @@ namespace Craftimizer.Simulator.Actions; -internal sealed class Manipulation : BaseBuffAction +internal sealed class Manipulation() : BaseBuffAction( + ActionCategory.Durability, 65, 4574, + EffectType.Manipulation, duration: 8, + defaultCPCost: 96) { - public override ActionCategory Category => ActionCategory.Durability; - public override int Level => 65; - public override uint ActionId => 4574; - - public override EffectType Effect => EffectType.Manipulation; - public override byte Duration => 8; - - public override int CPCost(Simulator s) => 96; - public override bool IsPossible(Simulator s) => s.Input.Stats.CanUseManipulation && base.IsPossible(s); diff --git a/Simulator/Actions/MastersMend.cs b/Simulator/Actions/MastersMend.cs index f398be4..7416a20 100644 --- a/Simulator/Actions/MastersMend.cs +++ b/Simulator/Actions/MastersMend.cs @@ -1,15 +1,11 @@ namespace Craftimizer.Simulator.Actions; -internal sealed class MastersMend : BaseAction +internal sealed class MastersMend() : BaseAction( + ActionCategory.Durability, 7, 100003, + durabilityCost: 0, + defaultCPCost: 88 + ) { - public override ActionCategory Category => ActionCategory.Durability; - public override int Level => 7; - public override uint ActionId => 100003; - - public override int DurabilityCost => 0; - - public override int CPCost(Simulator s) => 88; - public override void UseSuccess(Simulator s) => s.RestoreDurability(30); } diff --git a/Simulator/Actions/MuscleMemory.cs b/Simulator/Actions/MuscleMemory.cs index bde7941..fa72d54 100644 --- a/Simulator/Actions/MuscleMemory.cs +++ b/Simulator/Actions/MuscleMemory.cs @@ -1,16 +1,12 @@ namespace Craftimizer.Simulator.Actions; -internal sealed class MuscleMemory : BaseAction +internal sealed class MuscleMemory() : BaseAction( + ActionCategory.FirstTurn, 54, 100379, + increasesProgress: true, + defaultCPCost: 6, + defaultEfficiency: 300 + ) { - public override ActionCategory Category => ActionCategory.FirstTurn; - public override int Level => 54; - public override uint ActionId => 100379; - - public override bool IncreasesProgress => true; - - public override int CPCost(Simulator s) => 6; - public override int Efficiency(Simulator s) => 300; - public override bool IsPossible(Simulator s) => s.IsFirstStep && base.IsPossible(s); public override bool CouldUse(Simulator s) => s.IsFirstStep && base.CouldUse(s); diff --git a/Simulator/Actions/Observe.cs b/Simulator/Actions/Observe.cs index e0e60d6..5ff3cbf 100644 --- a/Simulator/Actions/Observe.cs +++ b/Simulator/Actions/Observe.cs @@ -1,12 +1,10 @@ namespace Craftimizer.Simulator.Actions; -internal sealed class Observe : BaseAction +internal sealed class Observe() : BaseAction( + ActionCategory.Other, 13, 100010, + durabilityCost: 0, + defaultCPCost: 7 + ) { - public override ActionCategory Category => ActionCategory.Other; - public override int Level => 13; - public override uint ActionId => 100010; - public override int DurabilityCost => 0; - - public override int CPCost(Simulator s) => 7; } diff --git a/Simulator/Actions/PreciseTouch.cs b/Simulator/Actions/PreciseTouch.cs index 1b4766e..95c1ead 100644 --- a/Simulator/Actions/PreciseTouch.cs +++ b/Simulator/Actions/PreciseTouch.cs @@ -1,16 +1,12 @@ namespace Craftimizer.Simulator.Actions; -internal sealed class PreciseTouch : BaseAction +internal sealed class PreciseTouch() : BaseAction( + ActionCategory.Quality, 53, 100128, + increasesQuality: true, + defaultCPCost: 18, + defaultEfficiency: 150 + ) { - public override ActionCategory Category => ActionCategory.Quality; - public override int Level => 53; - public override uint ActionId => 100128; - - public override bool IncreasesQuality => true; - - public override int CPCost(Simulator s) => 18; - public override int Efficiency(Simulator s) => 150; - public override bool CouldUse(Simulator s) => (s.Condition == Condition.Good || s.Condition == Condition.Excellent || s.HasEffect(EffectType.HeartAndSoul)) && base.CouldUse(s); diff --git a/Simulator/Actions/PreparatoryTouch.cs b/Simulator/Actions/PreparatoryTouch.cs index f5f0950..f571f1e 100644 --- a/Simulator/Actions/PreparatoryTouch.cs +++ b/Simulator/Actions/PreparatoryTouch.cs @@ -1,17 +1,12 @@ namespace Craftimizer.Simulator.Actions; -internal sealed class PreparatoryTouch : BaseAction +internal sealed class PreparatoryTouch() : BaseAction( + ActionCategory.Quality, 71, 100299, + increasesQuality: true, + durabilityCost: 20, + defaultCPCost: 40, + defaultEfficiency: 200) { - public override ActionCategory Category => ActionCategory.Quality; - public override int Level => 71; - public override uint ActionId => 100299; - - public override bool IncreasesQuality => true; - public override int DurabilityCost => 20; - - public override int CPCost(Simulator s) => 40; - public override int Efficiency(Simulator s) => 200; - public override void UseSuccess(Simulator s) { base.UseSuccess(s); diff --git a/Simulator/Actions/PrudentSynthesis.cs b/Simulator/Actions/PrudentSynthesis.cs index a441fe9..90d7bf2 100644 --- a/Simulator/Actions/PrudentSynthesis.cs +++ b/Simulator/Actions/PrudentSynthesis.cs @@ -1,17 +1,13 @@ namespace Craftimizer.Simulator.Actions; -internal sealed class PrudentSynthesis : BaseAction +internal sealed class PrudentSynthesis() : BaseAction( + ActionCategory.Synthesis, 88, 100427, + increasesProgress: true, + durabilityCost: 5, + defaultCPCost: 18, + defaultEfficiency: 180 + ) { - public override ActionCategory Category => ActionCategory.Synthesis; - public override int Level => 88; - public override uint ActionId => 100427; - - public override bool IncreasesProgress => true; - public override int DurabilityCost => base.DurabilityCost / 2; - - public override int CPCost(Simulator s) => 18; - public override int Efficiency(Simulator s) => 180; - public override bool CouldUse(Simulator s) => !(s.HasEffect(EffectType.WasteNot) || s.HasEffect(EffectType.WasteNot2)) && base.CouldUse(s); diff --git a/Simulator/Actions/PrudentTouch.cs b/Simulator/Actions/PrudentTouch.cs index 2298f10..076c484 100644 --- a/Simulator/Actions/PrudentTouch.cs +++ b/Simulator/Actions/PrudentTouch.cs @@ -1,17 +1,13 @@ namespace Craftimizer.Simulator.Actions; -internal sealed class PrudentTouch : BaseAction +internal sealed class PrudentTouch() : BaseAction( + ActionCategory.Quality, 66, 100227, + increasesQuality: true, + durabilityCost: 5, + defaultCPCost: 25, + defaultEfficiency: 100 + ) { - public override ActionCategory Category => ActionCategory.Quality; - public override int Level => 66; - public override uint ActionId => 100227; - - public override bool IncreasesQuality => true; - public override int DurabilityCost => base.DurabilityCost / 2; - - public override int CPCost(Simulator s) => 25; - public override int Efficiency(Simulator s) => 100; - public override bool CouldUse(Simulator s) => !(s.HasEffect(EffectType.WasteNot) || s.HasEffect(EffectType.WasteNot2)) && base.CouldUse(s); diff --git a/Simulator/Actions/RapidSynthesis.cs b/Simulator/Actions/RapidSynthesis.cs index d24056e..703df9d 100644 --- a/Simulator/Actions/RapidSynthesis.cs +++ b/Simulator/Actions/RapidSynthesis.cs @@ -1,15 +1,14 @@ namespace Craftimizer.Simulator.Actions; -internal sealed class RapidSynthesis : BaseAction +internal sealed class RapidSynthesis() : BaseAction( + ActionCategory.Synthesis, 9, 100363, + increasesProgress: true, + defaultCPCost: 0, + defaultEfficiency: 250, + defaultSuccessRate: 0.50f + ) { - public override ActionCategory Category => ActionCategory.Synthesis; - public override int Level => 9; - public override uint ActionId => 100363; - - public override bool IncreasesProgress => true; - - public override int CPCost(Simulator s) => 0; // Rapid Synthesis Mastery Trait - public override int Efficiency(Simulator s) => s.Input.Stats.Level >= 63 ? 500 : 250; - public override float SuccessRate(Simulator s) => 0.50f; + public override int Efficiency(Simulator s) => + s.Input.Stats.Level >= 63 ? 500 : 250; } diff --git a/Simulator/Actions/Reflect.cs b/Simulator/Actions/Reflect.cs index 28fc811..bc459ed 100644 --- a/Simulator/Actions/Reflect.cs +++ b/Simulator/Actions/Reflect.cs @@ -1,16 +1,12 @@ namespace Craftimizer.Simulator.Actions; -internal sealed class Reflect : BaseAction +internal sealed class Reflect() : BaseAction( + ActionCategory.FirstTurn, 69, 100387, + increasesQuality: true, + defaultCPCost: 6, + defaultEfficiency: 100 + ) { - public override ActionCategory Category => ActionCategory.FirstTurn; - public override int Level => 69; - public override uint ActionId => 100387; - - public override bool IncreasesQuality => true; - - public override int CPCost(Simulator s) => 6; - public override int Efficiency(Simulator s) => 100; - public override bool IsPossible(Simulator s) => s.IsFirstStep && base.IsPossible(s); public override bool CouldUse(Simulator s) => s.IsFirstStep && base.CouldUse(s); diff --git a/Simulator/Actions/StandardTouch.cs b/Simulator/Actions/StandardTouch.cs index 59b0d1e..ca62358 100644 --- a/Simulator/Actions/StandardTouch.cs +++ b/Simulator/Actions/StandardTouch.cs @@ -1,13 +1,12 @@ namespace Craftimizer.Simulator.Actions; -internal sealed class StandardTouch : BaseAction +internal sealed class StandardTouch() : BaseAction( + ActionCategory.Quality, 18, 100004, + increasesQuality: true, + defaultCPCost: 32, + defaultEfficiency: 125 + ) { - public override ActionCategory Category => ActionCategory.Quality; - public override int Level => 18; - public override uint ActionId => 100004; - - public override bool IncreasesQuality => true; - - public override int CPCost(Simulator s) => s.ActionStates.TouchComboIdx == 1 ? 18 : 32; - public override int Efficiency(Simulator s) => 125; + public override int CPCost(Simulator s) => + s.ActionStates.TouchComboIdx == 1 ? 18 : 32; } diff --git a/Simulator/Actions/StandardTouchCombo.cs b/Simulator/Actions/StandardTouchCombo.cs index d932c85..745d0e5 100644 --- a/Simulator/Actions/StandardTouchCombo.cs +++ b/Simulator/Actions/StandardTouchCombo.cs @@ -1,9 +1,8 @@ namespace Craftimizer.Simulator.Actions; -internal sealed class StandardTouchCombo : BaseComboAction +internal sealed class StandardTouchCombo() : BaseComboAction( + ActionType.BasicTouch, ActionType.StandardTouch, 18 * 2 + ) { - public override ActionType ActionTypeA => ActionType.BasicTouch; - public override ActionType ActionTypeB => ActionType.StandardTouch; - public override int CPCost(Simulator s) => 18 * 2; } diff --git a/Simulator/Actions/TrainedEye.cs b/Simulator/Actions/TrainedEye.cs index 94c4990..fa3f467 100644 --- a/Simulator/Actions/TrainedEye.cs +++ b/Simulator/Actions/TrainedEye.cs @@ -1,21 +1,19 @@ namespace Craftimizer.Simulator.Actions; -internal sealed class TrainedEye : BaseAction +internal sealed class TrainedEye() : BaseAction( + ActionCategory.FirstTurn, 80, 100283, + increasesQuality: true, + defaultCPCost: 250 + ) { - public override ActionCategory Category => ActionCategory.FirstTurn; - public override int Level => 80; - public override uint ActionId => 100283; - - public override bool IncreasesQuality => true; - - public override int CPCost(Simulator s) => 250; - - public override bool IsPossible(Simulator s) => s.IsFirstStep && + public override bool IsPossible(Simulator s) => + s.IsFirstStep && !s.Input.Recipe.IsExpert && s.Input.Stats.Level >= (s.Input.Recipe.ClassJobLevel + 10) && base.IsPossible(s); - public override bool CouldUse(Simulator s) => s.IsFirstStep && base.CouldUse(s); + public override bool CouldUse(Simulator s) => + s.IsFirstStep && base.CouldUse(s); public override void UseSuccess(Simulator s) => s.IncreaseQualityRaw(s.Input.Recipe.MaxQuality - s.Quality); diff --git a/Simulator/Actions/TrainedFinesse.cs b/Simulator/Actions/TrainedFinesse.cs index 724d0aa..79888f7 100644 --- a/Simulator/Actions/TrainedFinesse.cs +++ b/Simulator/Actions/TrainedFinesse.cs @@ -1,17 +1,13 @@ namespace Craftimizer.Simulator.Actions; -internal sealed class TrainedFinesse : BaseAction +internal sealed class TrainedFinesse() : BaseAction( + ActionCategory.Quality, 90, 100435, + increasesQuality: true, + durabilityCost: 0, + defaultCPCost: 32, + defaultEfficiency: 100 + ) { - public override ActionCategory Category => ActionCategory.Quality; - public override int Level => 90; - public override uint ActionId => 100435; - - public override bool IncreasesQuality => true; - public override int DurabilityCost => 0; - - public override int CPCost(Simulator s) => 32; - public override int Efficiency(Simulator s) => 100; - public override bool CouldUse(Simulator s) => s.GetEffectStrength(EffectType.InnerQuiet) == 10 && base.CouldUse(s); diff --git a/Simulator/Actions/TricksOfTheTrade.cs b/Simulator/Actions/TricksOfTheTrade.cs index 22a375f..bc7d6c6 100644 --- a/Simulator/Actions/TricksOfTheTrade.cs +++ b/Simulator/Actions/TricksOfTheTrade.cs @@ -1,15 +1,11 @@ namespace Craftimizer.Simulator.Actions; -internal sealed class TricksOfTheTrade : BaseAction +internal sealed class TricksOfTheTrade() : BaseAction( + ActionCategory.Other, 13, 100371, + durabilityCost: 0, + defaultCPCost: 0 + ) { - public override ActionCategory Category => ActionCategory.Other; - public override int Level => 13; - public override uint ActionId => 100371; - - public override int DurabilityCost => 0; - - public override int CPCost(Simulator s) => 0; - public override bool CouldUse(Simulator s) => (s.Condition == Condition.Good || s.Condition == Condition.Excellent || s.HasEffect(EffectType.HeartAndSoul)) && base.CouldUse(s); diff --git a/Simulator/Actions/Veneration.cs b/Simulator/Actions/Veneration.cs index b270587..d6b1686 100644 --- a/Simulator/Actions/Veneration.cs +++ b/Simulator/Actions/Veneration.cs @@ -1,13 +1,10 @@ namespace Craftimizer.Simulator.Actions; -internal sealed class Veneration : BaseBuffAction +internal sealed class Veneration() : BaseBuffAction( + ActionCategory.Buffs, 15, 19297, + EffectType.Veneration, duration: 4, + defaultCPCost: 18 + ) { - public override ActionCategory Category => ActionCategory.Buffs; - public override int Level => 15; - public override uint ActionId => 19297; - public override EffectType Effect => EffectType.Veneration; - public override byte Duration => 4; - - public override int CPCost(Simulator s) => 18; } diff --git a/Simulator/Actions/WasteNot.cs b/Simulator/Actions/WasteNot.cs index 37bd64c..0c9f5c6 100644 --- a/Simulator/Actions/WasteNot.cs +++ b/Simulator/Actions/WasteNot.cs @@ -1,16 +1,11 @@ namespace Craftimizer.Simulator.Actions; -internal sealed class WasteNot : BaseBuffAction +internal sealed class WasteNot() : BaseBuffAction( + ActionCategory.Durability, 15, 4631, + EffectType.WasteNot, duration: 4, + defaultCPCost: 56 + ) { - public override ActionCategory Category => ActionCategory.Durability; - public override int Level => 15; - public override uint ActionId => 4631; - - public override EffectType Effect => EffectType.WasteNot; - public override byte Duration => 4; - - public override int CPCost(Simulator s) => 56; - public override void UseSuccess(Simulator s) { base.UseSuccess(s); diff --git a/Simulator/Actions/WasteNot2.cs b/Simulator/Actions/WasteNot2.cs index d939f96..e09fd1e 100644 --- a/Simulator/Actions/WasteNot2.cs +++ b/Simulator/Actions/WasteNot2.cs @@ -1,16 +1,11 @@ namespace Craftimizer.Simulator.Actions; -internal sealed class WasteNot2 : BaseBuffAction +internal sealed class WasteNot2() : BaseBuffAction( + ActionCategory.Durability, 47, 4639, + EffectType.WasteNot2, duration: 8, + defaultCPCost: 98 + ) { - public override ActionCategory Category => ActionCategory.Durability; - public override int Level => 47; - public override uint ActionId => 4639; - - public override EffectType Effect => EffectType.WasteNot2; - public override byte Duration => 8; - - public override int CPCost(Simulator s) => 98; - public override void UseSuccess(Simulator s) { base.UseSuccess(s); diff --git a/Simulator/Craftimizer.Simulator.csproj b/Simulator/Craftimizer.Simulator.csproj index 902747a..05da899 100644 --- a/Simulator/Craftimizer.Simulator.csproj +++ b/Simulator/Craftimizer.Simulator.csproj @@ -3,6 +3,7 @@ net8.0 enable + 12.0 enable x64 Debug;Release