Example #1
0
        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);
        }