From 22fb3d7f8359fae8367822e979e43d96aa18e9cd Mon Sep 17 00:00:00 2001 From: Alexei Kotov Date: Fri, 26 Apr 2024 10:30:42 +0300 Subject: [PATCH 1/6] Add support for Fallout 4 next-gen update BA2s --- components/bsa/ba2dx10file.cpp | 17 ++++++++++------- components/bsa/ba2file.hpp | 9 +++++++++ components/bsa/ba2gnrlfile.cpp | 20 +++++++++++++------- 3 files changed, 32 insertions(+), 14 deletions(-) diff --git a/components/bsa/ba2dx10file.cpp b/components/bsa/ba2dx10file.cpp index 82a5ee84735..b056f6faca3 100644 --- a/components/bsa/ba2dx10file.cpp +++ b/components/bsa/ba2dx10file.cpp @@ -116,16 +116,19 @@ namespace Bsa if (header[0] == 0x00415342) /*"BSA\x00"*/ fail("Unrecognized compressed BSA format"); mVersion = header[1]; - if (mVersion != 0x01 /*FO4*/ && mVersion != 0x02 /*Starfield*/) - fail("Unrecognized compressed BSA version"); + switch (static_cast(mVersion)) + { + case BA2Version::Fallout4: + case BA2Version::Fallout4NG: + break; + case BA2Version::StarfieldDDS: + fail("Unsupported DDS BA2 version"); + default: + fail("Unrecognized DDS BA2 version"); + } type = header[2]; fileCount = header[3]; - if (mVersion == 0x02) - { - uint64_t dummy; - input.read(reinterpret_cast(&dummy), 8); - } } if (type == ESM::fourCC("DX10")) diff --git a/components/bsa/ba2file.hpp b/components/bsa/ba2file.hpp index 75a2ce8d614..8b890a7e102 100644 --- a/components/bsa/ba2file.hpp +++ b/components/bsa/ba2file.hpp @@ -8,6 +8,15 @@ namespace Bsa { uint32_t generateHash(const std::string& name); uint32_t generateExtensionHash(std::string_view extension); + + enum class BA2Version : std::uint32_t + { + Fallout4 = 1, + StarfieldGeneral = 2, + StarfieldDDS = 3, + Fallout4NG = 7, + Fallout4NG2 = 8, + }; } #endif diff --git a/components/bsa/ba2gnrlfile.cpp b/components/bsa/ba2gnrlfile.cpp index da5ad470299..3e4cd1be83b 100644 --- a/components/bsa/ba2gnrlfile.cpp +++ b/components/bsa/ba2gnrlfile.cpp @@ -110,16 +110,22 @@ namespace Bsa if (header[0] == 0x00415342) /*"BSA\x00"*/ fail("Unrecognized compressed BSA format"); mVersion = header[1]; - if (mVersion != 0x01 /*FO4*/ && mVersion != 0x02 /*Starfield*/) - fail("Unrecognized compressed BSA version"); + switch (static_cast(mVersion)) + { + case BA2Version::Fallout4: + case BA2Version::Fallout4NG: + case BA2Version::Fallout4NG2: + break; + case BA2Version::StarfieldGeneral: + uint64_t dummy; + input.read(reinterpret_cast(&dummy), 8); + break; + default: + fail("Unrecognized general BA2 version"); + } type = header[2]; fileCount = header[3]; - if (mVersion == 0x02) - { - uint64_t dummy; - input.read(reinterpret_cast(&dummy), 8); - } } if (type == ESM::fourCC("GNRL")) From b32385a0afeb105c464586b81816dfe1a2db1dac Mon Sep 17 00:00:00 2001 From: Alexei Kotov Date: Fri, 26 Apr 2024 10:31:44 +0300 Subject: [PATCH 2/6] Fix BA2 signature check --- components/bsa/ba2dx10file.cpp | 4 ++-- components/bsa/ba2gnrlfile.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/components/bsa/ba2dx10file.cpp b/components/bsa/ba2dx10file.cpp index b056f6faca3..72467035040 100644 --- a/components/bsa/ba2dx10file.cpp +++ b/components/bsa/ba2dx10file.cpp @@ -113,8 +113,8 @@ namespace Bsa input.read(reinterpret_cast(header), 16); input.read(reinterpret_cast(&fileTableOffset), 8); - if (header[0] == 0x00415342) /*"BSA\x00"*/ - fail("Unrecognized compressed BSA format"); + if (header[0] != ESM::fourCC("BTDX")) + fail("Unrecognized BA2 signature"); mVersion = header[1]; switch (static_cast(mVersion)) { diff --git a/components/bsa/ba2gnrlfile.cpp b/components/bsa/ba2gnrlfile.cpp index 3e4cd1be83b..f4d04e9bd35 100644 --- a/components/bsa/ba2gnrlfile.cpp +++ b/components/bsa/ba2gnrlfile.cpp @@ -107,8 +107,8 @@ namespace Bsa input.read(reinterpret_cast(header), 16); input.read(reinterpret_cast(&fileTableOffset), 8); - if (header[0] == 0x00415342) /*"BSA\x00"*/ - fail("Unrecognized compressed BSA format"); + if (header[0] != ESM::fourCC("BTDX")) + fail("Unrecognized BA2 signature"); mVersion = header[1]; switch (static_cast(mVersion)) { From f796e051cb9c22c73bc8b5d6d1b894409c8b5a88 Mon Sep 17 00:00:00 2001 From: Alexei Kotov Date: Fri, 26 Apr 2024 10:45:03 +0300 Subject: [PATCH 3/6] Support zlib-compressed version 3 DDS BA2s --- components/bsa/ba2dx10file.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/components/bsa/ba2dx10file.cpp b/components/bsa/ba2dx10file.cpp index 72467035040..cdc62e02756 100644 --- a/components/bsa/ba2dx10file.cpp +++ b/components/bsa/ba2dx10file.cpp @@ -122,7 +122,13 @@ namespace Bsa case BA2Version::Fallout4NG: break; case BA2Version::StarfieldDDS: - fail("Unsupported DDS BA2 version"); + uint64_t dummy; + input.read(reinterpret_cast(&dummy), 8); + uint32_t compressionMethod; + input.read(reinterpret_cast(&compressionMethod), 4); + if (compressionMethod == 3) + fail("Unsupported LZ4-compressed DDS BA2"); + break; default: fail("Unrecognized DDS BA2 version"); } From 61b6150c017f693a208faa2e2207bce9780a9674 Mon Sep 17 00:00:00 2001 From: Alexei Kotov Date: Fri, 26 Apr 2024 10:49:29 +0300 Subject: [PATCH 4/6] Properly detect the version for post-FO4 BA2 formats --- components/bsa/bsa_file.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/components/bsa/bsa_file.cpp b/components/bsa/bsa_file.cpp index 4704e6e7e0a..46639a729e5 100644 --- a/components/bsa/bsa_file.cpp +++ b/components/bsa/bsa_file.cpp @@ -340,18 +340,18 @@ BsaVersion Bsa::BSAFile::detectVersion(const std::filesystem::path& filePath) return BsaVersion::Uncompressed; } - if (head[0] == static_cast(BsaVersion::Compressed) || head[0] == ESM::fourCC("BTDX")) + if (head[0] == static_cast(BsaVersion::Compressed)) { - if (head[1] == static_cast(0x01)) - { - if (head[2] == ESM::fourCC("GNRL")) - return BsaVersion::BA2GNRL; - if (head[2] == ESM::fourCC("DX10")) - return BsaVersion::BA2DX10; - return BsaVersion::Unknown; - } return BsaVersion::Compressed; } + if (head[0] == ESM::fourCC("BTDX")) + { + if (head[2] == ESM::fourCC("GNRL")) + return BsaVersion::BA2GNRL; + if (head[2] == ESM::fourCC("DX10")) + return BsaVersion::BA2DX10; + } + return BsaVersion::Unknown; } From 52d77e3a4569bc3359e929a9c74ac342b20005cd Mon Sep 17 00:00:00 2001 From: Alexei Kotov Date: Fri, 26 Apr 2024 16:45:30 +0300 Subject: [PATCH 5/6] Version 8 texture BA2s found --- components/bsa/ba2dx10file.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/components/bsa/ba2dx10file.cpp b/components/bsa/ba2dx10file.cpp index cdc62e02756..c10e5e249be 100644 --- a/components/bsa/ba2dx10file.cpp +++ b/components/bsa/ba2dx10file.cpp @@ -120,6 +120,7 @@ namespace Bsa { case BA2Version::Fallout4: case BA2Version::Fallout4NG: + case BA2Version::Fallout4NG2: break; case BA2Version::StarfieldDDS: uint64_t dummy; From a5d936993fb017f1c6bc17aecdc95e760c270edd Mon Sep 17 00:00:00 2001 From: Alexei Kotov Date: Sun, 28 Apr 2024 05:09:40 +0300 Subject: [PATCH 6/6] Clarify Fallout 4 next gen update BA2 version naming --- components/bsa/ba2dx10file.cpp | 4 ++-- components/bsa/ba2file.hpp | 4 ++-- components/bsa/ba2gnrlfile.cpp | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/components/bsa/ba2dx10file.cpp b/components/bsa/ba2dx10file.cpp index c10e5e249be..502ca043ab7 100644 --- a/components/bsa/ba2dx10file.cpp +++ b/components/bsa/ba2dx10file.cpp @@ -119,8 +119,8 @@ namespace Bsa switch (static_cast(mVersion)) { case BA2Version::Fallout4: - case BA2Version::Fallout4NG: - case BA2Version::Fallout4NG2: + case BA2Version::Fallout4NextGen_v7: + case BA2Version::Fallout4NextGen_v8: break; case BA2Version::StarfieldDDS: uint64_t dummy; diff --git a/components/bsa/ba2file.hpp b/components/bsa/ba2file.hpp index 8b890a7e102..9a68d3afd06 100644 --- a/components/bsa/ba2file.hpp +++ b/components/bsa/ba2file.hpp @@ -14,8 +14,8 @@ namespace Bsa Fallout4 = 1, StarfieldGeneral = 2, StarfieldDDS = 3, - Fallout4NG = 7, - Fallout4NG2 = 8, + Fallout4NextGen_v7 = 7, + Fallout4NextGen_v8 = 8, }; } diff --git a/components/bsa/ba2gnrlfile.cpp b/components/bsa/ba2gnrlfile.cpp index f4d04e9bd35..63dd3d1d508 100644 --- a/components/bsa/ba2gnrlfile.cpp +++ b/components/bsa/ba2gnrlfile.cpp @@ -113,8 +113,8 @@ namespace Bsa switch (static_cast(mVersion)) { case BA2Version::Fallout4: - case BA2Version::Fallout4NG: - case BA2Version::Fallout4NG2: + case BA2Version::Fallout4NextGen_v7: + case BA2Version::Fallout4NextGen_v8: break; case BA2Version::StarfieldGeneral: uint64_t dummy;