public override IEnumerable <MapEvent> StrobePassForLane(IEnumerable <MapEvent> original, int type, EventsContainer.PropMode propMode, JSONNode propID) { List <MapEvent> generatedObjects = new List <MapEvent>(); float startTime = original.First()._time; float endTime = original.Last()._time; List <int> alternatingTypes = new List <int>(values); int typeIndex = 0; if (alternateColors) { for (int i = 0; i < values.Count(); i++) { alternatingTypes.Add(InvertColors(alternatingTypes[i])); } } float distanceInBeats = endTime - startTime; float originalDistance = distanceInBeats; MapEvent lastPassed = null; while (distanceInBeats >= 0) { if (typeIndex >= alternatingTypes.Count) { typeIndex = 0; } MapEvent any = original.Where(x => x._time <= endTime - distanceInBeats).LastOrDefault(); if (any != lastPassed && dynamic && (MapEvent.IsBlueEventFromValue(any._value) != MapEvent.IsBlueEventFromValue(alternatingTypes[typeIndex]))) { lastPassed = any; for (int i = 0; i < alternatingTypes.Count; i++) { alternatingTypes[i] = InvertColors(alternatingTypes[i]); } } int value = alternatingTypes[typeIndex]; float progress = (originalDistance - distanceInBeats) / originalDistance; float newTime = (easingFunc(progress) * originalDistance) + startTime; MapEvent data = new MapEvent(newTime, type, value); if (propMode != EventsContainer.PropMode.Off) { if (value != MapEvent.LIGHT_VALUE_BLUE_ON && value != MapEvent.LIGHT_VALUE_RED_ON && value != MapEvent.LIGHT_VALUE_OFF) { data._value = value < 5 ? MapEvent.LIGHT_VALUE_BLUE_ON : MapEvent.LIGHT_VALUE_RED_ON; } data._customData = new JSONObject(); data._customData.Add("_lightID", propID); } generatedObjects.Add(data); typeIndex++; if (distanceInBeats > 0 && (distanceInBeats -= 1 / precision) < -0.001f) { distanceInBeats = 0; } else if (distanceInBeats <= 0) { break; } } return(generatedObjects); }