public virtual void SpawnRandInCandRooms(TGenContext map, SpawnList <RoomHallIndex> spawningRooms, List <TSpawnable> spawns, int successPercent) { while (spawningRooms.Count > 0 && spawns.Count > 0) { int randIndex = spawningRooms.PickIndex(map.Rand); RoomHallIndex roomIndex = spawningRooms.GetSpawn(randIndex); // try to spawn the item if (this.SpawnInRoom(map, roomIndex, spawns[spawns.Count - 1])) { GenContextDebug.DebugProgress("Placed Object"); // remove the item spawn spawns.RemoveAt(spawns.Count - 1); if (successPercent <= 0) { spawningRooms.RemoveAt(randIndex); } else { int newRate = Math.Max(1, spawningRooms.GetSpawnRate(randIndex) * successPercent / 100); spawningRooms.SetSpawnRate(randIndex, newRate); } } else { spawningRooms.RemoveAt(randIndex); } } }
public CategorySpawnChooser(CategorySpawnChooser <T> other) { Spawns = new SpawnDict <string, SpawnList <T> >(); foreach (string key in other.Spawns.GetKeys()) { SpawnList <T> list = new SpawnList <T>(); SpawnList <T> otherList = other.Spawns.GetSpawn(key); for (int ii = 0; ii < otherList.Count; ii++) { list.Add(otherList.GetSpawn(ii), otherList.GetSpawnRate(ii)); } Spawns.Add(key, list, other.Spawns.GetSpawnRate(key)); } }
public override void ApplyToPath(IRandom rand, FloorPlan floorPlan) { // choose certain rooms in the list to be special rooms // special rooms are required; so make sure they don't overlap IRoomGen newGen = this.Rooms.Pick(rand).Copy(); Loc size = newGen.ProposeSize(rand); newGen.PrepareSize(rand, size); int factor = floorPlan.DrawRect.Area / newGen.Draw.Area; // TODO: accept smaller rooms to replace // bulldozing the surrounding rooms to get the space var room_indices = new SpawnList <RoomHallIndex>(); for (int ii = 0; ii < floorPlan.RoomCount; ii++) { FloorRoomPlan plan = floorPlan.GetRoomPlan(ii); if (!plan.Immutable && plan.RoomGen.Draw.Width >= newGen.Draw.Width && plan.RoomGen.Draw.Height >= newGen.Draw.Height) { room_indices.Add(new RoomHallIndex(ii, false), ComputeRoomChance(factor, plan.RoomGen.Draw, newGen.Draw)); } } for (int ii = 0; ii < floorPlan.HallCount; ii++) { var roomHall = new RoomHallIndex(ii, true); IFloorRoomPlan plan = floorPlan.GetRoomHall(roomHall); if (plan.RoomGen.Draw.Width >= newGen.Draw.Width && plan.RoomGen.Draw.Height >= newGen.Draw.Height) { room_indices.Add(roomHall, ComputeRoomChance(factor, plan.RoomGen.Draw, newGen.Draw)); } } while (room_indices.Count > 0) { int ind = room_indices.PickIndex(rand); RoomHallIndex oldRoomHall = room_indices.GetSpawn(ind); Dictionary <Dir4, List <RoomHallIndex> > adjacentIndicesByDir = GetDirectionAdjacents(floorPlan, oldRoomHall); var adjacentsByDir = new Dictionary <Dir4, List <IRoomGen> >(); foreach (Dir4 dir in DirExt.VALID_DIR4) { adjacentsByDir[dir] = new List <IRoomGen>(); foreach (RoomHallIndex adj in adjacentIndicesByDir[dir]) { adjacentsByDir[dir].Add(floorPlan.GetRoomHall(adj).RoomGen); } } Loc placement = this.FindPlacement(rand, adjacentsByDir, newGen, floorPlan.GetRoomHall(oldRoomHall).RoomGen); if (placement != new Loc(-1)) { newGen.SetLoc(placement); this.PlaceRoom(rand, floorPlan, newGen, oldRoomHall); GenContextDebug.DebugProgress("Set Special Room"); return; } room_indices.RemoveAt(ind); } }