private void handleEvent(string line)
        {
            string[] split = line.Split(',');

            if (!Enum.TryParse(split[0], out LegacyEventType type))
            {
                throw new InvalidDataException($@"Unknown event type: {split[0]}");
            }

            switch (type)
            {
            case LegacyEventType.Background:
                beatmap.BeatmapInfo.Metadata.BackgroundFile = CleanFilename(split[2]);
                break;

            case LegacyEventType.Break:
                double start = getOffsetTime(Parsing.ParseDouble(split[1]));
                double end   = Math.Max(start, getOffsetTime(Parsing.ParseDouble(split[2])));

                var breakEvent = new BreakPeriod(start, end);

                if (!breakEvent.HasEffect)
                {
                    return;
                }

                beatmap.Breaks.Add(breakEvent);
                break;
            }
        }
Beispiel #2
0
        private void handleEvent(string line)
        {
            string[] split = line.Split(',');

            EventType type;

            if (!Enum.TryParse(split[0], out type))
            {
                throw new InvalidDataException($@"Unknown event type {split[0]}");
            }

            switch (type)
            {
            case EventType.Background:
                string filename = split[2].Trim('"');
                beatmap.BeatmapInfo.Metadata.BackgroundFile = filename;
                break;

            case EventType.Break:
                var breakEvent = new BreakPeriod
                {
                    StartTime = getOffsetTime(double.Parse(split[1], NumberFormatInfo.InvariantInfo)),
                    EndTime   = getOffsetTime(double.Parse(split[2], NumberFormatInfo.InvariantInfo))
                };

                if (!breakEvent.HasEffect)
                {
                    return;
                }

                beatmap.Breaks.Add(breakEvent);
                break;
            }
        }
Beispiel #3
0
        public void TestNoEffectsBreak()
        {
            var shortBreak = new BreakPeriod(0, 500);

            setClock(true);
            loadBreaksStep("short break", new[] { shortBreak });

            addBreakSeeks(shortBreak, false);
        }
Beispiel #4
0
 private void addBreakSeeks(BreakPeriod b, bool isReversed)
 {
     if (isReversed)
     {
         seekAndAssertBreak("seek to break after end", b.EndTime + 500, false);
         seekAndAssertBreak("seek to break end", b.EndTime, false);
         seekAndAssertBreak("seek to break middle", b.StartTime + b.Duration / 2, b.HasEffect);
         seekAndAssertBreak("seek to break start", b.StartTime, b.HasEffect);
     }
     else
     {
         seekAndAssertBreak("seek to break start", b.StartTime, b.HasEffect);
         seekAndAssertBreak("seek to break middle", b.StartTime + b.Duration / 2, b.HasEffect);
         seekAndAssertBreak("seek to break end", b.EndTime, false);
         seekAndAssertBreak("seek to break after end", b.EndTime + 500, false);
     }
 }
Beispiel #5
0
        private void handleEvents(Beatmap beatmap, string line)
        {
            decodeVariables(ref line);

            string[] split = line.Split(',');

            EventType type;

            if (!Enum.TryParse(split[0], out type))
            {
                throw new InvalidDataException($@"Unknown event type {split[0]}");
            }

            // Todo: Implement the rest
            switch (type)
            {
            case EventType.Video:
            case EventType.Background:
                string filename = split[2].Trim('"');

                if (type == EventType.Background)
                {
                    beatmap.BeatmapInfo.Metadata.BackgroundFile = filename;
                }

                break;

            case EventType.Break:
                var breakEvent = new BreakPeriod
                {
                    StartTime = double.Parse(split[1], NumberFormatInfo.InvariantInfo),
                    EndTime   = double.Parse(split[2], NumberFormatInfo.InvariantInfo)
                };

                if (!breakEvent.HasEffect)
                {
                    return;
                }

                beatmap.Breaks.Add(breakEvent);
                break;
            }
        }
        private void handleEvent(string line)
        {
            string[] split = line.Split(',');

            EventType type;

            if (!Enum.TryParse(split[0], out type))
            {
                throw new InvalidDataException($@"Unknown event type: {split[0]}");
            }

            switch (type)
            {
            case EventType.Background:
                string bgFilename = split[2].Trim('"');
                beatmap.BeatmapInfo.Metadata.BackgroundFile = FileSafety.PathStandardise(bgFilename);
                break;

            case EventType.Video:
                string videoFilename = split[2].Trim('"');
                beatmap.BeatmapInfo.Metadata.VideoFile = FileSafety.PathStandardise(videoFilename);
                break;

            case EventType.Break:
                double start = getOffsetTime(Parsing.ParseDouble(split[1]));

                var breakEvent = new BreakPeriod
                {
                    StartTime = start,
                    EndTime   = Math.Max(start, getOffsetTime(Parsing.ParseDouble(split[2])))
                };

                if (!breakEvent.HasEffect)
                {
                    return;
                }

                beatmap.Breaks.Add(breakEvent);
                break;
            }
        }
Beispiel #7
0
        private void onBreakIn(BreakPeriod b)
        {
            if (letterboxing)
            {
                letterboxOverlay.Show();
            }

            remainingTimeAdjustmentBox
            .ResizeWidthTo(remaining_time_container_max_size, fade_duration, Easing.OutQuint)
            .Delay(b.Duration - fade_duration)
            .ResizeWidthTo(0);

            remainingTimeBox
            .ResizeWidthTo(0, b.Duration - fade_duration)
            .Then()
            .ResizeWidthTo(1);

            remainingTimeCounter.StartCounting(b.EndTime);

            remainingTimeCounter.Show();
            info.Show();
            arrowsOverlay.Show();
        }
        private static int getBeatmapStageIndex(IBeatmap beatmap, double time)
        {
            if (beatmap.Breaks.Count == 0)
            {
                return(1);
            }

            BreakPeriod latestBreak = null;

            beatmap.Breaks.ForEach(b =>
            {
                if (b.EndTime < time)
                {
                    latestBreak = b;
                }
            });

            if (latestBreak == null)
            {
                return(1);
            }

            return(beatmap.Breaks.IndexOf(latestBreak) + 1);
        }
Beispiel #9
0
        private void handleEvents(Beatmap beatmap, string line, ref StoryboardSprite storyboardSprite, ref CommandTimelineGroup timelineGroup)
        {
            var depth = 0;

            while (line.StartsWith(" ") || line.StartsWith("_"))
            {
                ++depth;
                line = line.Substring(1);
            }

            decodeVariables(ref line);

            string[] split = line.Split(',');

            if (depth == 0)
            {
                storyboardSprite = null;

                EventType type;
                if (!Enum.TryParse(split[0], out type))
                {
                    throw new InvalidDataException($@"Unknown event type {split[0]}");
                }

                switch (type)
                {
                case EventType.Video:
                case EventType.Background:
                    string filename = split[2].Trim('"');

                    if (type == EventType.Background)
                    {
                        beatmap.BeatmapInfo.Metadata.BackgroundFile = filename;
                    }

                    break;

                case EventType.Break:
                    var breakEvent = new BreakPeriod
                    {
                        StartTime = double.Parse(split[1], NumberFormatInfo.InvariantInfo),
                        EndTime   = double.Parse(split[2], NumberFormatInfo.InvariantInfo)
                    };

                    if (!breakEvent.HasEffect)
                    {
                        return;
                    }

                    beatmap.Breaks.Add(breakEvent);
                    break;

                case EventType.Sprite:
                {
                    var layer  = parseLayer(split[1]);
                    var origin = parseOrigin(split[2]);
                    var path   = cleanFilename(split[3]);
                    var x      = float.Parse(split[4], NumberFormatInfo.InvariantInfo);
                    var y      = float.Parse(split[5], NumberFormatInfo.InvariantInfo);
                    storyboardSprite = new StoryboardSprite(path, origin, new Vector2(x, y));
                    beatmap.Storyboard.GetLayer(layer).Add(storyboardSprite);
                }
                break;

                case EventType.Animation:
                {
                    var layer      = parseLayer(split[1]);
                    var origin     = parseOrigin(split[2]);
                    var path       = cleanFilename(split[3]);
                    var x          = float.Parse(split[4], NumberFormatInfo.InvariantInfo);
                    var y          = float.Parse(split[5], NumberFormatInfo.InvariantInfo);
                    var frameCount = int.Parse(split[6]);
                    var frameDelay = double.Parse(split[7], NumberFormatInfo.InvariantInfo);
                    var loopType   = split.Length > 8 ? (AnimationLoopType)Enum.Parse(typeof(AnimationLoopType), split[8]) : AnimationLoopType.LoopForever;
                    storyboardSprite = new StoryboardAnimation(path, origin, new Vector2(x, y), frameCount, frameDelay, loopType);
                    beatmap.Storyboard.GetLayer(layer).Add(storyboardSprite);
                }
                break;

                case EventType.Sample:
                {
                    var time   = double.Parse(split[1], CultureInfo.InvariantCulture);
                    var layer  = parseLayer(split[2]);
                    var path   = cleanFilename(split[3]);
                    var volume = split.Length > 4 ? float.Parse(split[4], CultureInfo.InvariantCulture) : 100;
                    beatmap.Storyboard.GetLayer(layer).Add(new StoryboardSample(path, time, volume));
                }
                break;
                }
            }
            else
            {
                if (depth < 2)
                {
                    timelineGroup = storyboardSprite?.TimelineGroup;
                }

                var commandType = split[0];
                switch (commandType)
                {
                case "T":
                {
                    var triggerName = split[1];
                    var startTime   = split.Length > 2 ? double.Parse(split[2], CultureInfo.InvariantCulture) : double.MinValue;
                    var endTime     = split.Length > 3 ? double.Parse(split[3], CultureInfo.InvariantCulture) : double.MaxValue;
                    var groupNumber = split.Length > 4 ? int.Parse(split[4]) : 0;
                    timelineGroup = storyboardSprite?.AddTrigger(triggerName, startTime, endTime, groupNumber);
                }
                break;

                case "L":
                {
                    var startTime = double.Parse(split[1], CultureInfo.InvariantCulture);
                    var loopCount = int.Parse(split[2]);
                    timelineGroup = storyboardSprite?.AddLoop(startTime, loopCount);
                }
                break;

                default:
                {
                    if (string.IsNullOrEmpty(split[3]))
                    {
                        split[3] = split[2];
                    }

                    var easing    = (Easing)int.Parse(split[1]);
                    var startTime = double.Parse(split[2], CultureInfo.InvariantCulture);
                    var endTime   = double.Parse(split[3], CultureInfo.InvariantCulture);

                    switch (commandType)
                    {
                    case "F":
                    {
                        var startValue = float.Parse(split[4], CultureInfo.InvariantCulture);
                        var endValue   = split.Length > 5 ? float.Parse(split[5], CultureInfo.InvariantCulture) : startValue;
                        timelineGroup?.Alpha.Add(easing, startTime, endTime, startValue, endValue);
                    }
                    break;

                    case "S":
                    {
                        var startValue = float.Parse(split[4], CultureInfo.InvariantCulture);
                        var endValue   = split.Length > 5 ? float.Parse(split[5], CultureInfo.InvariantCulture) : startValue;
                        timelineGroup?.Scale.Add(easing, startTime, endTime, new Vector2(startValue), new Vector2(endValue));
                    }
                    break;

                    case "V":
                    {
                        var startX = float.Parse(split[4], CultureInfo.InvariantCulture);
                        var startY = float.Parse(split[5], CultureInfo.InvariantCulture);
                        var endX   = split.Length > 6 ? float.Parse(split[6], CultureInfo.InvariantCulture) : startX;
                        var endY   = split.Length > 7 ? float.Parse(split[7], CultureInfo.InvariantCulture) : startY;
                        timelineGroup?.Scale.Add(easing, startTime, endTime, new Vector2(startX, startY), new Vector2(endX, endY));
                    }
                    break;

                    case "R":
                    {
                        var startValue = float.Parse(split[4], CultureInfo.InvariantCulture);
                        var endValue   = split.Length > 5 ? float.Parse(split[5], CultureInfo.InvariantCulture) : startValue;
                        timelineGroup?.Rotation.Add(easing, startTime, endTime, MathHelper.RadiansToDegrees(startValue), MathHelper.RadiansToDegrees(endValue));
                    }
                    break;

                    case "M":
                    {
                        var startX = float.Parse(split[4], CultureInfo.InvariantCulture);
                        var startY = float.Parse(split[5], CultureInfo.InvariantCulture);
                        var endX   = split.Length > 6 ? float.Parse(split[6], CultureInfo.InvariantCulture) : startX;
                        var endY   = split.Length > 7 ? float.Parse(split[7], CultureInfo.InvariantCulture) : startY;
                        timelineGroup?.X.Add(easing, startTime, endTime, startX, endX);
                        timelineGroup?.Y.Add(easing, startTime, endTime, startY, endY);
                    }
                    break;

                    case "MX":
                    {
                        var startValue = float.Parse(split[4], CultureInfo.InvariantCulture);
                        var endValue   = split.Length > 5 ? float.Parse(split[5], CultureInfo.InvariantCulture) : startValue;
                        timelineGroup?.X.Add(easing, startTime, endTime, startValue, endValue);
                    }
                    break;

                    case "MY":
                    {
                        var startValue = float.Parse(split[4], CultureInfo.InvariantCulture);
                        var endValue   = split.Length > 5 ? float.Parse(split[5], CultureInfo.InvariantCulture) : startValue;
                        timelineGroup?.Y.Add(easing, startTime, endTime, startValue, endValue);
                    }
                    break;

                    case "C":
                    {
                        var startRed   = float.Parse(split[4], CultureInfo.InvariantCulture);
                        var startGreen = float.Parse(split[5], CultureInfo.InvariantCulture);
                        var startBlue  = float.Parse(split[6], CultureInfo.InvariantCulture);
                        var endRed     = split.Length > 7 ? float.Parse(split[7], CultureInfo.InvariantCulture) : startRed;
                        var endGreen   = split.Length > 8 ? float.Parse(split[8], CultureInfo.InvariantCulture) : startGreen;
                        var endBlue    = split.Length > 9 ? float.Parse(split[9], CultureInfo.InvariantCulture) : startBlue;
                        timelineGroup?.Colour.Add(easing, startTime, endTime,
                                                  new Color4(startRed / 255f, startGreen / 255f, startBlue / 255f, 1),
                                                  new Color4(endRed / 255f, endGreen / 255f, endBlue / 255f, 1));
                    }
                    break;

                    case "P":
                    {
                        var type = split[4];
                        switch (type)
                        {
                        case "A": timelineGroup?.BlendingMode.Add(easing, startTime, endTime, BlendingMode.Additive, startTime == endTime ? BlendingMode.Additive : BlendingMode.Inherit); break;

                        case "H": timelineGroup?.FlipH.Add(easing, startTime, endTime, true, startTime == endTime); break;

                        case "V": timelineGroup?.FlipV.Add(easing, startTime, endTime, true, startTime == endTime); break;
                        }
                    }
                    break;

                    default:
                        throw new InvalidDataException($@"Unknown command type: {commandType}");
                    }
                }
                break;
                }
            }
        }
Beispiel #10
0
 public BreakVisualisation(BreakPeriod breakPeriod)
     : base(breakPeriod.StartTime, breakPeriod.EndTime)
 {
 }