Extension parser

master
1987kostya 4 years ago
parent 938bc54838
commit d0f47a3ded

@ -191,6 +191,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Objects
{ {
ExtensionData = Reader.ReadBytes(dataSize); ExtensionData = Reader.ReadBytes(dataSize);
} }
Logger.Log($"{Parent.Name} - {ExtensionId}");
} }
if (_counterOffset > 0) if (_counterOffset > 0)

@ -77,15 +77,16 @@ namespace CTFAK.MMFParser.MFA.Loaders
if (MFA.defaultObjChunks == null) MFA.defaultObjChunks = Chunks; if (MFA.defaultObjChunks == null) MFA.defaultObjChunks = Chunks;
if(ObjectType>=32)//extension base if(ObjectType>=32)//extension base
{ {
//TODO: Nonactives Loader = new ExtensionObject(Reader);
} }
else if(ObjectType==2) else if(ObjectType==2)
{ {
Loader = new Active(Reader); Loader = new Active(Reader);
Loader.Read();
}
}
Loader?.Read();

@ -8,6 +8,8 @@ namespace CTFAK.MMFParser.MFA.Loaders.mfachunks
public class AnimationObject:ObjectLoader public class AnimationObject:ObjectLoader
{ {
public Dictionary<int,Animation> Items = new Dictionary<int,Animation>(); public Dictionary<int,Animation> Items = new Dictionary<int,Animation>();
public bool _isExt;
public override void Read() public override void Read()
{ {
base.Read(); base.Read();
@ -24,15 +26,29 @@ namespace CTFAK.MMFParser.MFA.Loaders.mfachunks
} }
} }
public void Write(ByteWriter Writer,bool ext)
{
_isExt = ext;
Write(Writer);
}
public override void Write(ByteWriter Writer) public override void Write(ByteWriter Writer)
{ {
base.Write(Writer); base.Write(Writer);
Writer.WriteInt8(1); if (_isExt)
Writer.WriteUInt32((uint) Items.Count); {
foreach (Animation animation in Items.Values) Writer.WriteInt8(0);
Writer.WriteInt32(-1);
}
else
{ {
animation.Write(Writer); Writer.WriteInt8(1);
Writer.WriteUInt32((uint) Items.Count);
foreach (Animation animation in Items.Values)
{
animation.Write(Writer);
}
} }
} }

@ -13,6 +13,7 @@ namespace CTFAK.MMFParser.MFA.Loaders.mfachunks
public int ExtensionId; public int ExtensionId;
public int ExtensionPrivate; public int ExtensionPrivate;
public byte[] ExtensionData; public byte[] ExtensionData;
private byte[] _unk;
public ExtensionObject(ByteReader reader) : base(reader) public ExtensionObject(ByteReader reader) : base(reader)
{ {
@ -32,7 +33,7 @@ namespace CTFAK.MMFParser.MFA.Loaders.mfachunks
var newReader = new ByteReader(Reader.ReadBytes((int) Reader.ReadUInt32())); var newReader = new ByteReader(Reader.ReadBytes((int) Reader.ReadUInt32()));
var dataSize = newReader.ReadInt32() - 20; var dataSize = newReader.ReadInt32() - 20;
newReader.Skip(4); _unk = newReader.ReadBytes(4);
ExtensionVersion = newReader.ReadInt32(); ExtensionVersion = newReader.ReadInt32();
ExtensionId = newReader.ReadInt32(); ExtensionId = newReader.ReadInt32();
ExtensionPrivate = newReader.ReadInt32(); ExtensionPrivate = newReader.ReadInt32();
@ -42,6 +43,7 @@ namespace CTFAK.MMFParser.MFA.Loaders.mfachunks
public override void Write(ByteWriter Writer) public override void Write(ByteWriter Writer)
{ {
_isExt = true;
base.Write(Writer); base.Write(Writer);
if (ExtensionType == -1) if (ExtensionType == -1)
{ {
@ -52,7 +54,7 @@ namespace CTFAK.MMFParser.MFA.Loaders.mfachunks
} }
Writer.WriteInt32(ExtensionData.Length+20); Writer.WriteInt32(ExtensionData.Length+20);
Writer.WriteInt32(ExtensionData.Length+20); Writer.WriteInt32(ExtensionData.Length+20);
Writer.WriteInt32(0); Writer.WriteInt32(-1);
Writer.WriteInt32(ExtensionVersion); Writer.WriteInt32(ExtensionVersion);
Writer.WriteInt32(ExtensionId); Writer.WriteInt32(ExtensionId);
Writer.WriteInt32(ExtensionPrivate); Writer.WriteInt32(ExtensionPrivate);

@ -111,7 +111,7 @@ namespace CTFAK.MMFParser.MFA
private int QualCount; private int QualCount;
public Controls Controls; public Controls Controls;
public List<int> IconImages; public List<int> IconImages;
public List<Tuple<int, string, string, int, byte[]>> Extensions; public List<Tuple<int, string, string, int, string>> Extensions;
public List<Tuple<string, int>> CustomQuals; public List<Tuple<string, int>> CustomQuals;
public List<Frame> Frames; public List<Frame> Frames;
public ChunkList Chunks; public ChunkList Chunks;
@ -237,10 +237,14 @@ namespace CTFAK.MMFParser.MFA
foreach(var extension in Extensions) foreach(var extension in Extensions)
{ {
Writer.WriteInt32(extension.Item1); Writer.WriteInt32(extension.Item1);
Writer.WriteUnicode(extension.Item2); Writer.AutoWriteUnicode(extension.Item2);
Writer.WriteUnicode(extension.Item3); Writer.AutoWriteUnicode(extension.Item3);
Writer.WriteInt32(extension.Item4); Writer.WriteInt32(extension.Item4);
Writer.WriteBytes(extension.Item5); Writer.WriteInt16((short) (extension.Item5.Length-1));
Writer.Skip(1);
Writer.WriteInt8(0x80);
Writer.Skip(2);
Writer.WriteUnicode(extension.Item5, false);
} }
@ -376,15 +380,15 @@ namespace CTFAK.MMFParser.MFA
} }
var extCount = Reader.ReadInt32(); var extCount = Reader.ReadInt32();
Extensions = new List<Tuple<int, string, string, int, byte[]>>(); Extensions = new List<Tuple<int, string, string, int, string>>();
for (int i = 0; i < extCount; i++) //extensions for (int i = 0; i < extCount; i++) //extensions
{ {
var handle = Reader.ReadInt32(); var handle = Reader.ReadInt32();
var filename = Helper.AutoReadUnicode(Reader); var filename = Helper.AutoReadUnicode(Reader);
var name = Helper.AutoReadUnicode(Reader); var name = Helper.AutoReadUnicode(Reader);
var magic = Reader.ReadInt32(); var magic = Reader.ReadInt32();
var data = Reader.ReadBytes(Reader.ReadInt32()); var subType = Reader.ReadWideString(Reader.ReadInt32());
var tuple = new Tuple<int, string, string, int, byte[]>(handle, filename, name, magic, data); var tuple = new Tuple<int, string, string, int, string>(handle, filename, name, magic, subType);
Extensions.Add(tuple); Extensions.Add(tuple);
} }

@ -59,8 +59,8 @@ namespace CTFAK.MMFParser.Translation
public static void ReadTestMFA() public static void ReadTestMFA()
{ {
var outputPath = Path.Combine(Path.GetDirectoryName(@"C:\Users\ivani\Desktop\CTFResearch\284final.mfa"), "decompiled.mfa"); var outputPath = Path.Combine(Path.GetDirectoryName(TemplatePath), "decompiled.mfa");
var mfaReader = new ByteReader(@"C:\Users\ivani\Desktop\CTFResearch\284final.mfa", FileMode.Open); var mfaReader = new ByteReader(TemplatePath, FileMode.Open);
var template = new MFA.MFA(mfaReader); var template = new MFA.MFA(mfaReader);
Settings.DoMFA = true; Settings.DoMFA = true;
template.Read(); template.Read();

@ -113,10 +113,11 @@ namespace CTFAK.MMFParser.Translation
else else
{ {
var itemLoader = (ObjectCommon) item.Properties.Loader; var itemLoader = (ObjectCommon) item.Properties.Loader;
Logger.Log("Translating Object: "+itemLoader.Parent.Name);
//CommonSection //CommonSection
var newObject = new ObjectLoader(null); var newObject = new ObjectLoader(null);
newObject.ObjectFlags = (int) itemLoader.Flags.flag; newObject.ObjectFlags = (int) (itemLoader?.Flags?.flag ?? 820);
newObject.NewObjectFlags =(int) itemLoader.NewFlags.flag; newObject.NewObjectFlags =(int) (itemLoader?.NewFlags?.flag ?? 8);
newObject.BackgroundColor = Color.FromArgb(0x0, 0xff, 0xff, 0xff); newObject.BackgroundColor = Color.FromArgb(0x0, 0xff, 0xff, 0xff);
//newLoader.Qualifiers; //newLoader.Qualifiers;
newObject.Strings = ConvertStrings(itemLoader.Strings); newObject.Strings = ConvertStrings(itemLoader.Strings);
@ -215,10 +216,10 @@ namespace CTFAK.MMFParser.Translation
Extension ext = null; Extension ext = null;
foreach (var testExt in exts.Items) foreach (var testExt in exts.Items)
{ {
if (testExt.Handle == 1) ext = testExt; if (testExt.Handle==item.ObjectType-32) ext = testExt;
} }
newExt.ExtensionType = -1; newExt.ExtensionType = -1;
newExt.ExtensionName = ext.Name; newExt.ExtensionName = "";
newExt.Filename = $"{ext.Name}.mfx"; newExt.Filename = $"{ext.Name}.mfx";
newExt.Magic = (uint) ext.MagicNumber; newExt.Magic = (uint) ext.MagicNumber;
newExt.SubType = ext.SubType; newExt.SubType = ext.SubType;
@ -315,7 +316,7 @@ namespace CTFAK.MMFParser.Translation
mfa.Frames.Clear(); mfa.Frames.Clear();
foreach (Frame frame in game.Frames) foreach (Frame frame in game.Frames)
{ {
if (frame.Name != "title") continue; // if (frame.Name != "title") continue;
var newFrame = new MFA.Loaders.Frame(null); var newFrame = new MFA.Loaders.Frame(null);
//FrameInfo //FrameInfo
newFrame.Handle = game.Frames.IndexOf(frame); newFrame.Handle = game.Frames.IndexOf(frame);
@ -377,8 +378,8 @@ namespace CTFAK.MMFParser.Translation
{ {
frameItem = FrameItems[instance.ObjectInfo]; frameItem = FrameItems[instance.ObjectInfo];
// if (frameItem.ObjectType >= 32) break;
newFrameItems.Add(frameItem); if(!newFrameItems.Contains(frameItem)) newFrameItems.Add(frameItem);
var newInstance = new FrameInstance((ByteReader) null); var newInstance = new FrameInstance((ByteReader) null);
newInstance.X = instance.X; newInstance.X = instance.X;
newInstance.Y = instance.Y; newInstance.Y = instance.Y;
@ -389,7 +390,8 @@ namespace CTFAK.MMFParser.Translation
newInstance.ParentHandle = 0xffffffff; newInstance.ParentHandle = 0xffffffff;
newInstance.Layer = (uint) instance.Layer; newInstance.Layer = (uint) instance.Layer;
newInstances.Add(newInstance); newInstances.Add(newInstance);
// if(i==34) break; Logger.Log($"{instance.FrameItem.Name} - {i}");
// if(i==52) break;
} }
} }

Loading…
Cancel
Save