public void StartBossFight()
    {
        StartCoroutine(_StartBossFight());

        IEnumerator _StartBossFight()
        {
            Fighting = true;
            PlayerClickController.Instance.SetEnabled(false);
            DeadEnemyController.Instance.ClearEnemies();
            QuickPopUp.QuickPopUpAllowed = false;

            // Disable being able to move the world but keep scrolling
            World.Disable();
            EnemyArrowIndicator.Instance.SetOnMainScreen(false);

            // Put boss where they should be
            var bossQuest = (BossQuest)CurrentQuest.Value;

            EnemyData boss = (EnemyData)Followers.FirstOrDefault(f => f.ID == bossQuest.Enemy.ID);

            if (boss == null)
            {
                boss       = Instantiate(bossQuest.Enemy);
                boss.Level = bossQuest.Level;
                boss.AfterCreated();
                Followers.Add(boss);
            }

            EnemyDisplay.Instance.gameObject.SetActive(true);
            EnemyDisplay.Instance.SetEnemy(boss);

            var bossRT = EnemyDisplay.Instance.RectTransform;

            bossRT.position = BossStartPosition.position;

            // Ensure player isn't moving.
            PlayerAnimations.Instance.StopWalking();
            // Ensure boss is facing the right direction
            bossRT.localScale = bossRT.localScale.SetX(-1);

            int oldScrollSpeed = BackgroundImages.ScrollSpeed;

            BackgroundImages.ScrollSpeed = ScrollSpeed;

            // Wait until boss is in proper position
            while (bossRT.position.x > BossEndPosition.position.x)
            {
                float dist = -Time.deltaTime * ScrollSpeed;
                bossRT.localPosition   = bossRT.localPosition.AddX(dist);
                PlayerRT.localPosition = PlayerRT.localPosition.AddX(dist);
                yield return(null);
            }

            BackgroundImages.ScrollSpeed = oldScrollSpeed;
            BackgroundImages.Pause();


            // Pop up Fight button and wait for click
            FightButton.gameObject.SetActive(true);
            FightButton.onClick.RemoveAllListeners();
            bool fightClicked = false;

            FightButton.onClick.AddListener(() => {
                FightButton.onClick.RemoveAllListeners();
                FightButton.gameObject.SetActive(false);
                fightClicked = true;
            });

            while (!fightClicked)
            {
                yield return(null);
            }

            // Make boss & player switch positions
            PlayerAnimations.Instance.StartWalking();
            EnemyDisplay.Instance.StartWalkingAnimation();

            bool playerReady    = false;
            bool playerSpinning = false;
            bool enemyReady     = false;

            while (!playerReady || !enemyReady)
            {
                if (!playerReady && !playerSpinning)
                {
                    if (PlayerRT.position.x >= PlayerFightPosition.position.x)
                    {
                        PlayerAnimations.Instance.StopWalking();
                        playerSpinning = true;
                        PlayerAnimations.Instance.Spin(() => {
                            playerReady    = true;
                            playerSpinning = false;
                        });
                    }
                    else
                    {
                        float dist = Time.deltaTime * EnemyAndPlayerWalkSpeed;
                        PlayerRT.localPosition = PlayerRT.localPosition.AddX(dist);
                    }
                }

                if (!enemyReady)
                {
                    if (bossRT.position.x <= EnemyFightPosition.position.x)
                    {
                        bossRT.localScale = bossRT.localScale.SetX(1);
                        enemyReady        = true;
                        EnemyDisplay.Instance.StopWalking();
                    }
                    else
                    {
                        float dist = -Time.deltaTime * EnemyAndPlayerWalkSpeed;
                        bossRT.localPosition = bossRT.localPosition.AddX(dist);
                    }
                }

                yield return(null);
            }



            // Once boss and player show up in proper places, start the fight like regular.
            EnemyDisplay.Instance.StartAttacking();
            BattleUi.gameObject.SetActive(true);
            BattleUi.SetAlphaOfAllChildren(0);
            BattleUiLerper.StartLerping();
            AttackArea.SetActive(true);
        }
    }