diff --git a/DotNetCTFDumper/GUI/MainForm.cs b/DotNetCTFDumper/GUI/MainForm.cs index 73b9762..485a67c 100644 --- a/DotNetCTFDumper/GUI/MainForm.cs +++ b/DotNetCTFDumper/GUI/MainForm.cs @@ -138,7 +138,7 @@ namespace DotNetCTFDumper.GUI private void StartReading() { var path = openFileDialog1.FileName; - loadingLabel.Visible = true; + //loadingLabel.Visible = true; Program.ReadFile(path, Settings.Verbose, Settings.DumpImages, Settings.DumpSounds); imageBar.Value = 0; diff --git a/DotNetCTFDumper/MMFParser/EXE/Loaders/Banks/ImageBank.cs b/DotNetCTFDumper/MMFParser/EXE/Loaders/Banks/ImageBank.cs index 7af03f0..720cb7d 100644 --- a/DotNetCTFDumper/MMFParser/EXE/Loaders/Banks/ImageBank.cs +++ b/DotNetCTFDumper/MMFParser/EXE/Loaders/Banks/ImageBank.cs @@ -15,7 +15,7 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Banks public bool SaveImages = false; public Dictionary Images = new Dictionary(); public uint NumberOfItems; - public bool PreloadOnly=true; + public bool PreloadOnly=false; public ImageBank(ByteReader reader) : base(reader) { @@ -355,6 +355,7 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Banks chunk.WriteInt32(_checksum); chunk.WriteInt32(_references); byte[] compressedImg = null; + Flags["LZX"] = true; if (Flags["LZX"]) { compressedImg = Decompressor.compress_block(rawImg); @@ -362,7 +363,7 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Banks } else { - chunk.WriteUInt32((uint) rawImg.Length); + chunk?.WriteUInt32((uint) (rawImg?.Length??0)); } chunk.WriteInt16((short) _width); diff --git a/DotNetCTFDumper/MMFParser/EXE/Loaders/Events/Events.cs b/DotNetCTFDumper/MMFParser/EXE/Loaders/Events/Events.cs index 0049e54..290dcee 100644 --- a/DotNetCTFDumper/MMFParser/EXE/Loaders/Events/Events.cs +++ b/DotNetCTFDumper/MMFParser/EXE/Loaders/Events/Events.cs @@ -185,8 +185,8 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Events public void Write(ByteWriter Writer) { ByteWriter newWriter = new ByteWriter(new MemoryStream()); - newWriter.WriteUInt8( (sbyte) Conditions.Count); - newWriter.WriteUInt8((sbyte) Actions.Count); + newWriter.WriteInt8( NumberOfConditions); + newWriter.WriteInt8(NumberOfActions); newWriter.WriteUInt16(Flags); if (Settings.Build >= 284) { diff --git a/DotNetCTFDumper/MMFParser/EXE/Loaders/Frame.cs b/DotNetCTFDumper/MMFParser/EXE/Loaders/Frame.cs index 38bb84c..3d723df 100644 --- a/DotNetCTFDumper/MMFParser/EXE/Loaders/Frame.cs +++ b/DotNetCTFDumper/MMFParser/EXE/Loaders/Frame.cs @@ -427,7 +427,7 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders public override void Read() { Items = new List(); - for (int i = 0; i < 256; i++) + for (int i = 0; i < 257; i++) { Items.Add(Reader.ReadColor()); } diff --git a/DotNetCTFDumper/MMFParser/EXE/Loaders/Objects/ObjectCommon.cs b/DotNetCTFDumper/MMFParser/EXE/Loaders/Objects/ObjectCommon.cs index 3901312..b3024cc 100644 --- a/DotNetCTFDumper/MMFParser/EXE/Loaders/Objects/ObjectCommon.cs +++ b/DotNetCTFDumper/MMFParser/EXE/Loaders/Objects/ObjectCommon.cs @@ -14,8 +14,8 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Objects private ushort _movementsOffset; private short _animationsOffset; private short _systemObjectOffset; - private short _counterOffset; - private short _extensionOffset; + public short CounterOffset; + public short ExtensionOffset; public Animations Animations; private long _end; @@ -114,7 +114,7 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Objects _animationsOffset = Reader.ReadInt16(); } short version = Reader.ReadInt16(); - _counterOffset = (short) Reader.ReadUInt16(); + CounterOffset = (short) Reader.ReadUInt16(); _systemObjectOffset = (short) Reader.ReadUInt16(); Flags.flag = Reader.ReadUInt32(); @@ -127,7 +127,7 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Objects } else { - _extensionOffset = Reader.ReadInt16(); + ExtensionOffset = Reader.ReadInt16(); } _valuesOffset = Reader.ReadInt16(); diff --git a/DotNetCTFDumper/MMFParser/MFA/Loaders/Events.cs b/DotNetCTFDumper/MMFParser/MFA/Loaders/Events.cs index b024fc6..2a025e8 100644 --- a/DotNetCTFDumper/MMFParser/MFA/Loaders/Events.cs +++ b/DotNetCTFDumper/MMFParser/MFA/Loaders/Events.cs @@ -43,6 +43,9 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders public uint EventLineY; public byte[] Saved; public int EditorDataUnk; + public uint EventDataLen; + public uint CommentDataLen; + private byte[] _cache; public Events(ByteReader reader) : base(reader) { @@ -63,10 +66,11 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders { string name = Reader.ReadAscii(4); + Console.WriteLine(name); if (name == EventData) { - uint size = Reader.ReadUInt32(); - uint end = (uint) (Reader.Tell() + size); + EventDataLen = Reader.ReadUInt32(); + uint end = (uint) (Reader.Tell() + EventDataLen); while (true) { EventGroup evGrp = new EventGroup(Reader); @@ -79,7 +83,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders { try { - uint len = Reader.ReadUInt32(); + CommentDataLen = Reader.ReadUInt32(); Comments = new List(); Comment comment = new Comment(Reader); comment.Read(); @@ -170,7 +174,11 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders EventLine = Reader.ReadUInt32(); EventLineY = Reader.ReadUInt32(); } - else if (name == EventEnd) break; + else if (name == EventEnd) + { + _cache = Reader.ReadBytes(122); + break; + } else throw new NotImplementedException("Fuck Something is Broken"); } @@ -178,34 +186,35 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders public override void Write(ByteWriter Writer) { - Writer.WriteUInt16(Version); - Writer.WriteInt16((short) FrameType); + Writer.WriteUInt16(FrameType); - if (Items != null) + if (Items.Count>0) { - /*Console.WriteLine("Writing EventData"); + Console.WriteLine("Writing EventData"); Writer.WriteAscii(EventData); ByteWriter newWriter = new ByteWriter(new MemoryStream()); + Writer.WriteUInt32(EventDataLen); + foreach (EventGroup eventGroup in Items) { eventGroup.Write(newWriter); } - Writer.WriteWriter(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 (Objects.Count>0) + { + Console.WriteLine("Writing EventObjects"); + Writer.WriteAscii(ObjectData); + Writer.WriteUInt32((uint) Objects.Count); + foreach (EventObject eventObject in Objects) + { + eventObject.Write(Writer); + } + } if (ObjectTypes != null) { @@ -260,10 +269,10 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders Writer.Skip(12); - //Writer.Skip((4 + 2 * 2 + 4 * 3)-4); - Writer.WriteAscii(EventEnd); - + Writer.WriteBytes(_cache); + + //TODO: Fix commented part // diff --git a/DotNetCTFDumper/MMFParser/MFA/Loaders/Frame.cs b/DotNetCTFDumper/MMFParser/MFA/Loaders/Frame.cs index 890e442..540a586 100644 --- a/DotNetCTFDumper/MMFParser/MFA/Loaders/Frame.cs +++ b/DotNetCTFDumper/MMFParser/MFA/Loaders/Frame.cs @@ -65,12 +65,13 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders Writer.AutoWriteUnicode(UnkString); Writer.WriteInt32(LastViewedX); Writer.WriteInt32(LastViewedY); - Writer.WriteInt32(Palette.Count); + //Writer.WriteInt32(Palette.Count);//WTF HELP + Palette[0] = Color.FromArgb(0, 0, 1, 0); foreach (var item in Palette) { Writer.WriteColor(item); } - + Writer.WriteInt32(StampHandle); Writer.WriteInt32(ActiveLayer); Writer.WriteInt32(Layers.Count); @@ -78,7 +79,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders { layer.Write(Writer); } - + if (FadeIn != null) { Writer.WriteInt8(1); @@ -92,25 +93,22 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders FadeOut.Write(Writer); } else Writer.Skip(1); - - + Writer.WriteInt32(Items.Count); 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); - //wtf help + } - // Writer.WriteAscii("AA"); + Writer.WriteInt32(Folders.Count); foreach (var item in Folders) { item.Write(Writer); } - // Writer.WriteAscii("AF"); + // Writer.WriteAscii("AA"); Writer.WriteInt32(Instances.Count); foreach (var item in Instances) { @@ -130,6 +128,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders }*/ Events.Write(Writer); + Chunks.Write(Writer); } @@ -154,9 +153,9 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders LastViewedX = Reader.ReadInt32(); LastViewedY = Reader.ReadInt32(); - var paletteSize = Reader.ReadInt32(); + //var paletteSize = Reader.ReadInt32(); Palette = new List(); - for (int i = 0; i < paletteSize; i++) + for (int i = 0; i < 257; i++) { Palette.Add(Reader.ReadColor()); } @@ -190,6 +189,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders { var frameitem = new FrameItem(Reader); frameitem.Read(); + Items.Add(frameitem); } diff --git a/DotNetCTFDumper/MMFParser/MFA/Loaders/FrameItem.cs b/DotNetCTFDumper/MMFParser/MFA/Loaders/FrameItem.cs index a14cc1d..48c5185 100644 --- a/DotNetCTFDumper/MMFParser/MFA/Loaders/FrameItem.cs +++ b/DotNetCTFDumper/MMFParser/MFA/Loaders/FrameItem.cs @@ -34,9 +34,10 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders Writer.WriteInt32(Flags); Writer.WriteInt32(1); Writer.WriteInt32(IconHandle); + Chunks.Write(Writer); Loader.Write(Writer); - + } @@ -71,6 +72,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders } Chunks = new ChunkList(Reader); Chunks.Read(); + if (MFA.defaultObjChunks == null) MFA.defaultObjChunks = Chunks; if(ObjectType>=32)//extension base { //TODO: Nonactives diff --git a/DotNetCTFDumper/MMFParser/MFA/Loaders/ImageBank.cs b/DotNetCTFDumper/MMFParser/MFA/Loaders/ImageBank.cs index 31c2b7c..f29f49f 100644 --- a/DotNetCTFDumper/MMFParser/MFA/Loaders/ImageBank.cs +++ b/DotNetCTFDumper/MMFParser/MFA/Loaders/ImageBank.cs @@ -8,7 +8,7 @@ using static DotNetCTFDumper.MMFParser.EXE.ChunkList; namespace DotNetCTFDumper.MMFParser.MFA.Loaders { - public class AgmiBank : DataLoader + public class AGMIBank : DataLoader { private int GraphicMode; private int PaletteVersion; @@ -54,6 +54,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders public override void Write(ByteWriter writer) { + Logger.Log("TEX WRITE"); writer.WriteInt32(GraphicMode); writer.WriteInt16((short) PaletteVersion); writer.WriteInt16((short) PaletteEntries); @@ -70,11 +71,11 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders } } - public AgmiBank(ByteReader reader) : base(reader) + public AGMIBank(ByteReader reader) : base(reader) { } - public AgmiBank(Chunk chunk) : base(chunk) + public AGMIBank(Chunk chunk) : base(chunk) { } } diff --git a/DotNetCTFDumper/MMFParser/MFA/Loaders/ItemFolder.cs b/DotNetCTFDumper/MMFParser/MFA/Loaders/ItemFolder.cs index b1e59fa..b8d7e26 100644 --- a/DotNetCTFDumper/MMFParser/MFA/Loaders/ItemFolder.cs +++ b/DotNetCTFDumper/MMFParser/MFA/Loaders/ItemFolder.cs @@ -46,19 +46,21 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders if (Name == null) { Writer.WriteInt32(0x70000005); + Writer.WriteInt32(3); } else { Writer.WriteInt32(0x70000004); Writer.AutoWriteUnicode(Name); Writer.WriteInt32(Items.Count); + foreach (var item in Items) + { + Writer.WriteUInt32(item); + } } - foreach (var item in Items) - { - Writer.WriteUInt32(item); - } + } diff --git a/DotNetCTFDumper/MMFParser/MFA/Loaders/Layer.cs b/DotNetCTFDumper/MMFParser/MFA/Loaders/Layer.cs index 3c05d8f..61de57f 100644 --- a/DotNetCTFDumper/MMFParser/MFA/Loaders/Layer.cs +++ b/DotNetCTFDumper/MMFParser/MFA/Loaders/Layer.cs @@ -26,7 +26,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders public override void Write(ByteWriter Writer) { - Writer.AutoWriteUnicode(Name); + Writer.AutoWriteUnicode(""); Writer.WriteInt32((int) Flags.flag); Writer.WriteSingle(XCoefficient); Writer.WriteSingle(YCoefficient); diff --git a/DotNetCTFDumper/MMFParser/MFA/Loaders/mfachunks/AnimationObject.cs b/DotNetCTFDumper/MMFParser/MFA/Loaders/mfachunks/AnimationObject.cs index 2a53362..d29d177 100644 --- a/DotNetCTFDumper/MMFParser/MFA/Loaders/mfachunks/AnimationObject.cs +++ b/DotNetCTFDumper/MMFParser/MFA/Loaders/mfachunks/AnimationObject.cs @@ -12,6 +12,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks public override void Read() { base.Read(); + if(Reader.ReadByte()!=0) { var animationCount = Reader.ReadUInt32(); @@ -41,7 +42,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks public class Animation : DataLoader { - public string Name = "Animation-UNKNOWN"; + public string Name = ""; public List Directions; public override void Write(ByteWriter Writer) diff --git a/DotNetCTFDumper/MMFParser/MFA/Loaders/mfachunks/Behaviours.cs b/DotNetCTFDumper/MMFParser/MFA/Loaders/mfachunks/Behaviours.cs index d58613d..a436a6c 100644 --- a/DotNetCTFDumper/MMFParser/MFA/Loaders/mfachunks/Behaviours.cs +++ b/DotNetCTFDumper/MMFParser/MFA/Loaders/mfachunks/Behaviours.cs @@ -10,6 +10,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks List _items = new List(); public override void Write(ByteWriter Writer) { + Writer.WriteInt32(_items.Count); foreach (Behaviour behaviour in _items) { behaviour.Write(Writer); diff --git a/DotNetCTFDumper/MMFParser/MFA/Loaders/mfachunks/Movements.cs b/DotNetCTFDumper/MMFParser/MFA/Loaders/mfachunks/Movements.cs index 56b6d97..9dce2e9 100644 --- a/DotNetCTFDumper/MMFParser/MFA/Loaders/mfachunks/Movements.cs +++ b/DotNetCTFDumper/MMFParser/MFA/Loaders/mfachunks/Movements.cs @@ -44,19 +44,18 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks { public string Name="ERROR"; public string Extension; - public int Identifier; + public uint Identifier; public short Player; public short Type; public byte MovingAtStart=1; public int DirectionAtStart; public int DataSize; - public byte[] extData=new byte[0]; + public byte[] extData=new byte[14]; public override void Write(ByteWriter Writer) { Writer.AutoWriteUnicode(Name); Writer.AutoWriteUnicode(Extension); - Writer.WriteInt32(Identifier); - // + Writer.WriteUInt32(Identifier); var newWriter = new ByteWriter(new MemoryStream()); if (Extension.Length==0) { @@ -66,9 +65,10 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks newWriter.WriteInt8(MovingAtStart); newWriter.Skip(3); newWriter.WriteInt32(DirectionAtStart); - //newWriter.WriteBytes(extData); + newWriter.WriteBytes(extData); } //write loader + Writer.WriteInt32((int) newWriter.Size()); Writer.WriteWriter(newWriter); @@ -81,9 +81,9 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks public override void Read() { - Name = Helper.AutoReadUnicode(Reader); - Extension = Helper.AutoReadUnicode(Reader); - Identifier = (int) Reader.ReadUInt32(); + Name = Reader.AutoReadUnicode(); + Extension = Reader.AutoReadUnicode(); + Identifier = Reader.ReadUInt32(); DataSize = (int) Reader.ReadUInt32(); if(Extension.Length>0) { diff --git a/DotNetCTFDumper/MMFParser/MFA/Loaders/mfachunks/ObjectLoader.cs b/DotNetCTFDumper/MMFParser/MFA/Loaders/mfachunks/ObjectLoader.cs index 91162b5..871776a 100644 --- a/DotNetCTFDumper/MMFParser/MFA/Loaders/mfachunks/ObjectLoader.cs +++ b/DotNetCTFDumper/MMFParser/MFA/Loaders/mfachunks/ObjectLoader.cs @@ -23,20 +23,24 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks Writer.WriteInt32(NewObjectFlags); Writer.WriteColor(BackgroundColor); - for (int i = 0; i < 9; i++) + /*for (int i = 0; i < 9; i++) { try { - //var value = _qualifiers[i]; + var value = _qualifiers[i]; Writer.WriteInt16(-1); - break; } catch { - + Writer.WriteInt16(-1); break; } + }*/ + + for (int i = 0; i < 9; i++) + { + Writer.WriteInt16(-1);//WTF HELP } Values.Write(Writer); diff --git a/DotNetCTFDumper/MMFParser/MFA/MFA.cs b/DotNetCTFDumper/MMFParser/MFA/MFA.cs index 2fbab50..25fe26b 100644 --- a/DotNetCTFDumper/MMFParser/MFA/MFA.cs +++ b/DotNetCTFDumper/MMFParser/MFA/MFA.cs @@ -24,7 +24,7 @@ namespace DotNetCTFDumper.MMFParser.MFA public int MfaBuild; public int Product; public int BuildVersion; - public int LangId; + public int LangId=32; public string Name; public string Description; @@ -35,8 +35,8 @@ namespace DotNetCTFDumper.MMFParser.MFA public FontBank Fonts; public SoundBank Sounds; public MusicBank Music; - public AgmiBank Icons; - public AgmiBank Images; + public AGMIBank Icons; + public AGMIBank Images; public string Author; @@ -118,6 +118,8 @@ namespace DotNetCTFDumper.MMFParser.MFA public static Events emptyEvents; public static ChunkList emptyFrameChunks; + public static ChunkList defaultObjChunks; + public override void Print() @@ -192,7 +194,6 @@ namespace DotNetCTFDumper.MMFParser.MFA Controls.Write(Writer); - if (Menu != null) { using (ByteWriter menuWriter = new ByteWriter(new MemoryStream())) @@ -244,16 +245,16 @@ namespace DotNetCTFDumper.MMFParser.MFA } Writer.WriteInt32(Frames.Count); //frame - var startPos = Writer.Tell() + 4 * Frames.Count + 4; + var startPos = Writer.Tell() + 4 * Frames.Count+4; ByteWriter newWriter = new ByteWriter(new MemoryStream()); foreach (Frame frame in Frames) { Pame2Mfa.Message("Writing Frame"); - Writer.WriteUInt32((uint) (startPos+newWriter.Tell()+4)); + Writer.WriteUInt32((uint) (startPos+newWriter.Tell())); frame.Write(newWriter); } - Writer.WriteUInt32((uint) (startPos+newWriter.Tell()+4)); + Writer.WriteUInt32((uint) (startPos+newWriter.Tell())); Writer.WriteWriter(newWriter); Chunks.Write(Writer); Console.WriteLine("Writing done"); @@ -290,11 +291,11 @@ namespace DotNetCTFDumper.MMFParser.MFA Music.Read(); if (Reader.ReadAscii(4) != "AGMI") throw new Exception("Invalid Icon Bank"); - Icons = new AgmiBank(Reader); + Icons = new AGMIBank(Reader); Icons.Read(); if (Reader.ReadAscii(4) != "AGMI") throw new Exception("Invalid Image Bank"); - Images = new AgmiBank(Reader); + Images = new AGMIBank(Reader); Images.Read(); Helper.CheckPattern(Helper.AutoReadUnicode(Reader), Name); diff --git a/DotNetCTFDumper/MMFParser/Translation/MFAGenerator.cs b/DotNetCTFDumper/MMFParser/Translation/MFAGenerator.cs index ea8199c..fdcff7c 100644 --- a/DotNetCTFDumper/MMFParser/Translation/MFAGenerator.cs +++ b/DotNetCTFDumper/MMFParser/Translation/MFAGenerator.cs @@ -8,7 +8,7 @@ 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\Downloads\OneObjOneFrame.mfa"; + public static readonly string TemplatePath = @"C:\Users\ivani\Desktop\CTFResearch\OneObjOneFrame.mfa"; public static MFA.MFA BuildMFA() { @@ -22,7 +22,7 @@ namespace DotNetCTFDumper.MMFParser.Translation var mfaWriter = new ByteWriter( - Settings.GameName.Length > 0 ? $"{Settings.DumpPath}\\{Exe.Instance.GameData.Name}.mfa" : "out.mfa", + Settings.GameName.Length > 0 ? $"{Settings.DumpPath}\\{Exe.Instance.GameData.Name}-decompiled.mfa" : "out.mfa", FileMode.Create); //New writer for new MFA Pame2Mfa.Message(""); Pame2Mfa.Message("Writing MFA"); @@ -36,7 +36,7 @@ namespace DotNetCTFDumper.MMFParser.Translation public static void ReadTestMFA() { - var output_path = Path.Combine(Path.GetDirectoryName(TemplatePath), "decompiled.mfa"); + 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; @@ -45,7 +45,7 @@ namespace DotNetCTFDumper.MMFParser.Translation //Add modifications - var mfaWriter = new ByteWriter(output_path, FileMode.Create); + var mfaWriter = new ByteWriter(outputPath, FileMode.Create); template.Write(mfaWriter); } } diff --git a/DotNetCTFDumper/MMFParser/Translation/PAME2MFA.cs b/DotNetCTFDumper/MMFParser/Translation/PAME2MFA.cs index e9feee4..9e1c429 100644 --- a/DotNetCTFDumper/MMFParser/Translation/PAME2MFA.cs +++ b/DotNetCTFDumper/MMFParser/Translation/PAME2MFA.cs @@ -33,8 +33,8 @@ namespace DotNetCTFDumper.MMFParser.Translation //mfa.Product = (int) game.ProductVersion; //mfa.BuildVersion = 283; mfa.Name = game.Name; - mfa.LangId = 0; - mfa.Description = $"Decompiled with {Settings.DumperVersion}"; + mfa.LangId = 8192; + mfa.Description = ""; mfa.Path = game.EditorFilename; //mfa.Stamp = wtf; @@ -47,14 +47,14 @@ namespace DotNetCTFDumper.MMFParser.Translation //} mfa.Music = game.Music; mfa.Images.Items = game.Images.Images; - // 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"; + foreach (var key in mfa.Images.Items.Keys) + { + mfa.Images.Items[key].Debug = true; + } + + mfa.Author = game.Author ?? ""; + mfa.Copyright = game.Copyright ??""; + mfa.Company = ""; mfa.Version = ""; //TODO:Binary Files var displaySettings = mfa.DisplayFlags; @@ -75,7 +75,7 @@ namespace DotNetCTFDumper.MMFParser.Translation mfa.CommandLine = ""; mfa.Aboutbox = game.AboutText?.Length > 0 ? game?.AboutText - : "This game was decompiled with " + Settings.DumperVersion; + : ""; //Object Section FrameItems = new Dictionary(); @@ -83,110 +83,100 @@ namespace DotNetCTFDumper.MMFParser.Translation { var key = game.Frameitems.ItemDict.Keys.ToArray()[i]; var item = game.Frameitems.ItemDict[key]; - if (item.ObjectType == 2) + if (item.ObjectType != 2) continue; + 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; //32 TODO:Fix this + newItem.IconHandle = 12; + 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;//820 + newLoader.NewObjectFlags = (int) itemLoader.NewFlags.flag;//8 + newLoader.BackgroundColor = Color.FromArgb(0x0, 0xff, 0xff, 0xff); + //newLoader.Qualifiers; + newLoader.Strings = ConvertStrings(itemLoader.Strings); + newLoader.Values = ConvertValue(itemLoader.Values); + newLoader.Movements=new MFA.Loaders.mfachunks.Movements(null); + for (int j = 0; j < itemLoader.Movements.Items.Count; j++) { + var mov = itemLoader.Movements.Items[j]; + var newMov = new Movement(null); + newMov.Name = $"Movement #{j}"; + newMov.Extension = ""; + newMov.Identifier = (uint) mov.Type; + newMov.Player = mov.Player; + newMov.MovingAtStart = mov.MovingAtStart; + newMov.DirectionAtStart = mov.DirectionAtStart; + newLoader.Movements.Items.Add(newMov); + } + 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 + { + if (animHeader.AnimationDict.ContainsKey(j)) animation = animHeader.AnimationDict[j]; + else break; - - 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.IconHandle = 10; - 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 = Color.FromArgb(itemLoader.BackColor.R,itemLoader.BackColor.G,itemLoader.BackColor.B); - //newLoader.Qualifiers; - newLoader.Strings = ConvertStrings(itemLoader.Strings); - newLoader.Values = ConvertValue(itemLoader.Values); - newLoader.Movements=new MFA.Loaders.mfachunks.Movements(null); - for (int j = 0; j < itemLoader.Movements.Items.Count; j++) - { - var mov = itemLoader.Movements.Items[j]; - var newMov = new Movement(null); - newMov.Name = $"Movement {j+1}"; - newMov.Extension = ""; - newMov.Identifier = mov.Type; - newMov.Player = mov.Player; - newMov.MovingAtStart = mov.MovingAtStart; - newMov.DirectionAtStart = mov.DirectionAtStart; - newLoader.Movements.Items.Add(newMov); - } - newLoader.Behaviours=new Behaviours(null); - //TODO: Transitions - if (itemLoader.Animations != null) - { - var animHeader = itemLoader.Animations; - for (int j = 0; j < animHeader.AnimationDict.Count; j++) + } + catch (Exception e) { + Console.WriteLine(e); + //throw; + } - var newAnimation = new Animation(null); - var newDirections = new List(); - EXE.Loaders.Objects.Animation animation = null; - try - { - animation = animHeader.AnimationDict[0]; - } - catch (Exception e) + if (animation != null) + { + for (int n = 0; n < 1; n++) { - Console.WriteLine(e); - //throw; + 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); } - 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; - - } + newAnimation.Directions = newDirections; - newLoader.Items.Add(newAnimation); } - } - newItem.Loader = newLoader; - try - { - FrameItems.Add(newItem.Handle,newItem); - } - catch (Exception e) - { - Console.WriteLine(e); - throw; + newLoader.Items.Add(newAnimation); } - } + + newItem.Loader = newLoader; + FrameItems.Add(newItem.Handle,newItem); + } mfa.Frames.Clear(); foreach (Frame frame in game.Frames) { + //if(frame.Name!="what day")continue; var newFrame = new MFA.Loaders.Frame(null); //FrameInfo newFrame.Handle = game.Frames.IndexOf(frame); @@ -198,6 +188,7 @@ namespace DotNetCTFDumper.MMFParser.Translation 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"]; @@ -205,12 +196,14 @@ namespace DotNetCTFDumper.MMFParser.Translation mfaFlags["ForceLoadOnCall"] = originalFlags["ForceLoadOnCall"]; mfaFlags["NoDisplaySurface"] = false; mfaFlags["TimerBasedMovements"] = originalFlags["TimedMovements"]; - newFrame.MaxObjects = frame.Events?.MaxObjects ?? 10000; + newFrame.Flags = mfaFlags; + newFrame.Flags.flag = 260; + newFrame.MaxObjects = frame.Events?.MaxObjects ?? 1000; newFrame.Password = ""; newFrame.LastViewedX = 320; newFrame.LastViewedY = 240; newFrame.Palette = frame.Palette.Items; - newFrame.StampHandle = 12; + newFrame.StampHandle = 13; newFrame.ActiveLayer = 0; //LayerInfo newFrame.Layers=new List(); @@ -233,42 +226,41 @@ namespace DotNetCTFDumper.MMFParser.Translation 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; + + if (FrameItems.ContainsKey(instance.ObjectInfo)) { - FrameItem frameItem = null; - try - { - frameItem = FrameItems[instance.ObjectInfo]; - } - catch - { - throw new NotImplementedException("ObjectInfo not found, this may cause errors"); - } + frameItem = FrameItems[instance.ObjectInfo]; + - if (frameItem != null) - { newFrameItems.Add(frameItem); var newInstance = new FrameInstance((ByteReader) null); newInstance.X = instance.X; newInstance.Y = instance.Y; - newInstance.Handle = instance.Handle; - newInstance.Flags = 0; + newInstance.Handle = i; + newInstance.Flags = 1; newInstance.ParentType = (uint) instance.ParentType; - newInstance.ItemHandle = instance.ObjectInfo; - newInstance.ParentHandle = (uint) instance.ParentHandle; + newInstance.ItemHandle = (uint) (instance.ObjectInfo + 3); + newInstance.ParentHandle = (uint) instance.ParentHandle; //0xffffffff; newInstance.Layer = (uint) instance.Layer; newInstances.Add(newInstance); - } - break; + } } } + + + + + + + newFrame.Items = newFrameItems; newFrame.Instances = newInstances; newFrame.Folders=new List(); @@ -284,25 +276,27 @@ namespace DotNetCTFDumper.MMFParser.Translation newFrame.Events = MFA.MFA.emptyEvents; + newFrame.Events.Version = 1028; foreach (var item in newFrame.Items) { var newObject = new EventObject((ByteReader) null); newObject.Handle = (uint) item.Handle; - newObject.Name = item.Name; + newObject.Name = item.Name ??""; newObject.TypeName = ""; newObject.ItemType = (ushort) item.ObjectType; - newObject.ObjectType = 1; + newObject.ObjectType = 2; newObject.Flags = 0; newObject.ItemHandle = (uint) item.Handle; newObject.InstanceHandle = 0xFFFFFFFF; - //newFrame.Events.Objects.Add(newObject); + // newFrame.Events.Objects.Add(newObject); } newFrame.Chunks = new ChunkList(null); mfa.Frames.Add(newFrame); + } - + @@ -360,7 +354,7 @@ namespace DotNetCTFDumper.MMFParser.Translation public static void Message(string msg) { - OnMessage.Invoke(msg); + OnMessage?.Invoke(msg); } diff --git a/DotNetCTFDumper/Program.cs b/DotNetCTFDumper/Program.cs index 18fa0ba..4816976 100644 --- a/DotNetCTFDumper/Program.cs +++ b/DotNetCTFDumper/Program.cs @@ -86,6 +86,7 @@ namespace DotNetCTFDumper var currentExe = new Exe(); Exe.Instance = currentExe; currentExe.ParseExe(exeReader); + MFAGenerator.BuildMFA(); Logger.Log("Finished!", true, ConsoleColor.Yellow); return; if (File.Exists(path)) @@ -96,13 +97,7 @@ namespace DotNetCTFDumper } - else if (path.EndsWith(".mfa")) - { - Settings.DoMFA = true; - Logger.Log("Reading mfa"); - Logger.Log("DEBUG ONLY"); - MFAGenerator.ReadTestMFA(); - } + else { Logger.Log($"File '{path}' is not a valid file", true, ConsoleColor.Red); diff --git a/ExamplePlugin/Class1.cs b/ExamplePlugin/Class1.cs new file mode 100644 index 0000000..528a291 --- /dev/null +++ b/ExamplePlugin/Class1.cs @@ -0,0 +1,17 @@ +using System; +using DotNetCTFDumper.MMFParser.EXE; +using DotNetCTFDumper.PluginAPI; + +namespace ExamplePlugin +{ + public class ExamplePlugin:IPlugin + { + public object Activate(object input) + { + var data = (GameData) input; + PluginAPI.Message(data.TargetFilename); + return null; + } + + } +} \ No newline at end of file diff --git a/ExamplePlugin/ExamplePlugin.csproj b/ExamplePlugin/ExamplePlugin.csproj new file mode 100644 index 0000000..09c77c0 --- /dev/null +++ b/ExamplePlugin/ExamplePlugin.csproj @@ -0,0 +1,56 @@ + + + + + Debug + AnyCPU + {9A4499BF-534F-4397-AF0D-C663688A20E5} + Library + Properties + ExamplePlugin + ExamplePlugin + v4.8 + 512 + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\DotNetCTFDumper\bin\x64\Debug\DotNetCTFDumper.exe + + + + + + + + + + + + + + diff --git a/ExamplePlugin/Properties/AssemblyInfo.cs b/ExamplePlugin/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..abb31d5 --- /dev/null +++ b/ExamplePlugin/Properties/AssemblyInfo.cs @@ -0,0 +1,37 @@ +using System.Reflection; +using System.Runtime.InteropServices; +using DotNetCTFDumper.PluginAPI; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ExamplePlugin")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ExamplePlugin")] +[assembly: AssemblyCopyright("Copyright © 2020")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +[assembly: CTFDumperPlugin("PathLogger",PluginIOType.GameData)] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("9A4499BF-534F-4397-AF0D-C663688A20E5")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] \ No newline at end of file diff --git a/ILMerge.exe b/ILMerge.exe deleted file mode 100644 index 02944aa..0000000 Binary files a/ILMerge.exe and /dev/null differ diff --git a/Tests/cncscore.ini b/Tests/cncscore.ini deleted file mode 100644 index e69de29..0000000 diff --git a/Tests/mmftest.001 b/Tests/mmftest.001 deleted file mode 100644 index 0e782dd..0000000 Binary files a/Tests/mmftest.001 and /dev/null differ diff --git a/Tests/mmftest.mfa b/Tests/mmftest.mfa deleted file mode 100644 index 3fb1409..0000000 Binary files a/Tests/mmftest.mfa and /dev/null differ diff --git a/Tests/test.001 b/Tests/test.001 deleted file mode 100644 index 0606775..0000000 Binary files a/Tests/test.001 and /dev/null differ diff --git a/Tests/test.exe b/Tests/test.exe deleted file mode 100644 index 6fce07a..0000000 Binary files a/Tests/test.exe and /dev/null differ diff --git a/Tests/test.mfa b/Tests/test.mfa deleted file mode 100644 index 47730a0..0000000 Binary files a/Tests/test.mfa and /dev/null differ diff --git a/Tests/test.mfa.bak b/Tests/test.mfa.bak deleted file mode 100644 index 7d97915..0000000 Binary files a/Tests/test.mfa.bak and /dev/null differ diff --git a/merge_all.bat b/merge_all.bat deleted file mode 100644 index 2bdb7db..0000000 --- a/merge_all.bat +++ /dev/null @@ -1,69 +0,0 @@ -@ECHO OFF - -rem # set .NET version and output folder name -set net="v4, C:\Windows\Microsoft.NET\Framework\v4.0.30319" -set output=Output - -rem # process arguments -set ILMergeSolution=%1ILMerge\ILMerge.exe - -rem # determine programm files of x86 for 32 and 64 Platform -IF EXIST "%PROGRAMFILES(x86)%" set prorgammFiles=%PROGRAMFILES(x86)% -IF NOT EXIST "%PROGRAMFILES(x86)%" set prorgammFiles=%PROGRAMFILES% - -rem # if ILMerge.exe not in the $(SolutionDir)ILMerge\ -rem # then try to use installed in prorgammFiles -IF EXIST %ILMergeSolution% set ILMerge="%ILMergeSolution%" -IF NOT EXIST %ILMergeSolution% set ILMerge=%prorgammFiles%\Microsoft\ILMerge\ILMerge.exe - -set target_path=%2 -set target_file=%~nx2 -set target_dir=%~dp2 -set ConfigurationName=%3 - -rem # set output path and result file path -set outdir=%target_dir%%output% -set result=%outdir%\%target_file% - -rem # print info -@echo Start %ConfigurationName% Merging %target_file%. -@echo Target: %target_path% -@echo target_dir: %target_dir% -@echo Config: %ConfigurationName% - -rem # recreate outdir -IF EXIST "%outdir%" rmdir /S /Q "%outdir%" -md "%outdir%" - -rem # run merge cmd -@echo Merging: '"%ILMerge%" /wildcards /targetplatform:%net% /out:"%result%" %target_path% "%target_dir%*.dll"' -"%ILMerge%" /wildcards /targetplatform:%net% /out:"%result%" %target_path% "%target_dir%*.dll" - -rem # if succeded -IF %ErrorLevel% EQU 0 ( - - rem # clear real output folder and put there result assembly - IF %ConfigurationName%==Release ( - - del %target_dir%*.* - del %target_dir%*.dll - del %target_dir%*.pdb - del %target_dir%*.xml - del %target_dir%*.* - - copy %result% %target_dir% - rmdir /S /Q %outdir% - set result=%target_path% - @echo Result: %target_file% "-> %target_path%" - ) ELSE ( - @echo Result: %target_file% "-> %result%" ) - - set status=succeded - set errlvl=0 -) ELSE ( - set status=failed - set errlvl=1 - ) - -@echo Merge %status% -exit %errlvl% \ No newline at end of file