private Judgement JudgeQuality(RecipeData recipe, List<Ingredient> ingredients)
{
Judgement result;
result.Quality = 0;
result.HelpItem = null;
result.HelpAmount = 0;
var total = (float)recipe.MainIngredients.Sum(a => a.Amount);
foreach (var ingredient in ingredients)
{
// Every item *should* only appear once in main or other.
var ingredientData = recipe.MainIngredients.FirstOrDefault(a => a.ItemId == ingredient.Item.Info.Id);
if (ingredientData == null)
{
ingredientData = recipe.OtherIngredients.FirstOrDefault(a => a.ItemId == ingredient.Item.Info.Id);
if (ingredientData == null)
{
Log.Error("Cooking.JudgeQuality: Failed to get ingredient data for item '{0}' in recipe '{1},{2}'.", ingredient.Item.Info.Id, recipe.Method, recipe.ItemId);
break;
}
}
// Calculate the amount difference between the provided
// ingredient and the recipe.
var amount = ingredient.Amount;
var ideal = (1f / total * ingredientData.Amount);
var difference = ideal - amount;
var differenceAbs = Math.Abs(difference);
// Calculate quality
var rate = 1f - (1f / ideal * (differenceAbs * 2f));
var qualityAdd = ingredientData.QualityMin + rate * (ingredientData.QualityMax - ingredientData.QualityMin);
result.Quality = Math2.Clamp(-100, 100, result.Quality + qualityAdd);
// Save the ingredient with the biggest difference,
// for the help message.
if (differenceAbs > 0.05f && Math.Abs(result.HelpAmount) < differenceAbs)
{
result.HelpAmount = -difference;
result.HelpItem = ingredient.Item;
}
}
return result;
}