diff --git a/Nebula.CLI/Program.cs b/Nebula.CLI/Program.cs index 7a413bd..5e469b9 100644 --- a/Nebula.CLI/Program.cs +++ b/Nebula.CLI/Program.cs @@ -129,6 +129,7 @@ static void AutoDetectReader() case ".zip": NebulaCore.CurrentReader = new OpenFileReader(); break; + case ".xapk": case ".apk": NebulaCore.CurrentReader = new APKFileReader(); break; diff --git a/Nebula.Core/Data/Chunks/FrameChunks/Events/ACEventBase.cs b/Nebula.Core/Data/Chunks/FrameChunks/Events/ACEventBase.cs index a8c0574..03c297b 100644 --- a/Nebula.Core/Data/Chunks/FrameChunks/Events/ACEventBase.cs +++ b/Nebula.Core/Data/Chunks/FrameChunks/Events/ACEventBase.cs @@ -65,12 +65,7 @@ public override void WriteMFA(ByteWriter writer, params object[] extraInfo) public ObjectInfo? GetObject() { - if (Parent?.Parent.Qualifiers.Where(x => x.ObjectInfo == ObjectInfo).Any() == true) - return null; - else if (NebulaCore.MFA && Parent?.Parent.EventObjects.Count > 0) - return NebulaCore.PackageData.FrameItems.Items[(int)Parent.Parent.EventObjects[ObjectInfo].ItemHandle]; - else - return NebulaCore.PackageData.FrameItems.Items[ObjectInfo]; + return ObjectCommon.GetObject(ObjectInfo, ObjectType, this, null); } public string GetGlobalValueName(ParameterChunk param) diff --git a/Nebula.Core/Data/Chunks/FrameChunks/Events/Action.cs b/Nebula.Core/Data/Chunks/FrameChunks/Events/Action.cs index 1fcccf0..486132c 100644 --- a/Nebula.Core/Data/Chunks/FrameChunks/Events/Action.cs +++ b/Nebula.Core/Data/Chunks/FrameChunks/Events/Action.cs @@ -75,7 +75,7 @@ public override void ReadCCN(ByteReader reader, params object[] extraInfo) ObjectInfo = ObjectInfo, Type = ObjectType }); - } + } } Fix((List)extraInfo[0], reader, endPosition); diff --git a/Nebula.Core/Data/Chunks/FrameChunks/Events/Condition.cs b/Nebula.Core/Data/Chunks/FrameChunks/Events/Condition.cs index 907a245..20afaee 100644 --- a/Nebula.Core/Data/Chunks/FrameChunks/Events/Condition.cs +++ b/Nebula.Core/Data/Chunks/FrameChunks/Events/Condition.cs @@ -79,7 +79,7 @@ public override void ReadCCN(ByteReader reader, params object[] extraInfo) ObjectInfo = ObjectInfo, Type = ObjectType }); - } + } } Fix((List)extraInfo[0], reader); diff --git a/Nebula.Core/Data/Chunks/FrameChunks/Events/Parameters/ParameterExpression.cs b/Nebula.Core/Data/Chunks/FrameChunks/Events/Parameters/ParameterExpression.cs index 2758f25..e500470 100644 --- a/Nebula.Core/Data/Chunks/FrameChunks/Events/Parameters/ParameterExpression.cs +++ b/Nebula.Core/Data/Chunks/FrameChunks/Events/Parameters/ParameterExpression.cs @@ -553,12 +553,7 @@ public override string ToString() public ObjectInfo? GetObject() { - if (Parent?.FrameEvents?.Qualifiers.Where(x => x.ObjectInfo == ObjectInfo).Any() == true) - return null; - else if (NebulaCore.MFA && Parent?.FrameEvents?.EventObjects.Count > 0) - return NebulaCore.PackageData.FrameItems.Items[(int)Parent.FrameEvents.EventObjects[ObjectInfo].ItemHandle]; - else - return NebulaCore.PackageData.FrameItems.Items[ObjectInfo]; + return ObjectCommon.GetObject(ObjectInfo, ObjectType, null, this); } public string GetGlobalValueName() diff --git a/Nebula.Core/Data/Chunks/FrameChunks/Events/Parameters/ParameterObject.cs b/Nebula.Core/Data/Chunks/FrameChunks/Events/Parameters/ParameterObject.cs index bf9b849..183926c 100644 --- a/Nebula.Core/Data/Chunks/FrameChunks/Events/Parameters/ParameterObject.cs +++ b/Nebula.Core/Data/Chunks/FrameChunks/Events/Parameters/ParameterObject.cs @@ -1,5 +1,6 @@ using Nebula.Core.Data.Chunks.AppChunks; using Nebula.Core.Data.Chunks.ObjectChunks; +using Nebula.Core.Data.Chunks.ObjectChunks.ObjectCommon; using Nebula.Core.Memory; namespace Nebula.Core.Data.Chunks.FrameChunks.Events.Parameters @@ -45,12 +46,7 @@ public override string ToString() public ObjectInfo? GetObject() { - if (Parent?.FrameEvents?.Qualifiers.Where(x => x.ObjectInfo == ObjectInfo).Any() == true) - return null; - else if (NebulaCore.MFA && Parent?.FrameEvents?.EventObjects.Count > 0) - return NebulaCore.PackageData.FrameItems.Items[(int)Parent.FrameEvents.EventObjects[ObjectInfo].ItemHandle]; - else - return NebulaCore.PackageData.FrameItems.Items[ObjectInfo]; + return ObjectCommon.GetObject(ObjectInfo, ObjectType, null, this); } public string GetQualifierName(Qualifier qualifier) diff --git a/Nebula.Core/Data/Chunks/FrameChunks/Events/Parameters/ParameterPosition.cs b/Nebula.Core/Data/Chunks/FrameChunks/Events/Parameters/ParameterPosition.cs index b1a9ec8..64972ab 100644 --- a/Nebula.Core/Data/Chunks/FrameChunks/Events/Parameters/ParameterPosition.cs +++ b/Nebula.Core/Data/Chunks/FrameChunks/Events/Parameters/ParameterPosition.cs @@ -1,6 +1,7 @@ using ILGPU.IR.Types; using Nebula.Core.Data.Chunks.AppChunks; using Nebula.Core.Data.Chunks.ObjectChunks; +using Nebula.Core.Data.Chunks.ObjectChunks.ObjectCommon; using Nebula.Core.Memory; namespace Nebula.Core.Data.Chunks.FrameChunks.Events.Parameters @@ -96,12 +97,7 @@ public override string ToString() public ObjectInfo? GetObject() { - if (Parent?.FrameEvents?.Qualifiers.Where(x => x.ObjectInfo == ObjectInfoParent).Any() == true) - return null; - else if (NebulaCore.MFA && Parent?.FrameEvents?.EventObjects.Count > 0) - return NebulaCore.PackageData.FrameItems.Items[(int)Parent.FrameEvents.EventObjects[ObjectInfoParent].ItemHandle]; - else - return NebulaCore.PackageData.FrameItems.Items[ObjectInfoParent]; + return ObjectCommon.GetObject(ObjectInfoParent, TypeParent, null, this); } public string GetObjectName() diff --git a/Nebula.Core/Data/Chunks/FrameChunks/FrameEvents.cs b/Nebula.Core/Data/Chunks/FrameChunks/FrameEvents.cs index 055785f..213c63e 100644 --- a/Nebula.Core/Data/Chunks/FrameChunks/FrameEvents.cs +++ b/Nebula.Core/Data/Chunks/FrameChunks/FrameEvents.cs @@ -84,10 +84,6 @@ public override void ReadCCN(ByteReader reader, params object[] extraInfo) qualifier.ReadCCN(reader); Qualifiers.Add(qualifier); } - - // Just incase, 296 shouldnt be writing qualifiers anyway - if (NebulaCore.Build >= 296 && NebulaCore.Windows && NebulaCore.Fusion >= 2.5) - Qualifiers.Clear(); } else if (identifier == "ERes") EventCount = reader.ReadInt(); diff --git a/Nebula.Core/Data/Chunks/ObjectChunks/ObjectCommon/ObjectCommon.cs b/Nebula.Core/Data/Chunks/ObjectChunks/ObjectCommon/ObjectCommon.cs index a8a8382..8a94548 100644 --- a/Nebula.Core/Data/Chunks/ObjectChunks/ObjectCommon/ObjectCommon.cs +++ b/Nebula.Core/Data/Chunks/ObjectChunks/ObjectCommon/ObjectCommon.cs @@ -1,4 +1,6 @@ using Nebula.Core.Data.Chunks.ChunkTypes; +using Nebula.Core.Data.Chunks.FrameChunks.Events; +using Nebula.Core.Data.Chunks.FrameChunks.Events.Parameters; using Nebula.Core.Memory; using System.Diagnostics; using System.Drawing; @@ -236,6 +238,40 @@ public override void WriteMFA(ByteWriter writer, params object[] extraInfo) } + // method for getting objects/qualifiers to prevent copy paste + public static ObjectInfo? GetObject(ushort ObjectInfo, short ObjectType, ACEventBase ace, ParameterChunk paramChunk) + { + if (ace != null) + { + if (NebulaCore.Windows && NebulaCore.Build >= 296 && NebulaCore.Fusion >= 2.5 && (ObjectInfo & 0x8000) != 0) + { + if (ace.Parent?.Parent.Qualifiers.Where(x => x.ObjectInfo == ObjectInfo && x.Type == ObjectType).Any() != true) + ace.Parent?.Parent.Qualifiers.Add(new Qualifier() { ObjectInfo = ObjectInfo, Type = ObjectType }); + } + if (ace.Parent?.Parent.Qualifiers.Where(x => x.ObjectInfo == ObjectInfo).Any() == true) + return null; + else if (NebulaCore.MFA && ace.Parent?.Parent.EventObjects.Count > 0) + return NebulaCore.PackageData.FrameItems.Items[(int)ace.Parent.Parent.EventObjects[ObjectInfo].ItemHandle]; + else + return NebulaCore.PackageData.FrameItems.Items[ObjectInfo]; + } + else if (paramChunk != null) + { + if (NebulaCore.Windows && NebulaCore.Build >= 296 && NebulaCore.Fusion >= 2.5 && (ObjectInfo & 0x8000) != 0) + { + if (paramChunk.Parent?.FrameEvents?.Qualifiers.Where(x => x.ObjectInfo == ObjectInfo && x.Type == ObjectType).Any() != true) + paramChunk.Parent?.FrameEvents?.Qualifiers.Add(new Qualifier() { ObjectInfo = ObjectInfo, Type = ObjectType }); + } + if (paramChunk.Parent?.FrameEvents?.Qualifiers.Where(x => x.ObjectInfo == ObjectInfo).Any() == true) + return null; + else if (NebulaCore.MFA && paramChunk.Parent?.FrameEvents?.EventObjects.Count > 0) + return NebulaCore.PackageData.FrameItems.Items[(int)paramChunk.Parent.FrameEvents.EventObjects[ObjectInfo].ItemHandle]; + else + return NebulaCore.PackageData.FrameItems.Items[ObjectInfo]; + } + return null; + } + public void GetOffset(ByteReader reader, int index, bool check = false) { ushort Offset = reader.ReadUShort(); diff --git a/Nebula.Core/FileReaders/APKFileReader.cs b/Nebula.Core/FileReaders/APKFileReader.cs index a6f76e6..0712ba0 100644 --- a/Nebula.Core/FileReaders/APKFileReader.cs +++ b/Nebula.Core/FileReaders/APKFileReader.cs @@ -11,10 +11,20 @@ namespace Nebula.Core.FileReaders { public class APKFileReader : IFileReader { - public string Name => "APK"; + public string Name => "Android"; public Dictionary Icons { get { return _icons; } set { _icons = value; } } private Dictionary _icons = new Dictionary(); + private static readonly List VideoExtensions = new List + { + ".mp4", + ".mkv", + ".m4a", + ".mov", + ".webm", + ".avi" + }; + public string FilePath { get { return _filePath; } set { _filePath = value; } } public string _filePath = string.Empty; @@ -47,6 +57,21 @@ public void LoadGame(ByteReader fileReader, string filePath) entry.Open().CopyTo(ms); SoundBank.ExternalFiles[Path.GetFileNameWithoutExtension(entry.Name)] = ms.ToArray(); // saving it to dictionary } + else if (VideoExtensions.Contains(Path.GetExtension(entry.Name))) // for unpacking video files saved by Video Android extension + { + using var stream = entry.Open(); + using var memoryStream = new MemoryStream(); + stream.CopyTo(memoryStream); + byte[] fileData = memoryStream.ToArray(); + + // add videos to binary files list for dumping + BinaryFile binFile = new BinaryFile + { + FileName = entry.Name, + FileData = fileData + }; + NebulaCore.PackageData.BinaryFiles.Items.Add(binFile); + } } if (Directory.GetParent(entry.FullName)?.Name == "fonts" && Path.GetExtension(entry.Name) == ".ttf") {