// Placed in environment where they can explore for 2-3 mins, no objects.
    public IEnumerator RunExploreScene(Scene s, Logger logger)
    {
        print("ExploreScene(): Starting");

        // Doesn't have GrayScreen

        GameObject curenv = GetEnvGO(Environments, s.envIndex);

        curenv.BroadcastMessage("SpawnPlayerAtIndex", s.playerSpawnIndex);

        // Get player reference
        GameObject player = GameObject.FindWithTag("Player");

        // Setup logger, using environment info component
        EnvInfo envinfo = (EnvInfo)curenv.GetComponent <EnvInfo>();

        logger.StartTrial(Vector3.zero, player, envinfo.GetOrigin()); // No destination in explore mode

        yield return(new WaitForSeconds(s.envTime));

        logger.EndTrial();

        curenv.BroadcastMessage("RemovePlayer");

        print("ExploreScene(): Done");
    }
    //
    // Scene logics
    //

    public IEnumerator RunNormalScene(Scene s, Logger logger)
    {
        print("RunNormalScene(): Starting");

        // Show GrayScreen
        yield return(StartCoroutine(ShowGrayScreen(s.objShowIndex, s.showTime, s.greyScreenTime)));

        // Env we'll be sending message to
        GameObject curenv = GetEnvGO(Environments, s.envIndex);

        // Setup player
        if (s.playerSpawnIndex >= 0)
        {
            // Player index of -1 or less implies we dont respawn player. Used for searchfind.
            Environments.BroadcastMessage("RemovePlayer");
            curenv.BroadcastMessage("SpawnPlayerAtIndex", s.playerSpawnIndex);
        }
        GameObject player = GameObject.FindWithTag("Player");

        player.SendMessage("EnableInput");

        // Setup trigger object
        curenv.BroadcastMessage("ActivateObjTriggerAtIndex",
                                new ObjSpawner.TriggerInfo(s.objSpawnIndex, TriggerCallback, s.objShowIndex, globalConfig.objTriggerRadius));
        if (s.showObjAlways)
        {
            curenv.BroadcastMessage("ShowSelf");
        }

        Vector3 objpos = GameObject.FindWithTag("GoalTrigger").transform.position;

        // Setup Landmark
        curenv.BroadcastMessage("ShowLandmark", s.landmarkSpawnIndex);

        // Setup logger, using environment info component
        EnvInfo envinfo = (EnvInfo)curenv.GetComponent <EnvInfo>();

        logger.StartTrial(envinfo.GetActiveTriggerObj().transform.position, player, envinfo.GetOrigin());

        // Wait for player to find target
        float curtime = Time.time;

        yield return(new WaitUntil(() =>
                                   (s.showObjAlways ?
                                    fplayerfoundtarget :
                                    (Input.GetKeyDown(globalConfig.actionKey) || Time.time - curtime >= s.envTime))));

        bool ftimedout = Time.time - curtime >= s.envTime;

        // Log player doing action/timing out
        logger.WriteAction(ftimedout ? "timeout" : "action");

        // Freeze player controls
        player.SendMessage("DisableInput");

        // Check if player found target after the press
        bool ffoundtarget = !(Time.time - curtime >= s.envTime) &&
                            (s.showObjAlways ?
                             fplayerfoundtarget :
                             (globalConfig.objTriggerRadius + player.GetComponent <CharacterController>().radius) >=
                             Vector2.Distance(Helper.ToVector2(objpos),
                                              Helper.ToVector2(player.transform.position)));

        print(String.Format("RunScene(): ffoundtarget: '{0}'", ffoundtarget));

        PlayerAction playerAction = (PlayerAction)player.GetComponent <PlayerAction>();

        if (ffoundtarget)
        {
            print("You found the target without having to be shown it!");
            curenv.BroadcastMessage("ShowSelf");

            // Turn player towards object
            if (!s.showObjAlways)
            {
                yield return(StartCoroutine(playerAction.PlayerLookTowards()));
            }
        }
        else
        {
            print("You didn't find the target in time. Let me show it to you...");

            // Turn the target on! Show the billboarded sprite!
            curenv.BroadcastMessage("ShowSelf");

            // Turn player towards object
            yield return(StartCoroutine(playerAction.PlayerLookTowards()));

            // Reset target
            ResetCallbacks();

            // Unfreeze controls
            player.SendMessage("EnableInput");

            print("...now go find the target!");

            float curtimetwo = Time.time;
            yield return(new WaitUntil(() => fplayerfoundtarget || Time.time - curtimetwo >= s.envTimeTwo));

            // Freeze player controls
            player.SendMessage("DisableInput");
        }

        if (!s.showObjAlways)
        {
            yield return(StartCoroutine(OnFindTarget(player)));
        }

        curenv.BroadcastMessage("HideSelf");

        logger.EndTrial();

        curenv.BroadcastMessage("DeactiveateTriggers");
        curenv.BroadcastMessage("HideLandmark");

        ResetCallbacks();

        yield return(StartCoroutine(ShowGrayScreen(-1, 0.0f, s.greyScreenTimeTwo)));

        print("Scene(): Done");
    }