示例#1
0
        public override ActivityStep ResolveStep(GameEntity entity)
        {
            if (_navigationData == null)
            {
                _navigationData = _navigator.GetNavigationData(entity.position.Position, _destination);
                if (_navigationData == null)
                {
                    return(Fail(entity));
                }
            }

            Position         nextStep;
            NavigationResult navigationResult = _navigator.ResolveNextStep(_navigationData, entity.position.Position, out nextStep);

            if (navigationResult == NavigationResult.Finished)
            {
                return(Succeed(entity));
            }

            IGameAction moveGameAction = CreateMoveAction(nextStep, entity);

            return(new ActivityStep
            {
                State = ActivityState.InProgress,
                GameAction = moveGameAction
            });
        }
示例#2
0
        public override ActivityStep ResolveStep(GameEntity entity)
        {
            if (!_targetEntity.hasPosition)
            {
                return(Succeed(entity));
            }

            if (Position.Distance(_targetEntity.position.Position, entity.position.Position) >= _giveUpDistance)
            {
                return(Fail(entity));
            }

            Position targetCurrentPosition = _targetEntity.position.Position;

            bool targetIsOneStepAway = PositionUtilities.IsOneStep(entity.position.Position - targetCurrentPosition);

            if (targetIsOneStepAway)
            {
                return(new ActivityStep
                {
                    State = ActivityState.InProgress,
                    GameAction = _actionFactory.CreateAttackAction(entity, _targetEntity),
                });
            }

            if (_rng.Check(0.03f))
            {
                return(Fail(entity, _actionFactory.CreatePassAction(entity, 3f)));
            }

            bool targetPositionHasChanged = targetCurrentPosition != _lastTargetPosition;

            if (targetPositionHasChanged)
            {
                _lastTargetPosition = targetCurrentPosition;
            }
            if (targetPositionHasChanged || _navigationData == null)
            {
                // performance: should in fact be done every couple of turns
                _navigationData = _navigator.GetNavigationData(entity.position.Position, targetCurrentPosition);
            }

            Position         nextStep;
            NavigationResult navigationResult = _navigator.ResolveNextStep(_navigationData, entity.position.Position, out nextStep);

            if (navigationResult == NavigationResult.Finished)
            {
                return(Succeed(entity));
            }

            IGameAction moveGameAction = CreateMoveAction(nextStep, entity);

            return(new ActivityStep
            {
                State = ActivityState.InProgress,
                GameAction = moveGameAction
            });
        }
示例#3
0
        public override ActivityStep ResolveStep(GameEntity entity)
        {
            Position targetCurrentPosition = _targetPositionGetter();

            bool reachedTarget = PositionUtilities.IsOneStep(entity.position.Position - targetCurrentPosition);

            if (reachedTarget)
            {
                return(Succeed(entity));
            }

            bool targetPositionHasChanged = targetCurrentPosition != _lastTargetPosition;

            if (targetPositionHasChanged)
            {
                _lastTargetPosition = targetCurrentPosition;
            }
            if (targetPositionHasChanged || _navigationData == null)
            {
                // performance: should in fact be done every couple of turns
                _navigationData = _navigator.GetNavigationData(entity.position.Position, targetCurrentPosition);
            }

            Position         nextStep;
            NavigationResult navigationResult = _navigator.ResolveNextStep(_navigationData, entity.position.Position, out nextStep);

            if (navigationResult == NavigationResult.Finished)
            {
                return(Succeed(entity));
            }

            IGameAction moveGameAction = CreateMoveAction(nextStep, entity);

            return(new ActivityStep
            {
                State = ActivityState.InProgress,
                GameAction = moveGameAction
            });
        }
示例#4
0
        private NavigationData FindNavigationDataToGoodPosition(GameEntity entity, IFloodArea targetFlood, int preferredDistance)
        {
            IList <Position> availablePositions = GetPositionsOnFloodWithGivenDistance(targetFlood, preferredDistance).ToList();

            int attemptsLimit = 5;
            int attempts      = 0;

            while (true)
            {
                ++attempts;
                if (attempts > attemptsLimit)
                {
                    Debug.Log("Failed after " + attempts + " attempts.");
                    return(null);
                }
                Position[] candidates = { _rng.Choice(availablePositions), _rng.Choice(availablePositions), _rng.Choice(availablePositions) };
                var        navigationsToCandidates = new List <NavigationData>(candidates.Length);

                foreach (Position candidatePosition in candidates)
                {
                    NavigationData navigation = _navigator.GetNavigationData(entity.position.Position, candidatePosition);
                    navigationsToCandidates.Add(navigation);
                }

                List <NavigationData> validCandidates = navigationsToCandidates.Where(c => c != null).ToList();
                if (!validCandidates.Any())
                {
                    return(null);
                }

                validCandidates.Sort((first, second) =>
                                     PositionUtilities.WalkDistance(entity.position.Position, first.Destination)
                                     .CompareTo(PositionUtilities.WalkDistance(entity.position.Position, second.Destination)));
                NavigationData closestValidCandidate = validCandidates.First();
                return(closestValidCandidate);
            }
        }