public override GameObject Mutate(GameObject abilityObject, Vector3 location, Vector3 targetLocation) { // add extra projectiles if (extraProjectiles != 0) { ExtraProjectiles extraProjectilesObject = abilityObject.GetComponent <ExtraProjectiles>(); if (extraProjectilesObject == null) { extraProjectilesObject = abilityObject.AddComponent <ExtraProjectiles>(); extraProjectilesObject.numberOfExtraProjectiles = 0; } extraProjectilesObject.numberOfExtraProjectiles += extraProjectiles; } // add pierce if (targetsToPierce > 0) { Pierce pierce = abilityObject.GetComponent <Pierce>(); if (pierce == null) { pierce = abilityObject.AddComponent <Pierce>(); pierce.objectsToPierce = 0; } pierce.objectsToPierce += targetsToPierce; } // increased projectile speed if (increasedSpeed != 0) { AbilityMover am = abilityObject.GetComponent <AbilityMover>(); am.speed *= (1 + increasedSpeed); } if (chanceForDoubleDamage > 0) { float rand = Random.Range(0f, 1f); if (rand < chanceForDoubleDamage) { foreach (DamageStatsHolder holder in abilityObject.GetComponents <DamageStatsHolder>()) { for (int i = 0; i < holder.baseDamageStats.damage.Count; i++) { holder.addBaseDamage(holder.baseDamageStats.damage[i].damageType, holder.getBaseDamage(holder.baseDamageStats.damage[i].damageType)); } } } } if (increasedDamage != 0) { foreach (DamageStatsHolder holder in abilityObject.GetComponents <DamageStatsHolder>()) { holder.increaseAllDamage(increasedDamage); } } if (chanceToShredArmour > 0) { ChanceToApplyStatusOnEnemyHit chanceTo = abilityObject.AddComponent <ChanceToApplyStatusOnEnemyHit>(); chanceTo.chance = chanceToShredArmour; chanceTo.statusEffect = StatusEffectList.getEffect(StatusEffectID.ArmourShred); } if (chanceToPoison > 0) { ChanceToApplyStatusOnEnemyHit chanceTo = abilityObject.AddComponent <ChanceToApplyStatusOnEnemyHit>(); chanceTo.chance = chanceToPoison; chanceTo.statusEffect = StatusEffectList.getEffect(StatusEffectID.Poison); } if (singleProjectile) { ExtraProjectiles extraProjectiles = abilityObject.GetComponent <ExtraProjectiles>(); if (extraProjectiles) { extraProjectiles.numberOfExtraProjectiles = 0; } } else if (reducedSpread != 0) { ExtraProjectiles extraProjectiles = abilityObject.GetComponent <ExtraProjectiles>(); if (extraProjectiles) { extraProjectiles.angle -= reducedSpread; if (extraProjectiles.angle < 0) { extraProjectiles.angle = 0; } } } if (firstProjectileIsAccurate) { RandomiseDirection rd = abilityObject.GetComponent <RandomiseDirection>(); if (rd) { rd.maximumAngleChange = 0; } } if (homing) { abilityObject.AddComponent <HomingMovement>(); } return(abilityObject); }
public override GameObject Mutate(GameObject abilityObject, Vector3 location, Vector3 targetLocation) { firstHit = true; lastTargetPosition = targetLocation; if (movesRandomly) { RandomiseDirection component = abilityObject.AddComponent <RandomiseDirection>(); component.maximumAngleChange = 180f * (1 + increasedRandomisation); component.timeToRandomise = RandomiseDirection.TimeToRandomise.DirectionMode; component.directionChangeInterval = directionChangeInterval; component.boundingAngle = boundingAngle; } if (chanceToPoison > 0) { ChanceToApplyStatusOnEnemyHit newComponent = abilityObject.AddComponent <ChanceToApplyStatusOnEnemyHit>(); newComponent.statusEffect = StatusEffectList.getEffect(StatusEffectID.Poison); newComponent.chance = chanceToPoison; } if (chanceToIgnite > 0) { ChanceToApplyStatusOnEnemyHit chanceTo = abilityObject.AddComponent <ChanceToApplyStatusOnEnemyHit>(); chanceTo.chance = chanceToIgnite; chanceTo.statusEffect = StatusEffectList.getEffect(StatusEffectID.Ignite); } if (chanceToShredArmour > 0) { ChanceToApplyStatusOnEnemyHit chanceTo = abilityObject.AddComponent <ChanceToApplyStatusOnEnemyHit>(); chanceTo.chance = chanceToShredArmour; chanceTo.statusEffect = StatusEffectList.getEffect(StatusEffectID.ArmourShred); } if (addedCritChance != 0) { foreach (DamageStatsHolder damage in abilityObject.GetComponents <DamageStatsHolder>()) { damage.baseDamageStats.critChance += addedCritChance; } } if (addedCritMultiplier != 0) { foreach (DamageStatsHolder damage in abilityObject.GetComponents <DamageStatsHolder>()) { damage.baseDamageStats.critMultiplier += addedCritMultiplier; } } if (cullPercent > 0) { foreach (DamageStatsHolder damage in abilityObject.GetComponents <DamageStatsHolder>()) { damage.baseDamageStats.cullPercent += cullPercent; } } if (increasedDamage != 0) { foreach (DamageStatsHolder holder in abilityObject.GetComponents <DamageStatsHolder>()) { holder.increaseAllDamage(increasedDamage); //holder.addBaseDamage(DamageType.PHYSICAL, holder.getBaseDamage(DamageType.PHYSICAL) * increasedDamage); } } if (addedFireDamage > 0) { foreach (DamageStatsHolder holder in abilityObject.GetComponents <DamageStatsHolder>()) { holder.addBaseDamage(DamageType.FIRE, addedFireDamage); } // change the vfx abilityObject.GetComponent <CreateOnDeath>().objectsToCreateOnDeath.RemoveAt(0); abilityObject.GetComponent <CreateOnDeath>().add(PrefabList.getPrefab("animalSwipeVFXOrange")); } if (addedPhysicalDamage > 0) { foreach (DamageStatsHolder holder in abilityObject.GetComponents <DamageStatsHolder>()) { holder.addBaseDamage(DamageType.PHYSICAL, addedPhysicalDamage); } } if (slows) { AttachAttachableOnEnemyHit newComponent = abilityObject.AddComponent <AttachAttachableOnEnemyHit>(); newComponent.attachable = AbilityIDList.getAbility(AbilityID.slow).abilityPrefab; } if (travels) { // enable the vfx on the ability object itself foreach (Transform child in abilityObject.transform) { if (child.name == "SwipeVFX" && addedFireDamage <= 0) { child.gameObject.SetActive(true); } if (child.name == "SwipeVFXOrange" && addedFireDamage > 0) { child.gameObject.SetActive(true); } } // disable creating the vfx on death abilityObject.GetComponent <CreateOnDeath>().objectsToCreateOnDeath.RemoveAt(0); // set duration abilityObject.GetComponent <DestroyAfterDuration>().duration = 0.18f * (1 + increasedDuration); // set speed abilityObject.GetComponent <AbilityMover>().speed = 12f + addedSpeed; // remove start towards target abilityObject.GetComponent <StartsTowardsTarget>().distance = 0f; // add extra projectiles if (chanceOfExtraProjectiles > 0) { float rand2 = Random.Range(0f, 1f); if (rand2 < chanceOfExtraProjectiles) { ExtraProjectiles extraProjectiles = abilityObject.AddComponent <ExtraProjectiles>(); extraProjectiles.angle = 180f; extraProjectiles.randomAngles = true; } } } return(abilityObject); }