IEnumerator EmitNextFrame(PlayerPacks packs, int packToExclude)
    {
        yield return new WaitForEndOfFrame();

        var bossObj = (GameObject) Instantiate(BossPrefab, transform.position.plusX((Random.value - 0.5f) * 8), transform.rotation);
        bossObj.transform.parent = transform.parent;

        var boss = bossObj.GetComponent<Boss>();
        boss.PlayerRigidbody = playerRigidbody;
        boss.AngelBoost = angelBoost;
        boss.TargetX = TargetX;
        boss.TargetY = TargetY;
        boss.AimingTarget = AimingTarget;

        var currentPlayerY = playerRigidbody.transform.position.y;
        var allowedIndexes = new int[packs.Packs.Length];
        var allowedIndexCount = 0;
        for (int i = 0; i < packs.Packs.Length; i++) {
            if (i != packToExclude && packs.Packs[i].MinHeight <= currentPlayerY) {
                allowedIndexes[allowedIndexCount] = i;
                allowedIndexCount++;
            }
        }

        var randomIndex = allowedIndexes[Mathf.FloorToInt(Random.value * allowedIndexCount)];
        var pack = packs.Packs[randomIndex];

        boss.PlayerPacks = packs;
        boss.PlayerPackIndex = randomIndex;
        boss.BulletPrefab = pack.BulletPrefab;
        bossObj.transform.FindChild("Sprite").GetComponent<SpriteRenderer>().sprite = pack.CharacterSprite;
        bossObj.transform.FindChild("WeaponRoot/Weapon").GetComponent<SpriteRenderer>().sprite = pack.WeaponSprite;
    }
    void Start()
    {
        bossEmitter = FindObjectOfType<BossEmitter>();
        targetRigidbody = GetComponent<Rigidbody2D>();
        playerPacks = GetComponent<PlayerPacks>();
        GetComponent<Player>().OnExploded += explosion => {
            if (!playerHasFirstExploded) {
                AngelsUntilNextBoost = AngelsToKillPerBoost;
                playerHasFirstExploded = true;
            }
        };
        FindObjectOfType<GameOver>().OnGameOver += () => {
            CurrentHeighest = 0;
            playerHasFirstExploded = false;
            HasAngelBoost = false;
            BossExistsAlready = false;

            var allBosses = FindObjectsOfType<Boss>();
            for (int i = 0; i < allBosses.Length; i++) {
                allBosses[i].DieSilently = true;
                allBosses[i].GetComponent<DieOnContact>().Die();
            }
        };
    }
 public void EmitBoss(PlayerPacks packs, int packToExclude)
 {
     if (this)
         StartCoroutine(EmitNextFrame(packs, packToExclude));
 }
 void Start()
 {
     packs = FindObjectOfType<PlayerPacks>();
     text = GetComponentInChildren<Text>();
 }