/// <summary> /// La funcion crea el conjunto de casillas que forman la vision /// </summary> private void ComputeVisionSet() { // Vaciamos el Set anterior visionTiles.Clear(); // Obtenemos el tamaño basico de la casilla float tileSize = board.GetTileSize(); // Obtenemos el indice de la casilla a la que miramos int centralIndex = board.PositionToIndex(transform.position + transform.forward * tileSize); // Obtenemos la diferencia entre el indice al que apuntamos y el actual int centerDiff = centralIndex - boardIndex; // Calculamos los limites para los bucles int minI; int maxI; int minJ; int maxJ; int boardSize1 = (int)board.GetBoardShape()[0]; if (Mathf.Abs(centerDiff) < boardSize1) { // Definimos los bordes del tablero int clampMaxJ = boardSize1 - 1 - (centralIndex % boardSize1); int clampMinJ = -(centralIndex % boardSize1); maxI = horizontalVisionSize / 2; minI = -horizontalVisionSize / 2; maxJ = Mathf.Clamp((verticalVisionSize - 1) * centerDiff, clampMinJ, clampMaxJ); minJ = 0; if (minJ > maxJ) { minJ = maxJ; maxJ = 0; } } else { // Definimos los bordes del tablero int clampMaxJ = boardSize1 - 1 - (centralIndex % boardSize1); int clampMinJ = -(centralIndex % boardSize1); maxJ = Mathf.Clamp(horizontalVisionSize / 2, clampMinJ, clampMaxJ); minJ = Mathf.Clamp(-horizontalVisionSize / 2, clampMinJ, clampMaxJ); maxI = (verticalVisionSize - 1) * (int)Mathf.Sign(centerDiff); minI = 0; if (minI > maxI) { minI = maxI; maxI = 0; } } int borderCheck = Mathf.Abs(centralIndex % boardSize1 - boardIndex % boardSize1); if (centralIndex >= 0 && borderCheck != boardSize1 - 1) { for (int i = minI; i <= maxI; i++) { for (int j = minJ; j <= maxJ; j++) { int aux = centralIndex + j + i * boardSize1; visionTiles.Add(aux); } } } List <int> removeList = new List <int>(); // Una vez añadidas todas las casillas de vision basicas detectaremos los muros que hay dentro de ellas y eliminaremos los valores de vision que tapan deichos muros foreach (int tile in visionTiles) { if (board.isWall(tile)) { if (Mathf.Abs(centerDiff) < boardSize1) { for (int i = 0; i < verticalVisionSize; i++) { removeList.Add(tile + i * (int)Mathf.Sign(centerDiff)); } } else { for (int i = 0; i < verticalVisionSize; i++) { removeList.Add(tile + i * boardSize1 * (int)Mathf.Sign(centerDiff)); } } } } removeList.ForEach(x => visionTiles.Remove(x)); }