コード例 #1
0
        // Get a new task for the specified creature using needs //
        public void GetNewTask(Creature creature)
        {
            Needs.NEEDTYPE highestNeed = Needs.NEEDTYPE.NONE;
            highestNeed = creature.getCreatureStats().getNeeds().getMostUrgent();
            Tasks.CreatureTasks neededTask = Tasks.CreatureTasks.NONE;
            // No Needs based tasked //

            /*if (highestNeed == Needs.NEEDTYPE.NONE)
             * {
             *  TribeJobPosting posting = creature.GetTribe().GetJobPosting(creature);
             *  if(posting != null)
             *  {
             *      neededTask = posting.requestedTask;
             *  }
             * }
             * else*/
            neededTask = Tasks.GetAppropriateTask(highestNeed);

            if (neededTask == Tasks.CreatureTasks.SLEEP && creature.GetCurrentState() == Creature.CREATURE_STATE.SLEEP)
            {
                Debug.LogWarning("Task is sleep, already asleep");
                return;
            }
            ActionStep.FailReason failReason = currentTask.GetPreviousStepsFailReason();
            // DEPRECATED? Previous task was failed //
            if (failReason != ActionStep.FailReason.NA)
            {
            }
            startNewTask(neededTask);
        }
コード例 #2
0
        // EXCEPTION ACTIONS, Do these when tasks fail for a certain reason //
        public static ActionStep[] GetExceptionActions(Tasks.CreatureTasks task, ActionStep.FailReason failReason,
                                                       Creature creature)
        {
            Tasks.CreatureTasks exceptionTask = Tasks.CreatureTasks.NONE;
            // Couldn't locate Sleeping spot //
            if (task == Tasks.CreatureTasks.SLEEP && failReason == ActionStep.FailReason.InfinityDistance)
            {
                exceptionTask = Tasks.CreatureTasks.EXPLORE;
            }
            // Don't know of any food //
            if (task == Tasks.CreatureTasks.EAT && failReason == ActionStep.FailReason.NoKnownFoodProducer)
            {
                exceptionTask = Tasks.CreatureTasks.EXPLORE;
            }
            else if (task == Tasks.CreatureTasks.EAT && failReason == ActionStep.FailReason.NoKnownFood)
            {
                exceptionTask = Tasks.CreatureTasks.MOVE_AND_OBSERVE;
            }
            ActionStep[] steps = GetTaskList(exceptionTask);
            // If we're exploring looking for food, only explore for a little bit //
            if (task == Tasks.CreatureTasks.EAT && failReason == ActionStep.FailReason.NoKnownFoodProducer)
            {
                //steps[1].OverrideMaxTimeAllowed(6f);
            }
            else if (task == Tasks.CreatureTasks.EAT && failReason == ActionStep.FailReason.NoKnownFood)
            {
                Thing[] foodProducers = creature.GetKnownConsumeableProducers();

                List <Thing> validThings = new List <Thing>();
                for (int count = 0; count < foodProducers.Length; count++)
                {
                    Thing producer = foodProducers[count];
                    //Debug.LogWarning("Distance - " + Vector3.Distance(producer.transform.position, creature.transform.position));
                    if (Vector3.Distance(producer.transform.position, creature.transform.position) > 300)
                    {
                        validThings.Add(producer);
                    }
                }
                Thing foodProducer = null;
                if (validThings.Count > 0)
                {
                    foodProducer = validThings[Random.Range(0, validThings.Count)];
                }
                if (foodProducer != null)
                {
                    steps[0].SetTargetPosition(foodProducer.transform.position);
                    creature.SetNavMeshAgentDestination(foodProducer.transform.position);
                }
                else
                {
                    //Debug.LogWarning("NO valid producers");
                    return(GetExceptionActions(Tasks.CreatureTasks.EAT, ActionStep.FailReason.NoKnownFoodProducer, creature));
                }
            }
            return(steps);
        }
コード例 #3
0
 private static Tasks.CreatureTasks GetExceptionTask(Tasks.CreatureTasks task, ActionStep.FailReason failReason)
 {
     return(Tasks.CreatureTasks.EXPLORE);
 }