Beispiel #1
0
    public bool Damage(Damage damage, float fMultiplier, float fAdditionalDamage)
    {
        fCurrentHealth -= (damage.fAmount + fAdditionalDamage) * fMultiplier;

        if (damage.debuff != DebuffData.Debuff.NO_DEBUFF)
        {
            DebuffData data = new DebuffData();
            data.debuff     = damage.debuff;
            data.debuffIcon = damage.debuffIcon;
            PFX_DebuffIcon debuffIcon = ApplyDebuff(data, damage.fDebuffDuration);
            if (debuffIcon != null)
            {
                debuffIcon.transform.SetParent(transform);
                debuffIcon.transform.localPosition = Vector3.zero;
            }
        }

        if ((fCurrentHealth <= 0.0f) || (damage.fInstadeathThreshold > 0.0f && fCurrentHealth / fMaxHealthPostBuffs < damage.fInstadeathThreshold))
        {
            Destroy(gameObject);
            return(true);
        }

        return(false);
    }
Beispiel #2
0
 public Resurrection(Resurrection other)
 {
     fMaxHealthModifier = other.fMaxHealthModifier;
     bZombify           = other.bZombify;
     slotToRes          = other.slotToRes;
     resPFX             = other.resPFX;
     resSound           = other.resSound;
 }
Beispiel #3
0
    public override void OnTriggered(Buff buff, Actor actor)
    {
        PFX_DebuffIcon debuffIcon = actor.minion.ApplyDebuff(data, fDuration);

        if (debuffIcon != null)
        {
            debuffIcon.transform.SetParent(actor.transform);
            debuffIcon.transform.localPosition = Vector3.zero;
        }
    }
Beispiel #4
0
    private void KillGroup(MinionSlotType slotType)
    {
        foreach (Actor_Player actor in Core.GetLevel().playerActors)
        {
            actor.minion.template.TriggerBuff(slotType == MinionSlotType.MELEE ? BuffTrigger.PLAYER_MELEE_DIED : BuffTrigger.PLAYER_RANGED_DIED, null);
        }

        List <Resurrection> resList = Core.GetLevel().singleUseResurrections;

        for (int i = 0; i < resList.Count; i++)
        {
            Resurrection res = resList [i];
            if (res.slotToRes == slotType)
            {
                resList.RemoveAt(i);

                Core.GetAudioManager().PlayResSFX(res.resSound);

                // Do achievements
                Core.TriggerAchievement("BACK_FROM_THE_DEAD");
                Core.IncrementStat("NUM_RESURRECTIONS", 2);
                if (bHasThreeResurrectsAvailable)
                {
                    bool bLastResUsed = true;
                    foreach (Resurrection check in resList)
                    {
                        if (check.slotToRes == slotType)
                        {
                            bLastResUsed = false;
                        }
                    }
                    if (bLastResUsed)
                    {
                        Core.TriggerAchievement("AND_HERE_TO_STAY");
                    }
                }

                for (int j = 0; j < slotType.GetNumSlots(); j++)
                {
                    MinionSlot slot = (MinionSlot)((int)slotType.GetFirst() + j);
                    minions [(int)slot].fMaxHealthPreBuffs  *= res.fMaxHealthModifier;
                    minions [(int)slot].fMaxHealthPostBuffs *= res.fMaxHealthModifier;
                    minions [(int)slot].isZombified          = true;

                    // Play PFX
                    PFX_DebuffIcon pfx = Instantiate <PFX_DebuffIcon>(res.resPFX);
                    pfx.transform.SetParent(Core.GetLevel().playerActors [(int)slot].transform);
                    pfx.transform.localPosition = new Vector3(0.0f, 0.0f, -0.25f);
                    pfx.Init(true);
                }

                RecalculateHealths(slotType);

                return;
            }
        }

        for (int i = 0; i < slotType.GetNumSlots(); i++)
        {
            MinionSlot slot = (MinionSlot)((int)slotType.GetFirst() + i);
            KillMinion(slot);
        }

        Core.GetLevel().PlayerLost();
    }
Beispiel #5
0
 public DebuffData(DebuffData old)
 {
     debuff         = old.debuff;
     fTimeRemaining = old.fTimeRemaining;
     debuffIcon     = old.debuffIcon;
 }
Beispiel #6
0
    public override bool Damage(Damage damage, float fMultiplier, float fStunTime, float fAdditionalCritChance, float fAdditionalCritMultiplier, float fVampirism, float fAdditionalDamage)
    {
        if (IsDead())
        {
            return(true);
        }

        if (fStunTime > 0.0f)
        {
            DebuffData data = new DebuffData();
            data.debuff         = DebuffData.Debuff.STUNNED;
            data.fTimeRemaining = fStunTime;
            data.debuffIcon     = Core.GetMinionTemplateManager().stunPFXPrefab;
            PFX_DebuffIcon debuffIcon = minion.ApplyDebuff(data, fStunTime);
            if (debuffIcon != null)
            {
                debuffIcon.transform.SetParent(transform);
                debuffIcon.transform.localPosition = Vector3.zero;
            }
        }

        if (damage.fPushAmount > 0.0f)
        {
            fPushAmount = damage.fPushAmount;
        }

        float fCritChance = damage.fCritChance + fAdditionalCritChance;
        bool  bCrit       = Random.Range(0.0f, 1.0f) < fCritChance;

        if (IsSpotted())
        {
            bCrit = true;
        }

        float fCritMultiplier = bCrit ? damage.fCritMultiplier + fAdditionalCritMultiplier : 1.0f;

        if (damage.GetSlotType() == MinionSlotType.MELEE)
        {
            fMultiplier *= GetMeleeDamageModifierFromDebuffs();
        }
        if (damage.GetSlotType() == MinionSlotType.RANGED)
        {
            OnRangedHit();
        }

        fMultiplier *= GetDamageModifierFromDebuffs();

        // Give vampiric health to players
        Core.GetCurrentRoster().HealGroup(damage.GetSlotType(), (damage.fAmount + fAdditionalDamage) * fMultiplier * fCritMultiplier * fVampirism);

        if (damage.onHitEffect != null)
        {
            damage.onHitEffect.OnTriggered(null, null);
        }

        int iDamage = Mathf.FloorToInt((damage.fAmount + fAdditionalDamage) * fMultiplier * fCritMultiplier);

        if (bCrit)
        {
            Core.IncrementStat("CRITICAL_HITS", 1);
        }
        Core.IncrementStat("DAMAGE_DEALT", iDamage);
        if (iDamage >= 500)
        {
            Core.TriggerAchievement(damage.GetSlotType() == MinionSlotType.MELEE ? "BRUTAL" : "SNIPER");
        }

        MakeDamageNumbers(iDamage, bCrit ? Core.GetMinionTemplateManager().criticalDamage : Core.GetMinionTemplateManager().enemyDamage);

        bool bDead = minion.Damage(damage, fMultiplier * fCritMultiplier, fAdditionalDamage);

        if (bDead)
        {
            minion.template.OnDeath(this);
            Core.GetLevel().EnemyDied(this);
            render.PlayDeathAnimation();
            render.transform.SetParent(null);
            Destroy(gameObject);
        }

        return(bDead);
    }