Esempio n. 1
0
        public (Skill skillToIntroduceNewActivity, float score) ResolveNewSkillIfApplicable(GameEntity entity, List <Stimulus> stimuli)
        {
            List <Skill> skillsThatMayBreakIn = entity.skills.Skills
                                                .Where(skill => skill.TriggeringStimuli.Any(triggeringType =>
                                                                                            stimuli.Select(s => s.Type).Any(actualType => actualType == triggeringType)))
                                                .Where(s => s.Conditions.All(c => c.Evaluate(entity, _conditionContext))).ToList();

            if (skillsThatMayBreakIn.Count <= 0)
            {
                return(null, 0f);
            }

            StimulusContext stimulusContext = new StimulusContext {
                TargetEntity = entity
            };
            float minScoreAllowed = entity.hasActivity ? entity.activity.Activity.Score : 0f;

            (Skill skill, float score)newSkillAndScore = _utilityAi.ResolveSkill(entity, skillsThatMayBreakIn, stimulusContext, minScoreAllowed);

            return(newSkillAndScore);

/*
 *                      IActivity activityToReturn = null;
 *                      if (newSkillAndScore.skill != null)
 *                      {
 *                              try
 *                              {
 *                                      activityToReturn = newSkillAndScore.skill.ActivityCreator.CreateActivity(_activityCreationContext, newSkillAndScore.score, null, entity);
 *                              }
 *                              catch (Exception e)
 *                              {
 *                                      Debug.LogError(e.Message + ", stack trace: " + e.StackTrace);
 *                                      activityToReturn = entity.activity.Activity;
 *                              }
 *                      }
 *                      else
 *                      {
 *                              activityToReturn = entity.activity.Activity;
 *                      }
 *
 *                      if (activityToReturn != null)
 *                      {
 *                              _activityInterruptor.FailAndReplace(entity, activityToReturn);
 *                      }
 */
        }
Esempio n. 2
0
        public IActivity ResolveNewActivityForActorIfApplicable(StimulusDefinition stimulus, GameEntity targetActor, GameEntity entity)
        {
            IEnumerable <Skill> skillsThatMayBreakIn = entity.skills.Skills
                                                       .Where(s => s.StimuliToBreakIn.Contains(stimulus))
                                                       .Where(s => s.Conditions.All(c => c.Evaluate(entity, _conditionContext)));

            if (skillsThatMayBreakIn.Any())
            {
                StimulusContext stimulusContext = new StimulusContext {
                    TargetEntity = targetActor
                };
                float skillScore;
                float minScoreAllowed = entity.hasActivity ? entity.activity.Activity.Score : 0f;
                Skill skill           = _utilityAi.ResolveSkill(entity, skillsThatMayBreakIn, stimulusContext, minScoreAllowed, out skillScore);

                IActivity activityToReturn = null;
                if (skill != null)
                {
                    try
                    {
                        activityToReturn = skill.ActivityCreator.CreateActivity(_activityCreationContext, skillScore, null, entity);
                    }
                    catch (Exception e)
                    {
                        Debug.LogError(e.Message + ", stack trace: " + e.StackTrace);
                        activityToReturn = entity.activity.Activity;
                    }
                }
                else
                {
                    activityToReturn = entity.activity.Activity;
                }

                return(activityToReturn);
            }

            return(entity.hasActivity ? entity.activity.Activity : null);
        }
Esempio n. 3
0
        public (Skill skill, float score) ResolveSkill(GameEntity entity, IEnumerable <Skill> skillsAplicable, StimulusContext stimulusContext, float minScoreAllowed)
        {
            var skillsToScores = new List <Tuple <Skill, float> >();

            foreach (Skill actorSkill in skillsAplicable)
            {
                float score = actorSkill.Evaluator.EvaluateSkill(_skillEvaluationContext, actorSkill, entity);
                skillsToScores.Add(Tuple.Create(actorSkill, score));
            }

            skillsToScores.Sort((skillToScore1, skillToScore2) => skillToScore1.Item2.CompareTo(skillToScore2.Item2));

            Skill bestSkill      = skillsToScores.Last().Item1;
            float bestSkillScore = skillsToScores.Last().Item2;

            return(minScoreAllowed > bestSkillScore ? default : (bestSkill, bestSkillScore));
        }