public DungeonGeneratorConfiguration <TNode> SmartClone()
 {
     return(new DungeonGeneratorConfiguration <TNode>()
     {
         RoomsCanTouch = RoomsCanTouch,
         EarlyStopIfIterationsExceeded = EarlyStopIfIterationsExceeded,
         EarlyStopIfTimeExceeded = EarlyStopIfTimeExceeded,
         RepeatModeOverride = RepeatModeOverride,
         ThrowIfRepeatModeNotSatisfied = ThrowIfRepeatModeNotSatisfied,
         ChainDecompositionConfiguration = ChainDecompositionConfiguration.SmartClone(),
         Chains = Chains?.Select(x => new Chain <TNode>(x.Nodes.ToList(), x.Number)).ToList(),
         SimulatedAnnealingConfiguration = SimulatedAnnealingConfiguration.SmartClone(),
         SimulatedAnnealingMaxBranching = SimulatedAnnealingMaxBranching,
     });
 }
        public new GraphBasedGeneratorConfiguration <TNode> SmartClone()
        {
            return(new GraphBasedGeneratorConfiguration <TNode>()
            {
                RoomsCanTouch = RoomsCanTouch,
                EarlyStopIfIterationsExceeded = EarlyStopIfIterationsExceeded,
                EarlyStopIfTimeExceeded = EarlyStopIfTimeExceeded,
                RepeatModeOverride = RoomTemplateRepeatMode.NoImmediate,
                ThrowIfRepeatModeNotSatisfied = ThrowIfRepeatModeNotSatisfied,
                ChainDecompositionConfiguration = ChainDecompositionConfiguration.SmartClone(),
                Chains = Chains?.Select(x => new Chain <TNode>(x.Nodes.ToList(), x.Number)).ToList(),
                SimulatedAnnealingConfiguration = SimulatedAnnealingConfiguration.SmartClone(),
                SimulatedAnnealingMaxBranching = SimulatedAnnealingMaxBranching,

                OptimizeCorridorConstraints = OptimizeCorridorConstraints,
            });
        }