예제 #1
0
 public FireCharges(Character caster)
     : base(caster: caster, baseCooldown: 10, baseDamage: 3, animationKey: "skill_3",
            triggersGCD: true, target: "player", GCDRespect: true, delay: .5f)
 {
     boss = (NecromancerBoss)caster;
     name = "Fire Charges";
 }
예제 #2
0
 public ShadowBolt(Character caster)
     : base(caster, baseCooldown: 4, baseDamage: 4, animationKey: "skill_2",
            triggersGCD: true, target: "player", GCDRespect: true, delay: 2f)
 {
     boss = (NecromancerBoss)caster;
     name = "Shadowbolt";
 }
예제 #3
0
 public SummonCrystal(Character caster)
     : base(caster, 30, "skill_3")
 {
     stage = gameController.stage;
     boss  = (NecromancerBoss)caster;
     name  = "Summon Crystal";
 }
예제 #4
0
 public StoreCharge(Character caster, int chargesPerCast = 1)
     : base(caster, baseCooldown: 6f, animationKey: "skill_3")
 {
     this.chargesPerCast = chargesPerCast;
     boss = (NecromancerBoss)caster;
     distanceFromCenter = .5f + distanceGrowth * boss.maxCharges;
     name = "Store Charge";
 }
예제 #5
0
        IEnumerator NecromancerCastArrowsState_CastArrows(On.NecromancerCastArrowsState.orig_CastArrows orig, NecromancerCastArrowsState self)
        {
            DynData <NecromancerCastArrowsState> selfData = new DynData <NecromancerCastArrowsState>(self);
            NecromancerBoss boss = selfData.Get <NecromancerBoss>("boss");

            try {
                SkeloutonSpawner spawner = Resources.FindObjectsOfTypeAll <SkeloutonSpawner>()[0];
                for (int i = 0; i < 5; i++)
                {
                    Vector3 spawnPos = Vector3.Lerp(boss.castingPosLeft.position, boss.castingPosRight.position, 0.25f * i);
                    if (Vector3.Distance(spawnPos, Manager <PlayerManager> .Instance.Player.transform.position) > 5)
                    {
                        spawner.Spawn(spawnPos);
                    }
                }
            } catch (Exception e) {
                Console.WriteLine("Exception while spawning skeloutons");
                CourierLogger.LogDetailed(e, "HarderBosses");
            }
            for (int wavesDone = 0; wavesDone < self.waveCount; wavesDone++)
            {
                List <Transform> arrowPattern = (List <Transform>)CastArrowsStateGetRandomArrowPatternInfo.Invoke(self, new object[] { wavesDone });
                int numProjectiles            = arrowPattern.Count;

                while (arrowPattern.Count > 0)
                {
                    try {
                        GameObject projectile = Manager <PoolManager> .Instance.GetObjectInstance(boss.arrowProjectilePrefab);

                        projectile.transform.position = arrowPattern[0].position;
                        projectile.GetComponent <PoisonArrow>().SetNecromancerRef(boss);
                        projectile.GetComponent <PoisonArrow>().OverrideDir(Vector2.down);
                        PoisonArrow           arrow     = projectile.GetComponent <PoisonArrow>();
                        DynData <PoisonArrow> arrowData = new DynData <PoisonArrow>(arrow);
                        arrow.GetComponent <SpriteRenderer>().color = Color.cyan;
                        arrow.damageTypeImmunity = (EDamageType)255;
                        arrowData.Set("bounceAtWall", false);
                        arrowPattern.RemoveAt(0);
                    } catch (Exception e) {
                        CourierLogger.LogDetailed(e, "HarderBosses");
                    }
                    yield return(new WaitForSeconds(self.projectileCD));
                }

                yield return(new WaitForSeconds(self.waveCD / 2f));
            }
            boss.GotoNextAttackState();
        }
예제 #6
0
        IEnumerator NecromancerShootingState_ShootCoroutine(On.NecromancerShootingState.orig_ShootCoroutine orig, NecromancerShootingState self)
        {
            DynData <NecromancerShootingState> selfData = new DynData <NecromancerShootingState>(self);
            NecromancerBoss boss      = selfData.Get <NecromancerBoss>("boss");
            Vector3         targetPos = (!(Manager <PlayerManager> .Instance.Player.transform.position.x > boss.arenaCenter.position.x)) ? boss.castingPosRight.position : boss.castingPosLeft.position;

            boss.Invincibru       = true;
            boss.hurtZone.enabled = false;
            boss.Animator.Update(0f);
            boss.Animator.SetTrigger("TeleportOut");
            yield return(new WaitForSeconds(1f));

            Vector3 position3 = boss.arenaCenter.position;

            if (targetPos.x < position3.x)
            {
                boss.transform.localScale = new Vector3(-1f, 1f, 1f);
            }
            else
            {
                boss.transform.localScale = Vector3.one;
            }

            boss.transform.position = targetPos;
            boss.Animator.SetTrigger("TeleportIn");
            yield return(new WaitForSeconds(0.25f));

            boss.hurtZone.enabled = true;
            boss.Invincibru       = false;
            specialArrows         = true;
            while (selfData.Get <int>("maxWaveCount") > 0)
            {
                boss.Animator.SetBool("Shooting", true);
                yield return(new WaitForSeconds(0.3f));

                float[] pattern = GetRandomShotPattern();
                foreach (float wait in pattern)
                {
                    boss.Animator.SetTrigger("DoShot");
                    yield return(new WaitForSeconds(wait));
                }
                boss.Animator.SetBool("Shooting", false);
                selfData.Set("maxWaveCount", selfData.Get <int>("maxWaveCount") - 1);
                yield return(new WaitForSeconds(1f));
            }
            selfData.Set("allDone", true);
        }
예제 #7
0
        IEnumerator NecromancerSkullMountState_StartBeam(On.NecromancerSkullMountState.orig_StartBeam orig, NecromancerSkullMountState self)
        {
            yield return(orig(self));

            DynData <NecromancerSkullMountState> selfData = new DynData <NecromancerSkullMountState>(self);
            NecromancerBoss boss = selfData.Get <NecromancerBoss>("boss");

            while (true)
            {
                PoisonArrow arrow = Manager <PoolManager> .Instance.GetObjectInstance(boss.arrowProjectilePrefab).GetComponent <PoisonArrow>();

                arrow.transform.position = boss.projectileSpawnPoint.position + new Vector3(1.6f, 1.3f);
                Vector3 dir = Manager <PlayerManager> .Instance.Player.transform.position - arrow.transform.position;
                dir.z = 0;
                dir   = dir.normalized;
                arrow.OverrideDir(dir);
                arrow.transform.rotation = Quaternion.Euler(0, 0, (dir.x > 0 ? 0 : 180) + Vector3.SignedAngle(-arrow.transform.right, dir, arrow.transform.forward));
                arrow.SetNecromancerRef(boss);
                arrow.StartMovement(0);
                yield return(new WaitForSeconds(0.7f));
            }
        }