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