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