From 8617712de74d7d5467de7cf988420352f1803227 Mon Sep 17 00:00:00 2001
From: 1987kostya <ivaninvideorec@gmail.com>
Date: Mon, 14 Dec 2020 12:59:37 +0600
Subject: [PATCH] More null-checks, support for 2.5+(no images and frameitems)

---
 NetMFAPatcher/GUI/MainForm.cs                 |  6 +--
 NetMFAPatcher/GUI/PackDataForm.Designer.cs    |  6 +--
 NetMFAPatcher/MMFParser/EXE/ChunkList.cs      |  3 +-
 NetMFAPatcher/MMFParser/EXE/Loaders/Frame.cs  | 25 +++++++--
 .../MMFParser/EXE/Loaders/Transition.cs       |  2 -
 NetMFAPatcher/MMFParser/MFA/Loaders/Layer.cs  |  4 +-
 NetMFAPatcher/MMFParser/MFA/MFA.cs            |  4 +-
 .../MMFParser/Translation/PAME2MFA.cs         | 53 +++++++++----------
 NetMFAPatcher/Utils/Helper.cs                 |  9 ++++
 9 files changed, 69 insertions(+), 43 deletions(-)

diff --git a/NetMFAPatcher/GUI/MainForm.cs b/NetMFAPatcher/GUI/MainForm.cs
index b3dab37..390838d 100644
--- a/NetMFAPatcher/GUI/MainForm.cs
+++ b/NetMFAPatcher/GUI/MainForm.cs
@@ -244,9 +244,9 @@ namespace DotNetCTFDumper.GUI
             toLog += $"Product Version: {Exe.Instance.GameData.ProductVersion}\n";
             toLog += $"Build: {Exe.Instance.GameData.Build}\n";
             toLog += $"Runtime Version: {Exe.Instance.GameData.RuntimeVersion}\n";
-            toLog += $"Number Of Images: {Exe.Instance.GameData.Images.NumberOfItems}\n";
-            toLog += $"Number Of Sounds: {(Exe.Instance.GameData.Sounds!= null ?  Exe.Instance.GameData.Sounds.NumOfItems: 0)}\n";
-            toLog += $"Unique FrameItems: {Exe.Instance.GameData.Frameitems.NumberOfItems}\n";
+            toLog += $"Number Of Images: {Exe.Instance.GameData.Images?.NumberOfItems}\n";
+            toLog += $"Number Of Sounds: {Exe.Instance.GameData.Sounds?.NumOfItems}\n";
+            toLog += $"Unique FrameItems: {Exe.Instance.GameData.Frameitems?.NumberOfItems}\n";
             toLog += $"Frame Count: {Exe.Instance.GameData.Frames.Count}\n";
             toLog += $"Chunks Count: {Exe.Instance.GameData.GameChunks.Chunks.Count}\n";
             if (Exe.Instance.GameData.GameChunks.GetChunk<ImageBank>() != null)
diff --git a/NetMFAPatcher/GUI/PackDataForm.Designer.cs b/NetMFAPatcher/GUI/PackDataForm.Designer.cs
index af1d778..95ab9b3 100644
--- a/NetMFAPatcher/GUI/PackDataForm.Designer.cs
+++ b/NetMFAPatcher/GUI/PackDataForm.Designer.cs
@@ -58,7 +58,7 @@ namespace DotNetCTFDumper.GUI
             // 
             this.dumpButton.BackColor = System.Drawing.Color.FromArgb(((int) (((byte) (64)))), ((int) (((byte) (64)))), ((int) (((byte) (64)))));
             this.dumpButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
-            this.dumpButton.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte) (204)));
+            this.dumpButton.Font = new System.Drawing.Font("Courier New", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte) (204)));
             this.dumpButton.ForeColor = System.Drawing.Color.FromArgb(((int) (((byte) (255)))), ((int) (((byte) (128)))), ((int) (((byte) (0)))));
             this.dumpButton.Location = new System.Drawing.Point(204, 105);
             this.dumpButton.Name = "dumpButton";
@@ -72,7 +72,7 @@ namespace DotNetCTFDumper.GUI
             // 
             this.dumpAllButton.BackColor = System.Drawing.Color.FromArgb(((int) (((byte) (64)))), ((int) (((byte) (64)))), ((int) (((byte) (64)))));
             this.dumpAllButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
-            this.dumpAllButton.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte) (204)));
+            this.dumpAllButton.Font = new System.Drawing.Font("Courier New", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte) (204)));
             this.dumpAllButton.ForeColor = System.Drawing.Color.FromArgb(((int) (((byte) (255)))), ((int) (((byte) (128)))), ((int) (((byte) (0)))));
             this.dumpAllButton.Location = new System.Drawing.Point(204, 148);
             this.dumpAllButton.Name = "dumpAllButton";
@@ -88,7 +88,7 @@ namespace DotNetCTFDumper.GUI
             this.infoLabel.ForeColor = System.Drawing.Color.FromArgb(((int) (((byte) (255)))), ((int) (((byte) (128)))), ((int) (((byte) (0)))));
             this.infoLabel.Location = new System.Drawing.Point(204, 14);
             this.infoLabel.Name = "infoLabel";
-            this.infoLabel.Size = new System.Drawing.Size(142, 91);
+            this.infoLabel.Size = new System.Drawing.Size(255, 91);
             this.infoLabel.TabIndex = 3;
             this.infoLabel.Text = "Name: PackFile1.mvx\r\nSize: 5 MB\r\n";
             // 
diff --git a/NetMFAPatcher/MMFParser/EXE/ChunkList.cs b/NetMFAPatcher/MMFParser/EXE/ChunkList.cs
index 658f7fc..dc7c0cf 100644
--- a/NetMFAPatcher/MMFParser/EXE/ChunkList.cs
+++ b/NetMFAPatcher/MMFParser/EXE/ChunkList.cs
@@ -310,10 +310,11 @@ namespace DotNetCTFDumper.MMFParser.EXE
                 {
                     if (chunk.Loader.GetType().Name == typeof(T).Name)
                     {
+                        Chunks.Remove(chunk);
                         return (T) chunk.Loader;
                     }
 
-                    Chunks.Remove(chunk);
+                    
                 }
             }
             //Logger.Log($"ChunkLoader {typeof(T).Name} not found", true, ConsoleColor.Red);
diff --git a/NetMFAPatcher/MMFParser/EXE/Loaders/Frame.cs b/NetMFAPatcher/MMFParser/EXE/Loaders/Frame.cs
index 49aea1f..83fb0eb 100644
--- a/NetMFAPatcher/MMFParser/EXE/Loaders/Frame.cs
+++ b/NetMFAPatcher/MMFParser/EXE/Loaders/Frame.cs
@@ -284,9 +284,10 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders
         {
             get
             {
+                if (Exe.Instance.GameData.GameChunks.GetChunk<FrameItems>() == null) return null;
                 return Exe.Instance.GameData.GameChunks.GetChunk<FrameItems>().FromHandle(ObjectInfo);
             }
-        }
+        } 
 
         public override void Print(bool ext)
         {
@@ -345,11 +346,28 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders
     public class Layer : ChunkLoader
     {
         public string Name;
-        public uint Flags;
+        public BitDict Flags = new BitDict(new string[]
+        {
+            "XCoefficient",
+            "YCoefficient",
+            "DoNotSaveBackground",
+            "",
+            "Visible",
+            "WrapHorizontally",
+            "WrapVertically",
+            "", "", "", "",
+            "", "", "", "", "",
+            "Redraw",
+            "ToHide",
+            "ToShow"
+        }
+
+        );
         public float XCoeff;
         public float YCoeff;
         public int NumberOfBackgrounds;
         public int BackgroudIndex;
+        
 
         public Layer(ByteReader reader) : base(reader)
         {
@@ -361,13 +379,12 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders
 
         public override void Read()
         {
-            Flags = Reader.ReadUInt32();
+            Flags.flag = Reader.ReadUInt32();
             XCoeff = Reader.ReadSingle();
             YCoeff = Reader.ReadSingle();
             NumberOfBackgrounds = Reader.ReadInt32();
             BackgroudIndex = Reader.ReadInt32();
             Name = Reader.ReadWideString();
-            Console.WriteLine(Name);
         }
 
         public override void Print(bool ext)
diff --git a/NetMFAPatcher/MMFParser/EXE/Loaders/Transition.cs b/NetMFAPatcher/MMFParser/EXE/Loaders/Transition.cs
index 59d41bb..a24654f 100644
--- a/NetMFAPatcher/MMFParser/EXE/Loaders/Transition.cs
+++ b/NetMFAPatcher/MMFParser/EXE/Loaders/Transition.cs
@@ -26,9 +26,7 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders
         {
             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();
diff --git a/NetMFAPatcher/MMFParser/MFA/Loaders/Layer.cs b/NetMFAPatcher/MMFParser/MFA/Loaders/Layer.cs
index d32a58f..3c05d8f 100644
--- a/NetMFAPatcher/MMFParser/MFA/Loaders/Layer.cs
+++ b/NetMFAPatcher/MMFParser/MFA/Loaders/Layer.cs
@@ -39,11 +39,11 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
 
         public override void Read()
         {
-            Name = Helper.AutoReadUnicode(Reader);
+            Name = Reader.AutoReadUnicode();
             Flags.flag = (uint) Reader.ReadInt32();
             XCoefficient = Reader.ReadSingle();
             YCoefficient = Reader.ReadSingle();
-            Console.WriteLine("LayerAss: "+Flags["Visible"]);
+  
 
 
 
diff --git a/NetMFAPatcher/MMFParser/MFA/MFA.cs b/NetMFAPatcher/MMFParser/MFA/MFA.cs
index 87bfdd6..54c5e69 100644
--- a/NetMFAPatcher/MMFParser/MFA/MFA.cs
+++ b/NetMFAPatcher/MMFParser/MFA/MFA.cs
@@ -241,7 +241,7 @@ namespace DotNetCTFDumper.MMFParser.MFA
             }
             
             Writer.WriteInt32(Frames.Count); //frame
-            var startPos = Reader.Tell() + 4 * Frames.Count + 4;
+            var startPos = Writer.Tell() + 4 * Frames.Count + 4;
             
             ByteWriter newWriter = new ByteWriter(new MemoryStream());
             foreach (Frame frame in Frames)
@@ -259,6 +259,7 @@ namespace DotNetCTFDumper.MMFParser.MFA
 
         public override void Read()
         {
+            
             Logger.Log($"MFA HEADER:{Reader.ReadAscii(4)}\n");
             MfaBuild = Reader.ReadInt32();
             Product = Reader.ReadInt32();
@@ -402,6 +403,7 @@ namespace DotNetCTFDumper.MMFParser.MFA
             Reader.Seek(nextOffset);
             Chunks = new ChunkList(Reader);
             Chunks.Read();
+            Reader.Dispose();
             return;
         }
 
diff --git a/NetMFAPatcher/MMFParser/Translation/PAME2MFA.cs b/NetMFAPatcher/MMFParser/Translation/PAME2MFA.cs
index 5ddd49c..e9a181d 100644
--- a/NetMFAPatcher/MMFParser/Translation/PAME2MFA.cs
+++ b/NetMFAPatcher/MMFParser/Translation/PAME2MFA.cs
@@ -36,8 +36,8 @@ namespace DotNetCTFDumper.MMFParser.Translation
                 mfa.Images.Items[key].Debug = true;
             }
             */
-            mfa.Author = game.Author!=null? game.Author:"Kostya";
-            mfa.Copyright = game.Copyright;
+            mfa.Author = game.Author ?? "Kostya";
+            mfa.Copyright = game.Copyright ??"CTFAN Team";
             mfa.Company = "CTFAN Team";
             mfa.Version = "";
             //TODO:Binary Files
@@ -74,7 +74,7 @@ namespace DotNetCTFDumper.MMFParser.Translation
         {
             var mfaTrans = new MFA.Loaders.Transition((ByteReader) null);
             mfaTrans.Module = gameTrans.ModuleFile;
-            mfaTrans.Name = "Transition";
+            mfaTrans.Name = gameTrans.Name.FirstCharToUpper();
             mfaTrans.Id = gameTrans.Module;
             mfaTrans.TransitionId = gameTrans.Name;
             mfaTrans.Flags = gameTrans.Flags;
@@ -88,19 +88,16 @@ namespace DotNetCTFDumper.MMFParser.Translation
         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);
+            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 ?? 1337;
+            
+            //TODO:Flags
+            mfaFrame.MaxObjects = gameFrame.Events?.MaxObjects ?? 10000;
             mfaFrame.Password = gameFrame?.Password ?? "";
             mfaFrame.LastViewedX = 320;
             mfaFrame.LastViewedY = 240;
@@ -108,26 +105,28 @@ namespace DotNetCTFDumper.MMFParser.Translation
             mfaFrame.StampHandle = 12;
             mfaFrame.ActiveLayer = 0;
             mfaFrame.Layers = new List<Layer>();
-            var layer = new Layer(null)
+
+            foreach (EXE.Loaders.Layer gameLayer in gameFrame.Layers.Items)
             {
-                Name = "New Layer",
-                    
-                    
-            };
-            layer.Flags["Visible"] = true;
-            mfaFrame.Layers.Add(layer);
-                
+                Layer mfaLayer = new Layer(null)
+                {
+                    Name = gameLayer.Name,
+                    Flags =
+                    {
+                        ["HideAtStart"] = gameLayer.Flags["ToHide"],
+                        ["Visible"] = true,
+                        ["NoBackground"] = gameLayer.Flags["DoNotSaveBackground"],
+                        ["WrapHorizontally"] = gameLayer.Flags["WrapHorizontally"],
+                        ["WrapVertically"] = gameLayer.Flags["WrapVertically"]
                 
-            /*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;
+                    },
+                    XCoefficient = gameLayer.XCoeff,
+                    YCoefficient = gameLayer.YCoeff
+                };
                 mfaFrame.Layers.Add(mfaLayer);
-            }*/
+                break;
+                //TODO: Fix layers
+            }
             mfaFrame.Events = MFA.MFA.emptyEvents;
             mfaFrame.Chunks = MFA.MFA.emptyFrameChunks;
             return mfaFrame;
diff --git a/NetMFAPatcher/Utils/Helper.cs b/NetMFAPatcher/Utils/Helper.cs
index a572988..ee10c85 100644
--- a/NetMFAPatcher/Utils/Helper.cs
+++ b/NetMFAPatcher/Utils/Helper.cs
@@ -52,6 +52,15 @@ namespace DotNetCTFDumper.Utils
 
             return temp;
         }
+        public static string FirstCharToUpper(this string input)
+        {
+            switch (input)
+            {
+                case null: throw new ArgumentNullException(nameof(input));
+                case "": throw new ArgumentException($"{nameof(input)} cannot be empty", nameof(input));
+                default: return input.First().ToString().ToUpper() + input.Substring(1);
+            }
+        }
 
         public static string AutoReadUnicode(this ByteReader reader)
         {