public Task GetBestTask(CreatureAI creature, int minPriority = -1) { Task best = null; float bestCost = float.MaxValue; Task.PriorityType bestPriority = Task.PriorityType.Eventually; foreach (var task in Tasks) { if (task.IsFeasible(creature.Creature) != Task.Feasibility.Feasible) { continue; } if (task.Priority < bestPriority) { continue; } if ((int)task.Priority <= minPriority) { continue; } var cost = task.ComputeCost(creature.Creature) * (1 + task.CurrentAssigned); if (cost < bestCost || task.Priority > bestPriority) { bestCost = cost; best = task; bestPriority = task.Priority; } } if (best != null) { best.CurrentAssigned++; if (best.CurrentAssigned >= best.MaxAssignable) { Tasks.Remove(best); } return(best.Clone()); } return(null); }