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 @@
-
+