public static void UnsafeAddHall(LocRay4 locRay, GridPlan floorPlan, IPermissiveRoomGen hallGen, ComponentCollection components) { floorPlan.SetHall(locRay, hallGen, components.Clone()); GenContextDebug.DebugProgress("Hall"); if (floorPlan.GetRoomPlan(locRay.Loc) == null || floorPlan.GetRoomPlan(locRay.Traverse(1)) == null) { floorPlan.Clear(); throw new InvalidOperationException("Can't create a hall without rooms to connect!"); } }
public virtual void CreateErrorPath(IRandom rand, GridPlan floorPlan) { floorPlan.Clear(); floorPlan.AddRoom(new Loc(0, 0), this.GetDefaultGen()); }
public override void ApplyToPath(IRandom rand, GridPlan floorPlan) { for (int ii = 0; ii < 10; ii++) { // always clear before trying floorPlan.Clear(); int roomsToOpen = floorPlan.GridWidth * floorPlan.GridHeight * this.RoomRatio.Pick(rand) / 100; if (roomsToOpen < 1) { roomsToOpen = 1; } int addBranch = this.BranchRatio.Pick(rand); int roomsLeft = roomsToOpen; Loc sourceRoom = new Loc(rand.Next(floorPlan.GridWidth), rand.Next(floorPlan.GridHeight)); // randomly determine start room floorPlan.AddRoom(sourceRoom, this.GenericRooms.Pick(rand)); GenContextDebug.DebugProgress("Start Room"); roomsLeft--; int pendingBranch = 0; while (roomsLeft > 0) { bool terminalSuccess = this.ExpandPath(rand, floorPlan, false); bool branchSuccess = false; if (terminalSuccess) { roomsLeft--; if (floorPlan.RoomCount > 2) { pendingBranch += addBranch; } } else if (this.NoForcedBranches) { break; } else { pendingBranch = 100; } while (pendingBranch >= 100 && roomsLeft > 0) { branchSuccess = this.ExpandPath(rand, floorPlan, true); if (!branchSuccess) { break; } pendingBranch -= 100; roomsLeft--; } if (!terminalSuccess && !branchSuccess) { break; } } if (roomsLeft <= 0) { break; } } }