From f75220bc362ac43b5727105f07c8a529039d195f Mon Sep 17 00:00:00 2001 From: Asriel Camora Date: Tue, 13 Jun 2023 11:54:49 -0700 Subject: [PATCH] Add crafting actions and plugin stuff and everything --- Craftimizer.sln | 21 ++- Craftimizer/Craftimizer.csproj | 67 +++++++- Craftimizer/Craftimizer.json | 12 ++ Craftimizer/Plugin/Configuration.cs | 15 ++ Craftimizer/Plugin/LuminaSheets.cs | 11 ++ Craftimizer/Plugin/Plugin.cs | 38 +++++ Craftimizer/Plugin/Service.cs | 26 +++ Craftimizer/Program.cs | 9 -- Craftimizer/Recipe.cs | 18 --- Craftimizer/Simulator/ActionCategory.cs | 11 ++ .../Simulator/Actions/AdvancedTouch.cs | 15 ++ Craftimizer/Simulator/Actions/BaseAction.cs | 33 ++++ .../Simulator/Actions/BasicSynthesis.cs | 16 ++ Craftimizer/Simulator/Actions/BasicTouch.cs | 15 ++ .../Simulator/Actions/ByregotsBlessing.cs | 17 ++ .../Simulator/Actions/CarefulSynthesis.cs | 16 ++ .../Simulator/Actions/DelicateSynthesis.cs | 18 +++ .../Simulator/Actions/FinalAppraisal.cs | 16 ++ .../Simulator/Actions/FocusedSynthesis.cs | 16 ++ Craftimizer/Simulator/Actions/FocusedTouch.cs | 16 ++ Craftimizer/Simulator/Actions/GreatStrides.cs | 16 ++ Craftimizer/Simulator/Actions/Groundwork.cs | 17 ++ Craftimizer/Simulator/Actions/HastyTouch.cs | 16 ++ Craftimizer/Simulator/Actions/Innovation.cs | 16 ++ .../Simulator/Actions/IntensiveSynthesis.cs | 19 +++ Craftimizer/Simulator/Actions/Manipulation.cs | 16 ++ Craftimizer/Simulator/Actions/MastersMend.cs | 16 ++ Craftimizer/Simulator/Actions/MuscleMemory.cs | 20 +++ Craftimizer/Simulator/Actions/Observe.cs | 15 ++ Craftimizer/Simulator/Actions/PreciseTouch.cs | 22 +++ .../Simulator/Actions/PreparatoryTouch.cs | 19 +++ .../Simulator/Actions/PrudentSynthesis.cs | 20 +++ Craftimizer/Simulator/Actions/PrudentTouch.cs | 20 +++ .../Simulator/Actions/RapidSynthesis.cs | 17 ++ Craftimizer/Simulator/Actions/Reflect.cs | 20 +++ .../Simulator/Actions/StandardTouch.cs | 15 ++ Craftimizer/Simulator/Actions/TrainedEye.cs | 17 ++ .../Simulator/Actions/TrainedFinesse.cs | 20 +++ .../Simulator/Actions/TricksOfTheTrade.cs | 20 +++ Craftimizer/Simulator/Actions/Veneration.cs | 16 ++ Craftimizer/Simulator/Actions/WasteNot.cs | 19 +++ Craftimizer/Simulator/Actions/WasteNot2.cs | 19 +++ Craftimizer/Simulator/CharacterStats.cs | 16 ++ Craftimizer/Simulator/Condition.cs | 15 ++ Craftimizer/Simulator/Effect.cs | 14 ++ Craftimizer/Simulator/Simulation.cs | 149 ++++++++++++++++++ Craftimizer/packages.lock.json | 13 ++ 47 files changed, 965 insertions(+), 43 deletions(-) create mode 100644 Craftimizer/Craftimizer.json create mode 100644 Craftimizer/Plugin/Configuration.cs create mode 100644 Craftimizer/Plugin/LuminaSheets.cs create mode 100644 Craftimizer/Plugin/Plugin.cs create mode 100644 Craftimizer/Plugin/Service.cs delete mode 100644 Craftimizer/Program.cs delete mode 100644 Craftimizer/Recipe.cs create mode 100644 Craftimizer/Simulator/ActionCategory.cs create mode 100644 Craftimizer/Simulator/Actions/AdvancedTouch.cs create mode 100644 Craftimizer/Simulator/Actions/BaseAction.cs create mode 100644 Craftimizer/Simulator/Actions/BasicSynthesis.cs create mode 100644 Craftimizer/Simulator/Actions/BasicTouch.cs create mode 100644 Craftimizer/Simulator/Actions/ByregotsBlessing.cs create mode 100644 Craftimizer/Simulator/Actions/CarefulSynthesis.cs create mode 100644 Craftimizer/Simulator/Actions/DelicateSynthesis.cs create mode 100644 Craftimizer/Simulator/Actions/FinalAppraisal.cs create mode 100644 Craftimizer/Simulator/Actions/FocusedSynthesis.cs create mode 100644 Craftimizer/Simulator/Actions/FocusedTouch.cs create mode 100644 Craftimizer/Simulator/Actions/GreatStrides.cs create mode 100644 Craftimizer/Simulator/Actions/Groundwork.cs create mode 100644 Craftimizer/Simulator/Actions/HastyTouch.cs create mode 100644 Craftimizer/Simulator/Actions/Innovation.cs create mode 100644 Craftimizer/Simulator/Actions/IntensiveSynthesis.cs create mode 100644 Craftimizer/Simulator/Actions/Manipulation.cs create mode 100644 Craftimizer/Simulator/Actions/MastersMend.cs create mode 100644 Craftimizer/Simulator/Actions/MuscleMemory.cs create mode 100644 Craftimizer/Simulator/Actions/Observe.cs create mode 100644 Craftimizer/Simulator/Actions/PreciseTouch.cs create mode 100644 Craftimizer/Simulator/Actions/PreparatoryTouch.cs create mode 100644 Craftimizer/Simulator/Actions/PrudentSynthesis.cs create mode 100644 Craftimizer/Simulator/Actions/PrudentTouch.cs create mode 100644 Craftimizer/Simulator/Actions/RapidSynthesis.cs create mode 100644 Craftimizer/Simulator/Actions/Reflect.cs create mode 100644 Craftimizer/Simulator/Actions/StandardTouch.cs create mode 100644 Craftimizer/Simulator/Actions/TrainedEye.cs create mode 100644 Craftimizer/Simulator/Actions/TrainedFinesse.cs create mode 100644 Craftimizer/Simulator/Actions/TricksOfTheTrade.cs create mode 100644 Craftimizer/Simulator/Actions/Veneration.cs create mode 100644 Craftimizer/Simulator/Actions/WasteNot.cs create mode 100644 Craftimizer/Simulator/Actions/WasteNot2.cs create mode 100644 Craftimizer/Simulator/CharacterStats.cs create mode 100644 Craftimizer/Simulator/Condition.cs create mode 100644 Craftimizer/Simulator/Effect.cs create mode 100644 Craftimizer/Simulator/Simulation.cs create mode 100644 Craftimizer/packages.lock.json diff --git a/Craftimizer.sln b/Craftimizer.sln index da6cb71..6075d3c 100644 --- a/Craftimizer.sln +++ b/Craftimizer.sln @@ -1,25 +1,24 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 +Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 -VisualStudioVersion = 17.5.33530.505 +VisualStudioVersion = 17.4.33213.308 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Craftimizer", "Craftimizer\Craftimizer.csproj", "{80C60B1F-5A36-4C9E-99AF-85C536803ED5}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Craftimizer", "Craftimizer\Craftimizer.csproj", "{13C812E9-0D42-4B95-8646-40EEBF30636F}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU + Debug|x64 = Debug|x64 + Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {80C60B1F-5A36-4C9E-99AF-85C536803ED5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {80C60B1F-5A36-4C9E-99AF-85C536803ED5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {80C60B1F-5A36-4C9E-99AF-85C536803ED5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {80C60B1F-5A36-4C9E-99AF-85C536803ED5}.Release|Any CPU.Build.0 = Release|Any CPU + {13C812E9-0D42-4B95-8646-40EEBF30636F}.Debug|x64.ActiveCfg = Debug|x64 + {13C812E9-0D42-4B95-8646-40EEBF30636F}.Debug|x64.Build.0 = Debug|x64 + {13C812E9-0D42-4B95-8646-40EEBF30636F}.Release|x64.ActiveCfg = Release|x64 + {13C812E9-0D42-4B95-8646-40EEBF30636F}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {264E77E3-4028-4EA7-A3E7-9B84BDFEA6B9} + SolutionGuid = {B17E85B1-5F60-4440-9F9A-3DDE877E8CDF} EndGlobalSection EndGlobal diff --git a/Craftimizer/Craftimizer.csproj b/Craftimizer/Craftimizer.csproj index d60a15d..cea1413 100644 --- a/Craftimizer/Craftimizer.csproj +++ b/Craftimizer/Craftimizer.csproj @@ -1,14 +1,71 @@ - + + + + + + 0.0.0.1 + A sample plugin. + + https://github.com/goatcorp/SamplePlugin + - Exe - net7.0 - enable + net7.0-windows + x64 enable + latest + true + false + false + true - + + PreserveNewest + false + + + + + $(appdata)\XIVLauncher\addon\Hooks\dev\ + true + + + + $(DALAMUD_HOME)/ + + + + + + $(DalamudLibPath)FFXIVClientStructs.dll + false + + + $(DalamudLibPath)Newtonsoft.Json.dll + false + + + $(DalamudLibPath)Dalamud.dll + false + + + $(DalamudLibPath)ImGui.NET.dll + false + + + $(DalamudLibPath)ImGuiScene.dll + false + + + $(DalamudLibPath)Lumina.dll + false + + + $(DalamudLibPath)Lumina.Excel.dll + false + diff --git a/Craftimizer/Craftimizer.json b/Craftimizer/Craftimizer.json new file mode 100644 index 0000000..2ae35c9 --- /dev/null +++ b/Craftimizer/Craftimizer.json @@ -0,0 +1,12 @@ +{ + "Author": "WorkingRobot", + "Name": "Craftimizer", + "Punchline": "Craft stuff xd", + "Description": "In-game craftiming optimizer", + "InternalName": "craftimizer", + "ApplicableVersion": "any", + "Tags": [ + "crafting", + "simulator" + ] +} diff --git a/Craftimizer/Plugin/Configuration.cs b/Craftimizer/Plugin/Configuration.cs new file mode 100644 index 0000000..30d93b7 --- /dev/null +++ b/Craftimizer/Plugin/Configuration.cs @@ -0,0 +1,15 @@ +using Dalamud.Configuration; +using System; + +namespace Craftimizer.Plugin; + +[Serializable] +public class Configuration : IPluginConfiguration +{ + public int Version { get; set; } = 0; + + public void Save() + { + Service.PluginInterface.SavePluginConfig(this); + } +} diff --git a/Craftimizer/Plugin/LuminaSheets.cs b/Craftimizer/Plugin/LuminaSheets.cs new file mode 100644 index 0000000..2efe7d0 --- /dev/null +++ b/Craftimizer/Plugin/LuminaSheets.cs @@ -0,0 +1,11 @@ +using Lumina.Excel.GeneratedSheets; +using Lumina.Excel; + +namespace Craftimizer.Plugin; + +public static class LuminaSheets +{ + public static readonly ExcelSheet RecipeSheet = Service.DataManager.GetExcelSheet()!; + public static readonly ExcelSheet RecipeLevelTableSheet = Service.DataManager.GetExcelSheet()!; + public static readonly ExcelSheet ParamGrowSheet = Service.DataManager.GetExcelSheet()!; +} diff --git a/Craftimizer/Plugin/Plugin.cs b/Craftimizer/Plugin/Plugin.cs new file mode 100644 index 0000000..4d953de --- /dev/null +++ b/Craftimizer/Plugin/Plugin.cs @@ -0,0 +1,38 @@ +using Dalamud.Game.Command; +using Dalamud.IoC; +using Dalamud.Plugin; + +namespace Craftimizer.Plugin; + +public sealed class Plugin : IDalamudPlugin +{ + public string Name => "Craftimizer"; + + public Configuration Configuration { get; } + + public Plugin( + [RequiredVersion("1.0")] DalamudPluginInterface pluginInterface) + { + pluginInterface.Create(); + + Configuration = pluginInterface.GetPluginConfig() as Configuration ?? new Configuration(); + + Service.CommandManager.AddHandler("/craft", new CommandInfo(OnCommand) + { + HelpMessage = "A useful message to display in /xlhelp" + }); + + //PluginInterface.UiBuilder.OpenConfigUi += () { }; + } + + public void Dispose() + { + Service.CommandManager.RemoveHandler("/craft"); + } + + private void OnCommand(string command, string args) + { + if (command != "/craft") + return; + } +} diff --git a/Craftimizer/Plugin/Service.cs b/Craftimizer/Plugin/Service.cs new file mode 100644 index 0000000..21f7605 --- /dev/null +++ b/Craftimizer/Plugin/Service.cs @@ -0,0 +1,26 @@ +using Dalamud.Data; +using Dalamud.Game.ClientState.Objects; +using Dalamud.Game.ClientState; +using Dalamud.Game.Gui; +using Dalamud.Game; +using Dalamud.IoC; +using Dalamud.Plugin; +using Dalamud.Game.ClientState.Conditions; +using Dalamud.Game.Command; + +namespace Craftimizer.Plugin; + +public sealed class Service +{ +#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. + [PluginService] public static DalamudPluginInterface PluginInterface { get; private set; } + [PluginService] public static CommandManager CommandManager { get; private set; } + [PluginService] public static ObjectTable Objects { get; private set; } + [PluginService] public static SigScanner SigScanner { get; private set; } + [PluginService] public static GameGui GameGui { get; private set; } + [PluginService] public static ClientState ClientState { get; private set; } + [PluginService] public static DataManager DataManager { get; private set; } + [PluginService] public static TargetManager TargetManager { get; private set; } + [PluginService] public static Condition Condition { get; private set; } +#pragma warning restore CS8618 +} diff --git a/Craftimizer/Program.cs b/Craftimizer/Program.cs deleted file mode 100644 index 7d1df52..0000000 --- a/Craftimizer/Program.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Craftimizer; - -internal class Program -{ - private static void Main(string[] args) - { - Console.WriteLine("Hello, World!"); - } -} \ No newline at end of file diff --git a/Craftimizer/Recipe.cs b/Craftimizer/Recipe.cs deleted file mode 100644 index a30118c..0000000 --- a/Craftimizer/Recipe.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Craftimizer; - -internal record Recipe -{ - public int Difficulty { get; init; } - public int Durability { get; init; } - public int Quality { get; init; } - public int Progress { get; init; } - public int Level { get; init; } - public int MaxLevel { get; init; } - public int ID { get; init; } -} diff --git a/Craftimizer/Simulator/ActionCategory.cs b/Craftimizer/Simulator/ActionCategory.cs new file mode 100644 index 0000000..12ef37d --- /dev/null +++ b/Craftimizer/Simulator/ActionCategory.cs @@ -0,0 +1,11 @@ +namespace Craftimizer.Simulator; + +internal enum ActionCategory +{ + FirstTurn, + Synthesis, + Quality, + Durability, + Buffs, + Other +} diff --git a/Craftimizer/Simulator/Actions/AdvancedTouch.cs b/Craftimizer/Simulator/Actions/AdvancedTouch.cs new file mode 100644 index 0000000..bcd9647 --- /dev/null +++ b/Craftimizer/Simulator/Actions/AdvancedTouch.cs @@ -0,0 +1,15 @@ +namespace Craftimizer.Simulator.Actions; + +internal class AdvancedTouch : BaseAction +{ + public AdvancedTouch(Simulation simulation) : base(simulation) { } + + public override ActionCategory Category => ActionCategory.Quality; + public override int Level => 84; + + public override int CPCost => Simulation.GetPreviousAction() is StandardTouch && Simulation.GetPreviousAction(2) is BasicTouch ? 18 : 46; + public override float Efficiency => 1.50f; + + public override void UseSuccess() => + Simulation.IncreaseQuality(Efficiency); +} diff --git a/Craftimizer/Simulator/Actions/BaseAction.cs b/Craftimizer/Simulator/Actions/BaseAction.cs new file mode 100644 index 0000000..0e1728d --- /dev/null +++ b/Craftimizer/Simulator/Actions/BaseAction.cs @@ -0,0 +1,33 @@ +namespace Craftimizer.Simulator.Actions; + +internal abstract class BaseAction +{ + protected Simulation Simulation { get; } + + public BaseAction(Simulation simulation) + { + Simulation = simulation; + } + + public abstract ActionCategory Category { get; } + public abstract int Level { get; } + + public abstract int CPCost { get; } + public abstract float Efficiency { get; } + public virtual float SuccessRate => 1f; + public virtual int DurabilityCost => 10; + + public virtual bool CanUse => + Simulation.Stats.Level >= Level && Simulation.CP >= CPCost; + + public virtual void Use() + { + Simulation.ReduceCP(CPCost); + Simulation.ReduceDurability(DurabilityCost); + if (Simulation.RollSuccess(SuccessRate)) + UseSuccess(); + } + + public abstract void UseSuccess(); + +} diff --git a/Craftimizer/Simulator/Actions/BasicSynthesis.cs b/Craftimizer/Simulator/Actions/BasicSynthesis.cs new file mode 100644 index 0000000..59a2c0b --- /dev/null +++ b/Craftimizer/Simulator/Actions/BasicSynthesis.cs @@ -0,0 +1,16 @@ +namespace Craftimizer.Simulator.Actions; + +internal class BasicSynthesis : BaseAction +{ + public BasicSynthesis(Simulation simulation) : base(simulation) { } + + public override ActionCategory Category => ActionCategory.Synthesis; + public override int Level => 1; + + public override int CPCost => 0; + // Basic Synthesis Mastery Trait + public override float Efficiency => Simulation.Stats.Level >= 31 ? 1.20f : 1.00f; + + public override void UseSuccess() => + Simulation.IncreaseProgress(Efficiency); +} diff --git a/Craftimizer/Simulator/Actions/BasicTouch.cs b/Craftimizer/Simulator/Actions/BasicTouch.cs new file mode 100644 index 0000000..0689217 --- /dev/null +++ b/Craftimizer/Simulator/Actions/BasicTouch.cs @@ -0,0 +1,15 @@ +namespace Craftimizer.Simulator.Actions; + +internal class BasicTouch : BaseAction +{ + public BasicTouch(Simulation simulation) : base(simulation) { } + + public override ActionCategory Category => ActionCategory.Quality; + public override int Level => 5; + + public override int CPCost => 18; + public override float Efficiency => 1.00f; + + public override void UseSuccess() => + Simulation.IncreaseQuality(Efficiency); +} diff --git a/Craftimizer/Simulator/Actions/ByregotsBlessing.cs b/Craftimizer/Simulator/Actions/ByregotsBlessing.cs new file mode 100644 index 0000000..705ee62 --- /dev/null +++ b/Craftimizer/Simulator/Actions/ByregotsBlessing.cs @@ -0,0 +1,17 @@ +namespace Craftimizer.Simulator.Actions; + +internal class ByregotsBlessing : BaseAction +{ + public ByregotsBlessing(Simulation simulation) : base(simulation) { } + + public override ActionCategory Category => ActionCategory.Quality; + public override int Level => 50; + + public override int CPCost => 24; + public override float Efficiency => 1.00f + 0.20f * (Simulation.GetEffect(Effect.InnerQuiet)?.Strength ?? 0); + + public override bool CanUse => Simulation.HasEffect(Effect.InnerQuiet) && base.CanUse; + + public override void UseSuccess() => + Simulation.IncreaseQuality(Efficiency); +} diff --git a/Craftimizer/Simulator/Actions/CarefulSynthesis.cs b/Craftimizer/Simulator/Actions/CarefulSynthesis.cs new file mode 100644 index 0000000..f9b8dff --- /dev/null +++ b/Craftimizer/Simulator/Actions/CarefulSynthesis.cs @@ -0,0 +1,16 @@ +namespace Craftimizer.Simulator.Actions; + +internal class CarefulSynthesis : BaseAction +{ + public CarefulSynthesis(Simulation simulation) : base(simulation) { } + + public override ActionCategory Category => ActionCategory.Synthesis; + public override int Level => 62; + + public override int CPCost => 7; + // Careful Synthesis Mastery Trait + public override float Efficiency => Simulation.Stats.Level >= 82 ? 1.80f : 1.50f; + + public override void UseSuccess() => + Simulation.IncreaseProgress(Efficiency); +} diff --git a/Craftimizer/Simulator/Actions/DelicateSynthesis.cs b/Craftimizer/Simulator/Actions/DelicateSynthesis.cs new file mode 100644 index 0000000..ff720b9 --- /dev/null +++ b/Craftimizer/Simulator/Actions/DelicateSynthesis.cs @@ -0,0 +1,18 @@ +namespace Craftimizer.Simulator.Actions; + +internal class DelicateSynthesis : BaseAction +{ + public DelicateSynthesis(Simulation simulation) : base(simulation) { } + + public override ActionCategory Category => ActionCategory.Synthesis; + public override int Level => 76; + + public override int CPCost => 32; + public override float Efficiency => 1.00f; + + public override void UseSuccess() + { + Simulation.IncreaseQuality(Efficiency); + Simulation.IncreaseProgress(Efficiency); + } +} diff --git a/Craftimizer/Simulator/Actions/FinalAppraisal.cs b/Craftimizer/Simulator/Actions/FinalAppraisal.cs new file mode 100644 index 0000000..5e880f2 --- /dev/null +++ b/Craftimizer/Simulator/Actions/FinalAppraisal.cs @@ -0,0 +1,16 @@ +namespace Craftimizer.Simulator.Actions; + +internal class FinalAppraisal : BaseAction +{ + public FinalAppraisal(Simulation simulation) : base(simulation) { } + + public override ActionCategory Category => ActionCategory.Synthesis; + public override int Level => 42; + + public override int CPCost => 1; + public override float Efficiency => 0f; + public override int DurabilityCost => 0; + + public override void UseSuccess() => + Simulation.AddEffect(Effect.FinalAppraisal, 5); +} diff --git a/Craftimizer/Simulator/Actions/FocusedSynthesis.cs b/Craftimizer/Simulator/Actions/FocusedSynthesis.cs new file mode 100644 index 0000000..517cf86 --- /dev/null +++ b/Craftimizer/Simulator/Actions/FocusedSynthesis.cs @@ -0,0 +1,16 @@ +namespace Craftimizer.Simulator.Actions; + +internal class FocusedSynthesis : BaseAction +{ + public FocusedSynthesis(Simulation simulation) : base(simulation) { } + + public override ActionCategory Category => ActionCategory.Synthesis; + public override int Level => 67; + + public override int CPCost => 5; + public override float Efficiency => 2.00f; + public override float SuccessRate => Simulation.GetPreviousAction() is Observe ? 1.00f : 0.50f; + + public override void UseSuccess() => + Simulation.IncreaseProgress(Efficiency); +} diff --git a/Craftimizer/Simulator/Actions/FocusedTouch.cs b/Craftimizer/Simulator/Actions/FocusedTouch.cs new file mode 100644 index 0000000..6b1b7fe --- /dev/null +++ b/Craftimizer/Simulator/Actions/FocusedTouch.cs @@ -0,0 +1,16 @@ +namespace Craftimizer.Simulator.Actions; + +internal class FocusedTouch : BaseAction +{ + public FocusedTouch(Simulation simulation) : base(simulation) { } + + public override ActionCategory Category => ActionCategory.Quality; + public override int Level => 68; + + public override int CPCost => 18; + public override float Efficiency => 1.50f; + public override float SuccessRate => Simulation.GetPreviousAction() is Observe ? 1.00f : 0.50f; + + public override void UseSuccess() => + Simulation.IncreaseQuality(Efficiency); +} diff --git a/Craftimizer/Simulator/Actions/GreatStrides.cs b/Craftimizer/Simulator/Actions/GreatStrides.cs new file mode 100644 index 0000000..ef86dd3 --- /dev/null +++ b/Craftimizer/Simulator/Actions/GreatStrides.cs @@ -0,0 +1,16 @@ +namespace Craftimizer.Simulator.Actions; + +internal class GreatStrides : BaseAction +{ + public GreatStrides(Simulation simulation) : base(simulation) { } + + public override ActionCategory Category => ActionCategory.Buffs; + public override int Level => 21; + + public override int CPCost => 32; + public override float Efficiency => 0f; + public override int DurabilityCost => 0; + + public override void UseSuccess() => + Simulation.AddEffect(Effect.GreatStrides, 3); +} diff --git a/Craftimizer/Simulator/Actions/Groundwork.cs b/Craftimizer/Simulator/Actions/Groundwork.cs new file mode 100644 index 0000000..95db78c --- /dev/null +++ b/Craftimizer/Simulator/Actions/Groundwork.cs @@ -0,0 +1,17 @@ +namespace Craftimizer.Simulator.Actions; + +internal class Groundwork : BaseAction +{ + public Groundwork(Simulation simulation) : base(simulation) { } + + public override ActionCategory Category => ActionCategory.Synthesis; + public override int Level => 72; + + public override int CPCost => 18; + // Groundwork Mastery Trait + public override float Efficiency => Simulation.Stats.Level >= 86 ? 3.60f : 3.00f; + public override int DurabilityCost => 20; + + public override void UseSuccess() => + Simulation.IncreaseProgress(Efficiency); +} diff --git a/Craftimizer/Simulator/Actions/HastyTouch.cs b/Craftimizer/Simulator/Actions/HastyTouch.cs new file mode 100644 index 0000000..6987de0 --- /dev/null +++ b/Craftimizer/Simulator/Actions/HastyTouch.cs @@ -0,0 +1,16 @@ +namespace Craftimizer.Simulator.Actions; + +internal class HastyTouch : BaseAction +{ + public HastyTouch(Simulation simulation) : base(simulation) { } + + public override ActionCategory Category => ActionCategory.Quality; + public override int Level => 9; + + public override int CPCost => 0; + public override float Efficiency => 1.00f; + public override float SuccessRate => 0.60f; + + public override void UseSuccess() => + Simulation.IncreaseQuality(Efficiency); +} diff --git a/Craftimizer/Simulator/Actions/Innovation.cs b/Craftimizer/Simulator/Actions/Innovation.cs new file mode 100644 index 0000000..e39bb9d --- /dev/null +++ b/Craftimizer/Simulator/Actions/Innovation.cs @@ -0,0 +1,16 @@ +namespace Craftimizer.Simulator.Actions; + +internal class Innovation : BaseAction +{ + public Innovation(Simulation simulation) : base(simulation) { } + + public override ActionCategory Category => ActionCategory.Buffs; + public override int Level => 26; + + public override int CPCost => 18; + public override float Efficiency => 0f; + public override int DurabilityCost => 0; + + public override void UseSuccess() => + Simulation.AddEffect(Effect.Innovation, 4); +} diff --git a/Craftimizer/Simulator/Actions/IntensiveSynthesis.cs b/Craftimizer/Simulator/Actions/IntensiveSynthesis.cs new file mode 100644 index 0000000..1ba49b8 --- /dev/null +++ b/Craftimizer/Simulator/Actions/IntensiveSynthesis.cs @@ -0,0 +1,19 @@ +namespace Craftimizer.Simulator.Actions; + +internal class IntensiveSynthesis : BaseAction +{ + public IntensiveSynthesis(Simulation simulation) : base(simulation) { } + + public override ActionCategory Category => ActionCategory.Synthesis; + public override int Level => 78; + + public override int CPCost => 6; + public override float Efficiency => 4.00f; + + public override bool CanUse => + (Simulation.Condition == Condition.Good || Simulation.Condition == Condition.Excellent) + && base.CanUse; + + public override void UseSuccess() => + Simulation.IncreaseProgress(Efficiency); +} diff --git a/Craftimizer/Simulator/Actions/Manipulation.cs b/Craftimizer/Simulator/Actions/Manipulation.cs new file mode 100644 index 0000000..b783d5a --- /dev/null +++ b/Craftimizer/Simulator/Actions/Manipulation.cs @@ -0,0 +1,16 @@ +namespace Craftimizer.Simulator.Actions; + +internal class Manipulation : BaseAction +{ + public Manipulation(Simulation simulation) : base(simulation) { } + + public override ActionCategory Category => ActionCategory.Durability; + public override int Level => 65; + + public override int CPCost => 96; + public override float Efficiency => 0f; + public override int DurabilityCost => 0; + + public override void UseSuccess() => + Simulation.AddEffect(Effect.Manipulation, 8); +} diff --git a/Craftimizer/Simulator/Actions/MastersMend.cs b/Craftimizer/Simulator/Actions/MastersMend.cs new file mode 100644 index 0000000..f828319 --- /dev/null +++ b/Craftimizer/Simulator/Actions/MastersMend.cs @@ -0,0 +1,16 @@ +namespace Craftimizer.Simulator.Actions; + +internal class MastersMend : BaseAction +{ + public MastersMend(Simulation simulation) : base(simulation) { } + + public override ActionCategory Category => ActionCategory.Durability; + public override int Level => 7; + + public override int CPCost => 88; + public override float Efficiency => 0f; + public override int DurabilityCost => 0; + + public override void UseSuccess() => + Simulation.RestoreDurability(30); +} diff --git a/Craftimizer/Simulator/Actions/MuscleMemory.cs b/Craftimizer/Simulator/Actions/MuscleMemory.cs new file mode 100644 index 0000000..8264730 --- /dev/null +++ b/Craftimizer/Simulator/Actions/MuscleMemory.cs @@ -0,0 +1,20 @@ +namespace Craftimizer.Simulator.Actions; + +internal class MuscleMemory : BaseAction +{ + public MuscleMemory(Simulation simulation) : base(simulation) { } + + public override ActionCategory Category => ActionCategory.FirstTurn; + public override int Level => 54; + + public override int CPCost => 6; + public override float Efficiency => 3.00f; + + public override bool CanUse => Simulation.IsFirstStep && base.CanUse; + + public override void UseSuccess() + { + Simulation.IncreaseProgress(Efficiency); + Simulation.AddEffect(Effect.MuscleMemory, 5); + } +} diff --git a/Craftimizer/Simulator/Actions/Observe.cs b/Craftimizer/Simulator/Actions/Observe.cs new file mode 100644 index 0000000..f280283 --- /dev/null +++ b/Craftimizer/Simulator/Actions/Observe.cs @@ -0,0 +1,15 @@ +namespace Craftimizer.Simulator.Actions; + +internal class Observe : BaseAction +{ + public Observe(Simulation simulation) : base(simulation) { } + + public override ActionCategory Category => ActionCategory.Other; + public override int Level => 13; + + public override int CPCost => 7; + public override float Efficiency => 0f; + public override int DurabilityCost => 0; + + public override void UseSuccess() { } +} diff --git a/Craftimizer/Simulator/Actions/PreciseTouch.cs b/Craftimizer/Simulator/Actions/PreciseTouch.cs new file mode 100644 index 0000000..2bb27e2 --- /dev/null +++ b/Craftimizer/Simulator/Actions/PreciseTouch.cs @@ -0,0 +1,22 @@ +namespace Craftimizer.Simulator.Actions; + +internal class PreciseTouch : BaseAction +{ + public PreciseTouch(Simulation simulation) : base(simulation) { } + + public override ActionCategory Category => ActionCategory.Quality; + public override int Level => 53; + + public override int CPCost => 18; + public override float Efficiency => 1.50f; + + public override bool CanUse => + (Simulation.Condition == Condition.Good || Simulation.Condition == Condition.Excellent) + && base.CanUse; + + public override void UseSuccess() + { + Simulation.IncreaseQuality(Efficiency); + Simulation.StrengthenEffect(Effect.InnerQuiet); + } +} diff --git a/Craftimizer/Simulator/Actions/PreparatoryTouch.cs b/Craftimizer/Simulator/Actions/PreparatoryTouch.cs new file mode 100644 index 0000000..d321081 --- /dev/null +++ b/Craftimizer/Simulator/Actions/PreparatoryTouch.cs @@ -0,0 +1,19 @@ +namespace Craftimizer.Simulator.Actions; + +internal class PreparatoryTouch : BaseAction +{ + public PreparatoryTouch(Simulation simulation) : base(simulation) { } + + public override ActionCategory Category => ActionCategory.Quality; + public override int Level => 71; + + public override int CPCost => 40; + public override float Efficiency => 2.00f; + public override int DurabilityCost => 20; + + public override void UseSuccess() + { + Simulation.IncreaseQuality(Efficiency); + Simulation.StrengthenEffect(Effect.InnerQuiet); + } +} diff --git a/Craftimizer/Simulator/Actions/PrudentSynthesis.cs b/Craftimizer/Simulator/Actions/PrudentSynthesis.cs new file mode 100644 index 0000000..bbc4a11 --- /dev/null +++ b/Craftimizer/Simulator/Actions/PrudentSynthesis.cs @@ -0,0 +1,20 @@ +namespace Craftimizer.Simulator.Actions; + +internal class PrudentSynthesis : BaseAction +{ + public PrudentSynthesis(Simulation simulation) : base(simulation) { } + + public override ActionCategory Category => ActionCategory.Synthesis; + public override int Level => 88; + + public override int CPCost => 18; + public override float Efficiency => 1.80f; + public override int DurabilityCost => base.DurabilityCost / 2; + + public override bool CanUse => + !(Simulation.HasEffect(Effect.WasteNot) || Simulation.HasEffect(Effect.WasteNot2)) + && base.CanUse; + + public override void UseSuccess() => + Simulation.IncreaseProgress(Efficiency); +} diff --git a/Craftimizer/Simulator/Actions/PrudentTouch.cs b/Craftimizer/Simulator/Actions/PrudentTouch.cs new file mode 100644 index 0000000..d7095ba --- /dev/null +++ b/Craftimizer/Simulator/Actions/PrudentTouch.cs @@ -0,0 +1,20 @@ +namespace Craftimizer.Simulator.Actions; + +internal class PrudentTouch : BaseAction +{ + public PrudentTouch(Simulation simulation) : base(simulation) { } + + public override ActionCategory Category => ActionCategory.Quality; + public override int Level => 66; + + public override int CPCost => 25; + public override float Efficiency => 1.00f; + public override int DurabilityCost => base.DurabilityCost / 2; + + public override bool CanUse => + !(Simulation.HasEffect(Effect.WasteNot) || Simulation.HasEffect(Effect.WasteNot2)) + && base.CanUse; + + public override void UseSuccess() => + Simulation.IncreaseQuality(Efficiency); +} diff --git a/Craftimizer/Simulator/Actions/RapidSynthesis.cs b/Craftimizer/Simulator/Actions/RapidSynthesis.cs new file mode 100644 index 0000000..65bf794 --- /dev/null +++ b/Craftimizer/Simulator/Actions/RapidSynthesis.cs @@ -0,0 +1,17 @@ +namespace Craftimizer.Simulator.Actions; + +internal class RapidSynthesis : BaseAction +{ + public RapidSynthesis(Simulation simulation) : base(simulation) { } + + public override ActionCategory Category => ActionCategory.Synthesis; + public override int Level => 9; + + public override int CPCost => 0; + // Rapid Synthesis Mastery Trait + public override float Efficiency => Simulation.Stats.Level >= 63 ? 5.00f : 2.50f; + public override float SuccessRate => 0.50f; + + public override void UseSuccess() => + Simulation.IncreaseProgress(Efficiency); +} diff --git a/Craftimizer/Simulator/Actions/Reflect.cs b/Craftimizer/Simulator/Actions/Reflect.cs new file mode 100644 index 0000000..3060c6d --- /dev/null +++ b/Craftimizer/Simulator/Actions/Reflect.cs @@ -0,0 +1,20 @@ +namespace Craftimizer.Simulator.Actions; + +internal class Reflect : BaseAction +{ + public Reflect(Simulation simulation) : base(simulation) { } + + public override ActionCategory Category => ActionCategory.FirstTurn; + public override int Level => 69; + + public override int CPCost => 6; + public override float Efficiency => 1.00f; + + public override bool CanUse => Simulation.IsFirstStep && base.CanUse; + + public override void UseSuccess() + { + Simulation.IncreaseQuality(Efficiency); + Simulation.StrengthenEffect(Effect.InnerQuiet); + } +} diff --git a/Craftimizer/Simulator/Actions/StandardTouch.cs b/Craftimizer/Simulator/Actions/StandardTouch.cs new file mode 100644 index 0000000..9b1f498 --- /dev/null +++ b/Craftimizer/Simulator/Actions/StandardTouch.cs @@ -0,0 +1,15 @@ +namespace Craftimizer.Simulator.Actions; + +internal class StandardTouch : BaseAction +{ + public StandardTouch(Simulation simulation) : base(simulation) { } + + public override ActionCategory Category => ActionCategory.Quality; + public override int Level => 18; + + public override int CPCost => Simulation.GetPreviousAction() is BasicTouch ? 18 : 32; + public override float Efficiency => 1.25f; + + public override void UseSuccess() => + Simulation.IncreaseQuality(Efficiency); +} diff --git a/Craftimizer/Simulator/Actions/TrainedEye.cs b/Craftimizer/Simulator/Actions/TrainedEye.cs new file mode 100644 index 0000000..fa4c978 --- /dev/null +++ b/Craftimizer/Simulator/Actions/TrainedEye.cs @@ -0,0 +1,17 @@ +namespace Craftimizer.Simulator.Actions; + +internal class TrainedEye : BaseAction +{ + public TrainedEye(Simulation simulation) : base(simulation) { } + + public override ActionCategory Category => ActionCategory.FirstTurn; + public override int Level => 80; + + public override int CPCost => 250; + public override float Efficiency => 0f; + + public override bool CanUse => Simulation.IsFirstStep && base.CanUse; + + public override void UseSuccess() => + Simulation.IncreaseQuality(float.PositiveInfinity); +} diff --git a/Craftimizer/Simulator/Actions/TrainedFinesse.cs b/Craftimizer/Simulator/Actions/TrainedFinesse.cs new file mode 100644 index 0000000..6350764 --- /dev/null +++ b/Craftimizer/Simulator/Actions/TrainedFinesse.cs @@ -0,0 +1,20 @@ +namespace Craftimizer.Simulator.Actions; + +internal class TrainedFinesse : BaseAction +{ + public TrainedFinesse(Simulation simulation) : base(simulation) { } + + public override ActionCategory Category => ActionCategory.Quality; + public override int Level => 90; + + public override int CPCost => 32; + public override float Efficiency => 1.00f; + public override int DurabilityCost => 0; + + public override bool CanUse => + (Simulation.GetEffect(Effect.InnerQuiet)?.Strength ?? 0) == 10 + && base.CanUse; + + public override void UseSuccess() => + Simulation.IncreaseProgress(Efficiency); +} diff --git a/Craftimizer/Simulator/Actions/TricksOfTheTrade.cs b/Craftimizer/Simulator/Actions/TricksOfTheTrade.cs new file mode 100644 index 0000000..16dc656 --- /dev/null +++ b/Craftimizer/Simulator/Actions/TricksOfTheTrade.cs @@ -0,0 +1,20 @@ +namespace Craftimizer.Simulator.Actions; + +internal class TricksOfTheTrade : BaseAction +{ + public TricksOfTheTrade(Simulation simulation) : base(simulation) { } + + public override ActionCategory Category => ActionCategory.Other; + public override int Level => 13; + + public override int CPCost => 0; + public override float Efficiency => 0f; + public override int DurabilityCost => 0; + + public override bool CanUse => + (Simulation.Condition == Condition.Good || Simulation.Condition == Condition.Excellent) + && base.CanUse; + + public override void UseSuccess() => + Simulation.RestoreCP(20); +} diff --git a/Craftimizer/Simulator/Actions/Veneration.cs b/Craftimizer/Simulator/Actions/Veneration.cs new file mode 100644 index 0000000..2dbb5a2 --- /dev/null +++ b/Craftimizer/Simulator/Actions/Veneration.cs @@ -0,0 +1,16 @@ +namespace Craftimizer.Simulator.Actions; + +internal class Veneration : BaseAction +{ + public Veneration(Simulation simulation) : base(simulation) { } + + public override ActionCategory Category => ActionCategory.Buffs; + public override int Level => 15; + + public override int CPCost => 18; + public override float Efficiency => 0f; + public override int DurabilityCost => 0; + + public override void UseSuccess() => + Simulation.AddEffect(Effect.Veneration, 4); +} diff --git a/Craftimizer/Simulator/Actions/WasteNot.cs b/Craftimizer/Simulator/Actions/WasteNot.cs new file mode 100644 index 0000000..13fae8a --- /dev/null +++ b/Craftimizer/Simulator/Actions/WasteNot.cs @@ -0,0 +1,19 @@ +namespace Craftimizer.Simulator.Actions; + +internal class WasteNot : BaseAction +{ + public WasteNot(Simulation simulation) : base(simulation) { } + + public override ActionCategory Category => ActionCategory.Durability; + public override int Level => 15; + + public override int CPCost => 56; + public override float Efficiency => 0f; + public override int DurabilityCost => 0; + + public override void UseSuccess() + { + Simulation.RemoveEffect(Effect.WasteNot2); + Simulation.AddEffect(Effect.WasteNot, 4); + } +} diff --git a/Craftimizer/Simulator/Actions/WasteNot2.cs b/Craftimizer/Simulator/Actions/WasteNot2.cs new file mode 100644 index 0000000..1f9e7f4 --- /dev/null +++ b/Craftimizer/Simulator/Actions/WasteNot2.cs @@ -0,0 +1,19 @@ +namespace Craftimizer.Simulator.Actions; + +internal class WasteNot2 : BaseAction +{ + public WasteNot2(Simulation simulation) : base(simulation) { } + + public override ActionCategory Category => ActionCategory.Durability; + public override int Level => 47; + + public override int CPCost => 98; + public override float Efficiency => 0f; + public override int DurabilityCost => 0; + + public override void UseSuccess() + { + Simulation.RemoveEffect(Effect.WasteNot); + Simulation.AddEffect(Effect.WasteNot2, 8); + } +} diff --git a/Craftimizer/Simulator/CharacterStats.cs b/Craftimizer/Simulator/CharacterStats.cs new file mode 100644 index 0000000..c325569 --- /dev/null +++ b/Craftimizer/Simulator/CharacterStats.cs @@ -0,0 +1,16 @@ +using System.Linq; +using Craftimizer.Plugin; + +namespace Craftimizer.Simulator; + +internal record CharacterStats +{ + public int Craftsmanship { get; } + public int Control { get; } + public int CP { get; } + public int Level { get; } + + public int CLvl => Level <= 80 + ? LuminaSheets.ParamGrowSheet.GetRow((uint)Level)!.CraftingLevel + : (int)LuminaSheets.RecipeLevelTableSheet.First(r => r.ClassJobLevel == Level).RowId; +} diff --git a/Craftimizer/Simulator/Condition.cs b/Craftimizer/Simulator/Condition.cs new file mode 100644 index 0000000..f098f69 --- /dev/null +++ b/Craftimizer/Simulator/Condition.cs @@ -0,0 +1,15 @@ +namespace Craftimizer.Simulator; + +internal enum Condition +{ + Poor, + Normal, + Good, + Excellent, + + //Centered, + //Sturdy, + //Pliant, + //Malleable, + //Primed +} diff --git a/Craftimizer/Simulator/Effect.cs b/Craftimizer/Simulator/Effect.cs new file mode 100644 index 0000000..289d339 --- /dev/null +++ b/Craftimizer/Simulator/Effect.cs @@ -0,0 +1,14 @@ +namespace Craftimizer.Simulator; + +internal enum Effect +{ + InnerQuiet, + WasteNot, + Veneration, + GreatStrides, + Innovation, + FinalAppraisal, + WasteNot2, + MuscleMemory, + Manipulation, +} diff --git a/Craftimizer/Simulator/Simulation.cs b/Craftimizer/Simulator/Simulation.cs new file mode 100644 index 0000000..1b1cf8c --- /dev/null +++ b/Craftimizer/Simulator/Simulation.cs @@ -0,0 +1,149 @@ +using Craftimizer.Simulator.Actions; +using Lumina.Excel.GeneratedSheets; +using System; +using System.Collections.Generic; + +namespace Craftimizer.Simulator; + +internal class Simulation +{ + public CharacterStats Stats { get; } + public Recipe Recipe { get; } + public RecipeLevelTable RecipeTable => Recipe.RecipeLevelTable.Value!; + public int RLvl => (int)RecipeTable.RowId; + + public int StepCount => ActionHistory.Count; + public int Progress { get; private set; } + public int Quality { get; private set; } + public int Durability { get; private set; } + public int CP { get; private set; } + public Condition Condition { get; private set; } + public List<(Effect effect, int strength, int stepsLeft)> ActiveEffects { get; } = new(); + public List ActionHistory { get; } = new(); + + public bool IsFirstStep => StepCount == 0; + + private Random Random { get; } = new(); + + public Simulation(CharacterStats stats, Recipe recipe) + { + Stats = stats; + Recipe = recipe; + } + + public (int Strength, int Duration)? GetEffect(Effect effect) + { + var idx = ActiveEffects.FindIndex(x => x.effect == effect); + if (idx == -1) + return null; + var (_, strength, duration) = ActiveEffects[idx]; + return (strength, duration); + } + + public void AddEffect(Effect effect, int duration, int strength = 1) + { + // Duration will be decreased in the next step, so we need to add 1 + duration += 1; + + var idx = ActiveEffects.FindIndex(x => x.effect == effect); + if (idx == -1) + ActiveEffects.Add((effect, strength, duration)); + else + ActiveEffects[idx] = (effect, strength, duration); + } + + public void StrengthenEffect(Effect effect, int duration = -1) + { + var idx = ActiveEffects.FindIndex(x => x.effect == effect); + if (idx == -1) + ActiveEffects.Add((effect, 1, duration)); + else + ActiveEffects[idx] = (effect, ActiveEffects[idx].strength + 1, duration); + } + + public void RemoveEffect(Effect effect) + { + var idx = ActiveEffects.FindIndex(x => x.effect == effect); + if (idx != -1) + ActiveEffects.RemoveAt(idx); + } + + public bool HasEffect(Effect effect) => GetEffect(effect) != null; + + public BaseAction? GetPreviousAction(int stepsBack = 1) + { + return StepCount < stepsBack ? null : ActionHistory[^stepsBack]; + } + + public bool RollSuccess(float successRate) => + successRate >= Random.NextSingle(); + + public void ReduceDurability(int amount) + { + if (HasEffect(Effect.WasteNot) || HasEffect(Effect.WasteNot2)) + amount /= 2; + Durability -= amount; + } + + public void RestoreDurability(int amount) + { + Durability += amount; + } + + public void ReduceCP(int amount) + { + CP -= amount; + } + + public void RestoreCP(int amount) + { + CP += amount; + } + + public void IncreaseProgress(float efficiency) + { + if (HasEffect(Effect.MuscleMemory)) + { + efficiency += 1.00f; + RemoveEffect(Effect.MuscleMemory); + } + if (HasEffect(Effect.Veneration)) + efficiency += 0.50f; + + // https://github.com/NotRanged/NotRanged.github.io/blob/0f4aee074f969fb05aad34feaba605057c08ffd1/app/js/ffxivcraftmodel.js#L88 + var baseIncrease = Stats.Craftsmanship * 10 / RecipeTable.ProgressDivider + 2; + if (Stats.CLvl <= RLvl) + baseIncrease *= RecipeTable.ProgressModifier / 100; + + Progress += (int)(baseIncrease * efficiency); + } + + public void IncreaseQuality(float efficiency) + { + efficiency += (GetEffect(Effect.InnerQuiet)?.Strength ?? 0) * 0.10f; + if (HasEffect(Effect.GreatStrides)) + { + efficiency += 1.00f; + RemoveEffect(Effect.GreatStrides); + } + if (HasEffect(Effect.Innovation)) + efficiency += 0.50f; + + var conditionModifier = Condition switch + { + Condition.Poor => 0.50f, + Condition.Good => 1.50f, // 1.75f if relic tool + Condition.Excellent => 4.00f, + _ => 1.00f, + }; + + var baseIncrease = Stats.Craftsmanship * 10 / RecipeTable.ProgressDivider + 2; + if (Stats.CLvl <= RLvl) + baseIncrease *= RecipeTable.ProgressModifier / 100; + + Quality += (int)(baseIncrease * efficiency * conditionModifier); + + if (Stats.Level >= 11) + StrengthenEffect(Effect.InnerQuiet); + } +} diff --git a/Craftimizer/packages.lock.json b/Craftimizer/packages.lock.json new file mode 100644 index 0000000..2426061 --- /dev/null +++ b/Craftimizer/packages.lock.json @@ -0,0 +1,13 @@ +{ + "version": 1, + "dependencies": { + "net7.0-windows7.0": { + "DalamudPackager": { + "type": "Direct", + "requested": "[2.1.10, )", + "resolved": "2.1.10", + "contentHash": "S6NrvvOnLgT4GDdgwuKVJjbFo+8ZEj+JsEYk9ojjOR/MMfv1dIFpT8aRJQfI24rtDcw1uF+GnSSMN4WW1yt7fw==" + } + } + } +} \ No newline at end of file