From 7857d344a213c7cfb311ee83462b9f988345caa8 Mon Sep 17 00:00:00 2001 From: Eliot Date: Tue, 2 Aug 2022 20:35:06 +0200 Subject: [PATCH 01/11] WIP: Support for Duke Nukem Forever #49 --- src/Core/Classes/Props/UProperty.cs | 30 ++++++++++++++++++++++++++ src/Core/Classes/UStruct.cs | 33 +++++++++++++++++++++++++++++ src/Eliot.UELib.csproj | 4 ++-- src/UnrealPackage.cs | 8 +++++++ 4 files changed, 73 insertions(+), 2 deletions(-) diff --git a/src/Core/Classes/Props/UProperty.cs b/src/Core/Classes/Props/UProperty.cs index b99923f..e535f8a 100644 --- a/src/Core/Classes/Props/UProperty.cs +++ b/src/Core/Classes/Props/UProperty.cs @@ -85,6 +85,16 @@ protected override void Deserialize() uint unknown = _Buffer.ReadUInt32(); Record("Unknown:AA2", unknown); } +#endif +#if DNF + if (Package.Build == UnrealPackage.GameBuild.BuildName.DNF) + { + ArrayDim = _Buffer.ReadUInt16(); + Record("ArrayDim", ArrayDim); + Debug.Assert(ArrayDim <= 2048, "Bad array dim"); + // No serialized element size? + goto skipInfo; + } #endif int info = _Buffer.ReadInt32(); ArrayDim = (ushort)(info & 0x0000FFFFU); @@ -161,6 +171,26 @@ protected override void Deserialize() var vengeanceEditDisplay = _Buffer.ReadNameReference(); Record(nameof(vengeanceEditDisplay), vengeanceEditDisplay); } +#endif +#if DNF + if (Package.Build == UnrealPackage.GameBuild.BuildName.DNF) + { + if ((PropertyFlags & 0x800000) != 0) + { + EditorDataText = _Buffer.ReadText(); + Record(nameof(EditorDataText), EditorDataText); + } + + // Same flag as EditorData, but this may merely be a coincidence, see above + if (_Buffer.Version >= 118 && (PropertyFlags & 0x2000000) != 0) + { + // NU_NAME??? + var dnfNuPropertyName = _Buffer.ReadNameReference(); + Record(nameof(dnfNuPropertyName), dnfNuPropertyName); + } + + return; + } #endif // Appears to be a UE2.5 feature, it is not present in UE2 builds with no custom LicenseeVersion // Albeit DeusEx indicates otherwise? diff --git a/src/Core/Classes/UStruct.cs b/src/Core/Classes/UStruct.cs index 7353f94..d95ff63 100644 --- a/src/Core/Classes/UStruct.cs +++ b/src/Core/Classes/UStruct.cs @@ -99,7 +99,33 @@ protected override void Deserialize() FriendlyName = _Buffer.ReadNameReference(); Record(nameof(FriendlyName), FriendlyName); } +#if DNF + if (Package.Build == UnrealPackage.GameBuild.BuildName.DNF) + { + if (_Buffer.LicenseeVersion >= 17) + { + // Back-ported CppText + CppText = _Buffer.ReadObject(); + Record(nameof(CppText), CppText); + + var dnfTextObj2 = _Buffer.ReadObject(); + Record(nameof(dnfTextObj2), dnfTextObj2); + + _Buffer.ReadArray(out UArray dnfIncludeTexts); + Record(nameof(dnfIncludeTexts), dnfIncludeTexts); + } + if (_Buffer.LicenseeVersion >= 2) + { + // Bool? + _Buffer.ReadByte(); + var dnfName = _Buffer.ReadNameReference(); + Record(nameof(dnfName), dnfName); + } + + goto lineData; + } +#endif // Standard, but UT2004' derived games do not include this despite reporting version 128+ if (Package.Version >= VCppText && _Buffer.UE4Version < 117 && !Package.IsConsoleCooked() && @@ -133,6 +159,7 @@ protected override void Deserialize() Record(nameof(ProcessedText), ProcessedText); } #endif + lineData: if (!Package.IsConsoleCooked() && _Buffer.UE4Version < 117) { @@ -203,6 +230,12 @@ protected override void Deserialize() ByteCodeManager.Deserialize(); } } +#if DNF + if (Package.Build == UnrealPackage.GameBuild.BuildName.DNF) + { + //_Buffer.ReadByte(); + } +#endif } protected override bool CanDisposeBuffer() diff --git a/src/Eliot.UELib.csproj b/src/Eliot.UELib.csproj index 42fd785..90b57c6 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 DD2 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 DNF prompt 0 AnyCPU @@ -257,7 +257,7 @@ - +