/// <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)); }