async Task IntroduceLevel()
    {
        await _speechOut.Speak("There are two obstacles.");

        _lowerHandle.Free(); // we free this here, so that level can introduce "objects of interest"
        Level level = GetComponent <Level>();
        await level.PlayIntroduction();

        _upperHandle.Free();
        await _speechOut.Speak("Feel for yourself. Say yes or done when you're ready.");

        await _speechIn.Listen(new Dictionary <string, KeyCode>() { { "yes", KeyCode.Y }, { "done", KeyCode.D } });
    }
    /// <summary>
    /// Starts a new round.
    /// </summary>
    /// <returns></returns>
    async Task ResetGame()
    {
        await _speechOut.Speak("Spawning player");

        player.transform.position = playerSpawn.position;
        await _upperHandle.SwitchTo(player, 0.2f);

        await _speechOut.Speak("Spawning enemy");

        enemy.transform.position = enemySpawn.position;
        enemy.transform.rotation = enemySpawn.rotation;
        await _lowerHandle.SwitchTo(enemy, 0.2f);

        if (level >= enemyConfigs.Length)
        {
            Debug.LogError($"Level {level} is over number of enemies {enemyConfigs.Length}");
        }
        enemy.GetComponent <EnemyLogic>().config = enemyConfigs[level];

        _upperHandle.Free();

        player.SetActive(true);
        enemy.SetActive(true);
        _levelStartTime = Time.time;
    }