public static bool FindGoodDuplicatePosAround(LogicLevel level, int x, int y, out int outputX, out int outputY, int radiusInTiles)
        {
            int width  = level.GetWidth();
            int height = level.GetHeight();
            int radius = radiusInTiles << 9;

            if (-512 * radiusInTiles < x)
            {
                x = x >= 0 ? x : 0;
            }

            if (-512 * radiusInTiles < y)
            {
                y = y >= 0 ? y : 0;
            }

            if (level.IsNpcVillage())
            {
                if (x <= 0)
                {
                    x = 512;
                }

                if (y <= 0)
                {
                    y = 512;
                }

                width  -= 512;
                height -= 512;

                if (x - radius > width || y - radius > height)
                {
                    outputX = 0;
                    outputY = 0;

                    return(false);
                }
            }

            int startX = x;
            int startY = y;

            if (x < width + radius)
            {
                startX = x <= width ? x : width;
            }

            if (y < height + radius)
            {
                startY = y <= height ? y : height;
            }

            int tileX = startX / 512 - 1;
            int tileY = startY / 512 - 1;

            for (int i = 0; i < 9; i++)
            {
                int randomPos = (i + 4) % 9;
                int randomX   = tileX + randomPos % 3;
                int randomY   = tileY + randomPos / 3;

                LogicTile tile = level.GetTileMap().GetTile(randomX, randomY);

                if (tile != null)
                {
                    if (tile.GetPassableFlag() != 0)
                    {
                        if (i == 0)
                        {
                            outputX = startX;
                            outputY = startY;

                            return(true);
                        }

                        outputX = randomX << 9;
                        outputY = randomY << 9;

                        return(true);
                    }

                    for (int j = 0; j < 4; j++)
                    {
                        if (tile.IsPassablePathFinder(j & 1, j >> 1))
                        {
                            outputX = (randomX << 9) | ((j & 1) << 8);
                            outputY = (randomY << 9) + ((j >> 1) << 8);

                            return(true);
                        }
                    }
                }
            }

            outputX = 0;
            outputY = 0;

            return(false);
        }
        public static bool GetNearestValidAttackPos(LogicLevel level, int x, int y, out int outputX, out int outputY)
        {
            if ((uint)x > 0xFFFFF600)
            {
                x = 0;
            }

            if ((uint)y > 0xFFFFF600)
            {
                y = 0;
            }

            int width  = level.GetWidth();
            int height = level.GetHeight();

            if (level.IsNpcVillage())
            {
                if (x <= 0)
                {
                    x = 512;
                }

                if (y <= 0)
                {
                    y = 512;
                }

                if (x - 2048 > width || y - 2048 > height)
                {
                    outputX = 0;
                    outputY = 0;

                    return(false);
                }

                width  -= 512;
                height -= 512;
            }

            int startX = x;
            int startY = y;

            if (x < width + 2560)
            {
                startX = x <= width ? x : width;
            }

            if (y < height + 2560)
            {
                startY = y <= height ? y : height;
            }

            int tileX = startX / 512 - 1;
            int tileY = startY / 512 - 1;

            for (int i = 0; i < 9; i++)
            {
                int randomPos = (i + 4) % 9;
                int randomX   = tileX + randomPos % 3;
                int randomY   = tileY + randomPos / 3;

                LogicTile tile = level.GetTileMap().GetTile(randomX, randomY);

                if (tile != null && level.GetTileMap().IsValidAttackPos(randomX, randomY))
                {
                    if (tile.GetPassableFlag() != 0)
                    {
                        if (i == 0)
                        {
                            outputX = startX;
                            outputY = startY;

                            return(true);
                        }

                        outputX = randomX << 9;
                        outputY = randomY << 9;

                        return(true);
                    }

                    for (int j = 0; j < 4; j++)
                    {
                        if (tile.IsPassablePathFinder(j & 1, j >> 1))
                        {
                            outputX = (randomX << 9) | ((j & 1) << 8);
                            outputY = (randomY << 9) + ((j >> 1) << 8);

                            return(true);
                        }
                    }
                }
            }

            outputX = 0;
            outputY = 0;

            return(false);
        }