public void BeginEndOfLevelChallenge()
    {
        CurrentSceneBuildIndex = SceneManager.GetActiveScene().buildIndex;
        SceneManager.LoadScene("ChallengeMode");

        GameManager.instance.CharactersCanMove = false;

        for (var i = 0; i < CollectedChallengeWords.Count; i++)
        {
            GameObject challengeWordObj  = new GameObject();
            Text       challengeWordText = challengeWordObj.AddComponent <Text>();

            challengeWordText.text      = CollectedChallengeWords.ElementAt(i);
            challengeWordText.fontSize  = 32;
            challengeWordText.alignment = TextAnchor.MiddleCenter;
            challengeWordText.color     = Color.white;
            challengeWordText.font      = GameManager.instance.WordFont;

            var challengeWordTextRectTransform = challengeWordText.GetComponent <RectTransform>();

            challengeWordTextRectTransform.SetParent(GameManager.instance.Canvas.transform);

            challengeWordTextRectTransform.offsetMin        = new Vector2(0, 0.5f);
            challengeWordTextRectTransform.offsetMax        = new Vector2(0, 0.5f);
            challengeWordTextRectTransform.anchoredPosition = new Vector2((i + 1) * 80, 0);
            challengeWordTextRectTransform.localScale       = new Vector3(1, 1, 1);
            challengeWordTextRectTransform.anchorMin        = new Vector2(0, 0.5f);
            challengeWordTextRectTransform.anchorMax        = new Vector2(0, 0.5f);
            challengeWordTextRectTransform.pivot            = new Vector2(0, 0.5f);
            challengeWordTextRectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, 64);
            challengeWordTextRectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 256);
            challengeWordObj.SetActive(true);

            challengeModeWords.AddLast(new ChallengeWord
            {
                Word = CollectedChallengeWords.ElementAt(i),
                ChallengeModeWordText = challengeWordText,
                IsCurrentWord         = false,
                IsSelected            = false
            });
        }

        challengeModeWords.First.Value.IsSelected = true;
        ChallengeWord randomWord = getRandomChallengeModeWord(challengeModeWords);

        speakWord(randomWord);

        ChallengeMode = true;
    }
    void RunChallengeMode()
    {
        if (LevelCompleted == false && ChallengeMode)
        {
            // select random challenge word
            if (!challengeModeWords.Any(w => w.IsCurrentWord))
            {
                ChallengeWord randomWord = getRandomChallengeModeWord(challengeModeWords);
                randomWord.IsCurrentWord = true;
                speakWord(randomWord);
            }

            //
            var selectedWord = challengeModeWords.SingleOrDefault(c => c.IsSelected);

            // if word is not selected select one at random
            if (selectedWord == null)
            {
                getRandomChallengeModeWord(challengeModeWords).IsSelected = true;
            }

            // update coloring for text
            foreach (var node in challengeModeWords)
            {
                if (node.IsSelected)
                {
                    node.ChallengeModeWordText.color = Color.cyan;
                }
                else
                {
                    node.ChallengeModeWordText.color = Color.white;
                }
            }

            // Left
            if (Time.time > timestamp && Input.GetAxis("Horizontal") < 0.0f)
            {
                var selectedNode = challengeModeWords.Find(selectedWord);

                if (selectedNode.Previous != null)
                {
                    selectedNode.Previous.Value.IsSelected = true;
                    selectedWord.IsSelected = false;
                }

                timestamp = Time.time + timeBetweenChallengeSelect;
            }
            // right
            else if (Time.time > timestamp && Input.GetAxis("Horizontal") > 0.0f)
            {
                var selectedNode = challengeModeWords.Find(selectedWord);

                if (selectedNode.Next != null)
                {
                    selectedNode.Next.Value.IsSelected = true;
                    selectedWord.IsSelected            = false;
                }

                timestamp = Time.time + timeBetweenChallengeSelect;
            }
            else if (Input.GetButtonDown("Submit"))
            {
                if (selectedWord.IsCurrentWord)
                {
                    WindowsVoice.speak("That is correct!");
                    Destroy(selectedWord.ChallengeModeWordText);
                    challengeModeWords.Remove(selectedWord);

                    // Level has been completed
                    LevelCompleted = !challengeModeWords.Any();
                }
                else
                {
                    WindowsVoice.speak("That is incorrect!");
                }
            }
        }
    }
 private void speakWord(ChallengeWord word)
 {
     WindowsVoice.speak($"Select the word {word.Word}");
 }