protected virtual void MapTutorialStates(ITutorialStateHandler tutorialStateHandler)
 {
     if (!tutorialStateHandler.Initialised)
     {
         tutorialStateHandler.Init(_model, this, _view);
     }
     _logger.LogMessage(LogLevel.Informational, "Mapping  tutorial states type: " + tutorialStateHandler.GetType().ToString());
     MapState(BaseStates.SHOW_ROUND, tutorialStateHandler.OnStateShowRound, tutorialStateHandler.AfterStateShowRound);
     MapState(BaseStates.INPUT, tutorialStateHandler.OnStateInput, tutorialStateHandler.AfterStateInput);
     MapState(BaseStates.CORRECT_ANSWER, tutorialStateHandler.OnStateCorrectAnswer, tutorialStateHandler.AfterStateCorrectAnswer);
     MapState(BaseStates.CORRECT_STEP, tutorialStateHandler.OnStateCorrectStep, tutorialStateHandler.AfterStateCorrectStep);
     MapState(BaseStates.WRONG_ANSWER, tutorialStateHandler.OnStateWrongAnswer, tutorialStateHandler.AfterStateWrongAnswer);
     MapState(BaseStates.WRONG_STEP, tutorialStateHandler.OnStateWrongStep, tutorialStateHandler.AfterStateWrongStep);
     MapState(BaseStates.MEMORIZE_STEP, tutorialStateHandler.OnStateMemorize, tutorialStateHandler.AfterStateMemorize);
 }
        public ITutorialStateHandler GetTutorialTypeAndUpdate()
        {
            // if currently tutorial is running update its loop
            if (_currentTutorialConfig != null)
            {
                var tutFinished = IncreaseTutorialLoop(_currentTutorialHandler.TutorialLoopIncrease);
                if (tutFinished)
                {
                    var tutorialType = _currentTutorialConfig.HandlerType;
                    //finish tutorial
                    _currentTutorialConfig = null;
                    _currentTutorialHandler.Dispose();
                    _currentTutorialHandler = null;
                    // mark how may times this type of tutorial finished for running it again
                    if (_tutorialRuns.ContainsKey(tutorialType))
                    {
                        _tutorialRuns[tutorialType]++;
                    }
                    else
                    {
                        _tutorialRuns.Add(tutorialType, 1);
                    }
                    // dispatch tutorial finish signal
                    OnUpdate?.Invoke(new GuidedTourUpdateVO(false, tutorialType.Name));
                }
                else
                {
                    //tutorial still running
                    _currentRoundTriggers = new List <ITutorialTrigger>();
                    return(_currentTutorialHandler);
                }
            }
            //if there is no tutorial or it was finished check if new one should be started
            // and there is no current running tutorial -> start a new one
            if (_currentRoundTriggers.Count > 0 && _currentTutorialConfig == null)
            {
                ITutorialConfiguration newTutorialConfig  = null;
                ITutorialTrigger       newTutorialTrigger = null;
                foreach (var trigger in _currentRoundTriggers)
                {
                    foreach (var config in _exerciseConfiguration.TutorialConfigurations)
                    {
                        if (config.TriggerType != null && trigger.GetType() == config.TriggerType)
                        {
                            // if there is a new tutorial config with still defined repeats
                            // and this tutorial wasn't been shown already enough times
                            if (config != null && config.Repeats > 0 && GetTutorialRuns(config.HandlerType) == 0)
                            {
                                if (newTutorialConfig == null)
                                {
                                    newTutorialConfig  = config;
                                    newTutorialTrigger = trigger;
                                }
                                else if (config.Priority > newTutorialConfig.Priority)
                                {
                                    newTutorialConfig  = config;
                                    newTutorialTrigger = trigger;
                                }
                            }
                        }
                    }
                }

                if (newTutorialConfig != null)
                {
                    // assign new tutorial as currently running
                    _currentTutorialConfig = newTutorialConfig;
                    // set tutorial first loop
                    _tutorialLoops = 1;
                    // dispatch tutorial started signal
                    OnUpdate?.Invoke(new GuidedTourUpdateVO(true, _currentTutorialConfig.HandlerType.Name));

                    // indicate new tutorial
                    _currentTutorialHandler         = (ITutorialStateHandler)Activator.CreateInstance(_currentTutorialConfig.HandlerType);
                    _currentTutorialHandler.Trigger = newTutorialTrigger;
                    _currentRoundTriggers           = new List <ITutorialTrigger>();
                    return(_currentTutorialHandler);
                }
            }
            _currentRoundTriggers = new List <ITutorialTrigger>();

            //there is no tutorial right now
            return(TYPE_NO_TUTORIAL);
        }