public void CreateBlueprint(IEnumerable <Thing> things) { // get edges of blueprint area // (might be bigger than selected region, but never smaller). var cells = things.SelectMany(thing => thing.OccupiedRect().Cells); var left = cells.Min(cell => cell.x); var top = cells.Max(cell => cell.z); var right = cells.Max(cell => cell.x); var bottom = cells.Min(cell => cell.z); // total size ( +1 because x = 2 ... x = 4 => 4 - 2 + 1 cells ) var size = new IntVec2(right - left + 1, top - bottom + 1); // fetch origin for default (North) orientation var origin = Resources.CenterPosition(new IntVec3(left, 0, bottom), size, Rot4.North); // create list of buildables var buildables = new List <BuildableInfo>(); foreach (var thing in things) { buildables.Add(new BuildableInfo(thing, origin)); } // add to controller - controller handles adding to designations var blueprint = new Blueprint(buildables, size, "Selection"); BlueprintController.Add(blueprint); blueprint.Debug(); }
public override void DesignateMultiCell(IEnumerable <IntVec3> cells) { // bail out if empty if (cells == null || cells.Count() == 0) { Messages.Message("Fluffy.Blueprints.CannotCreateBluePrint_NothingSelected".Translate(), MessageTypeDefOf.RejectInput); return; } // get list of buildings in the cells, note that this includes frames and blueprints, and so _may include floors!_ var things = new List <Thing>(cells.SelectMany(cell => cell.GetThingList(Map) .Where(thing => thing.IsValidBlueprintThing())) .Distinct()); // get list of creatable terrains var terrains = new List <Pair <TerrainDef, IntVec3> >(); terrains.AddRange(cells.Select(cell => new Pair <TerrainDef, IntVec3>(cell.GetTerrain(Map), cell)) .Where(p => p.First.IsValidBlueprintTerrain())); // get edges of blueprint area // (might be bigger than selected region, but never smaller). var allCells = cells.Concat(things.SelectMany(thing => thing.OccupiedRect().Cells)); var left = allCells.Min(cell => cell.x); var top = allCells.Max(cell => cell.z); var right = allCells.Max(cell => cell.x); var bottom = allCells.Min(cell => cell.z); // total size ( +1 because x = 2 ... x = 4 => 4 - 2 + 1 cells ) var size = new IntVec2(right - left + 1, top - bottom + 1); // fetch origin for default (North) orientation var origin = Resources.CenterPosition(new IntVec3(left, 0, bottom), size, Rot4.North); // create list of buildables var buildables = new List <BuildableInfo>(); foreach (var thing in things) { buildables.Add(new BuildableInfo(thing, origin)); } foreach (var terrain in terrains) { buildables.Add(new BuildableInfo(terrain.First, terrain.Second, origin)); } // try to get a decent default name: get rooms for occupied cells, then see if there is only one type. var rooms = allCells.Select(c => c.GetRoom(Map)) .Where(r => r != null && r.Role != RoomRoleDefOf.None) .Distinct() .GroupBy(r => r.Role.LabelCap); #if DEBUG foreach (var room in rooms) { Debug.Message($"{room.Count()}x {room.Key}"); } #endif // only one type of room string defaultName = null; if (rooms.Count() == 1) { var room = rooms.First(); defaultName = room.Count() > 1 ? "Fluffy.Blueprints.Plural".Translate(room.Key) : room.Key; } // add to controller - controller handles adding to designations var blueprint = new Blueprint(buildables, size, defaultName); BlueprintController.Add(blueprint); blueprint.Debug(); }