Skip to content

Commit

Permalink
Fixes #25: Update "Dungeon Defenders 2" support.
Browse files Browse the repository at this point in the history
Updated EngineBranch capabilities and re-factored some AA2 stuff to its own EngineBranch.
  • Loading branch information
EliotVU committed Jun 23, 2022
1 parent 86538e5 commit c4c1978
Show file tree
Hide file tree
Showing 9 changed files with 160 additions and 100 deletions.
2 changes: 1 addition & 1 deletion Benchmark/UnrealTestStream.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down
8 changes: 8 additions & 0 deletions src/Branch/DefaultEngineBranch.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
}
}
}
3 changes: 3 additions & 0 deletions src/Branch/EngineBranch.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
57 changes: 55 additions & 2 deletions src/Branch/UE2/AA2/EngineBranch.AA2.cs
Original file line number Diff line number Diff line change
@@ -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 <see cref="UnrealPackage.Deserialize"/>
Expand All @@ -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);
//}
}
}
}
28 changes: 28 additions & 0 deletions src/Branch/UE3/DD2/EngineBranch.DD2.cs
Original file line number Diff line number Diff line change
@@ -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;
}
}
}
}
36 changes: 22 additions & 14 deletions src/Core/Classes/UClass.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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));
}
Expand All @@ -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
Expand Down
13 changes: 7 additions & 6 deletions src/Eliot.UELib.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>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</DefineConstants>
<DefineConstants>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</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>0</WarningLevel>
<PlatformTarget>AnyCPU</PlatformTarget>
Expand All @@ -61,7 +61,7 @@
<DebugType>none</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>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</DefineConstants>
<DefineConstants>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</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>
Expand All @@ -73,7 +73,7 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DecompileDebug|AnyCPU'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>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</DefineConstants>
<DefineConstants>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</DefineConstants>
<DocumentationFile>
</DocumentationFile>
<Optimize>false</Optimize>
Expand All @@ -85,7 +85,7 @@
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Publish|AnyCPU'">
<OutputPath>bin\Publish\</OutputPath>
<DefineConstants>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</DefineConstants>
<DefineConstants>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</DefineConstants>
<Optimize>true</Optimize>
<PlatformTarget>AnyCPU</PlatformTarget>
<DocumentationFile>
Expand All @@ -97,7 +97,7 @@
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'UnitTest|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\Test\</OutputPath>
<DefineConstants>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</DefineConstants>
<DefineConstants>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</DefineConstants>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<WarningLevel>0</WarningLevel>
<DebugType>full</DebugType>
Expand All @@ -120,6 +120,7 @@
<Compile Include="Branch\EngineBranch.cs" />
<Compile Include="Branch\BuildEngineBranchAttribute.cs" />
<Compile Include="Branch\PackageSerializerBase.cs" />
<Compile Include="Branch\UE3\DD2\EngineBranch.DD2.cs" />
<Compile Include="Branch\UE4\EngineBranch.UE4.cs" />
<Compile Include="Branch\PackageSerializer.cs" />
<Compile Include="Branch\UE4\PackageSerializer.UE4.cs" />
Expand Down Expand Up @@ -265,7 +266,7 @@
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<ProjectExtensions>
<VisualStudio>
<UserProperties BuildVersion_BuildVersioningStyle="None.None.Increment.None" BuildVersion_UpdateFileVersion="True" BuildVersion_UpdateAssemblyVersion="True" />
<UserProperties BuildVersion_UpdateAssemblyVersion="True" BuildVersion_UpdateFileVersion="True" BuildVersion_BuildVersioningStyle="None.None.Increment.None" />
</VisualStudio>
</ProjectExtensions>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Expand Down
Loading

0 comments on commit c4c1978

Please sign in to comment.