public override GameObject Mutate(GameObject abilityObject, Vector3 location, Vector3 targetLocation)
    {
        // get a reference to the child's SummonEntityOnDeath component, this the component that makes the wolf
        SummonEntityOnDeath summoner = abilityObject.GetComponent <SummonEntityOnDeath>();

        // add additional duration
        summoner.duration += additionalDuration;

        // add additional stats
        summoner.statList.AddRange(statList);
        summoner.limit = 3 + additionalSkeletons;

        // change limit type
        if (limitDuration)
        {
            summoner.limitNumber   = false;
            summoner.limitDuration = true;
        }

        // change the adapter
        SkeletonAdapter adapter = abilityObject.AddComponent <SkeletonAdapter>();

        adapter.tempStats = tempStats;

        return(abilityObject);
    }
Example #2
0
    public override GameObject Mutate(GameObject abilityObject, Vector3 location, Vector3 targetLocation)
    {
        // get a reference to the child's SummonEntityOnDeath component, this the component that makes the wolf
        SummonEntityOnDeath summoner = abilityObject.GetComponent <SummonEntityOnDeath>();

        // add additional duration
        summoner.duration += additionalDuration;

        // add additional stats
        summoner.statList.AddRange(statList);
        summoner.limit = 3 + additionalSkeletons;

        // change limit type
        if (limitDuration)
        {
            summoner.limitNumber   = false;
            summoner.limitDuration = true;
        }

        // change the adapter
        SkeletonAdapter adapter = abilityObject.AddComponent <SkeletonAdapter>();

        adapter.tempStats = tempStats;

        // add extra abilities
        if (usesDeathSlash)
        {
            adapter.extraAbilities.Add(new EntityAdapter.ExtraAbility(AbilityIDList.getAbility(AbilityID.deathSlash), 1, 0.2f * (1 + increasedDeathSlashCooldownRecovery), 0f, 1.2f, 1.6f, 11.8f, false));
        }

        return(abilityObject);
    }
Example #3
0
    public override GameObject Mutate(GameObject abilityObject, Vector3 location, Vector3 targetLocation)
    {
        // get a reference to the child's SummonEntityOnDeath component, this the component that makes the wolf
        SummonEntityOnDeath summoner = abilityObject.GetComponent <SummonEntityOnDeath>();

        ThornTotemAdapter adapter = abilityObject.AddComponent <ThornTotemAdapter>();

        // add a poison cloud on death if necessary
        if (poisonCloudChance > 0)
        {
            adapter.poisonCloudChance = poisonCloudChance;
        }

        // adapter variables
        adapter.extraProjectiles                = extraProjectiles;
        adapter.homing                          = homing;
        adapter.chanceForDoubleDamage           = chanceForDoubleDamage;
        adapter.chanceToShredArmour             = chanceToShredArmour;
        adapter.chanceToPoison                  = chanceToPoison;
        adapter.reducedSpread                   = reducedSpread;
        adapter.increasedThornTotemAttackDamage = increasedThornTotemAttackDamage;
        adapter.targetsToPierce                 = targetsToPierce;
        adapter.increasedSpeed                  = increasedSpeed;


        // add additional duration
        summoner.duration += additionalDuration;

        // set the maximum number of totems
        summoner.limit = totemLimit;

        return(abilityObject);
    }
Example #4
0
    // Use this for initialization
    protected override void Awake()
    {
        ability = AbilityIDList.getAbility(AbilityID.summonWraith);
        health  = GetComponent <BaseHealth>();
        mana    = GetComponent <BaseMana>();

        if (health)
        {
            statBuffs = Comp <StatBuffs> .GetOrAdd(gameObject);

            tracker = Comp <SummonTracker> .GetOrAdd(gameObject);

            AbilityEventListener listener = Comp <AbilityEventListener> .GetOrAdd(gameObject);

            listener.onCritEvent += OnCrit;
        }

        // get wraith prefabs
        if (flameWraithPrefab == null)
        {
            Ability wraithAbility = Ability.getAbility(AbilityID.summonFlameWraith);
            if (wraithAbility && wraithAbility.abilityPrefab)
            {
                SummonEntityOnDeath summon = wraithAbility.abilityPrefab.GetComponent <SummonEntityOnDeath>();
                if (summon)
                {
                    flameWraithPrefab = summon.entity;
                }
            }

            wraithAbility = Ability.getAbility(AbilityID.summonPutridWraith);
            if (wraithAbility && wraithAbility.abilityPrefab)
            {
                SummonEntityOnDeath summon = wraithAbility.abilityPrefab.GetComponent <SummonEntityOnDeath>();
                if (summon)
                {
                    putridWraithPrefab = summon.entity;
                }
            }

            wraithAbility = Ability.getAbility(AbilityID.summonBloodWraith);
            if (wraithAbility && wraithAbility.abilityPrefab)
            {
                SummonEntityOnDeath summon = wraithAbility.abilityPrefab.GetComponent <SummonEntityOnDeath>();
                if (summon)
                {
                    bloodWraithPrefab = summon.entity;
                }
            }
        }

        // spirit escape prefab
        if (spiritEscapePrefab == null)
        {
            spiritEscapePrefab = PrefabList.getPrefab("spiritEscape");
        }

        base.Awake();
    }
    public override GameObject Mutate(GameObject abilityObject, Vector3 location, Vector3 targetLocation)
    {
        if (extraVines > 0)
        {
            SummonEntityOnDeath component = abilityObject.GetComponent <SummonEntityOnDeath>();
            if (component)
            {
                component.numberToSummon += extraVines;
                component.distance        = 0.5f;
            }
        }

        return(abilityObject);
    }
    public override GameObject Mutate(GameObject abilityObject, Vector3 location, Vector3 targetLocation)
    {
        // get a reference to the child's SummonEntityOnDeath component, this the component that makes the wolf
        SummonEntityOnDeath summoner = abilityObject.GetComponent <SummonEntityOnDeath>();

        // add additional stats
        summoner.statList.AddRange(statList);

        // change the adapter
        BloodWraithAdapter adapter = abilityObject.AddComponent <BloodWraithAdapter>();

        adapter.increasedSize = increasedSize;

        return(abilityObject);
    }
    public override GameObject Mutate(GameObject abilityObject, Vector3 location, Vector3 targetLocation)
    {
        // get a reference to the child's SummonEntityOnDeath component, this the component that makes the wolf
        SummonEntityOnDeath summoner = abilityObject.GetComponent <SummonEntityOnDeath>();

        // add additional duration
        summoner.duration += additionalDuration;

        // add additional stats
        summoner.statList.AddRange(statList);
        summoner.limit = 3 + additionalSkeletons;

        // change the limit type
        if (limitDuration)
        {
            summoner.limitNumber   = false;
            summoner.limitDuration = true;
        }

        SkeletonArcherAdapter adapter = abilityObject.AddComponent <SkeletonArcherAdapter>();

        adapter.tempStats.AddRange(tempStats);
        adapter.pierces         = poisonArrowPierces;
        adapter.inaccurate      = poisonArrowInaccurate;
        adapter.increasedDamage = poisonArrowIncreasedDamage;
        adapter.delayedAttacks  = poisonArrowDelayedAttacks;
        adapter.usesPoisonArrow = usesPoisonArrow;

        // add extra abilities
        if (usesMultishot)
        {
            adapter.extraAbilities.Add(new EntityAdapter.ExtraAbility(AbilityIDList.getAbility(AbilityID.multishot), 1, 0.17f * (1 + increasedMultishotCooldownSpeed), 0f, 8f, 9f, 11.8f, false));
        }

        // avoid dividing by 0
        if (increasedPoisonArrowCooldown == -1)
        {
            increasedPoisonArrowCooldown = -0.9f;
        }

        // add extra abilities
        if (usesPoisonArrow)
        {
            adapter.extraAbilities.Add(new EntityAdapter.ExtraAbility(AbilityIDList.getAbility(AbilityID.poisonArrow), 1, 0.25f * (1 + increasedPoisonArrowCooldownSpeed) / (1 + increasedPoisonArrowCooldown), 0f, 8f, 9f, 11.8f, false));
        }

        return(abilityObject);
    }
Example #8
0
    public override GameObject Mutate(GameObject abilityObject, Vector3 location, Vector3 targetLocation)
    {
        // get a reference to the child's SummonEntityOnDeath component, this the component that makes the wolf
        SummonEntityOnDeath summoner = abilityObject.GetComponent <SummonEntityOnDeath>();

        SprigganAdapter adapter = abilityObject.AddComponent <SprigganAdapter>();

        if (castsEntanglingRoots)
        {
            adapter.extraAbilities.Add(new EntityAdapter.ExtraAbility(AbilityIDList.getAbility(AbilityID.entanglingRoots), 1f, (1f / baseRootsCooldown) * (1 + rootsCooldownRecovery), 0f, 5f, 6f, 11f, false));
        }

        if (summonsVines)
        {
            adapter.extraAbilities.Add(new EntityAdapter.ExtraAbility(AbilityIDList.getAbility(AbilityID.summonVineAtTarget), 1f, (1f / baseVineCooldown) * (1 + vineCooldownRecovery) / (1 + increasedVineCooldown), 0f, 9f, 10f, 11f, false));
        }


        adapter.extraLeafShieldStats = new List <TaggedStatsHolder.TaggableStat>();
        adapter.extraLeafShieldStats.AddRange(extraLeafShieldStats);

        // vale orb
        adapter.orbExtraProjectiles          = orbExtraProjectiles;
        adapter.orbTargetsToPierce           = orbTargetsToPierce;
        adapter.orbIncreasedCastSpeed        = orbIncreasedCastSpeed;
        adapter.orbFireInSequence            = orbFireInSequence;
        adapter.orbChanceForDoubleDamage     = orbChanceForDoubleDamage;
        adapter.orbIncreasedDamage           = orbIncreasedDamage;
        adapter.orbMoreDamageAgainstPoisoned = orbMoreDamageAgainstPoisoned;
        adapter.orbMoreDamageAgainstBleeding = orbMoreDamageAgainstBleeding;

        // entangling roots
        adapter.castsEntanglingRoots   = castsEntanglingRoots;
        adapter.rootsIncreasedDamage   = rootsIncreasedDamage;
        adapter.rootsIncreasedRadius   = rootsIncreasedRadius;
        adapter.rootsAddedPatches      = rootsAddedPatches;
        adapter.rootsPatchesInLine     = rootsPatchesInLine;
        adapter.rootsVineOnKillChance  = rootsVineOnKillChance;
        adapter.rootsIncreasedDuration = rootsIncreasedDuration;
        adapter.rootsHealingNovaChance = rootsHealingNovaChance;

        // vines
        adapter.summonsVines = summonsVines;
        adapter.extraVines   = extraVines;

        return(abilityObject);
    }
    public override GameObject Mutate(GameObject abilityObject, Vector3 location, Vector3 targetLocation)
    {
        // get a reference to the child's SummonEntityOnDeath component, this the component that makes the wolf
        SummonEntityOnDeath summoner = abilityObject.GetComponent <SummonEntityOnDeath>();

        BearAdapter adapter = abilityObject.AddComponent <BearAdapter>();

        // give the wolf weak leap if necessary
        if (thornBear)
        {
            adapter.thornBear = true;

            // Add ability
            if (thornCooldown > 0)
            {
                adapter.extraAbilities.Add(new EntityAdapter.ExtraAbility(AbilityIDList.getAbility(AbilityID.thornTotemAttack), 1f, 1f / thornCooldown, 2f, 7f, 8f, 11f, false));
            }
            else
            {
                adapter.extraAbilities.Add(new EntityAdapter.ExtraAbility(AbilityIDList.getAbility(AbilityID.thornTotemAttack), 0, 0, 0, 7f, 8f, 11f, false));
            }
            adapter.ThornAttackChanceToShredArmour   = ThornAttackChanceToShredArmour;
            adapter.ThornAttackChanceForDoubleDamage = ThornAttackChanceForDoubleDamage;
            adapter.thornAttackEnemiesToPierce       = thornAttackEnemiesToPierce;
        }

        if (usesSwipe)
        {
            // Add ability
            adapter.extraAbilities.Add(new EntityAdapter.ExtraAbility(AbilityIDList.getAbility(AbilityID.swipe), 1, 0.2f * (1 + increasedSwipeCooldownRecovery), 0, 1f, 1.3f, 4f, false));
            adapter.swipes = usesSwipe;
        }

        if (Retaliates)
        {
            adapter.retaliates = true;
            adapter.retaliators.Add(new EntityAdapter.Retaliator(AbilityIDList.getAbility(AbilityID.thornBurst), Mathf.RoundToInt(75f * (1f - percentReducedRetaliationThreshold)), Mathf.RoundToInt(75f * (1f - percentReducedRetaliationThreshold) * 0.75f)));
            adapter.thornBurstAddedSpeed  = thornBurstAddedSpeed;
            adapter.thornBurstBleedChance = thornBurstBleedChance;
        }

        adapter.thornPoisonChance     = thornPoisonChance;
        adapter.clawTotemOnKillChance = clawTotemOnKillChance;

        return(abilityObject);
    }
Example #10
0
    public override GameObject Mutate(GameObject abilityObject, Vector3 location, Vector3 targetLocation)
    {
        // get a reference to the child's SummonEntityOnDeath component, this the component that makes the wolf
        SummonEntityOnDeath summoner = abilityObject.GetComponent <SummonEntityOnDeath>();

        // add additional duration
        summoner.duration += additionalDuration;

        // add additional stats
        summoner.statList.AddRange(statList);
        summoner.limit = wolfLimit + extraWolvesFromItems;

        // there are a limitted number of wolves then apply the wolf limit
        if (limittedWolfDuration)
        {
            summoner.limitNumber   = false;
            summoner.limitDuration = true;
        }

        // if the wolves don't follow, then stop them following
        if (dontFollow)
        {
            summoner.followsCreator = false;
        }

        WolfAdapter adapter = abilityObject.AddComponent <WolfAdapter>();

        adapter.retaliatesWithLightning = retaliatesWithLightning;

        // give the wolf weak leap if necessary
        if (leaps)
        {
            adapter.extraAbilities.Add(new EntityAdapter.ExtraAbility(AbilityIDList.getAbility(AbilityID.fastWeakLeap), 0,
                                                                      -AbilityIDList.getAbility(AbilityID.fastWeakLeap).chargesGainedPerSecond + 0.1f * (1 + increasedLeapCooldownRecovery), 5f, 11f, 11.6f, 11.8f, false));
        }

        // give the wolf lightning retaliation if necessary
        if (retaliatesWithLightning)
        {
            adapter.retaliators.Add(new EntityAdapter.Retaliator(AbilityIDList.getAbility(AbilityID.lightning), 50, 0));
        }

        return(abilityObject);
    }
Example #11
0
    public override GameObject Mutate(GameObject abilityObject, Vector3 location, Vector3 targetLocation)
    {
        // get a reference to the child's SummonEntityOnDeath component, this the component that makes the wolf
        SummonEntityOnDeath summoner = abilityObject.GetComponent <SummonEntityOnDeath>();

        // add additional stats
        summoner.statList.AddRange(statList);

        // crit on cast buff
        if (critFromManaCost && mana && statBuffs)
        {
            TaggedStatsHolder.TaggableStat stat = new TaggedStatsHolder.TaggableStat(Tags.Properties.CriticalChance, null);
            stat.increasedValue = mana.getManaCost(ability) * 0.01f;

            statBuffs.addTaggedBuff(new TaggedBuff(stat, 4f, "Summon wraith mana crit"));
        }

        // add corpse consumption stats
        bool corpseConsumed = false;

        if (corpseStatList != null && corpseStatList.Count > 0 && health && health.alignmentManager && health.alignmentManager.alignment != null)
        {
            float closestDistance = float.MaxValue;
            Dying closestDying    = null;
            float distance        = 0f;

            // check all corpses to find the closest
            foreach (Dying dying in Dying.all)
            {
                // check that the entity is dying and is an enemy
                if (dying.isDying() && dying.myHealth && dying.myHealth.alignmentManager && health.alignmentManager.alignment.foes.Contains(dying.myHealth.alignmentManager.alignment))
                {
                    // find the distance
                    distance = Maths.manhattanDistance(dying.transform.position, targetLocation);
                    // don't consume very distant corpses
                    if (distance <= 8f)
                    {
                        // if a closest one hasn't been found yet this is the closest
                        if (closestDying == null)
                        {
                            closestDying    = dying;
                            closestDistance = distance;
                        }
                        // otherwise compare distances
                        else
                        {
                            if (distance < closestDistance)
                            {
                                closestDying    = dying;
                                closestDistance = distance;
                            }
                        }
                    }
                }
            }

            // consume the closest corpse
            if (closestDying)
            {
                closestDying.setDelays(0f, 0f);
                corpseConsumed = true;
                // apply the stats
                summoner.statList.AddRange(corpseStatList);
                // create a death vfx
                Instantiate(spiritEscapePrefab).transform.position = closestDying.transform.position + spiritEscapeOffset;
            }
        }



        float realBloodWraithChance = 0f;

        if (corpseConsumed)
        {
            realBloodWraithChance = bloodWraithChance;
        }
        // summon a different type of wraith
        if (flameWraithChance != 0 || realBloodWraithChance != 0 || putridWraithChance != 0)
        {
            float rand = Random.Range(0f, 1f);
            if (rand < flameWraithChance)
            {
                summoner.entity = flameWraithPrefab;
            }
            else if (rand < flameWraithChance + realBloodWraithChance)
            {
                summoner.entity = bloodWraithPrefab;
            }
            else if (rand < flameWraithChance + realBloodWraithChance + putridWraithChance)
            {
                summoner.entity = putridWraithPrefab;
            }
        }

        if (targetting == WraithTargetType.onSpot)
        {
            StartsTowardsTarget component = abilityObject.GetComponent <StartsTowardsTarget>();
            if (component)
            {
                component.active = false;
            }

            if (summoner)
            {
                summoner.distance = 0.5f;
            }
        }

        if (targetting == WraithTargetType.atTarget)
        {
            StartsTowardsTarget component = abilityObject.GetComponent <StartsTowardsTarget>();
            if (component)
            {
                component.active = false;
            }

            abilityObject.AddComponent <StartsAtTarget>();
        }

        // delayed wraith casts
        if (delayedWraiths > 0)
        {
            CastAfterDuration cad = abilityObject.AddComponent <CastAfterDuration>();
            cad.ability        = ability;
            cad.interval       = 0.5f * (1 - reducedWraithInterval);
            cad.limitCasts     = true;
            cad.remainingCasts = delayedWraiths;

            DestroyAfterDuration dad = abilityObject.GetComponent <DestroyAfterDuration>();
            dad.duration = (0.5f * (1 + delayedWraiths)) * (1f - reducedWraithInterval);


            SummonWraithMutator mutator = abilityObject.AddComponent <SummonWraithMutator>();

            // copy stats
            mutator.reducedHealthDrain = reducedHealthDrain;
            mutator.stationary         = stationary;
            mutator.flameWraithChance  = flameWraithChance;
            mutator.bloodWraithChance  = realBloodWraithChance;
            mutator.putridWraithChance = putridWraithChance;

            // wraith prefabs
            mutator.flameWraithPrefab  = flameWraithPrefab;
            mutator.bloodWraithPrefab  = bloodWraithPrefab;
            mutator.putridWraithPrefab = putridWraithPrefab;

            // delayed wraith changes
            mutator.targetting            = WraithTargetType.onSpot;
            mutator.delayedWraiths        = 0;
            mutator.reducedWraithInterval = 0f;
            mutator.critFromManaCost      = false;
            mutator.healOnCrit            = 0f;

            // stats and corpse stats (does not consume multiple corpses)
            mutator.statList.AddRange(statList);
            if (corpseConsumed)
            {
                mutator.statList.AddRange(corpseStatList);
            }
        }

        // change the adapter
        WraithAdapter adapter = abilityObject.AddComponent <WraithAdapter>();

        adapter.reducedHealthDrain = reducedHealthDrain;
        adapter.stationary         = stationary;

        return(abilityObject);
    }