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