コード例 #1
0
        /// <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);
        }