Exemplo n.º 1
0
        public float GetAfflictionOverlayMultiplier()
        {
            //If the overlay's alpha progresses linearly, then don't worry about affliction effects.
            if (Prefab.AfflictionOverlayAlphaIsLinear)
            {
                return(Strength / Prefab.MaxStrength);
            }
            if (Strength < Prefab.ActivationThreshold)
            {
                return(0.0f);
            }
            AfflictionPrefab.Effect currentEffect = GetActiveEffect();
            if (currentEffect == null)
            {
                return(0.0f);
            }
            if (currentEffect.MaxAfflictionOverlayAlphaMultiplier - currentEffect.MinAfflictionOverlayAlphaMultiplier < 0.0f)
            {
                return(0.0f);
            }

            return(MathHelper.Lerp(
                       currentEffect.MinAfflictionOverlayAlphaMultiplier,
                       currentEffect.MaxAfflictionOverlayAlphaMultiplier,
                       (Strength - currentEffect.MinStrength) / (currentEffect.MaxStrength - currentEffect.MinStrength)));
        }
Exemplo n.º 2
0
        public virtual void Update(CharacterHealth characterHealth, Limb targetLimb, float deltaTime)
        {
            AfflictionPrefab.Effect currentEffect = Prefab.GetActiveEffect(Strength);
            if (currentEffect == null)
            {
                return;
            }

            Strength += currentEffect.StrengthChange * deltaTime;
            foreach (StatusEffect statusEffect in currentEffect.StatusEffects)
            {
                if (statusEffect.HasTargetType(StatusEffect.TargetType.Character))
                {
                    statusEffect.Apply(ActionType.OnActive, deltaTime, characterHealth.Character, characterHealth.Character);
                }
                if (targetLimb != null && statusEffect.HasTargetType(StatusEffect.TargetType.Limb))
                {
                    statusEffect.Apply(ActionType.OnActive, deltaTime, characterHealth.Character, targetLimb);
                }
                if (targetLimb != null && statusEffect.HasTargetType(StatusEffect.TargetType.AllLimbs))
                {
                    statusEffect.Apply(ActionType.OnActive, deltaTime, targetLimb.character, targetLimb.character.AnimController.Limbs.Cast <ISerializableEntity>().ToList());
                }
            }
        }
Exemplo n.º 3
0
        public float GetScreenGrainStrength()
        {
            if (Strength < Prefab.ActivationThreshold)
            {
                return(0.0f);
            }
            AfflictionPrefab.Effect currentEffect = GetActiveEffect();
            if (currentEffect == null)
            {
                return(0.0f);
            }
            if (MathUtils.NearlyEqual(currentEffect.MaxGrainStrength, 0f))
            {
                return(0.0f);
            }

            float amount = MathHelper.Lerp(
                currentEffect.MinGrainStrength,
                currentEffect.MaxGrainStrength,
                (Strength - currentEffect.MinStrength) / (currentEffect.MaxStrength - currentEffect.MinStrength)) * GetScreenEffectFluctuation(currentEffect);

            if (Prefab.GrainBurst > 0 && AdditionStrength > amount)
            {
                return(Math.Min(AdditionStrength, 1.0f));
            }

            return(amount);
        }
Exemplo n.º 4
0
        public virtual void Update(CharacterHealth characterHealth, Limb targetLimb, float deltaTime)
        {
            foreach (AfflictionPrefab.PeriodicEffect periodicEffect in Prefab.PeriodicEffects)
            {
                PeriodicEffectTimers[periodicEffect] -= deltaTime;
                if (PeriodicEffectTimers[periodicEffect] <= 0.0f)
                {
                    if (GameMain.NetworkMember != null && GameMain.NetworkMember.IsClient)
                    {
                        PeriodicEffectTimers[periodicEffect] = 0.0f;
                    }
                    else
                    {
                        foreach (StatusEffect statusEffect in periodicEffect.StatusEffects)
                        {
                            ApplyStatusEffect(statusEffect, 1.0f, characterHealth, targetLimb);
                            PeriodicEffectTimers[periodicEffect] = Rand.Range(periodicEffect.MinInterval, periodicEffect.MaxInterval);
                        }
                    }
                }
            }

            AfflictionPrefab.Effect currentEffect = Prefab.GetActiveEffect(Strength);
            if (currentEffect == null)
            {
                return;
            }

            if (currentEffect.StrengthChange < 0) // Reduce diminishing of buffs if boosted
            {
                _strength += currentEffect.StrengthChange * deltaTime * StrengthDiminishMultiplier;
            }
            else // Reduce strengthening of afflictions if resistant
            {
                _strength += currentEffect.StrengthChange * deltaTime * (1f - characterHealth.GetResistance(Prefab.Identifier));
            }
            // Don't use the property, because it's virtual and some afflictions like husk overload it for external use.
            _strength = MathHelper.Clamp(_strength, 0.0f, Prefab.MaxStrength);

            foreach (StatusEffect statusEffect in currentEffect.StatusEffects)
            {
                ApplyStatusEffect(statusEffect, deltaTime, characterHealth, targetLimb);
            }

            float amount = deltaTime;

            if (Prefab.GrainBurst > 0)
            {
                amount /= Prefab.GrainBurst;
            }
            if (PendingAdditionStrenght >= 0)
            {
                AdditionStrength        += amount;
                PendingAdditionStrenght -= deltaTime;
            }
            else if (AdditionStrength > 0)
            {
                AdditionStrength -= amount;
            }
        }
Exemplo n.º 5
0
        public float GetResistance(string afflictionId)
        {
            if (Strength < Prefab.ActivationThreshold)
            {
                return(0.0f);
            }
            AfflictionPrefab.Effect currentEffect = Prefab.GetActiveEffect(Strength);
            if (currentEffect == null)
            {
                return(0.0f);
            }
            if (currentEffect.MaxResistance - currentEffect.MinResistance <= 0.0f)
            {
                return(0.0f);
            }
            if (afflictionId != null && afflictionId != currentEffect.ResistanceFor)
            {
                return(0.0f);
            }

            return(MathHelper.Lerp(
                       currentEffect.MinResistance,
                       currentEffect.MaxResistance,
                       (Strength - currentEffect.MinStrength) / (currentEffect.MaxStrength - currentEffect.MinStrength)));
        }
Exemplo n.º 6
0
        public float GetVitalityDecrease(CharacterHealth characterHealth)
        {
            if (Strength < Prefab.ActivationThreshold)
            {
                return(0.0f);
            }
            AfflictionPrefab.Effect currentEffect = Prefab.GetActiveEffect(Strength);
            if (currentEffect == null)
            {
                return(0.0f);
            }
            if (currentEffect.MaxStrength - currentEffect.MinStrength <= 0.0f)
            {
                return(0.0f);
            }

            float currVitalityDecrease = MathHelper.Lerp(
                currentEffect.MinVitalityDecrease,
                currentEffect.MaxVitalityDecrease,
                (Strength - currentEffect.MinStrength) / (currentEffect.MaxStrength - currentEffect.MinStrength));

            if (currentEffect.MultiplyByMaxVitality)
            {
                currVitalityDecrease *= characterHealth == null ? 100.0f : characterHealth.MaxVitality;
            }

            return(currVitalityDecrease);
        }
Exemplo n.º 7
0
 private float GetScreenEffectFluctuation(AfflictionPrefab.Effect currentEffect)
 {
     if (currentEffect == null || currentEffect.ScreenEffectFluctuationFrequency <= 0.0f)
     {
         return(1.0f);
     }
     return(((float)Math.Sin(fluctuationTimer * MathHelper.TwoPi) + 1.0f) * 0.5f);
 }
Exemplo n.º 8
0
 public float GetSpeedMultiplier()
 {
     if (Strength < Prefab.ActivationThreshold)
     {
         return(1.0f);
     }
     AfflictionPrefab.Effect currentEffect = GetActiveEffect();
     if (currentEffect == null)
     {
         return(1.0f);
     }
     return(MathHelper.Lerp(
                currentEffect.MinSpeedMultiplier,
                currentEffect.MaxSpeedMultiplier,
                (Strength - currentEffect.MinStrength) / (currentEffect.MaxStrength - currentEffect.MinStrength)));
 }
Exemplo n.º 9
0
        private float GetDiminishMultiplier()
        {
            if (Strength < Prefab.ActivationThreshold)
            {
                return(1.0f);
            }
            AfflictionPrefab.Effect currentEffect = Prefab.GetActiveEffect(Strength);
            if (currentEffect == null)
            {
                return(1.0f);
            }

            return(MathHelper.Lerp(
                       currentEffect.MinBuffMultiplier,
                       currentEffect.MaxBuffMultiplier,
                       (Strength - currentEffect.MinStrength) / (currentEffect.MaxStrength - currentEffect.MinStrength)));
        }
Exemplo n.º 10
0
        public Color GetBodyTint()
        {
            if (Strength < Prefab.ActivationThreshold)
            {
                return(Color.TransparentBlack);
            }
            AfflictionPrefab.Effect currentEffect = GetActiveEffect();
            if (currentEffect == null)
            {
                return(Color.TransparentBlack);
            }

            return(Color.Lerp(
                       currentEffect.MinBodyTint,
                       currentEffect.MaxBodyTint,
                       (Strength - currentEffect.MinStrength) / (currentEffect.MaxStrength - currentEffect.MinStrength)));
        }
Exemplo n.º 11
0
        public virtual void Update(CharacterHealth characterHealth, Limb targetLimb, float deltaTime)
        {
            AfflictionPrefab.Effect currentEffect = Prefab.GetActiveEffect(Strength);
            if (currentEffect == null)
            {
                return;
            }

            if (currentEffect.StrengthChange < 0) // Reduce diminishing of buffs if boosted
            {
                _strength += currentEffect.StrengthChange * deltaTime * StrengthDiminishMultiplier;
            }
            else // Reduce strengthening of afflictions if resistant
            {
                _strength += currentEffect.StrengthChange * deltaTime * (1f - characterHealth.GetResistance(Prefab.Identifier));
            }
            // Don't use the property, because its virtual and some afflictions like husk overload it for external use.
            _strength = MathHelper.Clamp(_strength, 0.0f, Prefab.MaxStrength);

            foreach (StatusEffect statusEffect in currentEffect.StatusEffects)
            {
                statusEffect.SetUser(Source);
                if (statusEffect.HasTargetType(StatusEffect.TargetType.Character))
                {
                    statusEffect.Apply(ActionType.OnActive, deltaTime, characterHealth.Character, characterHealth.Character);
                }
                if (targetLimb != null && statusEffect.HasTargetType(StatusEffect.TargetType.Limb))
                {
                    statusEffect.Apply(ActionType.OnActive, deltaTime, characterHealth.Character, targetLimb);
                }
                if (targetLimb != null && statusEffect.HasTargetType(StatusEffect.TargetType.AllLimbs))
                {
                    statusEffect.Apply(ActionType.OnActive, deltaTime, targetLimb.character, targetLimb.character.AnimController.Limbs.Cast <ISerializableEntity>().ToList());
                }
                if (statusEffect.HasTargetType(StatusEffect.TargetType.NearbyItems) ||
                    statusEffect.HasTargetType(StatusEffect.TargetType.NearbyCharacters))
                {
                    var targets = new List <ISerializableEntity>();
                    statusEffect.GetNearbyTargets(characterHealth.Character.WorldPosition, targets);
                    statusEffect.Apply(ActionType.OnActive, deltaTime, targetLimb.character, targets);
                }
            }
        }
Exemplo n.º 12
0
        public float GetSkillMultiplier()
        {
            if (Strength < Prefab.ActivationThreshold)
            {
                return(1.0f);
            }
            AfflictionPrefab.Effect currentEffect = Prefab.GetActiveEffect(Strength);
            if (currentEffect == null)
            {
                return(1.0f);
            }

            float amount = MathHelper.Lerp(
                currentEffect.MinSkillMultiplier,
                currentEffect.MaxSkillMultiplier,
                (Strength - currentEffect.MinStrength) / (currentEffect.MaxStrength - currentEffect.MinStrength));

            return(amount);
        }
Exemplo n.º 13
0
        public float GetScreenBlurStrength()
        {
            if (Strength < Prefab.ActivationThreshold)
            {
                return(0.0f);
            }
            AfflictionPrefab.Effect currentEffect = Prefab.GetActiveEffect(Strength);
            if (currentEffect == null)
            {
                return(0.0f);
            }
            if (currentEffect.MaxScreenBlurStrength - currentEffect.MinScreenBlurStrength <= 0.0f)
            {
                return(0.0f);
            }

            return(MathHelper.Lerp(
                       currentEffect.MinScreenBlurStrength,
                       currentEffect.MaxScreenBlurStrength,
                       (Strength - currentEffect.MinStrength) / (currentEffect.MaxStrength - currentEffect.MinStrength)));
        }
Exemplo n.º 14
0
        public float GetChromaticAberrationStrength()
        {
            if (Strength < Prefab.ActivationThreshold)
            {
                return(0.0f);
            }
            AfflictionPrefab.Effect currentEffect = GetActiveEffect();
            if (currentEffect == null)
            {
                return(0.0f);
            }
            if (currentEffect.MaxChromaticAberrationStrength - currentEffect.MinChromaticAberrationStrength < 0.0f)
            {
                return(0.0f);
            }

            return(MathHelper.Lerp(
                       currentEffect.MinChromaticAberrationStrength,
                       currentEffect.MaxChromaticAberrationStrength,
                       (Strength - currentEffect.MinStrength) / (currentEffect.MaxStrength - currentEffect.MinStrength)));
        }
Exemplo n.º 15
0
        public float GetScreenBlurStrength()
        {
            if (Strength < Prefab.ActivationThreshold)
            {
                return(0.0f);
            }
            AfflictionPrefab.Effect currentEffect = GetActiveEffect();
            if (currentEffect == null)
            {
                return(0.0f);
            }
            if (currentEffect.MaxScreenBlur - currentEffect.MinScreenBlur < 0.0f)
            {
                return(0.0f);
            }

            return(MathHelper.Lerp(
                       currentEffect.MinScreenBlur,
                       currentEffect.MaxScreenBlur,
                       (Strength - currentEffect.MinStrength) / (currentEffect.MaxStrength - currentEffect.MinStrength)) * GetScreenEffectFluctuation(currentEffect));
        }
Exemplo n.º 16
0
        public virtual void Update(CharacterHealth characterHealth, Limb targetLimb, float deltaTime)
        {
            AfflictionPrefab.Effect currentEffect = Prefab.GetActiveEffect(Strength);
            if (currentEffect == null)
            {
                return;
            }

            if (currentEffect.StrengthChange < 0) // Reduce diminishing of buffs if boosted
            {
                Strength += currentEffect.StrengthChange * deltaTime * StrengthDiminishMultiplier;
            }
            else // Reduce strengthening of afflictions if resistant
            {
                Strength += currentEffect.StrengthChange * deltaTime * (1f - characterHealth.GetResistance(Prefab.Identifier));
            }

            foreach (StatusEffect statusEffect in currentEffect.StatusEffects)
            {
                if (statusEffect.HasTargetType(StatusEffect.TargetType.Character))
                {
                    statusEffect.Apply(ActionType.OnActive, deltaTime, characterHealth.Character, characterHealth.Character);
                }
                if (targetLimb != null && statusEffect.HasTargetType(StatusEffect.TargetType.Limb))
                {
                    statusEffect.Apply(ActionType.OnActive, deltaTime, characterHealth.Character, targetLimb);
                }
                if (targetLimb != null && statusEffect.HasTargetType(StatusEffect.TargetType.AllLimbs))
                {
                    statusEffect.Apply(ActionType.OnActive, deltaTime, targetLimb.character, targetLimb.character.AnimController.Limbs.Cast <ISerializableEntity>().ToList());
                }
                if (statusEffect.HasTargetType(StatusEffect.TargetType.NearbyItems) ||
                    statusEffect.HasTargetType(StatusEffect.TargetType.NearbyCharacters))
                {
                    var targets = new List <ISerializableEntity>();
                    statusEffect.GetNearbyTargets(characterHealth.Character.WorldPosition, targets);
                    statusEffect.Apply(ActionType.OnActive, deltaTime, targetLimb.character, targets);
                }
            }
        }
Exemplo n.º 17
0
 public float GetResistance(AfflictionPrefab affliction)
 {
     if (Strength < Prefab.ActivationThreshold)
     {
         return(0.0f);
     }
     AfflictionPrefab.Effect currentEffect = GetActiveEffect();
     if (currentEffect == null)
     {
         return(0.0f);
     }
     if (!currentEffect.ResistanceFor.Any(r =>
                                          r.Equals(affliction.Identifier, StringComparison.OrdinalIgnoreCase) ||
                                          r.Equals(affliction.AfflictionType, StringComparison.OrdinalIgnoreCase)))
     {
         return(0.0f);
     }
     return(MathHelper.Lerp(
                currentEffect.MinResistance,
                currentEffect.MaxResistance,
                (Strength - currentEffect.MinStrength) / (currentEffect.MaxStrength - currentEffect.MinStrength)));
 }