diff --git a/Benchmark/UnrealTestStream.cs b/Benchmark/UnrealTestStream.cs index 9c91370..b6c084a 100644 --- a/Benchmark/UnrealTestStream.cs +++ b/Benchmark/UnrealTestStream.cs @@ -19,7 +19,7 @@ public class UnrealTestStream : UnrealReader, IUnrealStream public UnrealReader UR => this; public UnrealWriter UW { get; } - public IBufferDecoder Decoder { get; } + public IBufferDecoder Decoder { get; set; } public void SetBranch(EngineBranch packageEngineBranch) { diff --git a/src/Branch/DefaultEngineBranch.cs b/src/Branch/DefaultEngineBranch.cs index c33fe1d..6f67a52 100644 --- a/src/Branch/DefaultEngineBranch.cs +++ b/src/Branch/DefaultEngineBranch.cs @@ -160,5 +160,13 @@ protected virtual void SetupEnumPackageFlags(UnrealPackage package) } #endif } + + public override void PostDeserializeSummary(IUnrealStream stream, ref UnrealPackage.PackageFileSummary summary) + { + } + + public override void PostDeserializePackage(IUnrealStream stream, UnrealPackage package) + { + } } } \ No newline at end of file diff --git a/src/Branch/EngineBranch.cs b/src/Branch/EngineBranch.cs index 6ea50ce..aaecd45 100644 --- a/src/Branch/EngineBranch.cs +++ b/src/Branch/EngineBranch.cs @@ -31,6 +31,9 @@ protected EngineBranch(UnrealPackage package) Generation = package.Build.Generation; } + public abstract void PostDeserializeSummary(IUnrealStream stream, ref UnrealPackage.PackageFileSummary summary); + public abstract void PostDeserializePackage(IUnrealStream stream, UnrealPackage package); + public override string ToString() { return base.ToString(); diff --git a/src/Branch/UE2/AA2/EngineBranch.AA2.cs b/src/Branch/UE2/AA2/EngineBranch.AA2.cs index 06296e2..e5d71c9 100644 --- a/src/Branch/UE2/AA2/EngineBranch.AA2.cs +++ b/src/Branch/UE2/AA2/EngineBranch.AA2.cs @@ -1,6 +1,10 @@ -namespace UELib.Branch.UE2.AA2 +using static UELib.UnrealPackage; +using System.Diagnostics; +using System.IO; + +namespace UELib.Branch.UE2.AA2 { - [Build(UnrealPackage.GameBuild.BuildName.AA2)] + [Build(GameBuild.BuildName.AA2)] public class EngineBranchAA2 : DefaultEngineBranch { /// Decoder initialization is handled in @@ -18,5 +22,54 @@ protected override void SetupSerializer(UnrealPackage package) base.SetupSerializer(package); } + + public override void PostDeserializeSummary(IUnrealStream stream, ref PackageFileSummary summary) + { + // Note: Never true, AA2 is not a detected build for packages with LicenseeVersion 27 or less + // But we'll preserve this nonetheless + if (stream.LicenseeVersion < 19) return; + + bool isEncrypted = stream.ReadInt32() > 0; + if (isEncrypted) + { + // TODO: Use a stream wrapper instead; but this is blocked by an overly intertwined use of PackageStream. + if (stream.LicenseeVersion >= 33) + { + var decoder = new CryptoDecoderAA2(); + stream.Decoder = decoder; + } + else + { + var decoder = new CryptoDecoderWithKeyAA2(); + stream.Decoder = decoder; + + long nonePosition = summary.NameOffset; + stream.Seek(nonePosition, SeekOrigin.Begin); + byte scrambledNoneLength = stream.ReadByte(); + decoder.Key = scrambledNoneLength; + stream.Seek(nonePosition, SeekOrigin.Begin); + byte unscrambledNoneLength = stream.ReadByte(); + Debug.Assert((unscrambledNoneLength & 0x3F) == 5); + } + } + + // Always one + //int unkCount = stream.ReadInt32(); + //for (var i = 0; i < unkCount; i++) + //{ + // // All zero + // stream.Skip(24); + // // Always identical to the package's GUID + // var guid = stream.ReadGuid(); + //} + + //// Always one + //int unk2Count = stream.ReadInt32(); + //for (var i = 0; i < unk2Count; i++) + //{ + // // All zero + // stream.Skip(12); + //} + } } } \ No newline at end of file diff --git a/src/Branch/UE3/DD2/EngineBranch.DD2.cs b/src/Branch/UE3/DD2/EngineBranch.DD2.cs new file mode 100644 index 0000000..4e6df9f --- /dev/null +++ b/src/Branch/UE3/DD2/EngineBranch.DD2.cs @@ -0,0 +1,28 @@ +namespace UELib.Branch.UE3.DD2 +{ + [Build(UnrealPackage.GameBuild.BuildName.DD2)] + public class EngineBranchDD2 : DefaultEngineBranch + { + public EngineBranchDD2(UnrealPackage package) : base(package) + { + } + + public override void PostDeserializePackage(IUnrealStream stream, UnrealPackage package) + { + int position = stream.Package.Summary.HeaderSize; + var exports = stream.Package.Exports; + foreach (var exp in exports) + { + // Just in-case. + if (exp.SerialOffset != 0) + { + position += exp.SerialOffset; + continue; + } + + exp.SerialOffset = position; + position += exp.SerialSize; + } + } + } +} \ No newline at end of file diff --git a/src/Core/Classes/UClass.cs b/src/Core/Classes/UClass.cs index 53ecc43..0a214e1 100644 --- a/src/Core/Classes/UClass.cs +++ b/src/Core/Classes/UClass.cs @@ -277,6 +277,14 @@ protected override void Deserialize() ForceScriptOrder = _Buffer.ReadInt32() > 0; Record(nameof(ForceScriptOrder), ForceScriptOrder); } +#if DD2 + // DD2 doesn't use a LicenseeVersion, maybe a merged standard feature (bForceScriptOrder?). + if (Package.Build == UnrealPackage.GameBuild.BuildName.DD2 && _Buffer.Version >= 688) + { + int dd2UnkInt32 = _Buffer.ReadInt32(); + Record(nameof(dd2UnkInt32), dd2UnkInt32); + } +#endif #if DISHONORED if (Package.Build == UnrealPackage.GameBuild.BuildName.Dishonored) { @@ -324,7 +332,7 @@ protected override void Deserialize() } } #if BATMAN - if (_Buffer.Package.Build == UnrealPackage.GameBuild.BuildName.BatmanUDK) + if (Package.Build == UnrealPackage.GameBuild.BuildName.BatmanUDK) { _Buffer.Skip(sizeof(int)); } @@ -333,25 +341,25 @@ protected override void Deserialize() { DLLBindName = _Buffer.ReadNameReference(); Record(nameof(DLLBindName), DLLBindName); + } #if REMEMBERME - if (Package.Build == UnrealPackage.GameBuild.BuildName.RememberMe) - { - var unknownName = _Buffer.ReadNameReference(); - Record("Unknown:RememberMe", unknownName); - } + if (Package.Build == UnrealPackage.GameBuild.BuildName.RememberMe) + { + var unknownName = _Buffer.ReadNameReference(); + Record("Unknown:RememberMe", unknownName); + } #endif #if DISHONORED - if (Package.Build == UnrealPackage.GameBuild.BuildName.Dishonored) - ClassGroups = DeserializeGroup("ClassGroups"); + if (Package.Build == UnrealPackage.GameBuild.BuildName.Dishonored) + ClassGroups = DeserializeGroup("ClassGroups"); #endif #if BORDERLANDS2 - if (Package.Build == UnrealPackage.GameBuild.BuildName.Borderlands2) - { - byte unknownByte = _Buffer.ReadByte(); - Record("Unknown:Borderlands2", unknownByte); - } -#endif + if (Package.Build == UnrealPackage.GameBuild.BuildName.Borderlands2) + { + byte unknownByte = _Buffer.ReadByte(); + Record("Unknown:Borderlands2", unknownByte); } +#endif } } #if UE4 diff --git a/src/Eliot.UELib.csproj b/src/Eliot.UELib.csproj index 8b26584..6c0b049 100644 --- a/src/Eliot.UELib.csproj +++ b/src/Eliot.UELib.csproj @@ -43,7 +43,7 @@ full false bin\Debug\ - TRACE;DEBUG;DECOMPILE BINARYMETADATA Forms UE1 UE2 UE3 UE4 VENGEANCE SWAT4 UNREAL2 INFINITYBLADE BORDERLANDS2 GOW2 DEBUG_TEST APB SPECIALFORCE2 XIII SINGULARITY THIEF_DS DEUSEX_IW BORDERLANDS MIRRORSEDGE BIOSHOCK HAWKEN UT DISHONORED REMEMBERME ALPHAPROTOCOL VANGUARD TERA MKKE TRANSFORMERS XCOM2 DCUO AA2 SPELLBORN BATMAN MOH ROCKETLEAGUE + TRACE;DEBUG;DECOMPILE BINARYMETADATA Forms UE1 UE2 UE3 UE4 VENGEANCE SWAT4 UNREAL2 INFINITYBLADE BORDERLANDS2 GOW2 DEBUG_TEST APB SPECIALFORCE2 XIII SINGULARITY THIEF_DS DEUSEX_IW BORDERLANDS MIRRORSEDGE BIOSHOCK HAWKEN UT DISHONORED REMEMBERME ALPHAPROTOCOL VANGUARD TERA MKKE TRANSFORMERS XCOM2 DD2 DCUO AA2 SPELLBORN BATMAN MOH ROCKETLEAGUE prompt 0 AnyCPU @@ -61,7 +61,7 @@ none true bin\Release\ - TRACE;DECOMPILE BINARYMETADATA Forms UE1 UE2 UE3 VENGEANCE SWAT4 UNREAL2 INFINITYBLADE BORDERLANDS2 GOW2 APB SPECIALFORCE2 XIII SINGULARITY THIEF_DS DEUSEX_IW BORDERLANDS MIRRORSEDGE BIOSHOCK HAWKEN UT DISHONORED REMEMBERME ALPHAPROTOCOL VANGUARD TERA MKKE TRANSFORMERS XCOM2 DCUO AA2 SPELLBORN BATMAN ROCKETLEAGUE + TRACE;DECOMPILE BINARYMETADATA Forms UE1 UE2 UE3 VENGEANCE SWAT4 UNREAL2 INFINITYBLADE BORDERLANDS2 GOW2 APB SPECIALFORCE2 XIII SINGULARITY THIEF_DS DEUSEX_IW BORDERLANDS MIRRORSEDGE BIOSHOCK HAWKEN UT DISHONORED REMEMBERME ALPHAPROTOCOL VANGUARD TERA MKKE TRANSFORMERS XCOM2 DD2 DCUO AA2 SPELLBORN BATMAN ROCKETLEAGUE prompt 4 @@ -73,7 +73,7 @@ true bin\Debug\ - TRACE;DEBUG;DECOMPILE BINARYMETADATA Forms DEBUG_TEST DEBUG_TOKENPOSITIONS DEBUG_HIDDENTOKENS DEBUG_NESTS DEBUG_FUNCTIONINFO UE1 UE2 UE3 VENGEANCE SWAT4 UNREAL2 INFINITYBLADE BORDERLANDS2 GOW2 DEBUG_TEST APB SPECIALFORCE2 XIII SINGULARITY THIEF_DS DEUSEX_IW BORDERLANDS MIRRORSEDGE BIOSHOCK HAWKEN UT DISHONORED REMEMBERME ALPHAPROTOCOL VANGUARD TERA MKKE TRANSFORMERS XCOM2 DCUO AA2 SPELLBORN BATMAN MOH ROCKETLEAGUE + TRACE;DEBUG;DECOMPILE BINARYMETADATA Forms DEBUG_TEST DEBUG_TOKENPOSITIONS DEBUG_HIDDENTOKENS DEBUG_NESTS DEBUG_FUNCTIONINFO UE1 UE2 UE3 VENGEANCE SWAT4 UNREAL2 INFINITYBLADE BORDERLANDS2 GOW2 DEBUG_TEST APB SPECIALFORCE2 XIII SINGULARITY THIEF_DS DEUSEX_IW BORDERLANDS MIRRORSEDGE BIOSHOCK HAWKEN UT DISHONORED REMEMBERME ALPHAPROTOCOL VANGUARD TERA MKKE TRANSFORMERS XCOM2 DD2 DCUO AA2 SPELLBORN BATMAN MOH ROCKETLEAGUE false @@ -85,7 +85,7 @@ bin\Publish\ - Forms DECOMPILE BINARYMETADATA UE1 UE2 UE3 VENGEANCE SWAT4 UNREAL2 INFINITYBLADE BORDERLANDS2 GOW2 APB SPECIALFORCE2 XIII SINGULARITY THIEF_DS DEUSEX_IW BORDERLANDS MIRRORSEDGE BIOSHOCK HAWKEN UT DISHONORED REMEMBERME ALPHAPROTOCOL VANGUARD TERA MKKE TRANSFORMERS XCOM2 DCUO AA2 SPELLBORN BATMAN ROCKETLEAGUE + Forms DECOMPILE BINARYMETADATA UE1 UE2 UE3 VENGEANCE SWAT4 UNREAL2 INFINITYBLADE BORDERLANDS2 GOW2 APB SPECIALFORCE2 XIII SINGULARITY THIEF_DS DEUSEX_IW BORDERLANDS MIRRORSEDGE BIOSHOCK HAWKEN UT DISHONORED REMEMBERME ALPHAPROTOCOL VANGUARD TERA MKKE TRANSFORMERS XCOM2 DD2 DCUO AA2 SPELLBORN BATMAN ROCKETLEAGUE true AnyCPU @@ -97,7 +97,7 @@ true bin\Test\ - TRACE;DEBUG;STRICT DECOMPILE UE1 UE2 UE3 UE4 VENGEANCE SWAT4 UNREAL2 INFINITYBLADE BORDERLANDS2 GOW2 DEBUG_TEST APB SPECIALFORCE2 XIII SINGULARITY THIEF_DS DEUSEX_IW BORDERLANDS MIRRORSEDGE BIOSHOCK HAWKEN UT DISHONORED REMEMBERME ALPHAPROTOCOL VANGUARD TERA MKKE TRANSFORMERS XCOM2 DCUO AA2 SPELLBORN BATMAN ROCKETLEAGUE + TRACE;DEBUG;STRICT DECOMPILE UE1 UE2 UE3 UE4 VENGEANCE SWAT4 UNREAL2 INFINITYBLADE BORDERLANDS2 GOW2 DEBUG_TEST APB SPECIALFORCE2 XIII SINGULARITY THIEF_DS DEUSEX_IW BORDERLANDS MIRRORSEDGE BIOSHOCK HAWKEN UT DISHONORED REMEMBERME ALPHAPROTOCOL VANGUARD TERA MKKE TRANSFORMERS XCOM2 DD2 DCUO AA2 SPELLBORN BATMAN ROCKETLEAGUE true 0 full @@ -120,6 +120,7 @@ + @@ -265,7 +266,7 @@ - +