Finish simulation implementation (?)
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
namespace Craftimizer.Simulator;
|
namespace Craftimizer.Simulator;
|
||||||
|
|
||||||
internal enum ActionCategory
|
public enum ActionCategory
|
||||||
{
|
{
|
||||||
FirstTurn,
|
FirstTurn,
|
||||||
Synthesis,
|
Synthesis,
|
||||||
|
|||||||
@@ -3,12 +3,12 @@ using Craftimizer.Plugin;
|
|||||||
|
|
||||||
namespace Craftimizer.Simulator;
|
namespace Craftimizer.Simulator;
|
||||||
|
|
||||||
internal record CharacterStats
|
public record CharacterStats
|
||||||
{
|
{
|
||||||
public int Craftsmanship { get; }
|
public int Craftsmanship { get; init; }
|
||||||
public int Control { get; }
|
public int Control { get; init; }
|
||||||
public int CP { get; }
|
public int CP { get; init; }
|
||||||
public int Level { get; }
|
public int Level { get; init; }
|
||||||
|
|
||||||
public int CLvl => Level <= 80
|
public int CLvl => Level <= 80
|
||||||
? LuminaSheets.ParamGrowSheet.GetRow((uint)Level)!.CraftingLevel
|
? LuminaSheets.ParamGrowSheet.GetRow((uint)Level)!.CraftingLevel
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
namespace Craftimizer.Simulator;
|
||||||
|
|
||||||
|
public enum CompletionReason
|
||||||
|
{
|
||||||
|
ProgressComplete,
|
||||||
|
NoMoreDurability
|
||||||
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
namespace Craftimizer.Simulator;
|
namespace Craftimizer.Simulator;
|
||||||
|
|
||||||
internal enum Condition
|
public enum Condition
|
||||||
{
|
{
|
||||||
Poor,
|
Poor,
|
||||||
Normal,
|
Normal,
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
namespace Craftimizer.Simulator;
|
namespace Craftimizer.Simulator;
|
||||||
|
|
||||||
internal enum Effect
|
public enum Effect
|
||||||
{
|
{
|
||||||
InnerQuiet,
|
InnerQuiet,
|
||||||
WasteNot,
|
WasteNot,
|
||||||
|
|||||||
@@ -5,13 +5,17 @@ using System.Collections.Generic;
|
|||||||
|
|
||||||
namespace Craftimizer.Simulator;
|
namespace Craftimizer.Simulator;
|
||||||
|
|
||||||
internal class Simulation
|
public class Simulation
|
||||||
{
|
{
|
||||||
public CharacterStats Stats { get; }
|
public CharacterStats Stats { get; }
|
||||||
public Recipe Recipe { get; }
|
public Recipe Recipe { get; }
|
||||||
public RecipeLevelTable RecipeTable => Recipe.RecipeLevelTable.Value!;
|
public RecipeLevelTable RecipeTable => Recipe.RecipeLevelTable.Value!;
|
||||||
public int RLvl => (int)RecipeTable.RowId;
|
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 StepCount => ActionHistory.Count;
|
||||||
public int Progress { get; private set; }
|
public int Progress { get; private set; }
|
||||||
public int Quality { get; private set; }
|
public int Quality { get; private set; }
|
||||||
@@ -29,8 +33,44 @@ internal class Simulation
|
|||||||
{
|
{
|
||||||
Stats = stats;
|
Stats = stats;
|
||||||
Recipe = recipe;
|
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<T>() where T : BaseAction =>
|
||||||
|
Execute((T)Activator.CreateInstance(typeof(T), this)!);
|
||||||
|
|
||||||
public (int Strength, int Duration)? GetEffect(Effect effect)
|
public (int Strength, int Duration)? GetEffect(Effect effect)
|
||||||
{
|
{
|
||||||
var idx = ActiveEffects.FindIndex(x => x.effect == effect);
|
var idx = ActiveEffects.FindIndex(x => x.effect == effect);
|
||||||
@@ -116,6 +156,12 @@ internal class Simulation
|
|||||||
baseIncrease *= RecipeTable.ProgressModifier / 100;
|
baseIncrease *= RecipeTable.ProgressModifier / 100;
|
||||||
|
|
||||||
Progress += (int)(baseIncrease * efficiency);
|
Progress += (int)(baseIncrease * efficiency);
|
||||||
|
|
||||||
|
if (HasEffect(Effect.FinalAppraisal) && Progress >= MaxProgress)
|
||||||
|
{
|
||||||
|
Progress = MaxProgress - 1;
|
||||||
|
RemoveEffect(Effect.FinalAppraisal);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void IncreaseQuality(float efficiency)
|
public void IncreaseQuality(float efficiency)
|
||||||
|
|||||||
Reference in New Issue
Block a user