Esempio n. 1
0
        public IGameAction GetAction(GameEntity entity)
        {
            // todo: remove this and use BlockedUntil. But for sure? Maybe this check is better?
            // now it causes problems when an animating actor is leaving sight (animation doesn't finish -> infinite loop)
            if (entity.view.Controller.Animator.IsAnimating)
            {
                return(null);
            }

            if (entity.hasPreparedAction)
            {
                IGameAction actionToReturn = entity.preparedAction.Action;
                entity.RemovePreparedAction();
                return(actionToReturn);
            }

            if (!entity.hasActivity)
            {
                float score;
                Skill skill = _utilityAi.ResolveSkillWhenIdle(out score, entity);

                Activity newActivity;
                try
                {
                    newActivity = skill.ActivityCreator.CreateActivity(_activityCreationContext, score, null, entity);
                }
                catch (Exception e)
                {
                    Debug.LogError(e.Message + ", stack trace: " + e.StackTrace);
                    newActivity = new WaitActivity(_actionFactory, 2, "Wait");
                }
                entity.AddActivity(newActivity);
                newActivity.OnStart(entity);
            }

            IActivity    activity     = entity.activity.Activity;
            ActivityStep activityStep = activity.CheckAndResolveStep(entity);

            if (activityStep.State == ActivityState.FinishedSuccess || activityStep.State == ActivityState.FinishedFailure)
            {
                entity.RemoveActivity();
            }

            IGameAction actionFromActivity = activityStep.GameAction;

            return(actionFromActivity);
        }
Esempio n. 2
0
        public IGameAction GetAction(GameEntity entity)
        {
            // todo: remove this and use BlockedUntil. But for sure? Maybe this check is better?
            // now it may cause problems when an animating actor is leaving sight (animation doesn't finish -> infinite loop)
            if (entity.view.Controller.Animator.IsAnimating)
            {
                return(null);
            }

            if (entity.hasPreparedAction)
            {
                IGameAction actionToReturn = entity.preparedAction.Action;
                entity.RemovePreparedAction();
                return(actionToReturn);
            }

            (Skill skill, float score)newSkillAndScore = default;
            if (entity.hasActivity && entity.hasSkills && entity.hasStimuli)
            {
                List <Stimulus> stimuliReceived = entity.stimuli.Stimuli.ToList();

                newSkillAndScore = _activityResolver.ResolveNewSkillIfApplicable(entity, stimuliReceived);
            }
            else if (!entity.hasActivity)
            {
                newSkillAndScore = _utilityAi.ResolveSkillWhenIdle(entity);
            }

            if (newSkillAndScore.skill != null)
            {
                Activity newActivity;
                try
                {
                    newActivity = newSkillAndScore.skill.ActivityCreator.CreateActivity(_activityCreationContext, newSkillAndScore.score, null, entity);
                }
                catch (Exception e)
                {
                    Debug.LogError(e.Message + ", stack trace: " + e.StackTrace);
                    newActivity = new WaitActivity(_actionFactory, 2, "Wait");
                }

                if (entity.hasActivity)
                {
                    entity.activity.Activity.OnFailure(entity);
                }
                entity.ReplaceActivity(newActivity);
                newActivity.OnStart(entity);
            }

            IActivity    activity     = entity.activity.Activity;
            ActivityStep activityStep = activity.CheckAndResolveStep(entity);

            if (activityStep.State == ActivityState.FinishedSuccess || activityStep.State == ActivityState.FinishedFailure)
            {
                entity.RemoveActivity();
            }

            IGameAction actionFromActivity = activityStep.GameAction;

            return(actionFromActivity);
        }