Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
 public UtilityAi(IActivityCreationContext activityCreationContext, ISkillEvaluationContext skillEvaluationContext,
                  IConditionContext conditionContext)
 {
     _activityCreationContext = activityCreationContext;
     _skillEvaluationContext  = skillEvaluationContext;
     _conditionContext        = conditionContext;
 }
Exemplo n.º 4
0
 public ActivityResolver(IUtilityAi utilityAi, IConditionContext conditionContext,
                         IActivityCreationContext activityCreationContext)
 {
     _utilityAi               = utilityAi;
     _conditionContext        = conditionContext;
     _activityCreationContext = activityCreationContext;
 }
Exemplo n.º 5
0
        public Activity CreateActivity(IActivityCreationContext context, float chosenSkillScore, StimulusContext stimulusContext, GameEntity entity)
        {
            Activity activity = CreateActivityInternal(context, stimulusContext, entity);

            activity.Score = chosenSkillScore;
            return(activity);
        }
Exemplo n.º 6
0
        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);
        }
Exemplo n.º 7
0
        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));
        }
Exemplo n.º 8
0
 public AiActionResolver(IActionFactory actionFactory, IUtilityAi utilityAi,
                         IActivityCreationContext activityCreationContext, IActivityResolver activityResolver)
 {
     _actionFactory           = actionFactory;
     _utilityAi               = utilityAi;
     _activityCreationContext = activityCreationContext;
     _activityResolver        = activityResolver;
 }
Exemplo n.º 9
0
        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"));
        }
Exemplo n.º 10
0
        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"));
        }
Exemplo n.º 11
0
        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));
        }
Exemplo n.º 12
0
        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"));
        }
Exemplo n.º 13
0
        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"));
        }
Exemplo n.º 14
0
        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"));
        }
Exemplo n.º 15
0
 protected abstract Activity CreateActivityInternal(IActivityCreationContext context, StimulusContext stimulusContext, GameEntity entity);