using NetMFAPatcher.Utils; using mmfparser.mfaloaders; using NetMFAPatcher.chunkloaders; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using NetMFAPatcher.mmfparser; using NetMFAPatcher.mmfparser.mfaloaders; using NetMFAPatcher.mmfparser.chunkloaders; using System.IO; using Frame = NetMFAPatcher.mmfparser.mfaloaders.Frame; using mmfparser; namespace NetMFAPatcher.mfa { class MFA : DataLoader { public static readonly string FontBankID = "ATNF"; public static readonly string ImageBankID = "AGMI"; public static readonly string MusicBankID = "ASUM"; public static readonly string SoundBankID = "APMS"; public int mfaBuild; public int product; public int buildVersion; public int langID; public string name; public string description; public string path; public FontBank fonts; public SoundBank sounds; public MusicBank music; public string author; public string copyright; public string company; public string version; public byte[] stamp; public int windowX; public int windowY; public ValueList globalValues; public ValueList globalStrings; public override void Print() { //Logger.Log($"MFA Product:{product}"); //Logger.Log($"MFA Build:{mfaBuild}"); //Logger.Log($"MFA Product:{buildVersion}"); } public void Write(ByteWriter writer) { writer.WriteAscii("MFU2"); writer.WriteInt32(mfaBuild); writer.WriteInt32(product); writer.WriteInt32(buildVersion); writer.WriteInt32(langID); writer.AutoWriteUnicode(name); writer.AutoWriteUnicode(description); writer.AutoWriteUnicode(path); writer.WriteUInt32((uint)stamp.Length); writer.WriteBytes(stamp); writer.WriteAscii(FontBankID); fonts.Write(writer); writer.WriteAscii(SoundBankID); sounds.Write(writer); writer.WriteAscii(MusicBankID); //music.Write();//cum cum cum cum cum cum cum cum writer.WriteInt32(0);//someone is using musics lol? } public override void Read() { Logger.Log($"MFA HEADER:{reader.ReadAscii(4)}\n"); mfaBuild = reader.ReadInt32(); product = reader.ReadInt32(); buildVersion = reader.ReadInt32(); Console.WriteLine($"mfaBuild: {mfaBuild}, product: {product}, buildVersion: {buildVersion}"); langID = reader.ReadInt32(); name = Helper.AutoReadUnicode(reader); description = Helper.AutoReadUnicode(reader); path = Helper.AutoReadUnicode(reader); Console.WriteLine($"\nMFAName: {name}\nDescription: {description}\nPath: {path}"); stamp = reader.ReadBytes(reader.ReadInt32()); if (reader.ReadAscii(4) != "ATNF") { throw new Exception("Invalid Font Bank"); } fonts = new FontBank(reader); fonts.Read(); Console.WriteLine("FONTS: " + fonts.numberOfItems); if (reader.ReadAscii(4) != "APMS") { throw new Exception("Invalid Sound Bank"); } sounds = new SoundBank(reader); sounds.isCompressed = false; sounds.Read(); if (reader.ReadAscii(4) != "ASUM") { throw new Exception("Invalid Music Bank"); } music = new MusicBank(reader); music.Read(); if (reader.ReadAscii(4) != "AGMI") { throw new Exception("Invalid Icon Bank"); } var icons = new AGMIBank(reader); icons.Read(); if (reader.ReadAscii(4) != "AGMI") { throw new Exception("Invalid Image Bank"); } var images = new AGMIBank(reader); images.Read(); if (Helper.AutoReadUnicode(reader) != name) throw new Exception("Invalid name"); author = Helper.AutoReadUnicode(reader); var newDesc = Helper.AutoReadUnicode(reader); if ( newDesc!= description) throw new Exception("Invalid description: "+newDesc); copyright = Helper.AutoReadUnicode(reader); company = Helper.AutoReadUnicode(reader); Console.WriteLine("Company: "+company); version = Helper.AutoReadUnicode(reader); Console.WriteLine("Version: " + version); windowX = reader.ReadInt32(); windowY = reader.ReadInt32(); Console.WriteLine($"Window:{windowX}x{windowY}"); var borderColor = reader.ReadColor(); var displayFlags = reader.ReadUInt32(); var graphicFlags = reader.ReadUInt32(); var helpFile = Helper.AutoReadUnicode(reader); Console.WriteLine(reader.Tell()); var vitalizePreview = reader.ReadInt32(); var initialScore = reader.ReadInt32(); var initialLifes = reader.ReadInt32(); var frameRate = reader.ReadInt32(); var buildType = reader.ReadInt32(); var buildPath = Helper.AutoReadUnicode(reader); reader.ReadInt32(); var commandLine = Helper.AutoReadUnicode(reader); var aboutbox = Helper.AutoReadUnicode(reader); Console.WriteLine(aboutbox); reader.ReadInt32(); var binCount = reader.ReadInt32();//wtf i cant put it in loop fuck shit for (int i = 0; i < binCount; i++) { reader.ReadBytes(reader.ReadInt32());//binaryfiles } var controls = new mmfparser.mfaloaders.Controls(reader); controls.Read(); var menuSize = reader.ReadUInt32(); var currentPosition = reader.Tell(); var menu = new AppMenu(reader); menu.Read(); reader.Seek(menuSize + currentPosition); var windowMenuIndex = reader.ReadInt32(); int[] menuImages = new int[65535];//govnokod suka var MICount = reader.ReadInt32(); for (int i = 0; i < MICount; i++) { var id = reader.ReadInt32(); menuImages[id] = reader.ReadInt32(); } globalValues = new ValueList(reader); globalValues.Read(); globalStrings = new ValueList(reader); globalStrings.Read(); var globalEvents = reader.ReadBytes(reader.ReadInt32()); var graphicMode = reader.ReadInt32();; var icoCount = reader.ReadInt32(); for (int i = 0; i < icoCount; i++) { reader.ReadInt32(); } var qualCount = reader.ReadInt32(); for (int i = 0; i < qualCount; i++)//qualifiers { var nameQ = reader.ReadAscii(reader.ReadInt32()); var handleQ = reader.ReadInt32(); } var extCount = reader.ReadInt32(); for (int i = 0; i < extCount; i++)//extensions { var handleE = reader.ReadInt32(); var filenameE = Helper.AutoReadUnicode(reader); var nameE = Helper.AutoReadUnicode(reader); var magicE = reader.ReadInt32(); var subType = reader.ReadBytes(reader.ReadInt32()); } List frameOffsets = new List(); var offCount = reader.ReadInt32(); for (int i = 0; i < offCount; i++) { frameOffsets.Add(reader.ReadInt32()); } var nextOffset = reader.ReadInt32(); foreach (var item in frameOffsets) { reader.Seek(item); var testframe = new Frame(reader); testframe.Read(); } reader.Seek(nextOffset); var chunks = new ChunkList(reader); chunks.Read(); return; } public MFA(ByteIO reader) : base(reader) { } } }