/// <summary>
    /// Creates a new Building GO and tries to place it into the Grid.
    /// Destroys Building GO if unable to and returns null, returns the newly created GO otherwise
    /// </summary>
    /// <param name="spawnWorldPos">Where to spawn the Building (Transform's Position)</param>
    /// <param name="buildingID">What type of Building</param>
    /// <param name="doCheckingGridTaken">Are any of the spots taken by another building already?</param>
    /// <returns></returns>
    BaseBuildingsClass PlaceBuildingToGrid(Vector2 spawnWorldPos, BuildingDataBase.BUILDINGS buildingID, bool doCheckingGridTaken = false)
    {
        // Check if we need to create a Custom Building GO
        BaseBuildingsClass newBuilding = null;

        if (BuildingDataBase.GetInstance().GetBuildingData(buildingID).GetOwnCustomBuildingObject())
        {
            GameObject customBuilding = BuildingDataBase.GetInstance().GetBuildingData(buildingID).GetOwnCustomBuildingObject();
            newBuilding = Instantiate(customBuilding, spawnWorldPos, Quaternion.identity).GetComponent <BaseBuildingsClass>();
        }
        else
        {
            newBuilding = Instantiate(BuildingDataBase.GetInstance().GetBaseBuildingGO(), spawnWorldPos, Quaternion.identity).GetComponent <BaseBuildingsClass>();
        }
        newBuilding.SetNewBuildingType(BuildingDataBase.GetInstance().GetBuildingData(buildingID));

        Vector3    buildingBottomLeftWorldPos = newBuilding.GetBottomLeftGridPosition();
        Vector2Int buildingSize = newBuilding.GetBuildingSizeOnMap();

        // Can we place it there?
        if (doCheckingGridTaken)
        {
            if (!CanPlaceBuildingOnMap(buildingBottomLeftWorldPos, buildingSize))
            {
                Destroy(newBuilding.gameObject);
                return(null);
            }
        }
        // Set all the grids taken by new building to true
        SetGridTakenArray(buildingBottomLeftWorldPos, buildingSize, true);
        AddBuildingIntoTrackingDictionary(newBuilding); //roads and buildings store accordingly
        newBuilding.BuildingPlaced();

        // Change Sprite Layer back to default
        newBuilding.SetSpriteObjectLayer(0);
        newBuilding.gameObject.name = BuildingDataBase.GetInstance().GetBuildingData(buildingID).GetBuildingName();
        // Set Sprite's Sorting Order
        int newOrder = (int)newBuilding.GetBottomLeftGridPosition().y;

        newOrder = -newOrder;
        newBuilding.SetSpriteSortingOrder(newOrder);

        //set the correct parent
        if (newBuilding.GetBuildingType() == BuildingDataBase.BUILDINGS.B_ROAD)
        {
            newBuilding.gameObject.transform.SetParent(m_RoadParent);
        }
        else
        {
            newBuilding.gameObject.transform.SetParent(m_BuildingParent);
        }

        return(newBuilding);
    }
    /// <summary>
    /// Tries to place a Building into the Grid from it's world Position.
    /// Returns null if Unable to, returns the newly created GO otherwise
    /// </summary>
    /// <param name="activeBuildingCom">The Building GO to place</param>
    /// <param name="doCheckingGridTaken">Are any of the spots taken by another building already?</param>
    /// <returns></returns>
    BaseBuildingsClass PlaceBuildingToGrid(ref BaseBuildingsClass activeBuildingCom, bool doCheckingGridTaken = false)
    {
        // Check if we need to create a Custom Building GO
        if (BuildingDataBase.GetInstance().GetBuildingData(activeBuildingCom.GetBuildingType()).GetOwnCustomBuildingObject())
        {
            Vector3 buildingPos = activeBuildingCom.transform.position;
            BuildingDataBase.BUILDINGS buildingID = activeBuildingCom.GetBuildingType();
            Destroy(activeBuildingCom.gameObject);
            GameObject customBuilding = BuildingDataBase.GetInstance().GetBuildingData(buildingID).GetOwnCustomBuildingObject();
            activeBuildingCom = Instantiate(customBuilding, buildingPos, Quaternion.identity).GetComponent <BaseBuildingsClass>();
            activeBuildingCom.SetNewBuildingType(BuildingDataBase.GetInstance().GetBuildingData(buildingID));
        }

        Vector3    buildingBottomLeftWorldPos = activeBuildingCom.GetBottomLeftGridPosition();
        Vector2Int buildingSize = activeBuildingCom.GetBuildingSizeOnMap();

        //Debug.Log("GRID POS: " + m_GridGO.WorldToCell(buildingWorldPos));
        // Can we place it there?
        if (doCheckingGridTaken)
        {
            if (!CanPlaceBuildingOnMap(buildingBottomLeftWorldPos, buildingSize))
            {
                return(null);
            }
        }
        // Set all the grids taken by new building to true
        SetGridTakenArray(buildingBottomLeftWorldPos, buildingSize, true);
        AddBuildingIntoTrackingDictionary(activeBuildingCom); //roads and buildings store accordingly
        activeBuildingCom.BuildingPlaced();

        // Change Sprite Layer back to building layer
        activeBuildingCom.SetSpriteObjectLayer(0);
        activeBuildingCom.gameObject.name = BuildingDataBase.GetInstance().GetBuildingData(activeBuildingCom.GetBuildingType()).GetBuildingName();
        // Set Sprite's Sorting Order
        int newOrder = (int)activeBuildingCom.GetBottomLeftGridPosition().y;

        newOrder = -newOrder;
        activeBuildingCom.SetSpriteSortingOrder(newOrder);

        //set the correct parent
        if (activeBuildingCom.GetBuildingType() == BuildingDataBase.BUILDINGS.B_ROAD)
        {
            activeBuildingCom.gameObject.transform.SetParent(m_RoadParent);
        }
        else
        {
            activeBuildingCom.gameObject.transform.SetParent(m_BuildingParent);
        }

        return(activeBuildingCom);
    }
    public void PlaceMovedBuildingBackToMap()
    {
        if (!m_MovementBrushActive || m_BuildingToMove == null)
        {
            return;
        }
        Vector3    buildingBottomLeftWorldPos = m_BuildingToMove.GetBottomLeftGridPosition();
        Vector2Int buildingSize = m_BuildingToMove.GetBuildingSizeOnMap();

        // Set all the grids taken by new Position to true
        SetGridTakenArray(buildingBottomLeftWorldPos, buildingSize, true);
        // Add back into Dictionary to Track
        AddBuildingIntoTrackingDictionary(m_BuildingToMove);
    }
    //to store the loaded roads from the save file into the roadManager
    public void StoreLoadedRoads(BaseBuildingsClass roadBuilding, RoadTypeList roadType)
    {
        if (m_RoadManager == null)
        {
            return;
        }

        Vector3    buildingBottomLeftWorldPos = roadBuilding.GetBottomLeftGridPosition();
        Vector2Int buildingSize = roadBuilding.GetBuildingSizeOnMap();

        // Set all the grids taken by new building to true
        SetGridTakenArray(buildingBottomLeftWorldPos, buildingSize, true);

        Vector2Int key = (Vector2Int)m_GridGO.WorldToCell(roadBuilding.GetBottomLeftGridPosition());

        roadBuilding.BuildingPlaced();

        m_RoadManager.StoreLoadedInRoads(key, roadBuilding, roadType);
    }
    /// <summary>
    /// Removes the Building from Grid by setting it's array spots back to untaken, then returns it
    /// </summary>
    /// <param name="activeBuildingCom"></param>
    /// <returns></returns>
    GameObject RemoveBuildingFromGrid(BaseBuildingsClass activeBuildingCom)
    {
        Vector3    buildingBottomLeftWorldPos = activeBuildingCom.GetBottomLeftGridPosition();
        Vector2Int buildingSize = activeBuildingCom.GetBuildingSizeOnMap();

        // Set all the grids taken by building to false, since no longer there
        SetGridTakenArray(buildingBottomLeftWorldPos, buildingSize, false);
        RemoveBuildingFromTrackingDictionary(activeBuildingCom);

        return(activeBuildingCom.gameObject);
    }
    /// <summary>
    /// Removes a building from the tracking Dictionary
    /// </summary>
    /// <param name="activeBuildingCom"></param>
    void RemoveBuildingFromTrackingDictionary(BaseBuildingsClass activeBuildingCom)
    {
        Vector2Int key = (Vector2Int)m_GridGO.WorldToCell(activeBuildingCom.GetBottomLeftGridPosition());

        if (m_DictOfBuildingsOnMap.ContainsKey(key)) //if have remove
        {
            m_DictOfBuildingsOnMap.Remove(key);
            return;
        }

        //check roads instead if its not in building map
        m_RoadManager.RemoveRoads(key);
    }
    /// <summary>
    /// Adds a building into the tracking Dictionary
    /// </summary>
    /// <param name="activeBuildingCom"></param>
    void AddBuildingIntoTrackingDictionary(BaseBuildingsClass activeBuildingCom)
    {
        Vector2Int key = (Vector2Int)m_GridGO.WorldToCell(activeBuildingCom.GetBottomLeftGridPosition());

        if (m_DictOfBuildingsOnMap.ContainsKey(key))
        {
            Debug.LogError("Duplicate Key in MapManager Building Storage!!\n2 Buildings occupying same Position!");
            return;
        }

        //check if its roads or not, store accordingly
        if (activeBuildingCom.GetBuildingType() == BuildingDataBase.BUILDINGS.B_ROAD)
        {
            m_RoadManager.PlaceRoads(key, ref activeBuildingCom);
        }
        else
        {
            m_DictOfBuildingsOnMap[key] = activeBuildingCom;
        }
    }
 bool CanPlaceBuildingOnMap(BaseBuildingsClass buildingToCheck)
 {
     return(CanPlaceBuildingOnMap(buildingToCheck.GetBottomLeftGridPosition(), buildingToCheck.GetBuildingSizeOnMap()));
 }
 /// <summary>
 /// Checks if any of the spots the Template building will occupy, is already taken
 /// </summary>
 /// <returns>True if can place Template Building</returns>
 public bool CanPlaceTemplateBuilding()
 {
     return(CanPlaceBuildingOnMap(m_TemplateBuilding.GetBottomLeftGridPosition(), m_TemplateBuilding.GetBuildingSizeOnMap()));
 }