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); }
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); }
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); }
// 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); }
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); }
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); }
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); }