internal double CalculateMomentaryFailureRate(String trigger) { trigger = trigger.ToLower().Trim(); double baseFailureRate = GetBaseFailureRate(); double totalModifiers = 1; for (int i = 0, momentaryFailureModifiersCount = momentaryFailureModifiers.Count; i < momentaryFailureModifiersCount; i++) { MomentaryFailureModifier mfm = momentaryFailureModifiers[i]; if (mfm.triggerName != trigger) { continue; } totalModifiers *= mfm.modifier; } double momentaryRate = baseFailureRate * totalModifiers; // Cache this value internally MomentaryFailureRate mfr = GetMomentaryFailureRate(trigger); if (mfr.valid) { momentaryFailureRates.Remove(mfr); mfr.failureRate = momentaryRate; momentaryFailureRates.Add(mfr); } else { mfr.valid = true; mfr.triggerName = trigger; mfr.failureRate = momentaryRate; momentaryFailureRates.Add(mfr); } return(momentaryRate); }
// The momentary failure rate is tracked per named "trigger" which allows multiple Reliability or FailureTrigger modules to cooperate // Returns the total modified failure rate back to the caller for convenience // IMPORTANT: For performance reasons a module should only set its Momentary Modifier WHEN IT CHANGES. The core will cache the value. // Setting the same value multiple times will only force the core to recalculate the Momentary Rate over and over internal MomentaryFailureModifier GetMomentaryFailureModifier(String trigger, String owner) { trigger = trigger.ToLower().Trim(); String ownerName = owner.ToLower().Trim(); for (int i = 0, momentaryFailureModifiersCount = momentaryFailureModifiers.Count; i < momentaryFailureModifiersCount; i++) { MomentaryFailureModifier mfMod = momentaryFailureModifiers[i]; if (mfMod.owner != ownerName || mfMod.triggerName != trigger) { continue; } return(mfMod); } return(new MomentaryFailureModifier()); }