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);
}
Logger.Log($"{Parent.Name} - {ExtensionId}");
}
if (_counterOffset > 0)

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

@ -8,6 +8,8 @@ namespace CTFAK.MMFParser.MFA.Loaders.mfachunks
public class AnimationObject:ObjectLoader
{
public Dictionary<int,Animation> Items = new Dictionary<int,Animation>();
public bool _isExt;
public override void 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)
{
base.Write(Writer);
Writer.WriteInt8(1);
Writer.WriteUInt32((uint) Items.Count);
foreach (Animation animation in Items.Values)
if (_isExt)
{
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 ExtensionPrivate;
public byte[] ExtensionData;
private byte[] _unk;
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 dataSize = newReader.ReadInt32() - 20;
newReader.Skip(4);
_unk = newReader.ReadBytes(4);
ExtensionVersion = newReader.ReadInt32();
ExtensionId = newReader.ReadInt32();
ExtensionPrivate = newReader.ReadInt32();
@ -42,6 +43,7 @@ namespace CTFAK.MMFParser.MFA.Loaders.mfachunks
public override void Write(ByteWriter Writer)
{
_isExt = true;
base.Write(Writer);
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(0);
Writer.WriteInt32(-1);
Writer.WriteInt32(ExtensionVersion);
Writer.WriteInt32(ExtensionId);
Writer.WriteInt32(ExtensionPrivate);

@ -111,7 +111,7 @@ namespace CTFAK.MMFParser.MFA
private int QualCount;
public Controls Controls;
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<Frame> Frames;
public ChunkList Chunks;
@ -237,10 +237,14 @@ namespace CTFAK.MMFParser.MFA
foreach(var extension in Extensions)
{
Writer.WriteInt32(extension.Item1);
Writer.WriteUnicode(extension.Item2);
Writer.WriteUnicode(extension.Item3);
Writer.AutoWriteUnicode(extension.Item2);
Writer.AutoWriteUnicode(extension.Item3);
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();
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
{
var handle = Reader.ReadInt32();
var filename = Helper.AutoReadUnicode(Reader);
var name = Helper.AutoReadUnicode(Reader);
var magic = Reader.ReadInt32();
var data = Reader.ReadBytes(Reader.ReadInt32());
var tuple = new Tuple<int, string, string, int, byte[]>(handle, filename, name, magic, data);
var subType = Reader.ReadWideString(Reader.ReadInt32());
var tuple = new Tuple<int, string, string, int, string>(handle, filename, name, magic, subType);
Extensions.Add(tuple);
}

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

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

Loading…
Cancel
Save