public void Update(float deltaTime) { UpdateOxygen(deltaTime); for (int i = 0; i < limbHealths.Count; i++) { for (int j = limbHealths[i].Afflictions.Count - 1; j >= 0; j--) { if (limbHealths[i].Afflictions[j].Strength <= 0.0f) { SteamAchievementManager.OnAfflictionRemoved(limbHealths[i].Afflictions[j], Character); limbHealths[i].Afflictions.RemoveAt(j); } } for (int j = limbHealths[i].Afflictions.Count - 1; j >= 0; j--) { var affliction = limbHealths[i].Afflictions[j]; Limb targetLimb = Character.AnimController.Limbs.FirstOrDefault(l => l.HealthIndex == i); affliction.Update(this, targetLimb, deltaTime); affliction.DamagePerSecondTimer += deltaTime; if (affliction is AfflictionBleeding) { UpdateBleedingProjSpecific((AfflictionBleeding)affliction, targetLimb, deltaTime); } Character.SpeedMultiplier = affliction.GetSpeedMultiplier(); } } for (int i = afflictions.Count - 1; i >= 0; i--) { var affliction = afflictions[i]; if (irremovableAfflictions.Contains(affliction)) { continue; } if (affliction.Strength <= 0.0f) { SteamAchievementManager.OnAfflictionRemoved(affliction, Character); afflictions.RemoveAt(i); } } for (int i = 0; i < afflictions.Count; i++) { var affliction = afflictions[i]; affliction.Update(this, null, deltaTime); affliction.DamagePerSecondTimer += deltaTime; Character.SpeedMultiplier = affliction.GetSpeedMultiplier(); } UpdateLimbAfflictionOverlays(); CalculateVitality(); if (Vitality <= MinVitality) { Kill(); } }
public void ReduceAffliction(Limb targetLimb, string affliction, float amount) { affliction = affliction.ToLowerInvariant(); List <Affliction> matchingAfflictions = new List <Affliction>(afflictions); if (targetLimb != null) { matchingAfflictions.AddRange(limbHealths[targetLimb.HealthIndex].Afflictions); } else { foreach (LimbHealth limbHealth in limbHealths) { matchingAfflictions.AddRange(limbHealth.Afflictions); } } matchingAfflictions.RemoveAll(a => a.Prefab.Identifier.ToLowerInvariant() != affliction && a.Prefab.AfflictionType.ToLowerInvariant() != affliction); if (matchingAfflictions.Count == 0) { return; } float reduceAmount = amount / matchingAfflictions.Count; for (int i = matchingAfflictions.Count - 1; i >= 0; i--) { var matchingAffliction = matchingAfflictions[i]; if (matchingAffliction.Strength < reduceAmount) { float surplus = reduceAmount - matchingAffliction.Strength; amount -= matchingAffliction.Strength; matchingAffliction.Strength = 0.0f; matchingAfflictions.RemoveAt(i); if (i == 0) { i = matchingAfflictions.Count; } if (i > 0) { reduceAmount += surplus / i; } SteamAchievementManager.OnAfflictionRemoved(matchingAffliction, Character); } else { matchingAffliction.Strength -= reduceAmount; amount -= reduceAmount; } } CalculateVitality(); }