Fix osu! charts with timing point with negative timestamp not able to be imported.

This commit is contained in:
2022-12-16 15:45:26 +08:00
parent 226fb15eb1
commit e4524bda0b

View File

@@ -57,8 +57,7 @@ namespace Cryville.Crtr.Extensions.osu {
Enum.TryParse(line.Substring(1, line.Length - 2), out section);
continue;
}
try { ParseLine(meta, chart, diff, evs, section, line); }
catch (Exception) { }
ParseLine(meta, chart, diff, evs, section, line);
}
}
@@ -71,10 +70,7 @@ namespace Cryville.Crtr.Extensions.osu {
Chart.Sound bgmEv = null;
TimeTimingModel tm = null;
foreach (var ev in evs) {
if (ev.StartTime != 0 && !(tm == null && ev is osuEvent.TimingChange)) {
if (tm == null) throw new InvalidOperationException("Unconvertible chart: event before first timing point");
tm.ForwardTo(ev.StartTime / 1e3);
}
if (tm != null) tm.ForwardTo(ev.StartTime / 1e3);
if (ev is osuEvent.Audio) {
var tev = (osuEvent.Audio)ev;
chart.sounds.Add(bgmEv = new Chart.Sound { time = new BeatTime(0, 0, 1), id = meta.song.name });
@@ -88,10 +84,12 @@ namespace Cryville.Crtr.Extensions.osu {
group.motions.Add(new Chart.Motion { motion = string.Format(CultureInfo.InvariantCulture, "svm:{0}", tev.ScrollSpeed) });
}
else if (ev is osuEvent.EndEvent) {
if (tm == null) throw new InvalidOperationException("Unconvertible chart: timed event before first timing point");
var tev = (osuEvent.EndEvent)ev;
longevs[tev.Original].endtime = tm.FractionalBeatTime;
}
else if (ev is osuEvent.HOMania) {
if (tm == null) throw new InvalidOperationException("Unconvertible chart: timed event before first timing point");
var tev = (osuEvent.HOMania)ev;
var rn = new Chart.Note {
time = tm.FractionalBeatTime,
@@ -139,7 +137,7 @@ namespace Cryville.Crtr.Extensions.osu {
var pair = SplitKeyVal(line);
switch (pair.Key) {
case @"AudioFilename":
evs.Add(new osuEvent.Audio { AudioFile = pair.Value });
evs.Add(new osuEvent.Audio { StartTime = double.NegativeInfinity, AudioFile = pair.Value });
break;
case @"Mode":
int rulesetID = int.Parse(pair.Value, CultureInfo.InvariantCulture);
@@ -186,10 +184,10 @@ namespace Cryville.Crtr.Extensions.osu {
switch (type) {
case LegacyEventType.Sprite:
if (evs.Count == 0 || !(evs[evs.Count - 1] is osuEvent.Background))
evs.Add(new osuEvent.Background { FileName = CleanFilename(split[3]) });
evs.Add(new osuEvent.Background { StartTime = double.NegativeInfinity, FileName = CleanFilename(split[3]) });
break;
case LegacyEventType.Background:
evs.Add(new osuEvent.Background { FileName = CleanFilename(split[2]) });
evs.Add(new osuEvent.Background { StartTime = double.NegativeInfinity, FileName = CleanFilename(split[2]) });
break;
}
}
@@ -330,7 +328,7 @@ namespace Cryville.Crtr.Extensions.osu {
abstract class osuEvent : IComparable<osuEvent> {
public virtual double StartTime { get; set; }
public virtual double EndTime { get; set; }
public bool IsLong { get { return EndTime - StartTime > 0; } }
public bool IsLong { get { return EndTime - StartTime > 0 && EndTime > 0; } }
public abstract int Priority { get; }
public int CompareTo(osuEvent other) {
var c = StartTime.CompareTo(other.StartTime);