Example #1
0
    public override GameObject Mutate(GameObject abilityObject, Vector3 location, Vector3 targetLocation)
    {
        // increasedDamageToFirstEnemyHit is removed for additional chains, so it can be applied without checks
        if (increasedDamage != 0 || increasedDamageToFirstEnemyHit != 0)
        {
            foreach (DamageStatsHolder holder in abilityObject.GetComponents <DamageStatsHolder>())
            {
                holder.increaseAllDamage(increasedDamage + increasedDamageToFirstEnemyHit);
            }
        }

        if (chains > 0)
        {
            ChainOnHit chain = abilityObject.AddComponent <ChainOnHit>();
            chain.chainsRemaining = chains;
            chain.abilityToChain  = ability;

            // add a copy of this mutator to the ability object, but remove the chains (because it will chain anyway), the increased damage to first enemy hit, and the on cast stuff
            LightningBlastMutator newMutator = abilityObject.AddComponent <LightningBlastMutator>();
            newMutator.chains = 0;
            increasedDamageToFirstEnemyHit   = 0;
            newMutator.increasedDamage       = increasedDamage;
            newMutator.lightningStrikeChance = lightningStrikeChance;
            newMutator.chanceToBlind         = chanceToBlind;

            // add the increased damage per chain
            newMutator.increasedDamage += increasedDamagePerChain;

            // add increased damage to last enemy hit if appropriate
            if (chain.chainsRemaining == 0)
            {
                newMutator.increasedDamage += increasedDamageToLastEnemy;
            }
        }


        // on cast stuff
        if (lightningProtectionOnCast != 0 || elementalProtectionOnCast != 0)
        {
            Buff buff = new Buff();
            TaggedStatsHolder.Stat stat = new TaggedStatsHolder.Stat(Tags.Properties.LightningProtection);
            stat.addedValue        = (lightningProtectionOnCast + elementalProtectionOnCast) * (1 + increasedProtectionOnCast);
            buff.stat              = stat;
            buff.remainingDuration = 3 * (1 + increasedProtectionDuration);
            statBuffs.addBuff(buff);
        }

        if (elementalProtectionOnCast != 0)
        {
            Buff buff = new Buff();
            TaggedStatsHolder.Stat stat = new TaggedStatsHolder.Stat(Tags.Properties.ColdProtection);
            stat.addedValue        = (elementalProtectionOnCast) * (1 + increasedProtectionOnCast);
            buff.stat              = stat;
            buff.remainingDuration = 3 * (1 + increasedProtectionDuration);
            statBuffs.addBuff(buff);
        }

        if (elementalProtectionOnCast != 0)
        {
            Buff buff = new Buff();
            TaggedStatsHolder.Stat stat = new TaggedStatsHolder.Stat(Tags.Properties.FireProtection);
            stat.addedValue        = (elementalProtectionOnCast) * (1 + increasedProtectionOnCast);
            buff.stat              = stat;
            buff.remainingDuration = 3 * (1 + increasedProtectionDuration);
            statBuffs.addBuff(buff);
        }

        if (wardOnCast != 0)
        {
            float rand = Random.Range(0f, 1f);
            if (rand < wardOnCastChance)
            {
                protectionClass.currentWard += wardOnCast;
            }
        }

        if (lightningDamageOnCast != 0)
        {
            List <Tags.AbilityTags> tags = new List <Tags.AbilityTags>();
            tags.Add(Tags.AbilityTags.Lightning);
            TaggedStatsHolder.TaggableStat stat = new TaggedStatsHolder.TaggableStat(Tags.Properties.Damage, tags);
            stat.increasedValue = lightningDamageOnCast;
            TaggedBuff buff = new TaggedBuff();
            buff.stat = stat;
            buff.remainingDuration = 3 * (1 + increasedDamageBuffDuration);
            statBuffs.addTaggedBuff(buff);
        }

        if (increasedStunChance != 0)
        {
            foreach (DamageStatsHolder damage in abilityObject.GetComponents <DamageStatsHolder>())
            {
                damage.baseDamageStats.increasedStunChance += increasedStunChance;
            }
        }


        // maybe cast lightning too
        if (lightningStrikeChance > 0)
        {
            float rand = Random.Range(0f, 1f);
            if (rand <= lightningStrikeChance)
            {
                AbilityObjectConstructor aoc = GetComponent <AbilityObjectConstructor>();
                if (aoc)
                {
                    aoc.constructAbilityObject(AbilityIDList.getAbility(AbilityID.lightning), targetLocation, targetLocation);
                }
            }
        }

        // maybe blind
        if (chanceToBlind > 0)
        {
            ChanceToApplyStatusOnEnemyHit ctasoeh = abilityObject.AddComponent <ChanceToApplyStatusOnEnemyHit>();
            ctasoeh.chance       = chanceToBlind;
            ctasoeh.statusEffect = StatusEffectList.getEffect(StatusEffectID.Blind);
        }


        return(abilityObject);
    }
    public override void updateMutator()
    {
        LightningBlastMutator mutator = PlayerFinder.getPlayer().GetComponent <LightningBlastMutator>();


        float increasedManaCost = 0f;
        float increasedDamage   = 0f;
        float increasedDamageToFirstEnemyHit = 0f;
        float increasedDamagePerChain        = 0f;
        float increasedDamageToLastEnemy     = 0f;
        int   chains = 0;
        float lightningProtectionOnCast   = 0f;
        float elementalProtectionOnCast   = 0f;
        float increasedProtectionOnCast   = 0f;
        float increasedProtectionDuration = 0f;
        float wardOnCast                  = 0f;
        float increasedCastSpeed          = 0f;
        float lightningStrikeChance       = 0f;
        float lightningDamageOnCast       = 0f;
        float increasedDamageBuffDuration = 0f;
        float chanceToBlind               = 0f;

        foreach (SkillTreeNode node in GetComponentsInChildren <SkillTreeNode>())
        {
            if (node.name == "Lightning Blast Skill Tree Chain")
            {
                chains            += node.GetComponent <SkillTreeNode>().pointsAllocated;
                increasedManaCost += node.GetComponent <SkillTreeNode>().pointsAllocated * 0.5f;
            }
            if (node.name == "Lightning Blast Skill Tree Chain Slow")
            {
                chains             += node.GetComponent <SkillTreeNode>().pointsAllocated;
                increasedCastSpeed += node.GetComponent <SkillTreeNode>().pointsAllocated * -0.05f;
            }
            // specify "if chains for the maximum number of times" in tooltip
            if (node.name == "Lightning Blast Skill Tree Last Hit")
            {
                increasedDamageToLastEnemy += node.GetComponent <SkillTreeNode>().pointsAllocated * 0.4f;
            }
            if (node.name == "Lightning Blast Skill Tree First Hit")
            {
                increasedDamageToFirstEnemyHit += node.GetComponent <SkillTreeNode>().pointsAllocated * 0.18f;
            }
            if (node.name == "Lightning Blast Skill Tree Damage Per Chain")
            {
                increasedDamagePerChain += node.GetComponent <SkillTreeNode>().pointsAllocated * 0.05f;
            }
            if (node.name == "Lightning Blast Skill Tree Ele Protection")
            {
                elementalProtectionOnCast += node.GetComponent <SkillTreeNode>().pointsAllocated * 10f;
            }
            if (node.name == "Lightning Blast Skill Tree Cast Speed")
            {
                increasedCastSpeed += node.GetComponent <SkillTreeNode>().pointsAllocated * 0.06f;
            }
            if (node.name == "Lightning Blast Skill Tree Chance To Blind")
            {
                chanceToBlind += node.GetComponent <SkillTreeNode>().pointsAllocated * 0.1f;
            }
            if (node.name == "Lightning Blast Skill Tree Lightning Protection")
            {
                lightningProtectionOnCast += node.GetComponent <SkillTreeNode>().pointsAllocated * 30f;
            }
            if (node.name == "Lightning Blast Skill Tree Increased Protection")
            {
                increasedProtectionOnCast += node.GetComponent <SkillTreeNode>().pointsAllocated * 0.2f;
            }
            if (node.name == "Lightning Blast Skill Tree Protection Duration")
            {
                increasedProtectionDuration += node.GetComponent <SkillTreeNode>().pointsAllocated * 0.25f;
            }
            if (node.name == "Lightning Blast Skill Tree Ward On Cast")
            {
                wardOnCast += node.GetComponent <SkillTreeNode>().pointsAllocated * 5f;
            }
            if (node.name == "Lightning Blast Skill Tree Lightning Damage On Cast")
            {
                lightningDamageOnCast += node.GetComponent <SkillTreeNode>().pointsAllocated * 0.05f;
            }
            if (node.name == "Lightning Blast Skill Tree Lightning Damage Duration")
            {
                increasedDamageBuffDuration += node.GetComponent <SkillTreeNode>().pointsAllocated * 0.25f;
            }
            if (node.name == "Lightning Blast Skill Tree Increased Damage")
            {
                lightningDamageOnCast += node.GetComponent <SkillTreeNode>().pointsAllocated * 0.1f;
            }
            if (node.name == "Lightning Blast Skill Tree Lightning Strike Chance")
            {
                lightningStrikeChance += node.GetComponent <SkillTreeNode>().pointsAllocated * 0.17f;
            }
            if (node.name == "Lightning Blast Skill Tree No Cost")
            {
                if (node.GetComponent <SkillTreeNode>().pointsAllocated > 0)
                {
                    increasedManaCost -= 100f;
                    increasedDamage   -= 0.25f;
                }
            }
        }

        mutator.increasedManaCost = increasedManaCost;
        mutator.increasedDamage   = increasedDamage;
        mutator.increasedDamageToFirstEnemyHit = increasedDamageToFirstEnemyHit;
        mutator.increasedDamagePerChain        = increasedDamagePerChain;
        mutator.increasedDamageToLastEnemy     = increasedDamageToLastEnemy;
        mutator.chains = chains;
        mutator.lightningProtectionOnCast   = lightningProtectionOnCast;
        mutator.elementalProtectionOnCast   = elementalProtectionOnCast;
        mutator.increasedProtectionOnCast   = increasedProtectionOnCast;
        mutator.increasedProtectionDuration = increasedProtectionDuration;
        mutator.wardOnCast                  = wardOnCast;
        mutator.increasedCastSpeed          = increasedCastSpeed;
        mutator.lightningStrikeChance       = lightningStrikeChance;
        mutator.lightningDamageOnCast       = lightningDamageOnCast;
        mutator.increasedDamageBuffDuration = increasedDamageBuffDuration;
        mutator.chanceToBlind               = chanceToBlind;
    }