From bf645eff6716c5957807425fbea31f050604047a Mon Sep 17 00:00:00 2001 From: Asriel Camora Date: Tue, 13 Jun 2023 16:53:08 -0700 Subject: [PATCH] Finish simulation implementation (?) --- Craftimizer/Simulator/ActionCategory.cs | 2 +- Craftimizer/Simulator/CharacterStats.cs | 10 ++--- Craftimizer/Simulator/CompletionReason.cs | 7 ++++ Craftimizer/Simulator/Condition.cs | 2 +- Craftimizer/Simulator/Effect.cs | 2 +- Craftimizer/Simulator/Simulation.cs | 48 ++++++++++++++++++++++- 6 files changed, 62 insertions(+), 9 deletions(-) create mode 100644 Craftimizer/Simulator/CompletionReason.cs diff --git a/Craftimizer/Simulator/ActionCategory.cs b/Craftimizer/Simulator/ActionCategory.cs index 12ef37d..97ce59e 100644 --- a/Craftimizer/Simulator/ActionCategory.cs +++ b/Craftimizer/Simulator/ActionCategory.cs @@ -1,6 +1,6 @@ namespace Craftimizer.Simulator; -internal enum ActionCategory +public enum ActionCategory { FirstTurn, Synthesis, diff --git a/Craftimizer/Simulator/CharacterStats.cs b/Craftimizer/Simulator/CharacterStats.cs index c325569..7ed084c 100644 --- a/Craftimizer/Simulator/CharacterStats.cs +++ b/Craftimizer/Simulator/CharacterStats.cs @@ -3,12 +3,12 @@ using Craftimizer.Plugin; namespace Craftimizer.Simulator; -internal record CharacterStats +public record CharacterStats { - public int Craftsmanship { get; } - public int Control { get; } - public int CP { get; } - public int Level { get; } + public int Craftsmanship { get; init; } + public int Control { get; init; } + public int CP { get; init; } + public int Level { get; init; } public int CLvl => Level <= 80 ? LuminaSheets.ParamGrowSheet.GetRow((uint)Level)!.CraftingLevel diff --git a/Craftimizer/Simulator/CompletionReason.cs b/Craftimizer/Simulator/CompletionReason.cs new file mode 100644 index 0000000..8a79f7c --- /dev/null +++ b/Craftimizer/Simulator/CompletionReason.cs @@ -0,0 +1,7 @@ +namespace Craftimizer.Simulator; + +public enum CompletionReason +{ + ProgressComplete, + NoMoreDurability +} diff --git a/Craftimizer/Simulator/Condition.cs b/Craftimizer/Simulator/Condition.cs index f098f69..9ed2443 100644 --- a/Craftimizer/Simulator/Condition.cs +++ b/Craftimizer/Simulator/Condition.cs @@ -1,6 +1,6 @@ namespace Craftimizer.Simulator; -internal enum Condition +public enum Condition { Poor, Normal, diff --git a/Craftimizer/Simulator/Effect.cs b/Craftimizer/Simulator/Effect.cs index 289d339..ff3cd0f 100644 --- a/Craftimizer/Simulator/Effect.cs +++ b/Craftimizer/Simulator/Effect.cs @@ -1,6 +1,6 @@ namespace Craftimizer.Simulator; -internal enum Effect +public enum Effect { InnerQuiet, WasteNot, diff --git a/Craftimizer/Simulator/Simulation.cs b/Craftimizer/Simulator/Simulation.cs index 1b1cf8c..c890c89 100644 --- a/Craftimizer/Simulator/Simulation.cs +++ b/Craftimizer/Simulator/Simulation.cs @@ -5,13 +5,17 @@ using System.Collections.Generic; namespace Craftimizer.Simulator; -internal class Simulation +public class Simulation { public CharacterStats Stats { get; } public Recipe Recipe { get; } public RecipeLevelTable RecipeTable => Recipe.RecipeLevelTable.Value!; public int RLvl => (int)RecipeTable.RowId; + public int MaxDurability => RecipeTable.Durability * Recipe.DurabilityFactor; + public int MaxQuality => (int)RecipeTable.Quality * Recipe.QualityFactor; + public int MaxProgress => RecipeTable.Difficulty * Recipe.DifficultyFactor; + public int StepCount => ActionHistory.Count; public int Progress { get; private set; } public int Quality { get; private set; } @@ -29,8 +33,44 @@ internal class Simulation { Stats = stats; Recipe = recipe; + Progress = 0; + Quality = 0; + Durability = MaxDurability; + CP = Stats.CP; + Condition = Condition.Normal; } + public CompletionReason? Execute(BaseAction action) + { + if (!action.CanUse) + return null; + + action.Use(); + ActionHistory.Add(action); + + for (var i = 0; i < ActiveEffects.Count; ++i) + { + var (effect, strength, stepsLeft) = ActiveEffects[i]; + if (stepsLeft == 1) + { + ActiveEffects.RemoveAt(i); + --i; + } + else + ActiveEffects[i] = (effect, strength, stepsLeft - 1); + } + + if (Progress >= MaxProgress) + return CompletionReason.ProgressComplete; + if (Durability <= 0) + return CompletionReason.NoMoreDurability; + + return null; + } + + public CompletionReason? Execute() where T : BaseAction => + Execute((T)Activator.CreateInstance(typeof(T), this)!); + public (int Strength, int Duration)? GetEffect(Effect effect) { var idx = ActiveEffects.FindIndex(x => x.effect == effect); @@ -116,6 +156,12 @@ internal class Simulation baseIncrease *= RecipeTable.ProgressModifier / 100; Progress += (int)(baseIncrease * efficiency); + + if (HasEffect(Effect.FinalAppraisal) && Progress >= MaxProgress) + { + Progress = MaxProgress - 1; + RemoveEffect(Effect.FinalAppraisal); + } } public void IncreaseQuality(float efficiency)