public bool CheckIfObjectCanBeMoved(IPlacedObject selectedObject, Vector2 position)
    {
        ILevelTile levelTile = GetLevelTile(position);

        if (levelTile.IsTraversable())
        {
            return(true);
        }
        return(false);
    }
    public ISet <ILevelTile> GetConnectedNavPoints(ILevelTile tile)
    {
        ISet <ILevelTile> ret           = new HashSet <ILevelTile>();
        LevelController   lvlController = LevelController.instance;

        if (lvlController == null)
        {
            Debug.LogError("No active LevelController. Cannot provide navigation graph!");
            return(ret);
        }

        // Orthogonal connected points
        ILevelTile upper      = lvlController.GetTileAtWorldPos(new Vector2(tile.Pos.x, tile.Pos.y + TILE_SIZE));
        bool       upperValid = upper != null && upper.IsTraversable();

        if (upperValid)
        {
            ret.Add(upper);
        }

        ILevelTile right      = lvlController.GetTileAtWorldPos(new Vector2(tile.Pos.x + TILE_SIZE, tile.Pos.y));
        bool       rightValid = right != null && right.IsTraversable();

        if (rightValid)
        {
            ret.Add(right);
        }

        ILevelTile lower      = lvlController.GetTileAtWorldPos(new Vector2(tile.Pos.x, tile.Pos.y - TILE_SIZE));
        bool       lowerValid = lower != null && lower.IsTraversable();

        if (lowerValid)
        {
            ret.Add(lower);
        }

        ILevelTile left      = lvlController.GetTileAtWorldPos(new Vector2(tile.Pos.x - TILE_SIZE, tile.Pos.y));
        bool       leftValid = left != null && left.IsTraversable();

        if (leftValid)
        {
            ret.Add(left);
        }

        // Diagonal connected points
        ret.UnionWith(GetDiagonalConnectedPoints(tile, lvlController, upperValid, rightValid, lowerValid, leftValid));

        return(ret);
    }
    private ISet <ILevelTile> GetDiagonalConnectedPoints(ILevelTile tile, LevelController lvlController, bool upperValid, bool rightValid, bool lowerValid, bool leftValid)
    {
        ISet <ILevelTile> ret = new HashSet <ILevelTile>();

        if (upperValid && rightValid)
        {
            ILevelTile upperRight = lvlController.GetTileAtWorldPos(new Vector2(tile.Pos.x + TILE_SIZE, tile.Pos.y + TILE_SIZE));
            if (upperRight != null && upperRight.IsTraversable())
            {
                ret.Add(upperRight);
            }
        }

        if (rightValid && lowerValid)
        {
            ILevelTile lowerRight = lvlController.GetTileAtWorldPos(new Vector2(tile.Pos.x + TILE_SIZE, tile.Pos.y - TILE_SIZE));
            if (lowerRight != null && lowerRight.IsTraversable())
            {
                ret.Add(lowerRight);
            }
        }

        if (upperValid && leftValid)
        {
            ILevelTile upperLeft = lvlController.GetTileAtWorldPos(new Vector2(tile.Pos.x - TILE_SIZE, tile.Pos.y + TILE_SIZE));
            if (upperLeft != null && upperLeft.IsTraversable())
            {
                ret.Add(upperLeft);
            }
        }

        if (lowerValid && leftValid)
        {
            ILevelTile lowerLeft = lvlController.GetTileAtWorldPos(new Vector2(tile.Pos.x - TILE_SIZE, tile.Pos.y - TILE_SIZE));
            if (lowerLeft != null && lowerLeft.IsTraversable())
            {
                ret.Add(lowerLeft);
            }
        }

        return(ret);
    }