private MoveTask CreateBypassMoveTask(IActor actor, ILogicStrategyData strategyData) { IEnumerable <IGraphNode> availableNodes; var frontNodes = WriteObservedNodes(actor, strategyData).ToArray(); if (frontNodes.Any()) { availableNodes = frontNodes; } else { availableNodes = strategyData.ObserverdNodes; } var availableNodesArray = availableNodes as HexNode[] ?? availableNodes.ToArray(); for (var i = 0; i < 3; i++) { var targetNode = DecisionSource.SelectTargetRoamingNode(availableNodesArray); if (Map.IsPositionAvailableFor(targetNode, actor)) { var moveTask = new MoveTask(actor, targetNode, Map); return(moveTask); } } return(null); }
private MoveTask CreateBypassMoveTask(IActor actor, ILogicStrategyData strategyData, ISector sector) { var map = sector.Map; var frontNodes = WriteObservedNodesOrGetFromFow(actor, strategyData, sector).ToArray(); if (!frontNodes.Any()) { return(null); } var availableNodesArray = frontNodes as HexNode[] ?? frontNodes.ToArray(); if (availableNodesArray.Length == 0) { // There is no nodes available to roaming. // We can do nothing. return(null); } for (var i = 0; i < 3; i++) { var targetNode = DecisionSource.SelectTargetRoamingNode(availableNodesArray); if (map.IsPositionAvailableFor(targetNode, actor)) { var context = new ActorTaskContext(sector); var moveTask = new MoveTask(actor, context, targetNode, map); return(moveTask); } } return(null); }
private MoveTask CreateBypassMoveTask(IActor actor) { var availableNodes = Map.Nodes.Where(x => Map.DistanceBetween(x, actor.Node) < 5); var availableNodesArray = availableNodes as HexNode[] ?? availableNodes.ToArray(); for (var i = 0; i < 3; i++) { var targetNode = DecisionSource.SelectTargetRoamingNode(availableNodesArray); if (Map.IsPositionAvailableFor(targetNode, actor)) { var moveTask = new MoveTask(actor, targetNode, Map); return(moveTask); } } return(null); }