diff --git a/Craftimizer/SimulatorUtils.cs b/Craftimizer/SimulatorUtils.cs index ba63f07..e084c8d 100644 --- a/Craftimizer/SimulatorUtils.cs +++ b/Craftimizer/SimulatorUtils.cs @@ -317,7 +317,7 @@ internal static class EffectUtils }; public static bool IsIndefinite(this EffectType me) => - me is EffectType.InnerQuiet or EffectType.HeartAndSoul; + me is EffectType.InnerQuiet or EffectType.HeartAndSoul or EffectType.TrainedPerfection; public static Status Status(this EffectType me) => LuminaSheets.StatusSheet.GetRow(me.StatusId())!; diff --git a/Craftimizer/Windows/SynthHelper.cs b/Craftimizer/Windows/SynthHelper.cs index 06fb0b9..4e09591 100644 --- a/Craftimizer/Windows/SynthHelper.cs +++ b/Craftimizer/Windows/SynthHelper.cs @@ -587,7 +587,7 @@ public sealed unsafe class SynthHelper : Window, IDisposable MuscleMemory = GetEffectStack((ushort)EffectType.MuscleMemory.StatusId()), Manipulation = GetEffectStack((ushort)EffectType.Manipulation.StatusId()), Expedience = GetEffectStack((ushort)EffectType.Expedience.StatusId()), - TrainedPerfection = GetEffectStack((ushort)EffectType.TrainedPerfection.StatusId()), + TrainedPerfection = HasEffect((ushort)EffectType.TrainedPerfection.StatusId()), HeartAndSoul = HasEffect((ushort)EffectType.HeartAndSoul.StatusId()), }, ActionStates = CurrentActionStates diff --git a/Simulator/Actions/BaseAction.cs b/Simulator/Actions/BaseAction.cs index ce63a80..90435ce 100644 --- a/Simulator/Actions/BaseAction.cs +++ b/Simulator/Actions/BaseAction.cs @@ -67,8 +67,7 @@ public abstract class BaseAction( UseSuccess(s); s.ReduceCP(CPCost(s)); - if (!s.HasEffect(EffectType.TrainedPerfection)) - s.ReduceDurability(DurabilityCost); + s.ReduceDurability(DurabilityCost); if (IncreasesStepCount) { diff --git a/Simulator/Actions/ImmaculateMend.cs b/Simulator/Actions/ImmaculateMend.cs index fe41b9e..b7d2a1d 100644 --- a/Simulator/Actions/ImmaculateMend.cs +++ b/Simulator/Actions/ImmaculateMend.cs @@ -2,7 +2,6 @@ namespace Craftimizer.Simulator.Actions; internal sealed class ImmaculateMend() : BaseAction( ActionCategory.Durability, 98, 100467, - macroWaitTime: 2, durabilityCost: 0, defaultCPCost: 112 ) diff --git a/Simulator/Actions/IntensiveSynthesis.cs b/Simulator/Actions/IntensiveSynthesis.cs index bb66c95..4d51448 100644 --- a/Simulator/Actions/IntensiveSynthesis.cs +++ b/Simulator/Actions/IntensiveSynthesis.cs @@ -8,13 +8,13 @@ internal sealed class IntensiveSynthesis() : BaseAction( ) { public override bool CouldUse(Simulator s) => - (s.Condition == Condition.Good || s.Condition == Condition.Excellent || s.HasEffect(EffectType.HeartAndSoul)) + (s.Condition is Condition.Good or Condition.Excellent || s.HasEffect(EffectType.HeartAndSoul)) && base.CouldUse(s); public override void UseSuccess(Simulator s) { base.UseSuccess(s); - if (s.Condition != Condition.Good && s.Condition != Condition.Excellent) + if (s.Condition is not (Condition.Good or Condition.Excellent)) s.RemoveEffect(EffectType.HeartAndSoul); } } diff --git a/Simulator/Actions/MastersMend.cs b/Simulator/Actions/MastersMend.cs index 7287371..7416a20 100644 --- a/Simulator/Actions/MastersMend.cs +++ b/Simulator/Actions/MastersMend.cs @@ -2,7 +2,6 @@ namespace Craftimizer.Simulator.Actions; internal sealed class MastersMend() : BaseAction( ActionCategory.Durability, 7, 100003, - macroWaitTime: 2, durabilityCost: 0, defaultCPCost: 88 ) diff --git a/Simulator/Actions/PreciseTouch.cs b/Simulator/Actions/PreciseTouch.cs index 95c1ead..f5ba42d 100644 --- a/Simulator/Actions/PreciseTouch.cs +++ b/Simulator/Actions/PreciseTouch.cs @@ -8,14 +8,14 @@ internal sealed class PreciseTouch() : BaseAction( ) { public override bool CouldUse(Simulator s) => - (s.Condition == Condition.Good || s.Condition == Condition.Excellent || s.HasEffect(EffectType.HeartAndSoul)) + (s.Condition is Condition.Good or Condition.Excellent || s.HasEffect(EffectType.HeartAndSoul)) && base.CouldUse(s); public override void UseSuccess(Simulator s) { base.UseSuccess(s); s.StrengthenEffect(EffectType.InnerQuiet); - if (s.Condition != Condition.Good && s.Condition != Condition.Excellent) + if (s.Condition is not (Condition.Good or Condition.Excellent)) s.RemoveEffect(EffectType.HeartAndSoul); } } diff --git a/Simulator/Actions/TrainedPerfection.cs b/Simulator/Actions/TrainedPerfection.cs index f340eea..d7f2662 100644 --- a/Simulator/Actions/TrainedPerfection.cs +++ b/Simulator/Actions/TrainedPerfection.cs @@ -10,4 +10,7 @@ internal sealed class TrainedPerfection() : BaseBuffAction( public override bool CouldUse(Simulator s) => !s.ActionStates.UsedTrainedPerfection; + + public override string GetTooltip(Simulator s, bool addUsability) => + GetBaseTooltip(s, addUsability); } diff --git a/Simulator/Actions/TricksOfTheTrade.cs b/Simulator/Actions/TricksOfTheTrade.cs index bc7d6c6..630637d 100644 --- a/Simulator/Actions/TricksOfTheTrade.cs +++ b/Simulator/Actions/TricksOfTheTrade.cs @@ -7,13 +7,13 @@ internal sealed class TricksOfTheTrade() : BaseAction( ) { public override bool CouldUse(Simulator s) => - (s.Condition == Condition.Good || s.Condition == Condition.Excellent || s.HasEffect(EffectType.HeartAndSoul)) + (s.Condition is Condition.Good or Condition.Excellent || s.HasEffect(EffectType.HeartAndSoul)) && base.CouldUse(s); public override void UseSuccess(Simulator s) { s.RestoreCP(20); - if (s.Condition != Condition.Good && s.Condition != Condition.Excellent) + if (s.Condition is not (Condition.Good or Condition.Excellent)) s.RemoveEffect(EffectType.HeartAndSoul); } } diff --git a/Simulator/Effects.cs b/Simulator/Effects.cs index 41f21b9..29a490c 100644 --- a/Simulator/Effects.cs +++ b/Simulator/Effects.cs @@ -17,7 +17,7 @@ public record struct Effects public byte MuscleMemory; public byte Manipulation; public byte Expedience; - public byte TrainedPerfection; + public bool TrainedPerfection; public bool HeartAndSoul; [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -57,7 +57,7 @@ public record struct Effects Expedience = duration; break; case EffectType.TrainedPerfection: - TrainedPerfection = duration; + TrainedPerfection = duration != 0; break; case EffectType.HeartAndSoul: HeartAndSoul = duration != 0; @@ -87,16 +87,11 @@ public record struct Effects EffectType.MuscleMemory => MuscleMemory, EffectType.Manipulation => Manipulation, EffectType.Expedience => Expedience, - EffectType.TrainedPerfection => TrainedPerfection, + EffectType.TrainedPerfection => (byte)(TrainedPerfection ? 1 : 0), EffectType.HeartAndSoul => (byte)(HeartAndSoul ? 1 : 0), _ => 0 }; - [Pure] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool IsIndefinite(EffectType effect) => - effect is EffectType.InnerQuiet or EffectType.HeartAndSoul; - [Pure] [MethodImpl(MethodImplOptions.AggressiveInlining)] public readonly byte GetStrength(EffectType effect) => @@ -129,7 +124,5 @@ public record struct Effects Manipulation--; if (Expedience > 0) Expedience--; - if (TrainedPerfection > 0) - TrainedPerfection--; } } diff --git a/Simulator/Simulator.cs b/Simulator/Simulator.cs index 67a7700..62856fe 100644 --- a/Simulator/Simulator.cs +++ b/Simulator/Simulator.cs @@ -183,7 +183,6 @@ public class Simulator Durability = Input.Recipe.MaxDurability; } - public void RestoreCP(int amount) { CP += amount; @@ -200,8 +199,18 @@ public class Simulator return Math.Clamp(successRate, 0, 100); } - public int CalculateDurabilityCost(int amount) + public int CalculateDurabilityCost(int amount, bool dryRun = true) { + if (amount == 0) + return 0; + + if (HasEffect(EffectType.TrainedPerfection)) + { + if (!dryRun) + RemoveEffect(EffectType.TrainedPerfection); + return 0; + } + var amt = (double)amount; if (HasEffect(EffectType.WasteNot) || HasEffect(EffectType.WasteNot2)) amt /= 2; @@ -295,7 +304,7 @@ public class Simulator [MethodImpl(MethodImplOptions.AggressiveInlining)] public void ReduceDurability(int amount) => - ReduceDurabilityRaw(CalculateDurabilityCost(amount)); + ReduceDurabilityRaw(CalculateDurabilityCost(amount, false)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public void ReduceCP(int amount) =>