public DungeonLevel DoLayout(List <DungeonNode> nodes, LayouterOptions opt = null) { List <DungeonNode> finalNodes = nodes; options = opt; if (options == null) { options = new LayouterOptions(); } //totals sizes var tw = finalNodes.Sum(i => i.Width); var th = finalNodes.Sum(i => i.Height); var localLevel = container.GetInstance <DungeonLevel>(); localLevel.Create(tw, th); int nextX = 0; int nextY = 0; int nodeIndex = 0; foreach (var node in finalNodes) { localLevel.AppendMaze ( node, new Point(nextX, nextY), null, false, EntranceSide.Left, nodeIndex > 0 ? finalNodes[nodeIndex - 1] : null ); nextX += node.Width; nodeIndex++; //nextY += node.Height; } // // var maxLoc = localLevel.GetMaxXY(); var max = localLevel.GetMaxXY(); var level = container.GetInstance <DungeonLevel>(); level.Create(max.Item1 + 1, max.Item2 + 1); level.AppendMaze(localLevel, new Point(0, 0), new Point(max.Item1 + 1, max.Item2 + 1)); level.DeleteWrongDoors(); return(level); }
public DungeonLevel DoLayout(List <DungeonNode> nodes, LayouterOptions opt = null) { if (nodes.Any(i => !i.Created)) { return(container.GetInstance <DungeonLevel>()); } options = opt; if (options == null) { options = new LayouterOptions(); } //totals sizes var tw = nodes.Sum(i => i.Width); var th = nodes.Sum(i => i.Height); var gi = new GenerationInfo(); gi.GenerateOuterWalls = false; gi.GenerateRandomInterior = false; gi.GenerateEmptyTiles = false; var localLevel = container.GetInstance <DungeonNode>(); localLevel.Container = this.container; //Activator.CreateInstance(typeof(T), new object[] { container }) as T; localLevel.Create(tw, th /*+ nodesPadding * nodes.Count*/, gi, -1, null, false); var maxLoc = localLevel.GetMaxXY(); if (nodes.Count > 1) { if (nodes[1].GetTiles().First().DungeonNodeIndex != nodes[1].NodeIndex) { container.GetInstance <ILogger>().LogError("nodes[1].GetTiles().First().DungeonNodeIndex != nodes[1].NodeIndex"); } } LayoutNodes(localLevel, nodes); if (localLevel.Tiles[0, 0] != null && localLevel.Tiles[0, 0].DungeonNodeIndex == DungeonNode.DefaultNodeIndex) { container.GetInstance <ILogger>().LogError("localLevel.Tiles[0, 0].DungeonNodeIndex == " + DungeonNode.DefaultNodeIndex); } var max = localLevel.GetMaxXY(); var level = container.GetInstance <DungeonLevel>(); var width = max.Item1 + 1; var height = max.Item2 + 1; level.Create(width, height); //var doors = localLevel.GetTiles<IDoor>(); //var secret = doors.Any(i => i.Secret); //if(!info.PreventSecretRoomGeneration) // Debug.Assert(secret); level.AppendMaze(localLevel, new Point(0, 0), new Point(width, height)); level.DeleteWrongDoors(); //if (secret) //{ // var secretAppended = level.GetTiles<IDoor>().Any(i => i.Secret); // Debug.Assert(secretAppended); //} level.SecretRoomIndex = -1; var sn = nodes.Where(i => i.Secret).FirstOrDefault(); if (sn != null) { level.SecretRoomIndex = sn.NodeIndex; } return(level); }