Change scoring to allow quality to dominate as craft finishes

This commit is contained in:
Asriel Camora
2024-07-28 19:13:19 -07:00
parent 13cd698743
commit 03eb60ee8c
+28 -9
View File
@@ -32,40 +32,59 @@ public struct SimulationNode(in SimulationState state, ActionType? action, Compl
if (completionState != CompletionState.ProgressComplete) if (completionState != CompletionState.ProgressComplete)
return null; return null;
var stepScore = 1f - ((float)(state.ActionCount + 1) / config.MaxStepCount);
if (state.Input.Recipe.MaxQuality == 0) if (state.Input.Recipe.MaxQuality == 0)
return 1f - ((float)(state.ActionCount + 1) / config.MaxStepCount); return stepScore;
[Pure] [Pure]
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
static float Apply(float bonus, float value, float target) => static float Apply(float multiplier, float value, float target) =>
bonus * (target > 0 ? Math.Clamp(value / target, 0, 1) : 1); multiplier * (target > 0 ? Math.Clamp(value / target, 0, 1) : 1);
var progressScore = Apply( [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
static float ApplyNondominant(float multiplier, float dominance, float value, float target) =>
Apply(float.Lerp(multiplier, 0, dominance), value, target);
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
static float ApplyNondominant2(float multiplier, float dominance, float score) =>
float.Lerp(multiplier, 0, dominance) * score;
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
static float ApplyDominant(float multiplier, float dominance, float value, float target) =>
Apply(float.Lerp(multiplier, 1, dominance), value, target);
var qualityDominance = state.ActionCount / config.MaxStepCount;
var progressScore = ApplyNondominant(
config.ScoreProgress, config.ScoreProgress,
qualityDominance,
state.Progress, state.Progress,
state.Input.Recipe.MaxProgress state.Input.Recipe.MaxProgress
); );
var qualityScore = Apply( var qualityScore = ApplyDominant(
config.ScoreQuality, config.ScoreQuality,
qualityDominance,
state.Quality, state.Quality,
state.Input.Recipe.MaxQuality state.Input.Recipe.MaxQuality
); );
var durabilityScore = Apply( var durabilityScore = ApplyNondominant(
config.ScoreDurability, config.ScoreDurability,
qualityDominance,
state.Durability, state.Durability,
state.Input.Recipe.MaxDurability state.Input.Recipe.MaxDurability
); );
var cpScore = Apply( var cpScore = ApplyNondominant(
config.ScoreCP, config.ScoreCP,
qualityDominance,
state.CP, state.CP,
state.Input.Stats.CP state.Input.Stats.CP
); );
var fewerStepsScore = var fewerStepsScore = ApplyNondominant2(config.ScoreSteps, qualityDominance, stepScore);
config.ScoreSteps * (1f - ((float)(state.ActionCount + 1) / config.MaxStepCount));
return progressScore + qualityScore + durabilityScore + cpScore + fewerStepsScore; return progressScore + qualityScore + durabilityScore + cpScore + fewerStepsScore;
} }