From f208257c0a3c4c2ff1a41e9fd25ad22b7a7fc41a Mon Sep 17 00:00:00 2001 From: REDxEYE Date: Tue, 15 Dec 2020 19:58:33 +0300 Subject: [PATCH] Fixed writing of file --- .../MMFParser/EXE/Loaders/Banks/ImageBank.cs | 2 +- NetMFAPatcher/MMFParser/MFA/Loaders/Events.cs | 2 +- NetMFAPatcher/MMFParser/MFA/Loaders/Frame.cs | 51 ++++++++++++------- .../MFA/Loaders/mfachunks/Movements.cs | 16 +++--- .../MFA/Loaders/mfachunks/ObjectLoader.cs | 2 +- .../MMFParser/Translation/MFAGenerator.cs | 17 ++++--- NetMFAPatcher/PluginAPI/PluginAPI.cs | 12 ++--- NetMFAPatcher/Program.cs | 4 +- NetMFAPatcher/Utils/Helper.cs | 14 ++--- 9 files changed, 66 insertions(+), 54 deletions(-) diff --git a/NetMFAPatcher/MMFParser/EXE/Loaders/Banks/ImageBank.cs b/NetMFAPatcher/MMFParser/EXE/Loaders/Banks/ImageBank.cs index 074d725..19fcce3 100644 --- a/NetMFAPatcher/MMFParser/EXE/Loaders/Banks/ImageBank.cs +++ b/NetMFAPatcher/MMFParser/EXE/Loaders/Banks/ImageBank.cs @@ -156,7 +156,7 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Banks { Handle = Reader.ReadInt32() - 1; Position = (int) Reader.Tell(); - Preload(); + Load(); } public override void Print(bool ext) diff --git a/NetMFAPatcher/MMFParser/MFA/Loaders/Events.cs b/NetMFAPatcher/MMFParser/MFA/Loaders/Events.cs index 84a6ed3..6336ca1 100644 --- a/NetMFAPatcher/MMFParser/MFA/Loaders/Events.cs +++ b/NetMFAPatcher/MMFParser/MFA/Loaders/Events.cs @@ -172,7 +172,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders EventLineY = Reader.ReadUInt32(); } else if (name == EventEnd) break; - //else throw new NotImplementedException("Fuck Something Broken"); + else throw new NotImplementedException("Fuck Something is Broken"); } } diff --git a/NetMFAPatcher/MMFParser/MFA/Loaders/Frame.cs b/NetMFAPatcher/MMFParser/MFA/Loaders/Frame.cs index 1ad9726..217df6d 100644 --- a/NetMFAPatcher/MMFParser/MFA/Loaders/Frame.cs +++ b/NetMFAPatcher/MMFParser/MFA/Loaders/Frame.cs @@ -13,12 +13,13 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders public int SizeY; public Color Background; public int MaxObjects; - public List Items=new List(); + public List Items = new List(); public int Handle; public int LastViewedX; public int LastViewedY; - public List Folders=new List(); - public List Instances=new List(); + public List Folders = new List(); + public List Instances = new List(); + public List UnkBlocks = new List(); public BitDict Flags = new BitDict(new string[] { @@ -36,6 +37,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders }); public string Password; + public string UnkString; public List Palette; public int StampHandle; public int ActiveLayer; @@ -49,8 +51,6 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders { } - - public override void Write(ByteWriter Writer) { @@ -62,7 +62,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders Writer.WriteUInt32(Flags.flag); Writer.WriteInt32(MaxObjects); Writer.AutoWriteUnicode(Password); - Writer.WriteInt32(0); + Writer.AutoWriteUnicode(UnkString); Writer.WriteInt32(LastViewedX); Writer.WriteInt32(LastViewedY); Writer.WriteInt32(Palette.Count); @@ -78,12 +78,14 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders { layer.Write(Writer); } + if (FadeIn != null) { Writer.WriteInt8(1); FadeIn.Write(Writer); } else Writer.Skip(1); + if (FadeOut != null) { Writer.WriteInt8(1); @@ -91,7 +93,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders } else Writer.Skip(1); //Writer.Skip(2); - + Writer.WriteInt32(Items.Count); foreach (var item in Items) @@ -109,6 +111,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders foreach (var item in Instances) { item.Write(Writer); + } if (Instances != null) { @@ -119,6 +122,15 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders } } + if (UnkBlocks != null) + { + Writer.WriteInt32(UnkBlocks.Count); + foreach (var item in UnkBlocks) + { + Writer.WriteBytes(item); + } + } + Events.Write(Writer); Chunks.Write(Writer); } @@ -140,7 +152,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders MaxObjects = Reader.ReadInt32(); Password = Helper.AutoReadUnicode(Reader); - Reader.Skip(4); + UnkString = Helper.AutoReadUnicode(Reader); LastViewedX = Reader.ReadInt32(); LastViewedY = Reader.ReadInt32(); @@ -151,6 +163,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders { Palette.Add(Reader.ReadColor()); } + StampHandle = Reader.ReadInt32(); ActiveLayer = Reader.ReadInt32(); int layersCount = Reader.ReadInt32(); @@ -160,7 +173,6 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders var layer = new Layer(Reader); layer.Read(); Layers.Add(layer); - } if (Reader.ReadByte() == 1) @@ -168,12 +180,13 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders FadeIn = new Transition(Reader); FadeIn.Read(); } - + if (Reader.ReadByte() == 1) { FadeOut = new Transition(Reader); FadeOut.Read(); } + Items = new List(); var frameItemsCount = Reader.ReadInt32(); for (int i = 0; i < frameItemsCount; i++) @@ -201,21 +214,21 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders inst.Read(); Instances.Add(inst); } - Reader.Skip(96); + + var unkCount = Reader.ReadInt32(); + for (int i = 0; i < unkCount; i++) + { + UnkBlocks.Add(Reader.ReadBytes(32)); + } + Events = new Events(Reader); - Console.WriteLine("BeforeEventsPos: "+Reader.Tell()); + Console.WriteLine("BeforeEventsPos: " + Reader.Tell()); Events.Read(); - Console.WriteLine("AfterEventsPos: "+Reader.Tell()); + Console.WriteLine("AfterEventsPos: " + Reader.Tell()); Chunks = new ChunkList(Reader); Chunks.Read(); MFA.emptyEvents = Events; MFA.emptyFrameChunks = Chunks; - - - - - - } } } \ No newline at end of file diff --git a/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/Movements.cs b/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/Movements.cs index bd10dd6..b219dce 100644 --- a/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/Movements.cs +++ b/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/Movements.cs @@ -50,15 +50,15 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks public byte MovingAtStart; public int DirectionAtStart; public int DataSize; - + public byte[] extData; public override void Write(ByteWriter Writer) - { - Writer.WriteUnicode(Name); - Writer.WriteUnicode(Extension); + { + Writer.AutoWriteUnicode(Name); + Writer.AutoWriteUnicode(Extension); Writer.WriteUInt32((uint) Identifier); Writer.WriteInt32(DataSize); var newWriter = new ByteWriter(new MemoryStream()); - if (Extension == null) + if (Extension.Length==0) { newWriter.WriteInt16(Player); @@ -66,8 +66,8 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks newWriter.WriteInt8(MovingAtStart); newWriter.Skip(3); newWriter.WriteInt32(DirectionAtStart); + newWriter.WriteBytes(extData); } - //Loader.write(newWriter) Writer.WriteWriter(newWriter); @@ -86,7 +86,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks DataSize = (int) Reader.ReadUInt32(); if(Extension.Length>0) { - var newReader = new ByteReader(Reader.ReadBytes(DataSize)); + extData = Reader.ReadBytes(DataSize); } @@ -97,7 +97,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks MovingAtStart = Reader.ReadByte(); Reader.Skip(3); DirectionAtStart = Reader.ReadInt32(); - var newReader = new ByteReader(Reader.ReadBytes(DataSize - 12)); + extData = Reader.ReadBytes(DataSize-12); //ONLY STATIC MOVEMENT IS SUPPORTED RN //TODO:Movement Types //implement types, but i am tired, fuck this shit diff --git a/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/ObjectLoader.cs b/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/ObjectLoader.cs index c9817d0..eecbcec 100644 --- a/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/ObjectLoader.cs +++ b/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/ObjectLoader.cs @@ -90,7 +90,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks Movements.Read(); Behaviours = new Behaviours(Reader); Behaviours.Read(); - //Reader.Skip(56);//TODO: Help + Reader.Skip(2);//TODO: Help Print(); diff --git a/NetMFAPatcher/MMFParser/Translation/MFAGenerator.cs b/NetMFAPatcher/MMFParser/Translation/MFAGenerator.cs index 79ac3f4..13ec109 100644 --- a/NetMFAPatcher/MMFParser/Translation/MFAGenerator.cs +++ b/NetMFAPatcher/MMFParser/Translation/MFAGenerator.cs @@ -7,8 +7,8 @@ namespace DotNetCTFDumper.MMFParser.Translation { public static class MFAGenerator { - //public static readonly string TemplatePath = @"C:\Users\MED45\Downloads\testNoFrames.mfa"; - public static readonly string TemplatePath = @"C:\Users\ivani\Desktop\CTFResearch\testNoFrames.mfa"; + public static readonly string TemplatePath = @"C:\Users\MED45\Downloads\OneObjOneFrame.mfa"; + // public static readonly string TemplatePath = @"C:\Users\ivani\Desktop\CTFResearch\OneObjOneFrame.mfa"; public static MFA.MFA BuildMFA() { @@ -27,21 +27,22 @@ namespace DotNetCTFDumper.MMFParser.Translation template.Write(mfaWriter); //Writing new MFA mfaWriter.Dispose(); return template; - - Logger.Log("MFA Done",true,ConsoleColor.Yellow); + + Logger.Log("MFA Done", true, ConsoleColor.Yellow); } public static void ReadTestMFA() { - var mfaReader = new ByteReader(@"C:\Users\ivani\Desktop\CTFResearch\ObjTEST.mfa", FileMode.Open); + var output_path = 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(); - + //Add modifications - - var mfaWriter = new ByteWriter("outTest.mfa", FileMode.Create); + + var mfaWriter = new ByteWriter(output_path, FileMode.Create); template.Write(mfaWriter); } } diff --git a/NetMFAPatcher/PluginAPI/PluginAPI.cs b/NetMFAPatcher/PluginAPI/PluginAPI.cs index 36baa70..d2327c6 100644 --- a/NetMFAPatcher/PluginAPI/PluginAPI.cs +++ b/NetMFAPatcher/PluginAPI/PluginAPI.cs @@ -12,7 +12,8 @@ namespace DotNetCTFDumper.PluginAPI { public class PluginAPI { - public static Frame GetEmptyFrame(List palette,int handle=0,int x=640,int y=480,string name="New Frame") + public static Frame GetEmptyFrame(List palette, int handle = 0, int x = 640, int y = 480, + string name = "New Frame") { var frame = new Frame(null) { @@ -22,25 +23,20 @@ namespace DotNetCTFDumper.PluginAPI SizeX = x, SizeY = y, Background = Color.Green, - Flags = 260, Palette = palette, Layers = new List(), Folders = new List(), Items = new List(), Events = MFA.emptyEvents, Chunks = MFA.emptyFrameChunks - }; + frame.Flags.flag = 260; //frame.Instances = template.Frames[0].Instances; var testLayer = new Layer(null) {Name = "New Super Layer"}; frame.Layers.Add(testLayer); - - - - return frame; + return frame; } - } } \ No newline at end of file diff --git a/NetMFAPatcher/Program.cs b/NetMFAPatcher/Program.cs index 3793a62..794f88d 100644 --- a/NetMFAPatcher/Program.cs +++ b/NetMFAPatcher/Program.cs @@ -22,8 +22,8 @@ namespace DotNetCTFDumper var handle = Helper.GetConsoleWindow(); Helper.ShowWindow(handle, Helper.SW_HIDE); InitNativeLibrary(); - // MFAGenerator.ReadTestMFA(); - // Environment.Exit(0); + MFAGenerator.ReadTestMFA(); + Environment.Exit(0); var path = ""; var verbose = false; diff --git a/NetMFAPatcher/Utils/Helper.cs b/NetMFAPatcher/Utils/Helper.cs index 594ed8e..6bef954 100644 --- a/NetMFAPatcher/Utils/Helper.cs +++ b/NetMFAPatcher/Utils/Helper.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Drawing; using System.IO; using System.Linq; @@ -52,6 +53,7 @@ namespace DotNetCTFDumper.Utils return temp; } + public static string FirstCharToUpper(this string input) { switch (input) @@ -65,7 +67,8 @@ namespace DotNetCTFDumper.Utils public static string AutoReadUnicode(this ByteReader reader) { var len = reader.ReadInt16(); - reader.Skip(2); + short check = reader.ReadInt16(); + Debug.Assert(check == -32768); return reader.ReadWideString(len); } @@ -74,9 +77,9 @@ namespace DotNetCTFDumper.Utils writer.WriteInt16((short) value.Length); writer.Skip(1); writer.WriteInt8(0x80); - writer.WriteUnicode(value,false); + writer.WriteUnicode(value, false); } - + public static DataLoader LoadParameter(int code, ByteReader reader) { DataLoader item = null; @@ -189,7 +192,6 @@ namespace DotNetCTFDumper.Utils } } - private const long OneKb = 1024; private const long OneMb = OneKb * 1024; @@ -287,9 +289,8 @@ namespace DotNetCTFDumper.Utils // Step 3: return the new array. return result; } - - } + public static class StringExtensionMethods { public static string ReplaceFirst(this string text, string search, string replace) @@ -299,6 +300,7 @@ namespace DotNetCTFDumper.Utils { return text; } + return text.Substring(0, pos) + replace + text.Substring(pos + search.Length); } }