Example #1
0
        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);
        }