From 8c0d4ba5332009759ddc78c693b246ada626a068 Mon Sep 17 00:00:00 2001 From: Tapio Malmberg Date: Sat, 29 Apr 2023 19:25:02 +0300 Subject: [PATCH] Add only necessary anchors to the first dummy DD level --- XmlCombiners/InstrumentalCombiner.cs | 31 +++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/XmlCombiners/InstrumentalCombiner.cs b/XmlCombiners/InstrumentalCombiner.cs index 79ed5af..b22cb3e 100644 --- a/XmlCombiners/InstrumentalCombiner.cs +++ b/XmlCombiners/InstrumentalCombiner.cs @@ -35,7 +35,10 @@ public void Save(string fileName, bool coercePhrases = false, bool generateDummy CoercePhrasesAndSections(CombinedArrangement); if (generateDummyDD && CombinedArrangement.Levels.Count == 1) + { + FixPhraseStartAnchors(CombinedArrangement); GenerateDummyDD(CombinedArrangement); + } var ver = string.IsNullOrWhiteSpace(versionString) ? "" : $" v{versionString}"; CombinedArrangement.XmlComments.Add(new RSXmlComment($"XML Combiner{ver}")); @@ -43,6 +46,31 @@ public void Save(string fileName, bool coercePhrases = false, bool generateDummy Console.WriteLine($"Saved combined file as {fileName}"); } + private static void FixPhraseStartAnchors(InstrumentalArrangement arr) + { + var anchors = arr.Levels[0].Anchors; + + // Skip the COUNT and END phrases + for (int i = 1; i < arr.PhraseIterations.Count - 1; i++) + { + var piTime = arr.PhraseIterations[i].Time; + var activeAnchor = anchors.FindLast(a => a.Time <= piTime); + + if (activeAnchor is not null && activeAnchor.Time != piTime) + { + anchors.InsertByTime(new Anchor(activeAnchor.Fret, piTime, activeAnchor.Width)); + } + else if (activeAnchor is null) + { + var nextAnchor = anchors.Find(a => a.Time > piTime); + if (nextAnchor is not null) + { + nextAnchor.Time = piTime; + } + } + } + } + private static void GenerateDummyDD(InstrumentalArrangement arr) { var noGuitarPhraseIds = new HashSet(); @@ -101,7 +129,8 @@ private static void GenerateDummyDD(InstrumentalArrangement arr) } // Add one empty level - var newlevelZero = new Level(0) { Anchors = arr.Levels[0].Anchors }; + var necessaryAnchors = arr.Levels[0].Anchors.Where(a => arr.PhraseIterations.Exists(pi => pi.Time == a.Time)).ToList(); + var newlevelZero = new Level(0) { Anchors = necessaryAnchors }; var newLevelOne = arr.Levels[0]; newLevelOne.Difficulty = 1; arr.Levels = new List { newlevelZero, newLevelOne };