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