Example #1
0
        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
            {
                Room rm;
                if (targetDepth == depth)
                {
                    rm = _template.CreateTarget(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)
                {
                    targetPlaced = true;
                }
                else
                {
                    targetPlaced = 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);
        }