/// <summary> /// Replace a room template with a smaller one. Aligns new template with old door. /// This should only be called on dead-ends /// Enforces that replacement rooms can only override floor areas of old rooms (helping to avoid some breakage) /// </summary> public bool ReplaceRoomTemplate(int roomToReplaceIndex, Connection existingRoomConnection, RoomTemplate replacementRoom, int replaceRoomDoorIndex) { var templateToReplace = templates[roomToReplaceIndex]; if (templateToReplace.PotentialDoors.Count() > 1) { throw new ApplicationException("Can't replace rooms with >1 doors"); } var doorToConnection = GetDoorForConnection(existingRoomConnection); Tuple <TemplatePositioned, Point> replacementRoomTuple = RoomTemplateUtilities.AlignRoomOverlapping(replacementRoom, roomToReplaceIndex, templateToReplace, replaceRoomDoorIndex, doorToConnection.DoorIndexInRoom); var replacementRoomTemplate = replacementRoomTuple.Item1; //Check if the overlapping room can be placed if (!mapBuilder.CanBePlacedOverlappingOtherTemplates(replacementRoomTemplate)) { return(false); } //Blank the old room area var voidedOldRoomTemplate = RoomTemplateUtilities.TransparentTemplate(templateToReplace); mapBuilder.UnconditionallyOverridePositionedTemplate(voidedOldRoomTemplate); //Override with new template mapBuilder.OverridePositionedTemplate(replacementRoomTemplate); //Ensure that the room is replaced in the index templates[roomToReplaceIndex] = replacementRoomTemplate; //We don't change the connectivity or doors return(true); }