bool GenerateSpecialInternal(Room prev, int depth, int targetDepth) { var connPtNum = GetMaxConnectionPoints(prev); var seq = Enumerable.Range(0, connPtNum).ToList(); _rand.Shuffle(seq); bool specialPlaced; do { Room rm; if (targetDepth == depth) { rm = _template.CreateSpecial(depth, prev); } else { rm = _template.CreateNormal(depth, prev); } Link?link = null; foreach (var connPt in seq) { if ((link = PlaceRoom(prev, rm, connPt)) != null) { seq.Remove(connPt); break; } } if (link == null) { return(false); } if (targetDepth == depth) { specialPlaced = true; } else { specialPlaced = GenerateSpecialInternal(rm, depth + 1, targetDepth); } if (specialPlaced) { rm.Depth = depth; Edge.Link(prev, rm, link.Value); _rooms.Add(rm); } else { _collision.Remove(rm); } } while (!specialPlaced); return(true); }
private bool GenerateTargetInternal(Room prev, int depth, int targetDepth) { var connPtNum = GetMaxConnectionPoints(prev); var seq = Enumerable.Range(0, connPtNum).ToList(); rand.Shuffle(seq); bool targetPlaced; do { var rm = targetDepth == depth?template.CreateTarget(depth, prev) : template.CreateNormal(depth, prev); Link?link = null; foreach (var connPt in seq.Where(connPt => (link = PlaceRoom(prev, rm, connPt)) != null)) { seq.Remove(connPt); break; } if (link == null) { return(false); } targetPlaced = targetDepth == depth || GenerateTargetInternal(rm, depth + 1, targetDepth); if (targetPlaced) { rm.Depth = depth; Edge.Link(prev, rm, link.Value); rooms.Add(rm); } else { collision.Remove(rm); } } while (!targetPlaced); return(true); }
bool GenerateBranchInternal(Room prev, int depth, int maxDepth, bool doBranch) { if (depth >= maxDepth) { return(false); } var connPtNum = GetMaxConnectionPoints(prev); var seq = Enumerable.Range(0, connPtNum).ToList(); _rand.Shuffle(seq); if (doBranch) { var numBranch = prev.NumBranches.Random(_rand); numBranch -= prev.Edges.Count; for (int i = 0; i < numBranch; i++) { var rm = _template.CreateNormal(depth, prev); Link?link = null; foreach (var connPt in seq) { if ((link = PlaceRoom(prev, rm, connPt)) != null) { seq.Remove(connPt); break; } } if (link == null) { return(false); } Edge.Link(prev, rm, link.Value); if (!GenerateBranchInternal(rm, depth + 1, maxDepth, false)) { _collision.Remove(rm); Edge.UnLink(prev, rm); return(false); } rm.Depth = depth; _rooms.Add(rm); } } else { while (prev.Edges.Count < prev.NumBranches.Begin) { var rm = _template.CreateNormal(depth, prev); Link?link = null; foreach (var connPt in seq) { if ((link = PlaceRoom(prev, rm, connPt)) != null) { seq.Remove(connPt); break; } } if (link == null) { return(false); } Edge.Link(prev, rm, link.Value); if (!GenerateBranchInternal(rm, depth + 1, maxDepth, false)) { _collision.Remove(rm); Edge.UnLink(prev, rm); return(false); } rm.Depth = depth; _rooms.Add(rm); } } return(true); }