Fixes in translation method,

Updates in MFA reading/writing
master
1987kostya 4 years ago
parent 7b1572ea29
commit ae79efd09d

@ -149,6 +149,12 @@
<Compile Include="GUI\MainForm.Designer.cs"> <Compile Include="GUI\MainForm.Designer.cs">
<DependentUpon>MainForm.cs</DependentUpon> <DependentUpon>MainForm.cs</DependentUpon>
</Compile> </Compile>
<Compile Include="GUI\MFABuilderForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="GUI\MFABuilderForm.Designer.cs">
<DependentUpon>MFABuilderForm.cs</DependentUpon>
</Compile>
<Compile Include="GUI\ObjectBox.cs" /> <Compile Include="GUI\ObjectBox.cs" />
<Compile Include="GUI\PackDataForm.cs"> <Compile Include="GUI\PackDataForm.cs">
<SubType>Form</SubType> <SubType>Form</SubType>
@ -156,6 +162,8 @@
<Compile Include="GUI\PackDataForm.Designer.cs"> <Compile Include="GUI\PackDataForm.Designer.cs">
<DependentUpon>PackDataForm.cs</DependentUpon> <DependentUpon>PackDataForm.cs</DependentUpon>
</Compile> </Compile>
<Compile Include="MMFParser\Translation\MFAGenerator.cs" />
<Compile Include="MMFParser\Translation\PAME2MFA.cs" />
<Compile Include="MMFParser\EXE\ChunkList.cs" /> <Compile Include="MMFParser\EXE\ChunkList.cs" />
<Compile Include="MMFParser\EXE\Loaders\AppHeader.cs" /> <Compile Include="MMFParser\EXE\Loaders\AppHeader.cs" />
<Compile Include="MMFParser\EXE\Loaders\AppMenu.cs" /> <Compile Include="MMFParser\EXE\Loaders\AppMenu.cs" />
@ -193,14 +201,14 @@
<Compile Include="MMFParser\EXE\Loaders\Objects\ObjectCommon.cs" /> <Compile Include="MMFParser\EXE\Loaders\Objects\ObjectCommon.cs" />
<Compile Include="MMFParser\EXE\Loaders\Objects\Value.cs" /> <Compile Include="MMFParser\EXE\Loaders\Objects\Value.cs" />
<Compile Include="MMFParser\EXE\Loaders\StringChunk.cs" /> <Compile Include="MMFParser\EXE\Loaders\StringChunk.cs" />
<Compile Include="MMFParser\EXE\Loaders\Transition.cs" />
<Compile Include="MMFParser\EXE\Loaders\yves.cs" /> <Compile Include="MMFParser\EXE\Loaders\yves.cs" />
<Compile Include="MMFParser\EXE\DataLoader.cs" /> <Compile Include="MMFParser\EXE\DataLoader.cs" />
<Compile Include="MMFParser\EXE\EXE.cs" /> <Compile Include="MMFParser\EXE\EXE.cs" />
<Compile Include="MMFParser\EXE\GameData.cs" /> <Compile Include="MMFParser\EXE\GameData.cs" />
<Compile Include="MMFParser\EXE\PackData.cs" /> <Compile Include="MMFParser\EXE\PackData.cs" />
<Compile Include="MMFParser\Constants.cs" /> <Compile Include="MMFParser\Constants.cs" />
<Compile Include="MMFParser\MFA\Decompiling\MFAGenerator.cs" /> <Compile Include="MMFParser\MFA\Loaders\Transition.cs" />
<Compile Include="MMFParser\MFA\Decompiling\PAME2MFA.cs" />
<Compile Include="MMFParser\MFA\MFA.cs" /> <Compile Include="MMFParser\MFA\MFA.cs" />
<Compile Include="MMFParser\MFA\Loaders\ChunkList.cs" /> <Compile Include="MMFParser\MFA\Loaders\ChunkList.cs" />
<Compile Include="MMFParser\MFA\Loaders\Controls.cs" /> <Compile Include="MMFParser\MFA\Loaders\Controls.cs" />
@ -263,6 +271,9 @@
<EmbeddedResource Include="GUI\MainForm.resx"> <EmbeddedResource Include="GUI\MainForm.resx">
<DependentUpon>MainForm.cs</DependentUpon> <DependentUpon>MainForm.cs</DependentUpon>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="GUI\MFABuilderForm.resx">
<DependentUpon>MFABuilderForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="GUI\PackDataForm.resx"> <EmbeddedResource Include="GUI\PackDataForm.resx">
<DependentUpon>PackDataForm.cs</DependentUpon> <DependentUpon>PackDataForm.cs</DependentUpon>
</EmbeddedResource> </EmbeddedResource>

@ -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();
}
}
}

@ -4,7 +4,6 @@ using System.Diagnostics;
using System.Drawing; using System.Drawing;
using System.Threading; using System.Threading;
using System.Windows.Forms; using System.Windows.Forms;
using DotNetCTFDumper.MMFParser.Decompiling;
using DotNetCTFDumper.MMFParser.EXE; using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.MMFParser.EXE.Loaders; using DotNetCTFDumper.MMFParser.EXE.Loaders;
using DotNetCTFDumper.MMFParser.EXE.Loaders.Banks; using DotNetCTFDumper.MMFParser.EXE.Loaders.Banks;
@ -291,7 +290,9 @@ namespace DotNetCTFDumper.GUI
private void MFABtn_Click(object sender, EventArgs e) 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) private void soundsButton_Click(object sender, EventArgs e)

@ -232,6 +232,12 @@ namespace DotNetCTFDumper.MMFParser.EXE
case 13112: case 13112:
loader = new ObjectInstances(chunk); loader = new ObjectInstances(chunk);
break; break;
case 13115:
loader = new Transition(chunk);
break;
case 13116:
loader = new Transition(chunk);
break;
case 13121: case 13121:
loader = new Layers(chunk); loader = new Layers(chunk);
break; break;
@ -295,6 +301,24 @@ namespace DotNetCTFDumper.MMFParser.EXE
//Logger.Log($"ChunkLoader {typeof(T).Name} not found", true, ConsoleColor.Red); //Logger.Log($"ChunkLoader {typeof(T).Name} not found", true, ConsoleColor.Red);
return null; return null;
} }
public T PopChunk<T>() where T : ChunkLoader
{
for(int i=0;i<Chunks.Count;i++)
{
var chunk = Chunks[i];
if (chunk.Loader != null)
{
if (chunk.Loader.GetType().Name == typeof(T).Name)
{
return (T) chunk.Loader;
}
Chunks.Remove(chunk);
}
}
//Logger.Log($"ChunkLoader {typeof(T).Name} not found", true, ConsoleColor.Red);
return null;
}
} }
} }

@ -47,6 +47,8 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders
public Layers Layers; public Layers Layers;
public Events.Events Events; public Events.Events Events;
public FramePalette Palette; public FramePalette Palette;
public Transition FadeIn;
public Transition FadeOut;
public override void Print(bool ext) public override void Print(bool ext)
@ -116,7 +118,8 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders
CountOfObjs = Objects.CountOfObjects; CountOfObjs = Objects.CountOfObjects;
} }
FadeIn = Chunks.PopChunk<Transition>();
FadeOut = Chunks.PopChunk<Transition>();

@ -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();
}
}
}

@ -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<Layer>();
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);
}
}
}
}

@ -188,7 +188,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
Writer.WriteUInt16(Version); Writer.WriteUInt16(Version);
Writer.WriteInt16((short) FrameType); Writer.WriteInt16((short) FrameType);
//Writer.WriteBytes(new byte[] {0x04, 0x04, 0x00, 0x00}); // Writer.WriteBytes(new byte[] {0x04, 0x04, 0x00, 0x00});
// if (Items != null) // if (Items != null)
// { // {
// Console.WriteLine("Writing EventData"); // Console.WriteLine("Writing EventData");

@ -27,6 +27,8 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
public List<Layer> Layers; public List<Layer> Layers;
public Events Events; public Events Events;
public ChunkList Chunks; public ChunkList Chunks;
public Transition FadeIn;
public Transition FadeOut;
public Frame(ByteReader reader) : base(reader) public Frame(ByteReader reader) : base(reader)
{ {
@ -63,8 +65,20 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
} }
//TODO: Do transitions //TODO: Do transitions
Writer.WriteInt8(0); if (FadeIn != null)
Writer.WriteInt8(0); {
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); Writer.WriteInt32(Items.Count);
foreach (var item in Items) foreach (var item in Items)
@ -132,10 +146,18 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
Layers.Add(layer); Layers.Add(layer);
} }
//fadein
//fadeout if (Reader.ReadByte() == 1)
Reader.Skip(2); {
FadeIn = new Transition(Reader);
FadeIn.Read();
}
if (Reader.ReadByte() == 1)
{
FadeOut = new Transition(Reader);
FadeOut.Read();
}
Items = new List<FrameItem>(); Items = new List<FrameItem>();
var frameitemsCount = Reader.ReadInt32(); var frameitemsCount = Reader.ReadInt32();
for (int i = 0; i < frameitemsCount; i++) for (int i = 0; i < frameitemsCount; i++)

@ -9,13 +9,25 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
public string Name="ERROR"; public string Name="ERROR";
public float XCoefficient; public float XCoefficient;
public float YCoefficient; 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) public override void Write(ByteWriter Writer)
{ {
Writer.AutoWriteUnicode(Name); Writer.AutoWriteUnicode(Name);
Writer.WriteInt32(Flags); Writer.WriteInt32((int) Flags.flag);
Writer.WriteSingle(XCoefficient); Writer.WriteSingle(XCoefficient);
Writer.WriteSingle(YCoefficient); Writer.WriteSingle(YCoefficient);
} }
@ -28,9 +40,10 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
public override void Read() public override void Read()
{ {
Name = Helper.AutoReadUnicode(Reader); Name = Helper.AutoReadUnicode(Reader);
Flags = Reader.ReadInt32(); Flags.flag = (uint) Reader.ReadInt32();
XCoefficient = Reader.ReadSingle(); XCoefficient = Reader.ReadSingle();
YCoefficient = Reader.ReadSingle(); YCoefficient = Reader.ReadSingle();
Console.WriteLine("LayerAss: "+Flags["Visible"]);

@ -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();
}
}
}

@ -14,6 +14,12 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
{ {
base.Read(); base.Read();
} }
public override void Write(ByteWriter Writer)
{
base.Write(Writer);
}
public Active(ByteReader reader) : base(reader) { } public Active(ByteReader reader) : base(reader) { }
} }
} }

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics;
using DotNetCTFDumper.MMFParser.EXE; using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.Utils; using DotNetCTFDumper.Utils;
@ -13,7 +14,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
base.Read(); base.Read();
if(Reader.ReadByte()!=0) if(Reader.ReadByte()!=0)
{ {
var animationCount = Reader.ReadInt32(); var animationCount = Reader.ReadUInt32();
for (int i = 0; i < animationCount; i++) for (int i = 0; i < animationCount; i++)
{ {
var item = new Animation(Reader); var item = new Animation(Reader);
@ -42,7 +43,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
public override void Read() public override void Read()
{ {
Name = Reader.ReadAscii(Reader.ReadInt32()); Name = Reader.AutoReadUnicode();
var directionCount = Reader.ReadInt32(); var directionCount = Reader.ReadInt32();
var directions = new List<AnimationDirection>(); var directions = new List<AnimationDirection>();
for (int i = 0; i < directionCount; i++) for (int i = 0; i < directionCount; i++)
@ -60,9 +61,25 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
class AnimationDirection : DataLoader class AnimationDirection : DataLoader
{ {
public string Name = "Animation-UNKNOWN"; public string Name = "Animation-UNKNOWN";
public int Index;
public int MinSpeed;
public int MaxSpeed;
public int Repeat;
public int BackTo;
public List<int> Frames= new List<int>();
public override void Write(ByteWriter Writer) 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() public override void Print()
@ -72,12 +89,16 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
public override void Read() public override void Read()
{ {
var index = Reader.ReadInt32(); Index = Reader.ReadInt32();
var minSpeed = Reader.ReadInt32(); MinSpeed = Reader.ReadInt32();
var maxSpeed= Reader.ReadInt32(); MaxSpeed = Reader.ReadInt32();
var repeat= Reader.ReadInt32(); Repeat = Reader.ReadInt32();
var backTo= Reader.ReadInt32(); BackTo = Reader.ReadInt32();
var frames = new List<int>(); var animCount = Reader.ReadInt32();
for (int i = 0; i < animCount; i++)
{
Frames.Add(Reader.ReadInt32());
}
} }
public AnimationDirection(ByteReader reader) : base(reader) { } public AnimationDirection(ByteReader reader) : base(reader) { }

@ -10,7 +10,10 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
List<Behaviour> _items = new List<Behaviour>(); List<Behaviour> _items = new List<Behaviour>();
public override void Write(ByteWriter Writer) public override void Write(ByteWriter Writer)
{ {
throw new NotImplementedException(); foreach (Behaviour behaviour in _items)
{
behaviour.Write(Writer);
}
} }
public override void Print() public override void Print()
@ -36,7 +39,8 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
public ByteReader Data; public ByteReader Data;
public override void Write(ByteWriter Writer) public override void Write(ByteWriter Writer)
{ {
throw new NotImplementedException(); Writer.AutoWriteUnicode(Name);
Writer.WriteBytes(Data.ReadBytes((int) Data.Size()));
} }
public override void Print() public override void Print()
@ -46,7 +50,8 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
public override void Read() public override void Read()
{ {
Name = Reader.ReadAscii(Reader.ReadInt32()); Name = Reader.AutoReadUnicode();
Data = new ByteReader(Reader.ReadBytes(Reader.ReadInt32())); Data = new ByteReader(Reader.ReadBytes(Reader.ReadInt32()));
} }

@ -1,5 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Net.NetworkInformation;
using DotNetCTFDumper.MMFParser.EXE; using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.Utils; using DotNetCTFDumper.Utils;
@ -10,7 +12,11 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
public List<Movement> Items = new List<Movement>(); public List<Movement> Items = new List<Movement>();
public override void Write(ByteWriter Writer) 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() public override void Print()
@ -20,7 +26,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
public override void Read() public override void Read()
{ {
var count = Reader.ReadInt32(); var count = Reader.ReadUInt32();
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)
{ {
var item = new Movement(Reader); var item = new Movement(Reader);
@ -37,10 +43,34 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
public class Movement : DataLoader public class Movement : DataLoader
{ {
public string Name="ERROR"; 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) 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() public override void Print()
@ -51,22 +81,25 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
public override void Read() public override void Read()
{ {
Name = Helper.AutoReadUnicode(Reader); Name = Helper.AutoReadUnicode(Reader);
var extension = Helper.AutoReadUnicode(Reader); Extension = Helper.AutoReadUnicode(Reader);
var identifier = Reader.ReadInt32(); Identifier = (int) Reader.ReadUInt32();
var dataSize = Reader.ReadInt32(); DataSize = (int) Reader.ReadUInt32();
if(extension.Length>0) if(Extension.Length>0)
{ {
var newReader = new ByteReader(Reader.ReadBytes(dataSize)); var newReader = new ByteReader(Reader.ReadBytes(DataSize));
} }
else else
{ {
var player = Reader.ReadInt16(); Player = Reader.ReadInt16();
var type = Reader.ReadInt16(); Type = Reader.ReadInt16();
var movingAtStart = Reader.ReadByte(); MovingAtStart = Reader.ReadByte();
Reader.Skip(3); 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 //implement types, but i am tired, fuck this shit
} }

@ -1,4 +1,5 @@
using System.Collections.Generic; using System;
using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using DotNetCTFDumper.MMFParser.EXE; using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.Utils; using DotNetCTFDumper.Utils;
@ -18,6 +19,28 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
public override void Write(ByteWriter Writer) 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(); ObjectFlags = Reader.ReadInt32();
NewObjectFlags = Reader.ReadInt32(); NewObjectFlags = Reader.ReadInt32();
BackgroundColor = Reader.ReadColor(); BackgroundColor = Reader.ReadColor();
var end = Reader.Tell() + 2 * 9; var end = Reader.Tell() + 2 * (8+1);
for (int i = 0; i < 9; i++) for (int i = 0; i < 8+1; i++)
{ {
var value = Reader.ReadInt16(); var value = Reader.ReadInt16();
if(value==-1) if(value==-1)
@ -67,7 +90,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
Movements.Read(); Movements.Read();
Behaviours = new Behaviours(Reader); Behaviours = new Behaviours(Reader);
Behaviours.Read(); Behaviours.Read();
Reader.Skip(56); //Reader.Skip(50);//TODO: Help
Print(); Print();

@ -3,14 +3,14 @@ using System.IO;
using DotNetCTFDumper.MMFParser.EXE; using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.Utils; using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.Decompiling namespace DotNetCTFDumper.MMFParser.Translation
{ {
public static class MFAGenerator public static class MFAGenerator
{ {
//public static readonly string TemplatePath = @"C:\Users\MED45\Downloads\testNoFrames.mfa"; //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 readonly string TemplatePath = @"C:\Users\ivani\Desktop\CTFResearch\testNoFrames.mfa";
public static void BuildMFA() public static MFA.MFA BuildMFA()
{ {
Settings.DoMFA = true; Settings.DoMFA = true;
var mfaReader = new ByteReader(TemplatePath, FileMode.Open); var mfaReader = new ByteReader(TemplatePath, FileMode.Open);
@ -26,12 +26,14 @@ namespace DotNetCTFDumper.MMFParser.Decompiling
FileMode.Create); //New writer for new MFA FileMode.Create); //New writer for new MFA
template.Write(mfaWriter); //Writing new MFA template.Write(mfaWriter); //Writing new MFA
mfaWriter.Dispose(); mfaWriter.Dispose();
return template;
Logger.Log("MFA Done",true,ConsoleColor.Yellow); Logger.Log("MFA Done",true,ConsoleColor.Yellow);
} }
public static void ReadTestMFA() 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); var template = new MFA.MFA(mfaReader);
Settings.DoMFA = true; Settings.DoMFA = true;
template.Read(); template.Read();

@ -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<Layer>();
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;
}
}
}

@ -3,19 +3,17 @@ using System.IO;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Windows.Forms; using System.Windows.Forms;
using DotNetCTFDumper.GUI; using DotNetCTFDumper.GUI;
using DotNetCTFDumper.MMFParser.Decompiling;
using DotNetCTFDumper.MMFParser.EXE; using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.MMFParser.Translation;
using DotNetCTFDumper.Utils; using DotNetCTFDumper.Utils;
using Joveler.Compression.ZLib; using Joveler.Compression.ZLib;
namespace DotNetCTFDumper 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 static MainForm MyForm;
public delegate void DumperEvent(object obj);
[STAThread] [STAThread]
@ -24,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;

@ -14,9 +14,9 @@ namespace DotNetCTFDumper
public static string GamePath; public static string GamePath;
public static string GameName => Path.GetFileNameWithoutExtension(GamePath); public static string GameName => Path.GetFileNameWithoutExtension(GamePath);
public static string DumpPath => $"DUMP\\{GameName}"; public static string DumpPath => $"DUMP\\{GameName}";
public static string ImagePath=>$"{DumpPath}\\ImageBank"; public static string ImagePath=>$"{DumpPath}\\Images";
public static string SoundPath=>$"{DumpPath}\\SoundBank"; public static string SoundPath=>$"{DumpPath}\\Sounds";
public static string MusicPath=>$"{DumpPath}\\MusicBank"; public static string MusicPath=>$"{DumpPath}\\Musics";
public static string ChunkPath=>$"{DumpPath}\\Chunks"; public static string ChunkPath=>$"{DumpPath}\\Chunks";
public static string ExtensionPath=>$"{DumpPath}\\Extensions"; public static string ExtensionPath=>$"{DumpPath}\\Extensions";

@ -17,7 +17,7 @@ namespace DotNetCTFDumper.Utils
public bool this[String key] public bool this[String key]
{ {
get => GetFlag(key); get => GetFlag(key);
// set => SetFlag(key,value); set => SetFlag(key,value);
} }
public bool GetFlag(String key) public bool GetFlag(String key)
@ -31,6 +31,14 @@ namespace DotNetCTFDumper.Utils
return false; return false;
} }
public void SetFlag(String key, bool value)
{
if (value)
{
flag |= (uint) Math.Pow(2,Array.IndexOf(Keys,key));
}
}
public static string ToDebugString<TKey, TValue>(IDictionary<TKey, TValue> dictionary) public static string ToDebugString<TKey, TValue>(IDictionary<TKey, TValue> dictionary)
{ {
@ -47,5 +55,7 @@ namespace DotNetCTFDumper.Utils
return ToDebugString(actualKeys); return ToDebugString(actualKeys);
} }
} }
} }
Loading…
Cancel
Save