From f1f77817b1fa067b47bc9b52f040d859848608a3 Mon Sep 17 00:00:00 2001 From: Amethyst-szs Date: Sun, 13 Jul 2025 08:17:42 -0700 Subject: [PATCH] Fix bfres and byml alignment in SarcAlignment.cs --- src/SarcLibrary/Writers/SarcAlignment.cs | 6 ++--- src/Tests/SarcLibrary.Tests/AlignmentTest.cs | 21 ++++++++++++++++++ .../SarcLibrary.Tests/Data/AirCurrent.sarc | Bin 0 -> 34260 bytes src/Tests/SarcLibrary.Tests/DataProvider.cs | 18 ++++++++++++--- .../SarcLibrary.Tests.csproj | 3 +++ 5 files changed, 42 insertions(+), 6 deletions(-) create mode 100644 src/Tests/SarcLibrary.Tests/AlignmentTest.cs create mode 100644 src/Tests/SarcLibrary.Tests/Data/AirCurrent.sarc diff --git a/src/SarcLibrary/Writers/SarcAlignment.cs b/src/SarcLibrary/Writers/SarcAlignment.cs index 6813254..5dad309 100644 --- a/src/SarcLibrary/Writers/SarcAlignment.cs +++ b/src/SarcLibrary/Writers/SarcAlignment.cs @@ -33,8 +33,8 @@ public static int Estimate(KeyValuePair> sarcEntry, i "bgsdw" or "bksky" or "bpref" or "glght" or "glpbd" or "glpbm" or "gsdw" or "ksky" or "pref" => LCM(result, 8), - "baglmf" => LCM(result, 0x80), - "sharc" or "sharcb" => LCM(result, 0x1000), + "byml" or "baglmf" => LCM(result, 0x80), + "bfres" or "sharc" or "sharcb" => LCM(result, 0x1000), "bofx" or "fmd" or "ftx" or "genvres" or "gtx" or "ofx" => LCM(result, 0x2000), _ => result }; @@ -50,7 +50,7 @@ public static int Estimate(KeyValuePair> sarcEntry, i "bchemical" or "bas" or "batcllist" or "batcl" or "baischedule" or "bdmgparam" or "brgconfiglist" or "brgconfig" or "brgbw" or "bawareness" or "bdrop" or "bshop" or "brecipe" or "blod" or "bbonectrl" or "blifecondition" or "bumii" or "baniminfo" or - "byaml" or "bassetting" or "hkrb" or "hkrg" or "bphyssb" or "hkcl" or "hksc" or + "byaml" or "byml" or "bassetting" or "hkrb" or "hkrg" or "bphyssb" or "hkcl" or "hksc" or "hktmrb" or "brgcon" or "esetlist" or "bdemo" or "bfevfl" or "bfevtm")) { result = LCM(result, GetBinaryFileAlignment(sarcEntry.Value)); diff --git a/src/Tests/SarcLibrary.Tests/AlignmentTest.cs b/src/Tests/SarcLibrary.Tests/AlignmentTest.cs new file mode 100644 index 0000000..3714dca --- /dev/null +++ b/src/Tests/SarcLibrary.Tests/AlignmentTest.cs @@ -0,0 +1,21 @@ +using Revrs; + +namespace SarcLibrary.Tests; + +public class AlignmentTest +{ + [Fact] + public void TestSMOAirCurrentSarcAlignment() + { + byte[] data = DataProvider.GetAirCurrent(); + var sarc = Sarc.FromBinary(data); + Assert.NotNull(sarc); + + MemoryStream output = new(); + sarc.Write(output); + + DataProvider.WriteGeneratedAirCurrent(output); + + Assert.Equal(data, output.ToArray()); + } +} \ No newline at end of file diff --git a/src/Tests/SarcLibrary.Tests/Data/AirCurrent.sarc b/src/Tests/SarcLibrary.Tests/Data/AirCurrent.sarc new file mode 100644 index 0000000000000000000000000000000000000000..998fac97ce7278aeab02720eb83261d8c285f7db GIT binary patch literal 34260 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 Y*Wwpbw)H*y#lR2m@3xPFG>C`(6Zot5=l}o! literal 0 HcmV?d00001 diff --git a/src/Tests/SarcLibrary.Tests/DataProvider.cs b/src/Tests/SarcLibrary.Tests/DataProvider.cs index 350dfa6..6638709 100644 --- a/src/Tests/SarcLibrary.Tests/DataProvider.cs +++ b/src/Tests/SarcLibrary.Tests/DataProvider.cs @@ -6,17 +6,29 @@ public static class DataProvider { public static byte[] GetTest1(Endianness endianness) { - return File.ReadAllBytes(endianness switch { + return File.ReadAllBytes(endianness switch + { Endianness.Little => "Data/Test1-LE.sarc", _ => "Data/Test1-BE.sarc" }); } - + public static Stream StreamTest1(Endianness endianness) { - return File.OpenRead(endianness switch { + return File.OpenRead(endianness switch + { Endianness.Little => "Data/Test1-LE.sarc", _ => "Data/Test1-BE.sarc" }); } + + + public static byte[] GetAirCurrent() + { + return File.ReadAllBytes("Data/AirCurrent.sarc"); + } + public static void WriteGeneratedAirCurrent(MemoryStream stream) + { + File.WriteAllBytes("Data/AirCurrentOutput.sarc", stream.ToArray()); + } } \ No newline at end of file diff --git a/src/Tests/SarcLibrary.Tests/SarcLibrary.Tests.csproj b/src/Tests/SarcLibrary.Tests/SarcLibrary.Tests.csproj index 8edf89b..cc2399b 100644 --- a/src/Tests/SarcLibrary.Tests/SarcLibrary.Tests.csproj +++ b/src/Tests/SarcLibrary.Tests/SarcLibrary.Tests.csproj @@ -29,6 +29,9 @@ PreserveNewest + + PreserveNewest +