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); * } */ }
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); }
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)); }