protected virtual void LayoutNodes(DungeonNode level, List <DungeonNode> mazeNodes)
        {
            this.mazeNodes = mazeNodes;
            var info = new AppendNodeInfo(mazeNodes[0]);

            info.side = EntranceSide.Right;

            float        chanceForLevelTurn = 0.5f;
            EntranceSide?prevEntranceSide   = null;
            var          secretRoomIndex    = mazeNodes.FindIndex(i => i.Secret);

            for (int currentNodeIndex = 0; currentNodeIndex < mazeNodes.Count; currentNodeIndex++)
            {
                appendNodeInfos.Add(mazeNodes[currentNodeIndex], info);

                var currentNode = mazeNodes[currentNodeIndex];
                currentNode.Reveal(options.RevealAllNodes, true);
                if (!currentNode.Secret)
                {
                    lastNonSecretNode = currentNode;
                }


                bool           shallBreak = currentNodeIndex == mazeNodes.Count - 1;
                AppendNodeInfo infoNext   = new AppendNodeInfo();

                if (!shallBreak)
                {
                    infoNext = CalcNextValues(info, chanceForLevelTurn, currentNodeIndex);

                    if (currentNodeIndex < mazeNodes.Count - 1 && generateLayoutDoors)
                    {
                        var nextMaze   = mazeNodes[currentNodeIndex + 1];
                        var secretRoom = currentNodeIndex == 0 ? currentNode.Secret : nextMaze.Secret;
                        if (!secretRoom)
                        {
                            secretRoom = nextMaze.Secret;
                        }

                        //this call must be done before AppendMaze because AppendMaze changes tiles x,y
                        List <Tiles.IDoor> doors = null;
                        if (!currentNode.Secret || currentNode.NodeIndex == 0)
                        {
                            doors = currentNode.GenerateLayoutDoors(infoNext.side, nextMaze.NodeIndex, secretRoom);
                        }
                        if (currentNode.Secret)
                        {
                            if (currentNode.NodeIndex == 0)
                            {
                                (doors[0]).CustomDungeonNodeIndex = 1;//to make them revealed ?
                            }
                        }

                        if (nextMaze.Secret && mazeNodes.Count > currentNodeIndex + 2)
                        {
                            doors = currentNode.GenerateLayoutDoors(infoNext.side == EntranceSide.Bottom ? EntranceSide.Right : EntranceSide.Bottom, nextMaze.NodeIndex, false, true);
                        }
                    }
                }

                EntranceSide?entranceSideToSkip = null;
                if (secretRoomIndex == 0 && currentNodeIndex == 1)
                {
                    entranceSideToSkip = null;
                }
                else
                {
                    entranceSideToSkip = null;
                    if (currentNodeIndex > 0)
                    {
                        entranceSideToSkip = info.side == EntranceSide.Bottom ? EntranceSide.Top : EntranceSide.Left;
                    }
                }

                level.AppendMaze
                (
                    currentNode,
                    info.Position,
                    null,
                    false,
                    entranceSideToSkip,
                    currentNodeIndex > 0 ? mazeNodes[currentNodeIndex - 1] : null
                );

                if (shallBreak)
                {
                    break;
                }
                entranceSideToSkip = null;
                prevEntranceSide   = infoNext.side;
                info = infoNext;
            }
        }
        protected virtual void LayoutNodes(DungeonNode level, List <DungeonNode> mazeNodes)
        {
            this.mazeNodes = mazeNodes;
            var d     = new DungeonGenerator(container);
            var infoC = new GenerationInfo();

            infoC.NumberOfRooms = 1;
            var numberOfNodes = mazeNodes.Count;

            for (int i = 0; i < numberOfNodes; i++)
            {
                mazeNodes[i].Placement = (RoomPlacement)(i);
                mazeNodes[i].GenerateDoors((RoomPlacement)(i));
            }

            var conn = new DungeonNodeConnector(); //generating normal rooms

            level.AppendMaze(mazeNodes[0], new Point(0, 0));
            var numberOfNormalRooms = numberOfNodes;

            if (numberOfNormalRooms == 4)
            {
                numberOfNormalRooms++;
            }
            var nodesCopy = mazeNodes.ToList();

            for (int i = 0; i < nodesCopy.Count - 1; i++)
            {
                var n = i + 1;
                if (i + 1 == 5)
                {
                    n = 0;
                }
                var corridor = conn.ConnectNodes(nodesCopy, nodesCopy[i], nodesCopy[n], d);
                mazeNodes.Add(corridor);
                if (!nodesCopy[i].Appened)
                {
                    level.AppendMaze(nodesCopy[i], conn.Node1Position);
                    nodesCopy[i].Appened = true;
                }
                if (!nodesCopy[n].Appened)
                {
                    level.AppendMaze(nodesCopy[n], conn.Node2Position);
                    nodesCopy[n].Appened = true;
                }
                corridor.GenerateDoors(conn.placement);
                level.AppendMaze(corridor, conn.CorridorPosition);
            }

            if (numberOfNodes > 4)
            {
                level.AppendMaze(mazeNodes[4], new Point(DungeonNodeConnector.centralRoomPosition, DungeonNodeConnector.centralRoomPosition));
                for (int i = 5; i < 9; i++) //generatig central room
                {
                    mazeNodes.Add(conn.ConnectNodes(mazeNodes, mazeNodes[i], mazeNodes[4], d));
                    mazeNodes[mazeNodes.Count - 1].GenerateDoors(mazeNodes[mazeNodes.Count - 1].Placement);
                    level.AppendMaze(mazeNodes[mazeNodes.Count - 1], conn.CorridorPosition);
                }
            }
            mazeNodes.ForEach(p => p.Reveal(options.RevealAllNodes, true));
        }