/// OnButtonUp
 /// Button event - when bumper is tapped: show summary
 /// Button event - when bumper is tapped again: reset scene
 private void OnButtonUp(byte controller_id, MLInput.Controller.Button button)
 {
     if (wallStat == WallStat.Summary)
     {
         if (button == MLInput.Controller.Button.Bumper)
         {
             scoreKeeper.ResetScore();
         }
         else if (button == MLInput.Controller.Button.HomeTap)
         {
             summaryText.enabled    = false;
             spawnMngr.enabled      = false;
             scoreText.enabled      = false;
             statusText.enabled     = false;
             beamController.enabled = true;
             menu.SetActive(true);
             wallStat = WallStat.Menu;
         }
     }
     else if (wallStat != WallStat.Empty)      // in settings or help page
     {
         settings.SetActive(false);
         helpText.enabled = false;
         wallStat         = WallStat.Menu;
         menu.SetActive(true);
     }
 }
    private void OnPlayspaceComplete()
    {
        canvas.SetActive(true);
        menu.SetActive(true);
        PlayspaceWall wall = Playspace.Instance.Walls[Playspace.Instance.PrimaryWall];

        canvas.transform.position = wall.Center + Vector3.up * .3f;
        canvas.transform.rotation = Quaternion.LookRotation(wall.Back, Vector3.up);
        canvas.transform.Translate(Vector3.back * .1f); // pull the canvas up a bit to avoid coverup
        //SetPositionAndRotation(wall.Center, wall.Rotation);
        beamController.enabled = true;
        wallStat = WallStat.Menu;
    }
    private void Awake()
    {
        MLInput.Start();
        spawnMngr    = GetComponent <SpawnManager>();
        audioManager = GameObject.Find("AudioManager").GetComponent <AudioManager>();
        scoreKeeping = GameObject.Find("[Content]/Controller").GetComponent <ScoreKeeping>();
        trailAndBall = spawnMngr.trailAndBall.GetComponent <DisplayTrailAndBall>();
        _control     = MLInput.GetController(MLInput.Hand.Left);

        scoreText.enabled      = false;
        summaryText.enabled    = false;
        statusText.enabled     = false;
        helpText.enabled       = false;
        beamController.enabled = false;
        spawnMngr.enabled      = false;
        menu.SetActive(false);
        canvas.SetActive(false);
        settings.SetActive(false);

        // update setting text to reflect current settings
        pathOn = trailAndBall.trails[0].activeSelf;
        if (GameObject.Find("[Content]/MLSpatialMapper/Original").GetComponent <Renderer>().material.mainTexture == null)
        {
            meshOn = false;
        }
        else
        {
            meshOn = true;
        }


        foreach (SettingType type in Enum.GetValues(typeof(SettingType)))
        {
            SetSettingText(type);
        }

        Playspace.Instance.OnCompleted.AddListener(OnPlayspaceComplete);
        Playspace.Instance.OnCleared.AddListener(OnPlayspaceClear);
        MLInput.OnControllerButtonUp  += OnButtonUp;
        scoreKeeper.ScoreChange       += OnScoreChange;
        beamController.OptionSelected += OnOptionSelected;

        wallStat = WallStat.Empty;
    }
    private void OnOptionSelected(string tag)
    {
        // only called when in menu page
        if (tag == "play")
        {
            menu.SetActive(false);
            beamController.enabled = false;
            wallStat          = WallStat.Summary;
            spawnMngr.enabled = true;
            scoreKeeper.ResetScore();
            scoreText.enabled   = true;
            summaryText.enabled = true;
            statusText.enabled  = true;
        }
        else if (tag == "settings")
        {
            menu.SetActive(false);
            wallStat = WallStat.Setting;
            settings.SetActive(true);
        }
        else if (tag == "help")
        {
            menu.SetActive(false);
            wallStat         = WallStat.Help;
            helpText.enabled = true;
            SetHelpText();
        }
        // setting page interactions
        if (tag == "freq_plus")
        {
            // frequency convertion:
            // frequency level 1: 10 sec/spawn, lv2: 5 sec/spawn, lv3: 2.5 sec/spawn...
            // see SpawnManager.spawnInterval for more
            spawnMngr.SpawnFrequency = Min(spawnMngr.SpawnFrequency + 1, 7);
            SetSettingText(SettingType.Freq);
        }
        else if (tag == "freq_minus")
        {
            spawnMngr.SpawnFrequency = Max(spawnMngr.SpawnFrequency - 1, 1);
            SetSettingText(SettingType.Freq);
        }
        else if (tag == "BGM_plus")
        {
            audioManager.background.volume = Min(audioManager.background.volume + 0.1f, 1f);
            SetSettingText(SettingType.BGM);
        }
        else if (tag == "BGM_minus")
        {
            audioManager.background.volume = Max(audioManager.background.volume - 0.1f, 0f);
            SetSettingText(SettingType.BGM);
        }
        else if (tag == "sound_plus")
        {
            float newValue = Min(audioManager.grab.volume + 0.1f, 1f);
            audioManager.grab.volume  = newValue;
            audioManager.crash.volume = newValue;
            audioManager.spawn.volume = newValue;

            SetSettingText(SettingType.Sound);
        }
        else if (tag == "sound_minus")
        {
            float newValue = Max(audioManager.grab.volume - 0.1f, 0f);
            audioManager.grab.volume  = newValue;
            audioManager.crash.volume = newValue;
            audioManager.spawn.volume = newValue;

            SetSettingText(SettingType.Sound);
        }
        else if (tag == "path_control")
        {
            GameObject[] trails = spawnMngr.trailAndBall.GetComponent <DisplayTrailAndBall>().trails;
            if (pathOn)
            {
                foreach (GameObject obj in trails)
                {
                    obj.SetActive(false);
                }
                pathOn = false;
            }
            else
            {
                foreach (GameObject obj in trails)
                {
                    obj.SetActive(true);
                }
                pathOn = true;
            }
            SetSettingText(SettingType.Path);
        }
        else if (tag == "height_plus")
        {
            scoreKeeping.upLimit = Min(scoreKeeping.upLimit + 0.01f, 3f);
            SetSettingText(SettingType.Height);
        }
        else if (tag == "height_minus")
        {
            scoreKeeping.upLimit = Max(scoreKeeping.upLimit - 0.01f, 0f);
            SetSettingText(SettingType.Height);
        }
        else if (tag == "speed_plus")
        {
            trailAndBall.speed = Min(trailAndBall.speed + 0.1f, 3f);
            SetSettingText(SettingType.Speed);
        }
        else if (tag == "speed_minus")
        {
            trailAndBall.speed = Max(trailAndBall.speed - 0.1f, 0f);
            SetSettingText(SettingType.Speed);
        }
        else if (tag == "mesh_control")
        {
            if (meshOn)
            {
                GameObject.Find("[Content]/MLSpatialMapper/Original").GetComponent <Renderer>().material.mainTexture = null;
                meshOn = false;
            }
            else
            {
                Texture meshTexture = Resources.Load <Texture>("GradientLine");
                GameObject.Find("[Content]/MLSpatialMapper/Original").GetComponent <Renderer>().material.mainTexture = meshTexture;
                meshOn = true;
            }
            SetSettingText(SettingType.Mesh);
        }
        else if (tag == "playspace_reset")
        {
            settings.SetActive(false);
            beamController.enabled = false;
            Playspace.Instance.Rebuild();
        }
        else if (tag == "gamemode")
        {
            if (spawnMngr.timedMode)
            {
                spawnMngr.timedMode    = false;
                spawnMngr.survivalMode = true;
            }
            else if (spawnMngr.survivalMode)
            {
                spawnMngr.survivalMode = false;
            }
            else
            {
                spawnMngr.timedMode = true;
            }
            //spawnMngr.timedMode = !spawnMngr.timedMode;
            SetSettingText(SettingType.GameMode);
        }
        else if (tag == "duration_plus")
        {
            spawnMngr.timeLimit += 30;
            SetSettingText(SettingType.Duration);
        }
        else if (tag == "duration_minus")
        {
            if (spawnMngr.timeLimit >= 60)
            {
                spawnMngr.timeLimit -= 30;
            }
            SetSettingText(SettingType.Duration);
        }
        Debug.Log("Option selected" + tag);
    }