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); } }