From 36fbdedee8c9c1af286d6011f6f6a73f78bf74e9 Mon Sep 17 00:00:00 2001 From: Fluto Date: Thu, 10 Feb 2022 19:01:35 +1100 Subject: [PATCH] Added an approach to calculate TJA scores --- TakoTako.sln.DotSettings | 2 + TakoTakoScripts/TJAConvert/Program.cs | 84 +++++++++++++++++------ TakoTakoScripts/TJAConvert/TJAMetaData.cs | 54 +++++++++++++-- 3 files changed, 114 insertions(+), 26 deletions(-) create mode 100644 TakoTako.sln.DotSettings diff --git a/TakoTako.sln.DotSettings b/TakoTako.sln.DotSettings new file mode 100644 index 0000000..8d2bd36 --- /dev/null +++ b/TakoTako.sln.DotSettings @@ -0,0 +1,2 @@ + + True \ No newline at end of file diff --git a/TakoTakoScripts/TJAConvert/Program.cs b/TakoTakoScripts/TJAConvert/Program.cs index 46a349a..ca5a74e 100644 --- a/TakoTakoScripts/TJAConvert/Program.cs +++ b/TakoTakoScripts/TJAConvert/Program.cs @@ -264,49 +264,91 @@ namespace TJAConvert foreach (var course in metadata.Courses) { + var isDouble = course.PlayStyle == TJAMetadata.PlayStyle.Double; + var shinuti = EstimateScoreBasedOnNotes(course); + //todo figure out the best score? switch (course.CourseType) { case CourseType.Easy: musicInfo.starEasy = course.Level; - musicInfo.shinutiEasy = 10170; - musicInfo.shinutiEasyDuet = 10170; - musicInfo.scoreEasy = 360090; - musicInfo.branchEasy = course.IsBranching; + musicInfo.scoreEasy = 1000000; + musicInfo.branchEasy = musicInfo.branchEasy || course.IsBranching; + if (isDouble) + musicInfo.shinutiEasyDuet = shinuti; + else + musicInfo.shinutiEasy = shinuti; break; case CourseType.Normal: musicInfo.starNormal = course.Level; - musicInfo.shinutiNormal = 6010; - musicInfo.shinutiNormalDuet = 6010; - musicInfo.scoreNormal = 650150; - musicInfo.branchNormal = course.IsBranching; + musicInfo.scoreNormal = 1000000; + musicInfo.branchNormal = musicInfo.branchNormal || course.IsBranching; + if (isDouble) + musicInfo.shinutiNormalDuet = shinuti; + else + musicInfo.shinutiNormal = shinuti; break; case CourseType.Hard: musicInfo.starHard = course.Level; - musicInfo.shinutiHard = 3010; - musicInfo.shinutiHardDuet = 3010; - musicInfo.scoreHard = 800210; - musicInfo.branchHard = course.IsBranching; + musicInfo.scoreHard = 1000000; + musicInfo.branchHard = musicInfo.branchHard || course.IsBranching; + if (isDouble) + musicInfo.shinutiHardDuet = shinuti; + else + musicInfo.shinutiHard = shinuti; break; case CourseType.Oni: musicInfo.starMania = course.Level; - musicInfo.shinutiMania = 1000; - musicInfo.shinutiManiaDuet = 1000; - musicInfo.scoreMania = 10000; - musicInfo.branchMania = course.IsBranching; + musicInfo.scoreMania = 1000000; + musicInfo.branchMania = musicInfo.branchMania || course.IsBranching; + if (isDouble) + musicInfo.shinutiManiaDuet = shinuti; + else + musicInfo.shinutiMania = shinuti; break; case CourseType.UraOni: musicInfo.starUra = course.Level; - musicInfo.shinutiUra = 1000; - musicInfo.shinutiUraDuet = 1000; - musicInfo.scoreUra = 10000; - musicInfo.branchUra = course.IsBranching; + musicInfo.scoreUra = 1000000; + musicInfo.branchUra = musicInfo.branchUra || course.IsBranching; + if (isDouble) + musicInfo.shinutiUraDuet = shinuti; + else + musicInfo.shinutiUra = shinuti; break; default: throw new ArgumentOutOfRangeException(); } } + + // make sure each course as a score + if (musicInfo.shinutiEasy == 0) + musicInfo.shinutiEasy = musicInfo.shinutiEasyDuet != 0 ? musicInfo.shinutiEasyDuet : 7352; + if (musicInfo.shinutiNormal == 0) + musicInfo.shinutiNormal = musicInfo.shinutiNormalDuet != 0 ? musicInfo.shinutiNormalDuet : 4830; + if (musicInfo.shinutiHard == 0) + musicInfo.shinutiHard = musicInfo.shinutiHardDuet != 0 ? musicInfo.shinutiHardDuet : 3144; + if (musicInfo.shinutiMania == 0) + musicInfo.shinutiMania = musicInfo.shinutiManiaDuet != 0 ? musicInfo.shinutiManiaDuet : 2169; + if (musicInfo.shinutiUra == 0) + musicInfo.shinutiUra = musicInfo.shinutiUraDuet != 0 ? musicInfo.shinutiUraDuet : 1420; + + if (musicInfo.shinutiEasyDuet == 0) + musicInfo.shinutiEasyDuet = musicInfo.shinutiEasy; + if (musicInfo.shinutiNormalDuet == 0) + musicInfo.shinutiNormalDuet = musicInfo.shinutiNormal; + if (musicInfo.shinutiHardDuet == 0) + musicInfo.shinutiHardDuet = musicInfo.shinutiHard; + if (musicInfo.shinutiManiaDuet == 0) + musicInfo.shinutiManiaDuet = musicInfo.shinutiMania; + if (musicInfo.shinutiUraDuet == 0) + musicInfo.shinutiUraDuet = musicInfo.shinutiUra; + + int EstimateScoreBasedOnNotes(TJAMetadata.Course course) + { + return Math.Max(1, 1000000 / course.EstimatedNotes); + } + var json = JsonConvert.SerializeObject(musicInfo, Formatting.Indented); File.WriteAllText($"{outputPath}/data.json", json); return true; @@ -1138,4 +1180,4 @@ namespace TJAConvert return 3; } } -} \ No newline at end of file +} diff --git a/TakoTakoScripts/TJAConvert/TJAMetaData.cs b/TakoTakoScripts/TJAConvert/TJAMetaData.cs index 6825afc..b5d775d 100644 --- a/TakoTakoScripts/TJAConvert/TJAMetaData.cs +++ b/TakoTakoScripts/TJAConvert/TJAMetaData.cs @@ -160,9 +160,7 @@ internal class TJAMetadata currentCourse.SongDataIndexEnd = courseStartIndex; - if (newContent) - Courses.Add(currentCourse); - + // is this branching? for (int i = currentCourse.SongDataIndexStart; i < currentCourse.SongDataIndexEnd; i++) { var line = lines[i]; @@ -173,6 +171,52 @@ internal class TJAMetadata } } + // calculate roughly the amount of song notes in this course + int noteCount = 0; + int branchNoteCount = 0; + int branches = 0; + bool inBranch = false; + for (int i = currentCourse.SongDataIndexStart; i < currentCourse.SongDataIndexEnd; i++) + { + var line = lines[i].Trim(); + + if (line.Equals("#N", StringComparison.InvariantCultureIgnoreCase) + || line.Equals("#E", StringComparison.InvariantCultureIgnoreCase) + || line.Equals("#M", StringComparison.InvariantCultureIgnoreCase)) + branches++; + + var branchStart = line.StartsWith("#BRANCHSTART", StringComparison.InvariantCultureIgnoreCase); + if (inBranch && (branchStart || line.StartsWith("#BRANCHEND", StringComparison.InvariantCultureIgnoreCase))) + { + noteCount += branchNoteCount / Math.Max(1, branches); + inBranch = false; + } + + if (!inBranch && branchStart) + { + inBranch = true; + branchNoteCount = 0; + branches = 0; + } + + if (!line.EndsWith(",")) + continue; + + var notes = line.Count(x => x is '1' or '2' or '3' or '4'); + if (inBranch) + branchNoteCount += notes; + else + noteCount += notes; + } + + if (currentCourse.PlayStyle == PlayStyle.Double) + currentCourse.EstimatedNotes = noteCount / 2; + else + currentCourse.EstimatedNotes = noteCount; + + if (newContent) + Courses.Add(currentCourse); + // duplicate the existing course currentCourse = new Course(currentCourse); // find the next start @@ -241,8 +285,6 @@ internal class TJAMetadata return CourseType.UraOni; } - - } public const string TJAFieldRegexTemplate = "^{0}:\\s*(?.*?)\\s*$"; @@ -290,6 +332,8 @@ internal class TJAMetadata public int SongDataIndexStart; public int SongDataIndexEnd; + public int EstimatedNotes = 0; + public Course() { }