public List <GameEnums.RoadShapeType> PossibleShapeType(RoadTileConfiguration newRoadTilesConfig)
    {
        List <GameEnums.RoadShapeType> allPossibleShapeTypesForNewTile = new List <GameEnums.RoadShapeType>(System.Enum.GetNames(typeof(GameEnums.RoadShapeType)).Length);

        if (newRoadTilesConfig.propsType == GameEnums.RoadPropsType.FromDesertToTown || newRoadTilesConfig.propsType == GameEnums.RoadPropsType.FromTownToDesert)
        {
            allPossibleShapeTypesForNewTile.Add(GameEnums.RoadShapeType.Start);
        }
        else
        {
            switch (newRoadTilesConfig.shapeType)
            {
            case GameEnums.RoadShapeType.Start:
                allPossibleShapeTypesForNewTile.Add(GameEnums.RoadShapeType.Middle);
                break;

            case GameEnums.RoadShapeType.Middle:
                allPossibleShapeTypesForNewTile.Add(GameEnums.RoadShapeType.Middle);
                allPossibleShapeTypesForNewTile.Add(GameEnums.RoadShapeType.End);
                break;

            case GameEnums.RoadShapeType.End:
                allPossibleShapeTypesForNewTile.Add(GameEnums.RoadShapeType.Start);
                break;
            }
        }

        if (allPossibleShapeTypesForNewTile.Count == 0)
        {
            throw new System.Exception("Cannot return ShapeType");
        }
        Debug.Log($"<color=blue> {allPossibleShapeTypesForNewTile} was returned with count {allPossibleShapeTypesForNewTile.Count} </color>");

        return(allPossibleShapeTypesForNewTile);
    }
    public List <GameEnums.RoadAsphaltType> PossibleAsphaltTypes(RoadTileConfiguration newRoadTilesConfig)
    {
        List <GameEnums.RoadAsphaltType> allPossibleAsphaltTypesForNewTile = new List <GameEnums.RoadAsphaltType>(System.Enum.GetNames(typeof(GameEnums.RoadAsphaltType)).Length);

        if (newRoadTilesConfig.propsType == GameEnums.RoadPropsType.FromDesertToTown || newRoadTilesConfig.propsType == GameEnums.RoadPropsType.FromTownToDesert)
        {
            int typeCounter = 0;
            for (int i = 0; i < System.Enum.GetNames(typeof(GameEnums.RoadAsphaltType)).Length; i++)
            {
                GameEnums.RoadAsphaltType asphType = (GameEnums.RoadAsphaltType)typeCounter;
                allPossibleAsphaltTypesForNewTile.Add(asphType);
                typeCounter++;
            }
        }
        else
        {
            switch (newRoadTilesConfig.shapeType)
            {
            case GameEnums.RoadShapeType.Start:
                allPossibleAsphaltTypesForNewTile.Add(newRoadTilesConfig.asphaltType);
                break;

            case GameEnums.RoadShapeType.Middle:
                allPossibleAsphaltTypesForNewTile.Add(newRoadTilesConfig.asphaltType);
                break;

            case GameEnums.RoadShapeType.End:
                int typeCounter = 0;
                for (int i = 0; i < System.Enum.GetNames(typeof(GameEnums.RoadAsphaltType)).Length; i++)
                {
                    GameEnums.RoadAsphaltType asphType = (GameEnums.RoadAsphaltType)typeCounter;
                    allPossibleAsphaltTypesForNewTile.Add(asphType);
                    typeCounter++;
                }
                break;
            }
            if (allPossibleAsphaltTypesForNewTile.Count == 0)
            {
                throw new System.Exception("Cannot return AsphaltType");
            }
            Debug.Log($"<color=blue> {allPossibleAsphaltTypesForNewTile} was returned with count {allPossibleAsphaltTypesForNewTile.Count} </color>");
        }
        return(allPossibleAsphaltTypesForNewTile);
    }
    public void SetUpCapabilities(RoadTileConfiguration newRoadTileConfiguration)
    {
        Debug.Log("<color=green> Started seting up possibilities </color>");

        if (!allInGameAvailableRoadConfigs.Contains(newRoadTileConfiguration))
        {
            allInGameAvailableRoadConfigs.Add(newRoadTileConfiguration);
        }

        List <RoadTileConfiguration> possibleConfigsForNewRoad = PossibleRoadConfigsFor(newRoadTileConfiguration);

        for (int i = 0; i < allInGameAvailableRoadConfigs.Count; i++)
        {
            for (int j = 0; j < possibleConfigsForNewRoad.Count; j++)
            {
                RoadTileConfiguration concreteConfigFromAllAvailable = allInGameAvailableRoadConfigs[i];
                RoadTileConfiguration concreteConfigFromAllPossible  = possibleConfigsForNewRoad[j];

                if (concreteConfigFromAllAvailable.asphaltType == concreteConfigFromAllPossible.asphaltType && concreteConfigFromAllAvailable.propsType == concreteConfigFromAllPossible.propsType && concreteConfigFromAllAvailable.shapeType == concreteConfigFromAllPossible.shapeType)
                {
                    PossibleTile possibleTile = new PossibleTile();
                    possibleTile.TileName   = concreteConfigFromAllAvailable.tileName;
                    possibleTile.TileWeight = 0;
                    if (!currentAvailablePossibleTileNames.Contains(possibleTile.TileName))
                    {
                        Debug.Log($"Here was added a new possible tile with name {concreteConfigFromAllAvailable.tileName}");

                        currentAvailablePossibleTileNames.Add(possibleTile.TileName);
                        PossibleTilesForThis.Add(possibleTile);
                    }
                }
            }
        }

        SetUpWeights();

        Debug.Log("<color=red> Stopped seting up possibilities </color>");
    }
    public List <RoadTileConfiguration> PossibleRoadConfigsFor(RoadTileConfiguration newRoadTile)
    {
        List <RoadTileConfiguration>     possibleConfigsForNewRoad      = new List <RoadTileConfiguration>(100);
        List <GameEnums.RoadAsphaltType> possibleAsphaltTypesForNewRoad = PossibleAsphaltTypes(newRoadTile);
        List <GameEnums.RoadPropsType>   possiblePropsTypesForNewRoad   = PossiblePropsType(newRoadTile);
        List <GameEnums.RoadShapeType>   possibleShapeTypesForNewRoad   = PossibleShapeType(newRoadTile);

        for (int asphaltTypeCounter = 0; asphaltTypeCounter < possibleAsphaltTypesForNewRoad.Count; asphaltTypeCounter++)
        {
            for (int propsTypeCounter = 0; propsTypeCounter < possiblePropsTypesForNewRoad.Count; propsTypeCounter++)
            {
                for (int shapeTypesCounter = 0; shapeTypesCounter < possibleShapeTypesForNewRoad.Count; shapeTypesCounter++)
                {
                    RoadTileConfiguration possibleConfig = new RoadTileConfiguration();
                    possibleConfig.asphaltType = possibleAsphaltTypesForNewRoad[asphaltTypeCounter];
                    possibleConfig.propsType   = possiblePropsTypesForNewRoad[propsTypeCounter];
                    possibleConfig.shapeType   = possibleShapeTypesForNewRoad[shapeTypesCounter];
                    possibleConfigsForNewRoad.Add(possibleConfig);
                }
            }
        }

        return(possibleConfigsForNewRoad);
    }