public ActivityScore EvaluateActivity(ActivityResult activityResult, ActivityScore[] completedActivities, MissionScore score) { var previous = completedActivities.LastOrDefault(); var currentScore = score.GetScore(activityResult.ActivityType); var prevActivityScore = previous != null ? previous.Score : 0; var activityScore = CalculateScoreFor(activityResult); var p = P.Unchanged; var newScore = currentScore.Add(30); if (activityScore > prevActivityScore) { p = P.Improved; } else if (activityScore < prevActivityScore) { p = P.Detoriated; } // todo: but it won't be fair to get +10 if you didn't complete the activity...score could be 0,0,0,0 and you rack up +10's // Ultimately, basing mission percentage strictly off P+, P= and =- is flawed, I think. Should factor in activityScore in a different way? switch (activityResult.Result) { case ActivityResultKind.GaveUp: case ActivityResultKind.UnableToComplete: newScore = currentScore.Add(-10); p = P.Detoriated; break; } var nextActivity = _availableActivities.GetNextActivityType(score, newScore, activityResult, p); return(new ActivityScore(activityResult, activityScore, newScore, p, nextActivity)); }