Files
Craftimizer/Simulator/Actions/BaseAction.cs
T
2023-06-19 10:03:57 -07:00

83 lines
2.7 KiB
C#

using System.Text;
namespace Craftimizer.Simulator.Actions;
public abstract class BaseAction
{
[ThreadStatic]
internal static Simulator? TLSSimulation;
protected static Simulator Simulation => TLSSimulation!;
// Non-instanced properties
public abstract ActionCategory Category { get; }
public abstract int Level { get; }
// Doesn't matter from which class, we'll use the sheet to extrapolate the rest
public abstract uint ActionId { get; }
// Instanced properties
public abstract int CPCost { get; }
public virtual float Efficiency => 0f;
public virtual bool IncreasesProgress => false;
public virtual bool IncreasesQuality => false;
public virtual float SuccessRate => 1f;
public virtual int DurabilityCost => 10;
public virtual bool IncreasesStepCount => true;
public virtual bool IsGuaranteedAction => SuccessRate == 1f;
public virtual bool CanUse =>
Simulation.Input.Stats.Level >= Level && Simulation.CP >= CPCost;
public virtual void Use()
{
if (Simulation.RollSuccess(SuccessRate))
UseSuccess();
Simulation.ReduceCP(CPCost);
Simulation.ReduceDurability(DurabilityCost);
if (Simulation.Durability > 0)
{
if (Simulation.HasEffect(EffectType.Manipulation))
Simulation.RestoreDurability(5);
}
if (IncreasesStepCount)
Simulation.IncreaseStepCount();
}
public virtual void UseSuccess()
{
if (Efficiency != 0f)
{
if (IncreasesProgress)
Simulation.IncreaseProgress(Efficiency);
if (IncreasesQuality)
Simulation.IncreaseQuality(Efficiency);
}
}
public virtual string GetTooltip(bool addUsability)
{
var builder = new StringBuilder();
if (addUsability && !CanUse)
builder.AppendLine($"Cannot Use");
builder.AppendLine($"Level {Level}");
if (CPCost != 0)
builder.AppendLine($"-{Simulation.CalculateCPCost(CPCost)} CP");
if (DurabilityCost != 0)
builder.AppendLine($"-{Simulation.CalculateDurabilityCost(DurabilityCost)} Durability");
if (Efficiency != 0)
{
if (IncreasesProgress)
builder.AppendLine($"+{Simulation.CalculateProgressGain(Efficiency)} Progress");
if (IncreasesQuality)
builder.AppendLine($"+{Simulation.CalculateQualityGain(Efficiency)} Quality");
}
if (!IncreasesStepCount)
builder.AppendLine($"Does Not Increase Step Count");
if (SuccessRate != 1f)
builder.AppendLine($"{Simulation.CalculateSuccessRate(SuccessRate) * 100}%% Success Rate");
return builder.ToString();
}
}