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(); AccelKey = new List(); AccelId = new List(); - 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); + } }