From 2326131e3e2c311befda4774a46ea6d5f0180f29 Mon Sep 17 00:00:00 2001 From: 1987kostya Date: Thu, 17 Dec 2020 20:55:08 +0600 Subject: [PATCH] Pame2MFA Updates and fixes Need to fix object writing --- .../MMFParser/EXE/Loaders/Banks/ImageBank.cs | 2 +- NetMFAPatcher/MMFParser/EXE/Loaders/Frame.cs | 18 +- .../EXE/Loaders/Objects/ObjectCommon.cs | 18 +- .../MMFParser/EXE/Loaders/Objects/Value.cs | 12 +- NetMFAPatcher/MMFParser/MFA/Loaders/Events.cs | 192 +++++------ NetMFAPatcher/MMFParser/MFA/Loaders/Frame.cs | 34 +- .../MMFParser/MFA/Loaders/FrameInstance.cs | 8 +- .../MMFParser/MFA/Loaders/FrameItem.cs | 7 +- .../MMFParser/MFA/Loaders/ItemFolder.cs | 25 +- .../MFA/Loaders/mfachunks/AnimationObject.cs | 16 +- .../MFA/Loaders/mfachunks/Behaviours.cs | 7 +- .../MFA/Loaders/mfachunks/Movements.cs | 5 +- .../MFA/Loaders/mfachunks/ObjectLoader.cs | 1 + NetMFAPatcher/MMFParser/MFA/MFA.cs | 1 + .../MMFParser/Translation/MFAGenerator.cs | 4 +- .../MMFParser/Translation/PAME2MFA.cs | 325 ++++++++++++++---- NetMFAPatcher/Program.cs | 4 +- 17 files changed, 451 insertions(+), 228 deletions(-) diff --git a/NetMFAPatcher/MMFParser/EXE/Loaders/Banks/ImageBank.cs b/NetMFAPatcher/MMFParser/EXE/Loaders/Banks/ImageBank.cs index 19fcce3..3d12c7f 100644 --- a/NetMFAPatcher/MMFParser/EXE/Loaders/Banks/ImageBank.cs +++ b/NetMFAPatcher/MMFParser/EXE/Loaders/Banks/ImageBank.cs @@ -87,7 +87,7 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Banks item.Read(!PreloadOnly); tempImages.Add(item.Handle, item); - if (SaveImages) item.Save($"{Settings.ImagePath}\\" + item.Handle.ToString() + ".png"); + //if (SaveImages) item.Save($"{Settings.ImagePath}\\" + item.Handle.ToString() + ".png"); OnImageSaved?.Invoke(i,(int) NumberOfItems); diff --git a/NetMFAPatcher/MMFParser/EXE/Loaders/Frame.cs b/NetMFAPatcher/MMFParser/EXE/Loaders/Frame.cs index 83fb0eb..d82327a 100644 --- a/NetMFAPatcher/MMFParser/EXE/Loaders/Frame.cs +++ b/NetMFAPatcher/MMFParser/EXE/Loaders/Frame.cs @@ -35,7 +35,21 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders public int Width; public int Height; public Color Background; - public int Flags; + public BitDict Flags=new BitDict(new string[] + { + "XCoefficient", + "YCoefficient", + "DoNotSaveBackground", + "Wrap", + "Visible", + "WrapHorizontally", + "WrapVertically", + "","","","","","","","","", + "Redraw", + "ToHide", + "ToShow" + }); + public int CountOfObjs; int _top; int _bottom; @@ -111,7 +125,7 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders Width = Header.Width; Height = Header.Height; Background = Header.Background; - //Flags = header.Flags; + Flags.flag = Header.Flags.flag; Objects = Chunks.GetChunk(); if(Objects!=null) { diff --git a/NetMFAPatcher/MMFParser/EXE/Loaders/Objects/ObjectCommon.cs b/NetMFAPatcher/MMFParser/EXE/Loaders/Objects/ObjectCommon.cs index 56552ab..87ee25d 100644 --- a/NetMFAPatcher/MMFParser/EXE/Loaders/Objects/ObjectCommon.cs +++ b/NetMFAPatcher/MMFParser/EXE/Loaders/Objects/ObjectCommon.cs @@ -36,7 +36,7 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Objects } ); - private BitDict flags = new BitDict(new string[] + public BitDict Flags = new BitDict(new string[] { "DisplayInFront", "Background", @@ -61,7 +61,7 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Objects } ); - private BitDict new_flags = new BitDict(new string[] + public BitDict NewFlags = new BitDict(new string[] { "DoNotSaveBackground", "SolidBackground", @@ -80,6 +80,8 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Objects public int ExtensionPrivate; public int ExtensionId; public int ExtensionVersion; + public AlterableValues Values; + public AlterableStrings Strings; public ObjectCommon(ByteReader reader) : base(reader) @@ -114,7 +116,7 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Objects _counterOffset = (short) Reader.ReadUInt16(); _systemObjectOffset = (short) Reader.ReadUInt16(); - flags.flag = Reader.ReadUInt32(); + Flags.flag = Reader.ReadUInt32(); var end = Reader.Tell() + 16; Reader.Seek(end); if (newobj) @@ -129,7 +131,7 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Objects _valuesOffset = Reader.ReadInt16(); _stringsOffset = Reader.ReadInt16(); - new_flags.flag = Reader.ReadUInt16(); + NewFlags.flag = Reader.ReadUInt16(); preferences.flag = Reader.ReadUInt16(); byte[] identifier = Reader.ReadFourCc(); BackColor = Reader.ReadColor(); @@ -148,8 +150,8 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Objects if (_valuesOffset != 0) { Reader.Seek(currentPosition + _valuesOffset); - AlterableValues values = new AlterableValues(Reader); - values.Read(); + Values = new AlterableValues(Reader); + Values.Read(); // Console.WriteLine("Values done"); } @@ -157,8 +159,8 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Objects if (_stringsOffset != 0) { Reader.Seek(currentPosition + _stringsOffset); - AlterableStrings strings = new AlterableStrings(Reader); - strings.Read(); + Strings = new AlterableStrings(Reader); + Strings.Read(); // Console.WriteLine("Strings done"); } diff --git a/NetMFAPatcher/MMFParser/EXE/Loaders/Objects/Value.cs b/NetMFAPatcher/MMFParser/EXE/Loaders/Objects/Value.cs index ed17b4a..1284739 100644 --- a/NetMFAPatcher/MMFParser/EXE/Loaders/Objects/Value.cs +++ b/NetMFAPatcher/MMFParser/EXE/Loaders/Objects/Value.cs @@ -6,6 +6,8 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Objects { public class AlterableValues:ChunkLoader { + public List Items; + public AlterableValues(ByteReader reader) : base(reader) { } @@ -16,7 +18,7 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Objects public override void Read() { - var items = new List(); + Items = new List(); var count = Reader.ReadUInt16(); Console.WriteLine(count); @@ -24,7 +26,7 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Objects { var item = Reader.ReadInt32(); - items.Add(item); + Items.Add(item); Console.WriteLine("Found Value: "+item); } @@ -42,6 +44,8 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Objects } public class AlterableStrings:ChunkLoader { + public List Items; + public AlterableStrings(ByteReader reader) : base(reader) { } @@ -52,14 +56,14 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Objects public override void Read() { - var items = new List(); + Items = new List(); var count = Reader.ReadUInt16(); for (int i = 0; i < count; i++) { var item = Reader.ReadWideString(); - items.Add(item); + Items.Add(item); Console.WriteLine("Found String: "+item); } diff --git a/NetMFAPatcher/MMFParser/MFA/Loaders/Events.cs b/NetMFAPatcher/MMFParser/MFA/Loaders/Events.cs index 6336ca1..52740c1 100644 --- a/NetMFAPatcher/MMFParser/MFA/Loaders/Events.cs +++ b/NetMFAPatcher/MMFParser/MFA/Loaders/Events.cs @@ -179,132 +179,110 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders public override void Write(ByteWriter Writer) { - //Writer.WriteBytes(Saved); - //return; - using (ByteWriter debug = new ByteWriter(new MemoryStream())) + + Writer.WriteUInt16(Version); + Writer.WriteInt16((short) FrameType); + + if (Items != null) { + /*Console.WriteLine("Writing EventData"); + Writer.WriteAscii(EventData); - //Writer = new ByteWriter(new MemoryStream()); - Writer.WriteUInt16(Version); - Writer.WriteInt16((short) FrameType); - - // Writer.WriteBytes(new byte[] {0x04, 0x04, 0x00, 0x00}); - // if (Items != null) - // { - // Console.WriteLine("Writing EventData"); - // Writer.WriteAscii(EventData); - // - // ByteWriter newWriter = new ByteWriter(new MemoryStream()); - // foreach (EventGroup eventGroup in Items) - // { - // eventGroup.Write(newWriter); - // } - // - // Writer.WriteWriter(newWriter); - // } - // if (Objects != null) - // { - // Console.WriteLine("Writing EventObjects"); - // Writer.WriteAscii(ObjectData); - // Writer.WriteUInt32((uint) Objects.Count); - // foreach (EventObject eventObject in Objects) - // { - // eventObject.Write(Writer); - // } - // } - if (ObjectTypes != null) + ByteWriter newWriter = new ByteWriter(new MemoryStream()); + foreach (EventGroup eventGroup in Items) { - Console.WriteLine("Writing ObjectTypes"); - Writer.WriteAscii(ObjectListData); - Writer.WriteInt16(-1); - Writer.WriteInt16((short) ObjectTypes.Count); - foreach (ushort objectType in ObjectTypes) - { - Writer.WriteUInt16(objectType); - } - - foreach (ushort objectHandle in ObjectHandles) - { - Writer.WriteUInt16(objectHandle); - } + eventGroup.Write(newWriter); + } - foreach (ushort objectFlag in ObjectFlags) - { - Writer.WriteUInt16(objectFlag); - } + Writer.WriteWriter(newWriter);*/ + } - Writer.WriteUInt16((ushort) Folders.Count); - foreach (string folder in Folders) - { - Writer.AutoWriteUnicode(folder); - } + if (Objects != null) + { + Console.WriteLine("Writing EventObjects"); + Writer.WriteAscii(ObjectData); + Writer.WriteUInt32((uint) Objects.Count); + foreach (EventObject eventObject in Objects) + { + eventObject.Write(Writer); } - if (X != 0) + } + + if (ObjectTypes != null) + { + Console.WriteLine("Writing ObjectTypes"); + Writer.WriteAscii(ObjectListData); + Writer.WriteInt16(-1); + Writer.WriteInt16((short) ObjectTypes.Count); + foreach (ushort objectType in ObjectTypes) { - Console.WriteLine("Writing X"); - Writer.WriteAscii(EditorPositionData); - Writer.WriteInt16(1); - Writer.WriteInt32((int) X); - Writer.WriteInt32((int) Y); - Writer.WriteUInt32(CaretType); - Writer.WriteUInt32(CaretX); - Writer.WriteUInt32(CaretY); + Writer.WriteUInt16(objectType); } - if (LineY != 0) + + foreach (ushort objectHandle in ObjectHandles) { - Console.WriteLine("Writing LineY"); - Writer.WriteAscii(EditorLineData); - Writer.WriteInt16(1); - Writer.WriteUInt32(LineY); - Writer.WriteUInt32(LineItemType); - Writer.WriteUInt32(EventLine); - Writer.WriteUInt32(EventLineY); + Writer.WriteUInt16(objectHandle); } - Console.WriteLine("Writing EventEditorData"); - Writer.WriteAscii(EventEditorData); - Writer.WriteInt32(EditorDataUnk); - Writer.WriteInt16((short) ConditionWidth); - Writer.WriteInt16((short) ObjectHeight); - Writer.Skip(12); - - - //Writer.Skip((4 + 2 * 2 + 4 * 3)-4); - - Writer.WriteAscii(EventEnd); - - - //TODO: Fix commented part - // - - // - // if (Comments != null) - // { - // Console.WriteLine("Writing Comments"); - // Writer.WriteAscii(CommentData); - // foreach (Comment comment in Comments) - // { - // comment.Write(Writer); - // } - // } - + foreach (ushort objectFlag in ObjectFlags) + { + Writer.WriteUInt16(objectFlag); + } - - + Writer.WriteUInt16((ushort) Folders.Count); + foreach (string folder in Folders) + { + Writer.AutoWriteUnicode(folder); + } + } - + //if (X != 0) + { + Console.WriteLine("Writing X"); + Writer.WriteAscii(EditorPositionData); + Writer.WriteInt16(1); + Writer.WriteInt32((int) X); + Writer.WriteInt32((int) Y); + Writer.WriteUInt32(CaretType); + Writer.WriteUInt32(CaretX); + Writer.WriteUInt32(CaretY); + } + //if (LineY != 0) + { + Console.WriteLine("Writing LineY"); + Writer.WriteAscii(EditorLineData); + Writer.WriteInt16(1); + Writer.WriteUInt32(LineY); + Writer.WriteUInt32(LineItemType); + Writer.WriteUInt32(EventLine); + Writer.WriteUInt32(EventLineY); + } + Console.WriteLine("Writing EventEditorData"); + Writer.WriteAscii(EventEditorData); + Writer.WriteInt32(EditorDataUnk); + Writer.WriteInt16((short) ConditionWidth); + Writer.WriteInt16((short) ObjectHeight); + Writer.Skip(12); - - - var data = ((MemoryStream) Writer.BaseStream).GetBuffer(); - Array.Resize(ref data,(int) Writer.Size()); - File.WriteAllBytes("MyEvents.bin",data); - } + //Writer.Skip((4 + 2 * 2 + 4 * 3)-4); + Writer.WriteAscii(EventEnd); + //TODO: Fix commented part + // + // + // if (Comments != null) + // { + // Console.WriteLine("Writing Comments"); + // Writer.WriteAscii(CommentData); + // foreach (Comment comment in Comments) + // { + // comment.Write(Writer); + // } + // } } diff --git a/NetMFAPatcher/MMFParser/MFA/Loaders/Frame.cs b/NetMFAPatcher/MMFParser/MFA/Loaders/Frame.cs index 217df6d..69a97fd 100644 --- a/NetMFAPatcher/MMFParser/MFA/Loaders/Frame.cs +++ b/NetMFAPatcher/MMFParser/MFA/Loaders/Frame.cs @@ -36,8 +36,8 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders "NoGlobalEvents" }); - public string Password; - public string UnkString; + public string Password=""; + public string UnkString=""; public List Palette; public int StampHandle; public int ActiveLayer; @@ -99,37 +99,35 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders foreach (var item in Items) { item.Write(Writer); + Writer.Skip(4); + var bytes = new byte[] {0x01,0x01,0x00,0x00, 0x00,0x00,0x00,0x00, 0x80,0x01,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x32,0x00, 0x00,0x00,0x32,0x00, 0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00}; + Writer.WriteBytes(bytes); } + // Writer.WriteAscii("AA"); Writer.WriteInt32(Folders.Count); foreach (var item in Folders) { item.Write(Writer); } - + // Writer.WriteAscii("AF"); Writer.WriteInt32(Instances.Count); foreach (var item in Instances) { item.Write(Writer); } + // Writer.WriteAscii("AI"); - if (Instances != null) - { - Writer.WriteInt32(Instances.Count); - foreach (var item in Instances) - { - item.Write(Writer); - } - } + - if (UnkBlocks != null) + /*if (UnkBlocks != null) { Writer.WriteInt32(UnkBlocks.Count); foreach (var item in UnkBlocks) { Writer.WriteBytes(item); } - } + }*/ Events.Write(Writer); Chunks.Write(Writer); @@ -215,11 +213,11 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders Instances.Add(inst); } - var unkCount = Reader.ReadInt32(); - for (int i = 0; i < unkCount; i++) - { - UnkBlocks.Add(Reader.ReadBytes(32)); - } + //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()); diff --git a/NetMFAPatcher/MMFParser/MFA/Loaders/FrameInstance.cs b/NetMFAPatcher/MMFParser/MFA/Loaders/FrameInstance.cs index 1f92c53..9716e55 100644 --- a/NetMFAPatcher/MMFParser/MFA/Loaders/FrameInstance.cs +++ b/NetMFAPatcher/MMFParser/MFA/Loaders/FrameInstance.cs @@ -1,4 +1,5 @@ -using DotNetCTFDumper.MMFParser.EXE; +using System; +using DotNetCTFDumper.MMFParser.EXE; using DotNetCTFDumper.Utils; namespace DotNetCTFDumper.MMFParser.MFA.Loaders @@ -31,7 +32,8 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders Flags = Reader.ReadUInt32(); ParentType = Reader.ReadUInt32(); ItemHandle = Reader.ReadUInt32(); - ParentHandle = Reader.ReadUInt32(); + ParentHandle = (uint) Reader.ReadInt32(); + Console.WriteLine($"ParentH:{ParentHandle}, ParentT: {ParentType}, Handle: {Handle}, Flags: {Flags}, ItemHandle: {ItemHandle}"); } public override void Write(ByteWriter Writer) @@ -43,7 +45,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders Writer.WriteUInt32(Flags); Writer.WriteUInt32(ParentType); Writer.WriteUInt32(ItemHandle); - Writer.WriteUInt32(ParentHandle); + Writer.WriteInt32((int) ParentHandle); } diff --git a/NetMFAPatcher/MMFParser/MFA/Loaders/FrameItem.cs b/NetMFAPatcher/MMFParser/MFA/Loaders/FrameItem.cs index 2f2b5c0..6e5b4c5 100644 --- a/NetMFAPatcher/MMFParser/MFA/Loaders/FrameItem.cs +++ b/NetMFAPatcher/MMFParser/MFA/Loaders/FrameItem.cs @@ -35,19 +35,22 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders Chunks.Write(Writer); Loader.Write(Writer); - + + } public override void Print() { - Console.WriteLine($"Name: {Name}"); + } public override void Read() { + ObjectType = Reader.ReadInt32(); Handle = Reader.ReadInt32(); Name = Helper.AutoReadUnicode(Reader); + Console.WriteLine($"Name: {Name}"); Transparent = Reader.ReadInt32(); InkEffect = Reader.ReadInt32(); diff --git a/NetMFAPatcher/MMFParser/MFA/Loaders/ItemFolder.cs b/NetMFAPatcher/MMFParser/MFA/Loaders/ItemFolder.cs index a78034f..84a288a 100644 --- a/NetMFAPatcher/MMFParser/MFA/Loaders/ItemFolder.cs +++ b/NetMFAPatcher/MMFParser/MFA/Loaders/ItemFolder.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using DotNetCTFDumper.MMFParser.EXE; using DotNetCTFDumper.Utils; @@ -8,6 +9,8 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders { public List Items; public string Name; + public uint UnkHeader; + public uint NonFolder; public ItemFolder(ByteReader reader) : base(reader) { @@ -19,10 +22,11 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders public override void Read() { - var value = Reader.ReadUInt32(); - if (value == 0x70000004) + UnkHeader = Reader.ReadUInt32(); + Console.WriteLine("UNK HEADER: "+UnkHeader.ToString("X4")); + if (UnkHeader == 0x70000004) { - Name = Helper.AutoReadUnicode(Reader); + Name = Reader.AutoReadUnicode(); Items = new List(); var count = Reader.ReadUInt32(); for (int i = 0; i < count; i++) @@ -32,30 +36,31 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders } else { - Name = ""; + Name = null; Items = new List(); + Items.Add(Reader.ReadUInt32()); } - - } public override void Write(ByteWriter Writer) { - if (Name.Length == 0) + if (Name == null) { - Writer.WriteUInt32(0x70000005); + Writer.WriteInt32(0x70000005); } else { - Writer.WriteUInt32(0x70000004); + Writer.WriteInt32(0x70000004); Writer.AutoWriteUnicode(Name); Writer.WriteInt32(Items.Count); } + foreach (var item in Items) { Writer.WriteUInt32(item); } + } public override void Print() diff --git a/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/AnimationObject.cs b/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/AnimationObject.cs index a6546e2..accc5f9 100644 --- a/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/AnimationObject.cs +++ b/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/AnimationObject.cs @@ -8,7 +8,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks { public class AnimationObject:ObjectLoader { - List _items = new List(); + public List Items = new List(); public override void Read() { base.Read(); @@ -19,7 +19,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks { var item = new Animation(Reader); item.Read(); - _items.Add(item); + Items.Add(item); } } @@ -28,9 +28,12 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks public AnimationObject(ByteReader reader) : base(reader) { } } - class Animation : DataLoader + + public class Animation : DataLoader { public string Name = "Animation-UNKNOWN"; + public List Directions; + public override void Write(ByteWriter Writer) { throw new NotImplementedException(); @@ -45,12 +48,12 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks { Name = Reader.AutoReadUnicode(); var directionCount = Reader.ReadInt32(); - var directions = new List(); + Directions = new List(); for (int i = 0; i < directionCount; i++) { var direction = new AnimationDirection(Reader); direction.Read(); - directions.Add(direction); + Directions.Add(direction); } @@ -58,7 +61,8 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks } public Animation(ByteReader reader) : base(reader) { } } - class AnimationDirection : DataLoader + + public class AnimationDirection : DataLoader { public string Name = "Animation-UNKNOWN"; public int Index; diff --git a/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/Behaviours.cs b/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/Behaviours.cs index 71a7206..d58613d 100644 --- a/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/Behaviours.cs +++ b/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/Behaviours.cs @@ -36,11 +36,12 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks class Behaviour : DataLoader { public string Name = "ERROR"; - public ByteReader Data; + public byte[] Data; public override void Write(ByteWriter Writer) { Writer.AutoWriteUnicode(Name); - Writer.WriteBytes(Data.ReadBytes((int) Data.Size())); + Writer.WriteUInt32((uint) Data.Length); + Writer.WriteBytes(Data); } public override void Print() @@ -52,7 +53,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks { Name = Reader.AutoReadUnicode(); - Data = new ByteReader(Reader.ReadBytes(Reader.ReadInt32())); + Data = Reader.ReadBytes((int) Reader.ReadUInt32()); } public Behaviour(ByteReader reader) : base(reader) { } diff --git a/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/Movements.cs b/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/Movements.cs index b219dce..8c8c359 100644 --- a/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/Movements.cs +++ b/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/Movements.cs @@ -47,7 +47,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks public int Identifier; public short Player; public short Type; - public byte MovingAtStart; + public byte MovingAtStart=1; public int DirectionAtStart; public int DataSize; public byte[] extData; @@ -66,7 +66,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks newWriter.WriteInt8(MovingAtStart); newWriter.Skip(3); newWriter.WriteInt32(DirectionAtStart); - newWriter.WriteBytes(extData); + // newWriter.WriteBytes(extData); } Writer.WriteWriter(newWriter); @@ -97,6 +97,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks MovingAtStart = Reader.ReadByte(); Reader.Skip(3); DirectionAtStart = Reader.ReadInt32(); + Console.WriteLine($"Player: {Player}, Type: {Type}, DirectionAtStart: {DirectionAtStart}, Identifier: {Identifier}"); extData = Reader.ReadBytes(DataSize-12); //ONLY STATIC MOVEMENT IS SUPPORTED RN //TODO:Movement Types diff --git a/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/ObjectLoader.cs b/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/ObjectLoader.cs index eecbcec..8b36969 100644 --- a/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/ObjectLoader.cs +++ b/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/ObjectLoader.cs @@ -38,6 +38,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks Strings.Write(Writer); Movements.Write(Writer); Behaviours.Write(Writer); + Writer.WriteInt8(0);//FadeIn Writer.WriteInt8(0);//FadeOut diff --git a/NetMFAPatcher/MMFParser/MFA/MFA.cs b/NetMFAPatcher/MMFParser/MFA/MFA.cs index 54c5e69..6f7c89e 100644 --- a/NetMFAPatcher/MMFParser/MFA/MFA.cs +++ b/NetMFAPatcher/MMFParser/MFA/MFA.cs @@ -252,6 +252,7 @@ namespace DotNetCTFDumper.MMFParser.MFA Writer.WriteUInt32((uint) (startPos+newWriter.Tell()+4)); Writer.WriteWriter(newWriter); Chunks.Write(Writer); + Console.WriteLine("Writing done"); diff --git a/NetMFAPatcher/MMFParser/Translation/MFAGenerator.cs b/NetMFAPatcher/MMFParser/Translation/MFAGenerator.cs index 13ec109..84e5325 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\OneObjOneFrame.mfa"; - // public static readonly string TemplatePath = @"C:\Users\ivani\Desktop\CTFResearch\OneObjOneFrame.mfa"; + // public static readonly string TemplatePath = @"C:\Users\MED45\Downloads\OneObjOneFrame.mfa"; + public static readonly string TemplatePath = @"C:\Users\ivani\Downloads\OneObjOneFrame.mfa"; public static MFA.MFA BuildMFA() { diff --git a/NetMFAPatcher/MMFParser/Translation/PAME2MFA.cs b/NetMFAPatcher/MMFParser/Translation/PAME2MFA.cs index e9a181d..248daea 100644 --- a/NetMFAPatcher/MMFParser/Translation/PAME2MFA.cs +++ b/NetMFAPatcher/MMFParser/Translation/PAME2MFA.cs @@ -1,6 +1,17 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web.UI.WebControls.Expressions; +using System.Xml.Schema; using DotNetCTFDumper.MMFParser.EXE; +using DotNetCTFDumper.MMFParser.EXE.Loaders; +using DotNetCTFDumper.MMFParser.EXE.Loaders.Objects; +using DotNetCTFDumper.MMFParser.MFA.Loaders; +using DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks; using DotNetCTFDumper.Utils; +using Animation = DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks.Animation; +using AnimationDirection = DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks.AnimationDirection; +using ChunkList = DotNetCTFDumper.MMFParser.MFA.Loaders.ChunkList; using Frame = DotNetCTFDumper.MMFParser.EXE.Loaders.Frame; using Layer = DotNetCTFDumper.MMFParser.MFA.Loaders.Layer; @@ -8,6 +19,7 @@ namespace DotNetCTFDumper.MMFParser.Translation { public static class Pame2Mfa { + public static Dictionary FrameItems; public static event Program.DumperEvent TranslatingFrame; public static void Translate(ref MFA.MFA mfa, GameData game) @@ -22,20 +34,20 @@ namespace DotNetCTFDumper.MMFParser.Translation mfa.Path = game.EditorFilename; //mfa.Stamp = wtf; - /*if (game.Fonts != null) mfa.Fonts = game.Fonts; + if (game.Fonts != null) mfa.Fonts = game.Fonts; - mfa.Sounds = game.Sounds; - foreach (var item in mfa.Sounds.Items) - { - item.IsCompressed = false; - } + //mfa.Sounds = game.Sounds; + //foreach (var item in mfa.Sounds.Items) + //{ + // item.IsCompressed = false; + //} mfa.Music = game.Music; mfa.Images.Items = game.Images.Images; - foreach (var key in mfa.Images.Items.Keys) - { - mfa.Images.Items[key].Debug = true; - } - */ + // foreach (var key in mfa.Images.Items.Keys) + // { + // mfa.Images.Items[key].Debug = true; + // } + mfa.Author = game.Author ?? "Kostya"; mfa.Copyright = game.Copyright ??"CTFAN Team"; mfa.Company = "CTFAN Team"; @@ -60,14 +72,220 @@ namespace DotNetCTFDumper.MMFParser.Translation mfa.Aboutbox = game.AboutText?.Length > 0 ? game?.AboutText : "This game was decompiled with " + Settings.DumperVersion; + + //Object Section + FrameItems = new Dictionary(); + for (int i = 0; i < game.Frameitems.ItemDict.Keys.Count; i++) + { + var key = game.Frameitems.ItemDict.Keys.ToArray()[i]; + var item = game.Frameitems.ItemDict[key]; + if (item.ObjectType == 2) + { + + + + var newItem = new FrameItem(null); + newItem.Name = item.Name; + newItem.ObjectType = item.ObjectType; + newItem.Handle = item.Handle; + newItem.Transparent = item.Transparent ? 1:0; + newItem.InkEffect = item.InkEffect; + newItem.InkEffectParameter = item.InkEffectValue; + newItem.AntiAliasing = item.Antialias ? 1 : 0; + newItem.Flags = (int) item.Flags; + newItem.Chunks=new ChunkList(null); + var itemLoader = (ObjectCommon)item.Properties.Loader; + //Only actives + //TODO:Other types of objects + + var newLoader = new Active(null); + newLoader.ObjectFlags = (int) itemLoader.Flags.flag; + newLoader.NewObjectFlags = (int) itemLoader.NewFlags.flag; + newLoader.BackgroundColor = itemLoader.BackColor; + //newLoader.Qualifiers; + newLoader.Strings = ConvertStrings(itemLoader.Strings); + newLoader.Values = ConvertValue(itemLoader.Values); + newLoader.Movements=new Movements(null); + var testMovement = new Movement(null); + testMovement.Name = "New Movement"; + testMovement.Extension = ""; + newLoader.Movements.Items.Add(testMovement); + newLoader.Behaviours=new Behaviours(null); + //TODO: Transitions + if (itemLoader.Animations != null) + { + var animHeader = itemLoader.Animations; + for (int j = 0; j < animHeader.AnimationDict.Count; j++) + { + + var newAnimation = new Animation(null); + var newDirections = new List(); + EXE.Loaders.Objects.Animation animation = null; + try + { + animation = animHeader.AnimationDict[0]; + } + catch (Exception e) + { + Console.WriteLine(e); + //throw; + } + + if (animation != null) + { + for (int n = 0; n < 1; n++) + { + var direction = animation.DirectionDict.ToArray()[n].Value; + var newDirection = new AnimationDirection(null); + newDirection.MinSpeed = direction.MinSpeed; + newDirection.MaxSpeed = direction.MaxSpeed; + newDirection.Index = n; + newDirection.Repeat = direction.Repeat; + newDirection.BackTo = direction.BackTo; + newDirection.Frames = direction.Frames; + newDirections.Add(newDirection); + } + + newAnimation.Directions = newDirections; + + } + + newLoader.Items.Add(newAnimation); + } + } + + newItem.Loader = newLoader; + try + { + FrameItems.Add(newItem.Handle,newItem); + } + catch (Exception e) + { + Console.WriteLine(e); + throw; + } + + } + + + } + + mfa.Frames.Clear(); - foreach (Frame gameFrame in game.Frames) + foreach (Frame frame in game.Frames) { - var mfaFrame = ConvertFrame(gameFrame); - mfaFrame.Handle = game.Frames.IndexOf(gameFrame); - mfa.Frames.Add(mfaFrame); - + var newFrame = new MFA.Loaders.Frame(null); + //FrameInfo + newFrame.Handle = game.Frames.IndexOf(frame); + newFrame.Name = frame.Name; + newFrame.SizeX = frame.Width; + newFrame.SizeY = frame.Height; + newFrame.Background = frame.Background; + newFrame.FadeIn = frame.FadeIn!=null? ConvertTransition(frame.FadeIn):null; + newFrame.FadeOut = frame.FadeOut!=null? ConvertTransition(frame.FadeOut):null; + var mfaFlags = newFrame.Flags; + var originalFlags = frame.Flags; + mfaFlags["GrabDesktop"] = originalFlags["GrabDesktop"]; + mfaFlags["KeepDisplay"] = originalFlags["KeepDisplay"]; + mfaFlags["BackgroundCollisions"] = originalFlags["TotalCollisionMask"]; + mfaFlags["ResizeToScreen"] = originalFlags["ResizeAtStart"]; + mfaFlags["ForceLoadOnCall"] = originalFlags["ForceLoadOnCall"]; + mfaFlags["NoDisplaySurface"] = false; + mfaFlags["TimerBasedMovements"] = originalFlags["TimedMovements"]; + newFrame.MaxObjects = frame.Events?.MaxObjects ?? 10000; + newFrame.Password = ""; + newFrame.LastViewedX = 320; + newFrame.LastViewedY = 240; + newFrame.Palette = frame.Palette.Items; + newFrame.StampHandle = 12; + newFrame.ActiveLayer = 0; + //LayerInfo + newFrame.Layers=new List(); + foreach (EXE.Loaders.Layer layer in frame.Layers.Items) + { + var newLayer = new Layer(null); + newLayer.Name = layer.Name; + var layerFlags = layer.Flags; + newLayer.Flags["HideAtStart"] = originalFlags["ToHide"]; + newLayer.Flags["Visible"] = true; + newLayer.Flags["NoBackground"] = originalFlags["DoNotSaveBackground"]; + newLayer.Flags["WrapHorizontally"] = originalFlags["WrapHorizontally"]; + newLayer.Flags["WrapVertically"] = originalFlags["WrapVertically"]; + newLayer.XCoefficient = layer.XCoeff; + newLayer.YCoefficient = layer.YCoeff; + newFrame.Layers.Add(newLayer); + } + var newFrameItems = new List(); + var newInstances = new List(); + if (frame.Objects != null) + { + + for (int i = 0; i < frame.Objects.Items.Count; i++) + { + + var instance = frame.Objects.Items[i]; + if (instance.FrameItem.ObjectType == 2) + { + FrameItem frameItem = null; + try + { + frameItem = FrameItems[instance.ObjectInfo]; + } + catch{} + if(frameItem!=null) newFrameItems.Add(frameItem); + var newInstance = new FrameInstance((ByteReader) null); + newInstance.X = instance.X; + newInstance.Y = instance.Y; + newInstance.Handle = i; + newInstance.Flags = 8; + newInstance.ParentType = (uint) instance.ParentType; + newInstance.ItemHandle = instance.ObjectInfo; + newInstance.ParentHandle = (uint) instance.ParentHandle; + newInstance.Layer = (uint)instance.Layer; + newInstances.Add(newInstance); + + } + + } + } + + newFrame.Items = newFrameItems; + newFrame.Instances = newInstances; + newFrame.Folders=new List(); + foreach (FrameItem newFrameItem in newFrame.Items) + { + var newFolder = new ItemFolder((ByteReader) null); + newFolder.Items=new List() {(uint) newFrameItem.Handle}; + newFrame.Folders.Add(newFolder); + } + //EventInfo + + + + + newFrame.Events = MFA.MFA.emptyEvents; + foreach (var item in newFrame.Items) + { + var newObject = new EventObject((ByteReader) null); + + newObject.Handle = (uint) item.Handle; + newObject.Name = item.Name; + newObject.TypeName = ""; + newObject.ItemType = (ushort) item.ObjectType; + newObject.ObjectType = 1; + newObject.Flags = 0; + newObject.ItemHandle = (uint) item.Handle; + newObject.InstanceHandle = 0xFFFFFFFF; + //newFrame.Events.Objects.Add(newObject); + + } + newFrame.Chunks = new ChunkList(null); + mfa.Frames.Add(newFrame); } + + + + } public static MFA.Loaders.Transition ConvertTransition(EXE.Loaders.Transition gameTrans) @@ -85,52 +303,43 @@ namespace DotNetCTFDumper.MMFParser.Translation } - public static MFA.Loaders.Frame ConvertFrame(EXE.Loaders.Frame gameFrame) + public static ValueList ConvertValue(AlterableValues values) { - MFA.Loaders.Frame mfaFrame = new MFA.Loaders.Frame(null); - TranslatingFrame?.Invoke(gameFrame.Name); - mfaFrame.Name = gameFrame.Name; - mfaFrame.SizeX = gameFrame.Width; - mfaFrame.SizeY = gameFrame.Height; - mfaFrame.Background = gameFrame.Background; - if (gameFrame.FadeIn != null)mfaFrame.FadeIn = ConvertTransition(gameFrame.FadeIn); - if (gameFrame.FadeOut != null)mfaFrame.FadeOut = ConvertTransition(gameFrame.FadeOut); - - //TODO:Flags - mfaFrame.MaxObjects = gameFrame.Events?.MaxObjects ?? 10000; - mfaFrame.Password = gameFrame?.Password ?? ""; - mfaFrame.LastViewedX = 320; - mfaFrame.LastViewedY = 240; - mfaFrame.Palette = gameFrame.Palette.Items; - mfaFrame.StampHandle = 12; - mfaFrame.ActiveLayer = 0; - mfaFrame.Layers = new List(); - - foreach (EXE.Loaders.Layer gameLayer in gameFrame.Layers.Items) + var alterables = new ValueList(null); + if (values != null) { - Layer mfaLayer = new Layer(null) + for (int i = 0; i < values.Items.Count; i++) { - Name = gameLayer.Name, - Flags = - { - ["HideAtStart"] = gameLayer.Flags["ToHide"], - ["Visible"] = true, - ["NoBackground"] = gameLayer.Flags["DoNotSaveBackground"], - ["WrapHorizontally"] = gameLayer.Flags["WrapHorizontally"], - ["WrapVertically"] = gameLayer.Flags["WrapVertically"] - - }, - XCoefficient = gameLayer.XCoeff, - YCoefficient = gameLayer.YCoeff - }; - mfaFrame.Layers.Add(mfaLayer); - break; - //TODO: Fix layers + var item = values.Items[i]; + var newValue = new ValueItem(null); + newValue.Name = $"Alterable Value {i+1}"; + newValue.Value = item; + alterables.Items.Add(newValue); + } } - mfaFrame.Events = MFA.MFA.emptyEvents; - mfaFrame.Chunks = MFA.MFA.emptyFrameChunks; - return mfaFrame; + + return alterables; } + public static ValueList ConvertStrings(AlterableStrings values) + { + var alterables = new ValueList(null); + if (values != null) + { + for (int i = 0; i < values.Items.Count; i++) + { + var item = values.Items[i]; + var newValue = new ValueItem(null); + newValue.Name = $"Alterable String {i+1}"; + newValue.Value = item; + alterables.Items.Add(newValue); + } + } + + return alterables; + } + + + } diff --git a/NetMFAPatcher/Program.cs b/NetMFAPatcher/Program.cs index 794f88d..3793a62 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;