diff --git a/NetMFAPatcher/DotNetCTFDumper.csproj b/NetMFAPatcher/DotNetCTFDumper.csproj
index 79be9d8..e3c5677 100644
--- a/NetMFAPatcher/DotNetCTFDumper.csproj
+++ b/NetMFAPatcher/DotNetCTFDumper.csproj
@@ -149,6 +149,12 @@
MainForm.cs
+
+ Form
+
+
+ MFABuilderForm.cs
+
Form
@@ -156,6 +162,8 @@
PackDataForm.cs
+
+
@@ -193,14 +201,14 @@
+
-
-
+
@@ -263,6 +271,9 @@
MainForm.cs
+
+ MFABuilderForm.cs
+
PackDataForm.cs
diff --git a/NetMFAPatcher/GUI/MFABuilderForm.cs b/NetMFAPatcher/GUI/MFABuilderForm.cs
new file mode 100644
index 0000000..794fcc7
--- /dev/null
+++ b/NetMFAPatcher/GUI/MFABuilderForm.cs
@@ -0,0 +1,37 @@
+using System;
+using System.Drawing;
+using System.Linq;
+using System.Windows.Forms;
+using DotNetCTFDumper.MMFParser.Translation;
+
+namespace DotNetCTFDumper.GUI
+{
+ public partial class MFABuilderForm : Form
+ {
+ public MFABuilderForm(Color color)
+ {
+ InitializeComponent();
+ foreach (Control control in Controls)
+ {
+ control.BackColor=Color.Black;
+ control.ForeColor = color;
+ if (control is Button)
+ {
+ control.BackColor=Color.FromArgb(30,30,30);
+ }
+ }
+ Pame2Mfa.TranslatingFrame += OnFrameTranslation;
+
+ }
+
+ public void OnFrameTranslation(object name)
+ {
+ logBox.AppendText($"Translating Frame: {name}\r\n");
+ }
+
+ private void DumpButton_Click(object sender, EventArgs e)
+ {
+ MFAGenerator.BuildMFA();
+ }
+ }
+}
\ No newline at end of file
diff --git a/NetMFAPatcher/GUI/MainForm.cs b/NetMFAPatcher/GUI/MainForm.cs
index a5ca3d4..b3dab37 100644
--- a/NetMFAPatcher/GUI/MainForm.cs
+++ b/NetMFAPatcher/GUI/MainForm.cs
@@ -4,7 +4,6 @@ using System.Diagnostics;
using System.Drawing;
using System.Threading;
using System.Windows.Forms;
-using DotNetCTFDumper.MMFParser.Decompiling;
using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.MMFParser.EXE.Loaders;
using DotNetCTFDumper.MMFParser.EXE.Loaders.Banks;
@@ -291,7 +290,9 @@ namespace DotNetCTFDumper.GUI
private void MFABtn_Click(object sender, EventArgs e)
{
- MFAGenerator.BuildMFA();
+ var mfaForm = new MFABuilderForm(ColorTheme);
+ mfaForm.Show();
+
}
private void soundsButton_Click(object sender, EventArgs e)
diff --git a/NetMFAPatcher/MMFParser/EXE/ChunkList.cs b/NetMFAPatcher/MMFParser/EXE/ChunkList.cs
index 283210f..658f7fc 100644
--- a/NetMFAPatcher/MMFParser/EXE/ChunkList.cs
+++ b/NetMFAPatcher/MMFParser/EXE/ChunkList.cs
@@ -232,6 +232,12 @@ namespace DotNetCTFDumper.MMFParser.EXE
case 13112:
loader = new ObjectInstances(chunk);
break;
+ case 13115:
+ loader = new Transition(chunk);
+ break;
+ case 13116:
+ loader = new Transition(chunk);
+ break;
case 13121:
loader = new Layers(chunk);
break;
@@ -295,6 +301,24 @@ namespace DotNetCTFDumper.MMFParser.EXE
//Logger.Log($"ChunkLoader {typeof(T).Name} not found", true, ConsoleColor.Red);
return null;
}
+ public T PopChunk() where T : ChunkLoader
+ {
+ for(int i=0;i();
+ FadeOut = Chunks.PopChunk();
+
diff --git a/NetMFAPatcher/MMFParser/EXE/Loaders/Transition.cs b/NetMFAPatcher/MMFParser/EXE/Loaders/Transition.cs
new file mode 100644
index 0000000..59d41bb
--- /dev/null
+++ b/NetMFAPatcher/MMFParser/EXE/Loaders/Transition.cs
@@ -0,0 +1,56 @@
+using System;
+using System.Drawing;
+using DotNetCTFDumper.Utils;
+
+namespace DotNetCTFDumper.MMFParser.EXE.Loaders
+{
+ public class Transition:ChunkLoader
+ {
+ public string Module;
+ public string Name;
+ public int Duration;
+ public int Flags;
+ public Color Color;
+ public string ModuleFile;
+ public byte[] ParameterData;
+
+ public Transition(ByteReader reader) : base(reader)
+ {
+ }
+
+ public Transition(ChunkList.Chunk chunk) : base(chunk)
+ {
+ }
+
+ public override void Read()
+ {
+ var currentPos = Reader.Tell();
+ Module = Reader.ReadAscii(4);
+ Console.WriteLine("TransitionModule: "+Module);
+ Name = Reader.ReadAscii(4);
+ Console.WriteLine("TransitionModule: "+Name);
+ Duration = Reader.ReadInt32();
+ Flags = Reader.ReadInt32();
+ Color = Reader.ReadColor();
+ var nameOffset = Reader.ReadInt32();
+ var parameterOffset = Reader.ReadInt32();
+ var parameterSize = Reader.ReadInt32();
+ Reader.Seek(currentPos+nameOffset);
+ ModuleFile = Reader.ReadAscii();
+ Reader.Seek(currentPos+parameterOffset);
+ ParameterData = Reader.ReadBytes(parameterSize);
+
+
+ }
+
+ public override void Print(bool ext)
+ {
+ throw new System.NotImplementedException();
+ }
+
+ public override string[] GetReadableData()
+ {
+ throw new System.NotImplementedException();
+ }
+ }
+}
\ No newline at end of file
diff --git a/NetMFAPatcher/MMFParser/MFA/Decompiling/PAME2MFA.cs b/NetMFAPatcher/MMFParser/MFA/Decompiling/PAME2MFA.cs
deleted file mode 100644
index b412d87..0000000
--- a/NetMFAPatcher/MMFParser/MFA/Decompiling/PAME2MFA.cs
+++ /dev/null
@@ -1,106 +0,0 @@
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using DotNetCTFDumper.MMFParser.EXE;
-using DotNetCTFDumper.MMFParser.MFA.Loaders;
-using DotNetCTFDumper.Utils;
-using Frame = DotNetCTFDumper.MMFParser.EXE.Loaders.Frame;
-using Layer = DotNetCTFDumper.MMFParser.MFA.Loaders.Layer;
-
-namespace DotNetCTFDumper.MMFParser.Decompiling
-{
- public static class Pame2Mfa
- {
- public static void Translate(ref MFA.MFA mfa, GameData game)
- {
-
- //mfa.MfaBuild = 4;
- //mfa.Product = (int) game.ProductVersion;
- //mfa.BuildVersion = 283;
- mfa.Name = game.Name;
- mfa.LangId = 0;
- mfa.Description = $"Decompiled with {Settings.DumperVersion}";
- mfa.Path = game.EditorFilename;
-
- //mfa.Stamp = wtf;
- /*if (game.Fonts != null) mfa.Fonts = game.Fonts;
-
- 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;
- }
- */
- mfa.Author = game.Author!=null? game.Author:"Kostya";
- mfa.Copyright = game.Copyright;
- mfa.Company = "CTFAN Team";
- mfa.Version = "";
- //TODO:Binary Files
- var displaySettings = mfa.DisplayFlags;
- var graphicSettings = mfa.GraphicFlags;
- var flags = game.Header.Flags;
- var newFlags = game.Header.NewFlags;
- //TODO:Flags, no setter
- mfa.WindowX = game.Header.WindowWidth;
- mfa.WindowY = game.Header.WindowHeight;
- mfa.BorderColor = game.Header.BorderColor;
- mfa.HelpFile = "";
- mfa.VitalizePreview = new byte[]{0x0};
- mfa.InitialScore = game.Header.InitialScore;
- mfa.InitialLifes = game.Header.InitialLives;
- mfa.FrameRate = game.Header.FrameRate;
- mfa.BuildType = 0;
- mfa.BuildPath = game.TargetFilename;
- mfa.CommandLine = "";
- mfa.Aboutbox = game.AboutText?.Length > 0
- ? game?.AboutText
- : "This game was decompiled with " + Settings.DumperVersion;
- mfa.Frames.Clear();
- foreach (Frame gameFrame in game.Frames)
- {
- MFA.Loaders.Frame mfaFrame = new MFA.Loaders.Frame(null);
- mfaFrame.Handle = game.Frames.IndexOf(gameFrame);
- mfaFrame.Name = gameFrame.Name;
- mfaFrame.SizeX = gameFrame.Width;
- mfaFrame.SizeY = gameFrame.Height;
- mfaFrame.Background = gameFrame.Background;
- //TODO: Transitions
- //TODO: Flags
- mfaFrame.MaxObjects = gameFrame.Events?.MaxObjects ?? 1337;
- 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();
- mfaFrame.Layers.Add(new Layer(null){Name = "New Layer"});
-
- /*foreach (EXE.Loaders.Layer gameLayer in gameFrame.Layers.Items)
- {
- Layer mfaLayer = new Layer(null);
- mfaLayer.Name = gameLayer.Name;
- mfaLayer.Flags = (int) gameLayer.Flags;
- //TODO: Flags
- mfaLayer.XCoefficient = gameLayer.XCoeff;
- mfaLayer.YCoefficient = gameLayer.YCoeff;
- mfaFrame.Layers.Add(mfaLayer);
- }*/
- mfaFrame.Events = MFA.MFA.emptyEvents;
- mfaFrame.Chunks = MFA.MFA.emptyFrameChunks;
-
- mfa.Frames.Add(mfaFrame);
-
- }
-
-
- }
- }
-}
\ No newline at end of file
diff --git a/NetMFAPatcher/MMFParser/MFA/Loaders/Events.cs b/NetMFAPatcher/MMFParser/MFA/Loaders/Events.cs
index bb37b44..84a6ed3 100644
--- a/NetMFAPatcher/MMFParser/MFA/Loaders/Events.cs
+++ b/NetMFAPatcher/MMFParser/MFA/Loaders/Events.cs
@@ -188,7 +188,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
Writer.WriteUInt16(Version);
Writer.WriteInt16((short) FrameType);
- //Writer.WriteBytes(new byte[] {0x04, 0x04, 0x00, 0x00});
+ // Writer.WriteBytes(new byte[] {0x04, 0x04, 0x00, 0x00});
// if (Items != null)
// {
// Console.WriteLine("Writing EventData");
diff --git a/NetMFAPatcher/MMFParser/MFA/Loaders/Frame.cs b/NetMFAPatcher/MMFParser/MFA/Loaders/Frame.cs
index 57fa654..323aba8 100644
--- a/NetMFAPatcher/MMFParser/MFA/Loaders/Frame.cs
+++ b/NetMFAPatcher/MMFParser/MFA/Loaders/Frame.cs
@@ -27,6 +27,8 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
public List Layers;
public Events Events;
public ChunkList Chunks;
+ public Transition FadeIn;
+ public Transition FadeOut;
public Frame(ByteReader reader) : base(reader)
{
@@ -63,8 +65,20 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
}
//TODO: Do transitions
- Writer.WriteInt8(0);
- Writer.WriteInt8(0);
+ if (FadeIn != null)
+ {
+ Writer.WriteInt8(1);
+ FadeIn.Write(Writer);
+ }
+ else Writer.Skip(1);
+ if (FadeOut != null)
+ {
+ Writer.WriteInt8(1);
+ FadeOut.Write(Writer);
+ }
+ else Writer.Skip(1);
+ //Writer.Skip(2);
+
Writer.WriteInt32(Items.Count);
foreach (var item in Items)
@@ -132,10 +146,18 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
Layers.Add(layer);
}
- //fadein
- //fadeout
- Reader.Skip(2);
+ if (Reader.ReadByte() == 1)
+ {
+ FadeIn = new Transition(Reader);
+ FadeIn.Read();
+ }
+
+ if (Reader.ReadByte() == 1)
+ {
+ FadeOut = new Transition(Reader);
+ FadeOut.Read();
+ }
Items = new List();
var frameitemsCount = Reader.ReadInt32();
for (int i = 0; i < frameitemsCount; i++)
diff --git a/NetMFAPatcher/MMFParser/MFA/Loaders/Layer.cs b/NetMFAPatcher/MMFParser/MFA/Loaders/Layer.cs
index 73f6acb..d32a58f 100644
--- a/NetMFAPatcher/MMFParser/MFA/Loaders/Layer.cs
+++ b/NetMFAPatcher/MMFParser/MFA/Loaders/Layer.cs
@@ -9,13 +9,25 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
public string Name="ERROR";
public float XCoefficient;
public float YCoefficient;
- public int Flags;
+
+ public BitDict Flags = new BitDict(new string[]
+ {
+ "Visible",
+ "Locked",
+ "Obsolete",
+ "HideAtStart",
+ "NoBackground",
+ "WrapHorizontally",
+ "WrapVertically",
+ "PreviousEffect"
+ }
+ );
public override void Write(ByteWriter Writer)
{
Writer.AutoWriteUnicode(Name);
- Writer.WriteInt32(Flags);
+ Writer.WriteInt32((int) Flags.flag);
Writer.WriteSingle(XCoefficient);
Writer.WriteSingle(YCoefficient);
}
@@ -28,9 +40,10 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
public override void Read()
{
Name = Helper.AutoReadUnicode(Reader);
- Flags = Reader.ReadInt32();
+ Flags.flag = (uint) Reader.ReadInt32();
XCoefficient = Reader.ReadSingle();
YCoefficient = Reader.ReadSingle();
+ Console.WriteLine("LayerAss: "+Flags["Visible"]);
diff --git a/NetMFAPatcher/MMFParser/MFA/Loaders/Transition.cs b/NetMFAPatcher/MMFParser/MFA/Loaders/Transition.cs
new file mode 100644
index 0000000..086aa42
--- /dev/null
+++ b/NetMFAPatcher/MMFParser/MFA/Loaders/Transition.cs
@@ -0,0 +1,62 @@
+using System;
+using System.Drawing;
+using DotNetCTFDumper.MMFParser.EXE;
+using DotNetCTFDumper.Utils;
+
+namespace DotNetCTFDumper.MMFParser.MFA.Loaders
+{
+ public class Transition:DataLoader
+ {
+ public string Module;
+ public string Name;
+ public string Id;
+ public string TransitionId;
+ public int Duration;
+ public int Flags;
+ public Color Color;
+ public byte[] ParameterData;
+
+ public Transition(ByteReader reader) : base(reader)
+ {
+ }
+
+ public Transition(EXE.ChunkList.Chunk chunk) : base(chunk)
+ {
+ }
+
+ public override void Read()
+ {
+ Module = Reader.AutoReadUnicode();
+ Console.WriteLine(Module);
+ Name = Reader.AutoReadUnicode();
+ Console.WriteLine(Name);
+ Id = Reader.ReadAscii(4);
+ Console.WriteLine(Id);
+ TransitionId = Reader.ReadAscii(4);
+ Console.WriteLine(TransitionId);
+ Duration = Reader.ReadInt32();
+ Flags = Reader.ReadInt32();
+ Color = Reader.ReadColor();
+ ParameterData = Reader.ReadBytes(Reader.ReadInt32());
+
+ }
+
+ public override void Write(ByteWriter Writer)
+ {
+ Writer.AutoWriteUnicode(Module);
+ Writer.AutoWriteUnicode(Name);
+ Writer.WriteAscii(Id);
+ Writer.WriteAscii(TransitionId);
+ Writer.WriteInt32(Duration);
+ Writer.WriteInt32(Flags);
+ Writer.WriteColor(Color);
+ Writer.WriteInt32(ParameterData.Length);
+ Writer.WriteBytes(ParameterData);
+ }
+
+ public override void Print()
+ {
+ throw new System.NotImplementedException();
+ }
+ }
+}
\ No newline at end of file
diff --git a/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/Active.cs b/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/Active.cs
index b71ea53..abd3157 100644
--- a/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/Active.cs
+++ b/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/Active.cs
@@ -14,6 +14,12 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
{
base.Read();
}
+
+ public override void Write(ByteWriter Writer)
+ {
+ base.Write(Writer);
+ }
+
public Active(ByteReader reader) : base(reader) { }
}
}
diff --git a/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/AnimationObject.cs b/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/AnimationObject.cs
index 4bcca20..a6546e2 100644
--- a/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/AnimationObject.cs
+++ b/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/AnimationObject.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using System.Diagnostics;
using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.Utils;
@@ -13,7 +14,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
base.Read();
if(Reader.ReadByte()!=0)
{
- var animationCount = Reader.ReadInt32();
+ var animationCount = Reader.ReadUInt32();
for (int i = 0; i < animationCount; i++)
{
var item = new Animation(Reader);
@@ -42,7 +43,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
public override void Read()
{
- Name = Reader.ReadAscii(Reader.ReadInt32());
+ Name = Reader.AutoReadUnicode();
var directionCount = Reader.ReadInt32();
var directions = new List();
for (int i = 0; i < directionCount; i++)
@@ -60,9 +61,25 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
class AnimationDirection : DataLoader
{
public string Name = "Animation-UNKNOWN";
+ public int Index;
+ public int MinSpeed;
+ public int MaxSpeed;
+ public int Repeat;
+ public int BackTo;
+ public List Frames= new List();
+
public override void Write(ByteWriter Writer)
{
- throw new NotImplementedException();
+ Writer.WriteInt32(Index);
+ Writer.WriteInt32(MinSpeed);
+ Writer.WriteInt32(MaxSpeed);
+ Writer.WriteInt32(Repeat);
+ Writer.WriteInt32(BackTo);
+ foreach (int frame in Frames)
+ {
+ Writer.WriteInt32(frame);
+ }
+
}
public override void Print()
@@ -72,12 +89,16 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
public override void Read()
{
- var index = Reader.ReadInt32();
- var minSpeed = Reader.ReadInt32();
- var maxSpeed= Reader.ReadInt32();
- var repeat= Reader.ReadInt32();
- var backTo= Reader.ReadInt32();
- var frames = new List();
+ Index = Reader.ReadInt32();
+ MinSpeed = Reader.ReadInt32();
+ MaxSpeed = Reader.ReadInt32();
+ Repeat = Reader.ReadInt32();
+ BackTo = Reader.ReadInt32();
+ var animCount = Reader.ReadInt32();
+ for (int i = 0; i < animCount; i++)
+ {
+ Frames.Add(Reader.ReadInt32());
+ }
}
public AnimationDirection(ByteReader reader) : base(reader) { }
diff --git a/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/Behaviours.cs b/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/Behaviours.cs
index b3f2950..71a7206 100644
--- a/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/Behaviours.cs
+++ b/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/Behaviours.cs
@@ -10,7 +10,10 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
List _items = new List();
public override void Write(ByteWriter Writer)
{
- throw new NotImplementedException();
+ foreach (Behaviour behaviour in _items)
+ {
+ behaviour.Write(Writer);
+ }
}
public override void Print()
@@ -36,7 +39,8 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
public ByteReader Data;
public override void Write(ByteWriter Writer)
{
- throw new NotImplementedException();
+ Writer.AutoWriteUnicode(Name);
+ Writer.WriteBytes(Data.ReadBytes((int) Data.Size()));
}
public override void Print()
@@ -46,7 +50,8 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
public override void Read()
{
- Name = Reader.ReadAscii(Reader.ReadInt32());
+ Name = Reader.AutoReadUnicode();
+
Data = new ByteReader(Reader.ReadBytes(Reader.ReadInt32()));
}
diff --git a/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/Movements.cs b/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/Movements.cs
index d5236b2..bd10dd6 100644
--- a/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/Movements.cs
+++ b/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/Movements.cs
@@ -1,5 +1,7 @@
using System;
using System.Collections.Generic;
+using System.IO;
+using System.Net.NetworkInformation;
using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.Utils;
@@ -10,7 +12,11 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
public List Items = new List();
public override void Write(ByteWriter Writer)
{
- throw new NotImplementedException();
+ Writer.WriteInt32(Items.Count);
+ foreach (Movement movement in Items)
+ {
+ movement.Write(Writer);
+ }
}
public override void Print()
@@ -20,7 +26,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
public override void Read()
{
- var count = Reader.ReadInt32();
+ var count = Reader.ReadUInt32();
for (int i = 0; i < count; i++)
{
var item = new Movement(Reader);
@@ -37,10 +43,34 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
public class Movement : DataLoader
{
public string Name="ERROR";
+ public string Extension;
+ public int Identifier;
+ public short Player;
+ public short Type;
+ public byte MovingAtStart;
+ public int DirectionAtStart;
+ public int DataSize;
public override void Write(ByteWriter Writer)
{
- throw new NotImplementedException();
+ Writer.WriteUnicode(Name);
+ Writer.WriteUnicode(Extension);
+ Writer.WriteUInt32((uint) Identifier);
+ Writer.WriteInt32(DataSize);
+ var newWriter = new ByteWriter(new MemoryStream());
+ if (Extension == null)
+ {
+
+ newWriter.WriteInt16(Player);
+ newWriter.WriteInt16(Type);
+ newWriter.WriteInt8(MovingAtStart);
+ newWriter.Skip(3);
+ newWriter.WriteInt32(DirectionAtStart);
+ }
+ //Loader.write(newWriter)
+ Writer.WriteWriter(newWriter);
+
+
}
public override void Print()
@@ -51,22 +81,25 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
public override void Read()
{
Name = Helper.AutoReadUnicode(Reader);
- var extension = Helper.AutoReadUnicode(Reader);
- var identifier = Reader.ReadInt32();
- var dataSize = Reader.ReadInt32();
- if(extension.Length>0)
+ Extension = Helper.AutoReadUnicode(Reader);
+ Identifier = (int) Reader.ReadUInt32();
+ DataSize = (int) Reader.ReadUInt32();
+ if(Extension.Length>0)
{
- var newReader = new ByteReader(Reader.ReadBytes(dataSize));
+ var newReader = new ByteReader(Reader.ReadBytes(DataSize));
}
else
{
- var player = Reader.ReadInt16();
- var type = Reader.ReadInt16();
- var movingAtStart = Reader.ReadByte();
+ Player = Reader.ReadInt16();
+ Type = Reader.ReadInt16();
+ MovingAtStart = Reader.ReadByte();
Reader.Skip(3);
- var directionAtStart = Reader.ReadInt32();
+ DirectionAtStart = Reader.ReadInt32();
+ var newReader = new ByteReader(Reader.ReadBytes(DataSize - 12));
+ //ONLY STATIC MOVEMENT IS SUPPORTED RN
+ //TODO:Movement Types
//implement types, but i am tired, fuck this shit
}
diff --git a/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/ObjectLoader.cs b/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/ObjectLoader.cs
index 013fa8c..fb3eb26 100644
--- a/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/ObjectLoader.cs
+++ b/NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/ObjectLoader.cs
@@ -1,4 +1,5 @@
-using System.Collections.Generic;
+using System;
+using System.Collections.Generic;
using System.Drawing;
using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.Utils;
@@ -18,6 +19,28 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
public override void Write(ByteWriter Writer)
{
+ Writer.WriteInt32(ObjectFlags);
+ Writer.WriteInt32(NewObjectFlags);
+ Writer.WriteColor(BackgroundColor);
+ for (int i = 0; i < 9; i++)
+ {
+ try
+ {
+ var value = _qualifiers[i];
+ Writer.WriteInt16(value);
+ }
+ catch
+ {
+ Writer.WriteInt16(-1);
+ }
+ }
+ Values.Write(Writer);
+ Strings.Write(Writer);
+ Movements.Write(Writer);
+ Behaviours.Write(Writer);
+ Writer.WriteInt8(0);//FadeIn
+ Writer.WriteInt8(0);//FadeOut
+
}
@@ -47,8 +70,8 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
ObjectFlags = Reader.ReadInt32();
NewObjectFlags = Reader.ReadInt32();
BackgroundColor = Reader.ReadColor();
- var end = Reader.Tell() + 2 * 9;
- for (int i = 0; i < 9; i++)
+ var end = Reader.Tell() + 2 * (8+1);
+ for (int i = 0; i < 8+1; i++)
{
var value = Reader.ReadInt16();
if(value==-1)
@@ -67,7 +90,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
Movements.Read();
Behaviours = new Behaviours(Reader);
Behaviours.Read();
- Reader.Skip(56);
+ //Reader.Skip(50);//TODO: Help
Print();
diff --git a/NetMFAPatcher/MMFParser/MFA/Decompiling/MFAGenerator.cs b/NetMFAPatcher/MMFParser/Translation/MFAGenerator.cs
similarity index 85%
rename from NetMFAPatcher/MMFParser/MFA/Decompiling/MFAGenerator.cs
rename to NetMFAPatcher/MMFParser/Translation/MFAGenerator.cs
index e6a3a16..79ac3f4 100644
--- a/NetMFAPatcher/MMFParser/MFA/Decompiling/MFAGenerator.cs
+++ b/NetMFAPatcher/MMFParser/Translation/MFAGenerator.cs
@@ -3,14 +3,14 @@ using System.IO;
using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.Utils;
-namespace DotNetCTFDumper.MMFParser.Decompiling
+namespace DotNetCTFDumper.MMFParser.Translation
{
public static class MFAGenerator
{
//public static readonly string TemplatePath = @"C:\Users\MED45\Downloads\testNoFrames.mfa";
public static readonly string TemplatePath = @"C:\Users\ivani\Desktop\CTFResearch\testNoFrames.mfa";
- public static void BuildMFA()
+ public static MFA.MFA BuildMFA()
{
Settings.DoMFA = true;
var mfaReader = new ByteReader(TemplatePath, FileMode.Open);
@@ -26,12 +26,14 @@ namespace DotNetCTFDumper.MMFParser.Decompiling
FileMode.Create); //New writer for new MFA
template.Write(mfaWriter); //Writing new MFA
mfaWriter.Dispose();
+ return template;
+
Logger.Log("MFA Done",true,ConsoleColor.Yellow);
}
public static void ReadTestMFA()
{
- var mfaReader = new ByteReader(TemplatePath, FileMode.Open);
+ var mfaReader = new ByteReader(@"C:\Users\ivani\Desktop\CTFResearch\ObjTEST.mfa", FileMode.Open);
var template = new MFA.MFA(mfaReader);
Settings.DoMFA = true;
template.Read();
diff --git a/NetMFAPatcher/MMFParser/Translation/PAME2MFA.cs b/NetMFAPatcher/MMFParser/Translation/PAME2MFA.cs
new file mode 100644
index 0000000..5ddd49c
--- /dev/null
+++ b/NetMFAPatcher/MMFParser/Translation/PAME2MFA.cs
@@ -0,0 +1,138 @@
+using System.Collections.Generic;
+using DotNetCTFDumper.MMFParser.EXE;
+using DotNetCTFDumper.Utils;
+using Frame = DotNetCTFDumper.MMFParser.EXE.Loaders.Frame;
+using Layer = DotNetCTFDumper.MMFParser.MFA.Loaders.Layer;
+
+namespace DotNetCTFDumper.MMFParser.Translation
+{
+ public static class Pame2Mfa
+ {
+ public static event Program.DumperEvent TranslatingFrame;
+
+ public static void Translate(ref MFA.MFA mfa, GameData game)
+ {
+
+ //mfa.MfaBuild = 4;
+ //mfa.Product = (int) game.ProductVersion;
+ //mfa.BuildVersion = 283;
+ mfa.Name = game.Name;
+ mfa.LangId = 0;
+ mfa.Description = $"Decompiled with {Settings.DumperVersion}";
+ mfa.Path = game.EditorFilename;
+
+ //mfa.Stamp = wtf;
+ /*if (game.Fonts != null) mfa.Fonts = game.Fonts;
+
+ 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;
+ }
+ */
+ mfa.Author = game.Author!=null? game.Author:"Kostya";
+ mfa.Copyright = game.Copyright;
+ mfa.Company = "CTFAN Team";
+ mfa.Version = "";
+ //TODO:Binary Files
+ var displaySettings = mfa.DisplayFlags;
+ var graphicSettings = mfa.GraphicFlags;
+ var flags = game.Header.Flags;
+ var newFlags = game.Header.NewFlags;
+ //TODO:Flags, no setter
+ mfa.WindowX = game.Header.WindowWidth;
+ mfa.WindowY = game.Header.WindowHeight;
+ mfa.BorderColor = game.Header.BorderColor;
+ mfa.HelpFile = "";
+ mfa.VitalizePreview = new byte[]{0x0};
+ mfa.InitialScore = game.Header.InitialScore;
+ mfa.InitialLifes = game.Header.InitialLives;
+ mfa.FrameRate = game.Header.FrameRate;
+ mfa.BuildType = 0;
+ mfa.BuildPath = game.TargetFilename;
+ mfa.CommandLine = "";
+ mfa.Aboutbox = game.AboutText?.Length > 0
+ ? game?.AboutText
+ : "This game was decompiled with " + Settings.DumperVersion;
+ mfa.Frames.Clear();
+ foreach (Frame gameFrame in game.Frames)
+ {
+ var mfaFrame = ConvertFrame(gameFrame);
+ mfaFrame.Handle = game.Frames.IndexOf(gameFrame);
+ mfa.Frames.Add(mfaFrame);
+
+ }
+ }
+
+ public static MFA.Loaders.Transition ConvertTransition(EXE.Loaders.Transition gameTrans)
+ {
+ var mfaTrans = new MFA.Loaders.Transition((ByteReader) null);
+ mfaTrans.Module = gameTrans.ModuleFile;
+ mfaTrans.Name = "Transition";
+ mfaTrans.Id = gameTrans.Module;
+ mfaTrans.TransitionId = gameTrans.Name;
+ mfaTrans.Flags = gameTrans.Flags;
+ mfaTrans.Color = gameTrans.Color;
+ mfaTrans.ParameterData = gameTrans.ParameterData;
+ mfaTrans.Duration = gameTrans.Duration;
+ return mfaTrans;
+
+ }
+
+ public static MFA.Loaders.Frame ConvertFrame(EXE.Loaders.Frame gameFrame)
+ {
+ MFA.Loaders.Frame mfaFrame = new MFA.Loaders.Frame(null);
+ TranslatingFrame.Invoke(gameFrame.Name);
+ //mfaFrame.Handle = game.Frames.IndexOf(gameFrame);
+ 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 ?? 1337;
+ 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();
+ var layer = new Layer(null)
+ {
+ Name = "New Layer",
+
+
+ };
+ layer.Flags["Visible"] = true;
+ mfaFrame.Layers.Add(layer);
+
+
+ /*foreach (EXE.Loaders.Layer gameLayer in gameFrame.Layers.Items)
+ {
+ Layer mfaLayer = new Layer(null);
+ mfaLayer.Name = gameLayer.Name;
+ mfaLayer.Flags = (int) gameLayer.Flags;
+ //TODO: Flags
+ mfaLayer.XCoefficient = gameLayer.XCoeff;
+ mfaLayer.YCoefficient = gameLayer.YCoeff;
+ mfaFrame.Layers.Add(mfaLayer);
+ }*/
+ mfaFrame.Events = MFA.MFA.emptyEvents;
+ mfaFrame.Chunks = MFA.MFA.emptyFrameChunks;
+ return mfaFrame;
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/NetMFAPatcher/Program.cs b/NetMFAPatcher/Program.cs
index b1b7608..5da8cd6 100644
--- a/NetMFAPatcher/Program.cs
+++ b/NetMFAPatcher/Program.cs
@@ -3,19 +3,17 @@ using System.IO;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using DotNetCTFDumper.GUI;
-using DotNetCTFDumper.MMFParser.Decompiling;
using DotNetCTFDumper.MMFParser.EXE;
+using DotNetCTFDumper.MMFParser.Translation;
using DotNetCTFDumper.Utils;
using Joveler.Compression.ZLib;
namespace DotNetCTFDumper
{
- internal class Program
+ public class Program
{
- //public static string path = @"H:\fnaf-world.exe";//test
- //public static string path = @"D:\SteamLibrary\steamapps\common\Five Nights at Freddy's Sister Location\SisterLocation.exe";
- //public static string Path = ""; //TODO: Make Selectable
public static MainForm MyForm;
+ public delegate void DumperEvent(object obj);
[STAThread]
@@ -24,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;
diff --git a/NetMFAPatcher/Settings.cs b/NetMFAPatcher/Settings.cs
index f95e3bf..7a0d685 100644
--- a/NetMFAPatcher/Settings.cs
+++ b/NetMFAPatcher/Settings.cs
@@ -14,9 +14,9 @@ namespace DotNetCTFDumper
public static string GamePath;
public static string GameName => Path.GetFileNameWithoutExtension(GamePath);
public static string DumpPath => $"DUMP\\{GameName}";
- public static string ImagePath=>$"{DumpPath}\\ImageBank";
- public static string SoundPath=>$"{DumpPath}\\SoundBank";
- public static string MusicPath=>$"{DumpPath}\\MusicBank";
+ public static string ImagePath=>$"{DumpPath}\\Images";
+ public static string SoundPath=>$"{DumpPath}\\Sounds";
+ public static string MusicPath=>$"{DumpPath}\\Musics";
public static string ChunkPath=>$"{DumpPath}\\Chunks";
public static string ExtensionPath=>$"{DumpPath}\\Extensions";
diff --git a/NetMFAPatcher/Utils/BitDict.cs b/NetMFAPatcher/Utils/BitDict.cs
index fc091ff..a765651 100644
--- a/NetMFAPatcher/Utils/BitDict.cs
+++ b/NetMFAPatcher/Utils/BitDict.cs
@@ -17,7 +17,7 @@ namespace DotNetCTFDumper.Utils
public bool this[String key]
{
get => GetFlag(key);
- // set => SetFlag(key,value);
+ set => SetFlag(key,value);
}
public bool GetFlag(String key)
@@ -30,6 +30,14 @@ namespace DotNetCTFDumper.Utils
return false;
}
+
+ public void SetFlag(String key, bool value)
+ {
+ if (value)
+ {
+ flag |= (uint) Math.Pow(2,Array.IndexOf(Keys,key));
+ }
+ }
public static string ToDebugString(IDictionary dictionary)
@@ -47,5 +55,7 @@ namespace DotNetCTFDumper.Utils
return ToDebugString(actualKeys);
}
+
+
}
}
\ No newline at end of file