From ae79efd09d87b8e4ed11149acc161fa8bc312dbd Mon Sep 17 00:00:00 2001 From: 1987kostya Date: Mon, 14 Dec 2020 11:05:58 +0600 Subject: [PATCH] Fixes in translation method, Updates in MFA reading/writing --- NetMFAPatcher/DotNetCTFDumper.csproj | 15 +- NetMFAPatcher/GUI/MFABuilderForm.cs | 37 +++++ NetMFAPatcher/GUI/MainForm.cs | 5 +- NetMFAPatcher/MMFParser/EXE/ChunkList.cs | 24 +++ NetMFAPatcher/MMFParser/EXE/Loaders/Frame.cs | 9 +- .../MMFParser/EXE/Loaders/Transition.cs | 56 +++++++ .../MMFParser/MFA/Decompiling/PAME2MFA.cs | 106 -------------- NetMFAPatcher/MMFParser/MFA/Loaders/Events.cs | 2 +- NetMFAPatcher/MMFParser/MFA/Loaders/Frame.cs | 32 +++- NetMFAPatcher/MMFParser/MFA/Loaders/Layer.cs | 19 ++- .../MMFParser/MFA/Loaders/Transition.cs | 62 ++++++++ .../MMFParser/MFA/Loaders/mfachunks/Active.cs | 6 + .../MFA/Loaders/mfachunks/AnimationObject.cs | 39 +++-- .../MFA/Loaders/mfachunks/Behaviours.cs | 11 +- .../MFA/Loaders/mfachunks/Movements.cs | 57 ++++++-- .../MFA/Loaders/mfachunks/ObjectLoader.cs | 31 +++- .../MFAGenerator.cs | 8 +- .../MMFParser/Translation/PAME2MFA.cs | 138 ++++++++++++++++++ NetMFAPatcher/Program.cs | 12 +- NetMFAPatcher/Settings.cs | 6 +- NetMFAPatcher/Utils/BitDict.cs | 12 +- 21 files changed, 523 insertions(+), 164 deletions(-) create mode 100644 NetMFAPatcher/GUI/MFABuilderForm.cs create mode 100644 NetMFAPatcher/MMFParser/EXE/Loaders/Transition.cs delete mode 100644 NetMFAPatcher/MMFParser/MFA/Decompiling/PAME2MFA.cs create mode 100644 NetMFAPatcher/MMFParser/MFA/Loaders/Transition.cs rename NetMFAPatcher/MMFParser/{MFA/Decompiling => Translation}/MFAGenerator.cs (85%) create mode 100644 NetMFAPatcher/MMFParser/Translation/PAME2MFA.cs diff --git a/NetMFAPatcher/DotNetCTFDumper.csproj b/NetMFAPatcher/DotNetCTFDumper.csproj index 79be9d8..e3c5677 100644 --- a/NetMFAPatcher/DotNetCTFDumper.csproj +++ b/NetMFAPatcher/DotNetCTFDumper.csproj @@ -149,6 +149,12 @@ MainForm.cs + + Form + + + MFABuilderForm.cs + Form @@ -156,6 +162,8 @@ PackDataForm.cs + + @@ -193,14 +201,14 @@ + - - + @@ -263,6 +271,9 @@ MainForm.cs + + MFABuilderForm.cs + PackDataForm.cs diff --git a/NetMFAPatcher/GUI/MFABuilderForm.cs b/NetMFAPatcher/GUI/MFABuilderForm.cs new file mode 100644 index 0000000..794fcc7 --- /dev/null +++ b/NetMFAPatcher/GUI/MFABuilderForm.cs @@ -0,0 +1,37 @@ +using System; +using System.Drawing; +using System.Linq; +using System.Windows.Forms; +using DotNetCTFDumper.MMFParser.Translation; + +namespace DotNetCTFDumper.GUI +{ + public partial class MFABuilderForm : Form + { + public MFABuilderForm(Color color) + { + InitializeComponent(); + foreach (Control control in Controls) + { + control.BackColor=Color.Black; + control.ForeColor = color; + if (control is Button) + { + control.BackColor=Color.FromArgb(30,30,30); + } + } + Pame2Mfa.TranslatingFrame += OnFrameTranslation; + + } + + public void OnFrameTranslation(object name) + { + logBox.AppendText($"Translating Frame: {name}\r\n"); + } + + private void DumpButton_Click(object sender, EventArgs e) + { + MFAGenerator.BuildMFA(); + } + } +} \ No newline at end of file diff --git a/NetMFAPatcher/GUI/MainForm.cs b/NetMFAPatcher/GUI/MainForm.cs index a5ca3d4..b3dab37 100644 --- a/NetMFAPatcher/GUI/MainForm.cs +++ b/NetMFAPatcher/GUI/MainForm.cs @@ -4,7 +4,6 @@ using System.Diagnostics; using System.Drawing; using System.Threading; using System.Windows.Forms; -using DotNetCTFDumper.MMFParser.Decompiling; using DotNetCTFDumper.MMFParser.EXE; using DotNetCTFDumper.MMFParser.EXE.Loaders; using DotNetCTFDumper.MMFParser.EXE.Loaders.Banks; @@ -291,7 +290,9 @@ namespace DotNetCTFDumper.GUI private void MFABtn_Click(object sender, EventArgs e) { - MFAGenerator.BuildMFA(); + var mfaForm = new MFABuilderForm(ColorTheme); + mfaForm.Show(); + } private void soundsButton_Click(object sender, EventArgs e) diff --git a/NetMFAPatcher/MMFParser/EXE/ChunkList.cs b/NetMFAPatcher/MMFParser/EXE/ChunkList.cs index 283210f..658f7fc 100644 --- a/NetMFAPatcher/MMFParser/EXE/ChunkList.cs +++ b/NetMFAPatcher/MMFParser/EXE/ChunkList.cs @@ -232,6 +232,12 @@ namespace DotNetCTFDumper.MMFParser.EXE case 13112: loader = new ObjectInstances(chunk); break; + case 13115: + loader = new Transition(chunk); + break; + case 13116: + loader = new Transition(chunk); + break; case 13121: loader = new Layers(chunk); break; @@ -295,6 +301,24 @@ namespace DotNetCTFDumper.MMFParser.EXE //Logger.Log($"ChunkLoader {typeof(T).Name} not found", true, ConsoleColor.Red); return null; } + public T PopChunk() where T : ChunkLoader + { + for(int i=0;i(); + FadeOut = Chunks.PopChunk(); + diff --git a/NetMFAPatcher/MMFParser/EXE/Loaders/Transition.cs b/NetMFAPatcher/MMFParser/EXE/Loaders/Transition.cs new file mode 100644 index 0000000..59d41bb --- /dev/null +++ b/NetMFAPatcher/MMFParser/EXE/Loaders/Transition.cs @@ -0,0 +1,56 @@ +using System; +using System.Drawing; +using DotNetCTFDumper.Utils; + +namespace DotNetCTFDumper.MMFParser.EXE.Loaders +{ + public class Transition:ChunkLoader + { + public string Module; + public string Name; + public int Duration; + public int Flags; + public Color Color; + public string ModuleFile; + public byte[] ParameterData; + + public Transition(ByteReader reader) : base(reader) + { + } + + public Transition(ChunkList.Chunk chunk) : base(chunk) + { + } + + public override void Read() + { + var currentPos = Reader.Tell(); + Module = Reader.ReadAscii(4); + Console.WriteLine("TransitionModule: "+Module); + Name = Reader.ReadAscii(4); + Console.WriteLine("TransitionModule: "+Name); + Duration = Reader.ReadInt32(); + Flags = Reader.ReadInt32(); + Color = Reader.ReadColor(); + var nameOffset = Reader.ReadInt32(); + var parameterOffset = Reader.ReadInt32(); + var parameterSize = Reader.ReadInt32(); + Reader.Seek(currentPos+nameOffset); + ModuleFile = Reader.ReadAscii(); + Reader.Seek(currentPos+parameterOffset); + ParameterData = Reader.ReadBytes(parameterSize); + + + } + + public override void Print(bool ext) + { + throw new System.NotImplementedException(); + } + + public override string[] GetReadableData() + { + throw new System.NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/NetMFAPatcher/MMFParser/MFA/Decompiling/PAME2MFA.cs b/NetMFAPatcher/MMFParser/MFA/Decompiling/PAME2MFA.cs deleted file mode 100644 index b412d87..0000000 --- a/NetMFAPatcher/MMFParser/MFA/Decompiling/PAME2MFA.cs +++ /dev/null @@ -1,106 +0,0 @@ - -using System; -using System.Collections.Generic; -using System.Linq; -using DotNetCTFDumper.MMFParser.EXE; -using DotNetCTFDumper.MMFParser.MFA.Loaders; -using DotNetCTFDumper.Utils; -using Frame = DotNetCTFDumper.MMFParser.EXE.Loaders.Frame; -using Layer = DotNetCTFDumper.MMFParser.MFA.Loaders.Layer; - -namespace DotNetCTFDumper.MMFParser.Decompiling -{ - public static class Pame2Mfa - { - public static void Translate(ref MFA.MFA mfa, GameData game) - { - - //mfa.MfaBuild = 4; - //mfa.Product = (int) game.ProductVersion; - //mfa.BuildVersion = 283; - mfa.Name = game.Name; - mfa.LangId = 0; - mfa.Description = $"Decompiled with {Settings.DumperVersion}"; - mfa.Path = game.EditorFilename; - - //mfa.Stamp = wtf; - /*if (game.Fonts != null) mfa.Fonts = game.Fonts; - - 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; - } - */ - mfa.Author = game.Author!=null? game.Author:"Kostya"; - mfa.Copyright = game.Copyright; - mfa.Company = "CTFAN Team"; - mfa.Version = ""; - //TODO:Binary Files - var displaySettings = mfa.DisplayFlags; - var graphicSettings = mfa.GraphicFlags; - var flags = game.Header.Flags; - var newFlags = game.Header.NewFlags; - //TODO:Flags, no setter - mfa.WindowX = game.Header.WindowWidth; - mfa.WindowY = game.Header.WindowHeight; - mfa.BorderColor = game.Header.BorderColor; - mfa.HelpFile = ""; - mfa.VitalizePreview = new byte[]{0x0}; - mfa.InitialScore = game.Header.InitialScore; - mfa.InitialLifes = game.Header.InitialLives; - mfa.FrameRate = game.Header.FrameRate; - mfa.BuildType = 0; - mfa.BuildPath = game.TargetFilename; - mfa.CommandLine = ""; - mfa.Aboutbox = game.AboutText?.Length > 0 - ? game?.AboutText - : "This game was decompiled with " + Settings.DumperVersion; - mfa.Frames.Clear(); - foreach (Frame gameFrame in game.Frames) - { - MFA.Loaders.Frame mfaFrame = new MFA.Loaders.Frame(null); - mfaFrame.Handle = game.Frames.IndexOf(gameFrame); - mfaFrame.Name = gameFrame.Name; - mfaFrame.SizeX = gameFrame.Width; - mfaFrame.SizeY = gameFrame.Height; - mfaFrame.Background = gameFrame.Background; - //TODO: Transitions - //TODO: Flags - mfaFrame.MaxObjects = gameFrame.Events?.MaxObjects ?? 1337; - 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(); - mfaFrame.Layers.Add(new Layer(null){Name = "New Layer"}); - - /*foreach (EXE.Loaders.Layer gameLayer in gameFrame.Layers.Items) - { - Layer mfaLayer = new Layer(null); - mfaLayer.Name = gameLayer.Name; - mfaLayer.Flags = (int) gameLayer.Flags; - //TODO: Flags - mfaLayer.XCoefficient = gameLayer.XCoeff; - mfaLayer.YCoefficient = gameLayer.YCoeff; - mfaFrame.Layers.Add(mfaLayer); - }*/ - mfaFrame.Events = MFA.MFA.emptyEvents; - mfaFrame.Chunks = MFA.MFA.emptyFrameChunks; - - mfa.Frames.Add(mfaFrame); - - } - - - } - } -} \ No newline at end of file diff --git a/NetMFAPatcher/MMFParser/MFA/Loaders/Events.cs b/NetMFAPatcher/MMFParser/MFA/Loaders/Events.cs index bb37b44..84a6ed3 100644 --- a/NetMFAPatcher/MMFParser/MFA/Loaders/Events.cs +++ b/NetMFAPatcher/MMFParser/MFA/Loaders/Events.cs @@ -188,7 +188,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders Writer.WriteUInt16(Version); Writer.WriteInt16((short) FrameType); - //Writer.WriteBytes(new byte[] {0x04, 0x04, 0x00, 0x00}); + // Writer.WriteBytes(new byte[] {0x04, 0x04, 0x00, 0x00}); // if (Items != null) // { // Console.WriteLine("Writing EventData"); diff --git a/NetMFAPatcher/MMFParser/MFA/Loaders/Frame.cs b/NetMFAPatcher/MMFParser/MFA/Loaders/Frame.cs index 57fa654..323aba8 100644 --- a/NetMFAPatcher/MMFParser/MFA/Loaders/Frame.cs +++ b/NetMFAPatcher/MMFParser/MFA/Loaders/Frame.cs @@ -27,6 +27,8 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders public List Layers; public Events Events; public ChunkList Chunks; + public Transition FadeIn; + public Transition FadeOut; public Frame(ByteReader reader) : base(reader) { @@ -63,8 +65,20 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders } //TODO: Do transitions - Writer.WriteInt8(0); - Writer.WriteInt8(0); + if (FadeIn != null) + { + Writer.WriteInt8(1); + FadeIn.Write(Writer); + } + else Writer.Skip(1); + if (FadeOut != null) + { + Writer.WriteInt8(1); + FadeOut.Write(Writer); + } + else Writer.Skip(1); + //Writer.Skip(2); + Writer.WriteInt32(Items.Count); foreach (var item in Items) @@ -132,10 +146,18 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders Layers.Add(layer); } - //fadein - //fadeout - Reader.Skip(2); + if (Reader.ReadByte() == 1) + { + 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++) diff --git a/NetMFAPatcher/MMFParser/MFA/Loaders/Layer.cs b/NetMFAPatcher/MMFParser/MFA/Loaders/Layer.cs index 73f6acb..d32a58f 100644 --- a/NetMFAPatcher/MMFParser/MFA/Loaders/Layer.cs +++ b/NetMFAPatcher/MMFParser/MFA/Loaders/Layer.cs @@ -9,13 +9,25 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders public string Name="ERROR"; public float XCoefficient; public float YCoefficient; - public int Flags; + + public BitDict Flags = new BitDict(new string[] + { + "Visible", + "Locked", + "Obsolete", + "HideAtStart", + "NoBackground", + "WrapHorizontally", + "WrapVertically", + "PreviousEffect" + } + ); public override void Write(ByteWriter Writer) { Writer.AutoWriteUnicode(Name); - Writer.WriteInt32(Flags); + Writer.WriteInt32((int) Flags.flag); Writer.WriteSingle(XCoefficient); Writer.WriteSingle(YCoefficient); } @@ -28,9 +40,10 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders public override void Read() { Name = Helper.AutoReadUnicode(Reader); - Flags = Reader.ReadInt32(); + Flags.flag = (uint) Reader.ReadInt32(); XCoefficient = Reader.ReadSingle(); YCoefficient = Reader.ReadSingle(); + Console.WriteLine("LayerAss: "+Flags["Visible"]); diff --git a/NetMFAPatcher/MMFParser/MFA/Loaders/Transition.cs b/NetMFAPatcher/MMFParser/MFA/Loaders/Transition.cs new file mode 100644 index 0000000..086aa42 --- /dev/null +++ b/NetMFAPatcher/MMFParser/MFA/Loaders/Transition.cs @@ -0,0 +1,62 @@ +using System; +using System.Drawing; +using DotNetCTFDumper.MMFParser.EXE; +using DotNetCTFDumper.Utils; + +namespace DotNetCTFDumper.MMFParser.MFA.Loaders +{ + public class Transition:DataLoader + { + public string Module; + public string Name; + public string Id; + public string TransitionId; + public int Duration; + public int Flags; + public Color Color; + public byte[] ParameterData; + + public Transition(ByteReader reader) : base(reader) + { + } + + public Transition(EXE.ChunkList.Chunk chunk) : base(chunk) + { + } + + public override void Read() + { + Module = Reader.AutoReadUnicode(); + Console.WriteLine(Module); + Name = Reader.AutoReadUnicode(); + Console.WriteLine(Name); + Id = Reader.ReadAscii(4); + Console.WriteLine(Id); + TransitionId = Reader.ReadAscii(4); + Console.WriteLine(TransitionId); + Duration = Reader.ReadInt32(); + Flags = Reader.ReadInt32(); + Color = Reader.ReadColor(); + ParameterData = Reader.ReadBytes(Reader.ReadInt32()); + + } + + public override void Write(ByteWriter Writer) + { + Writer.AutoWriteUnicode(Module); + Writer.AutoWriteUnicode(Name); + Writer.WriteAscii(Id); + Writer.WriteAscii(TransitionId); + Writer.WriteInt32(Duration); + Writer.WriteInt32(Flags); + Writer.WriteColor(Color); + Writer.WriteInt32(ParameterData.Length); + Writer.WriteBytes(ParameterData); + } + + public override void Print() + { + throw new System.NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/Active.cs b/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/Active.cs index b71ea53..abd3157 100644 --- a/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/Active.cs +++ b/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/Active.cs @@ -14,6 +14,12 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks { base.Read(); } + + public override void Write(ByteWriter Writer) + { + base.Write(Writer); + } + public Active(ByteReader reader) : base(reader) { } } } diff --git a/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/AnimationObject.cs b/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/AnimationObject.cs index 4bcca20..a6546e2 100644 --- a/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/AnimationObject.cs +++ b/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/AnimationObject.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using DotNetCTFDumper.MMFParser.EXE; using DotNetCTFDumper.Utils; @@ -13,7 +14,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks base.Read(); if(Reader.ReadByte()!=0) { - var animationCount = Reader.ReadInt32(); + var animationCount = Reader.ReadUInt32(); for (int i = 0; i < animationCount; i++) { var item = new Animation(Reader); @@ -42,7 +43,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks public override void Read() { - Name = Reader.ReadAscii(Reader.ReadInt32()); + Name = Reader.AutoReadUnicode(); var directionCount = Reader.ReadInt32(); var directions = new List(); for (int i = 0; i < directionCount; i++) @@ -60,9 +61,25 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks class AnimationDirection : DataLoader { public string Name = "Animation-UNKNOWN"; + public int Index; + public int MinSpeed; + public int MaxSpeed; + public int Repeat; + public int BackTo; + public List Frames= new List(); + public override void Write(ByteWriter Writer) { - throw new NotImplementedException(); + Writer.WriteInt32(Index); + Writer.WriteInt32(MinSpeed); + Writer.WriteInt32(MaxSpeed); + Writer.WriteInt32(Repeat); + Writer.WriteInt32(BackTo); + foreach (int frame in Frames) + { + Writer.WriteInt32(frame); + } + } public override void Print() @@ -72,12 +89,16 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks public override void Read() { - var index = Reader.ReadInt32(); - var minSpeed = Reader.ReadInt32(); - var maxSpeed= Reader.ReadInt32(); - var repeat= Reader.ReadInt32(); - var backTo= Reader.ReadInt32(); - var frames = new List(); + Index = Reader.ReadInt32(); + MinSpeed = Reader.ReadInt32(); + MaxSpeed = Reader.ReadInt32(); + Repeat = Reader.ReadInt32(); + BackTo = Reader.ReadInt32(); + var animCount = Reader.ReadInt32(); + for (int i = 0; i < animCount; i++) + { + Frames.Add(Reader.ReadInt32()); + } } public AnimationDirection(ByteReader reader) : base(reader) { } diff --git a/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/Behaviours.cs b/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/Behaviours.cs index b3f2950..71a7206 100644 --- a/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/Behaviours.cs +++ b/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/Behaviours.cs @@ -10,7 +10,10 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks List _items = new List(); public override void Write(ByteWriter Writer) { - throw new NotImplementedException(); + foreach (Behaviour behaviour in _items) + { + behaviour.Write(Writer); + } } public override void Print() @@ -36,7 +39,8 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks public ByteReader Data; public override void Write(ByteWriter Writer) { - throw new NotImplementedException(); + Writer.AutoWriteUnicode(Name); + Writer.WriteBytes(Data.ReadBytes((int) Data.Size())); } public override void Print() @@ -46,7 +50,8 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks public override void Read() { - Name = Reader.ReadAscii(Reader.ReadInt32()); + Name = Reader.AutoReadUnicode(); + Data = new ByteReader(Reader.ReadBytes(Reader.ReadInt32())); } diff --git a/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/Movements.cs b/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/Movements.cs index d5236b2..bd10dd6 100644 --- a/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/Movements.cs +++ b/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/Movements.cs @@ -1,5 +1,7 @@ using System; using System.Collections.Generic; +using System.IO; +using System.Net.NetworkInformation; using DotNetCTFDumper.MMFParser.EXE; using DotNetCTFDumper.Utils; @@ -10,7 +12,11 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks public List Items = new List(); public override void Write(ByteWriter Writer) { - throw new NotImplementedException(); + Writer.WriteInt32(Items.Count); + foreach (Movement movement in Items) + { + movement.Write(Writer); + } } public override void Print() @@ -20,7 +26,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks public override void Read() { - var count = Reader.ReadInt32(); + var count = Reader.ReadUInt32(); for (int i = 0; i < count; i++) { var item = new Movement(Reader); @@ -37,10 +43,34 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks public class Movement : DataLoader { public string Name="ERROR"; + public string Extension; + public int Identifier; + public short Player; + public short Type; + public byte MovingAtStart; + public int DirectionAtStart; + public int DataSize; public override void Write(ByteWriter Writer) { - throw new NotImplementedException(); + Writer.WriteUnicode(Name); + Writer.WriteUnicode(Extension); + Writer.WriteUInt32((uint) Identifier); + Writer.WriteInt32(DataSize); + var newWriter = new ByteWriter(new MemoryStream()); + if (Extension == null) + { + + newWriter.WriteInt16(Player); + newWriter.WriteInt16(Type); + newWriter.WriteInt8(MovingAtStart); + newWriter.Skip(3); + newWriter.WriteInt32(DirectionAtStart); + } + //Loader.write(newWriter) + Writer.WriteWriter(newWriter); + + } public override void Print() @@ -51,22 +81,25 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks public override void Read() { Name = Helper.AutoReadUnicode(Reader); - var extension = Helper.AutoReadUnicode(Reader); - var identifier = Reader.ReadInt32(); - var dataSize = Reader.ReadInt32(); - if(extension.Length>0) + Extension = Helper.AutoReadUnicode(Reader); + Identifier = (int) Reader.ReadUInt32(); + DataSize = (int) Reader.ReadUInt32(); + if(Extension.Length>0) { - var newReader = new ByteReader(Reader.ReadBytes(dataSize)); + var newReader = new ByteReader(Reader.ReadBytes(DataSize)); } else { - var player = Reader.ReadInt16(); - var type = Reader.ReadInt16(); - var movingAtStart = Reader.ReadByte(); + Player = Reader.ReadInt16(); + Type = Reader.ReadInt16(); + MovingAtStart = Reader.ReadByte(); Reader.Skip(3); - var directionAtStart = Reader.ReadInt32(); + DirectionAtStart = Reader.ReadInt32(); + var newReader = new ByteReader(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 013fa8c..fb3eb26 100644 --- a/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/ObjectLoader.cs +++ b/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/ObjectLoader.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Drawing; using DotNetCTFDumper.MMFParser.EXE; using DotNetCTFDumper.Utils; @@ -18,6 +19,28 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks public override void Write(ByteWriter Writer) { + Writer.WriteInt32(ObjectFlags); + Writer.WriteInt32(NewObjectFlags); + Writer.WriteColor(BackgroundColor); + for (int i = 0; i < 9; i++) + { + try + { + var value = _qualifiers[i]; + Writer.WriteInt16(value); + } + catch + { + Writer.WriteInt16(-1); + } + } + Values.Write(Writer); + Strings.Write(Writer); + Movements.Write(Writer); + Behaviours.Write(Writer); + Writer.WriteInt8(0);//FadeIn + Writer.WriteInt8(0);//FadeOut + } @@ -47,8 +70,8 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks ObjectFlags = Reader.ReadInt32(); NewObjectFlags = Reader.ReadInt32(); BackgroundColor = Reader.ReadColor(); - var end = Reader.Tell() + 2 * 9; - for (int i = 0; i < 9; i++) + var end = Reader.Tell() + 2 * (8+1); + for (int i = 0; i < 8+1; i++) { var value = Reader.ReadInt16(); if(value==-1) @@ -67,7 +90,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks Movements.Read(); Behaviours = new Behaviours(Reader); Behaviours.Read(); - Reader.Skip(56); + //Reader.Skip(50);//TODO: Help Print(); diff --git a/NetMFAPatcher/MMFParser/MFA/Decompiling/MFAGenerator.cs b/NetMFAPatcher/MMFParser/Translation/MFAGenerator.cs similarity index 85% rename from NetMFAPatcher/MMFParser/MFA/Decompiling/MFAGenerator.cs rename to NetMFAPatcher/MMFParser/Translation/MFAGenerator.cs index e6a3a16..79ac3f4 100644 --- a/NetMFAPatcher/MMFParser/MFA/Decompiling/MFAGenerator.cs +++ b/NetMFAPatcher/MMFParser/Translation/MFAGenerator.cs @@ -3,14 +3,14 @@ using System.IO; using DotNetCTFDumper.MMFParser.EXE; using DotNetCTFDumper.Utils; -namespace DotNetCTFDumper.MMFParser.Decompiling +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 void BuildMFA() + public static MFA.MFA BuildMFA() { Settings.DoMFA = true; var mfaReader = new ByteReader(TemplatePath, FileMode.Open); @@ -26,12 +26,14 @@ namespace DotNetCTFDumper.MMFParser.Decompiling FileMode.Create); //New writer for new MFA template.Write(mfaWriter); //Writing new MFA mfaWriter.Dispose(); + return template; + Logger.Log("MFA Done",true,ConsoleColor.Yellow); } public static void ReadTestMFA() { - var mfaReader = new ByteReader(TemplatePath, FileMode.Open); + var mfaReader = new ByteReader(@"C:\Users\ivani\Desktop\CTFResearch\ObjTEST.mfa", FileMode.Open); var template = new MFA.MFA(mfaReader); Settings.DoMFA = true; template.Read(); diff --git a/NetMFAPatcher/MMFParser/Translation/PAME2MFA.cs b/NetMFAPatcher/MMFParser/Translation/PAME2MFA.cs new file mode 100644 index 0000000..5ddd49c --- /dev/null +++ b/NetMFAPatcher/MMFParser/Translation/PAME2MFA.cs @@ -0,0 +1,138 @@ +using System.Collections.Generic; +using DotNetCTFDumper.MMFParser.EXE; +using DotNetCTFDumper.Utils; +using Frame = DotNetCTFDumper.MMFParser.EXE.Loaders.Frame; +using Layer = DotNetCTFDumper.MMFParser.MFA.Loaders.Layer; + +namespace DotNetCTFDumper.MMFParser.Translation +{ + public static class Pame2Mfa + { + public static event Program.DumperEvent TranslatingFrame; + + public static void Translate(ref MFA.MFA mfa, GameData game) + { + + //mfa.MfaBuild = 4; + //mfa.Product = (int) game.ProductVersion; + //mfa.BuildVersion = 283; + mfa.Name = game.Name; + mfa.LangId = 0; + mfa.Description = $"Decompiled with {Settings.DumperVersion}"; + mfa.Path = game.EditorFilename; + + //mfa.Stamp = wtf; + /*if (game.Fonts != null) mfa.Fonts = game.Fonts; + + 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; + } + */ + mfa.Author = game.Author!=null? game.Author:"Kostya"; + mfa.Copyright = game.Copyright; + mfa.Company = "CTFAN Team"; + mfa.Version = ""; + //TODO:Binary Files + var displaySettings = mfa.DisplayFlags; + var graphicSettings = mfa.GraphicFlags; + var flags = game.Header.Flags; + var newFlags = game.Header.NewFlags; + //TODO:Flags, no setter + mfa.WindowX = game.Header.WindowWidth; + mfa.WindowY = game.Header.WindowHeight; + mfa.BorderColor = game.Header.BorderColor; + mfa.HelpFile = ""; + mfa.VitalizePreview = new byte[]{0x0}; + mfa.InitialScore = game.Header.InitialScore; + mfa.InitialLifes = game.Header.InitialLives; + mfa.FrameRate = game.Header.FrameRate; + mfa.BuildType = 0; + mfa.BuildPath = game.TargetFilename; + mfa.CommandLine = ""; + mfa.Aboutbox = game.AboutText?.Length > 0 + ? game?.AboutText + : "This game was decompiled with " + Settings.DumperVersion; + mfa.Frames.Clear(); + foreach (Frame gameFrame in game.Frames) + { + var mfaFrame = ConvertFrame(gameFrame); + mfaFrame.Handle = game.Frames.IndexOf(gameFrame); + mfa.Frames.Add(mfaFrame); + + } + } + + public static MFA.Loaders.Transition ConvertTransition(EXE.Loaders.Transition gameTrans) + { + var mfaTrans = new MFA.Loaders.Transition((ByteReader) null); + mfaTrans.Module = gameTrans.ModuleFile; + mfaTrans.Name = "Transition"; + mfaTrans.Id = gameTrans.Module; + mfaTrans.TransitionId = gameTrans.Name; + mfaTrans.Flags = gameTrans.Flags; + mfaTrans.Color = gameTrans.Color; + mfaTrans.ParameterData = gameTrans.ParameterData; + mfaTrans.Duration = gameTrans.Duration; + return mfaTrans; + + } + + public static MFA.Loaders.Frame ConvertFrame(EXE.Loaders.Frame gameFrame) + { + MFA.Loaders.Frame mfaFrame = new MFA.Loaders.Frame(null); + TranslatingFrame.Invoke(gameFrame.Name); + //mfaFrame.Handle = game.Frames.IndexOf(gameFrame); + 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 ?? 1337; + 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(); + var layer = new Layer(null) + { + Name = "New Layer", + + + }; + layer.Flags["Visible"] = true; + mfaFrame.Layers.Add(layer); + + + /*foreach (EXE.Loaders.Layer gameLayer in gameFrame.Layers.Items) + { + Layer mfaLayer = new Layer(null); + mfaLayer.Name = gameLayer.Name; + mfaLayer.Flags = (int) gameLayer.Flags; + //TODO: Flags + mfaLayer.XCoefficient = gameLayer.XCoeff; + mfaLayer.YCoefficient = gameLayer.YCoeff; + mfaFrame.Layers.Add(mfaLayer); + }*/ + mfaFrame.Events = MFA.MFA.emptyEvents; + mfaFrame.Chunks = MFA.MFA.emptyFrameChunks; + return mfaFrame; + } + } + + +} \ No newline at end of file diff --git a/NetMFAPatcher/Program.cs b/NetMFAPatcher/Program.cs index b1b7608..5da8cd6 100644 --- a/NetMFAPatcher/Program.cs +++ b/NetMFAPatcher/Program.cs @@ -3,19 +3,17 @@ using System.IO; using System.Runtime.InteropServices; using System.Windows.Forms; using DotNetCTFDumper.GUI; -using DotNetCTFDumper.MMFParser.Decompiling; using DotNetCTFDumper.MMFParser.EXE; +using DotNetCTFDumper.MMFParser.Translation; using DotNetCTFDumper.Utils; using Joveler.Compression.ZLib; namespace DotNetCTFDumper { - internal class Program + public class Program { - //public static string path = @"H:\fnaf-world.exe";//test - //public static string path = @"D:\SteamLibrary\steamapps\common\Five Nights at Freddy's Sister Location\SisterLocation.exe"; - //public static string Path = ""; //TODO: Make Selectable public static MainForm MyForm; + public delegate void DumperEvent(object obj); [STAThread] @@ -24,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/Settings.cs b/NetMFAPatcher/Settings.cs index f95e3bf..7a0d685 100644 --- a/NetMFAPatcher/Settings.cs +++ b/NetMFAPatcher/Settings.cs @@ -14,9 +14,9 @@ namespace DotNetCTFDumper public static string GamePath; public static string GameName => Path.GetFileNameWithoutExtension(GamePath); public static string DumpPath => $"DUMP\\{GameName}"; - public static string ImagePath=>$"{DumpPath}\\ImageBank"; - public static string SoundPath=>$"{DumpPath}\\SoundBank"; - public static string MusicPath=>$"{DumpPath}\\MusicBank"; + public static string ImagePath=>$"{DumpPath}\\Images"; + public static string SoundPath=>$"{DumpPath}\\Sounds"; + public static string MusicPath=>$"{DumpPath}\\Musics"; public static string ChunkPath=>$"{DumpPath}\\Chunks"; public static string ExtensionPath=>$"{DumpPath}\\Extensions"; diff --git a/NetMFAPatcher/Utils/BitDict.cs b/NetMFAPatcher/Utils/BitDict.cs index fc091ff..a765651 100644 --- a/NetMFAPatcher/Utils/BitDict.cs +++ b/NetMFAPatcher/Utils/BitDict.cs @@ -17,7 +17,7 @@ namespace DotNetCTFDumper.Utils public bool this[String key] { get => GetFlag(key); - // set => SetFlag(key,value); + set => SetFlag(key,value); } public bool GetFlag(String key) @@ -30,6 +30,14 @@ namespace DotNetCTFDumper.Utils return false; } + + public void SetFlag(String key, bool value) + { + if (value) + { + flag |= (uint) Math.Pow(2,Array.IndexOf(Keys,key)); + } + } public static string ToDebugString(IDictionary dictionary) @@ -47,5 +55,7 @@ namespace DotNetCTFDumper.Utils return ToDebugString(actualKeys); } + + } } \ No newline at end of file