using System.Text.Json;
using XFEEDToolBox.Core.Models;
namespace XFEEDToolBox.Core.Engineering;
public sealed record EngineeringRules
{
public string Source { get; init; } = "";
public double ProgressPercent { get; init; }
public Dictionary<int, double> ReputationThresholds { get; init; } = [];
public Dictionary<int, double> ReputationRewards { get; init; } = [];
public static EngineeringRules Captured { get; } = Read();
private static EngineeringRules Read()
{
using var stream = typeof(EngineeringRules).Assembly.GetManifestResourceStream("XFEEDToolBox.Core.Engineering.rules.json")!;
return JsonSerializer.Deserialize<EngineeringRules>(stream, ToolboxSettings.JsonOptions)!;
}
public int Rank(double reputation) => ReputationThresholds.Where(p => reputation + 1e-8 >= p.Value).Max(p => p.Key);
public double Absolute(int rank, double progress) => rank >= 5 ? ReputationThresholds[5] : ReputationThresholds[rank] + Math.Clamp(progress, 0, 100) / 100 * (ReputationThresholds[rank + 1] - ReputationThresholds[rank]);
public double WithinRank(double reputation) { var rank = Rank(reputation); return rank == 5 ? 100 : 100 * (reputation - ReputationThresholds[rank]) / (ReputationThresholds[rank + 1] - ReputationThresholds[rank]); }
public double Reward(int grade) => ReputationRewards.GetValueOrDefault(grade);
// Verified against the user's live post-18.08 EngineerCraft quality sequences.
public static double QualityGain(int grade, int rank) => 1.0 / (grade + 5 - rank);
}
using System.Text.Json;
using XFEEDToolBox.Core.Models;
namespace XFEEDToolBox.Core.Engineering;
public sealed record EngineeringRules
{
public string Source { get; init; } = "";
public double ProgressPercent { get; init; }
public Dictionary<int, double> ReputationThresholds { get; init; } = [];
public Dictionary<int, double> ReputationRewards { get; init; } = [];
public static EngineeringRules Captured { get; } = Read();
private static EngineeringRules Read()
{
using var stream = typeof(EngineeringRules).Assembly.GetManifestResourceStream("XFEEDToolBox.Core.Engineering.rules.json")!;
return JsonSerializer.Deserialize<EngineeringRules>(stream, ToolboxSettings.JsonOptions)!;
}
public int Rank(double reputation) => ReputationThresholds.Where(p => reputation + 1e-8 >= p.Value).Max(p => p.Key);
public double Absolute(int rank, double progress) => rank >= 5 ? ReputationThresholds[5] : ReputationThresholds[rank] + Math.Clamp(progress, 0, 100) / 100 * (ReputationThresholds[rank + 1] - ReputationThresholds[rank]);
public double WithinRank(double reputation) { var rank = Rank(reputation); return rank == 5 ? 100 : 100 * (reputation - ReputationThresholds[rank]) / (ReputationThresholds[rank + 1] - ReputationThresholds[rank]); }
public double Reward(int grade) => ReputationRewards.GetValueOrDefault(grade);
// Verified against the user's live post-18.08 EngineerCraft quality sequences.
public static double QualityGain(int grade, int rank) => 1.0 / (grade + 5 - rank);
}