protected RandBinomial(RandBinomial other) { this.Offset = other.Offset; this.Trials = other.Trials; this.Percent = other.Percent; }
public override void ApplyToPath(IRandom rand, GridPlan floorPlan) { List <LocRay4> endBranches = new List <LocRay4>(); for (int ii = 0; ii < floorPlan.RoomCount; ii++) { GridRoomPlan roomPlan = floorPlan.GetRoomPlan(ii); if (roomPlan.Bounds.Size == new Loc(1)) { List <int> adjacents = floorPlan.GetAdjacentRooms(ii); if (adjacents.Count == 1) { endBranches.Add(new LocRay4(roomPlan.Bounds.Start)); } } } List <List <LocRay4> > candBranchPoints = new List <List <LocRay4> >(); for (int nn = 0; nn < endBranches.Count; nn++) { LocRay4 chosenBranch = endBranches[nn]; while (chosenBranch.Loc != new Loc(-1)) { List <LocRay4> connectors = new List <LocRay4>(); List <LocRay4> candBonds = new List <LocRay4>(); foreach (Dir4 dir in DirExt.VALID_DIR4) { if (dir != chosenBranch.Dir) { if (floorPlan.GetHall(new LocRay4(chosenBranch.Loc, dir)) != null) { connectors.Add(new LocRay4(chosenBranch.Loc, dir)); } else { Loc loc = chosenBranch.Loc + dir.GetLoc(); if (Collision.InBounds(floorPlan.GridWidth, floorPlan.GridHeight, loc) && floorPlan.GetRoomIndex(loc) > -1) { candBonds.Add(new LocRay4(chosenBranch.Loc, dir)); } } } } if (connectors.Count == 1) { if (candBonds.Count > 0) { candBranchPoints.Add(candBonds); chosenBranch = new LocRay4(new Loc(-1)); } else { chosenBranch = new LocRay4(connectors[0].Traverse(1), connectors[0].Dir.Reverse()); } } else { chosenBranch = new LocRay4(new Loc(-1)); } } } // compute a goal amount of terminals to connect // this computation ignores the fact that some terminals may be impossible var randBin = new RandBinomial(candBranchPoints.Count, this.ConnectPercent); int connectionsLeft = randBin.Pick(rand); while (candBranchPoints.Count > 0 && connectionsLeft > 0) { // choose random point to connect int randIndex = rand.Next(candBranchPoints.Count); List <LocRay4> candBonds = candBranchPoints[randIndex]; LocRay4 chosenDir = candBonds[rand.Next(candBonds.Count)]; // connect floorPlan.SetHall(chosenDir, this.GenericHalls.Pick(rand)); candBranchPoints.RemoveAt(randIndex); GenContextDebug.DebugProgress("Connected Branch"); connectionsLeft--; // check to see if connection destination was also a candidate, // counting this as a double if so for (int ii = candBranchPoints.Count - 1; ii >= 0; ii--) { if (candBranchPoints[ii][0].Loc == chosenDir.Traverse(1)) { candBranchPoints.RemoveAt(ii); connectionsLeft--; } } } }
public override void ApplyToPath(IRandom rand, FloorPlan floorPlan) { List <List <RoomHallIndex> > candBranchPoints = GetBranchArms(floorPlan); // remove the rooms that do not pass filter for (int xx = 0; xx < candBranchPoints.Count; xx++) { for (int yy = candBranchPoints[xx].Count - 1; yy >= 0; yy--) { IFloorRoomPlan plan = floorPlan.GetRoomHall(candBranchPoints[xx][yy]); if (!BaseRoomFilter.PassesAllFilters(plan, this.Filters)) { candBranchPoints[xx].RemoveAt(yy); } } } // compute a goal amount of branches to connect // this computation ignores the fact that some terminals may be impossible var randBin = new RandBinomial(candBranchPoints.Count, this.ConnectPercent); int connectionsLeft = randBin.Pick(rand); while (candBranchPoints.Count > 0 && connectionsLeft > 0) { // choose random point to connect from int randIndex = rand.Next(candBranchPoints.Count); var chosenDestResult = ChooseConnection(rand, floorPlan, candBranchPoints[randIndex]); if (chosenDestResult is ListPathTraversalNode chosenDest) { // connect PermissiveRoomGen <T> hall = (PermissiveRoomGen <T>) this.GenericHalls.Pick(rand).Copy(); hall.PrepareSize(rand, chosenDest.Connector.Size); hall.SetLoc(chosenDest.Connector.Start); floorPlan.AddHall(hall, this.Components.Clone(), chosenDest.From, chosenDest.To); candBranchPoints.RemoveAt(randIndex); connectionsLeft--; GenContextDebug.DebugProgress("Added Connection"); // check to see if connection destination was also a candidate, // counting this as a double if so for (int ii = candBranchPoints.Count - 1; ii >= 0; ii--) { for (int jj = 0; jj < candBranchPoints[ii].Count; jj++) { if (candBranchPoints[ii][jj] == chosenDest.To) { candBranchPoints.RemoveAt(ii); connectionsLeft--; break; } } } } else { // remove the list anyway, but don't call it a success candBranchPoints.RemoveAt(randIndex); } } }