public virtual GameObject adapt(GameObject entity) { // attach extra abilities if necessary if (extraAbilities.Count > 0) { AbilityList list = entity.GetComponent <AbilityList>(); AbilityRangeList rangeList = entity.GetComponent <AbilityRangeList>(); AbilityMutatorManager mutatorManager = null; bool addChargeManager = false; // check that there is an ability list and ability range list if (list && rangeList) { // add each ability in order foreach (ExtraAbility extra in extraAbilities) { // add the new ability if (extra.lowPriority) { list.abilities.Add(extra.ability); } else { list.AddAbilityToStart(extra.ability); } // add the ranges to use the ability at AbilityRangeList.AbilityRanges abilityRanges = new AbilityRangeList.AbilityRanges(); abilityRanges.minRange = extra.minRange; abilityRanges.engageRange = extra.engageRange; abilityRanges.maxRange = extra.maxRange; abilityRanges.persuitRange = extra.persuitRange; if (extra.lowPriority) { rangeList.ranges.Add(abilityRanges); } else { rangeList.addRangeToStart(abilityRanges); } // if the ability has a cooldown add a mutator for it unless one already exists, in which case change the cooldown on it if (extra.addedCharges + extra.ability.maxCharges != 0) { addChargeManager = true; if (!mutatorManager) { mutatorManager = entity.GetComponent <AbilityMutatorManager>(); } if (!mutatorManager) { mutatorManager = entity.AddComponent <AbilityMutatorManager>(); } // get a reference to, or add, a mutator AbilityMutator myMutator = null; List <AbilityMutator> mutators = mutatorManager.getMutators(extra.ability); if (mutators != null && mutators.Count > 0) { myMutator = mutators[0]; } else { myMutator = entity.AddComponent <GenericMutator>(); myMutator.changeAbility(extra.ability); } // replace the cooldown on the mutator myMutator.addedCharges = extra.addedCharges; myMutator.addedChargeRegen = extra.addedChargeRegen; } } } if (addChargeManager) { if (!entity.GetComponent <ChargeManager>()) { entity.AddComponent <ChargeManager>(); } //check if a null ability needs to be added bool needsNull = false; foreach (ExtraAbility extra in extraAbilities) { if (extra.lowPriority) { if (extra.addedCharges + extra.ability.maxCharges != 0) { needsNull = true; } else { needsNull = false; } } } if (needsNull && !list.abilities.Contains(AbilityIDList.getAbility(AbilityID.nullAbility))) { list.abilities.Add(AbilityIDList.getAbility(AbilityID.nullAbility)); float highestRange = 0f; foreach (AbilityRangeList.AbilityRanges range in rangeList.ranges) { if (range.persuitRange > highestRange) { highestRange = range.persuitRange; } } AbilityRangeList.AbilityRanges ranges = new AbilityRangeList.AbilityRanges(highestRange, 1f, 0.5f, 0f); rangeList.ranges.Add(ranges); } } } // add retaliators if necessary if (retaliators.Count > 0) { foreach (Retaliator retal in retaliators) { GameObject retalObj = new GameObject(); retalObj.transform.parent = entity.transform; retalObj.transform.localPosition = Vector3.zero; RetaliateWhenParentHit retalComponent = retalObj.AddComponent <RetaliateWhenParentHit>(); retalComponent.ability = retal.ability; retalComponent.sourceOfAbility = RetaliateWhenParentHit.SourceOfAbilityObjectConstructor.Parent; retalComponent.damageTakenTrigger = retal.threshold; retalComponent.damageTakenSinceTrigger = retal.startingDamage; } } return(entity); }
public override GameObject Mutate(GameObject abilityObject, Vector3 location, Vector3 targetLocation) { // add additional duration if (increasedDuration != 0) { DestroyAfterDuration durationObject = abilityObject.GetComponent <DestroyAfterDuration>(); if (durationObject != null) { durationObject.duration *= (1 + increasedDuration); } } // set damage threshold if (additionalRetaliations != 0) { RetaliateWhenParentHit retaliator = abilityObject.GetComponent <RetaliateWhenParentHit>(); if (retaliator) { retaliator.retaliationsRemaining += additionalRetaliations; } } // add dark blade retaliation if (darkBladeRetaliationChance > 0) { if (Random.Range(0f, 1f) < darkBladeRetaliationChance) { RetaliateWhenParentHit retaliator = abilityObject.AddComponent <RetaliateWhenParentHit>(); retaliator.limitRetaliations = true; retaliator.onlyCountHitDamage = true; retaliator.ability = Ability.getAbility(AbilityID.darkBlade); retaliator.damageTakenTrigger = 1; retaliator.destroyAfterLastRetaliation = false; retaliator.sourceOfAbility = RetaliateWhenParentHit.SourceOfAbilityObjectConstructor.Parent; retaliator.retaliationsRemaining = 1; } } // stats while prepped if (statsWhilePrepped != null && statsWhilePrepped.Count > 0) { BuffParent bp = abilityObject.GetComponent <BuffParent>(); if (!bp) { bp = abilityObject.AddComponent <BuffParent>(); } List <TaggedStatsHolder.TaggableStat> stats = new List <TaggedStatsHolder.TaggableStat>(); foreach (TaggedStatsHolder.TaggableStat stat in statsWhilePrepped) { TaggedStatsHolder.TaggableStat newStat = new TaggedStatsHolder.TaggableStat(stat); stats.Add(newStat); } bp.taggedStats.AddRange(stats); } return(abilityObject); }