예제 #1
0
        public Task GetEasiestTask(List <Task> tasks)
        {
            if (tasks == null)
            {
                return(null);
            }

            float bestCost = float.MaxValue;
            Task  bestTask = null;

            Task.PriorityType bestPriority = Task.PriorityType.Eventually;


            foreach (Task task in tasks)
            {
                float cost = task.ComputeCost(Creature);

                if (task.IsFeasible(Creature) && task.Priority >= bestPriority && cost < bestCost)
                {
                    bestCost     = cost;
                    bestTask     = task;
                    bestPriority = task.Priority;
                }
            }

            return(bestTask);
        }
예제 #2
0
        public Task GetBestTask(CreatureAI creatureAI, int minPriority = -1)
        {
            Task  best     = null;
            float bestCost = float.MaxValue;

            Task.PriorityType bestPriority = Task.PriorityType.Eventually;
            var creature = creatureAI.Creature;

            foreach (var task in Tasks)
            {
                if (!creature.Stats.IsTaskAllowed(task.Category))
                {
                    continue;
                }
                if (task.AssignedCreatures.Count >= task.MaxAssignable)
                {
                    continue;
                }
                if (task.IsComplete(creature.Faction))
                {
                    continue;
                }
                if (task.IsFeasible(creature) != Task.Feasibility.Feasible)
                {
                    continue;
                }
                if (task.Priority < bestPriority)
                {
                    continue;
                }
                if ((int)task.Priority <= minPriority)
                {
                    continue;
                }

                var cost = task.ComputeCost(creature) * (1 + task.AssignedCreatures.Count);

                if (cost < bestCost || task.Priority > bestPriority)
                {
                    bestCost     = cost;
                    best         = task;
                    bestPriority = task.Priority;
                }
            }

            if (best != null)
            {
                return(best);
            }

            return(null);
        }
예제 #3
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);
        }