From d0f47a3dedcf9e0e4ce4984a3d2d7e101791a4e5 Mon Sep 17 00:00:00 2001 From: 1987kostya Date: Wed, 13 Jan 2021 14:27:45 +0600 Subject: [PATCH] Extension parser --- .../EXE/Loaders/Objects/ObjectCommon.cs | 1 + CTFAK/MMFParser/MFA/Loaders/FrameItem.cs | 7 +++--- .../MFA/Loaders/mfachunks/AnimationObject.cs | 24 +++++++++++++++---- .../MFA/Loaders/mfachunks/ExtensionObject.cs | 6 +++-- CTFAK/MMFParser/MFA/MFA.cs | 18 ++++++++------ CTFAK/MMFParser/Translation/MFAGenerator.cs | 4 ++-- CTFAK/MMFParser/Translation/PAME2MFA.cs | 18 +++++++------- 7 files changed, 52 insertions(+), 26 deletions(-) diff --git a/CTFAK/MMFParser/EXE/Loaders/Objects/ObjectCommon.cs b/CTFAK/MMFParser/EXE/Loaders/Objects/ObjectCommon.cs index d9131a0..9eedbd0 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Objects/ObjectCommon.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Objects/ObjectCommon.cs @@ -191,6 +191,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects { ExtensionData = Reader.ReadBytes(dataSize); } + Logger.Log($"{Parent.Name} - {ExtensionId}"); } if (_counterOffset > 0) diff --git a/CTFAK/MMFParser/MFA/Loaders/FrameItem.cs b/CTFAK/MMFParser/MFA/Loaders/FrameItem.cs index 6fb6be9..e29c838 100644 --- a/CTFAK/MMFParser/MFA/Loaders/FrameItem.cs +++ b/CTFAK/MMFParser/MFA/Loaders/FrameItem.cs @@ -77,15 +77,16 @@ namespace CTFAK.MMFParser.MFA.Loaders if (MFA.defaultObjChunks == null) MFA.defaultObjChunks = Chunks; if(ObjectType>=32)//extension base { - //TODO: Nonactives + Loader = new ExtensionObject(Reader); + } else if(ObjectType==2) { Loader = new Active(Reader); - Loader.Read(); + } - + Loader?.Read(); diff --git a/CTFAK/MMFParser/MFA/Loaders/mfachunks/AnimationObject.cs b/CTFAK/MMFParser/MFA/Loaders/mfachunks/AnimationObject.cs index 6716c05..38145f9 100644 --- a/CTFAK/MMFParser/MFA/Loaders/mfachunks/AnimationObject.cs +++ b/CTFAK/MMFParser/MFA/Loaders/mfachunks/AnimationObject.cs @@ -8,6 +8,8 @@ namespace CTFAK.MMFParser.MFA.Loaders.mfachunks public class AnimationObject:ObjectLoader { public Dictionary Items = new Dictionary(); + public bool _isExt; + public override void Read() { base.Read(); @@ -24,15 +26,29 @@ namespace CTFAK.MMFParser.MFA.Loaders.mfachunks } } + public void Write(ByteWriter Writer,bool ext) + { + _isExt = ext; + Write(Writer); + } public override void Write(ByteWriter Writer) { base.Write(Writer); - Writer.WriteInt8(1); - Writer.WriteUInt32((uint) Items.Count); - foreach (Animation animation in Items.Values) + if (_isExt) { - animation.Write(Writer); + Writer.WriteInt8(0); + Writer.WriteInt32(-1); } + else + { + Writer.WriteInt8(1); + Writer.WriteUInt32((uint) Items.Count); + foreach (Animation animation in Items.Values) + { + animation.Write(Writer); + } + } + } diff --git a/CTFAK/MMFParser/MFA/Loaders/mfachunks/ExtensionObject.cs b/CTFAK/MMFParser/MFA/Loaders/mfachunks/ExtensionObject.cs index b9b9998..27cb481 100644 --- a/CTFAK/MMFParser/MFA/Loaders/mfachunks/ExtensionObject.cs +++ b/CTFAK/MMFParser/MFA/Loaders/mfachunks/ExtensionObject.cs @@ -13,6 +13,7 @@ namespace CTFAK.MMFParser.MFA.Loaders.mfachunks public int ExtensionId; public int ExtensionPrivate; public byte[] ExtensionData; + private byte[] _unk; public ExtensionObject(ByteReader reader) : base(reader) { @@ -32,7 +33,7 @@ namespace CTFAK.MMFParser.MFA.Loaders.mfachunks var newReader = new ByteReader(Reader.ReadBytes((int) Reader.ReadUInt32())); var dataSize = newReader.ReadInt32() - 20; - newReader.Skip(4); + _unk = newReader.ReadBytes(4); ExtensionVersion = newReader.ReadInt32(); ExtensionId = newReader.ReadInt32(); ExtensionPrivate = newReader.ReadInt32(); @@ -42,6 +43,7 @@ namespace CTFAK.MMFParser.MFA.Loaders.mfachunks public override void Write(ByteWriter Writer) { + _isExt = true; base.Write(Writer); if (ExtensionType == -1) { @@ -52,7 +54,7 @@ namespace CTFAK.MMFParser.MFA.Loaders.mfachunks } Writer.WriteInt32(ExtensionData.Length+20); Writer.WriteInt32(ExtensionData.Length+20); - Writer.WriteInt32(0); + Writer.WriteInt32(-1); Writer.WriteInt32(ExtensionVersion); Writer.WriteInt32(ExtensionId); Writer.WriteInt32(ExtensionPrivate); diff --git a/CTFAK/MMFParser/MFA/MFA.cs b/CTFAK/MMFParser/MFA/MFA.cs index cc8179c..15d260b 100644 --- a/CTFAK/MMFParser/MFA/MFA.cs +++ b/CTFAK/MMFParser/MFA/MFA.cs @@ -111,7 +111,7 @@ namespace CTFAK.MMFParser.MFA private int QualCount; public Controls Controls; public List IconImages; - public List> Extensions; + public List> Extensions; public List> CustomQuals; public List Frames; public ChunkList Chunks; @@ -237,10 +237,14 @@ namespace CTFAK.MMFParser.MFA foreach(var extension in Extensions) { Writer.WriteInt32(extension.Item1); - Writer.WriteUnicode(extension.Item2); - Writer.WriteUnicode(extension.Item3); + Writer.AutoWriteUnicode(extension.Item2); + Writer.AutoWriteUnicode(extension.Item3); Writer.WriteInt32(extension.Item4); - Writer.WriteBytes(extension.Item5); + Writer.WriteInt16((short) (extension.Item5.Length-1)); + Writer.Skip(1); + Writer.WriteInt8(0x80); + Writer.Skip(2); + Writer.WriteUnicode(extension.Item5, false); } @@ -376,15 +380,15 @@ namespace CTFAK.MMFParser.MFA } var extCount = Reader.ReadInt32(); - Extensions = new List>(); + Extensions = new List>(); for (int i = 0; i < extCount; i++) //extensions { var handle = Reader.ReadInt32(); var filename = Helper.AutoReadUnicode(Reader); var name = Helper.AutoReadUnicode(Reader); var magic = Reader.ReadInt32(); - var data = Reader.ReadBytes(Reader.ReadInt32()); - var tuple = new Tuple(handle, filename, name, magic, data); + var subType = Reader.ReadWideString(Reader.ReadInt32()); + var tuple = new Tuple(handle, filename, name, magic, subType); Extensions.Add(tuple); } diff --git a/CTFAK/MMFParser/Translation/MFAGenerator.cs b/CTFAK/MMFParser/Translation/MFAGenerator.cs index 7e8ad43..6498788 100644 --- a/CTFAK/MMFParser/Translation/MFAGenerator.cs +++ b/CTFAK/MMFParser/Translation/MFAGenerator.cs @@ -59,8 +59,8 @@ namespace CTFAK.MMFParser.Translation public static void ReadTestMFA() { - var outputPath = Path.Combine(Path.GetDirectoryName(@"C:\Users\ivani\Desktop\CTFResearch\284final.mfa"), "decompiled.mfa"); - var mfaReader = new ByteReader(@"C:\Users\ivani\Desktop\CTFResearch\284final.mfa", FileMode.Open); + var outputPath = Path.Combine(Path.GetDirectoryName(TemplatePath), "decompiled.mfa"); + var mfaReader = new ByteReader(TemplatePath, FileMode.Open); var template = new MFA.MFA(mfaReader); Settings.DoMFA = true; template.Read(); diff --git a/CTFAK/MMFParser/Translation/PAME2MFA.cs b/CTFAK/MMFParser/Translation/PAME2MFA.cs index 535e2ac..8c41120 100644 --- a/CTFAK/MMFParser/Translation/PAME2MFA.cs +++ b/CTFAK/MMFParser/Translation/PAME2MFA.cs @@ -113,10 +113,11 @@ namespace CTFAK.MMFParser.Translation else { var itemLoader = (ObjectCommon) item.Properties.Loader; + Logger.Log("Translating Object: "+itemLoader.Parent.Name); //CommonSection var newObject = new ObjectLoader(null); - newObject.ObjectFlags = (int) itemLoader.Flags.flag; - newObject.NewObjectFlags =(int) itemLoader.NewFlags.flag; + newObject.ObjectFlags = (int) (itemLoader?.Flags?.flag ?? 820); + newObject.NewObjectFlags =(int) (itemLoader?.NewFlags?.flag ?? 8); newObject.BackgroundColor = Color.FromArgb(0x0, 0xff, 0xff, 0xff); //newLoader.Qualifiers; newObject.Strings = ConvertStrings(itemLoader.Strings); @@ -215,10 +216,10 @@ namespace CTFAK.MMFParser.Translation Extension ext = null; foreach (var testExt in exts.Items) { - if (testExt.Handle == 1) ext = testExt; + if (testExt.Handle==item.ObjectType-32) ext = testExt; } newExt.ExtensionType = -1; - newExt.ExtensionName = ext.Name; + newExt.ExtensionName = ""; newExt.Filename = $"{ext.Name}.mfx"; newExt.Magic = (uint) ext.MagicNumber; newExt.SubType = ext.SubType; @@ -315,7 +316,7 @@ namespace CTFAK.MMFParser.Translation mfa.Frames.Clear(); foreach (Frame frame in game.Frames) { - if (frame.Name != "title") continue; + // if (frame.Name != "title") continue; var newFrame = new MFA.Loaders.Frame(null); //FrameInfo newFrame.Handle = game.Frames.IndexOf(frame); @@ -377,8 +378,8 @@ namespace CTFAK.MMFParser.Translation { frameItem = FrameItems[instance.ObjectInfo]; - - newFrameItems.Add(frameItem); + // if (frameItem.ObjectType >= 32) break; + if(!newFrameItems.Contains(frameItem)) newFrameItems.Add(frameItem); var newInstance = new FrameInstance((ByteReader) null); newInstance.X = instance.X; newInstance.Y = instance.Y; @@ -389,7 +390,8 @@ namespace CTFAK.MMFParser.Translation newInstance.ParentHandle = 0xffffffff; newInstance.Layer = (uint) instance.Layer; newInstances.Add(newInstance); - // if(i==34) break; + Logger.Log($"{instance.FrameItem.Name} - {i}"); + // if(i==52) break; } }