/// <summary>
        /// Generate the dungeon graph and layout
        /// </summary>
        /// <param name="totalTrials">number of trials used if any of the graph or map generation fails</param>
        /// <param name="graphTrials">number of trials to generate graph before consider it a fail</param>
        /// <param name="mapTrials">number of trials to generate the layout before consider it a fail</param>
        /// <returns>the generated graph and layout</returns>
        public static DungeonResult GenerateDungeon(int totalTrials  = 100, int graphTrials = 100, int mapTrials      = 100,
                                                    int recipeLength = 1, Random randomGen  = null, string recipeName = "graphRecipe")
        {
            Graph resultGraph = null;

            LayoutGrammar.Map resultMap = null;

            for (int i = 0; i < totalTrials; i++)
            {
                var       grammarPath = "FloorGeneration/";
                Generator mg          = CreateGenerator(grammarPath, randomGen);
                for (int j = 0; j < graphTrials; j++)
                {
                    TextAsset graphStartAsset  = Resources.Load <TextAsset>(grammarPath + "graphStart");
                    TextAsset graphRecipeAsset = Resources.Load <TextAsset>(grammarPath + recipeName);
                    const int numNodes         = 4;
                    resultGraph = mg.GenerateDungeonFromString(graphStartAsset.text, graphRecipeAsset.text, numNodes,
                                                               recipeLength);

                    if (resultGraph != null && Helper.CheckIsSolvable(resultGraph, resultGraph.nodes[0]))
                    {
                        break;
                    }

                    resultGraph = null;
                }

                if (resultGraph == null)
                {
                    continue;
                }

                LayoutGrammar.Generator lg = new LayoutGrammar.Generator(randomGen);
                for (int j = 0; j < mapTrials; j++)
                {
                    resultMap = lg.GenerateDungeon(resultGraph);
                    if (resultMap != null && Helper.CheckIsSolvable(resultMap.Get2DMap(), resultMap.GetCell(0)))
                    {
                        break;
                    }

                    resultMap = null;
                }

                if (resultMap == null)
                {
                    continue;
                }

                break;
            }

            return(new DungeonResult(resultGraph, resultMap));
        }
        /// <summary>
        /// Generate the dungeon graph and layout
        /// </summary>
        /// <param name="totalTrials">number of trials used if any of the graph or map generation fails</param>
        /// <param name="graphTrials">number of trials to generate graph before consider it a fail</param>
        /// <param name="mapTrials">number of trials to generate the layout before consider it a fail</param>
        /// <returns>the generated graph and layout</returns>
        static DungeonResult generateDungeon(int totalTrials = 100, int graphTrials = 100, int mapTrials = 100)
        {
            MissionGraph.Graph resultGraph = null;
            LayoutGrammar.Map  resultMap   = null;

            for (int i = 0; i < totalTrials; i++)
            {
                MissionGraph.Generator mg = new MissionGraph.Generator(new Random());
                mg.loadPatterns("grammar/");
                for (int j = 0; j < graphTrials; j++)
                {
                    resultGraph = mg.GenerateDungeon("graphStart.txt", "graphRecipe.txt");
                    if (resultGraph != null && Helper.checkIsSolvable(resultGraph, resultGraph.nodes[0]))
                    {
                        break;
                    }
                    else
                    {
                        resultGraph = null;
                    }
                }
                if (resultGraph == null)
                {
                    continue;
                }

                LayoutGrammar.Generator lg = new LayoutGrammar.Generator(new Random());
                for (int j = 0; j < mapTrials; j++)
                {
                    resultMap = lg.generateDungeon(resultGraph);
                    if (resultMap != null && Helper.checkIsSolvable(resultMap.get2DMap(), resultMap.getCell(0)))
                    {
                        break;
                    }
                    else
                    {
                        resultMap = null;
                    }
                }
                if (resultMap == null)
                {
                    continue;
                }
                break;
            }
            return(new DungeonResult(resultGraph, resultMap));
        }