/// <summary>
        /// Creates a playable map for specified service.
        /// </summary>
        private IPlayableMap CreatePlayable(IModeService service)
        {
            if (service == null)
            {
                Logger.LogWarning($"OriginalMap.CreatePlayable - A null servicer is passed. Skipping this mode.");
                return(null);
            }

            // Conversion
            var converter = service.CreateConverter(this);

            if (!converter.IsConvertible)
            {
                return(null);
            }
            var convertedMap = converter.Convert();

            if (convertedMap == null)
            {
                Logger.LogWarning($"OriginalMap.CreatePlayable - Failed to convert map for mode: {service.GameMode}");
                return(null);
            }

            // Processing
            var processor = service.CreateProcessor(convertedMap);

            processor.PreProcess();
            foreach (var o in convertedMap.HitObjects)
            {
                o.ApplyMapProperties(convertedMap.ControlPoints, convertedMap.Detail.Difficulty);
            }
            processor.PostProcess();

            // Calculate difficulty.
            var difficultyCalculator = service.CreateDifficultyCalculator(convertedMap);

            if (difficultyCalculator == null)
            {
                Logger.LogWarning($"OriginalMap.CreatePlayable - Difficulty calculator is null for mode: {service.GameMode}");
                return(null);
            }
            convertedMap.Difficulty = difficultyCalculator.Calculate();
            if (convertedMap.Difficulty == null)
            {
                Logger.LogWarning($"OriginalMap.CreatePlayable - Failed to calculate difficulty for mode: {service.GameMode}");
                return(null);
            }

            // Finished
            convertedMap.PlayableMode = service.GameMode;
            return(convertedMap);
        }