From 36fbdedee8c9c1af286d6011f6f6a73f78bf74e9 Mon Sep 17 00:00:00 2001 From: Fluto Date: Thu, 10 Feb 2022 19:01:35 +1100 Subject: [PATCH 1/7] 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() { } From 0746f030f2bf17f268a938462b710670c9bc9f1a Mon Sep 17 00:00:00 2001 From: Fluto Date: Thu, 10 Feb 2022 19:17:46 +1100 Subject: [PATCH 2/7] Moved TJAConvert and TakoTako.Common to their own folders at the root directory. Regenerated .idea files --- .../.idea/projectSettingsUpdater.xml | 6 - .idea/.idea.TaikoMods.dir/.idea/workspace.xml | 63 -------- Folder.DotSettings.user | 5 - .../TJAConvert => TJAConvert}/Files.cs | 0 .../TJAConvert => TJAConvert}/FodyWeavers.xml | 0 .../TJAConvert => TJAConvert}/Program.cs | 0 .../References/SonicAudioLib.dll | Bin .../TJAConvert.csproj | 4 +- .../TJAConvert => TJAConvert}/TJAMetaData.cs | 0 .../CustomSong.cs | 2 +- .../MurmurHash2.cs | 0 .../TakoTako.Common.csproj | 2 +- TakoTako.sln | 4 +- TakoTako.sln.DotSettings | 7 +- TakoTako/TakoTako.csproj | 4 +- TakoTakoScripts/.gitignore | 35 ----- .../.idea.TakoTakoScripts/.idea/.gitignore | 13 -- .../.idea.TakoTakoScripts/.idea/encodings.xml | 4 - .../.idea/indexLayout.xml | 8 - .../.idea/.idea.TakoTakoScripts/.idea/vcs.xml | 6 - TakoTakoScripts/TJAConvert/FodyWeavers.xsd | 141 ------------------ .../TakoTakoScripts.Common.csproj | 16 -- .../TakoTakoScripts.sln.DotSettings | 7 - TakoTakoScripts/global.json | 7 - 24 files changed, 14 insertions(+), 320 deletions(-) delete mode 100644 .idea/.idea.TaikoMods.dir/.idea/projectSettingsUpdater.xml delete mode 100644 .idea/.idea.TaikoMods.dir/.idea/workspace.xml delete mode 100644 Folder.DotSettings.user rename {TakoTakoScripts/TJAConvert => TJAConvert}/Files.cs (100%) rename {TakoTakoScripts/TJAConvert => TJAConvert}/FodyWeavers.xml (100%) rename {TakoTakoScripts/TJAConvert => TJAConvert}/Program.cs (100%) rename {TakoTakoScripts/TJAConvert => TJAConvert}/References/SonicAudioLib.dll (100%) rename {TakoTakoScripts/TJAConvert => TJAConvert}/TJAConvert.csproj (95%) rename {TakoTakoScripts/TJAConvert => TJAConvert}/TJAMetaData.cs (100%) rename {TakoTakoScripts/TakoTako.Common => TakoTako.Common}/CustomSong.cs (99%) rename {TakoTakoScripts/TakoTako.Common => TakoTako.Common}/MurmurHash2.cs (100%) rename {TakoTakoScripts/TakoTako.Common => TakoTako.Common}/TakoTako.Common.csproj (85%) delete mode 100644 TakoTakoScripts/.gitignore delete mode 100644 TakoTakoScripts/.idea/.idea.TakoTakoScripts/.idea/.gitignore delete mode 100644 TakoTakoScripts/.idea/.idea.TakoTakoScripts/.idea/encodings.xml delete mode 100644 TakoTakoScripts/.idea/.idea.TakoTakoScripts/.idea/indexLayout.xml delete mode 100644 TakoTakoScripts/.idea/.idea.TakoTakoScripts/.idea/vcs.xml delete mode 100644 TakoTakoScripts/TJAConvert/FodyWeavers.xsd delete mode 100644 TakoTakoScripts/TakoTakoScripts.Common/TakoTakoScripts.Common.csproj delete mode 100644 TakoTakoScripts/TakoTakoScripts.sln.DotSettings delete mode 100644 TakoTakoScripts/global.json diff --git a/.idea/.idea.TaikoMods.dir/.idea/projectSettingsUpdater.xml b/.idea/.idea.TaikoMods.dir/.idea/projectSettingsUpdater.xml deleted file mode 100644 index 4bb9f4d..0000000 --- a/.idea/.idea.TaikoMods.dir/.idea/projectSettingsUpdater.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.idea/.idea.TaikoMods.dir/.idea/workspace.xml b/.idea/.idea.TaikoMods.dir/.idea/workspace.xml deleted file mode 100644 index 7d16c69..0000000 --- a/.idea/.idea.TaikoMods.dir/.idea/workspace.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1643955770420 - - - - - - - - - - \ No newline at end of file diff --git a/Folder.DotSettings.user b/Folder.DotSettings.user deleted file mode 100644 index 806e514..0000000 --- a/Folder.DotSettings.user +++ /dev/null @@ -1,5 +0,0 @@ - - True - <AssemblyExplorer> - <Assembly Path="C:\git\public-git\taiko-mods\Taiko-Mod\bin\Debug\net48\Assembly-CSharp-firstpass.dll" /> -</AssemblyExplorer> \ No newline at end of file diff --git a/TakoTakoScripts/TJAConvert/Files.cs b/TJAConvert/Files.cs similarity index 100% rename from TakoTakoScripts/TJAConvert/Files.cs rename to TJAConvert/Files.cs diff --git a/TakoTakoScripts/TJAConvert/FodyWeavers.xml b/TJAConvert/FodyWeavers.xml similarity index 100% rename from TakoTakoScripts/TJAConvert/FodyWeavers.xml rename to TJAConvert/FodyWeavers.xml diff --git a/TakoTakoScripts/TJAConvert/Program.cs b/TJAConvert/Program.cs similarity index 100% rename from TakoTakoScripts/TJAConvert/Program.cs rename to TJAConvert/Program.cs diff --git a/TakoTakoScripts/TJAConvert/References/SonicAudioLib.dll b/TJAConvert/References/SonicAudioLib.dll similarity index 100% rename from TakoTakoScripts/TJAConvert/References/SonicAudioLib.dll rename to TJAConvert/References/SonicAudioLib.dll diff --git a/TakoTakoScripts/TJAConvert/TJAConvert.csproj b/TJAConvert/TJAConvert.csproj similarity index 95% rename from TakoTakoScripts/TJAConvert/TJAConvert.csproj rename to TJAConvert/TJAConvert.csproj index b0e8ce9..021884a 100644 --- a/TakoTakoScripts/TJAConvert/TJAConvert.csproj +++ b/TJAConvert/TJAConvert.csproj @@ -39,6 +39,6 @@ - + - \ No newline at end of file + diff --git a/TakoTakoScripts/TJAConvert/TJAMetaData.cs b/TJAConvert/TJAMetaData.cs similarity index 100% rename from TakoTakoScripts/TJAConvert/TJAMetaData.cs rename to TJAConvert/TJAMetaData.cs diff --git a/TakoTakoScripts/TakoTako.Common/CustomSong.cs b/TakoTako.Common/CustomSong.cs similarity index 99% rename from TakoTakoScripts/TakoTako.Common/CustomSong.cs rename to TakoTako.Common/CustomSong.cs index 142adab..d62e3cc 100644 --- a/TakoTakoScripts/TakoTako.Common/CustomSong.cs +++ b/TakoTako.Common/CustomSong.cs @@ -203,4 +203,4 @@ namespace TakoTako.Common [JsonProperty(NullValueHandling = NullValueHandling.Ignore, DefaultValueHandling = DefaultValueHandling.Ignore)] public int krFont; } -} \ No newline at end of file +} diff --git a/TakoTakoScripts/TakoTako.Common/MurmurHash2.cs b/TakoTako.Common/MurmurHash2.cs similarity index 100% rename from TakoTakoScripts/TakoTako.Common/MurmurHash2.cs rename to TakoTako.Common/MurmurHash2.cs diff --git a/TakoTakoScripts/TakoTako.Common/TakoTako.Common.csproj b/TakoTako.Common/TakoTako.Common.csproj similarity index 85% rename from TakoTakoScripts/TakoTako.Common/TakoTako.Common.csproj rename to TakoTako.Common/TakoTako.Common.csproj index 93116fc..86b9c71 100644 --- a/TakoTakoScripts/TakoTako.Common/TakoTako.Common.csproj +++ b/TakoTako.Common/TakoTako.Common.csproj @@ -9,7 +9,7 @@ - ..\..\TakoTako\References\Newtonsoft.Json.dll + ..\TakoTako\References\Newtonsoft.Json.dll diff --git a/TakoTako.sln b/TakoTako.sln index 37b8c77..fe4a263 100644 --- a/TakoTako.sln +++ b/TakoTako.sln @@ -1,8 +1,8 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TakoTako.Common", "TakoTakoScripts\TakoTako.Common\TakoTako.Common.csproj", "{DDD2BC9B-15CB-47AE-A104-F45A3C65C7B1}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TakoTako.Common", "TakoTako.Common\TakoTako.Common.csproj", "{DDD2BC9B-15CB-47AE-A104-F45A3C65C7B1}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TJAConvert", "TakoTakoScripts\TJAConvert\TJAConvert.csproj", "{9ED2476B-FB39-4BE9-8661-21311AD9A3E8}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TJAConvert", "TJAConvert\TJAConvert.csproj", "{9ED2476B-FB39-4BE9-8661-21311AD9A3E8}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TakoTako", "TakoTako\TakoTako.csproj", "{3B286FDB-8AB8-49B0-852E-5180AFBC20D5}" EndProject diff --git a/TakoTako.sln.DotSettings b/TakoTako.sln.DotSettings index 8d2bd36..fd2fec2 100644 --- a/TakoTako.sln.DotSettings +++ b/TakoTako.sln.DotSettings @@ -1,2 +1,7 @@  - True \ No newline at end of file + True + True + True + True + True + \ No newline at end of file diff --git a/TakoTako/TakoTako.csproj b/TakoTako/TakoTako.csproj index 9457ba4..309e4c0 100644 --- a/TakoTako/TakoTako.csproj +++ b/TakoTako/TakoTako.csproj @@ -55,7 +55,7 @@ - + @@ -63,4 +63,4 @@ - \ No newline at end of file + diff --git a/TakoTakoScripts/.gitignore b/TakoTakoScripts/.gitignore deleted file mode 100644 index 9d3e8b0..0000000 --- a/TakoTakoScripts/.gitignore +++ /dev/null @@ -1,35 +0,0 @@ -# Common IntelliJ Platform excludes - -# User specific -**/.idea/**/workspace.xml -**/.idea/**/tasks.xml -**/.idea/shelf/* -**/.idea/dictionaries -**/.idea/httpRequests/ - -# Sensitive or high-churn files -**/.idea/**/dataSources/ -**/.idea/**/dataSources.ids -**/.idea/**/dataSources.xml -**/.idea/**/dataSources.local.xml -**/.idea/**/sqlDataSources.xml -**/.idea/**/dynamic.xml - -# Rider -# Rider auto-generates .iml files, and contentModel.xml -**/.idea/**/*.iml -**/.idea/**/contentModel.xml -**/.idea/**/modules.xml - -*.suo -*.user -.vs/ -[Bb]in/ -[Oo]bj/ -_UpgradeReport_Files/ -[Pp]ackages/ - -Thumbs.db -Desktop.ini -.DS_Store -ShortcutFolder.lnk diff --git a/TakoTakoScripts/.idea/.idea.TakoTakoScripts/.idea/.gitignore b/TakoTakoScripts/.idea/.idea.TakoTakoScripts/.idea/.gitignore deleted file mode 100644 index bd4c181..0000000 --- a/TakoTakoScripts/.idea/.idea.TakoTakoScripts/.idea/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Rider ignored files -/modules.xml -/.idea.TakoTakoScripts.iml -/projectSettingsUpdater.xml -/contentModel.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/TakoTakoScripts/.idea/.idea.TakoTakoScripts/.idea/encodings.xml b/TakoTakoScripts/.idea/.idea.TakoTakoScripts/.idea/encodings.xml deleted file mode 100644 index df87cf9..0000000 --- a/TakoTakoScripts/.idea/.idea.TakoTakoScripts/.idea/encodings.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/TakoTakoScripts/.idea/.idea.TakoTakoScripts/.idea/indexLayout.xml b/TakoTakoScripts/.idea/.idea.TakoTakoScripts/.idea/indexLayout.xml deleted file mode 100644 index 7b08163..0000000 --- a/TakoTakoScripts/.idea/.idea.TakoTakoScripts/.idea/indexLayout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/TakoTakoScripts/.idea/.idea.TakoTakoScripts/.idea/vcs.xml b/TakoTakoScripts/.idea/.idea.TakoTakoScripts/.idea/vcs.xml deleted file mode 100644 index 6c0b863..0000000 --- a/TakoTakoScripts/.idea/.idea.TakoTakoScripts/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/TakoTakoScripts/TJAConvert/FodyWeavers.xsd b/TakoTakoScripts/TJAConvert/FodyWeavers.xsd deleted file mode 100644 index 05e92c1..0000000 --- a/TakoTakoScripts/TJAConvert/FodyWeavers.xsd +++ /dev/null @@ -1,141 +0,0 @@ - - - - - - - - - - - - A list of assembly names to exclude from the default action of "embed all Copy Local references", delimited with line breaks - - - - - A list of assembly names to include from the default action of "embed all Copy Local references", delimited with line breaks. - - - - - A list of runtime assembly names to exclude from the default action of "embed all Copy Local references", delimited with line breaks - - - - - A list of runtime assembly names to include from the default action of "embed all Copy Local references", delimited with line breaks. - - - - - A list of unmanaged 32 bit assembly names to include, delimited with line breaks. - - - - - A list of unmanaged 64 bit assembly names to include, delimited with line breaks. - - - - - The order of preloaded assemblies, delimited with line breaks. - - - - - - This will copy embedded files to disk before loading them into memory. This is helpful for some scenarios that expected an assembly to be loaded from a physical file. - - - - - Controls if .pdbs for reference assemblies are also embedded. - - - - - Controls if runtime assemblies are also embedded. - - - - - Controls whether the runtime assemblies are embedded with their full path or only with their assembly name. - - - - - Embedded assemblies are compressed by default, and uncompressed when they are loaded. You can turn compression off with this option. - - - - - As part of Costura, embedded assemblies are no longer included as part of the build. This cleanup can be turned off. - - - - - Costura by default will load as part of the module initialization. This flag disables that behavior. Make sure you call CosturaUtility.Initialize() somewhere in your code. - - - - - Costura will by default use assemblies with a name like 'resources.dll' as a satellite resource and prepend the output path. This flag disables that behavior. - - - - - A list of assembly names to exclude from the default action of "embed all Copy Local references", delimited with | - - - - - A list of assembly names to include from the default action of "embed all Copy Local references", delimited with |. - - - - - A list of runtime assembly names to exclude from the default action of "embed all Copy Local references", delimited with | - - - - - A list of runtime assembly names to include from the default action of "embed all Copy Local references", delimited with |. - - - - - A list of unmanaged 32 bit assembly names to include, delimited with |. - - - - - A list of unmanaged 64 bit assembly names to include, delimited with |. - - - - - The order of preloaded assemblies, delimited with |. - - - - - - - - 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. - - - - - A comma-separated list of error codes that can be safely ignored in assembly verification. - - - - - 'false' to turn off automatic generation of the XML Schema file. - - - - - \ No newline at end of file diff --git a/TakoTakoScripts/TakoTakoScripts.Common/TakoTakoScripts.Common.csproj b/TakoTakoScripts/TakoTakoScripts.Common/TakoTakoScripts.Common.csproj deleted file mode 100644 index 93116fc..0000000 --- a/TakoTakoScripts/TakoTakoScripts.Common/TakoTakoScripts.Common.csproj +++ /dev/null @@ -1,16 +0,0 @@ - - - - net48 - TakoTako.Common - TakoTako.Common - latest - - - - - ..\..\TakoTako\References\Newtonsoft.Json.dll - - - - diff --git a/TakoTakoScripts/TakoTakoScripts.sln.DotSettings b/TakoTakoScripts/TakoTakoScripts.sln.DotSettings deleted file mode 100644 index 0b1fe32..0000000 --- a/TakoTakoScripts/TakoTakoScripts.sln.DotSettings +++ /dev/null @@ -1,7 +0,0 @@ - - ACB - OGG - TJA - True - True - True \ No newline at end of file diff --git a/TakoTakoScripts/global.json b/TakoTakoScripts/global.json deleted file mode 100644 index e5674e1..0000000 --- a/TakoTakoScripts/global.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "sdk": { - "version": "5.0.0", - "rollForward": "latestMinor", - "allowPrerelease": false - } -} \ No newline at end of file From d45e33f966e5a88b5f91ef8763c57c84fb9df66e Mon Sep 17 00:00:00 2001 From: Fluto Date: Thu, 10 Feb 2022 20:12:18 +1100 Subject: [PATCH 3/7] tja2bin doesn't like floats for it's BRANCHSTART command so round it up to an int --- TJAConvert/Program.cs | 33 +++++++++++++++++++++++++++++++-- TJAConvert/TJAConvert.csproj | 3 ++- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/TJAConvert/Program.cs b/TJAConvert/Program.cs index ca5a74e..bc8304f 100644 --- a/TJAConvert/Program.cs +++ b/TJAConvert/Program.cs @@ -679,7 +679,7 @@ namespace TJAConvert attempts--; // todo: Not sure how to solve this, so ignore it for now - if (result.Contains("branches must have same measure count") || result.Contains("invalid #BRANCHSTART")) + if (result.Contains("branches must have same measure count")) return -2; async Task RunProcess() @@ -858,10 +858,39 @@ namespace TJAConvert return true; } + if (result.Contains("invalid #BRANCHSTART")) + { + var currentLines = File.ReadLines(newPath).ToList(); + for (var i = 0; i < currentLines.Count; i++) + { + var line = currentLines[i]; + if (!line.StartsWith("#BRANCHSTART p,", StringComparison.InvariantCultureIgnoreCase)) + continue; + + var arguments = line.Substring("#BRANCHSTART ".Length).Split(','); + // This invalid branch start error needs to be manually resolved + if (arguments.Length != 3) + return false; + + float number1; + float number2; + if (!float.TryParse(arguments[1], out var test)) + return false; + + number1 = test; + if (!float.TryParse(arguments[2], out test)) + return false; + + number2 = test; + currentLines[i] = $"#BRANCHSTART p,{(int)Math.Ceiling(number1)},{(int)Math.Ceiling(number2)}"; + } + File.WriteAllLines(newPath, currentLines); + return true; + } + if (result.Contains("#E must be after the #N branch") || result.Contains("#M must be after the #E branch")) { var currentLines = File.ReadLines(newPath).ToList(); - // var problematicCourse = GetCourseWithProblems(); string currentBranch = ""; int startOfBranch = -1; diff --git a/TJAConvert/TJAConvert.csproj b/TJAConvert/TJAConvert.csproj index 021884a..4b2fc3c 100644 --- a/TJAConvert/TJAConvert.csproj +++ b/TJAConvert/TJAConvert.csproj @@ -39,6 +39,7 @@ - + + From b27df3081586d4d0c29970376457dc4c352e42a9 Mon Sep 17 00:00:00 2001 From: Fluto Date: Fri, 11 Feb 2022 18:38:29 +1100 Subject: [PATCH 4/7] Added 2 second padding if offset is > - 1f --- TJAConvert/Program.cs | 70 ++++++++++++++++++++++++++++++++---------- TakoTako/MusicPatch.cs | 23 ++++++++------ 2 files changed, 68 insertions(+), 25 deletions(-) diff --git a/TJAConvert/Program.cs b/TJAConvert/Program.cs index bc8304f..c84193b 100644 --- a/TJAConvert/Program.cs +++ b/TJAConvert/Program.cs @@ -22,6 +22,9 @@ namespace TJAConvert { public static class Program { + public const int PaddedSongTime = 2 * 1000; // in ms + public const float TjaOffsetForPaddingSong = -1.0f; // in ms + public static async Task Main(string[] args) { if (args.Length != 1) @@ -100,7 +103,7 @@ namespace TJAConvert Directory.CreateDirectory(tempOutDirectory); var originalTjaData = File.ReadAllBytes(tjaPath); - var tjaHash = (int)(MurmurHash2.Hash(originalTjaData) & 0xFFFF_FFF); + var tjaHash = (int) (MurmurHash2.Hash(originalTjaData) & 0xFFFF_FFF); var passed = await TJAToFumens(metadata, tjaPath, tjaHash, tempOutDirectory); if (passed >= 0) passed = CreateMusicFile(metadata, tjaHash, tempOutDirectory) ? 0 : -1; @@ -108,14 +111,16 @@ namespace TJAConvert var copyFilePath = Path.Combine(newDirectory, Path.GetFileName(originalAudioPath)); File.Copy(originalAudioPath, copyFilePath); + int millisecondsAddedSilence = metadata.Offset > TjaOffsetForPaddingSong ? PaddedSongTime : 0; + var audioExtension = Path.GetExtension(copyFilePath).TrimStart('.'); switch (audioExtension.ToLowerInvariant()) { case "wav": - if (passed >= 0) passed = WavToACB(copyFilePath, tempOutDirectory, tjaHash) ? 0 : -1; + if (passed >= 0) passed = WavToACB(copyFilePath, tempOutDirectory, tjaHash, millisecondsAddedSilence: millisecondsAddedSilence) ? 0 : -1; break; case "ogg": - if (passed >= 0) passed = OGGToACB(copyFilePath, tempOutDirectory, tjaHash) ? 0 : -1; + if (passed >= 0) passed = OGGToACB(copyFilePath, tempOutDirectory, tjaHash, millisecondsAddedSilence) ? 0 : -1; break; default: Console.WriteLine($"Do not support {audioExtension} audio files"); @@ -202,6 +207,7 @@ namespace TJAConvert { try { + var addedTime = metadata.Offset > TjaOffsetForPaddingSong ? PaddedSongTime : 0; var musicInfo = new CustomSong { id = tjaHash.ToString(), @@ -212,8 +218,8 @@ namespace TJAConvert branchHard = false, branchMania = false, branchUra = false, - previewPos = (int) (metadata.PreviewTime * 1000), - fumenOffsetPos = (int) (metadata.Offset * 10), + previewPos = (int) (metadata.PreviewTime * 1000) + addedTime, + fumenOffsetPos = (int) (metadata.Offset * 10) + (addedTime), tjaFileHash = tjaHash, songName = new TextEntry() { @@ -882,8 +888,9 @@ namespace TJAConvert return false; number2 = test; - currentLines[i] = $"#BRANCHSTART p,{(int)Math.Ceiling(number1)},{(int)Math.Ceiling(number2)}"; + currentLines[i] = $"#BRANCHSTART p,{(int) Math.Ceiling(number1)},{(int) Math.Ceiling(number2)}"; } + File.WriteAllLines(newPath, currentLines); return true; } @@ -1059,7 +1066,7 @@ namespace TJAConvert } } - private static bool OGGToACB(string oggPath, string outDirectory, int tjaHash) + private static bool OGGToACB(string oggPath, string outDirectory, int tjaHash, int millisecondsAddedSilence = 0) { try { @@ -1072,7 +1079,7 @@ namespace TJAConvert using (FileStream compressedFileStream = File.Create($"{acbPath}.acb")) decompressor.CopyTo(compressedFileStream); - var hca = OggToHca(oggPath); + var hca = OggToHca(oggPath, millisecondsAddedSilence); if (hca == null) return false; @@ -1092,7 +1099,7 @@ namespace TJAConvert } } - private static bool WavToACB(string wavPath, string outDirectory, int tjaHash, bool deleteWav = false) + private static bool WavToACB(string wavPath, string outDirectory, int tjaHash, bool deleteWav = false, int millisecondsAddedSilence = 0) { try { @@ -1105,7 +1112,7 @@ namespace TJAConvert using (FileStream compressedFileStream = File.Create($"{acbPath}.acb")) decompressor.CopyTo(compressedFileStream); - var hca = WavToHca(wavPath); + var hca = WavToHca(wavPath, millisecondsAddedSilence); File.WriteAllBytes($"{acbPath}/00000.hca", hca); Pack(acbPath); if (File.Exists($"{outDirectory}/song_{tjaHash}.bin")) @@ -1125,22 +1132,53 @@ namespace TJAConvert } } - private static byte[] WavToHca(string path) + private static byte[] WavToHca(string path, int millisecondSilence = 0) { + var wavReader = new WaveReader(); var hcaWriter = new HcaWriter(); - var waveReader = new WaveReader(); - var audioData = waveReader.Read(File.ReadAllBytes(path)); - return hcaWriter.GetFile(audioData); + + if (millisecondSilence > 0) + { + WaveFileReader reader = new WaveFileReader(path); + var memoryStream = new MemoryStream(); + + var trimmed = new OffsetSampleProvider(reader.ToSampleProvider()) + { + DelayBy = TimeSpan.FromMilliseconds(millisecondSilence) + }; + WaveFileWriter.WriteWavFileToStream(memoryStream, trimmed.ToWaveProvider16()); + + var audioData = wavReader.Read(memoryStream.ToArray()); + return hcaWriter.GetFile(audioData); + } + else + { + var audioData = wavReader.Read(File.ReadAllBytes(path)); + return hcaWriter.GetFile(audioData); + } } - private static byte[] OggToHca(string inPath) + private static byte[] OggToHca(string inPath, int millisecondSilence = 0) { try { using FileStream fileIn = new FileStream(inPath, FileMode.Open); var vorbis = new VorbisWaveReader(fileIn); + var wavProvider = new SampleToWaveProvider16(vorbis); var memoryStream = new MemoryStream(); - WaveFileWriter.WriteWavFileToStream(memoryStream, new SampleToWaveProvider16(vorbis)); + + if (millisecondSilence > 0) + { + var trimmed = new OffsetSampleProvider(wavProvider.ToSampleProvider()) + { + DelayBy = TimeSpan.FromMilliseconds(millisecondSilence) + }; + WaveFileWriter.WriteWavFileToStream(memoryStream, trimmed.ToWaveProvider16()); + } + else + { + WaveFileWriter.WriteWavFileToStream(memoryStream, wavProvider); + } var hcaWriter = new HcaWriter(); var waveReader = new WaveReader(); diff --git a/TakoTako/MusicPatch.cs b/TakoTako/MusicPatch.cs index 255afc0..90f398d 100644 --- a/TakoTako/MusicPatch.cs +++ b/TakoTako/MusicPatch.cs @@ -192,7 +192,7 @@ public class MusicPatch { if (IsTjaConverted(musicDirectory, out var conversionStatus) && conversionStatus != null) { - foreach (var item in conversionStatus.Items.Where(item => item.Successful)) + foreach (var item in conversionStatus.Items.Where(item => item.Successful && item.Version == ConversionStatus.ConversionItem.CurrentVersion)) SubmitDirectory(Path.Combine(musicDirectory, item.FolderName), true); return; } @@ -239,14 +239,14 @@ public class MusicPatch if (!match.Success) continue; - var resultInt = int.Parse(match.Groups["ID"].Value); + var resultCode = int.Parse(match.Groups["ID"].Value); var folderPath = match.Groups["PATH"].Value; folderPath = Path.GetFullPath(folderPath).Replace(Path.GetFullPath(musicDirectory), "."); var existingEntry = conversionStatus.Items.FirstOrDefault(x => x.FolderName == folderPath); var asciiFolderPath = Regex.Replace(folderPath, @"[^\u0000-\u007F]+", string.Empty); - if (resultInt >= 0) + if (resultCode >= 0) Log.LogInfo($"Converted {asciiFolderPath} successfully"); else Log.LogError($"Could not convert {asciiFolderPath}"); @@ -257,13 +257,17 @@ public class MusicPatch { Attempts = 1, FolderName = folderPath, - Successful = resultInt >= 0, + Successful = resultCode >= 0, + ResultCode = resultCode, + Version = ConversionStatus.ConversionItem.CurrentVersion, }); } else { existingEntry.Attempts++; - existingEntry.Successful = resultInt >= 0; + existingEntry.Successful = resultCode >= 0; + existingEntry.ResultCode = resultCode; + existingEntry.Version = ConversionStatus.ConversionItem.CurrentVersion; } } @@ -422,7 +426,7 @@ public class MusicPatch if (conversionStatus == null) return false; - return conversionStatus.Items.Count != 0 && conversionStatus.Items.All(x => x.Successful); + return conversionStatus.Items.Count != 0 && conversionStatus.Items.All(x => x.Successful && x.Version == ConversionStatus.ConversionItem.CurrentVersion); } catch { @@ -1881,13 +1885,14 @@ public class MusicPatch public class ConversionItem { - [JsonIgnore] public const int CurrentVersion = 1; + [JsonIgnore] public const int CurrentVersion = 2; [JsonIgnore] public const int MaxAttempts = 3; [JsonProperty("f")] public string FolderName; [JsonProperty("a")] public int Attempts; [JsonProperty("s")] public bool Successful; - [JsonProperty("v")] public int Version = CurrentVersion; + [JsonProperty("v")] public int Version; + [JsonProperty("e")] public int ResultCode; public override string ToString() { @@ -1902,4 +1907,4 @@ public class MusicPatch public string SongName; public int UniqueId; } -} \ No newline at end of file +} From d296cfc8fb01c4052c679319daf595dd77ef32fa Mon Sep 17 00:00:00 2001 From: Fluto Date: Fri, 11 Feb 2022 19:34:32 +1100 Subject: [PATCH 5/7] Fallback to English or Japanese song titles if user language is not that --- TakoTako/MusicPatch.cs | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/TakoTako/MusicPatch.cs b/TakoTako/MusicPatch.cs index 90f398d..26c9850 100644 --- a/TakoTako/MusicPatch.cs +++ b/TakoTako/MusicPatch.cs @@ -629,7 +629,7 @@ public class MusicPatch void Add(string key, TextEntry textEntry) { - var (text, font) = GetValuesTextEntry(textEntry); + var (text, font) = GetValuesTextEntry(textEntry, languageValue); musicInfoAccessors.Add(new WordDataInterface.WordListInfoAccesser(key, text, font)); } } @@ -688,11 +688,11 @@ public class MusicPatch return (text, font); } - (string text, int font) GetValuesTextEntry(TextEntry textEntry) + (string text, int font) GetValuesTextEntry(TextEntry textEntry, string selectedLanguage) { string text; int font; - switch (languageValue) + switch (selectedLanguage) { case "Japanese": text = textEntry.jpText; @@ -739,7 +739,31 @@ public class MusicPatch break; } - if (!string.IsNullOrEmpty(text)) return (text, font); + // if this text is default, and we're not English / Japanese default to one of them + if (string.IsNullOrEmpty(text) && selectedLanguage != "Japanese" && selectedLanguage != "English") + { + string fallbackLanguage; + switch (selectedLanguage) + { + case "Chinese": + case "ChineseT": + case "ChineseTraditional": + case "ChineseSimplified": + case "ChineseS": + case "Korean": + fallbackLanguage = "Japanese"; + break; + default: + fallbackLanguage = "English"; + break; + } + + return GetValuesTextEntry(textEntry, fallbackLanguage); + } + + if (!string.IsNullOrEmpty(text)) + return (text, font); + text = textEntry.text; font = textEntry.font; From c3b3aa9c9128a5ac9104cd280c05c68671c5e60b Mon Sep 17 00:00:00 2001 From: Fluto Date: Fri, 11 Feb 2022 19:34:49 +1100 Subject: [PATCH 6/7] Build TJAConvert before building TakoTako --- TakoTako.sln | 3 +++ 1 file changed, 3 insertions(+) diff --git a/TakoTako.sln b/TakoTako.sln index fe4a263..96f2f2d 100644 --- a/TakoTako.sln +++ b/TakoTako.sln @@ -5,6 +5,9 @@ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TJAConvert", "TJAConvert\TJAConvert.csproj", "{9ED2476B-FB39-4BE9-8661-21311AD9A3E8}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TakoTako", "TakoTako\TakoTako.csproj", "{3B286FDB-8AB8-49B0-852E-5180AFBC20D5}" + ProjectSection(ProjectDependencies) = postProject + {9ED2476B-FB39-4BE9-8661-21311AD9A3E8} = {9ED2476B-FB39-4BE9-8661-21311AD9A3E8} + EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution From 3820d5e3e68af33e22dadda4cee6c5f9ded91cfc Mon Sep 17 00:00:00 2001 From: Fluto Date: Fri, 11 Feb 2022 19:36:59 +1100 Subject: [PATCH 7/7] Updated Mod Version --- TakoTako/TakoTako.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/TakoTako/TakoTako.csproj b/TakoTako/TakoTako.csproj index 309e4c0..9c8f67c 100644 --- a/TakoTako/TakoTako.csproj +++ b/TakoTako/TakoTako.csproj @@ -4,12 +4,12 @@ net48 com.fluto.takotako Fixes Taiko issues and allows custom songs - 2.0.0 + 2.1.0 true latest TakoTako com.fluto.takotako - 2.0.0 + 2.1.0