diff --git a/Simulator/Actions/AdvancedTouch.cs b/Simulator/Actions/AdvancedTouch.cs index 0b5eb79..ec1f0af 100644 --- a/Simulator/Actions/AdvancedTouch.cs +++ b/Simulator/Actions/AdvancedTouch.cs @@ -9,5 +9,5 @@ internal sealed class AdvancedTouch : BaseAction public override bool IncreasesQuality => true; public override int CPCost(Simulator s) => s.ActionStates.TouchComboIdx == 2 ? 18 : 46; - public override float Efficiency(Simulator s) => 1.50f; + public override int Efficiency(Simulator s) => 150; } diff --git a/Simulator/Actions/BaseAction.cs b/Simulator/Actions/BaseAction.cs index 8b3edb1..8e006be 100644 --- a/Simulator/Actions/BaseAction.cs +++ b/Simulator/Actions/BaseAction.cs @@ -22,7 +22,7 @@ public abstract class BaseAction // Instanced properties public abstract int CPCost(Simulator s); - public virtual float Efficiency(Simulator s) => 0f; + public virtual int Efficiency(Simulator s) => 0; public virtual float SuccessRate(Simulator s) => 1f; public virtual bool CanUse(Simulator s) => diff --git a/Simulator/Actions/BasicSynthesis.cs b/Simulator/Actions/BasicSynthesis.cs index e3565c2..2ad8d82 100644 --- a/Simulator/Actions/BasicSynthesis.cs +++ b/Simulator/Actions/BasicSynthesis.cs @@ -10,5 +10,5 @@ internal sealed class BasicSynthesis : BaseAction public override int CPCost(Simulator s) => 0; // Basic Synthesis Mastery Trait - public override float Efficiency(Simulator s) => s.Input.Stats.Level >= 31 ? 1.20f : 1.00f; + 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 ae13294..e3a2434 100644 --- a/Simulator/Actions/BasicTouch.cs +++ b/Simulator/Actions/BasicTouch.cs @@ -9,5 +9,5 @@ internal sealed class BasicTouch : BaseAction public override bool IncreasesQuality => true; public override int CPCost(Simulator s) => 18; - public override float Efficiency(Simulator s) => 1.00f; + public override int Efficiency(Simulator s) => 100; } diff --git a/Simulator/Actions/ByregotsBlessing.cs b/Simulator/Actions/ByregotsBlessing.cs index da20ce8..257db8e 100644 --- a/Simulator/Actions/ByregotsBlessing.cs +++ b/Simulator/Actions/ByregotsBlessing.cs @@ -9,7 +9,7 @@ internal sealed class ByregotsBlessing : BaseAction public override bool IncreasesQuality => true; public override int CPCost(Simulator s) => 24; - public override float Efficiency(Simulator s) => 1.00f + (0.20f * s.GetEffectStrength(EffectType.InnerQuiet)); + public override int Efficiency(Simulator s) => 100 + (20 * s.GetEffectStrength(EffectType.InnerQuiet)); public override bool CanUse(Simulator s) => s.HasEffect(EffectType.InnerQuiet) && base.CanUse(s); diff --git a/Simulator/Actions/CarefulSynthesis.cs b/Simulator/Actions/CarefulSynthesis.cs index b72ea55..4449583 100644 --- a/Simulator/Actions/CarefulSynthesis.cs +++ b/Simulator/Actions/CarefulSynthesis.cs @@ -10,5 +10,5 @@ internal sealed class CarefulSynthesis : BaseAction public override int CPCost(Simulator s) => 7; // Careful Synthesis Mastery Trait - public override float Efficiency(Simulator s) => s.Input.Stats.Level >= 82 ? 1.80f : 1.50f; + 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 8b88dcb..688352f 100644 --- a/Simulator/Actions/DelicateSynthesis.cs +++ b/Simulator/Actions/DelicateSynthesis.cs @@ -10,5 +10,5 @@ internal sealed class DelicateSynthesis : BaseAction public override bool IncreasesQuality => true; public override int CPCost(Simulator s) => 32; - public override float Efficiency(Simulator s) => 1.00f; + public override int Efficiency(Simulator s) => 100; } diff --git a/Simulator/Actions/FocusedSynthesis.cs b/Simulator/Actions/FocusedSynthesis.cs index df256cf..407077e 100644 --- a/Simulator/Actions/FocusedSynthesis.cs +++ b/Simulator/Actions/FocusedSynthesis.cs @@ -9,6 +9,6 @@ internal sealed class FocusedSynthesis : BaseAction public override bool IncreasesProgress => true; public override int CPCost(Simulator s) => 5; - public override float Efficiency(Simulator s) => 2.00f; + public override int Efficiency(Simulator s) => 200; public override float SuccessRate(Simulator s) => s.ActionStates.Observed ? 1.00f : 0.50f; } diff --git a/Simulator/Actions/FocusedTouch.cs b/Simulator/Actions/FocusedTouch.cs index 928ef2d..1afde89 100644 --- a/Simulator/Actions/FocusedTouch.cs +++ b/Simulator/Actions/FocusedTouch.cs @@ -9,6 +9,6 @@ internal sealed class FocusedTouch : BaseAction public override bool IncreasesQuality => true; public override int CPCost(Simulator s) => 18; - public override float Efficiency(Simulator s) => 1.50f; + public override int Efficiency(Simulator s) => 150; public override float SuccessRate(Simulator s) => s.ActionStates.Observed ? 1.00f : 0.50f; } diff --git a/Simulator/Actions/Groundwork.cs b/Simulator/Actions/Groundwork.cs index c953602..118b3ec 100644 --- a/Simulator/Actions/Groundwork.cs +++ b/Simulator/Actions/Groundwork.cs @@ -10,10 +10,10 @@ internal sealed class Groundwork : BaseAction public override int DurabilityCost => 20; public override int CPCost(Simulator s) => 18; - public override float Efficiency(Simulator s) + public override int Efficiency(Simulator s) { // Groundwork Mastery Trait - var ret = s.Input.Stats.Level >= 86 ? 3.60f : 3.00f; + var ret = s.Input.Stats.Level >= 86 ? 360 : 300; return s.Durability < s.CalculateDurabilityCost(DurabilityCost) ? ret / 2 : ret; } } diff --git a/Simulator/Actions/HastyTouch.cs b/Simulator/Actions/HastyTouch.cs index e0005b5..cfa179d 100644 --- a/Simulator/Actions/HastyTouch.cs +++ b/Simulator/Actions/HastyTouch.cs @@ -9,6 +9,6 @@ internal sealed class HastyTouch : BaseAction public override bool IncreasesQuality => true; public override int CPCost(Simulator s) => 0; - public override float Efficiency(Simulator s) => 1.00f; + public override int Efficiency(Simulator s) => 100; public override float SuccessRate(Simulator s) => 0.60f; } diff --git a/Simulator/Actions/IntensiveSynthesis.cs b/Simulator/Actions/IntensiveSynthesis.cs index 707bac0..54db7b0 100644 --- a/Simulator/Actions/IntensiveSynthesis.cs +++ b/Simulator/Actions/IntensiveSynthesis.cs @@ -9,7 +9,7 @@ internal sealed class IntensiveSynthesis : BaseAction public override bool IncreasesProgress => true; public override int CPCost(Simulator s) => 6; - public override float Efficiency(Simulator s) => 4.00f; + public override int Efficiency(Simulator s) => 400; public override bool CanUse(Simulator s) => (s.Condition == Condition.Good || s.Condition == Condition.Excellent || s.HasEffect(EffectType.HeartAndSoul)) diff --git a/Simulator/Actions/MuscleMemory.cs b/Simulator/Actions/MuscleMemory.cs index c5efc16..f6eb09d 100644 --- a/Simulator/Actions/MuscleMemory.cs +++ b/Simulator/Actions/MuscleMemory.cs @@ -9,7 +9,7 @@ internal sealed class MuscleMemory : BaseAction public override bool IncreasesProgress => true; public override int CPCost(Simulator s) => 6; - public override float Efficiency(Simulator s) => 3.00f; + public override int Efficiency(Simulator s) => 300; public override bool CanUse(Simulator s) => s.IsFirstStep && base.CanUse(s); diff --git a/Simulator/Actions/PreciseTouch.cs b/Simulator/Actions/PreciseTouch.cs index 97489f5..1be9c2d 100644 --- a/Simulator/Actions/PreciseTouch.cs +++ b/Simulator/Actions/PreciseTouch.cs @@ -9,7 +9,7 @@ internal sealed class PreciseTouch : BaseAction public override bool IncreasesQuality => true; public override int CPCost(Simulator s) => 18; - public override float Efficiency(Simulator s) => 1.50f; + public override int Efficiency(Simulator s) => 150; public override bool CanUse(Simulator s) => (s.Condition == Condition.Good || s.Condition == Condition.Excellent || s.HasEffect(EffectType.HeartAndSoul)) diff --git a/Simulator/Actions/PreparatoryTouch.cs b/Simulator/Actions/PreparatoryTouch.cs index 0f83cd7..f5f0950 100644 --- a/Simulator/Actions/PreparatoryTouch.cs +++ b/Simulator/Actions/PreparatoryTouch.cs @@ -10,7 +10,7 @@ internal sealed class PreparatoryTouch : BaseAction public override int DurabilityCost => 20; public override int CPCost(Simulator s) => 40; - public override float Efficiency(Simulator s) => 2.00f; + public override int Efficiency(Simulator s) => 200; public override void UseSuccess(Simulator s) { diff --git a/Simulator/Actions/PrudentSynthesis.cs b/Simulator/Actions/PrudentSynthesis.cs index 91d4a6b..1ac3a22 100644 --- a/Simulator/Actions/PrudentSynthesis.cs +++ b/Simulator/Actions/PrudentSynthesis.cs @@ -10,7 +10,7 @@ internal sealed class PrudentSynthesis : BaseAction public override int DurabilityCost => base.DurabilityCost / 2; public override int CPCost(Simulator s) => 18; - public override float Efficiency(Simulator s) => 1.80f; + public override int Efficiency(Simulator s) => 180; public override bool CanUse(Simulator s) => !(s.HasEffect(EffectType.WasteNot) || s.HasEffect(EffectType.WasteNot2)) diff --git a/Simulator/Actions/PrudentTouch.cs b/Simulator/Actions/PrudentTouch.cs index a082d9e..f01f814 100644 --- a/Simulator/Actions/PrudentTouch.cs +++ b/Simulator/Actions/PrudentTouch.cs @@ -10,7 +10,7 @@ internal sealed class PrudentTouch : BaseAction public override int DurabilityCost => base.DurabilityCost / 2; public override int CPCost(Simulator s) => 25; - public override float Efficiency(Simulator s) => 1.00f; + public override int Efficiency(Simulator s) => 100; public override bool CanUse(Simulator s) => !(s.HasEffect(EffectType.WasteNot) || s.HasEffect(EffectType.WasteNot2)) diff --git a/Simulator/Actions/RapidSynthesis.cs b/Simulator/Actions/RapidSynthesis.cs index 7bfc8fc..d24056e 100644 --- a/Simulator/Actions/RapidSynthesis.cs +++ b/Simulator/Actions/RapidSynthesis.cs @@ -10,6 +10,6 @@ internal sealed class RapidSynthesis : BaseAction public override int CPCost(Simulator s) => 0; // Rapid Synthesis Mastery Trait - public override float Efficiency(Simulator s) => s.Input.Stats.Level >= 63 ? 5.00f : 2.50f; + public override int Efficiency(Simulator s) => s.Input.Stats.Level >= 63 ? 500 : 250; public override float SuccessRate(Simulator s) => 0.50f; } diff --git a/Simulator/Actions/Reflect.cs b/Simulator/Actions/Reflect.cs index fe3afac..9a7dbdc 100644 --- a/Simulator/Actions/Reflect.cs +++ b/Simulator/Actions/Reflect.cs @@ -9,7 +9,7 @@ internal sealed class Reflect : BaseAction public override bool IncreasesQuality => true; public override int CPCost(Simulator s) => 6; - public override float Efficiency(Simulator s) => 1.00f; + public override int Efficiency(Simulator s) => 100; public override bool CanUse(Simulator s) => s.IsFirstStep && base.CanUse(s); diff --git a/Simulator/Actions/StandardTouch.cs b/Simulator/Actions/StandardTouch.cs index b3e0e58..59b0d1e 100644 --- a/Simulator/Actions/StandardTouch.cs +++ b/Simulator/Actions/StandardTouch.cs @@ -9,5 +9,5 @@ internal sealed class StandardTouch : BaseAction public override bool IncreasesQuality => true; public override int CPCost(Simulator s) => s.ActionStates.TouchComboIdx == 1 ? 18 : 32; - public override float Efficiency(Simulator s) => 1.25f; + public override int Efficiency(Simulator s) => 125; } diff --git a/Simulator/Actions/TrainedFinesse.cs b/Simulator/Actions/TrainedFinesse.cs index d884a8c..28026c2 100644 --- a/Simulator/Actions/TrainedFinesse.cs +++ b/Simulator/Actions/TrainedFinesse.cs @@ -10,7 +10,7 @@ internal sealed class TrainedFinesse : BaseAction public override int DurabilityCost => 0; public override int CPCost(Simulator s) => 32; - public override float Efficiency(Simulator s) => 1.00f; + public override int Efficiency(Simulator s) => 100; public override bool CanUse(Simulator s) => s.GetEffectStrength(EffectType.InnerQuiet) == 10 diff --git a/Simulator/Simulator.cs b/Simulator/Simulator.cs index d108e4c..492b4db 100644 --- a/Simulator/Simulator.cs +++ b/Simulator/Simulator.cs @@ -213,51 +213,51 @@ public class Simulator return (int)Math.Ceiling(amt); } - public int CalculateProgressGain(float efficiency, bool dryRun = true) + public int CalculateProgressGain(int efficiency, bool dryRun = true) { - var buffModifier = 1.00f; + var buffModifier = 100; if (HasEffect(EffectType.MuscleMemory)) { - buffModifier += 1.00f; + buffModifier += 100; if (!dryRun) RemoveEffect(EffectType.MuscleMemory); } if (HasEffect(EffectType.Veneration)) - buffModifier += 0.50f; + buffModifier += 50; var conditionModifier = Condition switch { - Condition.Malleable => 1.50f, - _ => 1.00f + Condition.Malleable => 150, + _ => 100 }; - var progressGain = (int)(Input.BaseProgressGain * efficiency * conditionModifier * buffModifier); + var progressGain = (int)((long)Input.BaseProgressGain * efficiency * conditionModifier * buffModifier / 1e6); return progressGain; } - public int CalculateQualityGain(float efficiency, bool dryRun = true) + public int CalculateQualityGain(int efficiency, bool dryRun = true) { - var buffModifier = 1.00f; + var buffModifier = 100; if (HasEffect(EffectType.GreatStrides)) { - buffModifier += 1.00f; + buffModifier += 100; if (!dryRun) RemoveEffect(EffectType.GreatStrides); } if (HasEffect(EffectType.Innovation)) - buffModifier += 0.50f; + buffModifier += 50; - buffModifier *= 1 + (GetEffectStrength(EffectType.InnerQuiet) * 0.10f); + var iqModifier = 100 + (GetEffectStrength(EffectType.InnerQuiet) * 10); var conditionModifier = Condition switch { - Condition.Poor => 0.50f, - Condition.Good => Input.Stats.HasSplendorousBuff ? 1.75f : 1.50f, - Condition.Excellent => 4.00f, - _ => 1.00f, + Condition.Poor => 50, + Condition.Good => Input.Stats.HasSplendorousBuff ? 175 : 150, + Condition.Excellent => 400, + _ => 100, }; - var qualityGain = (int)(Input.BaseQualityGain * efficiency * conditionModifier * buffModifier); + var qualityGain = (int)((long)Input.BaseQualityGain * efficiency * conditionModifier * iqModifier * buffModifier / 1e8); return qualityGain; } @@ -297,10 +297,10 @@ public class Simulator ReduceCPRaw(CalculateCPCost(amount)); [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void IncreaseProgress(float efficiency) => + public void IncreaseProgress(int efficiency) => IncreaseProgressRaw(CalculateProgressGain(efficiency, false)); [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void IncreaseQuality(float efficiency) => + public void IncreaseQuality(int efficiency) => IncreaseQualityRaw(CalculateQualityGain(efficiency, false)); } diff --git a/Solver/ActionSet.cs b/Solver/ActionSet.cs index 43b5874..b4af25f 100644 --- a/Solver/ActionSet.cs +++ b/Solver/ActionSet.cs @@ -49,6 +49,8 @@ public struct ActionSet static ActionSet() { AcceptedActionsLUT = new int[Enum.GetValues().Length]; + for (var i = 0; i < AcceptedActionsLUT.Length; i++) + AcceptedActionsLUT[i] = -1; for (var i = 0; i < AcceptedActions.Length; i++) AcceptedActionsLUT[(byte)AcceptedActions[i]] = i; } @@ -57,7 +59,7 @@ public struct ActionSet [MethodImpl(MethodImplOptions.AggressiveInlining)] private static int FromAction(ActionType action) { - var ret = Simulator.AcceptedActionsLUT[(byte)action]; + var ret = AcceptedActionsLUT[(byte)action]; if (ret == -1) throw new ArgumentOutOfRangeException(nameof(action), action, $"Action {action} is unsupported in {nameof(ActionSet)}."); return ret;