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);
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);

@ -35,7 +35,21 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders
public int Width;
public int Height;
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;
int _top;
int _bottom;
@ -111,7 +125,7 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders
Width = Header.Width;
Height = Header.Height;
Background = Header.Background;
//Flags = header.Flags;
Flags.flag = Header.Flags.flag;
Objects = Chunks.GetChunk<ObjectInstances>();
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",
"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",
"SolidBackground",
@ -80,6 +80,8 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Objects
public int ExtensionPrivate;
public int ExtensionId;
public int ExtensionVersion;
public AlterableValues Values;
public AlterableStrings Strings;
public ObjectCommon(ByteReader reader) : base(reader)
@ -114,7 +116,7 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Objects
_counterOffset = (short) Reader.ReadUInt16();
_systemObjectOffset = (short) Reader.ReadUInt16();
flags.flag = Reader.ReadUInt32();
Flags.flag = Reader.ReadUInt32();
var end = Reader.Tell() + 16;
Reader.Seek(end);
if (newobj)
@ -129,7 +131,7 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Objects
_valuesOffset = Reader.ReadInt16();
_stringsOffset = Reader.ReadInt16();
new_flags.flag = Reader.ReadUInt16();
NewFlags.flag = Reader.ReadUInt16();
preferences.flag = Reader.ReadUInt16();
byte[] identifier = Reader.ReadFourCc();
BackColor = Reader.ReadColor();
@ -148,8 +150,8 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Objects
if (_valuesOffset != 0)
{
Reader.Seek(currentPosition + _valuesOffset);
AlterableValues values = new AlterableValues(Reader);
values.Read();
Values = new AlterableValues(Reader);
Values.Read();
// Console.WriteLine("Values done");
}
@ -157,8 +159,8 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Objects
if (_stringsOffset != 0)
{
Reader.Seek(currentPosition + _stringsOffset);
AlterableStrings strings = new AlterableStrings(Reader);
strings.Read();
Strings = new AlterableStrings(Reader);
Strings.Read();
// Console.WriteLine("Strings done");
}

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

@ -178,40 +178,36 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
}
public override void Write(ByteWriter Writer)
{
//Writer.WriteBytes(Saved);
//return;
using (ByteWriter debug = new ByteWriter(new MemoryStream()))
{
//Writer = new ByteWriter(new MemoryStream());
Writer.WriteUInt16(Version);
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 (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");
@ -239,7 +235,8 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
Writer.AutoWriteUnicode(folder);
}
}
if (X != 0)
//if (X != 0)
{
Console.WriteLine("Writing X");
Writer.WriteAscii(EditorPositionData);
@ -250,7 +247,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
Writer.WriteUInt32(CaretX);
Writer.WriteUInt32(CaretY);
}
if (LineY != 0)
//if (LineY != 0)
{
Console.WriteLine("Writing LineY");
Writer.WriteAscii(EditorLineData);
@ -287,25 +284,6 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
// }
// }
var data = ((MemoryStream) Writer.BaseStream).GetBuffer();
Array.Resize(ref data,(int) Writer.Size());
File.WriteAllBytes("MyEvents.bin",data);
}
}
public override void Print()

@ -36,8 +36,8 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
"NoGlobalEvents"
});
public string Password;
public string UnkString;
public string Password="";
public string UnkString="";
public List<Color> Palette;
public int StampHandle;
public int ActiveLayer;
@ -99,37 +99,35 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
foreach (var item in Items)
{
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);
foreach (var item in Folders)
{
item.Write(Writer);
}
// Writer.WriteAscii("AF");
Writer.WriteInt32(Instances.Count);
foreach (var item in Instances)
{
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);
foreach (var item in UnkBlocks)
{
Writer.WriteBytes(item);
}
}
}*/
Events.Write(Writer);
Chunks.Write(Writer);
@ -215,11 +213,11 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
Instances.Add(inst);
}
var unkCount = Reader.ReadInt32();
for (int i = 0; i < unkCount; i++)
{
UnkBlocks.Add(Reader.ReadBytes(32));
}
//var unkCount = Reader.ReadInt32();
//for (int i = 0; i < unkCount; i++)
//{
// UnkBlocks.Add(Reader.ReadBytes(32));
//}
Events = new Events(Reader);
Console.WriteLine("BeforeEventsPos: " + Reader.Tell());

@ -1,4 +1,5 @@
using DotNetCTFDumper.MMFParser.EXE;
using System;
using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.MFA.Loaders
@ -31,7 +32,8 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
Flags = Reader.ReadUInt32();
ParentType = 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)
@ -43,7 +45,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
Writer.WriteUInt32(Flags);
Writer.WriteUInt32(ParentType);
Writer.WriteUInt32(ItemHandle);
Writer.WriteUInt32(ParentHandle);
Writer.WriteInt32((int) ParentHandle);
}

@ -36,18 +36,21 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
Loader.Write(Writer);
}
public override void Print()
{
Console.WriteLine($"Name: {Name}");
}
public override void Read()
{
ObjectType = Reader.ReadInt32();
Handle = Reader.ReadInt32();
Name = Helper.AutoReadUnicode(Reader);
Console.WriteLine($"Name: {Name}");
Transparent = 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.Utils;
@ -8,6 +9,8 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
{
public List<uint> Items;
public string Name;
public uint UnkHeader;
public uint NonFolder;
public ItemFolder(ByteReader reader) : base(reader)
{
@ -19,10 +22,11 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
public override void Read()
{
var value = Reader.ReadUInt32();
if (value == 0x70000004)
UnkHeader = Reader.ReadUInt32();
Console.WriteLine("UNK HEADER: "+UnkHeader.ToString("X4"));
if (UnkHeader == 0x70000004)
{
Name = Helper.AutoReadUnicode(Reader);
Name = Reader.AutoReadUnicode();
Items = new List<uint>();
var count = Reader.ReadUInt32();
for (int i = 0; i < count; i++)
@ -32,30 +36,31 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
}
else
{
Name = "";
Name = null;
Items = new List<uint>();
Items.Add(Reader.ReadUInt32());
}
}
public override void Write(ByteWriter Writer)
{
if (Name.Length == 0)
if (Name == null)
{
Writer.WriteUInt32(0x70000005);
Writer.WriteInt32(0x70000005);
}
else
{
Writer.WriteUInt32(0x70000004);
Writer.WriteInt32(0x70000004);
Writer.AutoWriteUnicode(Name);
Writer.WriteInt32(Items.Count);
}
foreach (var item in Items)
{
Writer.WriteUInt32(item);
}
}
public override void Print()

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

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

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

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

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

@ -7,8 +7,8 @@ namespace DotNetCTFDumper.MMFParser.Translation
{
public static class MFAGenerator
{
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\MED45\Downloads\OneObjOneFrame.mfa";
public static readonly string TemplatePath = @"C:\Users\ivani\Downloads\OneObjOneFrame.mfa";
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.Loaders;
using DotNetCTFDumper.MMFParser.EXE.Loaders.Objects;
using DotNetCTFDumper.MMFParser.MFA.Loaders;
using DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks;
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 Layer = DotNetCTFDumper.MMFParser.MFA.Loaders.Layer;
@ -8,6 +19,7 @@ namespace DotNetCTFDumper.MMFParser.Translation
{
public static class Pame2Mfa
{
public static Dictionary<int, FrameItem> FrameItems;
public static event Program.DumperEvent TranslatingFrame;
public static void Translate(ref MFA.MFA mfa, GameData game)
@ -22,20 +34,20 @@ namespace DotNetCTFDumper.MMFParser.Translation
mfa.Path = game.EditorFilename;
//mfa.Stamp = wtf;
/*if (game.Fonts != null) mfa.Fonts = game.Fonts;
if (game.Fonts != null) mfa.Fonts = game.Fonts;
mfa.Sounds = game.Sounds;
foreach (var item in mfa.Sounds.Items)
{
item.IsCompressed = false;
}
//mfa.Sounds = game.Sounds;
//foreach (var item in mfa.Sounds.Items)
//{
// item.IsCompressed = false;
//}
mfa.Music = game.Music;
mfa.Images.Items = game.Images.Images;
foreach (var key in mfa.Images.Items.Keys)
{
mfa.Images.Items[key].Debug = true;
}
*/
// foreach (var key in mfa.Images.Items.Keys)
// {
// mfa.Images.Items[key].Debug = true;
// }
mfa.Author = game.Author ?? "Kostya";
mfa.Copyright = game.Copyright ??"CTFAN Team";
mfa.Company = "CTFAN Team";
@ -60,14 +72,220 @@ namespace DotNetCTFDumper.MMFParser.Translation
mfa.Aboutbox = game.AboutText?.Length > 0
? game?.AboutText
: "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();
foreach (Frame gameFrame in game.Frames)
foreach (Frame frame in game.Frames)
{
var mfaFrame = ConvertFrame(gameFrame);
mfaFrame.Handle = game.Frames.IndexOf(gameFrame);
mfa.Frames.Add(mfaFrame);
var newFrame = new MFA.Loaders.Frame(null);
//FrameInfo
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)
@ -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);
TranslatingFrame?.Invoke(gameFrame.Name);
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>();
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 Value {i+1}";
newValue.Value = item;
alterables.Items.Add(newValue);
}
}
foreach (EXE.Loaders.Layer gameLayer in gameFrame.Layers.Items)
return alterables;
}
public static ValueList ConvertStrings(AlterableStrings values)
{
Layer mfaLayer = new Layer(null)
var alterables = new ValueList(null);
if (values != null)
{
Name = gameLayer.Name,
Flags =
for (int i = 0; i < values.Items.Count; i++)
{
["HideAtStart"] = gameLayer.Flags["ToHide"],
["Visible"] = true,
["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
var item = values.Items[i];
var newValue = new ValueItem(null);
newValue.Name = $"Alterable String {i+1}";
newValue.Value = item;
alterables.Items.Add(newValue);
}
mfaFrame.Events = MFA.MFA.emptyEvents;
mfaFrame.Chunks = MFA.MFA.emptyFrameChunks;
return mfaFrame;
}
return alterables;
}
}

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

Loading…
Cancel
Save