Change scoring to allow quality to dominate as craft finishes
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user