diff --git a/ConverterApp/OsirisPane.cs b/ConverterApp/OsirisPane.cs index 27b3cd91..0b84681c 100644 --- a/ConverterApp/OsirisPane.cs +++ b/ConverterApp/OsirisPane.cs @@ -173,7 +173,7 @@ private void SaveSavegameDatabase() // Save globals.lsf var rewrittenStream = new MemoryStream(); FileVersion version; - if (OriginalSavePakVersion == PackageVersion.V15) + if (OriginalSavePakVersion >= PackageVersion.V15) { version = FileVersion.VerBG3; } diff --git a/ConverterApp/PackagePane.cs b/ConverterApp/PackagePane.cs index edc244ae..0633654a 100644 --- a/ConverterApp/PackagePane.cs +++ b/ConverterApp/PackagePane.cs @@ -15,7 +15,7 @@ public PackagePane(ISettingsDataSource settingsDataSource) { InitializeComponent(); - packageVersion.SelectedIndex = 1; + packageVersion.SelectedIndex = 2; compressionMethod.SelectedIndex = 3; extractPackagePath.DataBindings.Add("Text", settingsDataSource, "Settings.PAK.ExtractInputPath", true, DataSourceUpdateMode.OnPropertyChanged); @@ -97,11 +97,12 @@ private PackageVersion SelectedPackageVersion() { switch (packageVersion.SelectedIndex) { - case 0: return PackageVersion.V15; - case 1: return PackageVersion.V13; - case 2: return PackageVersion.V10; - case 3: return PackageVersion.V9; - case 4: return PackageVersion.V7; + case 0: return PackageVersion.V16; + case 1: return PackageVersion.V15; + case 2: return PackageVersion.V13; + case 3: return PackageVersion.V10; + case 4: return PackageVersion.V9; + case 5: return PackageVersion.V7; default: throw new InvalidDataException(); } } @@ -238,23 +239,24 @@ public void SetGame(Game game) switch (game) { case Game.DivinityOriginalSin: - packageVersion.SelectedIndex = 4; + packageVersion.SelectedIndex = 5; break; case Game.DivinityOriginalSinEE: - packageVersion.SelectedIndex = 3; + packageVersion.SelectedIndex = 4; break; case Game.DivinityOriginalSin2: - packageVersion.SelectedIndex = 2; + packageVersion.SelectedIndex = 3; break; case Game.DivinityOriginalSin2DE: - packageVersion.SelectedIndex = 1; + packageVersion.SelectedIndex = 2; break; case Game.BaldursGate3: - packageVersion.SelectedIndex = 0; + // Use V15 for now, for compatibility reasons + packageVersion.SelectedIndex = 1; break; } } diff --git a/Divine/CLI/CommandLineActions.cs b/Divine/CLI/CommandLineActions.cs index e796b7ec..2d1fe06a 100644 --- a/Divine/CLI/CommandLineActions.cs +++ b/Divine/CLI/CommandLineActions.cs @@ -97,6 +97,7 @@ private static void SetUpAndValidate(CommandLineArguments args) PackageVersion = PackageVersion.V13; break; case Game.BaldursGate3: + // Use V15 for now, for compatibility reasons PackageVersion = PackageVersion.V15; break; default: diff --git a/LSLib/LS/Enums/PackageVersion.cs b/LSLib/LS/Enums/PackageVersion.cs index a7d6d8e3..61446c65 100644 --- a/LSLib/LS/Enums/PackageVersion.cs +++ b/LSLib/LS/Enums/PackageVersion.cs @@ -6,6 +6,7 @@ public enum PackageVersion V9 = 9, // D:OS 1 EE V10 = 10, // D:OS 2 V13 = 13, // D:OS 2 DE - V15 = 15 // BG3 + V15 = 15, // BG3 EA + V16 = 16 // BG3 EA Patch4 }; } diff --git a/LSLib/LS/PackageCommon.cs b/LSLib/LS/PackageCommon.cs index 2157693e..a6d1decc 100644 --- a/LSLib/LS/PackageCommon.cs +++ b/LSLib/LS/PackageCommon.cs @@ -527,7 +527,7 @@ public static string MakePartFilename(string path, int part) public class PackageCreationOptions { - public PackageVersion Version = PackageVersion.V13; + public PackageVersion Version = PackageVersion.V15; public CompressionMethod Compression = CompressionMethod.None; public bool FastCompression = true; public PackageFlags Flags = 0; diff --git a/LSLib/LS/PackageReader.cs b/LSLib/LS/PackageReader.cs index 62becd7a..8795c3e8 100644 --- a/LSLib/LS/PackageReader.cs +++ b/LSLib/LS/PackageReader.cs @@ -222,15 +222,15 @@ private Package ReadPackageV15(FileStream mainStream, BinaryReader reader) var package = new Package(); var header = BinUtils.ReadStruct(reader); - if (header.Version != (ulong)PackageVersion.V15) + if (header.Version != (ulong)PackageVersion.V15 && header.Version != (ulong)PackageVersion.V16) { - string msg = $"Unsupported package version {header.Version}; this layout is only supported for {PackageVersion.V15}"; + string msg = $"Unsupported package version {header.Version}; this layout is only supported for V15 and V16"; throw new InvalidDataException(msg); } package.Metadata.Flags = (PackageFlags)header.Flags; package.Metadata.Priority = header.Priority; - package.Version = PackageVersion.V15; + package.Version = (header.Version == 15) ? PackageVersion.V15 : PackageVersion.V16; if (_metadataOnly) return package; @@ -290,7 +290,7 @@ public Package Read() { return ReadPackageV10(mainStream, reader); } - else if (version == 15) + else if (version == 15 || version == 16) { mainStream.Seek(4, SeekOrigin.Begin); return ReadPackageV15(mainStream, reader); diff --git a/LSLib/LS/PackageWriter.cs b/LSLib/LS/PackageWriter.cs index de714a5b..f2ddd15b 100644 --- a/LSLib/LS/PackageWriter.cs +++ b/LSLib/LS/PackageWriter.cs @@ -17,7 +17,8 @@ public class PackageWriter : IDisposable { public delegate void WriteProgressDelegate(AbstractFileInfo abstractFile, long numerator, long denominator); - private const long MaxPackageSize = 0x40000000; + private const long MaxPackageSizeDOS = 0x40000000; + private const long MaxPackageSizeBG3 = 0x100000000; public CompressionMethod Compression = CompressionMethod.None; public CompressionLevel CompressionLevel = CompressionLevel.DefaultCompression; @@ -47,7 +48,8 @@ public PackagedFileInfo WriteFile(AbstractFileInfo info) { // Assume that all files are written uncompressed (worst-case) when calculating package sizes long size = (long)info.Size(); - if (Version < PackageVersion.V15 && _streams.Last().Position + size > MaxPackageSize) + if ((Version < PackageVersion.V15 && _streams.Last().Position + size > MaxPackageSizeDOS) + || (Version >= PackageVersion.V16 && _streams.Last().Position + size > MaxPackageSizeBG3)) { // Start a new package file if the current one is full. string partPath = Package.MakePartFilename(_path, _streams.Count); @@ -365,6 +367,7 @@ public void Write() switch (Version) { case PackageVersion.V15: + case PackageVersion.V16: { WriteV15(mainStream); break;