Ejemplo n.º 1
0
        public static Ability AddAbility(this IAbilityContainer obj, AbilityRule rule, params object[] vals)
        {
            var a = new Ability(obj, rule, null, vals);

            obj.Abilities.Add(a);
            return(a);
        }
Ejemplo n.º 2
0
            protected virtual AbilityResourceImpactData[] ComputeResourcesImpacts(IAbilityContainer container)
            {
                if (HasStats == false)
                {
                    return(container.Ability.Main.BaseResourcesImpacts);
                }

                AbilityResourceImpactData[] impacts = new AbilityResourceImpactData[container.Ability.Main.BaseResourcesImpacts.Length];

                for (int i = 0; i < impacts.Length; i++)
                {
                    impacts[i] = new AbilityResourceImpactData(
                        container.Ability.Main.BaseResourcesImpacts[i].ResourceType,
                        Stats.EvaluateAbilitiesResourcesStat(
                            container.Ability.Main.BaseResourcesImpacts[i].ResourceType,
                            container.Ability.Main.BaseResourcesImpacts[i].ResourceChange));
                }

                if (container is EntityEquipable eq)
                {
                    eq.EquippedAbility.ApplyResourcesInfluencesOnImpacts(impacts);
                }

                return(impacts);
            }
Ejemplo n.º 3
0
        private void AddObscurationAbility(IAbilityContainer obj, int level)
        {
            var a = new Ability(obj);

            obj.Abilities.Add(a);
            a.Rule = Mod.Current.AbilityRules.FindByName("Sector - Sight Obscuration");
            a.Values.Add(level.ToString());
        }
Ejemplo n.º 4
0
                public AbilityCastInfos(IAbilityContainer container)
                {
                    if (container is EntityEquipable eq)
                    {
                        _equipable = eq;
                    }

                    _ability      = container.Ability;
                    _lastCastTime = Time.time;
                }
Ejemplo n.º 5
0
 public float GetAbilityCooldownProgress(IAbilityContainer ability)
 {
     if (_abilityCastInfos.ContainsKey(ability))
     {
         return(Mathf.Clamp(Time.time - _abilityCastInfos[ability].LastCastTime / ability.AbilityCooldown, 0f, 1f));
     }
     else
     {
         return(1f);
     }
 }
Ejemplo n.º 6
0
        public AbilityCastData(Entity caster, IAbilityContainer container, float castTime = -1f, int multiCastID = 0)
        {
            _abilityCast = container.Ability;
            _caster      = caster;
            _castTime    = castTime < 0f ? Time.time : castTime;
            _multiCastID = multiCastID;

            if (container is EntityEquipable eq)
            {
                _castingEquipable = eq;
            }
        }
Ejemplo n.º 7
0
            protected IEnumerator TriggerBurstAbilityCoroutine(IAbilityContainer container)
            {
                int   triggerCount = 0;
                float counter      = container.AbilityTriggerData.BurstPeriod;

                while (triggerCount < container.AbilityTriggerData.BurstCount)
                {
                    counter += Time.deltaTime;

                    while (counter > container.AbilityTriggerData.BurstPeriod)
                    {
                        TriggerAbility_Single(container);
                        counter -= container.AbilityTriggerData.BurstPeriod;
                        triggerCount++;
                    }
                    yield return(null);
                }
            }
Ejemplo n.º 8
0
 protected void TriggerAbility_Single(IAbilityContainer container)
 {
     if (container.ContainsAbility == false)
     {
         return;
     }
     if (container.AbilityTriggerData.MultiCastCount > 1)
     {
         for (int i = 0; i < container.AbilityTriggerData.MultiCastCount; i++)
         {
             CastAbility(container, i);
         }
     }
     else
     {
         CastAbility(container);
     }
 }
Ejemplo n.º 9
0
            protected void TriggerAbility(IAbilityContainer container)
            {
                if (container.ContainsAbility == false)
                {
                    return;
                }
                switch (container.AbilityTriggerData.TriggerMethod)
                {
                case AbilityTriggerMethod.Single:
                case AbilityTriggerMethod.Automatic:
                    TriggerAbility_Single(container);
                    break;

                case AbilityTriggerMethod.Burst:
                    master.StartCoroutine(TriggerBurstAbilityCoroutine(container));
                    break;
                }
            }
Ejemplo n.º 10
0
 protected void TryTriggerAbility(IAbilityContainer container)
 {
     if (container.ContainsAbility == false)
     {
         return;
     }
     if (_abilityCastInfos.ContainsKey(container))
     {
         if (Time.time >= _abilityCastInfos[container].LastCastTime + container.AbilityCooldown)
         {
             _abilityCastInfos[container].Cast();
             TriggerAbility(container);
         }
     }
     else
     {
         _abilityCastInfos.Add(container, new AbilityCastInfos(container));
         TriggerAbility(container);
     }
 }
Ejemplo n.º 11
0
            protected void CastAbility(IAbilityContainer container, Vector3 castDirection, int multiCastID)
            {
                if (container.ContainsAbility == false)
                {
                    return;
                }
                AbilityData     ability  = container.Ability;
                AbilityCastData castData = new AbilityCastData(master, container, -1, multiCastID);

                _activeCastData = castData;
                castData.FillBase(
                    ComputeResourcesImpacts(container),
                    ability.Main.BaseKnockback * (HasStats ? Stats.EvaluateAbilitiesStat(EntityAbilitiesStat.KnockbackInflictedFactor, 1f) : 1f),
                    ability.Main.BaseRecoil / container.AbilityTriggerData.MultiCastCount);

                if (castDirection.sqrMagnitude <= Mathf.Epsilon)
                {
                    castData.FillCastDirection(DetermineCastDirection(castData.AbilityCast, container.AbilityTriggerData));
                }
                else
                {
                    castData.FillCastDirection(castDirection);
                }
                if (castData.AbilityCast.Methods.CastOriginTiming == AbilityCastOriginTiming.CastEntrance)
                {
                    castData.FillOrigin(DetermineCastOrigin(castData.AbilityCast));
                }

                if (castData.AbilityCast.Timing.Instant == true)
                {
                    PerformAbility(castData);
                    _activeCastData = null;
                    _abilityCastTimingsCoroutine = null;
                }
                else
                {
                    master.RestartCoroutine(CastAbilityTimingCoroutine(castData), ref _abilityCastTimingsCoroutine);
                }
            }
Ejemplo n.º 12
0
 public static Ability AddAbility(this IAbilityContainer obj, string abilityName, params object[] vals)
 {
     return(obj.AddAbility(Mod.Current.AbilityRules.Single(r => r.Name == abilityName || r.Aliases.Contains(abilityName)), vals));
 }
Ejemplo n.º 13
0
        /// <summary>
        /// Loads abilities from a record.
        /// </summary>
        /// <param name="rec"></param>
        public static IEnumerable <Ability> Load(string filename, Record rec, IAbilityContainer obj)
        {
            int count = 0;
            int index = -1;

            while (true)
            {
                count++;

                var abil = new Ability(obj);

                var nfield = rec.FindField(new string[]
                {
                    "Ability " + count + " Type",
                    "Ability Type"
                }, ref index, false, index + 1);
                if (nfield == null)
                {
                    break;                     // no more abilities
                }
                var abilname = nfield.CreateFormula <string>(abil).Value;

                lock (Mod.Current.AbilityRules)
                {
                    var rules = Mod.Current.AbilityRules.Where(r => r.Matches(abilname)).ToArray();
                    if (rules.Count() > 1)
                    {
                        Mod.Errors.Add(new DataParsingException("Ambiguous ability name match for " + abilname + " alias between the following abilities: " + string.Join(", ", rules.Select(r => r.Name).ToArray()) + ".", filename, rec));
                        continue;
                    }
                    else if (rules.Count() == 0)
                    {
                        // create an ad hoc ability rule
                        abil.Rule = new AbilityRule {
                            Name = abilname
                        };
                        Mod.Current.AbilityRules.Add(abil.Rule);
                    }
                    else
                    {
                        abil.Rule = rules.Single();
                    }

                    abil.Description = rec.Get <string>(new string[] { "Ability " + count + " Descr", "Ability Descr" }, obj);

                    int valnum = 0;
                    int idx    = -1;
                    while (true)
                    {
                        valnum++;

                        var vfield = rec.FindField(new string[]
                        {
                            "Ability " + count + " Val " + valnum,
                            "Ability " + count + " Val",
                            "Ability Val " + valnum,
                            "Ability Val"
                        }, ref idx, false, idx + 1);
                        if (vfield == null)
                        {
                            break;
                        }
                        var val = vfield.CreateFormula <string>(abil);
                        abil.Values.Add(val);
                    }
                }

                yield return(abil);
            }
        }
Ejemplo n.º 14
0
 protected void CastAbility(IAbilityContainer container) => CastAbility(container, default, default);
Ejemplo n.º 15
0
 protected void CastAbility(IAbilityContainer container, Vector3 castDirection) => CastAbility(container, castDirection, default);
Ejemplo n.º 16
0
 protected void CastAbility(IAbilityContainer container, int multiCastID) => CastAbility(container, default, multiCastID);