Pame2MFA Updates and fixes

Need to fix object writing
master
1987kostya 4 years ago
parent f208257c0a
commit 2326131e3e

@ -87,7 +87,7 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Banks
item.Read(!PreloadOnly); item.Read(!PreloadOnly);
tempImages.Add(item.Handle, item); tempImages.Add(item.Handle, item);
if (SaveImages) item.Save($"{Settings.ImagePath}\\" + item.Handle.ToString() + ".png"); //if (SaveImages) item.Save($"{Settings.ImagePath}\\" + item.Handle.ToString() + ".png");
OnImageSaved?.Invoke(i,(int) NumberOfItems); OnImageSaved?.Invoke(i,(int) NumberOfItems);

@ -35,7 +35,21 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders
public int Width; public int Width;
public int Height; public int Height;
public Color Background; public Color Background;
public int Flags; public BitDict Flags=new BitDict(new string[]
{
"XCoefficient",
"YCoefficient",
"DoNotSaveBackground",
"Wrap",
"Visible",
"WrapHorizontally",
"WrapVertically",
"","","","","","","","","",
"Redraw",
"ToHide",
"ToShow"
});
public int CountOfObjs; public int CountOfObjs;
int _top; int _top;
int _bottom; int _bottom;
@ -111,7 +125,7 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders
Width = Header.Width; Width = Header.Width;
Height = Header.Height; Height = Header.Height;
Background = Header.Background; Background = Header.Background;
//Flags = header.Flags; Flags.flag = Header.Flags.flag;
Objects = Chunks.GetChunk<ObjectInstances>(); Objects = Chunks.GetChunk<ObjectInstances>();
if(Objects!=null) if(Objects!=null)
{ {

@ -36,7 +36,7 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Objects
} }
); );
private BitDict flags = new BitDict(new string[] public BitDict Flags = new BitDict(new string[]
{ {
"DisplayInFront", "DisplayInFront",
"Background", "Background",
@ -61,7 +61,7 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Objects
} }
); );
private BitDict new_flags = new BitDict(new string[] public BitDict NewFlags = new BitDict(new string[]
{ {
"DoNotSaveBackground", "DoNotSaveBackground",
"SolidBackground", "SolidBackground",
@ -80,6 +80,8 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Objects
public int ExtensionPrivate; public int ExtensionPrivate;
public int ExtensionId; public int ExtensionId;
public int ExtensionVersion; public int ExtensionVersion;
public AlterableValues Values;
public AlterableStrings Strings;
public ObjectCommon(ByteReader reader) : base(reader) public ObjectCommon(ByteReader reader) : base(reader)
@ -114,7 +116,7 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Objects
_counterOffset = (short) Reader.ReadUInt16(); _counterOffset = (short) Reader.ReadUInt16();
_systemObjectOffset = (short) Reader.ReadUInt16(); _systemObjectOffset = (short) Reader.ReadUInt16();
flags.flag = Reader.ReadUInt32(); Flags.flag = Reader.ReadUInt32();
var end = Reader.Tell() + 16; var end = Reader.Tell() + 16;
Reader.Seek(end); Reader.Seek(end);
if (newobj) if (newobj)
@ -129,7 +131,7 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Objects
_valuesOffset = Reader.ReadInt16(); _valuesOffset = Reader.ReadInt16();
_stringsOffset = Reader.ReadInt16(); _stringsOffset = Reader.ReadInt16();
new_flags.flag = Reader.ReadUInt16(); NewFlags.flag = Reader.ReadUInt16();
preferences.flag = Reader.ReadUInt16(); preferences.flag = Reader.ReadUInt16();
byte[] identifier = Reader.ReadFourCc(); byte[] identifier = Reader.ReadFourCc();
BackColor = Reader.ReadColor(); BackColor = Reader.ReadColor();
@ -148,8 +150,8 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Objects
if (_valuesOffset != 0) if (_valuesOffset != 0)
{ {
Reader.Seek(currentPosition + _valuesOffset); Reader.Seek(currentPosition + _valuesOffset);
AlterableValues values = new AlterableValues(Reader); Values = new AlterableValues(Reader);
values.Read(); Values.Read();
// Console.WriteLine("Values done"); // Console.WriteLine("Values done");
} }
@ -157,8 +159,8 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Objects
if (_stringsOffset != 0) if (_stringsOffset != 0)
{ {
Reader.Seek(currentPosition + _stringsOffset); Reader.Seek(currentPosition + _stringsOffset);
AlterableStrings strings = new AlterableStrings(Reader); Strings = new AlterableStrings(Reader);
strings.Read(); Strings.Read();
// Console.WriteLine("Strings done"); // Console.WriteLine("Strings done");
} }

@ -6,6 +6,8 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Objects
{ {
public class AlterableValues:ChunkLoader public class AlterableValues:ChunkLoader
{ {
public List<int> Items;
public AlterableValues(ByteReader reader) : base(reader) public AlterableValues(ByteReader reader) : base(reader)
{ {
} }
@ -16,7 +18,7 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Objects
public override void Read() public override void Read()
{ {
var items = new List<int>(); Items = new List<int>();
var count = Reader.ReadUInt16(); var count = Reader.ReadUInt16();
Console.WriteLine(count); Console.WriteLine(count);
@ -24,7 +26,7 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Objects
{ {
var item = Reader.ReadInt32(); var item = Reader.ReadInt32();
items.Add(item); Items.Add(item);
Console.WriteLine("Found Value: "+item); Console.WriteLine("Found Value: "+item);
} }
@ -42,6 +44,8 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Objects
} }
public class AlterableStrings:ChunkLoader public class AlterableStrings:ChunkLoader
{ {
public List<string> Items;
public AlterableStrings(ByteReader reader) : base(reader) public AlterableStrings(ByteReader reader) : base(reader)
{ {
} }
@ -52,14 +56,14 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Objects
public override void Read() public override void Read()
{ {
var items = new List<string>(); Items = new List<string>();
var count = Reader.ReadUInt16(); var count = Reader.ReadUInt16();
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)
{ {
var item = Reader.ReadWideString(); var item = Reader.ReadWideString();
items.Add(item); Items.Add(item);
Console.WriteLine("Found String: "+item); Console.WriteLine("Found String: "+item);
} }

@ -179,132 +179,110 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
public override void Write(ByteWriter Writer) public override void Write(ByteWriter Writer)
{ {
//Writer.WriteBytes(Saved);
//return; Writer.WriteUInt16(Version);
using (ByteWriter debug = new ByteWriter(new MemoryStream())) Writer.WriteInt16((short) FrameType);
if (Items != null)
{ {
/*Console.WriteLine("Writing EventData");
Writer.WriteAscii(EventData);
//Writer = new ByteWriter(new MemoryStream()); ByteWriter newWriter = new ByteWriter(new MemoryStream());
Writer.WriteUInt16(Version); foreach (EventGroup eventGroup in Items)
Writer.WriteInt16((short) FrameType);
// Writer.WriteBytes(new byte[] {0x04, 0x04, 0x00, 0x00});
// if (Items != null)
// {
// Console.WriteLine("Writing EventData");
// Writer.WriteAscii(EventData);
//
// ByteWriter newWriter = new ByteWriter(new MemoryStream());
// foreach (EventGroup eventGroup in Items)
// {
// eventGroup.Write(newWriter);
// }
//
// Writer.WriteWriter(newWriter);
// }
// if (Objects != null)
// {
// Console.WriteLine("Writing EventObjects");
// Writer.WriteAscii(ObjectData);
// Writer.WriteUInt32((uint) Objects.Count);
// foreach (EventObject eventObject in Objects)
// {
// eventObject.Write(Writer);
// }
// }
if (ObjectTypes != null)
{ {
Console.WriteLine("Writing ObjectTypes"); eventGroup.Write(newWriter);
Writer.WriteAscii(ObjectListData); }
Writer.WriteInt16(-1);
Writer.WriteInt16((short) ObjectTypes.Count);
foreach (ushort objectType in ObjectTypes)
{
Writer.WriteUInt16(objectType);
}
foreach (ushort objectHandle in ObjectHandles)
{
Writer.WriteUInt16(objectHandle);
}
foreach (ushort objectFlag in ObjectFlags) Writer.WriteWriter(newWriter);*/
{ }
Writer.WriteUInt16(objectFlag);
}
Writer.WriteUInt16((ushort) Folders.Count); if (Objects != null)
foreach (string folder in Folders) {
{ Console.WriteLine("Writing EventObjects");
Writer.AutoWriteUnicode(folder); Writer.WriteAscii(ObjectData);
} Writer.WriteUInt32((uint) Objects.Count);
foreach (EventObject eventObject in Objects)
{
eventObject.Write(Writer);
} }
if (X != 0) }
if (ObjectTypes != null)
{
Console.WriteLine("Writing ObjectTypes");
Writer.WriteAscii(ObjectListData);
Writer.WriteInt16(-1);
Writer.WriteInt16((short) ObjectTypes.Count);
foreach (ushort objectType in ObjectTypes)
{ {
Console.WriteLine("Writing X"); Writer.WriteUInt16(objectType);
Writer.WriteAscii(EditorPositionData);
Writer.WriteInt16(1);
Writer.WriteInt32((int) X);
Writer.WriteInt32((int) Y);
Writer.WriteUInt32(CaretType);
Writer.WriteUInt32(CaretX);
Writer.WriteUInt32(CaretY);
} }
if (LineY != 0)
foreach (ushort objectHandle in ObjectHandles)
{ {
Console.WriteLine("Writing LineY"); Writer.WriteUInt16(objectHandle);
Writer.WriteAscii(EditorLineData);
Writer.WriteInt16(1);
Writer.WriteUInt32(LineY);
Writer.WriteUInt32(LineItemType);
Writer.WriteUInt32(EventLine);
Writer.WriteUInt32(EventLineY);
} }
Console.WriteLine("Writing EventEditorData");
Writer.WriteAscii(EventEditorData);
Writer.WriteInt32(EditorDataUnk);
Writer.WriteInt16((short) ConditionWidth);
Writer.WriteInt16((short) ObjectHeight);
Writer.Skip(12);
//Writer.Skip((4 + 2 * 2 + 4 * 3)-4);
Writer.WriteAscii(EventEnd);
//TODO: Fix commented part
//
//
// if (Comments != null)
// {
// Console.WriteLine("Writing Comments");
// Writer.WriteAscii(CommentData);
// foreach (Comment comment in Comments)
// {
// comment.Write(Writer);
// }
// }
foreach (ushort objectFlag in ObjectFlags)
{
Writer.WriteUInt16(objectFlag);
}
Writer.WriteUInt16((ushort) Folders.Count);
foreach (string folder in Folders)
{
Writer.AutoWriteUnicode(folder);
}
}
//if (X != 0)
{
Console.WriteLine("Writing X");
Writer.WriteAscii(EditorPositionData);
Writer.WriteInt16(1);
Writer.WriteInt32((int) X);
Writer.WriteInt32((int) Y);
Writer.WriteUInt32(CaretType);
Writer.WriteUInt32(CaretX);
Writer.WriteUInt32(CaretY);
}
//if (LineY != 0)
{
Console.WriteLine("Writing LineY");
Writer.WriteAscii(EditorLineData);
Writer.WriteInt16(1);
Writer.WriteUInt32(LineY);
Writer.WriteUInt32(LineItemType);
Writer.WriteUInt32(EventLine);
Writer.WriteUInt32(EventLineY);
}
Console.WriteLine("Writing EventEditorData");
Writer.WriteAscii(EventEditorData);
Writer.WriteInt32(EditorDataUnk);
Writer.WriteInt16((short) ConditionWidth);
Writer.WriteInt16((short) ObjectHeight);
Writer.Skip(12);
//Writer.Skip((4 + 2 * 2 + 4 * 3)-4);
var data = ((MemoryStream) Writer.BaseStream).GetBuffer();
Array.Resize(ref data,(int) Writer.Size());
File.WriteAllBytes("MyEvents.bin",data);
}
Writer.WriteAscii(EventEnd);
//TODO: Fix commented part
//
//
// if (Comments != null)
// {
// Console.WriteLine("Writing Comments");
// Writer.WriteAscii(CommentData);
// foreach (Comment comment in Comments)
// {
// comment.Write(Writer);
// }
// }
} }

@ -36,8 +36,8 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
"NoGlobalEvents" "NoGlobalEvents"
}); });
public string Password; public string Password="";
public string UnkString; public string UnkString="";
public List<Color> Palette; public List<Color> Palette;
public int StampHandle; public int StampHandle;
public int ActiveLayer; public int ActiveLayer;
@ -99,37 +99,35 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
foreach (var item in Items) foreach (var item in Items)
{ {
item.Write(Writer); item.Write(Writer);
Writer.Skip(4);
var bytes = new byte[] {0x01,0x01,0x00,0x00, 0x00,0x00,0x00,0x00, 0x80,0x01,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x32,0x00, 0x00,0x00,0x32,0x00, 0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00};
Writer.WriteBytes(bytes);
} }
// Writer.WriteAscii("AA");
Writer.WriteInt32(Folders.Count); Writer.WriteInt32(Folders.Count);
foreach (var item in Folders) foreach (var item in Folders)
{ {
item.Write(Writer); item.Write(Writer);
} }
// Writer.WriteAscii("AF");
Writer.WriteInt32(Instances.Count); Writer.WriteInt32(Instances.Count);
foreach (var item in Instances) foreach (var item in Instances)
{ {
item.Write(Writer); item.Write(Writer);
} }
// Writer.WriteAscii("AI");
if (Instances != null)
{
Writer.WriteInt32(Instances.Count);
foreach (var item in Instances)
{
item.Write(Writer);
}
}
if (UnkBlocks != null) /*if (UnkBlocks != null)
{ {
Writer.WriteInt32(UnkBlocks.Count); Writer.WriteInt32(UnkBlocks.Count);
foreach (var item in UnkBlocks) foreach (var item in UnkBlocks)
{ {
Writer.WriteBytes(item); Writer.WriteBytes(item);
} }
} }*/
Events.Write(Writer); Events.Write(Writer);
Chunks.Write(Writer); Chunks.Write(Writer);
@ -215,11 +213,11 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
Instances.Add(inst); Instances.Add(inst);
} }
var unkCount = Reader.ReadInt32(); //var unkCount = Reader.ReadInt32();
for (int i = 0; i < unkCount; i++) //for (int i = 0; i < unkCount; i++)
{ //{
UnkBlocks.Add(Reader.ReadBytes(32)); // UnkBlocks.Add(Reader.ReadBytes(32));
} //}
Events = new Events(Reader); Events = new Events(Reader);
Console.WriteLine("BeforeEventsPos: " + Reader.Tell()); Console.WriteLine("BeforeEventsPos: " + Reader.Tell());

@ -1,4 +1,5 @@
using DotNetCTFDumper.MMFParser.EXE; using System;
using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.Utils; using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.MFA.Loaders namespace DotNetCTFDumper.MMFParser.MFA.Loaders
@ -31,7 +32,8 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
Flags = Reader.ReadUInt32(); Flags = Reader.ReadUInt32();
ParentType = Reader.ReadUInt32(); ParentType = Reader.ReadUInt32();
ItemHandle = Reader.ReadUInt32(); ItemHandle = Reader.ReadUInt32();
ParentHandle = Reader.ReadUInt32(); ParentHandle = (uint) Reader.ReadInt32();
Console.WriteLine($"ParentH:{ParentHandle}, ParentT: {ParentType}, Handle: {Handle}, Flags: {Flags}, ItemHandle: {ItemHandle}");
} }
public override void Write(ByteWriter Writer) public override void Write(ByteWriter Writer)
@ -43,7 +45,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
Writer.WriteUInt32(Flags); Writer.WriteUInt32(Flags);
Writer.WriteUInt32(ParentType); Writer.WriteUInt32(ParentType);
Writer.WriteUInt32(ItemHandle); Writer.WriteUInt32(ItemHandle);
Writer.WriteUInt32(ParentHandle); Writer.WriteInt32((int) ParentHandle);
} }

@ -35,19 +35,22 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
Chunks.Write(Writer); Chunks.Write(Writer);
Loader.Write(Writer); Loader.Write(Writer);
} }
public override void Print() public override void Print()
{ {
Console.WriteLine($"Name: {Name}");
} }
public override void Read() public override void Read()
{ {
ObjectType = Reader.ReadInt32(); ObjectType = Reader.ReadInt32();
Handle = Reader.ReadInt32(); Handle = Reader.ReadInt32();
Name = Helper.AutoReadUnicode(Reader); Name = Helper.AutoReadUnicode(Reader);
Console.WriteLine($"Name: {Name}");
Transparent = Reader.ReadInt32(); Transparent = Reader.ReadInt32();
InkEffect = Reader.ReadInt32(); InkEffect = Reader.ReadInt32();

@ -1,4 +1,5 @@
using System.Collections.Generic; using System;
using System.Collections.Generic;
using DotNetCTFDumper.MMFParser.EXE; using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.Utils; using DotNetCTFDumper.Utils;
@ -8,6 +9,8 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
{ {
public List<uint> Items; public List<uint> Items;
public string Name; public string Name;
public uint UnkHeader;
public uint NonFolder;
public ItemFolder(ByteReader reader) : base(reader) public ItemFolder(ByteReader reader) : base(reader)
{ {
@ -19,10 +22,11 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
public override void Read() public override void Read()
{ {
var value = Reader.ReadUInt32(); UnkHeader = Reader.ReadUInt32();
if (value == 0x70000004) Console.WriteLine("UNK HEADER: "+UnkHeader.ToString("X4"));
if (UnkHeader == 0x70000004)
{ {
Name = Helper.AutoReadUnicode(Reader); Name = Reader.AutoReadUnicode();
Items = new List<uint>(); Items = new List<uint>();
var count = Reader.ReadUInt32(); var count = Reader.ReadUInt32();
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)
@ -32,30 +36,31 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
} }
else else
{ {
Name = ""; Name = null;
Items = new List<uint>(); Items = new List<uint>();
Items.Add(Reader.ReadUInt32());
} }
} }
public override void Write(ByteWriter Writer) public override void Write(ByteWriter Writer)
{ {
if (Name.Length == 0) if (Name == null)
{ {
Writer.WriteUInt32(0x70000005); Writer.WriteInt32(0x70000005);
} }
else else
{ {
Writer.WriteUInt32(0x70000004); Writer.WriteInt32(0x70000004);
Writer.AutoWriteUnicode(Name); Writer.AutoWriteUnicode(Name);
Writer.WriteInt32(Items.Count); Writer.WriteInt32(Items.Count);
} }
foreach (var item in Items) foreach (var item in Items)
{ {
Writer.WriteUInt32(item); Writer.WriteUInt32(item);
} }
} }
public override void Print() public override void Print()

@ -8,7 +8,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
{ {
public class AnimationObject:ObjectLoader public class AnimationObject:ObjectLoader
{ {
List<Animation> _items = new List<Animation>(); public List<Animation> Items = new List<Animation>();
public override void Read() public override void Read()
{ {
base.Read(); base.Read();
@ -19,7 +19,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
{ {
var item = new Animation(Reader); var item = new Animation(Reader);
item.Read(); item.Read();
_items.Add(item); Items.Add(item);
} }
} }
@ -28,9 +28,12 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
public AnimationObject(ByteReader reader) : base(reader) { } public AnimationObject(ByteReader reader) : base(reader) { }
} }
class Animation : DataLoader
public class Animation : DataLoader
{ {
public string Name = "Animation-UNKNOWN"; public string Name = "Animation-UNKNOWN";
public List<AnimationDirection> Directions;
public override void Write(ByteWriter Writer) public override void Write(ByteWriter Writer)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
@ -45,12 +48,12 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
{ {
Name = Reader.AutoReadUnicode(); Name = Reader.AutoReadUnicode();
var directionCount = Reader.ReadInt32(); var directionCount = Reader.ReadInt32();
var directions = new List<AnimationDirection>(); Directions = new List<AnimationDirection>();
for (int i = 0; i < directionCount; i++) for (int i = 0; i < directionCount; i++)
{ {
var direction = new AnimationDirection(Reader); var direction = new AnimationDirection(Reader);
direction.Read(); direction.Read();
directions.Add(direction); Directions.Add(direction);
} }
@ -58,7 +61,8 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
} }
public Animation(ByteReader reader) : base(reader) { } public Animation(ByteReader reader) : base(reader) { }
} }
class AnimationDirection : DataLoader
public class AnimationDirection : DataLoader
{ {
public string Name = "Animation-UNKNOWN"; public string Name = "Animation-UNKNOWN";
public int Index; public int Index;

@ -36,11 +36,12 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
class Behaviour : DataLoader class Behaviour : DataLoader
{ {
public string Name = "ERROR"; public string Name = "ERROR";
public ByteReader Data; public byte[] Data;
public override void Write(ByteWriter Writer) public override void Write(ByteWriter Writer)
{ {
Writer.AutoWriteUnicode(Name); Writer.AutoWriteUnicode(Name);
Writer.WriteBytes(Data.ReadBytes((int) Data.Size())); Writer.WriteUInt32((uint) Data.Length);
Writer.WriteBytes(Data);
} }
public override void Print() public override void Print()
@ -52,7 +53,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
{ {
Name = Reader.AutoReadUnicode(); Name = Reader.AutoReadUnicode();
Data = new ByteReader(Reader.ReadBytes(Reader.ReadInt32())); Data = Reader.ReadBytes((int) Reader.ReadUInt32());
} }
public Behaviour(ByteReader reader) : base(reader) { } public Behaviour(ByteReader reader) : base(reader) { }

@ -47,7 +47,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
public int Identifier; public int Identifier;
public short Player; public short Player;
public short Type; public short Type;
public byte MovingAtStart; public byte MovingAtStart=1;
public int DirectionAtStart; public int DirectionAtStart;
public int DataSize; public int DataSize;
public byte[] extData; public byte[] extData;
@ -66,7 +66,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
newWriter.WriteInt8(MovingAtStart); newWriter.WriteInt8(MovingAtStart);
newWriter.Skip(3); newWriter.Skip(3);
newWriter.WriteInt32(DirectionAtStart); newWriter.WriteInt32(DirectionAtStart);
newWriter.WriteBytes(extData); // newWriter.WriteBytes(extData);
} }
Writer.WriteWriter(newWriter); Writer.WriteWriter(newWriter);
@ -97,6 +97,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
MovingAtStart = Reader.ReadByte(); MovingAtStart = Reader.ReadByte();
Reader.Skip(3); Reader.Skip(3);
DirectionAtStart = Reader.ReadInt32(); DirectionAtStart = Reader.ReadInt32();
Console.WriteLine($"Player: {Player}, Type: {Type}, DirectionAtStart: {DirectionAtStart}, Identifier: {Identifier}");
extData = Reader.ReadBytes(DataSize-12); extData = Reader.ReadBytes(DataSize-12);
//ONLY STATIC MOVEMENT IS SUPPORTED RN //ONLY STATIC MOVEMENT IS SUPPORTED RN
//TODO:Movement Types //TODO:Movement Types

@ -38,6 +38,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
Strings.Write(Writer); Strings.Write(Writer);
Movements.Write(Writer); Movements.Write(Writer);
Behaviours.Write(Writer); Behaviours.Write(Writer);
Writer.WriteInt8(0);//FadeIn Writer.WriteInt8(0);//FadeIn
Writer.WriteInt8(0);//FadeOut Writer.WriteInt8(0);//FadeOut

@ -252,6 +252,7 @@ namespace DotNetCTFDumper.MMFParser.MFA
Writer.WriteUInt32((uint) (startPos+newWriter.Tell()+4)); Writer.WriteUInt32((uint) (startPos+newWriter.Tell()+4));
Writer.WriteWriter(newWriter); Writer.WriteWriter(newWriter);
Chunks.Write(Writer); Chunks.Write(Writer);
Console.WriteLine("Writing done");

@ -7,8 +7,8 @@ namespace DotNetCTFDumper.MMFParser.Translation
{ {
public static class MFAGenerator public static class MFAGenerator
{ {
public static readonly string TemplatePath = @"C:\Users\MED45\Downloads\OneObjOneFrame.mfa"; // public static readonly string TemplatePath = @"C:\Users\MED45\Downloads\OneObjOneFrame.mfa";
// public static readonly string TemplatePath = @"C:\Users\ivani\Desktop\CTFResearch\OneObjOneFrame.mfa"; public static readonly string TemplatePath = @"C:\Users\ivani\Downloads\OneObjOneFrame.mfa";
public static MFA.MFA BuildMFA() public static MFA.MFA BuildMFA()
{ {

@ -1,6 +1,17 @@
using System.Collections.Generic; using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.UI.WebControls.Expressions;
using System.Xml.Schema;
using DotNetCTFDumper.MMFParser.EXE; using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.MMFParser.EXE.Loaders;
using DotNetCTFDumper.MMFParser.EXE.Loaders.Objects;
using DotNetCTFDumper.MMFParser.MFA.Loaders;
using DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks;
using DotNetCTFDumper.Utils; using DotNetCTFDumper.Utils;
using Animation = DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks.Animation;
using AnimationDirection = DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks.AnimationDirection;
using ChunkList = DotNetCTFDumper.MMFParser.MFA.Loaders.ChunkList;
using Frame = DotNetCTFDumper.MMFParser.EXE.Loaders.Frame; using Frame = DotNetCTFDumper.MMFParser.EXE.Loaders.Frame;
using Layer = DotNetCTFDumper.MMFParser.MFA.Loaders.Layer; using Layer = DotNetCTFDumper.MMFParser.MFA.Loaders.Layer;
@ -8,6 +19,7 @@ namespace DotNetCTFDumper.MMFParser.Translation
{ {
public static class Pame2Mfa public static class Pame2Mfa
{ {
public static Dictionary<int, FrameItem> FrameItems;
public static event Program.DumperEvent TranslatingFrame; public static event Program.DumperEvent TranslatingFrame;
public static void Translate(ref MFA.MFA mfa, GameData game) public static void Translate(ref MFA.MFA mfa, GameData game)
@ -22,20 +34,20 @@ namespace DotNetCTFDumper.MMFParser.Translation
mfa.Path = game.EditorFilename; mfa.Path = game.EditorFilename;
//mfa.Stamp = wtf; //mfa.Stamp = wtf;
/*if (game.Fonts != null) mfa.Fonts = game.Fonts; if (game.Fonts != null) mfa.Fonts = game.Fonts;
mfa.Sounds = game.Sounds; //mfa.Sounds = game.Sounds;
foreach (var item in mfa.Sounds.Items) //foreach (var item in mfa.Sounds.Items)
{ //{
item.IsCompressed = false; // item.IsCompressed = false;
} //}
mfa.Music = game.Music; mfa.Music = game.Music;
mfa.Images.Items = game.Images.Images; mfa.Images.Items = game.Images.Images;
foreach (var key in mfa.Images.Items.Keys) // foreach (var key in mfa.Images.Items.Keys)
{ // {
mfa.Images.Items[key].Debug = true; // mfa.Images.Items[key].Debug = true;
} // }
*/
mfa.Author = game.Author ?? "Kostya"; mfa.Author = game.Author ?? "Kostya";
mfa.Copyright = game.Copyright ??"CTFAN Team"; mfa.Copyright = game.Copyright ??"CTFAN Team";
mfa.Company = "CTFAN Team"; mfa.Company = "CTFAN Team";
@ -60,14 +72,220 @@ namespace DotNetCTFDumper.MMFParser.Translation
mfa.Aboutbox = game.AboutText?.Length > 0 mfa.Aboutbox = game.AboutText?.Length > 0
? game?.AboutText ? game?.AboutText
: "This game was decompiled with " + Settings.DumperVersion; : "This game was decompiled with " + Settings.DumperVersion;
//Object Section
FrameItems = new Dictionary<int,FrameItem>();
for (int i = 0; i < game.Frameitems.ItemDict.Keys.Count; i++)
{
var key = game.Frameitems.ItemDict.Keys.ToArray()[i];
var item = game.Frameitems.ItemDict[key];
if (item.ObjectType == 2)
{
var newItem = new FrameItem(null);
newItem.Name = item.Name;
newItem.ObjectType = item.ObjectType;
newItem.Handle = item.Handle;
newItem.Transparent = item.Transparent ? 1:0;
newItem.InkEffect = item.InkEffect;
newItem.InkEffectParameter = item.InkEffectValue;
newItem.AntiAliasing = item.Antialias ? 1 : 0;
newItem.Flags = (int) item.Flags;
newItem.Chunks=new ChunkList(null);
var itemLoader = (ObjectCommon)item.Properties.Loader;
//Only actives
//TODO:Other types of objects
var newLoader = new Active(null);
newLoader.ObjectFlags = (int) itemLoader.Flags.flag;
newLoader.NewObjectFlags = (int) itemLoader.NewFlags.flag;
newLoader.BackgroundColor = itemLoader.BackColor;
//newLoader.Qualifiers;
newLoader.Strings = ConvertStrings(itemLoader.Strings);
newLoader.Values = ConvertValue(itemLoader.Values);
newLoader.Movements=new Movements(null);
var testMovement = new Movement(null);
testMovement.Name = "New Movement";
testMovement.Extension = "";
newLoader.Movements.Items.Add(testMovement);
newLoader.Behaviours=new Behaviours(null);
//TODO: Transitions
if (itemLoader.Animations != null)
{
var animHeader = itemLoader.Animations;
for (int j = 0; j < animHeader.AnimationDict.Count; j++)
{
var newAnimation = new Animation(null);
var newDirections = new List<AnimationDirection>();
EXE.Loaders.Objects.Animation animation = null;
try
{
animation = animHeader.AnimationDict[0];
}
catch (Exception e)
{
Console.WriteLine(e);
//throw;
}
if (animation != null)
{
for (int n = 0; n < 1; n++)
{
var direction = animation.DirectionDict.ToArray()[n].Value;
var newDirection = new AnimationDirection(null);
newDirection.MinSpeed = direction.MinSpeed;
newDirection.MaxSpeed = direction.MaxSpeed;
newDirection.Index = n;
newDirection.Repeat = direction.Repeat;
newDirection.BackTo = direction.BackTo;
newDirection.Frames = direction.Frames;
newDirections.Add(newDirection);
}
newAnimation.Directions = newDirections;
}
newLoader.Items.Add(newAnimation);
}
}
newItem.Loader = newLoader;
try
{
FrameItems.Add(newItem.Handle,newItem);
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
}
}
mfa.Frames.Clear(); mfa.Frames.Clear();
foreach (Frame gameFrame in game.Frames) foreach (Frame frame in game.Frames)
{ {
var mfaFrame = ConvertFrame(gameFrame); var newFrame = new MFA.Loaders.Frame(null);
mfaFrame.Handle = game.Frames.IndexOf(gameFrame); //FrameInfo
mfa.Frames.Add(mfaFrame); newFrame.Handle = game.Frames.IndexOf(frame);
newFrame.Name = frame.Name;
newFrame.SizeX = frame.Width;
newFrame.SizeY = frame.Height;
newFrame.Background = frame.Background;
newFrame.FadeIn = frame.FadeIn!=null? ConvertTransition(frame.FadeIn):null;
newFrame.FadeOut = frame.FadeOut!=null? ConvertTransition(frame.FadeOut):null;
var mfaFlags = newFrame.Flags;
var originalFlags = frame.Flags;
mfaFlags["GrabDesktop"] = originalFlags["GrabDesktop"];
mfaFlags["KeepDisplay"] = originalFlags["KeepDisplay"];
mfaFlags["BackgroundCollisions"] = originalFlags["TotalCollisionMask"];
mfaFlags["ResizeToScreen"] = originalFlags["ResizeAtStart"];
mfaFlags["ForceLoadOnCall"] = originalFlags["ForceLoadOnCall"];
mfaFlags["NoDisplaySurface"] = false;
mfaFlags["TimerBasedMovements"] = originalFlags["TimedMovements"];
newFrame.MaxObjects = frame.Events?.MaxObjects ?? 10000;
newFrame.Password = "";
newFrame.LastViewedX = 320;
newFrame.LastViewedY = 240;
newFrame.Palette = frame.Palette.Items;
newFrame.StampHandle = 12;
newFrame.ActiveLayer = 0;
//LayerInfo
newFrame.Layers=new List<Layer>();
foreach (EXE.Loaders.Layer layer in frame.Layers.Items)
{
var newLayer = new Layer(null);
newLayer.Name = layer.Name;
var layerFlags = layer.Flags;
newLayer.Flags["HideAtStart"] = originalFlags["ToHide"];
newLayer.Flags["Visible"] = true;
newLayer.Flags["NoBackground"] = originalFlags["DoNotSaveBackground"];
newLayer.Flags["WrapHorizontally"] = originalFlags["WrapHorizontally"];
newLayer.Flags["WrapVertically"] = originalFlags["WrapVertically"];
newLayer.XCoefficient = layer.XCoeff;
newLayer.YCoefficient = layer.YCoeff;
newFrame.Layers.Add(newLayer);
}
var newFrameItems = new List<FrameItem>();
var newInstances = new List<FrameInstance>();
if (frame.Objects != null)
{
for (int i = 0; i < frame.Objects.Items.Count; i++)
{
var instance = frame.Objects.Items[i];
if (instance.FrameItem.ObjectType == 2)
{
FrameItem frameItem = null;
try
{
frameItem = FrameItems[instance.ObjectInfo];
}
catch{}
if(frameItem!=null) newFrameItems.Add(frameItem);
var newInstance = new FrameInstance((ByteReader) null);
newInstance.X = instance.X;
newInstance.Y = instance.Y;
newInstance.Handle = i;
newInstance.Flags = 8;
newInstance.ParentType = (uint) instance.ParentType;
newInstance.ItemHandle = instance.ObjectInfo;
newInstance.ParentHandle = (uint) instance.ParentHandle;
newInstance.Layer = (uint)instance.Layer;
newInstances.Add(newInstance);
}
}
}
newFrame.Items = newFrameItems;
newFrame.Instances = newInstances;
newFrame.Folders=new List<ItemFolder>();
foreach (FrameItem newFrameItem in newFrame.Items)
{
var newFolder = new ItemFolder((ByteReader) null);
newFolder.Items=new List<uint>() {(uint) newFrameItem.Handle};
newFrame.Folders.Add(newFolder);
}
//EventInfo
newFrame.Events = MFA.MFA.emptyEvents;
foreach (var item in newFrame.Items)
{
var newObject = new EventObject((ByteReader) null);
newObject.Handle = (uint) item.Handle;
newObject.Name = item.Name;
newObject.TypeName = "";
newObject.ItemType = (ushort) item.ObjectType;
newObject.ObjectType = 1;
newObject.Flags = 0;
newObject.ItemHandle = (uint) item.Handle;
newObject.InstanceHandle = 0xFFFFFFFF;
//newFrame.Events.Objects.Add(newObject);
}
newFrame.Chunks = new ChunkList(null);
mfa.Frames.Add(newFrame);
} }
} }
public static MFA.Loaders.Transition ConvertTransition(EXE.Loaders.Transition gameTrans) public static MFA.Loaders.Transition ConvertTransition(EXE.Loaders.Transition gameTrans)
@ -85,52 +303,43 @@ namespace DotNetCTFDumper.MMFParser.Translation
} }
public static MFA.Loaders.Frame ConvertFrame(EXE.Loaders.Frame gameFrame) public static ValueList ConvertValue(AlterableValues values)
{ {
MFA.Loaders.Frame mfaFrame = new MFA.Loaders.Frame(null); var alterables = new ValueList(null);
TranslatingFrame?.Invoke(gameFrame.Name); if (values != null)
mfaFrame.Name = gameFrame.Name;
mfaFrame.SizeX = gameFrame.Width;
mfaFrame.SizeY = gameFrame.Height;
mfaFrame.Background = gameFrame.Background;
if (gameFrame.FadeIn != null)mfaFrame.FadeIn = ConvertTransition(gameFrame.FadeIn);
if (gameFrame.FadeOut != null)mfaFrame.FadeOut = ConvertTransition(gameFrame.FadeOut);
//TODO:Flags
mfaFrame.MaxObjects = gameFrame.Events?.MaxObjects ?? 10000;
mfaFrame.Password = gameFrame?.Password ?? "";
mfaFrame.LastViewedX = 320;
mfaFrame.LastViewedY = 240;
mfaFrame.Palette = gameFrame.Palette.Items;
mfaFrame.StampHandle = 12;
mfaFrame.ActiveLayer = 0;
mfaFrame.Layers = new List<Layer>();
foreach (EXE.Loaders.Layer gameLayer in gameFrame.Layers.Items)
{ {
Layer mfaLayer = new Layer(null) for (int i = 0; i < values.Items.Count; i++)
{ {
Name = gameLayer.Name, var item = values.Items[i];
Flags = var newValue = new ValueItem(null);
{ newValue.Name = $"Alterable Value {i+1}";
["HideAtStart"] = gameLayer.Flags["ToHide"], newValue.Value = item;
["Visible"] = true, alterables.Items.Add(newValue);
["NoBackground"] = gameLayer.Flags["DoNotSaveBackground"], }
["WrapHorizontally"] = gameLayer.Flags["WrapHorizontally"],
["WrapVertically"] = gameLayer.Flags["WrapVertically"]
},
XCoefficient = gameLayer.XCoeff,
YCoefficient = gameLayer.YCoeff
};
mfaFrame.Layers.Add(mfaLayer);
break;
//TODO: Fix layers
} }
mfaFrame.Events = MFA.MFA.emptyEvents;
mfaFrame.Chunks = MFA.MFA.emptyFrameChunks; return alterables;
return mfaFrame;
} }
public static ValueList ConvertStrings(AlterableStrings values)
{
var alterables = new ValueList(null);
if (values != null)
{
for (int i = 0; i < values.Items.Count; i++)
{
var item = values.Items[i];
var newValue = new ValueItem(null);
newValue.Name = $"Alterable String {i+1}";
newValue.Value = item;
alterables.Items.Add(newValue);
}
}
return alterables;
}
} }

@ -22,8 +22,8 @@ namespace DotNetCTFDumper
var handle = Helper.GetConsoleWindow(); var handle = Helper.GetConsoleWindow();
Helper.ShowWindow(handle, Helper.SW_HIDE); Helper.ShowWindow(handle, Helper.SW_HIDE);
InitNativeLibrary(); InitNativeLibrary();
MFAGenerator.ReadTestMFA(); // MFAGenerator.ReadTestMFA();
Environment.Exit(0); // Environment.Exit(0);
var path = ""; var path = "";
var verbose = false; var verbose = false;

Loading…
Cancel
Save