public virtual Cell GetCell(Vector2Int terrainPos, bool isForMap = false)
    {
        Cell cell = null;

        Chunk chunk = GetChunk(terrainPos);

        // Check ChunksForMap
        if (chunk == null && isForMap)
        {
            Vector2Int chunkPos = TerrainPosToChunk(terrainPos);
            ChunksForMap.TryGetValue(chunkPos, out chunk);
        }

        // Get cell from the chunk if it exists
        if (chunk != null)
        {
            Vector2Int posInChunk = new Vector2Int(LC_Math.Mod(terrainPos.x, ChunkSize),
                                                   LC_Math.Mod(terrainPos.y, ChunkSize));

            cell = chunk.Cells[posInChunk.x, posInChunk.y];
        }

        return(cell);
    }
示例#2
0
    /// <summary>
    /// <para>Calculates a pseudo-random direction based on lastDirection and a random value.</para>
    /// <para>If the random value is greater than sameDirectionProbability it will compute a diferent direction.</para>
    /// <para>For that, it will test alternate directions trying to minimize the turn from the lastDirection.</para>
    /// <para>If no direction is possible, returns Vector2Int.zero.</para>
    /// </summary>
    /// <param name="origin">Original position.</param>
    /// <param name="lastDirection">Last direction. Must be a normalized vector.</param>
    /// <param name="randGenerator">Random generator for the direction.</param>
    /// <param name="sameDirectionProbability">Probability of conserve the lastDirection.</param>
    /// <param name="isPositionAccessible">>Method to check if a position is accessible.</param>
    /// <returns>The new direction or, if no one is possible, Vector2Int.zero.</returns>
    public static Vector2Int PseudorandomDirection(Vector2Int origin, Vector2Int lastDirection, System.Random randGenerator, float sameDirectionProbability, IsPositionAccessible isPositionAccessible)
    {
        Vector2Int nextDirection = Vector2Int.zero;

        lastDirection = lastDirection.TransformToDirection();

        float sameDirectionProb = Mathf.Clamp(sameDirectionProbability, 0, 100);
        bool  useSameDirection  = RandomDouble(randGenerator, 0, 100) <= sameDirectionProb;

        // If is possible continue in the same direction ( not 0,0 )
        if (useSameDirection && !lastDirection.Equals(Vector2Int.zero) && IsPossibleDirection(origin, lastDirection, isPositionAccessible))
        {
            nextDirection = lastDirection;
        }
        // Search a new random direction different of last
        else
        {
            int lastDirectionIdx = EightDirections2D.IndexOf(lastDirection);
            // If any previous direction is possible, assign one random
            if (lastDirectionIdx == -1)
            {
                lastDirectionIdx = randGenerator.Next(0, EightDirections2D.Count);
            }

            // Check the possible directions incrementing the offset relative to lastDirection
            int        idx;
            bool       turnRight;
            Vector2Int possibleDirection;
            for (int offset = 1; offset < EightDirections2D.Count / 2 && nextDirection == Vector2Int.zero; offset++)
            {
                turnRight = randGenerator.Next(0, 2) == 0;

                idx = LC_Math.Mod(lastDirectionIdx + (turnRight ? offset : -offset), EightDirections2D.Count);
                possibleDirection = EightDirections2D[idx];
                if (IsPossibleDirection(origin, possibleDirection, isPositionAccessible))
                {
                    nextDirection = possibleDirection;
                }
                else
                {
                    idx = LC_Math.Mod(lastDirectionIdx + (!turnRight ? offset : -offset), EightDirections2D.Count);
                    possibleDirection = EightDirections2D[idx];
                    if (IsPossibleDirection(origin, possibleDirection, isPositionAccessible))
                    {
                        nextDirection = possibleDirection;
                    }
                }
            }

            // If any other direction isn't possible, check the opposite of last direction
            if (nextDirection == Vector2Int.zero)
            {
                possibleDirection = lastDirection * -1;
                if (IsPossibleDirection(origin, possibleDirection, isPositionAccessible))
                {
                    nextDirection = possibleDirection;
                }
            }
        }

        return(nextDirection);
    }