private NavigationData GetReachableNavigationDataForHerdWander(IActivityCreationContext context, GameEntity entity, Position targetAreaCenter, int wanderRange) { var stopwatch = Stopwatch.StartNew(); NavigationData newNavigationData; const int maxAttemptsBeforeGivingUpWithStraightPath = 10; int attempts = 0; while (true) { ++attempts; Position wanderVector = new Position(context.Rng.Next(-wanderRange, wanderRange), context.Rng.Next(-wanderRange, wanderRange)); Position newTargetPosition = targetAreaCenter + wanderVector; if (newTargetPosition == entity.position.Position) { continue; } List <Position> pathToTarget = attempts <= maxAttemptsBeforeGivingUpWithStraightPath ? context.Navigator.GetStraightPath(entity.position.Position, newTargetPosition) : context.Navigator.GetJumpPoints(entity.position.Position, newTargetPosition); if (pathToTarget == null) { continue; } newNavigationData = context.Navigator.GetNavigationData(entity.position.Position, newTargetPosition); break; } //Debug.Log("FOUND GOOD PLACE AFTER " + attempts + " attempts and " + stopwatch.ElapsedMilliseconds + "ms."); return(newNavigationData); }
protected override Activity CreateActivityInternal(IActivityCreationContext context, StimulusContext stimulusContext, GameEntity entity) { entity.ReplaceSleeping(30); var sleepActivity = new WaitActivity(context.ActionFactory, 30, "Sleep", entityArg => entity.hasSleeping); return(sleepActivity); }
public UtilityAi(IActivityCreationContext activityCreationContext, ISkillEvaluationContext skillEvaluationContext, IConditionContext conditionContext) { _activityCreationContext = activityCreationContext; _skillEvaluationContext = skillEvaluationContext; _conditionContext = conditionContext; }
public ActivityResolver(IUtilityAi utilityAi, IConditionContext conditionContext, IActivityCreationContext activityCreationContext) { _utilityAi = utilityAi; _conditionContext = conditionContext; _activityCreationContext = activityCreationContext; }
public Activity CreateActivity(IActivityCreationContext context, float chosenSkillScore, StimulusContext stimulusContext, GameEntity entity) { Activity activity = CreateActivityInternal(context, stimulusContext, entity); activity.Score = chosenSkillScore; return(activity); }
private NavigationData GetReachableNavigationDataForWander(IActivityCreationContext context, Position startPosition, Position targetAreaCenter, int wanderRange, GameEntity entity) { NavigationData newNavigationData; while (true) { Position newTargetPosition; Position wanderVector = new Position(context.Rng.Next(-wanderRange, wanderRange + 1), context.Rng.Next(-wanderRange, wanderRange + 1)); newTargetPosition = targetAreaCenter + wanderVector; if (newTargetPosition == startPosition) { continue; } newNavigationData = context.Navigator.GetNavigationData(startPosition, newTargetPosition); if (newNavigationData == null) { continue; } break; } return(newNavigationData); }
protected override Activity CreateActivityInternal(IActivityCreationContext context, StimulusContext stimulusContext, GameEntity entity) { GameEntity enemyNearby = context.EntityDetector.DetectEntities(entity.position.Position, entity.vision.VisionRange) .FirstOrDefault(e => !context.FriendshipResolver.AreFriends(entity, e)); return(new AttackActivity(context.ActionFactory, context.Navigator, GiveUpDistance, enemyNearby, "Attack", context.Rng, context.GameConfig, context.EntityDetector)); }
public AiActionResolver(IActionFactory actionFactory, IUtilityAi utilityAi, IActivityCreationContext activityCreationContext, IActivityResolver activityResolver) { _actionFactory = actionFactory; _utilityAi = utilityAi; _activityCreationContext = activityCreationContext; _activityResolver = activityResolver; }
protected override Activity CreateActivityInternal(IActivityCreationContext context, StimulusContext stimulusContext, GameEntity entity) { GameEntity enemyNearby = context.EntityDetector.DetectEntities(entity.position.Position, entity.vision.VisionRange) .FirstOrDefault(e => !context.FriendshipResolver.AreFriends(entity, e)); Func <Position> targetPositionGetter = () => enemyNearby.position.Position; return(new ApproachActivity(context.ActionFactory, context.Navigator, targetPositionGetter, 10, "Approach")); }
protected override Activity CreateActivityInternal(IActivityCreationContext context, StimulusContext stimulusContext, GameEntity entity) { if (entity.hasView && entity.view.Controller is EntityViewBehaviour) { var evb = (EntityViewBehaviour)entity.view.Controller; evb.SortingOrder = 0; } return(new WaitActivity(context.ActionFactory, 1, "Pass")); }
protected override Activity CreateActivityInternal(IActivityCreationContext context, StimulusContext stimulusContext, GameEntity entity) { GameEntity enemyNearby = context.EntityDetector.DetectEntities(entity.position.Position, entity.vision.VisionRange) .FirstOrDefault(e => !context.FriendshipResolver.AreFriends(entity, e)); return(new KeepDistanceActivity(context.ActionFactory, PreferredDistance, context.Navigator, enemyNearby, context.CalculatedAreaAccessor, context.Rng, "Keep distance", context.ContextManager)); }
protected override Activity CreateActivityInternal(IActivityCreationContext context, StimulusContext stimulusContext, GameEntity entity) { IEnumerable <GameEntity> entitiesSeen = entity.vision.EntitiesRecentlySeen; GameEntity enemyNearby = entitiesSeen.FirstOrDefault(e => !context.FriendshipResolver.AreFriends(entity, e)); if (enemyNearby == null) { throw new InvalidOperationException("Running away, but from whom?"); } return(new RunAwayActivity(context.ActionFactory, context.CalculatedAreaAccessor, enemyNearby.position.Position, "Run away")); }
protected override Activity CreateActivityInternal(IActivityCreationContext context, StimulusContext stimulusContext, GameEntity entity) { Position herdCenter = GetHerdCenterOf(context.EntityDetector, entity, context.FriendshipResolver); var betweenMeAndHerdCenter = new Position((herdCenter.x + entity.position.Position.x) / 2, (herdCenter.y + entity.position.Position.y) / 2); NavigationData navigationData = GetReachableNavigationDataForHerdWander(context, entity, betweenMeAndHerdCenter, MaxWalkawayRangeFromHerdCenter); return(new SequenceActivity(new List <IActivity> { new GoToActivity(context.ActionFactory, navigationData, context.Navigator, "Roam"), new WaitActivity(context.ActionFactory, context.Rng.Next(15), "Wait") }.GetEnumerator(), "Herd roam")); }
protected override Activity CreateActivityInternal(IActivityCreationContext context, StimulusContext stimulusContext, GameEntity entity) { NavigationData navigationData1 = GetReachableNavigationDataForWander(context, entity.position.Position, entity.position.Position, RoamRange, entity); NavigationData navigationData2 = GetReachableNavigationDataForWander(context, navigationData1.Destination, entity.position.Position, RoamRange, entity); return(new SequenceActivity(new List <IActivity> { new WaitActivity(context.ActionFactory, context.Rng.Next(MaxWaitTime) + 1, "Wait 1/2"), new GoToActivity(context.ActionFactory, navigationData1, context.Navigator, "GoTo 1/2"), new WaitActivity(context.ActionFactory, context.Rng.Next(MaxWaitTime) + 1, "Wait 1/2"), new GoToActivity(context.ActionFactory, navigationData2, context.Navigator, "GoTo 2/2"), new WaitActivity(context.ActionFactory, context.Rng.Next(MaxWaitTime) + 1, "Wait 2/2"), }.GetEnumerator(), "Roam")); }
protected abstract Activity CreateActivityInternal(IActivityCreationContext context, StimulusContext stimulusContext, GameEntity entity);