public static void SafeAddHall(LocRay4 locRay, GridPlan floorPlan, IPermissiveRoomGen hallGen, IRoomGen roomGen, ComponentCollection roomComponents, ComponentCollection hallComponents, bool preferHall = false) { floorPlan.SetHall(locRay, hallGen, hallComponents.Clone()); ComponentCollection collection = preferHall ? hallComponents : roomComponents; if (floorPlan.GetRoomPlan(locRay.Loc) == null) { floorPlan.AddRoom(locRay.Loc, roomGen, collection.Clone(), preferHall); } Loc dest = locRay.Traverse(1); if (floorPlan.GetRoomPlan(dest) == null) { floorPlan.AddRoom(dest, roomGen, collection.Clone(), preferHall); } }
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 void PlaceRoom(IRandom rand, FloorPlan floorPlan, IRoomGen newGen, RoomHallIndex oldRoomHall) { // first get the adjacents of the removed room Dictionary <Dir4, List <RoomHallIndex> > adjacentsByDir = GetDirectionAdjacents(floorPlan, oldRoomHall); IRoomPlan oldPlan = floorPlan.GetRoomHall(oldRoomHall); // remove the room; update the adjacents too floorPlan.EraseRoomHall(oldRoomHall); foreach (Dir4 dir in DirExt.VALID_DIR4) { for (int jj = 0; jj < adjacentsByDir[dir].Count; jj++) { RoomHallIndex adjRoomHall = adjacentsByDir[dir][jj]; if (adjRoomHall.IsHall == oldRoomHall.IsHall && adjRoomHall.Index > oldRoomHall.Index) { adjacentsByDir[dir][jj] = new RoomHallIndex(adjRoomHall.Index - 1, adjRoomHall.IsHall); } } } var newAdjacents = new List <RoomHallIndex>(); var supportHalls = new Dictionary <Dir4, IPermissiveRoomGen>(); foreach (Dir4 dir in DirExt.VALID_DIR4) { if (newGen.Draw.GetScalar(dir) == oldPlan.RoomGen.Draw.GetScalar(dir)) { newAdjacents.AddRange(adjacentsByDir[dir]); } else if (adjacentsByDir[dir].Count > 0) { Rect supportRect = GetSupportRect(floorPlan, oldPlan.RoomGen, newGen, dir, adjacentsByDir[dir]); var supportHall = (IPermissiveRoomGen)this.Halls.Pick(rand).Copy(); supportHall.PrepareSize(rand, supportRect.Size); supportHall.SetLoc(supportRect.Start); supportHalls[dir] = supportHall; } } // add the new room var newRoomInd = new RoomHallIndex(floorPlan.RoomCount, false); ComponentCollection newCollection = oldPlan.Components.Clone(); foreach (RoomComponent component in this.RoomComponents) { newCollection.Set(component.Clone()); } floorPlan.AddRoom(newGen, newCollection, newAdjacents.ToArray()); // add supporting halls foreach (Dir4 dir in DirExt.VALID_DIR4) { if (supportHalls.ContainsKey(dir)) { // include an attachment to the newly added room List <RoomHallIndex> adjToAdd = new List <RoomHallIndex> { newRoomInd }; adjToAdd.AddRange(adjacentsByDir[dir]); ComponentCollection newHallCollection = oldPlan.Components.Clone(); foreach (RoomComponent component in this.HallComponents) { newHallCollection.Set(component.Clone()); } floorPlan.AddHall(supportHalls[dir], newHallCollection.Clone(), adjToAdd.ToArray()); } } }