From f3184e692e3aa50403b69414024de1f115f4731e Mon Sep 17 00:00:00 2001
From: REDxEYE <med45c@gmail.com>
Date: Thu, 10 Dec 2020 17:36:55 +0300
Subject: [PATCH] fixed appmenu and controls

---
 .../mmfparser/chunkloaders/AppMenu.cs         | 108 ++++++++++++------
 .../mmfparser/mfaloaders/Controls.cs          |   4 +
 2 files changed, 80 insertions(+), 32 deletions(-)

diff --git a/NetMFAPatcher/mmfparser/chunkloaders/AppMenu.cs b/NetMFAPatcher/mmfparser/chunkloaders/AppMenu.cs
index 8836237..06fc2c5 100644
--- a/NetMFAPatcher/mmfparser/chunkloaders/AppMenu.cs
+++ b/NetMFAPatcher/mmfparser/chunkloaders/AppMenu.cs
@@ -1,6 +1,8 @@
 using System;
 using System.Collections.Generic;
+using System.IO;
 using DotNetCTFDumper.Utils;
+using Ionic.Zip;
 using static DotNetCTFDumper.MMFParser.Data.ChunkList;
 
 namespace DotNetCTFDumper.MMFParser.ChunkLoaders
@@ -19,9 +21,9 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders
         public AppMenu(Chunk chunk) : base(chunk)
         {
         }
+
         public override void Print(bool ext)
         {
-            
         }
 
         public override string[] GetReadableData()
@@ -31,65 +33,90 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders
 
         public override void Read()
         {
-            var currentPosition = Reader.Tell();
-            var headerSize = Reader.ReadUInt32();
-            var menuOffset = Reader.ReadInt32();
-            var menuSize = Reader.ReadInt32();
+            long currentPosition = Reader.Tell();
+            uint headerSize = Reader.ReadUInt32();
+            int menuOffset = Reader.ReadInt32();
+            int menuSize = Reader.ReadInt32();
             if (menuSize == 0) return;
-            var accelOffset = Reader.ReadInt32();
-            var accelSize = Reader.ReadInt32();
+            int accelOffset = Reader.ReadInt32();
+            int accelSize = Reader.ReadInt32();
             Reader.Seek(currentPosition + menuOffset);
             Reader.Skip(4);
-            
+
             Load(Reader);
-            
+
             Reader.Seek(currentPosition + accelOffset);
-            
-            for (int i = 0; i < accelSize/8; i++)
+
+            for (int i = 0; i < accelSize / 8; i++)
             {
                 AccelShift = new List<byte>();
                 AccelKey = new List<short>();
                 AccelId = new List<short>();
-                AccelShift.Add(Reader.ReadByte());;
+                AccelShift.Add(Reader.ReadByte());
+                ;
                 Reader.Skip(1);
                 AccelKey.Add(Reader.ReadInt16());
                 AccelId.Add(Reader.ReadInt16());
                 Reader.Skip(2);
             }
+        }
+
+        public void Write(ByteWriter writer)
+        {
+            writer.WriteInt32(20);
+            writer.WriteInt32(20);
+            writer.WriteInt32(0);
+
+            ByteWriter menuDataWriter = new ByteWriter(new MemoryStream());
+
+            foreach (AppMenuItem item in Items)
+            {
+                item.Write(menuDataWriter);
+            }
 
+            writer.WriteUInt32((uint) (24 + menuDataWriter.BaseStream.Position));
+            writer.WriteInt32(AccelKey.Count * 8);
+            writer.WriteInt32(0);
+            writer.WriteWriter(menuDataWriter);
+            for (Int32 i = 0; i < AccelKey.Count; i++)
+            {
+                writer.WriteInt8(AccelShift[i]);
+                writer.WriteInt8(0);
+                writer.WriteInt16(AccelKey[i]);
+                writer.WriteInt16(AccelId[i]);
+                writer.WriteInt8(0);
+            }
         }
+
         public void Load(ByteReader reader)
         {
-            while(true)
+            while (true)
             {
-                var newItem = new AppMenuItem(reader);
+                AppMenuItem newItem = new AppMenuItem(reader);
                 newItem.Read();
                 Items.Add(newItem);
 
                 if (newItem.Name.Contains("About")) break;
-                if (ByteFlag.GetFlag((uint) newItem.Flags,4))
+                if (ByteFlag.GetFlag((uint) newItem.Flags, 4))
                 {
                     Load(reader);
-                    
                 }
+
                 if (ByteFlag.GetFlag((uint) newItem.Flags, 7))
                 {
-
                     break;
                 }
-
-
             }
-
-
         }
     }
+
     public class AppMenuItem : ChunkLoader
     {
         public string Name = "";
-        public int Flags = 0;
-        public int Id = 0;
-        public string Mnemonic = "";
+        public short Flags = 0;
+        public short Id = 0;
+        public string Mnemonic = null;
+
         public AppMenuItem(ByteReader reader) : base(reader)
         {
         }
@@ -97,6 +124,7 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders
         public AppMenuItem(Chunk chunk) : base(chunk)
         {
         }
+
         public override void Print(bool ext)
         {
             throw new NotImplementedException();
@@ -109,30 +137,46 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders
 
         public override void Read()
         {
-            uint flags = (uint) Reader.ReadInt16();
-            if (!ByteFlag.GetFlag(flags,4))
+            Flags = Reader.ReadInt16();
+            if (!ByteFlag.GetFlag((uint) Flags, 4))
             {
                 Id = Reader.ReadInt16();
-                
             }
+
             Name = Reader.ReadWideString();
-            
+
             for (int i = 0; i < Name.Length; i++)
             {
-                if(Name[i]=='&')
+                if (Name[i] == '&')
                 {
                     Mnemonic = Name[i + 1].ToString().ToUpper();
                 }
+
                 Name = Name.Replace("&", "");
-                
             }
+
             Console.WriteLine(Name);
         }
+
         public void Load()
         {
+        }
 
+        public void Write(ByteWriter writer)
+        {
+            writer.WriteInt16(Flags);
+            if (!ByteFlag.GetFlag((uint) Flags, 4))
+            {
+                writer.WriteInt16(Id);
+            }
 
+            String MName = Name;
+            if (Mnemonic != null)
+            {
+                MName = MName.Replace(Mnemonic, "&" + Mnemonic);
+            }
+
+            writer.AutoWriteUnicode(MName);
         }
     }
-
-}
+}
\ No newline at end of file
diff --git a/NetMFAPatcher/mmfparser/mfaloaders/Controls.cs b/NetMFAPatcher/mmfparser/mfaloaders/Controls.cs
index de3e1b6..a872f9b 100644
--- a/NetMFAPatcher/mmfparser/mfaloaders/Controls.cs
+++ b/NetMFAPatcher/mmfparser/mfaloaders/Controls.cs
@@ -97,6 +97,10 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders
             writer.WriteInt32(Button2);
             writer.WriteInt32(Button3);
             writer.WriteInt32(Button4);
+            for (int i = 0; i < 8; i++)
+            {
+                writer.WriteInt32(0);
+            }
 
 
         }