From 2898fbb383a2442b5e82c1af2bfff3e1f97da9f3 Mon Sep 17 00:00:00 2001 From: RileyTheFox Date: Thu, 4 May 2023 23:13:42 +0100 Subject: [PATCH 1/4] Added extracted CON read/write for song cache --- Assets/Script/Audio/Bass/BassStemMixer.cs | 6 +- Assets/Script/Serialization/Xbox/XboxImage.cs | 5 +- .../Script/Serialization/Xbox/XboxMoggData.cs | 97 ++++---- Assets/Script/Song/CacheHelpers.cs | 209 ++++++++++++++++++ Assets/Script/Song/CacheHelpers.cs.meta | 3 + Assets/Script/Song/SongCache.cs | 23 +- 6 files changed, 287 insertions(+), 56 deletions(-) create mode 100644 Assets/Script/Song/CacheHelpers.cs create mode 100644 Assets/Script/Song/CacheHelpers.cs.meta diff --git a/Assets/Script/Audio/Bass/BassStemMixer.cs b/Assets/Script/Audio/Bass/BassStemMixer.cs index 6acd3aa1c..1224c1c21 100644 --- a/Assets/Script/Audio/Bass/BassStemMixer.cs +++ b/Assets/Script/Audio/Bass/BassStemMixer.cs @@ -76,7 +76,7 @@ public bool SetupMogg(bool isSpeedUp) { return false; } - foreach((var stem, int[] channelIndexes) in _moggData.stemMaps) { + foreach((var stem, int[] channelIndexes) in _moggData.StemMaps) { // For every channel index in this stem, add it to the list of channels int[] channelStreams = channelIndexes.Select(i => splitStreams[i]).ToArray(); var channel = new BassMoggStem(_manager, stem, channelStreams); @@ -87,8 +87,8 @@ public bool SetupMogg(bool isSpeedUp) { var matrixes = new List(); foreach (var channelIndex in channelIndexes) { var matrix = new float[2]; - matrix[0] = _moggData.matrixRatios[channelIndex, 0]; - matrix[1] = _moggData.matrixRatios[channelIndex, 1]; + matrix[0] = _moggData.MatrixRatios[channelIndex, 0]; + matrix[1] = _moggData.MatrixRatios[channelIndex, 1]; matrixes.Add(matrix); } diff --git a/Assets/Script/Serialization/Xbox/XboxImage.cs b/Assets/Script/Serialization/Xbox/XboxImage.cs index b14229800..2f261113e 100644 --- a/Assets/Script/Serialization/Xbox/XboxImage.cs +++ b/Assets/Script/Serialization/Xbox/XboxImage.cs @@ -15,8 +15,9 @@ public class XboxImage { public int Format { get; set; } public short Width { get; set; } public short Height { get; set; } - private uint ImgSize; - private uint[] ImgOffsets; + public uint ImgSize { get; } + public uint[] ImgOffsets { get; } + private bool isFromCON = false; [JsonIgnore] diff --git a/Assets/Script/Serialization/Xbox/XboxMoggData.cs b/Assets/Script/Serialization/Xbox/XboxMoggData.cs index 5451da223..fe4530861 100644 --- a/Assets/Script/Serialization/Xbox/XboxMoggData.cs +++ b/Assets/Script/Serialization/Xbox/XboxMoggData.cs @@ -20,8 +20,9 @@ public class XboxMoggData { public int ChannelCount { get; set; } public int Header { get; set; } - private uint MoggSize = 0; - private uint[] MoggOffsets = null; + public uint MoggSize { get; } + public uint[] MoggOffsets { get; } + private bool isFromCON = false; public int MoggAddressAudioOffset { get; set; } @@ -30,11 +31,11 @@ public class XboxMoggData { public float[] PanData { get; set; } public float[] VolumeData { get; set; } - public Dictionary tracks; - public int[] crowdChannels; + public Dictionary Tracks { get; set; } + public int[] CrowdChannels { get; set; } - public Dictionary stemMaps; - public float[,] matrixRatios; + public Dictionary StemMaps { get; set; } + public float[,] MatrixRatios { get; set; } public XboxMoggData(string str) { MoggPath = str; @@ -85,7 +86,7 @@ public void ParseFromDta(DataArray dta) { switch (dtaArray[0].ToString()) { case "tracks": var trackArray = (DataArray) dtaArray[1]; - tracks = new Dictionary(); + Tracks = new Dictionary(); for (int x = 0; x < trackArray.Count; x++) { if (trackArray[x] is not DataArray instrArray) continue; @@ -98,11 +99,11 @@ public void ParseFromDta(DataArray dta) { val = new int[trackNums.Count]; for (int y = 0; y < trackNums.Count; y++) val[y] = ((DataAtom) trackNums[y]).Int; - tracks.Add(key, val); + Tracks.Add(key, val); } else if (instrArray[1] is DataAtom trackNum) { val = new int[1]; val[0] = trackNum.Int; - tracks.Add(key, val); + Tracks.Add(key, val); } } break; @@ -118,9 +119,9 @@ public void ParseFromDta(DataArray dta) { for (int v = 0; v < volArray.Count; v++) VolumeData[v] = ((DataAtom) volArray[v]).Float; break; case "crowd_channels": - crowdChannels = new int[dtaArray.Count - 1]; + CrowdChannels = new int[dtaArray.Count - 1]; for (int cc = 1; cc < dtaArray.Count; cc++) - crowdChannels[cc - 1] = ((DataAtom) dtaArray[cc]).Int; + CrowdChannels[cc - 1] = ((DataAtom) dtaArray[cc]).Int; break; } } @@ -128,7 +129,7 @@ public void ParseFromDta(DataArray dta) { public override string ToString() { string debugTrackStr = ""; - foreach (var kvp in tracks) { + foreach (var kvp in Tracks) { debugTrackStr += $"{kvp.Key}, ({string.Join(", ", kvp.Value)}) "; } @@ -142,39 +143,39 @@ public override string ToString() { } public void CalculateMoggBassInfo() { - stemMaps = new Dictionary(); + StemMaps = new Dictionary(); var mapped = new bool[ChannelCount]; // BEGIN BASS Stem Mapping ---------------------------------------------------------------------- - if (tracks.TryGetValue("drum", out var drumArray)) { + if (Tracks.TryGetValue("drum", out var drumArray)) { switch (drumArray.Length) { //drum (0 1): stereo kit --> (0 1) case 2: - stemMaps[SongStem.Drums] = new[] { drumArray[0], drumArray[1] }; + StemMaps[SongStem.Drums] = new[] { drumArray[0], drumArray[1] }; break; //drum (0 1 2): mono kick, stereo snare/kit --> (0) (1 2) case 3: - stemMaps[SongStem.Drums1] = new[] { drumArray[0] }; - stemMaps[SongStem.Drums2] = new[] { drumArray[1], drumArray[2] }; + StemMaps[SongStem.Drums1] = new[] { drumArray[0] }; + StemMaps[SongStem.Drums2] = new[] { drumArray[1], drumArray[2] }; break; //drum (0 1 2 3): mono kick, mono snare, stereo kit --> (0) (1) (2 3) case 4: - stemMaps[SongStem.Drums1] = new[] { drumArray[0] }; - stemMaps[SongStem.Drums2] = new[] { drumArray[1] }; - stemMaps[SongStem.Drums3] = new[] { drumArray[2], drumArray[3] }; + StemMaps[SongStem.Drums1] = new[] { drumArray[0] }; + StemMaps[SongStem.Drums2] = new[] { drumArray[1] }; + StemMaps[SongStem.Drums3] = new[] { drumArray[2], drumArray[3] }; break; //drum (0 1 2 3 4): mono kick, stereo snare, stereo kit --> (0) (1 2) (3 4) case 5: - stemMaps[SongStem.Drums1] = new[] { drumArray[0] }; - stemMaps[SongStem.Drums2] = new[] { drumArray[1], drumArray[2] }; - stemMaps[SongStem.Drums3] = new[] { drumArray[3], drumArray[4] }; + StemMaps[SongStem.Drums1] = new[] { drumArray[0] }; + StemMaps[SongStem.Drums2] = new[] { drumArray[1], drumArray[2] }; + StemMaps[SongStem.Drums3] = new[] { drumArray[3], drumArray[4] }; break; //drum (0 1 2 3 4 5): stereo kick, stereo snare, stereo kit --> (0 1) (2 3) (4 5) case 6: - stemMaps[SongStem.Drums1] = new[] { drumArray[0], drumArray[1] }; - stemMaps[SongStem.Drums2] = new[] { drumArray[2], drumArray[3] }; - stemMaps[SongStem.Drums3] = new[] { drumArray[4], drumArray[5] }; + StemMaps[SongStem.Drums1] = new[] { drumArray[0], drumArray[1] }; + StemMaps[SongStem.Drums2] = new[] { drumArray[2], drumArray[3] }; + StemMaps[SongStem.Drums3] = new[] { drumArray[4], drumArray[5] }; break; } @@ -183,58 +184,58 @@ public void CalculateMoggBassInfo() { } } - if (tracks.TryGetValue("bass", out var bassArray)) { - stemMaps[SongStem.Bass] = new int[bassArray.Length]; + if (Tracks.TryGetValue("bass", out var bassArray)) { + StemMaps[SongStem.Bass] = new int[bassArray.Length]; for (int i = 0; i < bassArray.Length; i++) { - stemMaps[SongStem.Bass][i] = bassArray[i]; + StemMaps[SongStem.Bass][i] = bassArray[i]; mapped[bassArray[i]] = true; } } - if (tracks.TryGetValue("guitar", out var gtrArray)) { - stemMaps[SongStem.Guitar] = new int[gtrArray.Length]; + if (Tracks.TryGetValue("guitar", out var gtrArray)) { + StemMaps[SongStem.Guitar] = new int[gtrArray.Length]; for (int i = 0; i < gtrArray.Length; i++) { - stemMaps[SongStem.Guitar][i] = gtrArray[i]; + StemMaps[SongStem.Guitar][i] = gtrArray[i]; mapped[gtrArray[i]] = true; } } - if (tracks.TryGetValue("vocals", out var voxArray)) { - stemMaps[SongStem.Vocals] = new int[voxArray.Length]; + if (Tracks.TryGetValue("vocals", out var voxArray)) { + StemMaps[SongStem.Vocals] = new int[voxArray.Length]; for (int i = 0; i < voxArray.Length; i++) { - stemMaps[SongStem.Vocals][i] = voxArray[i]; + StemMaps[SongStem.Vocals][i] = voxArray[i]; mapped[voxArray[i]] = true; } } - if (tracks.TryGetValue("keys", out var keysArray)) { - stemMaps[SongStem.Keys] = new int[keysArray.Length]; + if (Tracks.TryGetValue("keys", out var keysArray)) { + StemMaps[SongStem.Keys] = new int[keysArray.Length]; for (int i = 0; i < keysArray.Length; i++) { - stemMaps[SongStem.Keys][i] = keysArray[i]; + StemMaps[SongStem.Keys][i] = keysArray[i]; mapped[keysArray[i]] = true; } } - if (crowdChannels != null) { - stemMaps[SongStem.Crowd] = new int[crowdChannels.Length]; - for (int i = 0; i < crowdChannels.Length; i++) { - stemMaps[SongStem.Crowd][i] = crowdChannels[i]; - mapped[crowdChannels[i]] = true; + if (CrowdChannels != null) { + StemMaps[SongStem.Crowd] = new int[CrowdChannels.Length]; + for (int i = 0; i < CrowdChannels.Length; i++) { + StemMaps[SongStem.Crowd][i] = CrowdChannels[i]; + mapped[CrowdChannels[i]] = true; } } // every index in mapped that is still false, goes in the backing var fakeIndices = Enumerable.Range(0, mapped.Length).Where(i => !mapped[i]).ToList(); - stemMaps[SongStem.Song] = new int[fakeIndices.Count]; + StemMaps[SongStem.Song] = new int[fakeIndices.Count]; for (int i = 0; i < fakeIndices.Count; i++) { - stemMaps[SongStem.Song][i] = fakeIndices[i]; + StemMaps[SongStem.Song][i] = fakeIndices[i]; } // END BASS Stem Mapping ------------------------------------------------------------------------ // BEGIN BASS Matrix calculation ---------------------------------------------------------------- - matrixRatios = new float[PanData.Length, 2]; + MatrixRatios = new float[PanData.Length, 2]; Parallel.For(0, PanData.Length, i => { float theta = PanData[i] * ((float) Math.PI / 4); @@ -243,8 +244,8 @@ public void CalculateMoggBassInfo() { float volRatio = (float) Math.Pow(10, VolumeData[i] / 20); - matrixRatios[i, 0] = volRatio * ratioL; - matrixRatios[i, 1] = volRatio * ratioR; + MatrixRatios[i, 0] = volRatio * ratioL; + MatrixRatios[i, 1] = volRatio * ratioR; }); // END BASS Matrix calculation ------------------------------------------------------------------ diff --git a/Assets/Script/Song/CacheHelpers.cs b/Assets/Script/Song/CacheHelpers.cs new file mode 100644 index 000000000..00f306f15 --- /dev/null +++ b/Assets/Script/Song/CacheHelpers.cs @@ -0,0 +1,209 @@ +using System.Collections.Generic; +using System.IO; +using YARG.Serialization; + +namespace YARG.Song { + public static class CacheHelpers { + + public static void WriteExtractedConData(BinaryWriter writer, ExtractedConSongEntry conSong) { + /*/ + + MOGG data + + */ + + writer.Write(conSong.MoggInfo.MoggPath); + writer.Write(conSong.MoggInfo.ChannelCount); + writer.Write(conSong.MoggInfo.Header); + writer.Write(conSong.MoggInfo.MoggSize); + + // Write offsets (length + offsets) + writer.Write(conSong.MoggInfo.MoggOffsets.Length); + foreach (uint offset in conSong.MoggInfo.MoggOffsets) { + writer.Write(offset); + } + + writer.Write(conSong.MoggInfo.MoggAddressAudioOffset); + writer.Write(conSong.MoggInfo.MoggAudioLength); + + // Write Pan Data + writer.Write(conSong.MoggInfo.PanData.Length); + foreach (float pan in conSong.MoggInfo.PanData) { + writer.Write(pan); + } + + // Write Volume Data + writer.Write(conSong.MoggInfo.VolumeData.Length); + foreach (float vol in conSong.MoggInfo.VolumeData) { + writer.Write(vol); + } + + // Write Track Data + writer.Write(conSong.MoggInfo.Tracks.Count); + foreach (var track in conSong.MoggInfo.Tracks) { + writer.Write(track.Key); + writer.Write(track.Value.Length); + foreach (int i in track.Value) { + writer.Write(i); + } + } + + // Write Crowd Data + writer.Write(conSong.MoggInfo.CrowdChannels.Length); + foreach (int i in conSong.MoggInfo.CrowdChannels) { + writer.Write(i); + } + + // Write Stem Data + writer.Write(conSong.MoggInfo.StemMaps.Count); + foreach (var stem in conSong.MoggInfo.StemMaps) { + writer.Write((int)stem.Key); + writer.Write(stem.Value.Length); + foreach (int i in stem.Value) { + writer.Write(i); + } + } + + // Write Matrix Data + writer.Write(conSong.MoggInfo.MatrixRatios.GetLength(0)); + writer.Write(conSong.MoggInfo.MatrixRatios.GetLength(1)); + for (int i = 0; i < conSong.MoggInfo.MatrixRatios.GetLength(0); i++) { + for (int j = 0; j < conSong.MoggInfo.MatrixRatios.GetLength(1); j++) { + writer.Write(conSong.MoggInfo.MatrixRatios[i, j]); + } + } + + /*/ + + Image data + + */ + + writer.Write(conSong.ImageInfo.ImagePath); + writer.Write(conSong.ImageInfo.BitsPerPixel); + writer.Write(conSong.ImageInfo.Format); + writer.Write(conSong.ImageInfo.ImgSize); + + // Write image offsets + writer.Write(conSong.ImageInfo.ImgOffsets.Length); + foreach (uint offset in conSong.ImageInfo.ImgOffsets) { + writer.Write(offset); + } + + } + + public static void ReadExtractedConData(BinaryReader reader, ExtractedConSongEntry conSong) { + string path = reader.ReadString(); + int channelCount = reader.ReadInt32(); + int header = reader.ReadInt32(); + uint moggSize = reader.ReadUInt32(); + + // Read offsets (length + offsets) + int offsetCount = reader.ReadInt32(); + var offsets = new uint[offsetCount]; + for (int i = 0; i < offsetCount; i++) { + offsets[i] = reader.ReadUInt32(); + } + + int moggAddressAudioOffset = reader.ReadInt32(); + int moggAudioLength = reader.ReadInt32(); + + // Read Pan Data + int panDataLength = reader.ReadInt32(); + var panData = new float[panDataLength]; + for (int i = 0; i < panDataLength; i++) { + panData[i] = reader.ReadSingle(); + } + + // Read Volume Data + int volumeDataLength = reader.ReadInt32(); + var volumeData = new float[volumeDataLength]; + for (int i = 0; i < volumeDataLength; i++) { + volumeData[i] = reader.ReadSingle(); + } + + // Read Track Data + int trackCount = reader.ReadInt32(); + var tracks = new Dictionary(); + for (int i = 0; i < trackCount; i++) { + string trackName = reader.ReadString(); + int trackLength = reader.ReadInt32(); + var track = new int[trackLength]; + for (int j = 0; j < trackLength; j++) { + track[j] = reader.ReadInt32(); + } + tracks.Add(trackName, track); + } + + // Read Crowd Data + int crowdChannelCount = reader.ReadInt32(); + var crowdChannels = new int[crowdChannelCount]; + for (int i = 0; i < crowdChannelCount; i++) { + crowdChannels[i] = reader.ReadInt32(); + } + + // Read Stem Data + int stemCount = reader.ReadInt32(); + var stemMaps = new Dictionary(); + for (int i = 0; i < stemCount; i++) { + var stem = (SongStem)reader.ReadInt32(); + int stemLength = reader.ReadInt32(); + var stemMap = new int[stemLength]; + for (int j = 0; j < stemLength; j++) { + stemMap[j] = reader.ReadInt32(); + } + stemMaps.Add(stem, stemMap); + } + + // Read Matrix Data + int matrixRowCount = reader.ReadInt32(); + int matrixColCount = reader.ReadInt32(); + var matrixRatios = new float[matrixRowCount, matrixColCount]; + for (int i = 0; i < matrixRowCount; i++) { + for (int j = 0; j < matrixColCount; j++) { + matrixRatios[i, j] = reader.ReadSingle(); + } + } + + var moggData = new XboxMoggData(path, moggSize, offsets) { + ChannelCount = channelCount, + Header = header, + MoggAddressAudioOffset = moggAddressAudioOffset, + MoggAudioLength = moggAudioLength, + PanData = panData, + VolumeData = volumeData, + Tracks = tracks, + CrowdChannels = crowdChannels, + StemMaps = stemMaps, + MatrixRatios = matrixRatios + }; + + /*/ + + Image data + + */ + + string imagePath = reader.ReadString(); + byte bitsPerPixel = reader.ReadByte(); + int format = reader.ReadInt32(); + uint imgSize = reader.ReadUInt32(); + + // Read image offsets + int imgOffsetCount = reader.ReadInt32(); + var imgOffsets = new uint[imgOffsetCount]; + for (int i = 0; i < imgOffsetCount; i++) { + imgOffsets[i] = reader.ReadUInt32(); + } + + var imageInfo = new XboxImage(imagePath, imgSize, offsets) { + BitsPerPixel = bitsPerPixel, + Format = format + }; + + conSong.MoggInfo = moggData; + conSong.ImageInfo = imageInfo; + } + + } +} \ No newline at end of file diff --git a/Assets/Script/Song/CacheHelpers.cs.meta b/Assets/Script/Song/CacheHelpers.cs.meta new file mode 100644 index 000000000..fb825e963 --- /dev/null +++ b/Assets/Script/Song/CacheHelpers.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 465dc814c9084af6a27e78b64f7b86ec +timeCreated: 1683235946 \ No newline at end of file diff --git a/Assets/Script/Song/SongCache.cs b/Assets/Script/Song/SongCache.cs index b941a86c2..66ba7b091 100644 --- a/Assets/Script/Song/SongCache.cs +++ b/Assets/Script/Song/SongCache.cs @@ -3,7 +3,9 @@ using System.IO; using System.Security.Cryptography; using System.Text; +using UnityEditor.Build.Content; using UnityEngine; +using YARG.Data; namespace YARG.Song { public class SongCache { @@ -80,8 +82,6 @@ private static void WriteSongEntry(BinaryWriter writer, SongEntry song) { writer.Write((int) SongType.ExtractedRbCon); } - // Unextracted con - writer.Write((int) song.DrumType); writer.Write(song.Name); @@ -102,11 +102,20 @@ private static void WriteSongEntry(BinaryWriter writer, SongEntry song) { writer.Write(song.MultiplierNote); writer.Write(song.Source); + // Write difficulties + writer.Write(song.PartDifficulties.Count); + foreach (var difficulty in song.PartDifficulties) { + writer.Write((int) difficulty.Key); + writer.Write(difficulty.Value); + } + switch (song) { case ExtractedConSongEntry conSong: // Write con stuff + CacheHelpers.WriteExtractedConData(writer, conSong); break; case IniSongEntry iniSong: + // These are CH specific ini properties writer.Write(iniSong.Playlist); writer.Write(iniSong.SubPlaylist); writer.Write(iniSong.IsModChart); @@ -152,9 +161,17 @@ private static SongEntry ReadSongEntry(BinaryReader reader) { result.MultiplierNote = reader.ReadInt32(); result.Source = reader.ReadString(); + // Read difficulties + int difficultyCount = reader.ReadInt32(); + for (var i = 0; i < difficultyCount; i++) { + var part = (Instrument) reader.ReadInt32(); + int difficulty = reader.ReadInt32(); + result.PartDifficulties.Add(part, difficulty); + } + switch (type) { case SongType.ExtractedRbCon: - // Con specific properties + CacheHelpers.ReadExtractedConData(reader, (ExtractedConSongEntry)result); break; case SongType.SongIni: { // Ini specific properties From 099bd350732b173ea5024bd8d0e30119f88f4de3 Mon Sep 17 00:00:00 2001 From: RileyTheFox Date: Thu, 4 May 2023 23:46:11 +0100 Subject: [PATCH 2/4] Difficulty loading from ini --- Assets/Script/Song/ScanHelpers.cs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/Assets/Script/Song/ScanHelpers.cs b/Assets/Script/Song/ScanHelpers.cs index e0a8627d7..964ab1efd 100644 --- a/Assets/Script/Song/ScanHelpers.cs +++ b/Assets/Script/Song/ScanHelpers.cs @@ -1,5 +1,7 @@ using EasySharpIni; using EasySharpIni.Converters; +using EasySharpIni.Models; +using YARG.Data; namespace YARG.Song { public static class ScanHelpers { @@ -44,6 +46,8 @@ public static ScanResult ParseSongIni(string iniFile, IniSongEntry entry) { entry.EighthNoteHopo = section.GetField("eighthnote_hopo", "false").Get().ToLower() == "true"; entry.MultiplierNote = section.GetField("multiplier_note", "116").Get(IntConverter); + ReadDifficulties(section, entry); + if (section.ContainsField("pro_drums")) { switch (section.GetField("pro_drums")) { case "true": @@ -70,5 +74,21 @@ public static ScanResult ParseSongIni(string iniFile, IniSongEntry entry) { return ScanResult.Ok; } + private static void ReadDifficulties(IniSection section, SongEntry entry) { + + entry.PartDifficulties[Instrument.GUITAR] = section.GetField("diff_guitar", "-1").Get(IntConverter); + entry.PartDifficulties[Instrument.GUITAR_COOP] = section.GetField("diff_guitar_coop", "-1").Get(IntConverter); + entry.PartDifficulties[Instrument.REAL_GUITAR] = section.GetField("diff_guitar_real", "-1").Get(IntConverter); + entry.PartDifficulties[Instrument.RHYTHM] = section.GetField("diff_rhythm", "-1").Get(IntConverter); + entry.PartDifficulties[Instrument.BASS] = section.GetField("diff_bass", "-1").Get(IntConverter); + entry.PartDifficulties[Instrument.REAL_BASS] = section.GetField("diff_bass_real", "-1").Get(IntConverter); + entry.PartDifficulties[Instrument.DRUMS] = section.GetField("diff_drums", "-1").Get(IntConverter); + entry.PartDifficulties[Instrument.GH_DRUMS] = section.GetField("diff_drums", "-1").Get(IntConverter); + entry.PartDifficulties[Instrument.REAL_DRUMS] = section.GetField("diff_drums_real", "-1").Get(IntConverter); + entry.PartDifficulties[Instrument.KEYS] = section.GetField("diff_keys", "-1").Get(IntConverter); + entry.PartDifficulties[Instrument.REAL_KEYS] = section.GetField("diff_keys_real", "-1").Get(IntConverter); + entry.PartDifficulties[Instrument.VOCALS] = section.GetField("diff_vocals", "-1").Get(IntConverter); + entry.PartDifficulties[Instrument.HARMONY] = section.GetField("diff_vocals_harm", "-1").Get(IntConverter); + } } } \ No newline at end of file From ce98cc474db389557b92170264f69eb334c6ad7e Mon Sep 17 00:00:00 2001 From: RileyTheFox Date: Thu, 4 May 2023 23:52:15 +0100 Subject: [PATCH 3/4] Did an oopsie and realised difficulties would not work --- Assets/Script/Song/ScanHelpers.cs | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/Assets/Script/Song/ScanHelpers.cs b/Assets/Script/Song/ScanHelpers.cs index 964ab1efd..1ac6d4ef3 100644 --- a/Assets/Script/Song/ScanHelpers.cs +++ b/Assets/Script/Song/ScanHelpers.cs @@ -75,20 +75,21 @@ public static ScanResult ParseSongIni(string iniFile, IniSongEntry entry) { } private static void ReadDifficulties(IniSection section, SongEntry entry) { - - entry.PartDifficulties[Instrument.GUITAR] = section.GetField("diff_guitar", "-1").Get(IntConverter); - entry.PartDifficulties[Instrument.GUITAR_COOP] = section.GetField("diff_guitar_coop", "-1").Get(IntConverter); - entry.PartDifficulties[Instrument.REAL_GUITAR] = section.GetField("diff_guitar_real", "-1").Get(IntConverter); - entry.PartDifficulties[Instrument.RHYTHM] = section.GetField("diff_rhythm", "-1").Get(IntConverter); - entry.PartDifficulties[Instrument.BASS] = section.GetField("diff_bass", "-1").Get(IntConverter); - entry.PartDifficulties[Instrument.REAL_BASS] = section.GetField("diff_bass_real", "-1").Get(IntConverter); - entry.PartDifficulties[Instrument.DRUMS] = section.GetField("diff_drums", "-1").Get(IntConverter); - entry.PartDifficulties[Instrument.GH_DRUMS] = section.GetField("diff_drums", "-1").Get(IntConverter); - entry.PartDifficulties[Instrument.REAL_DRUMS] = section.GetField("diff_drums_real", "-1").Get(IntConverter); - entry.PartDifficulties[Instrument.KEYS] = section.GetField("diff_keys", "-1").Get(IntConverter); - entry.PartDifficulties[Instrument.REAL_KEYS] = section.GetField("diff_keys_real", "-1").Get(IntConverter); - entry.PartDifficulties[Instrument.VOCALS] = section.GetField("diff_vocals", "-1").Get(IntConverter); - entry.PartDifficulties[Instrument.HARMONY] = section.GetField("diff_vocals_harm", "-1").Get(IntConverter); + entry.PartDifficulties.Clear(); + + entry.PartDifficulties.Add(Instrument.GUITAR, section.GetField("diff_guitar", "-1").Get(IntConverter)); + entry.PartDifficulties.Add(Instrument.GUITAR_COOP, section.GetField("diff_guitar_coop", "-1").Get(IntConverter)); + entry.PartDifficulties.Add(Instrument.REAL_GUITAR, section.GetField("diff_guitar_real", "-1").Get(IntConverter)); + entry.PartDifficulties.Add(Instrument.RHYTHM, section.GetField("diff_rhythm", "-1").Get(IntConverter)); + entry.PartDifficulties.Add(Instrument.BASS, section.GetField("diff_bass", "-1").Get(IntConverter)); + entry.PartDifficulties.Add(Instrument.REAL_BASS, section.GetField("diff_bass_real", "-1").Get(IntConverter)); + entry.PartDifficulties.Add(Instrument.DRUMS, section.GetField("diff_drums", "-1").Get(IntConverter)); + entry.PartDifficulties.Add(Instrument.GH_DRUMS, section.GetField("diff_drums", "-1").Get(IntConverter)); + entry.PartDifficulties.Add(Instrument.REAL_DRUMS, section.GetField("diff_drums_real", "-1").Get(IntConverter)); + entry.PartDifficulties.Add(Instrument.KEYS, section.GetField("diff_keys", "-1").Get(IntConverter)); + entry.PartDifficulties.Add(Instrument.REAL_KEYS, section.GetField("diff_keys_real", "-1").Get(IntConverter)); + entry.PartDifficulties.Add(Instrument.VOCALS, section.GetField("diff_vocals", "-1").Get(IntConverter)); + entry.PartDifficulties.Add(Instrument.HARMONY, section.GetField("diff_vocals_harm", "-1").Get(IntConverter)); } } } \ No newline at end of file From d527dd9e78876197fba0813636b6e749bdbcb3a5 Mon Sep 17 00:00:00 2001 From: RileyTheFox Date: Fri, 5 May 2023 01:19:38 +0100 Subject: [PATCH 4/4] Fixed bug loading mid files --- Assets/Script/PlayMode/Play.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Assets/Script/PlayMode/Play.cs b/Assets/Script/PlayMode/Play.cs index a682d7aa4..f087aaf5e 100644 --- a/Assets/Script/PlayMode/Play.cs +++ b/Assets/Script/PlayMode/Play.cs @@ -186,7 +186,7 @@ private IEnumerator StartSong() { private void LoadChart() { // Add main file var files = new List { - song.NotesFile + Path.Combine(song.Location, song.NotesFile) }; // Look for upgrades and add @@ -202,7 +202,7 @@ private void LoadChart() { MoonSong moonSong = null; if (song.NotesFile.EndsWith(".chart")) { Debug.Log("Reading .chart file"); - moonSong = ChartReader.ReadChart(Path.Combine(song.Location, song.NotesFile)); + moonSong = ChartReader.ReadChart(files[0]); } chart = new YargChart(moonSong);