private void CountSuccesses() { Successes = 0; Failures = 0; _values.Clear(); var mask = DieFlags.Critical | DieFlags.Fumble | DieFlags.Success | DieFlags.Failure; foreach (var die in Expression.Values) { if (die.DieType == DieType.Special) { _values.Add(die); continue; } else if (die.Flags.HasFlag(DieFlags.Dropped)) { // strip success/failure and crit/fumble data from dropped dice _values.Add(new DieResult() { DieType = die.DieType, NumSides = die.NumSides, Value = die.Value, Data = die.Data, Flags = die.Flags & ~mask }); continue; } if (Success.Compare(die.Value)) { Successes++; _values.Add(die.Success()); } else if (Failure?.Compare(die.Value) == true) { Failures++; _values.Add(die.Failure()); } else { _values.Add(new DieResult() { DieType = die.DieType, NumSides = die.NumSides, Value = die.Value, Data = die.Data, Flags = die.Flags & ~mask }); } } Value = Successes - Failures; ValueType = ResultType.Successes; }