private void GenerateExits(RoomClass.ExitClass requiredExit, int numOfExits, List <int> availableSegments, List <int> availableExits, RoomClass newRoom) { var exitIds = new List <int>(); if (requiredExit != null) { newRoom.Exits.Add(requiredExit); availableExits.Remove(requiredExit.Id); exitIds.Add(requiredExit.Id); } for (int i = 0; i < numOfExits; i++) { var exitId = availableExits[Random.Range(0, availableExits.Count)]; availableExits.Remove(exitId); exitIds.Add(exitId); } foreach (var exitId in exitIds) { if (requiredExit != null && requiredExit.Id == exitId) { continue; } newRoom.Exits.Add(new RoomClass.ExitClass() { Id = exitId, Target = new RoomClass.ExitClass.TargetClass() { ExitId = GetRandomOppositeExit(exitId), RoomId = CreateRoom().Id } }); } while (exitIds.Count > 0) { var exitId = exitIds[0]; exitIds.Remove(exitId); var exitPair = exitPairs[exitId]; var segmentId = exitToSegment[exitId]; availableSegments.Remove(segmentId); var variationIndexSelector = 0; if (exitIds.Any(x => x == exitPair)) { exitIds.Remove(exitPair); variationIndexSelector = 1; } newRoom.VariationIndex[segmentId] = exitToVariationIndex[exitId, variationIndexSelector]; } }
public void GenerateRoom(RoomClass roomToGenerate, RoomClass.ExitClass requiredExit) { if (roomToGenerate == null) { roomToGenerate = CreateRoom(); } if (roomToGenerate.Generated) { return; } List <int> availableSegments = Enumerable.Range(0, 6).ToList(); List <int> availableExits = Enumerable.Range(0, 10).ToList(); if (requiredExit != null) { availableExits.Remove(requiredExit.Id); availableSegments.Remove(exitToSegment[requiredExit.Id]); } GenerateAltarSegment(availableSegments, availableExits, roomToGenerate); var numExits = Mathf.Min(Random.Range(1, 4), availableSymbols.Count); GenerateExits(requiredExit, numExits, availableSegments, availableExits, roomToGenerate); GenerateNoExits(availableSegments, roomToGenerate); roomToGenerate.Generated = true; foreach (var exit in roomToGenerate.Exits) { var newRoom = Rooms.Find(x => x.Id == exit.Target.RoomId); GenerateRoom(newRoom, new RoomClass.ExitClass() { Id = exit.Target.ExitId, Target = new RoomClass.ExitClass.TargetClass() { ExitId = exit.Id, RoomId = roomToGenerate.Id } }); } }