public void GiveNextHint()
    {
        QuizQuestionScriptableObject quizQuestion = _currentQuestion as QuizQuestionScriptableObject;

        if (quizQuestion != null)
        {
            if (quizQuestion.Hints.Length == 0)
            {
                return;
            }

            if (_currentQuestionHintIndex == -1)
            {
                _currentQuestionHintIndex++;
            }
            else if (_currentQuestionHintIndex + 1 < quizQuestion.Hints.Length)
            {
                _currentQuestionHintIndex++;
            }

            DialogueManager.Instance.ShowHint(quizQuestion.Hints[_currentQuestionHintIndex]);

            if (_currentQuestionHintIndex + 1 >= quizQuestion.Hints.Length)
            {
                _currentQuestionHintIndex = -1;
            }
        }
    }
    private void checkAnswer(GameObject pAnswerGO)
    {
        LocalizedString answerLocalizedString = pAnswerGO.GetComponentInChildren <LocalizeStringEvent>().StringReference;

        QuizQuestionScriptableObject  quizQuestion  = _currentQuestion as QuizQuestionScriptableObject;
        StoryQuestionScriptableObject storyQuestion = _currentQuestion as StoryQuestionScriptableObject;

        if (quizQuestion != null)
        {
            if (answerLocalizedString == quizQuestion.CorrectAnswer)
            {
                StartCoroutine(handleAnswer(pAnswerGO, _correctFeedbackColor));
            }
            else
            {
                StartCoroutine(handleAnswer(pAnswerGO, _wrongFeedbackColor));
            }
        }
        else if (storyQuestion != null)
        {
            StartCoroutine(handleAnswer(pAnswerGO, _storyFeedbackColor));
        }
    }
    public void PrepareQuestion(QuestionScriptableObject pQuestion)
    {
        //Make a clone so that the original SO never gets changed
        _currentQuestion = Instantiate(pQuestion);

        _quizPanel.SetActive(true);

        DialogueManager.Instance.HideHint();
        _currentQuestionHintIndex = -1;

        _questionContainer.GetComponentInChildren <LocalizeStringEvent>().StringReference = _currentQuestion.Question;

        QuizQuestionScriptableObject  quizQuestion  = _currentQuestion as QuizQuestionScriptableObject;
        StoryQuestionScriptableObject storyQuestion = _currentQuestion as StoryQuestionScriptableObject;

        //Save all the answers in a local list
        List <LocalizedString> availableAnswers = new List <LocalizedString>();

        for (int i = 0; i < _currentQuestion.Answers.Length; i++)
        {
            availableAnswers.Add(_currentQuestion.Answers[i]);
        }
        if (quizQuestion != null)
        {
            availableAnswers.Add(quizQuestion.CorrectAnswer);
            _quizPanel.transform.Find("Hint").gameObject.SetActive(true);
        }
        else if (storyQuestion != null)
        {
            _quizPanel.transform.Find("Hint").gameObject.SetActive(false);
        }

        //Randomize the answers positions
        System.Random rnd = new System.Random();
        availableAnswers = availableAnswers.OrderBy(pA => rnd.Next()).ToList();

        List <Sprite> answerBackgrounds    = new List <Sprite>();
        int           indexToAddBackground = 0;

        for (int i = 0; i < _answerGameObjects.Length; i++)
        {
            answerBackgrounds.Add(_answerBackgroundsList[indexToAddBackground]);
            indexToAddBackground = (indexToAddBackground + 1 >= _answerBackgroundsList.Count) ? 0 : indexToAddBackground + 1;
        }
        answerBackgrounds = answerBackgrounds.OrderBy(pA => rnd.Next()).ToList();
        for (int i = 0; i < _answerGameObjects.Length; i++)
        {
            _answerGameObjects[i].GetComponentInChildren <Image>().sprite = answerBackgrounds[i];
        }

        int colSize = _answerGameObjects[0].transform.parent.childCount;

        if (availableAnswers.Count <= colSize)
        {
            //Loop in reverse to avoid disabaling a row which should show an answer
            for (int i = _answerGameObjects.Length - 1; i >= 0; i--)
            {
                if (i == 0)
                {
                    Canvas.ForceUpdateCanvases();
                }

                _answerGameObjects[i].SetActive(false);
                _answerGameObjects[i].transform.parent.gameObject.SetActive(false);
                _answerGameObjects[i].GetComponentInChildren <Image>().color = Color.white;

                if (availableAnswers.Count <= i)
                {
                    continue;
                }

                _answerGameObjects[i].SetActive(true);
                _answerGameObjects[i].transform.parent.gameObject.SetActive(true);
                _answerGameObjects[i].GetComponentInChildren <LocalizeStringEvent>().StringReference = availableAnswers[i];
            }
        }
        else
        {
            for (int i = 0; i < _answerGameObjects.Length; i++)
            {
                _answerGameObjects[i].SetActive(true);
                _answerGameObjects[i].transform.parent.gameObject.SetActive(true);
            }

            int       amountOfObjectsToDisable = _answerGameObjects.Length - availableAnswers.Count;
            int       colCount   = _answerGameObjects.Length / colSize;
            Transform colsParent = _answerGameObjects[0].transform.parent.parent;
            for (int i = 0; i < amountOfObjectsToDisable; i++)
            {
                for (int j = 0; j < colCount; j++)
                {
                    colsParent.GetChild(j).GetChild(colSize - 1 - i).gameObject.SetActive(false);
                    if (j != 0)
                    {
                        i++;
                    }
                }
            }

            int availableAnswerIndex = -1;
            for (int i = 0; i < _answerGameObjects.Length; i++)
            {
                _answerGameObjects[i].GetComponentInChildren <Image>().color = Color.white;

                if (!_answerGameObjects[i].activeSelf)
                {
                    continue;
                }
                Canvas.ForceUpdateCanvases();

                _answerGameObjects[i].SetActive(false);
                _answerGameObjects[i].SetActive(true);

                availableAnswerIndex++;
                _answerGameObjects[i].GetComponentInChildren <LocalizeStringEvent>().StringReference = availableAnswers[availableAnswerIndex];
            }
        }
    }
    private IEnumerator handleAnswer(GameObject pAnswerGO, Color pColorToChange)
    {
        bool answerIsCorrect = pColorToChange == _correctFeedbackColor || pColorToChange == _storyFeedbackColor;

        //Make sure buttons cannot be clicked while waiting
        foreach (GameObject answers in _answerGameObjects)
        {
            answers.GetComponentInChildren <Button>().interactable = false;
        }
        pAnswerGO.GetComponentInChildren <Image>().color = pColorToChange;

        SoundManager.Instance.PlayNewSoundClip((answerIsCorrect) ? _correctFeedbackSound : _wrongFeedbackSound);

        yield return(new WaitForSeconds((answerIsCorrect) ? 1 : 0.2f));

        //Re-enable button interaction
        foreach (GameObject answers in _answerGameObjects)
        {
            answers.GetComponentInChildren <Button>().interactable = true;
        }
        pAnswerGO.GetComponentInChildren <Image>().color = Color.gray;

        QuizQuestionScriptableObject  quizQuestion  = _currentQuestion as QuizQuestionScriptableObject;
        StoryQuestionScriptableObject storyQuestion = _currentQuestion as StoryQuestionScriptableObject;

        if (quizQuestion != null)
        {
            if (answerIsCorrect)
            {
                foreach (GameObject answers in _answerGameObjects)
                {
                    answers.GetComponentInChildren <Image>().color = Color.white;
                }

                quizQuestion.OnCorrectAnswerAction.HandleAction();
                if (quizQuestion.OnCorrectAnswerAction.ActionType == SpecialAction.Action.None)
                {
                    _quizPanel.SetActive(false);
                    DialogueManager.Instance.Resume();
                }
            }
            else
            {
                LocalizedString answerLocalizedString = pAnswerGO.GetComponentInChildren <LocalizeStringEvent>().StringReference;
                for (int i = 0; i < quizQuestion.Answers.Length; i++)
                {
                    if (answerLocalizedString != quizQuestion.Answers[i])
                    {
                        continue;
                    }
                    quizQuestion.OnAnswerActions[i].HandleAction();
                    break;
                }
            }
        }
        else if (storyQuestion != null)
        {
            LocalizedString answerLocalizedString = pAnswerGO.GetComponentInChildren <LocalizeStringEvent>().StringReference;
            for (int i = 0; i < storyQuestion.Answers.Length; i++)
            {
                if (storyQuestion.Answers[i] != answerLocalizedString)
                {
                    continue;
                }

                storyQuestion.OnAnswerActions[i].HandleAction();
                if (storyQuestion.OnAnswerActions[i].ActionType != SpecialAction.Action.QuizQuestion &&
                    storyQuestion.OnAnswerActions[i].ActionType != SpecialAction.Action.StoryQuestion)
                {
                    _quizPanel.SetActive(false);
                    if (storyQuestion.OnAnswerActions[i].ActionType == SpecialAction.Action.None)
                    {
                        DialogueManager.Instance.Resume();
                    }
                }
                break;
            }
        }
    }