public void PrintMoveMap(Movemap movemap, Node.TileGameStatus characterFraction) { foreach (var tilePosition in movemap.MoveCoords) { Movemap.SetTile(tilePosition, MoveTile); } foreach (var tilePosition in movemap.MeleeCoords) { if (GetNode(tilePosition).GameStatus == characterFraction) { Movemap.SetTile(tilePosition, AllyTile); } else { Movemap.SetTile(tilePosition, EnemyTile); } } foreach (var tilePosition in movemap.RangeCoords) { if (GetNode(tilePosition).GameStatus == characterFraction) { Movemap.SetTile(tilePosition, AllyTile); } else { Movemap.SetTile(tilePosition, EnemyTile); } } }
public List <Vector3Int> GetMeleeTileCoordsFromMovemap(Node.TileGameStatus gameStatus) { if (gameStatus == Node.TileGameStatus.Empty) { return(MoveCoords); } else { return(MeleeCoords); } }
//Build movemap and additional tiles (attack influence) that character can attack public void GetInfluenceMap(Character character, out List <Vector3Int> moveInfluence, out List <Vector3Int> attackInfluence) { moveInfluence = new List <Vector3Int>(); attackInfluence = new List <Vector3Int>(); List <Node> nodesToProcess = new List <Node>(); Node currentNode = _graph.GetNode(character.Coords); currentNode.ProcessValue = character.Properties.Speed; currentNode.ProcessStatus = Node.NodeProcessStatus.InOpenList; nodesToProcess.Add(currentNode); moveInfluence.Add(currentNode.Coords); Node.TileGameStatus fraction = Node.GetTileStatusFromCharacter(character); Node.TileGameStatus oppositeFraction; if (fraction == Node.TileGameStatus.Ally) { oppositeFraction = Node.TileGameStatus.Enemy; } else { oppositeFraction = Node.TileGameStatus.Ally; } while (nodesToProcess.Count != 0) { currentNode = nodesToProcess[0]; foreach (var connection in currentNode.Connections) { Node endNode = connection.EndNode; if ((endNode.ProcessStatus == Node.NodeProcessStatus.NotVisited || endNode.ProcessValue < currentNode.ProcessValue - 1) && endNode.GameStatus != fraction) { //first entry in open list and not taken by ally if (endNode.ProcessStatus == Node.NodeProcessStatus.NotVisited) { moveInfluence.Add(endNode.Coords); } //hit to enemy ends turn if (endNode.GameStatus == oppositeFraction) { endNode.ProcessValue = 0; endNode.ProcessStatus = Node.NodeProcessStatus.InClosedList; } else { endNode.ProcessValue = currentNode.ProcessValue - 1; } //if node has been already waiting processing in open list then change order if (endNode.ProcessStatus == Node.NodeProcessStatus.InOpenList) { nodesToProcess.Remove(endNode); } if (endNode.ProcessValue > 0) { int indexToInsert = nodesToProcess.FindLastIndex(delegate(Node node) { return(node.ProcessValue >= endNode.ProcessValue); }); nodesToProcess.Insert(indexToInsert, endNode); endNode.ProcessStatus = Node.NodeProcessStatus.InOpenList; } else { //check all near tiles and find these that beyond move influence on 1 step for (int i = 0; i < 4; ++i) { Vector3Int offsetPosition = endNode.Coords + offsets[i]; Node offsetNode = _graph.GetNode(offsetPosition); if (offsetNode != null && offsetNode.ProcessStatus == Node.NodeProcessStatus.NotVisited) { attackInfluence.Add(offsetNode.Coords); offsetNode.ProcessStatus = Node.NodeProcessStatus.InClosedList; offsetNode.ProcessValue = 0; } } endNode.ProcessStatus = Node.NodeProcessStatus.InClosedList; } } } nodesToProcess.Remove(currentNode); currentNode.ProcessStatus = Node.NodeProcessStatus.InClosedList; } }
/* * Movemap section */ public Movemap BuildMovemap(Node.TileGameStatus fraction, int moveDistance, Vector3Int position) { Movemap map = new Movemap(); List <Node> nodesToProcess = new List <Node>(); Node currentNode = _graph.GetNode(position); if (currentNode.GameStatus == Node.TileGameStatus.Block) { return(map); } currentNode.ProcessValue = moveDistance; currentNode.ProcessStatus = Node.NodeProcessStatus.InOpenList; nodesToProcess.Add(currentNode); map.MoveCoords.Add(currentNode.Coords); while (nodesToProcess.Count != 0) { currentNode = nodesToProcess[0]; foreach (var connection in currentNode.Connections) { Node endNode = connection.EndNode; if ((endNode.ProcessStatus == Node.NodeProcessStatus.NotVisited || endNode.ProcessValue < currentNode.ProcessValue - 1) && endNode.GameStatus == Node.TileGameStatus.Empty) { //first entry in open list and not taken by characters if (endNode.ProcessStatus == Node.NodeProcessStatus.NotVisited) { map.MoveCoords.Add(endNode.Coords); } endNode.ProcessValue = currentNode.ProcessValue - 1; //if node has been already waiting processing in open list then change order if (endNode.ProcessStatus == Node.NodeProcessStatus.InOpenList) { nodesToProcess.Remove(endNode); } if (endNode.ProcessValue > 0) { int indexToInsert = nodesToProcess.FindLastIndex(delegate(Node node) { return(node.ProcessValue >= endNode.ProcessValue); }); nodesToProcess.Insert(indexToInsert, endNode); endNode.ProcessStatus = Node.NodeProcessStatus.InOpenList; } else { endNode.ProcessStatus = Node.NodeProcessStatus.InClosedList; } } } nodesToProcess.Remove(currentNode); currentNode.ProcessStatus = Node.NodeProcessStatus.InClosedList; } _graph.RestoreProcessStatus(); return(map); }
public void SetTileGameplayStatus(Vector3Int coords, Node.TileGameStatus status) { _graph.GetNode(coords).GameStatus = status; }