public override IEnumerable <Issue> GetIssues(Beatmap beatmap) { // Luminosity thresholds, ~15 more lenient than the original 53 / 233 float luminosityMinRankable = 30; float luminosityMinWarning = 43; float luminosityMax = 250; if (beatmap.colourSettings.sliderBorder != null) { Vector3 colour = beatmap.colourSettings.sliderBorder.GetValueOrDefault(); float luminosity = GetLuminosity(colour); if (luminosity < luminosityMinRankable) { yield return(new Issue(GetTemplate("Problem Border"), beatmap)); } else if (luminosity < luminosityMinWarning) { yield return(new Issue(GetTemplate("Warning Border"), beatmap)); } } List <int> comboColoursInKiai = new List <int>(); List <double> comboColourTime = new List <double>(); foreach (HitObject hitObject in beatmap.hitObjects) { int combo = beatmap.GetComboColourIndex(hitObject.time); // Spinners don't have a colour. if (hitObject is Spinner || !beatmap.GetTimingLine(hitObject.time).kiai || comboColoursInKiai.Contains(combo)) { continue; } comboColoursInKiai.Add(combo); comboColourTime.Add(hitObject.time); } for (int i = 0; i < beatmap.colourSettings.combos.Count; ++i) { Vector3 colour = beatmap.colourSettings.combos.ElementAt(i); float luminosity = GetLuminosity(colour); int displayedColourIndex = beatmap.AsDisplayedComboColourIndex(i); if (luminosity < luminosityMinRankable) { yield return(new Issue(GetTemplate("Problem Combo"), beatmap, displayedColourIndex)); } else if (luminosity < luminosityMinWarning) { yield return(new Issue(GetTemplate("Warning Combo"), beatmap, displayedColourIndex)); } for (int j = 0; j < comboColoursInKiai.Count; ++j) { if (luminosity > luminosityMax && comboColoursInKiai[j] == i) { yield return(new Issue(GetTemplate("Bright"), beatmap, displayedColourIndex, Timestamp.Get(comboColourTime[j]))); } } } }