Merge remote-tracking branch 'origin/master'

# Conflicts:
#	NetMFAPatcher/MMFParser/MFA/Loaders/Frame.cs
#	NetMFAPatcher/MMFParser/MFA/Loaders/mfachunks/ObjectLoader.cs
master
REDxEYE 4 years ago
commit 718b077e89

@ -149,6 +149,12 @@
<Compile Include="GUI\MainForm.Designer.cs">
<DependentUpon>MainForm.cs</DependentUpon>
</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\PackDataForm.cs">
<SubType>Form</SubType>
@ -156,73 +162,77 @@
<Compile Include="GUI\PackDataForm.Designer.cs">
<DependentUpon>PackDataForm.cs</DependentUpon>
</Compile>
<Compile Include="MMFParser\ChunkLoaders\AppMenu.cs" />
<Compile Include="MMFParser\ChunkLoaders\Events\Events.cs" />
<Compile Include="MMFParser\ChunkLoaders\Events\EventsParts.cs" />
<Compile Include="MMFParser\ChunkLoaders\Events\Expressions\Expression.cs" />
<Compile Include="MMFParser\ChunkLoaders\Events\Parameters\Position.cs" />
<Compile Include="MMFParser\ChunkLoaders\Events\Parameters\Int.cs" />
<Compile Include="MMFParser\ChunkLoaders\Events\Parameters\GlobalValue.cs" />
<Compile Include="MMFParser\ChunkLoaders\Events\Parameters\ParameterCommon.cs" />
<Compile Include="MMFParser\ChunkLoaders\Events\Parameters\Float.cs" />
<Compile Include="MMFParser\ChunkLoaders\Events\Parameters\Every.cs" />
<Compile Include="MMFParser\ChunkLoaders\Events\Parameters\Sample.cs" />
<Compile Include="MMFParser\ChunkLoaders\Events\Parameters\Remark.cs" />
<Compile Include="MMFParser\ChunkLoaders\Events\Parameters\Colour.cs" />
<Compile Include="MMFParser\ChunkLoaders\Events\Parameters\Short.cs" />
<Compile Include="MMFParser\ChunkLoaders\Events\Parameters\AlterableValue.cs" />
<Compile Include="MMFParser\ChunkLoaders\Events\Parameters\Create.cs" />
<Compile Include="MMFParser\ChunkLoaders\Events\Parameters\Time.cs" />
<Compile Include="MMFParser\ChunkLoaders\Events\Parameters\ParamObject.cs" />
<Compile Include="MMFParser\ChunkLoaders\ExtData.cs" />
<Compile Include="MMFParser\ChunkLoaders\Globals.cs" />
<Compile Include="MMFParser\ChunkLoaders\ObjectInfo.cs" />
<Compile Include="MMFParser\ChunkLoaders\FrameItems.cs" />
<Compile Include="MMFParser\ChunkLoaders\ObjectNames.cs" />
<Compile Include="MMFParser\ChunkLoaders\Objects\Animations.cs" />
<Compile Include="MMFParser\ChunkLoaders\Objects\Backdrop.cs" />
<Compile Include="MMFParser\ChunkLoaders\Objects\Counters.cs" />
<Compile Include="MMFParser\ChunkLoaders\Objects\ObjectCommon.cs" />
<Compile Include="MMFParser\ChunkLoaders\Objects\Value.cs" />
<Compile Include="MMFParser\Data\DataLoader.cs" />
<Compile Include="MMFParser\Data\EXE.cs" />
<Compile Include="MMFParser\Decompiling\MFAGenerator.cs" />
<Compile Include="MMFParser\Decompiling\PAME2MFA.cs" />
<Compile Include="MMFParser\MFALoaders\ChunkList.cs" />
<Compile Include="MMFParser\MFALoaders\Events.cs" />
<Compile Include="MMFParser\MFALoaders\Frame.cs" />
<Compile Include="MMFParser\MFALoaders\FrameInstance.cs" />
<Compile Include="MMFParser\MFALoaders\FrameItem.cs" />
<Compile Include="MMFParser\MFALoaders\ItemFolder.cs" />
<Compile Include="MMFParser\MFALoaders\Layer.cs" />
<Compile Include="MMFParser\MFALoaders\mfachunks\Active.cs" />
<Compile Include="MMFParser\MFALoaders\mfachunks\AnimationObject.cs" />
<Compile Include="MMFParser\MFALoaders\mfachunks\Behaviours.cs" />
<Compile Include="MMFParser\MFALoaders\mfachunks\Movements.cs" />
<Compile Include="MMFParser\MFALoaders\mfachunks\ObjectLoader.cs" />
<Compile Include="MMFParser\MFALoaders\ValueList.cs" />
<Compile Include="MMFParser\MFALoaders\Controls.cs" />
<Compile Include="MMFParser\MFALoaders\ImageBank.cs" />
<Compile Include="MMFParser\Data\MFA.cs" />
<Compile Include="MMFParser\ChunkLoaders\AppHeader.cs" />
<Compile Include="MMFParser\ChunkLoaders\ChunkLoader.cs" />
<Compile Include="MMFParser\ChunkLoaders\Banks\FontBank.cs" />
<Compile Include="MMFParser\ChunkLoaders\Frame.cs" />
<Compile Include="MMFParser\ChunkLoaders\Banks\ImageBank.cs" />
<Compile Include="MMFParser\ChunkLoaders\Banks\MusicBank.cs" />
<Compile Include="MMFParser\ChunkLoaders\Banks\SoundBank.cs" />
<Compile Include="MMFParser\ChunkLoaders\StringChunk.cs" />
<Compile Include="MMFParser\ChunkLoaders\yves.cs" />
<Compile Include="MMFParser\Translation\MFAGenerator.cs" />
<Compile Include="MMFParser\Translation\PAME2MFA.cs" />
<Compile Include="MMFParser\EXE\ChunkList.cs" />
<Compile Include="MMFParser\EXE\Loaders\AppHeader.cs" />
<Compile Include="MMFParser\EXE\Loaders\AppMenu.cs" />
<Compile Include="MMFParser\EXE\Loaders\Banks\FontBank.cs" />
<Compile Include="MMFParser\EXE\Loaders\Banks\ImageBank.cs" />
<Compile Include="MMFParser\EXE\Loaders\Banks\MusicBank.cs" />
<Compile Include="MMFParser\EXE\Loaders\Banks\SoundBank.cs" />
<Compile Include="MMFParser\EXE\Loaders\ChunkLoader.cs" />
<Compile Include="MMFParser\EXE\Loaders\Events\Events.cs" />
<Compile Include="MMFParser\EXE\Loaders\Events\EventsParts.cs" />
<Compile Include="MMFParser\EXE\Loaders\Events\Expressions\Expression.cs" />
<Compile Include="MMFParser\EXE\Loaders\Events\Parameters\AlterableValue.cs" />
<Compile Include="MMFParser\EXE\Loaders\Events\Parameters\Colour.cs" />
<Compile Include="MMFParser\EXE\Loaders\Events\Parameters\Create.cs" />
<Compile Include="MMFParser\EXE\Loaders\Events\Parameters\Every.cs" />
<Compile Include="MMFParser\EXE\Loaders\Events\Parameters\Float.cs" />
<Compile Include="MMFParser\EXE\Loaders\Events\Parameters\GlobalValue.cs" />
<Compile Include="MMFParser\EXE\Loaders\Events\Parameters\Int.cs" />
<Compile Include="MMFParser\EXE\Loaders\Events\Parameters\ParameterCommon.cs" />
<Compile Include="MMFParser\EXE\Loaders\Events\Parameters\ParamObject.cs" />
<Compile Include="MMFParser\EXE\Loaders\Events\Parameters\Position.cs" />
<Compile Include="MMFParser\EXE\Loaders\Events\Parameters\Remark.cs" />
<Compile Include="MMFParser\EXE\Loaders\Events\Parameters\Sample.cs" />
<Compile Include="MMFParser\EXE\Loaders\Events\Parameters\Short.cs" />
<Compile Include="MMFParser\EXE\Loaders\Events\Parameters\Time.cs" />
<Compile Include="MMFParser\EXE\Loaders\ExtData.cs" />
<Compile Include="MMFParser\EXE\Loaders\Frame.cs" />
<Compile Include="MMFParser\EXE\Loaders\FrameItems.cs" />
<Compile Include="MMFParser\EXE\Loaders\Globals.cs" />
<Compile Include="MMFParser\EXE\Loaders\ObjectInfo.cs" />
<Compile Include="MMFParser\EXE\Loaders\ObjectNames.cs" />
<Compile Include="MMFParser\EXE\Loaders\Objects\Animations.cs" />
<Compile Include="MMFParser\EXE\Loaders\Objects\Backdrop.cs" />
<Compile Include="MMFParser\EXE\Loaders\Objects\Counters.cs" />
<Compile Include="MMFParser\EXE\Loaders\Objects\ObjectCommon.cs" />
<Compile Include="MMFParser\EXE\Loaders\Objects\Value.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\DataLoader.cs" />
<Compile Include="MMFParser\EXE\EXE.cs" />
<Compile Include="MMFParser\EXE\GameData.cs" />
<Compile Include="MMFParser\EXE\PackData.cs" />
<Compile Include="MMFParser\Constants.cs" />
<Compile Include="MMFParser\MFA\Loaders\Transition.cs" />
<Compile Include="MMFParser\MFA\MFA.cs" />
<Compile Include="MMFParser\MFA\Loaders\ChunkList.cs" />
<Compile Include="MMFParser\MFA\Loaders\Controls.cs" />
<Compile Include="MMFParser\MFA\Loaders\Events.cs" />
<Compile Include="MMFParser\MFA\Loaders\Frame.cs" />
<Compile Include="MMFParser\MFA\Loaders\FrameInstance.cs" />
<Compile Include="MMFParser\MFA\Loaders\FrameItem.cs" />
<Compile Include="MMFParser\MFA\Loaders\ImageBank.cs" />
<Compile Include="MMFParser\MFA\Loaders\ItemFolder.cs" />
<Compile Include="MMFParser\MFA\Loaders\Layer.cs" />
<Compile Include="MMFParser\MFA\Loaders\mfachunks\Active.cs" />
<Compile Include="MMFParser\MFA\Loaders\mfachunks\AnimationObject.cs" />
<Compile Include="MMFParser\MFA\Loaders\mfachunks\Behaviours.cs" />
<Compile Include="MMFParser\MFA\Loaders\mfachunks\Movements.cs" />
<Compile Include="MMFParser\MFA\Loaders\mfachunks\ObjectLoader.cs" />
<Compile Include="MMFParser\MFA\Loaders\ValueList.cs" />
<Compile Include="PluginAPI\IPlugin.cs" />
<Compile Include="PluginAPI\PluginAPI.cs" />
<Compile Include="Settings.cs" />
<Compile Include="Utils\Backend.cs" />
<Compile Include="Utils\BitDict.cs" />
<Compile Include="Utils\ByteFlag.cs" />
<Compile Include="Utils\ByteWriter.cs" />
<Compile Include="Utils\Helper.cs" />
<Compile Include="MMFParser\Data\ChunkList.cs" />
<Compile Include="MMFParser\Data\GameData.cs" />
<Compile Include="MMFParser\Data\PackData.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Utils\ByteReader.cs" />
@ -261,6 +271,9 @@
<EmbeddedResource Include="GUI\MainForm.resx">
<DependentUpon>MainForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="GUI\MFABuilderForm.resx">
<DependentUpon>MFABuilderForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="GUI\PackDataForm.resx">
<DependentUpon>PackDataForm.cs</DependentUpon>
</EmbeddedResource>

@ -1,6 +1,6 @@
using System.Windows.Forms;
using DotNetCTFDumper.MMFParser.ChunkLoaders;
using DotNetCTFDumper.MMFParser.Data;
using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.MMFParser.EXE.Loaders;
namespace DotNetCTFDumper.GUI
{

@ -33,12 +33,12 @@ namespace DotNetCTFDumper.GUI
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrameViewer));
this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
this.infoMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.nameMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.positionMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.deleteObjBtn = new System.Windows.Forms.ToolStripMenuItem();
this.scrollableControl1 = new System.Windows.Forms.ScrollableControl();
this.contextMenuStrip1.SuspendLayout();
this.SuspendLayout();
//
@ -74,22 +74,13 @@ namespace DotNetCTFDumper.GUI
this.deleteObjBtn.Size = new System.Drawing.Size(107, 22);
this.deleteObjBtn.Text = "Delete";
//
// scrollableControl1
//
this.scrollableControl1.AutoScroll = true;
this.scrollableControl1.Dock = System.Windows.Forms.DockStyle.Fill;
this.scrollableControl1.Location = new System.Drawing.Point(0, 0);
this.scrollableControl1.Name = "scrollableControl1";
this.scrollableControl1.Size = new System.Drawing.Size(1008, 733);
this.scrollableControl1.TabIndex = 1;
this.scrollableControl1.Text = "scrollableControl1";
//
// FrameViewer
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.AutoScroll = true;
this.ClientSize = new System.Drawing.Size(1008, 733);
this.Controls.Add(this.scrollableControl1);
this.Icon = ((System.Drawing.Icon) (resources.GetObject("$this.Icon")));
this.Name = "FrameViewer";
this.Text = "FrameViewer";
this.contextMenuStrip1.ResumeLayout(false);
@ -101,7 +92,6 @@ namespace DotNetCTFDumper.GUI
private System.Windows.Forms.ToolStripMenuItem infoMenuItem;
private System.Windows.Forms.ToolStripMenuItem nameMenuItem;
private System.Windows.Forms.ToolStripMenuItem positionMenuItem;
private System.Windows.Forms.ScrollableControl scrollableControl1;
#endregion
}

@ -3,12 +3,10 @@ using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
using DotNetCTFDumper.MMFParser.ChunkLoaders;
using DotNetCTFDumper.MMFParser.ChunkLoaders.Banks;
using DotNetCTFDumper.MMFParser.ChunkLoaders.Objects;
using DotNetCTFDumper.MMFParser.Data;
using DotNetCTFDumper.MMFParser.MFALoaders;
using Frame = DotNetCTFDumper.MMFParser.ChunkLoaders.Frame;
using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.MMFParser.EXE.Loaders;
using DotNetCTFDumper.MMFParser.EXE.Loaders.Banks;
using Frame = DotNetCTFDumper.MMFParser.EXE.Loaders.Frame;
namespace DotNetCTFDumper.GUI
{
@ -27,7 +25,7 @@ namespace DotNetCTFDumper.GUI
InitializeComponent();
this.Width = frame.Width;
this.Height = frame.Height;
this.BackColor = frame.Background;
this.BackColor = Color.FromArgb(255,frame.Background.R,frame.Background.G,frame.Background.B);
this.Text = "Frame Viewer: "+frame.Name;
images = imgs;
contextMenuStrip1.ItemClicked+= new ToolStripItemClickedEventHandler(MenuItemSelected);
@ -46,7 +44,7 @@ namespace DotNetCTFDumper.GUI
pictureBox1.ClientSize = new Size(img.Bitmap.Width, img.Bitmap.Height);
pictureBox1.Image = img.Bitmap;
pictureBox1.MouseClick += new MouseEventHandler(OnObjectSelected);
scrollableControl1.Controls.Add(pictureBox1);
Controls.Add(pictureBox1);
}
}
@ -70,7 +68,7 @@ namespace DotNetCTFDumper.GUI
private void LoadObjects(Frame frame)
{
var size = new Size(Exe.Instance.GameData.Header.WindowWidth,Exe.Instance.GameData.Header.WindowHeight);
scrollableControl1.Size = new Size(frame.Width,frame.Height);;
//scrollableControl1.Size = new Size(frame.Width,frame.Height);;
ClientSize = size;
var list = frame.Objects.Items.OrderBy(x=>x.Handle);
foreach (var obj in list)

File diff suppressed because it is too large Load Diff

@ -11,9 +11,7 @@ namespace DotNetCTFDumper.GUI
{
public byte[] parsedData;
public byte[] rawData;
private ByteViewer _viewer;
public HexViewForm(byte[] parsedData, byte[] rawData,Color color)
{
InitializeComponent();
@ -74,7 +72,7 @@ namespace DotNetCTFDumper.GUI
private void hexBox1_Click(object sender, EventArgs e)
{
Console.WriteLine("Semen");
}
}

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

@ -56,6 +56,7 @@
this.musicsButton = new System.Windows.Forms.Button();
this.musicBar = new System.Windows.Forms.ProgressBar();
this.musicLabel = new System.Windows.Forms.Label();
this.SortedProgressBar = new System.Windows.Forms.ProgressBar();
this.ChunkCombo.SuspendLayout();
this.SuspendLayout();
//
@ -100,20 +101,20 @@
//
// listBox1
//
this.listBox1.Anchor = ((System.Windows.Forms.AnchorStyles) (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Right)));
this.listBox1.Anchor = ((System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.listBox1.BackColor = System.Drawing.Color.Black;
this.listBox1.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.listBox1.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte) (204)));
this.listBox1.Font = new System.Drawing.Font("Courier New", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte) (204)));
this.listBox1.ForeColor = System.Drawing.Color.FromArgb(((int) (((byte) (255)))), ((int) (((byte) (128)))), ((int) (((byte) (0)))));
this.listBox1.FormattingEnabled = true;
this.listBox1.IntegralHeight = false;
this.listBox1.ItemHeight = 14;
this.listBox1.Location = new System.Drawing.Point(459, 12);
this.listBox1.ItemHeight = 17;
this.listBox1.Location = new System.Drawing.Point(342, 9);
this.listBox1.Margin = new System.Windows.Forms.Padding(0);
this.listBox1.MaximumSize = new System.Drawing.Size(180, 50000);
this.listBox1.MaximumSize = new System.Drawing.Size(300, 50000);
this.listBox1.MinimumSize = new System.Drawing.Size(180, 234);
this.listBox1.Name = "listBox1";
this.listBox1.Size = new System.Drawing.Size(180, 281);
this.listBox1.Size = new System.Drawing.Size(300, 277);
this.listBox1.TabIndex = 5;
//
// GameInfo
@ -268,7 +269,7 @@
this.loadingLabel.ForeColor = System.Drawing.Color.FromArgb(((int) (((byte) (255)))), ((int) (((byte) (128)))), ((int) (((byte) (0)))));
this.loadingLabel.Location = new System.Drawing.Point(119, 12);
this.loadingLabel.Name = "loadingLabel";
this.loadingLabel.Size = new System.Drawing.Size(335, 91);
this.loadingLabel.Size = new System.Drawing.Size(197, 91);
this.loadingLabel.TabIndex = 16;
this.loadingLabel.Text = "Loading...";
//
@ -403,12 +404,22 @@
this.musicLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.musicLabel.Visible = false;
//
// SortedProgressBar
//
this.SortedProgressBar.Location = new System.Drawing.Point(190, 310);
this.SortedProgressBar.Name = "SortedProgressBar";
this.SortedProgressBar.Size = new System.Drawing.Size(209, 41);
this.SortedProgressBar.Style = System.Windows.Forms.ProgressBarStyle.Continuous;
this.SortedProgressBar.TabIndex = 24;
this.SortedProgressBar.Visible = false;
//
// MainForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.Black;
this.ClientSize = new System.Drawing.Size(943, 507);
this.Controls.Add(this.SortedProgressBar);
this.Controls.Add(this.musicLabel);
this.Controls.Add(this.musicBar);
this.Controls.Add(this.musicsButton);
@ -440,6 +451,8 @@
this.PerformLayout();
}
private System.Windows.Forms.ProgressBar SortedProgressBar;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.ContextMenuStrip ChunkCombo;
private System.Windows.Forms.Button cryptKeyBtn;

@ -1,13 +1,14 @@
using System;
using System.CodeDom;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.Threading;
using System.Windows.Forms;
using DotNetCTFDumper.MMFParser.ChunkLoaders;
using DotNetCTFDumper.MMFParser.ChunkLoaders.Banks;
using DotNetCTFDumper.MMFParser.Data;
using DotNetCTFDumper.MMFParser.Decompiling;
using DotNetCTFDumper.MMFParser;
using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.MMFParser.EXE.Loaders;
using DotNetCTFDumper.MMFParser.EXE.Loaders.Banks;
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.GUI
@ -25,6 +26,11 @@ namespace DotNetCTFDumper.GUI
public PackDataForm PackForm;
public delegate void SaveHandler(int index, int all);
public delegate void IncrementSortedProgressBar(int all);
public MainForm()
{
//Buttons
@ -89,11 +95,11 @@ namespace DotNetCTFDumper.GUI
private void StartReading()
{
var path = openFileDialog1.FileName;
loadingLabel.Visible = true;
Program.ReadFile(path, Settings.Verbose, Settings.DumpImages, Settings.DumpSounds);
imageBar.Value = 0;
soundBar.Value = 0;
soundBar.Value = 0;
GameInfo.Text = "";
loadingLabel.Visible = true;
imageLabel.Text = "Using nonGUI mode";
soundLabel.Text = "Using nonGUI mode";
@ -196,17 +202,15 @@ namespace DotNetCTFDumper.GUI
treeView1.Nodes.Clear();
foreach (var item in gameData.GameChunks.Chunks)
{
string ActualName = item.Name;
if (item.Loader is Frame frm) ActualName = ActualName + " "+frm.Name;
ChunkNode newNode = Helper.GetChunkNode(item,ActualName);
if (item.Loader is Frame frm) ActualName = ActualName + " " + frm.Name;
ChunkNode newNode = Helper.GetChunkNode(item, ActualName);
//if (item.Loader != null) newNode = new ChunkNode(ActualName, item.Loader);
//else newNode = new ChunkNode(ActualName, item);
treeView1.Nodes.Add(newNode);
if (item.Loader is Frame frame)
{
foreach (var frmChunk in frame.Chunks.Chunks)
{
var frameNode = Helper.GetChunkNode(frmChunk);
@ -224,8 +228,18 @@ namespace DotNetCTFDumper.GUI
}
}
}
}
}
else if (item.Loader is FrameItems items)
{
foreach (var key in items.ItemDict.Keys)
{
var frameItem = items.ItemDict[key];
var objNode = new ChunkNode($"{(Constants.ObjectType)frameItem.ObjectType} - {frameItem.Name}", frameItem);
newNode.Nodes.Add(objNode);
}
}
}
MFABtn.Visible = true;
FolderBTN.Visible = true;
@ -240,14 +254,14 @@ namespace DotNetCTFDumper.GUI
loadingLabel.Visible = false;
var toLog = "";
toLog += $"Title:{Exe.Instance.GameData.Name}\n";
toLog += $"Copyright:{Exe.Instance.GameData.Copyright}\n";
toLog += $"Editor Filename: {Exe.Instance.GameData.EditorFilename}\n";
toLog += $"Copyright:{Exe.Instance.GameData.Copyright}\n";
//toLog += $"Editor Filename: {Exe.Instance.GameData.EditorFilename}\n";
toLog += $"Product Version: {Exe.Instance.GameData.ProductVersion}\n";
toLog += $"Build: {Exe.Instance.GameData.Build}\n";
toLog += $"Runtime Version: {Exe.Instance.GameData.RuntimeVersion}\n";
toLog += $"Number Of Images: {Exe.Instance.GameData.Images.NumberOfItems}\n";
toLog += $"Number Of Sounds: {(Exe.Instance.GameData.Sounds!= null ? Exe.Instance.GameData.Sounds.NumOfItems: 0)}\n";
toLog += $"Unique FrameItems: {Exe.Instance.GameData.Frameitems.NumberOfItems}\n";
toLog += $"Number Of Images: {Exe.Instance.GameData.Images?.NumberOfItems}\n";
toLog += $"Number Of Sounds: {Exe.Instance.GameData.Sounds?.NumOfItems}\n";
toLog += $"Unique FrameItems: {Exe.Instance.GameData.Frameitems?.NumberOfItems}\n";
toLog += $"Frame Count: {Exe.Instance.GameData.Frames.Count}\n";
toLog += $"Chunks Count: {Exe.Instance.GameData.GameChunks.Chunks.Count}\n";
if (Exe.Instance.GameData.GameChunks.GetChunk<ImageBank>() != null)
@ -256,6 +270,8 @@ namespace DotNetCTFDumper.GUI
Exe.Instance.GameData.GameChunks.GetChunk<SoundBank>().OnSoundSaved += UpdateSoundBar;
if (Exe.Instance.GameData.GameChunks.GetChunk<MusicBank>() != null)
Exe.Instance.GameData.GameChunks.GetChunk<MusicBank>().OnMusicSaved += UpdateMusicBar;
ImageDumper.SortedImageSaved += IncrementSortedBar;
GameInfo.Text = toLog;
}
@ -283,6 +299,17 @@ namespace DotNetCTFDumper.GUI
musicLabel.Text = $"{index}/{all}";
}
public void IncrementSortedBar(int all)
{
SortedProgressBar.Visible = true;
SortedProgressBar.Maximum = all;
SortedProgressBar.Value += 1;
if (SortedProgressBar.Value >= SortedProgressBar.Maximum)
{
SortedProgressBar.Visible = false;
}
}
private void FolderBTN_Click(object sender, EventArgs e)
{
@ -291,7 +318,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)

@ -1,5 +1,5 @@
using System.Windows.Forms;
using DotNetCTFDumper.MMFParser.ChunkLoaders;
using DotNetCTFDumper.MMFParser.EXE.Loaders;
namespace DotNetCTFDumper.GUI
{

@ -58,7 +58,7 @@ namespace DotNetCTFDumper.GUI
//
this.dumpButton.BackColor = System.Drawing.Color.FromArgb(((int) (((byte) (64)))), ((int) (((byte) (64)))), ((int) (((byte) (64)))));
this.dumpButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.dumpButton.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte) (204)));
this.dumpButton.Font = new System.Drawing.Font("Courier New", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte) (204)));
this.dumpButton.ForeColor = System.Drawing.Color.FromArgb(((int) (((byte) (255)))), ((int) (((byte) (128)))), ((int) (((byte) (0)))));
this.dumpButton.Location = new System.Drawing.Point(204, 105);
this.dumpButton.Name = "dumpButton";
@ -72,7 +72,7 @@ namespace DotNetCTFDumper.GUI
//
this.dumpAllButton.BackColor = System.Drawing.Color.FromArgb(((int) (((byte) (64)))), ((int) (((byte) (64)))), ((int) (((byte) (64)))));
this.dumpAllButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.dumpAllButton.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte) (204)));
this.dumpAllButton.Font = new System.Drawing.Font("Courier New", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte) (204)));
this.dumpAllButton.ForeColor = System.Drawing.Color.FromArgb(((int) (((byte) (255)))), ((int) (((byte) (128)))), ((int) (((byte) (0)))));
this.dumpAllButton.Location = new System.Drawing.Point(204, 148);
this.dumpAllButton.Name = "dumpAllButton";
@ -88,7 +88,7 @@ namespace DotNetCTFDumper.GUI
this.infoLabel.ForeColor = System.Drawing.Color.FromArgb(((int) (((byte) (255)))), ((int) (((byte) (128)))), ((int) (((byte) (0)))));
this.infoLabel.Location = new System.Drawing.Point(204, 14);
this.infoLabel.Name = "infoLabel";
this.infoLabel.Size = new System.Drawing.Size(142, 91);
this.infoLabel.Size = new System.Drawing.Size(255, 91);
this.infoLabel.TabIndex = 3;
this.infoLabel.Text = "Name: PackFile1.mvx\r\nSize: 5 MB\r\n";
//

@ -3,7 +3,7 @@ using System.ComponentModel;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
using DotNetCTFDumper.MMFParser.Data;
using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.GUI

@ -1,61 +0,0 @@

using DotNetCTFDumper.MMFParser.Data;
namespace DotNetCTFDumper.MMFParser.Decompiling
{
public static class Pame2Mfa
{
public static void Translate(ref MFA mfa, GameData game)
{
//mfa.MfaBuild = 4;
//mfa.Product = (int) game.ProductVersion;
mfa.BuildVersion = 283;
mfa.Name = game.Name;
mfa.Description = $"Decompiled with {Settings.DumperVersion}";
mfa.Path = game.EditorFilename;
return;
//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;
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;
}
}
}

@ -1,12 +1,11 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Xml.Linq;
using DotNetCTFDumper.MMFParser.ChunkLoaders;
using DotNetCTFDumper.MMFParser.ChunkLoaders.Banks;
using DotNetCTFDumper.MMFParser.EXE.Loaders;
using DotNetCTFDumper.MMFParser.EXE.Loaders.Banks;
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.Data
namespace DotNetCTFDumper.MMFParser.EXE
{
public class ChunkList
{
@ -63,7 +62,7 @@ namespace DotNetCTFDumper.MMFParser.Data
{
Id = exeReader.ReadInt16();
Name = this.ActualName();
Name = _chunkList.GetNameByID(Id);
Flag = (ChunkFlags) exeReader.ReadInt16();
Size = exeReader.ReadInt32();
@ -227,9 +226,21 @@ namespace DotNetCTFDumper.MMFParser.Data
case 13108:
loader = new FrameHeader(chunk);
break;
case 13111:
loader = new FramePalette(chunk);
break;
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;
case 26214:
loader = new ImageBank(chunk);
break;
@ -290,6 +301,105 @@ namespace DotNetCTFDumper.MMFParser.Data
//Logger.Log($"ChunkLoader {typeof(T).Name} not found", true, ConsoleColor.Red);
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)
{
Chunks.Remove(chunk);
return (T) chunk.Loader;
}
}
}
return null;
}
public string GetNameByID(int id)
{
switch (id)
{
case 4386: return "PREVIEW";
case 8738: return "Mini Header";
case 8739: return "Header";
case 8740: return "Title";
case 8741: return "Author";
case 8742: return "Menu";
case 8743: return "Extra Path";
case 8744: return "Extensions";
case 8745: return "Object Bank";
case 8746: return "Global Events";
case 8747: return "Frame Handles";
case 8748: return "Extra Data";
case 8749: return "Additional Extensions";
case 8750: return "Project Path";
case 8751: return "Output Path";
case 8752: return "App Doc";
case 8753: return "Other Extensions";
case 8754: return "Global Values";
case 8755: return "Global Strings";
case 8756: return "Extensions List";
case 8757: return "Icon";
case 8758: return "Demo Version";
case 8759: return "Security Number";
case 8760: return "Binary Files";
case 8761: return "Menu Images";
case 8762: return "About";
case 8763: return "Copyright";
case 8764: return "Global Value Names";
case 8765: return "Global String Names";
case 8766: return "Movement Extensions";
case 8767: return "Object Bank 2";
case 8768: return "EXE Only";
case 8770: return "Protection";
case 8771: return "Shaders";
case 8773: return "Extended Header";
case 13107:return "Frame";
case 13108:return "Frame Header";
case 13109:return "Frame Name";
case 13110:return "Frame Password";
case 13111:return "Frame Palette";
case 13112:return "Frame Objects";
case 13113:return "Frame Fade In Frame";
case 13114:return "Frame Fade Out Frame";
case 13115:return "Frame Fade In";
case 13116:return "Frame Fade Out";
case 13117:return "Frame Events";
case 13118:return "Frame Play Header";
case 13119:return "Additional Frame Item";
case 13120:return "Additional Object Instance";
case 13121:return "Frame Layers";
case 13122:return "Frame Virtual Rect";
case 13123:return "Demo File Path";
case 13124:return "Random Seed";
case 13125:return "Frame Layer Effects";
case 13126:return "Bluray Options";
case 13127:return "MVTimer Base";
case 13128:return "Mosaic Image Table";
case 13129:return "Frame Effects";
case 13130:return "Frame Iphone Options";
case 17476:return "Object Header";
case 17477:return "Object Name";
case 17478:return "Object Common";
case 17479:return "Object Unknown";
case 17480:return "Object Effects";
case 21845:return "Image Offsets";
case 21846:return "Font Offsets";
case 21847:return "Sound Offsets";
case 21848:return "Music Offsets";
case 26214:return "Image Bank";
case 26215:return "Font Bank";
case 26216:return "Sound Bank";
case 26217:return "Music Bank";
case 32639:return "Last";
default: return $"Unknown-{id}";
}
}
}
}

@ -1,7 +1,7 @@
using DotNetCTFDumper.Utils;
using static DotNetCTFDumper.MMFParser.Data.ChunkList;
using static DotNetCTFDumper.MMFParser.EXE.ChunkList;
namespace DotNetCTFDumper.MMFParser.Data
namespace DotNetCTFDumper.MMFParser.EXE
{
public abstract class DataLoader
{

@ -1,8 +1,9 @@
using System;
using System.Data.OleDb;
using System.IO;
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.Data
namespace DotNetCTFDumper.MMFParser.EXE
{
public class Exe
{
@ -66,18 +67,25 @@ namespace DotNetCTFDumper.MMFParser.Data
exeReader.Seek((int)possition);
UInt16 firstShort = exeReader.PeekUInt16();
Logger.Log("First Short: " + firstShort.ToString("X2"), true, ConsoleColor.Yellow);
if (firstShort == 0x7777)
if (firstShort == 0x7777) Settings.Old = false;
else Settings.Old = true;
if (!Settings.Old)
{
Logger.Log("Found PackData header!\nReading PackData header.", true, ConsoleColor.Blue);
PackData = new PackData();
PackData.Read(exeReader);
GameData = new GameData();
GameData.Read(exeReader);
Console.ForegroundColor = ConsoleColor.DarkGreen;
Logger.Log("Found PackData header!\nReading PackData header.", true, ConsoleColor.Blue);
}
else
{
var oldData = new ChunkList();
oldData.Read(exeReader);
GameData = new GameData();
GameData.Read(exeReader);
Console.ForegroundColor = ConsoleColor.DarkGreen;
Logger.Log("Failed to find PackData header!\n", true, ConsoleColor.Red);
}

@ -1,10 +1,10 @@
using System;
using System.Collections.Generic;
using DotNetCTFDumper.MMFParser.ChunkLoaders;
using DotNetCTFDumper.MMFParser.ChunkLoaders.Banks;
using DotNetCTFDumper.MMFParser.EXE.Loaders;
using DotNetCTFDumper.MMFParser.EXE.Loaders.Banks;
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.Data
namespace DotNetCTFDumper.MMFParser.EXE
{
public class GameData
{

@ -2,9 +2,9 @@
using System.Collections.Generic;
using System.Drawing;
using DotNetCTFDumper.Utils;
using static DotNetCTFDumper.MMFParser.Data.ChunkList;
using static DotNetCTFDumper.MMFParser.EXE.ChunkList;
namespace DotNetCTFDumper.MMFParser.ChunkLoaders
namespace DotNetCTFDumper.MMFParser.EXE.Loaders
{
public class AppHeader : ChunkLoader
{
@ -59,13 +59,12 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders
public override void Read()
{
Reader = new ByteReader(Chunk.ChunkData);
Size = Reader.ReadInt32();
Flags.flag=(uint) Reader.ReadInt16();
NewFlags.flag = (uint) Reader.ReadInt16();
var graphicsMode = Reader.ReadInt16();
var otherflags = Reader.ReadInt16();// I am an asshole
var otherflags = Reader.ReadInt16();
//TODO: Add OtherFlags
WindowWidth = Reader.ReadInt16();
@ -99,6 +98,7 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders
$"Screen Resolution: {WindowWidth}x{WindowHeight}",
$"Initial Score: {InitialScore}",
$"Initial Lives: {InitialLives}",
"",
$"Flags:;{Flags.ToString()}"
};
}

@ -1,11 +1,11 @@
using System;
using System.Collections.Generic;
using System.Diagnostics.Eventing;
using System.IO;
using DotNetCTFDumper.Utils;
using Ionic.Zip;
using static DotNetCTFDumper.MMFParser.Data.ChunkList;
using static DotNetCTFDumper.MMFParser.EXE.ChunkList;
namespace DotNetCTFDumper.MMFParser.ChunkLoaders
namespace DotNetCTFDumper.MMFParser.EXE.Loaders
{
public class AppMenu : ChunkLoader
{
@ -63,7 +63,7 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders
{
writer.WriteInt32(20);
writer.WriteInt32(20);
writer.WriteInt32(0);
//writer.WriteInt32(0);
ByteWriter menuDataWriter = new ByteWriter(new MemoryStream());
@ -72,20 +72,24 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders
item.Write(menuDataWriter);
}
writer.WriteUInt32((uint) menuDataWriter.BaseStream.Position);
writer.WriteUInt32((uint) menuDataWriter.BaseStream.Position+4);
//
writer.WriteUInt32((uint) (24 + menuDataWriter.BaseStream.Position));
writer.WriteInt32(AccelKey.Count * 8);
writer.WriteInt32(0);
writer.WriteWriter(menuDataWriter);
for (Int32 i = 0; i < AccelKey.Count; i++)
{
writer.WriteInt8(AccelShift[i]);
writer.WriteInt8(0);
writer.WriteInt16(AccelKey[i]);
writer.WriteInt16(AccelId[i]);
writer.WriteInt8(0);
writer.WriteInt16(0);
}
}
public void Load(ByteReader reader)

@ -1,7 +1,7 @@
using DotNetCTFDumper.Utils;
using static DotNetCTFDumper.MMFParser.Data.ChunkList;
using static DotNetCTFDumper.MMFParser.EXE.ChunkList;
namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Banks
namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Banks
{
public class FontBank : ChunkLoader
{
@ -23,7 +23,7 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Banks
public void Write(ByteWriter writer)
{
writer.WriteInt32(NumberOfItems);
//i am testing with no fonts suck pinus haha
//i am testing with no fonts
}
public FontBank(ByteReader reader) : base(reader)

@ -5,17 +5,17 @@ using System.Drawing.Imaging;
using System.IO;
using System.Runtime.InteropServices;
using DotNetCTFDumper.GUI;
using DotNetCTFDumper.MMFParser.Data;
using DotNetCTFDumper.Utils;
using static DotNetCTFDumper.MMFParser.Data.ChunkList;
using static DotNetCTFDumper.MMFParser.EXE.ChunkList;
namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Banks
namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Banks
{
public class ImageBank : ChunkLoader
{
public bool SaveImages = true;
public bool SaveImages = false;
public Dictionary<int, ImageItem> Images = new Dictionary<int, ImageItem>();
public uint NumberOfItems;
public bool PreloadOnly=true;
public ImageBank(ByteReader reader) : base(reader)
{
@ -46,6 +46,16 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Banks
Settings.DumpImages = cache;
}
public void Preload()
{
}
public void LoadByHandle(int handle)
{
Images[handle].Load();
}
public event MainForm.SaveHandler OnImageSaved;
@ -56,25 +66,26 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Banks
public override void Read()
{
if (!Settings.DoMFA) Reader.Seek(0); //Reset the reader to avoid bugs when dumping more than once
Images = new Dictionary<int, ImageItem>();
var tempImages = new Dictionary<int, ImageItem>();
NumberOfItems = Reader.ReadUInt32();
Console.WriteLine($"Found {NumberOfItems} images");
if (!Settings.DumpImages) return;
//if (!Settings.DumpImages) return;
for (int i = 0; i < NumberOfItems; i++)
{
if (MainForm.BreakImages)
{
MainForm.BreakImages = false;
break;
}
var item = new ImageItem(Reader);
item.Read();
Images.Add(item.Handle, item);
item.Read(!PreloadOnly);
tempImages.Add(item.Handle, item);
if (SaveImages) item.Save($"{Settings.ImagePath}\\" + item.Handle.ToString() + ".png");
OnImageSaved?.Invoke(i,(int) NumberOfItems);
@ -86,6 +97,10 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Banks
//images[item.handle] = item;
}
if (!MainForm.BreakImages) Images = tempImages;
MainForm.BreakImages = false;
Console.WriteLine("Len:"+Images.Keys.Count);
}
}
@ -129,11 +144,19 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Banks
public int Debug2 = 1;
private Bitmap _bitmap;
public void Read(bool load)
{
Handle = Reader.ReadInt32() - 1;
Position = (int) Reader.Tell();
if (load) Load();
else Preload();
}
public override void Read()
{
Handle = Reader.ReadInt32() - 1;
Position = (int) Reader.Tell();
Load();
Preload();
}
public override void Print(bool ext)
@ -145,14 +168,32 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Banks
throw new NotImplementedException();
}
public void Load()
public void Preload()
{
_bitmap = null;
Reader.Seek(Position);
ByteReader imageReader;
// imageReader = Debug ? Reader : Decompressor.DecompressAsReader(Reader, out var a);
imageReader = Debug ? Reader : Decompressor.DecompressAsReader(Reader, out var a);
long start = imageReader.Tell();
_checksum = imageReader.ReadInt32();
_references = imageReader.ReadInt32();
Size = (int) imageReader.ReadUInt32();
imageReader.Seek(start+Size);
}
public void Load()
{
_bitmap = null;
Reader.Seek(Position);
ByteReader imageReader;
// imageReader = Debug ? Reader : Decompressor.DecompressAsReader(Reader, out var a);
imageReader = Debug ? Reader : Decompressor.DecompressAsReader(Reader, out var a);
long start = imageReader.Tell();
_checksum = imageReader.ReadInt32();
@ -256,6 +297,7 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Banks
{
get
{
if (_colorArray==null) Load();
if (_bitmap == null)
{
_bitmap = new Bitmap(_width, _height, PixelFormat.Format32bppArgb);

@ -1,13 +1,11 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Windows.Forms;
using DotNetCTFDumper.GUI;
using DotNetCTFDumper.Utils;
using static DotNetCTFDumper.MMFParser.Data.ChunkList;
using static DotNetCTFDumper.MMFParser.EXE.ChunkList;
namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Banks
namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Banks
{
public class MusicBank : ChunkLoader
{
@ -33,8 +31,7 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Banks
public event MainForm.SaveHandler OnMusicSaved;
public override void Read()
{
//Someone is using this lol?
//Actually,yes
if (!Settings.DoMFA)Reader.Seek(0);//Reset the reader to avoid bugs when dumping more than once
Items = new List<MusicFile>();
NumOfItems = Reader.ReadInt32();

@ -3,9 +3,9 @@ using System.Collections.Generic;
using System.IO;
using DotNetCTFDumper.GUI;
using DotNetCTFDumper.Utils;
using static DotNetCTFDumper.MMFParser.Data.ChunkList;
using static DotNetCTFDumper.MMFParser.EXE.ChunkList;
namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Banks
namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Banks
{
public class SoundBank : ChunkLoader
{
@ -36,7 +36,6 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Banks
public event MainForm.SaveHandler OnSoundSaved;
public override void Read()
{
//Implementing for standalone-only because of my lazyness
if (!Settings.DoMFA)Reader.Seek(0);//Reset the reader to avoid bugs when dumping more than once

@ -1,8 +1,7 @@
using DotNetCTFDumper.MMFParser.Data;
using DotNetCTFDumper.Utils;
using static DotNetCTFDumper.MMFParser.Data.ChunkList;
using DotNetCTFDumper.Utils;
using static DotNetCTFDumper.MMFParser.EXE.ChunkList;
namespace DotNetCTFDumper.MMFParser.ChunkLoaders
namespace DotNetCTFDumper.MMFParser.EXE.Loaders
{
public abstract class ChunkLoader
{

@ -1,10 +1,10 @@
using System;
using System.Collections.Generic;
using System.Security.Cryptography.X509Certificates;
using System.IO;
using DotNetCTFDumper.Utils;
using static DotNetCTFDumper.MMFParser.Data.ChunkList;
using static DotNetCTFDumper.MMFParser.EXE.ChunkList;
namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Events
namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Events
{
public class Events : ChunkLoader
{
@ -50,12 +50,12 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Events
NumberOfConditions.Add(Reader.ReadInt16());
}
var qualifierCount = Reader.ReadInt16(); //should be 0, so i dont give a fuck
var qualifierCount = Reader.ReadInt16(); //should be 0, so i dont care
Quailifers = new Quailifer[qualifierCount + 1];
for (int i = 0; i < qualifierCount; i++)
{
var newQualifier = new Quailifer(Reader);
QualifiersList.Add(newQualifier); //fucking python types
QualifiersList.Add(newQualifier); //i dont understand python types
//THIS IS NOT DONE
}
}
@ -114,13 +114,16 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Events
public class EventGroup : ChunkLoader
{
public int Flags;
public ushort Flags;
public int IsRestricted;
public int RestrictCpt;
public int Identifier;
public int Undo;
public List<Condition> Conditions = new List<Condition>();
public List<Action> Actions = new List<Action>();
public int Size;
public byte NumberOfConditions;
public byte NumberOfActions;
public EventGroup(Chunk chunk) : base(chunk)
{
@ -143,10 +146,10 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Events
public override void Read()
{
var currentPosition = Reader.Tell();
var size = Reader.ReadInt16() * -1;
var numberOfConditions = Reader.ReadByte();
var numberOfActions = Reader.ReadByte();
var flags = Reader.ReadUInt16();
Size = Reader.ReadInt16() * -1;
NumberOfConditions = Reader.ReadByte();
NumberOfActions = Reader.ReadByte();
Flags = Reader.ReadUInt16();
if (Settings.Build >= 284)
{
var nop = Reader.ReadInt16();
@ -161,21 +164,21 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Events
Undo = Reader.ReadInt16();
}
for (int i = 0; i < numberOfConditions; i++)
for (int i = 0; i < NumberOfConditions; i++)
{
var item = new Condition(Reader);
item.Read();
Conditions.Add(item);
}
for (int i = 0; i < numberOfActions; i++)
for (int i = 0; i < NumberOfActions; i++)
{
var item = new Action(Reader);
item.Read();
Actions.Add(item);
}
Reader.Seek(currentPosition + size);
Reader.Seek(currentPosition + Size);
Console.WriteLine("IF:");
if (Conditions != null)
{
@ -197,6 +200,39 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Events
public void Write(ByteWriter Writer)
{
ByteWriter newWriter = new ByteWriter(new MemoryStream());
newWriter.WriteUInt8( (sbyte) Conditions.Count);
newWriter.WriteUInt8((sbyte) Actions.Count);
newWriter.WriteUInt16(Flags);
if (Settings.Build >= 284)
{
newWriter.WriteInt16(0);
newWriter.WriteInt32(IsRestricted);
newWriter.WriteInt32(RestrictCpt);
}
else
{
newWriter.WriteInt16((short) IsRestricted);
newWriter.WriteInt16((short) RestrictCpt);
newWriter.WriteInt16((short) Identifier);
newWriter.WriteInt16((short) Undo);
}
foreach (Condition condition in Conditions)
{
condition.Write(newWriter);
}
foreach (Action action in Actions)
{
action.Write(newWriter);
}
Writer.WriteInt16((short) ((newWriter.Size()+2)*-1));
Writer.WriteWriter(newWriter);
}
}
}

@ -1,9 +1,9 @@
using System;
using System.Collections.Generic;
using DotNetCTFDumper.MMFParser.Data;
using System.IO;
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Events
namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Events
{
public class Condition : DataLoader
{
@ -17,10 +17,28 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Events
public int Identifier;
public int ObjectInfoList;
public List<Parameter> Items = new List<Parameter>();
public Condition(ByteReader reader) : base(reader) { }
public override void Write(ByteWriter Writer)
{
throw new NotImplementedException();
ByteWriter newWriter = new ByteWriter(new MemoryStream());
newWriter.WriteInt16((short) ObjectType);
newWriter.WriteInt16((short) Num);
newWriter.WriteUInt16((ushort) ObjectInfo);
newWriter.WriteInt16((short) ObjectInfoList);
newWriter.WriteUInt8((sbyte) Flags);
newWriter.WriteUInt8((sbyte) OtherFlags);
newWriter.WriteUInt8((sbyte) Items.Count);
newWriter.WriteInt8((byte) DefType);
newWriter.WriteInt16((short) Identifier);
foreach (Parameter parameter in Items)
{
parameter.Write(newWriter);
}
Writer.WriteInt16((short) (newWriter.BaseStream.Position+2));
Writer.WriteWriter(newWriter);
}
public override void Print()
@ -54,7 +72,7 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Events
}
public override string ToString()
{
return $"Condition {ObjectType}-{Num}-{(Items.Count > 0 ? Items[0].ToString() : "cock")}";
return $"Condition {ObjectType}-{Num}{(Items.Count > 0 ? "-"+Items[0].ToString() : " ")}";
}
}
@ -72,7 +90,23 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Events
public Action(ByteReader reader) : base(reader) { }
public override void Write(ByteWriter Writer)
{
throw new NotImplementedException();
ByteWriter newWriter = new ByteWriter(new MemoryStream());
newWriter.WriteInt16((short) ObjectType);
newWriter.WriteInt16((short) Num);
newWriter.WriteUInt16((ushort) ObjectInfo);
newWriter.WriteInt16((short) ObjectInfoList);
newWriter.WriteUInt8((sbyte) Flags);
newWriter.WriteUInt8((sbyte) OtherFlags);
newWriter.WriteUInt8((sbyte) Items.Count);
newWriter.WriteInt8((byte) DefType);
foreach (Parameter parameter in Items)
{
parameter.Write(newWriter);
}
Writer.WriteInt16((short) (newWriter.BaseStream.Position+2));
Writer.WriteWriter(newWriter);
}
public override void Print( )
@ -104,7 +138,7 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Events
public override string ToString()
{
return $"Action {ObjectType}-{Num}-{(Items.Count>0?Items[0].ToString():"cock")}";
return $"Action {ObjectType}-{Num}{(Items.Count > 0 ? "-"+Items[0].ToString() : " ")}";
}
}

@ -1,8 +1,7 @@
using System;
using DotNetCTFDumper.MMFParser.Data;
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Events.Expressions
namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Events.Expressions
{
class Expression : DataLoader
{

@ -1,7 +1,7 @@
using System;
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Events.Parameters
namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Events.Parameters
{
class AlterableValue : Short
{

@ -1,7 +1,7 @@
using System.Drawing;
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Events.Parameters
namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Events.Parameters
{
class Colour : ParameterCommon
{

@ -1,6 +1,6 @@
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Events.Parameters
namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Events.Parameters
{
class Create : ParameterCommon
{

@ -1,6 +1,6 @@
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Events.Parameters
namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Events.Parameters
{
class Every : ParameterCommon
{

@ -1,6 +1,6 @@
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Events.Parameters
namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Events.Parameters
{
class Float : ParameterCommon
{

@ -1,7 +1,7 @@
using System;
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Events.Parameters
namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Events.Parameters
{
class GlobalValue : Short
{

@ -1,6 +1,6 @@
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Events.Parameters
namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Events.Parameters
{
class Int : Short
{

@ -1,6 +1,6 @@
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Events.Parameters
namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Events.Parameters
{
class ParamObject : ParameterCommon
{

@ -1,8 +1,7 @@
using System;
using DotNetCTFDumper.MMFParser.Data;
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Events.Parameters
namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Events.Parameters
{
class ParameterCommon : DataLoader
{

@ -1,6 +1,6 @@
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Events.Parameters
namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Events.Parameters
{
class Position : ParameterCommon
{

@ -1,6 +1,6 @@
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Events.Parameters
namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Events.Parameters
{
class Remark : ParameterCommon
{

@ -1,6 +1,6 @@
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Events.Parameters
namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Events.Parameters
{
class Sample : ParameterCommon
{

@ -1,6 +1,6 @@
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Events.Parameters
namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Events.Parameters
{
class Short : ParameterCommon
{

@ -1,6 +1,6 @@
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Events.Parameters
namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Events.Parameters
{
class Time : ParameterCommon
{

@ -1,7 +1,7 @@
using System;
using static DotNetCTFDumper.MMFParser.Data.ChunkList;
using static DotNetCTFDumper.MMFParser.EXE.ChunkList;
namespace DotNetCTFDumper.MMFParser.ChunkLoaders
namespace DotNetCTFDumper.MMFParser.EXE.Loaders
{
class ExtData : ChunkLoader
{

@ -1,11 +1,10 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using DotNetCTFDumper.MMFParser.Data;
using System.Drawing.Imaging;
using DotNetCTFDumper.Utils;
using ChunkList = DotNetCTFDumper.MMFParser.Data.ChunkList;
namespace DotNetCTFDumper.MMFParser.ChunkLoaders
namespace DotNetCTFDumper.MMFParser.EXE.Loaders
{
class FrameName : StringChunk
{
@ -45,6 +44,11 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders
public ChunkList Chunks;
public FrameHeader Header;
public ObjectInstances Objects;
public Layers Layers;
public Events.Events Events;
public FramePalette Palette;
public Transition FadeIn;
public Transition FadeOut;
public override void Print(bool ext)
@ -76,7 +80,6 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders
Chunks.Verbose = false;
Chunks.Read(frameReader);
//return;
var name = Chunks.GetChunk<FrameName>();
if (name != null) //Just to be sure
{
@ -88,8 +91,22 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders
{
this.Password = password.Value;
}
var layers = Chunks.GetChunk<Layers>();
if (layers != null)
{
Layers = layers;
}
var events = Chunks.GetChunk<Events.Events>();
if (events != null)
{
Events = events;
}
var palette = Chunks.GetChunk<FramePalette>();
if (palette != null)
{
Palette = palette;
}
Header = Chunks.GetChunk<FrameHeader>();
Width = Header.Width;
Height = Header.Height;
@ -100,7 +117,10 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders
{
CountOfObjs = Objects.CountOfObjects;
}
FadeIn = Chunks.PopChunk<Transition>();
FadeOut = Chunks.PopChunk<Transition>();
@ -213,7 +233,7 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders
public override void Read()
{
CountOfObjects = (int)Reader.ReadUInt32();
CountOfObjects = Reader.ReadInt32();
for (int i = 0; i < CountOfObjects; i++)
{
var item = new ObjectInstance(Reader);
@ -264,9 +284,10 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders
{
get
{
if (Exe.Instance.GameData.GameChunks.GetChunk<FrameItems>() == null) return null;
return Exe.Instance.GameData.GameChunks.GetChunk<FrameItems>().FromHandle(ObjectInfo);
}
}
}
public override void Print(bool ext)
{
@ -286,8 +307,68 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders
}
}
class Layer : ChunkLoader
public class Layers : ChunkLoader
{
public List<Layer> Items;
public Layers(ByteReader reader) : base(reader)
{
}
public Layers(ChunkList.Chunk chunk) : base(chunk)
{
}
public override void Read()
{
Items = new List<Layer>();
var count = Reader.ReadUInt32();
for (int i = 0; i < count; i++)
{
Layer item = new Layer(Reader);
item.Read();
Items.Add(item);
}
}
public override void Print(bool ext)
{
throw new NotImplementedException();
}
public override string[] GetReadableData()
{
throw new NotImplementedException();
}
}
public class Layer : ChunkLoader
{
public string Name;
public BitDict Flags = new BitDict(new string[]
{
"XCoefficient",
"YCoefficient",
"DoNotSaveBackground",
"",
"Visible",
"WrapHorizontally",
"WrapVertically",
"", "", "", "",
"", "", "", "", "",
"Redraw",
"ToHide",
"ToShow"
}
);
public float XCoeff;
public float YCoeff;
public int NumberOfBackgrounds;
public int BackgroudIndex;
public Layer(ByteReader reader) : base(reader)
{
}
@ -298,7 +379,44 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders
public override void Read()
{
Flags.flag = Reader.ReadUInt32();
XCoeff = Reader.ReadSingle();
YCoeff = Reader.ReadSingle();
NumberOfBackgrounds = Reader.ReadInt32();
BackgroudIndex = Reader.ReadInt32();
Name = Reader.ReadWideString();
}
public override void Print(bool ext)
{
throw new NotImplementedException();
}
public override string[] GetReadableData()
{
throw new NotImplementedException();
}
}
public class FramePalette : ChunkLoader
{
public List<Color> Items;
public FramePalette(ByteReader reader) : base(reader)
{
}
public FramePalette(ChunkList.Chunk chunk) : base(chunk)
{
}
public override void Read()
{
Items = new List<Color>();
for (int i = 0; i < 256; i++)
{
Items.Add(Reader.ReadColor());
}
}
public override void Print(bool ext)

@ -1,10 +1,9 @@
using System;
using System.Collections.Generic;
using DotNetCTFDumper.MMFParser.Data;
using DotNetCTFDumper.Utils;
using static DotNetCTFDumper.MMFParser.Data.ChunkList;
using static DotNetCTFDumper.MMFParser.EXE.ChunkList;
namespace DotNetCTFDumper.MMFParser.ChunkLoaders
namespace DotNetCTFDumper.MMFParser.EXE.Loaders
{
public class FrameItems : ChunkLoader
{
@ -36,7 +35,7 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders
item.Read();
ItemDict.Add(item.Handle, item);
Names.Add(item.Name);
Logger.Log($"Found FrameItem: '{item.Name}' with handle ({item.Handle})", true, ConsoleColor.Magenta);
// Logger.Log($"Found FrameItem: '{item.Name}' with handle ({item.Handle})", true, ConsoleColor.Magenta);
}
GameData.TestItems = this;

@ -1,9 +1,9 @@
using System;
using System.Collections.Generic;
using DotNetCTFDumper.Utils;
using static DotNetCTFDumper.MMFParser.Data.ChunkList;
using static DotNetCTFDumper.MMFParser.EXE.ChunkList;
namespace DotNetCTFDumper.MMFParser.ChunkLoaders
namespace DotNetCTFDumper.MMFParser.EXE.Loaders
{
public class GlobalValues : ChunkLoader
{

@ -1,14 +1,11 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using DotNetCTFDumper.MMFParser.ChunkLoaders.Banks;
using DotNetCTFDumper.MMFParser.ChunkLoaders.Objects;
using DotNetCTFDumper.MMFParser.Data;
using DotNetCTFDumper.MMFParser.EXE.Loaders.Banks;
using DotNetCTFDumper.MMFParser.EXE.Loaders.Objects;
using DotNetCTFDumper.Utils;
using static DotNetCTFDumper.MMFParser.Data.ChunkList;
using static DotNetCTFDumper.MMFParser.EXE.ChunkList;
namespace DotNetCTFDumper.MMFParser.ChunkLoaders
namespace DotNetCTFDumper.MMFParser.EXE.Loaders
{
public class ObjectInfo : ChunkLoader
{
@ -40,7 +37,12 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders
public override string[] GetReadableData()
{
throw new NotImplementedException();
return new string[]
{
$"Name: {this.Name}",
$"Type: {(Constants.ObjectType)this.ObjectType}"
};
}
public override void Read()
@ -51,13 +53,10 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders
foreach (var infoChunk in infoChunks.Chunks)
{
infoChunk.Verbose = false;
var loader = infoChunk.Loader;
if (loader != null)
{
Console.WriteLine($"Reading {loader.GetType().Name}");
}
if (loader is ObjectName)
{
@ -103,7 +102,14 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders
anims.AnimationDict.TryGetValue(0,
out Animation anim);
anim.DirectionDict.TryGetValue(0, out AnimationDirection direction);
var firstFrameHandle = direction.Frames[0];
var firstFrameHandle = direction.Frames[0];
if (images.Images[firstFrameHandle].Bitmap == null)
{
Console.WriteLine("Preloading "+firstFrameHandle);
images.LoadByHandle(firstFrameHandle);
}
bmp = images.Images[firstFrameHandle];
}
@ -146,7 +152,6 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders
{
//TODO: Fix shit
Console.WriteLine("Reading properties of "+parent.Name);
if (ObjectType == 1)//Backdrop
{
Loader = new Backdrop(Reader);

@ -1,8 +1,8 @@
using System;
using DotNetCTFDumper.Utils;
using static DotNetCTFDumper.MMFParser.Data.ChunkList;
using static DotNetCTFDumper.MMFParser.EXE.ChunkList;
namespace DotNetCTFDumper.MMFParser.ChunkLoaders
namespace DotNetCTFDumper.MMFParser.EXE.Loaders
{
class ObjectNames : ChunkLoader//Fucking trash
{

@ -1,9 +1,8 @@
using System;
using System.Collections.Generic;
using DotNetCTFDumper.MMFParser.Data;
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Objects
namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Objects
{
public class Animations:ChunkLoader
{
@ -130,7 +129,7 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Objects
{
var handle = Reader.ReadInt16();
Frames.Add(handle);
Console.WriteLine("Frame Found: "+handle);
}

@ -1,7 +1,6 @@
using DotNetCTFDumper.MMFParser.Data;
using DotNetCTFDumper.Utils;
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Objects
namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Objects
{
public enum Obstacle
{

@ -1,9 +1,8 @@
using System;
using System.Collections.Generic;
using DotNetCTFDumper.MMFParser.Data;
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Objects
namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Objects
{
public class Counter:ChunkLoader
{

@ -1,9 +1,8 @@
using System;
using System.Drawing;
using DotNetCTFDumper.MMFParser.Data;
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Objects
namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Objects
{
public class ObjectCommon : ChunkLoader
{
@ -142,7 +141,7 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Objects
//Reader.Seek(currentPosition+_movementsOffset);
//var movements = new Movements(Reader);
//movements.Read();
Console.WriteLine("Movements done");
// Console.WriteLine("Movements done");
}
@ -151,7 +150,7 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Objects
Reader.Seek(currentPosition + _valuesOffset);
AlterableValues values = new AlterableValues(Reader);
values.Read();
Console.WriteLine("Values done");
// Console.WriteLine("Values done");
}
@ -160,7 +159,7 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Objects
Reader.Seek(currentPosition + _stringsOffset);
AlterableStrings strings = new AlterableStrings(Reader);
strings.Read();
Console.WriteLine("Strings done");
// Console.WriteLine("Strings done");
}
@ -169,7 +168,7 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Objects
Reader.Seek(currentPosition + _animationsOffset);
Animations = new Animations(Reader);
Animations.Read();
Console.WriteLine("Animations done");
// Console.WriteLine("Animations done");
}
/*if (_counterOffset != 0)
@ -212,8 +211,8 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Objects
}
Console.WriteLine("SysObjOff: " + _systemObjectOffset);
Console.WriteLine("ExtOff: " + _extensionOffset);
// Console.WriteLine("SysObjOff: " + _systemObjectOffset);
// Console.WriteLine("ExtOff: " + _extensionOffset);
}
public override void Print(bool ext)

@ -1,9 +1,8 @@
using System;
using System.Collections.Generic;
using DotNetCTFDumper.MMFParser.Data;
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Objects
namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Objects
{
public class AlterableValues:ChunkLoader
{

@ -1,8 +1,8 @@
using System;
using DotNetCTFDumper.Utils;
using static DotNetCTFDumper.MMFParser.Data.ChunkList;
using static DotNetCTFDumper.MMFParser.EXE.ChunkList;
namespace DotNetCTFDumper.MMFParser.ChunkLoaders
namespace DotNetCTFDumper.MMFParser.EXE.Loaders
{
public class StringChunk : ChunkLoader
{

@ -0,0 +1,54 @@
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);
Name = Reader.ReadAscii(4);
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();
}
}
}

@ -2,12 +2,11 @@
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Runtime.InteropServices;
using DotNetCTFDumper.Utils;
using static DotNetCTFDumper.MMFParser.Data.ChunkList;
using static DotNetCTFDumper.MMFParser.EXE.ChunkList;
namespace DotNetCTFDumper.MMFParser.ChunkLoaders
namespace DotNetCTFDumper.MMFParser.EXE.Loaders
{
public class AppIcon : ChunkLoader
{

@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.IO;
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.Data
namespace DotNetCTFDumper.MMFParser.EXE
{
public class PackData
{

@ -1,17 +1,25 @@
using System;
using System.Collections.Generic;
using DotNetCTFDumper.MMFParser.Data;
using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.MFALoaders
namespace DotNetCTFDumper.MMFParser.MFA.Loaders
{
class ChunkList : DataLoader//This is used for MFA reading/writing
public class ChunkList : DataLoader//This is used for MFA reading/writing
{
List<DataLoader> _items = new List<DataLoader>();
public byte[] Saved;
public override void Write(ByteWriter Writer)
{
throw new NotImplementedException();
if (Saved != null)
{
Writer.WriteBytes(Saved);
}
else
{
Writer.WriteInt8(0);
}
}
public override void Print()
@ -28,14 +36,13 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders
if(id==0) break;
var data = new ByteReader(Reader.ReadBytes((int) Reader.ReadUInt32()));
}
var size = Reader.Tell() - start;
Reader.Seek(start);
Saved = Reader.ReadBytes((int) size);
}
public ChunkList(ByteReader reader) : base(reader) { }
}

@ -1,9 +1,9 @@
using System;
using System.Collections.Generic;
using DotNetCTFDumper.MMFParser.Data;
using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.MFALoaders
namespace DotNetCTFDumper.MMFParser.MFA.Loaders
{
public class Controls : DataLoader
{

@ -1,13 +1,14 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Runtime.InteropServices;
using DotNetCTFDumper.MMFParser.ChunkLoaders.Events;
using DotNetCTFDumper.MMFParser.Data;
using System.Security.AccessControl;
using System.Text;
using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.MMFParser.EXE.Loaders.Events;
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.MFALoaders
namespace DotNetCTFDumper.MMFParser.MFA.Loaders
{
public class Events:DataLoader
{
@ -40,17 +41,20 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders
public uint LineItemType;
public uint EventLine;
public uint EventLineY;
public byte[] Saved;
public int EditorDataUnk;
public Events(ByteReader reader) : base(reader)
{
}
public Events(Data.ChunkList.Chunk chunk) : base(chunk)
public Events(EXE.ChunkList.Chunk chunk) : base(chunk)
{
}
public override void Read()
{
Version = Reader.ReadUInt16();
FrameType = Reader.ReadUInt16();
Items = new List<EventGroup>();
@ -59,6 +63,7 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders
{
string name = Reader.ReadAscii(4);
Console.WriteLine("Group: "+name+" "+Encoding.ASCII.GetBytes(name).GetHex()+", Position: "+Reader.Tell());
if (name == EventData)
{
uint size = Reader.ReadUInt32();
@ -105,7 +110,7 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders
}
else if (name == EventEditorData)
{
Reader.Skip(4);
EditorDataUnk = Reader.ReadInt32();
ConditionWidth = Reader.ReadUInt16();
ObjectHeight = Reader.ReadUInt16();
Reader.Skip(12);
@ -174,87 +179,130 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders
public override void Write(ByteWriter Writer)
{
Writer.WriteUInt16(Version);
Writer.WriteInt16((short) FrameType);
if (Items != null)
//Writer.WriteBytes(Saved);
//return;
using (ByteWriter debug = new ByteWriter(new MemoryStream()))
{
Writer.WriteAscii(EventData);
ByteWriter newWriter = new ByteWriter(new MemoryStream());
foreach (EventGroup eventGroup in Items)
{
eventGroup.Write(newWriter);
}
Writer.WriteWriter(newWriter);
}
if (Comments != null)
{
Writer.WriteAscii(CommentData);
foreach (Comment comment in Comments)
//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 (ObjectTypes != null)
{
comment.Write(Writer);
}
}
Console.WriteLine("Writing ObjectTypes");
Writer.WriteAscii(ObjectListData);
Writer.WriteInt16(-1);
Writer.WriteInt16((short) ObjectTypes.Count);
foreach (ushort objectType in ObjectTypes)
{
Writer.WriteUInt16(objectType);
}
if (Objects != null)
{
Writer.WriteAscii(ObjectData);
Writer.WriteUInt32((uint) Objects.Count);
foreach (EventObject eventObject in Objects)
{
eventObject.Write(Writer);
}
}
Writer.WriteAscii(EventEditorData);
Writer.Skip(4+2*2+4*3);
if (ObjectTypes != null)
{
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 objectHandle in ObjectHandles)
{
Writer.WriteUInt16(objectHandle);
}
foreach (ushort objectFlag in ObjectFlags)
{
Writer.WriteUInt16(objectFlag);
}
Writer.WriteUInt16((ushort) Folders.Count);
foreach (string folder in Folders)
{
Writer.AutoWriteUnicode(folder);
}
}
foreach (ushort objectFlag in ObjectFlags)
if (X != 0)
{
Writer.WriteUInt16(objectFlag);
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);
}
Writer.WriteUInt16((ushort) Folders.Count);
foreach (string folder in Folders)
if (LineY != 0)
{
Writer.AutoWriteUnicode(folder);
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);
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);
// }
// }
if (X != 0)
{
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)
{
Writer.WriteAscii(EditorLineData);
Writer.WriteInt16(1);
Writer.WriteUInt32(LineY);
Writer.WriteUInt32(LineItemType);
Writer.WriteUInt32(EventLine);
Writer.WriteUInt32(EventLineY);
var data = ((MemoryStream) Writer.BaseStream).GetBuffer();
Array.Resize(ref data,(int) Writer.Size());
File.WriteAllBytes("MyEvents.bin",data);
}
Writer.WriteAscii(EventEnd);
@ -275,7 +323,7 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders
{
}
public Comment(Data.ChunkList.Chunk chunk) : base(chunk)
public Comment(EXE.ChunkList.Chunk chunk) : base(chunk)
{
}
@ -315,7 +363,7 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders
{
}
public EventObject(Data.ChunkList.Chunk chunk) : base(chunk)
public EventObject(EXE.ChunkList.Chunk chunk) : base(chunk)
{
}

@ -1,10 +1,10 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using DotNetCTFDumper.MMFParser.Data;
using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.MFALoaders
namespace DotNetCTFDumper.MMFParser.MFA.Loaders
{
public class Frame : DataLoader
{
@ -13,12 +13,12 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders
public int SizeY;
public Color Background;
public int MaxObjects;
public List<FrameItem> Items;
public List<FrameItem> Items=new List<FrameItem>();
public int Handle;
public int LastViewedX;
public int LastViewedY;
public List<ItemFolder> Folders;
public List<FrameInstance> Instances;
public List<ItemFolder> Folders=new List<ItemFolder>();
public List<FrameInstance> Instances=new List<FrameInstance>();
public BitDict Flags = new BitDict(new string[]
{
@ -41,11 +41,16 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders
public int ActiveLayer;
public List<Layer> Layers;
public Events Events;
public ChunkList Chunks;
public Transition FadeIn;
public Transition FadeOut;
public Frame(ByteReader reader) : base(reader)
{
}
public override void Write(ByteWriter Writer)
{
@ -73,10 +78,20 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders
{
layer.Write(Writer);
}
//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)
@ -94,9 +109,18 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders
foreach (var item in Instances)
{
item.Write(Writer);
if (Instances != null)
{
Writer.WriteInt32(Instances.Count);
foreach (var item in Instances)
{
item.Write(Writer);
}
}
Events.Write(Writer);
Chunks.Write(Writer);
}
public override void Print()
@ -127,11 +151,8 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders
{
Palette.Add(Reader.ReadColor());
}
StampHandle = Reader.ReadInt32();
ActiveLayer = Reader.ReadInt32();
int layersCount = Reader.ReadInt32();
Layers = new List<Layer>();
for (int i = 0; i < layersCount; i++)
@ -139,20 +160,20 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders
var layer = new Layer(Reader);
layer.Read();
Layers.Add(layer);
}
//fadein
if (Reader.ReadByte() != 0)
if (Reader.ReadByte() == 1)
{
throw new NotImplementedException();
FadeIn = new Transition(Reader);
FadeIn.Read();
}
//fadeout
if (Reader.ReadByte() != 0)
if (Reader.ReadByte() == 1)
{
throw new NotImplementedException();
FadeOut = new Transition(Reader);
FadeOut.Read();
}
Items = new List<FrameItem>();
var frameItemsCount = Reader.ReadInt32();
for (int i = 0; i < frameItemsCount; i++)
@ -182,7 +203,19 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders
}
Reader.Skip(96);
Events = new Events(Reader);
Console.WriteLine("BeforeEventsPos: "+Reader.Tell());
Events.Read();
Console.WriteLine("AfterEventsPos: "+Reader.Tell());
Chunks = new ChunkList(Reader);
Chunks.Read();
MFA.emptyEvents = Events;
MFA.emptyFrameChunks = Chunks;
}
}
}

@ -1,7 +1,7 @@
using DotNetCTFDumper.MMFParser.Data;
using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.MFALoaders
namespace DotNetCTFDumper.MMFParser.MFA.Loaders
{
public class FrameInstance:DataLoader
{
@ -18,7 +18,7 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders
{
}
public FrameInstance(Data.ChunkList.Chunk chunk) : base(chunk)
public FrameInstance(EXE.ChunkList.Chunk chunk) : base(chunk)
{
}

@ -1,9 +1,9 @@
using System;
using DotNetCTFDumper.MMFParser.Data;
using DotNetCTFDumper.MMFParser.MFALoaders.mfachunks;
using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks;
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.MFALoaders
namespace DotNetCTFDumper.MMFParser.MFA.Loaders
{
public class FrameItem : DataLoader
{
@ -16,6 +16,9 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders
public int AntiAliasing;
public int Flags;
public int IconType;
public int IconHandle;
public ChunkList Chunks;
public Active Loader;
public override void Write(ByteWriter Writer)
{
@ -25,6 +28,12 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders
Writer.WriteInt32(Transparent);
Writer.WriteInt32(InkEffect);
Writer.WriteInt32(InkEffectParameter);
Writer.WriteInt32(AntiAliasing);
Writer.WriteInt32(Flags);
Writer.WriteInt32(1);
Writer.WriteInt32(IconHandle);
Chunks.Write(Writer);
Loader.Write(Writer);
}
@ -46,26 +55,27 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders
AntiAliasing = Reader.ReadInt32();
Flags = Reader.ReadInt32();
IconType = Reader.ReadInt32();
if(IconType==1)
{
var iconHandle = Reader.ReadInt32();
IconHandle = Reader.ReadInt32();
}
else
{
throw new NotImplementedException("invalid icon");
}
var chunks = new ChunkList(Reader);
chunks.Read();
Chunks = new ChunkList(Reader);
Chunks.Read();
if(ObjectType>=32)//extension base
{
//TODO: Nonactives
}
else
else if(ObjectType==2)
{
var loader = new Active(Reader);
loader.Read();
Loader = new Active(Reader);
Loader.Read();
}

@ -1,12 +1,12 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using DotNetCTFDumper.MMFParser.ChunkLoaders.Banks;
using DotNetCTFDumper.MMFParser.Data;
using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.MMFParser.EXE.Loaders.Banks;
using DotNetCTFDumper.Utils;
using static DotNetCTFDumper.MMFParser.Data.ChunkList;
using static DotNetCTFDumper.MMFParser.EXE.ChunkList;
namespace DotNetCTFDumper.MMFParser.MFALoaders
namespace DotNetCTFDumper.MMFParser.MFA.Loaders
{
public class AgmiBank : DataLoader
{
@ -14,7 +14,7 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders
private int PaletteVersion;
private int PaletteEntries;
public Dictionary<int, ImageItem> Items = new Dictionary<int, ImageItem>();
private List<Color> Palette;
public List<Color> Palette;
public override void Print()
{

@ -1,8 +1,8 @@
using System.Collections.Generic;
using DotNetCTFDumper.MMFParser.Data;
using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.MFALoaders
namespace DotNetCTFDumper.MMFParser.MFA.Loaders
{
public class ItemFolder:DataLoader
{
@ -13,7 +13,7 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders
{
}
public ItemFolder(Data.ChunkList.Chunk chunk) : base(chunk)
public ItemFolder(EXE.ChunkList.Chunk chunk) : base(chunk)
{
}

@ -1,21 +1,33 @@
using System;
using DotNetCTFDumper.MMFParser.Data;
using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.MFALoaders
namespace DotNetCTFDumper.MMFParser.MFA.Loaders
{
public class Layer : DataLoader
{
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)
{
Helper.AutoWriteUnicode(Writer,Name);
Writer.WriteInt32(Flags);
Writer.AutoWriteUnicode(Name);
Writer.WriteInt32((int) Flags.flag);
Writer.WriteSingle(XCoefficient);
Writer.WriteSingle(YCoefficient);
}
@ -27,10 +39,11 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders
public override void Read()
{
Name = Helper.AutoReadUnicode(Reader);
Flags = Reader.ReadInt32();
Name = Reader.AutoReadUnicode();
Flags.flag = (uint) Reader.ReadInt32();
XCoefficient = Reader.ReadSingle();
YCoefficient = Reader.ReadSingle();

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

@ -1,9 +1,9 @@
using System;
using System.Collections.Generic;
using DotNetCTFDumper.MMFParser.Data;
using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.MFALoaders
namespace DotNetCTFDumper.MMFParser.MFA.Loaders
{
public class ValueList : DataLoader
{

@ -1,8 +1,8 @@
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.MFALoaders.mfachunks
namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
{
class Active : AnimationObject
public class Active : AnimationObject
{
public override void Print()
{
@ -14,6 +14,12 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders.mfachunks
{
base.Read();
}
public override void Write(ByteWriter Writer)
{
base.Write(Writer);
}
public Active(ByteReader reader) : base(reader) { }
}
}

@ -1,11 +1,12 @@
using System;
using System.Collections.Generic;
using DotNetCTFDumper.MMFParser.Data;
using System.Diagnostics;
using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.MFALoaders.mfachunks
namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
{
class AnimationObject:ObjectLoader
public class AnimationObject:ObjectLoader
{
List<Animation> _items = new List<Animation>();
public override void Read()
@ -13,7 +14,7 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders.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);
@ -23,6 +24,7 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders.mfachunks
}
}
public AnimationObject(ByteReader reader) : base(reader) { }
}
@ -41,7 +43,7 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders.mfachunks
public override void Read()
{
Name = Reader.ReadAscii(Reader.ReadInt32());
Name = Reader.AutoReadUnicode();
var directionCount = Reader.ReadInt32();
var directions = new List<AnimationDirection>();
for (int i = 0; i < directionCount; i++)
@ -59,9 +61,25 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders.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<int> Frames= new List<int>();
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()
@ -71,12 +89,16 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders.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<int>();
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) { }

@ -1,16 +1,19 @@
using System;
using System.Collections.Generic;
using DotNetCTFDumper.MMFParser.Data;
using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.MFALoaders.mfachunks
namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
{
class Behaviours : DataLoader
public class Behaviours : DataLoader
{
List<Behaviour> _items = new List<Behaviour>();
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.MFALoaders.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.MFALoaders.mfachunks
public override void Read()
{
Name = Reader.ReadAscii(Reader.ReadInt32());
Name = Reader.AutoReadUnicode();
Data = new ByteReader(Reader.ReadBytes(Reader.ReadInt32()));
}

@ -0,0 +1,109 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.NetworkInformation;
using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
{
public class Movements : DataLoader
{
public List<Movement> Items = new List<Movement>();
public override void Write(ByteWriter Writer)
{
Writer.WriteInt32(Items.Count);
foreach (Movement movement in Items)
{
movement.Write(Writer);
}
}
public override void Print()
{
throw new NotImplementedException();
}
public override void Read()
{
var count = Reader.ReadUInt32();
for (int i = 0; i < count; i++)
{
var item = new Movement(Reader);
item.Read();
Items.Add(item);
}
}
public Movements(ByteReader reader) : base(reader) { }
}
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)
{
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()
{
throw new NotImplementedException();
}
public override void Read()
{
Name = Helper.AutoReadUnicode(Reader);
Extension = Helper.AutoReadUnicode(Reader);
Identifier = (int) Reader.ReadUInt32();
DataSize = (int) Reader.ReadUInt32();
if(Extension.Length>0)
{
var newReader = new ByteReader(Reader.ReadBytes(DataSize));
}
else
{
Player = Reader.ReadInt16();
Type = Reader.ReadInt16();
MovingAtStart = Reader.ReadByte();
Reader.Skip(3);
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
}
}
public Movement(ByteReader reader) : base(reader) { }
}
}

@ -1,11 +1,12 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.Drawing;
using DotNetCTFDumper.MMFParser.Data;
using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.MFALoaders.mfachunks
namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
{
class ObjectLoader : DataLoader
public class ObjectLoader : DataLoader
{
public int ObjectFlags;
public int NewObjectFlags;
@ -18,7 +19,29 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders.mfachunks
public override void Write(ByteWriter Writer)
{
throw new System.NotImplementedException();
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
}
public override void Print()
@ -47,8 +70,8 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders.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,6 +90,7 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders.mfachunks
Movements.Read();
Behaviours = new Behaviours(Reader);
Behaviours.Read();
//Reader.Skip(56);//TODO: Help
Print();

@ -2,15 +2,16 @@
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Numerics;
using DotNetCTFDumper.MMFParser.ChunkLoaders;
using DotNetCTFDumper.MMFParser.ChunkLoaders.Banks;
using DotNetCTFDumper.MMFParser.MFALoaders;
using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.MMFParser.EXE.Loaders;
using DotNetCTFDumper.MMFParser.EXE.Loaders.Banks;
using DotNetCTFDumper.MMFParser.MFA.Loaders;
using DotNetCTFDumper.Utils;
using Controls = DotNetCTFDumper.MMFParser.MFALoaders.Controls;
using Frame = DotNetCTFDumper.MMFParser.MFALoaders.Frame;
using ChunkList = DotNetCTFDumper.MMFParser.MFA.Loaders.ChunkList;
using Controls = DotNetCTFDumper.MMFParser.MFA.Loaders.Controls;
using Frame = DotNetCTFDumper.MMFParser.MFA.Loaders.Frame;
namespace DotNetCTFDumper.MMFParser.Data
namespace DotNetCTFDumper.MMFParser.MFA
{
public class MFA : DataLoader
{
@ -112,6 +113,10 @@ namespace DotNetCTFDumper.MMFParser.Data
public List<Tuple<int, string, string, int, byte[]>> Extensions;
public List<Tuple<string, int>> CustomQuals;
public List<Frame> Frames;
public ChunkList Chunks;
public static Events emptyEvents;
public static ChunkList emptyFrameChunks;
public override void Print()
@ -160,7 +165,7 @@ namespace DotNetCTFDumper.MMFParser.Data
Writer.AutoWriteUnicode(Version);
Writer.WriteInt32(WindowX);
Writer.WriteInt32(WindowY);
Writer.WriteColor(Color.White);
Writer.WriteColor(Color.FromArgb(0,255,255,255));
Writer.WriteInt32((int) DisplayFlags.flag);
Writer.WriteInt32((int) GraphicFlags.flag);
Writer.AutoWriteUnicode(HelpFile);
@ -184,7 +189,7 @@ namespace DotNetCTFDumper.MMFParser.Data
Controls.Write(Writer);
if (Menu != null)
{
using (ByteWriter menuWriter = new ByteWriter(new MemoryStream()))
@ -200,6 +205,7 @@ namespace DotNetCTFDumper.MMFParser.Data
Writer.WriteInt32(0);
}
Writer.WriteInt32(windowMenuIndex);
Writer.WriteInt32(menuImages.Count);
foreach (KeyValuePair<int, int> valuePair in menuImages)
@ -217,10 +223,26 @@ namespace DotNetCTFDumper.MMFParser.Data
{
Writer.WriteInt32(iconImage);
}
Writer.WriteInt32(0);//custom qualifiers
Writer.WriteInt32(0); //extensions
Writer.WriteInt32(CustomQuals.Count);
foreach (Tuple<string,int> customQual in CustomQuals)
{
Writer.AutoWriteUnicode(customQual.Item1);
Writer.WriteInt32(customQual.Item2);
}
Writer.WriteInt32(Extensions.Count);
foreach(var extension in Extensions)
{
Writer.WriteInt32(extension.Item1);
Writer.WriteUnicode(extension.Item2);
Writer.WriteUnicode(extension.Item3);
Writer.WriteInt32(extension.Item4);
Writer.WriteBytes(extension.Item5);
}
Writer.WriteInt32(Frames.Count); //frame
var startPos = Reader.Tell() + 4 * Frames.Count + 4;
var startPos = Writer.Tell() + 4 * Frames.Count + 4;
ByteWriter newWriter = new ByteWriter(new MemoryStream());
foreach (Frame frame in Frames)
{
@ -229,7 +251,7 @@ namespace DotNetCTFDumper.MMFParser.Data
}
Writer.WriteUInt32((uint) (startPos+newWriter.Tell()+4));
Writer.WriteWriter(newWriter);
Chunks.Write(Writer);
@ -237,6 +259,7 @@ namespace DotNetCTFDumper.MMFParser.Data
public override void Read()
{
Logger.Log($"MFA HEADER:{Reader.ReadAscii(4)}\n");
MfaBuild = Reader.ReadInt32();
Product = Reader.ReadInt32();
@ -378,8 +401,9 @@ namespace DotNetCTFDumper.MMFParser.Data
}
Reader.Seek(nextOffset);
var chunks = new MFALoaders.ChunkList(Reader);
chunks.Read();
Chunks = new ChunkList(Reader);
Chunks.Read();
Reader.Dispose();
return;
}

@ -1,20 +1,20 @@
using System;
using System.IO;
using DotNetCTFDumper.MMFParser.Data;
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);
var template = new MFA(mfaReader);
var template = new MFA.MFA(mfaReader);
template.Read(); //Loading template
@ -26,18 +26,21 @@ 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 template = new MFA(mfaReader);
var mfaReader = new ByteReader(@"C:\Users\ivani\Desktop\CTFResearch\ObjTEST.mfa", FileMode.Open);
var template = new MFA.MFA(mfaReader);
Settings.DoMFA = true;
template.Read();
//Add modifications
var mfaWriter = new ByteWriter("outTest.mfa", FileMode.Create);
template.Write(mfaWriter);
}

@ -0,0 +1,137 @@
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 ?? "Kostya";
mfa.Copyright = game.Copyright ??"CTFAN Team";
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 = gameTrans.Name.FirstCharToUpper();
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.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)
{
Name = gameLayer.Name,
Flags =
{
["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
}
mfaFrame.Events = MFA.MFA.emptyEvents;
mfaFrame.Chunks = MFA.MFA.emptyFrameChunks;
return mfaFrame;
}
}
}

@ -0,0 +1,8 @@
namespace DotNetCTFDumper.PluginAPI
{
public interface IPlugin
{
}
}

@ -0,0 +1,46 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using DotNetCTFDumper.MMFParser.EXE.Loaders;
using DotNetCTFDumper.MMFParser.MFA;
using DotNetCTFDumper.MMFParser.MFA.Loaders;
using Frame = DotNetCTFDumper.MMFParser.MFA.Loaders.Frame;
using Layer = DotNetCTFDumper.MMFParser.MFA.Loaders.Layer;
namespace DotNetCTFDumper.PluginAPI
{
public class PluginAPI
{
public static Frame GetEmptyFrame(List<Color> palette,int handle=0,int x=640,int y=480,string name="New Frame")
{
var frame = new Frame(null)
{
Handle = 0,
Name = name,
Password = "",
SizeX = x,
SizeY = y,
Background = Color.Green,
Flags = 260,
Palette = palette,
Layers = new List<Layer>(),
Folders = new List<ItemFolder>(),
Items = new List<FrameItem>(),
Events = MFA.emptyEvents,
Chunks = MFA.emptyFrameChunks
};
//frame.Instances = template.Frames[0].Instances;
var testLayer = new Layer(null) {Name = "New Super Layer"};
frame.Layers.Add(testLayer);
return frame;
}
}
}

@ -3,19 +3,17 @@ using System.IO;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using DotNetCTFDumper.GUI;
using DotNetCTFDumper.MMFParser.Data;
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,12 +22,12 @@ 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;
var dumpImages = false;
var dumpImages = true;
var dumpSounds = true;
if (args.Length == 0)

@ -10,13 +10,14 @@ namespace DotNetCTFDumper
public static bool DumpMusic;
public static bool SaveChunks;
public static bool Verbose;
public static bool Old;
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";

@ -1,7 +1,7 @@
using System.ComponentModel;
using DotNetCTFDumper.GUI;
using DotNetCTFDumper.MMFParser.ChunkLoaders.Banks;
using static DotNetCTFDumper.MMFParser.Data.Exe;
using DotNetCTFDumper.MMFParser.EXE.Loaders.Banks;
using static DotNetCTFDumper.MMFParser.EXE.Exe;
namespace DotNetCTFDumper.Utils
{
@ -28,7 +28,11 @@ namespace DotNetCTFDumper.Utils
{
if (Instance.GameData.GameChunks.GetChunk<ImageBank>() == null) return;
form.SetImageElements(true);
worker.DoWork += (senderA, eA) => { Instance.GameData.GameChunks.GetChunk<ImageBank>().Read(load,save); };
worker.DoWork += (senderA, eA) =>
{
Instance.GameData.GameChunks.GetChunk<ImageBank>().PreloadOnly = false;
Instance.GameData.GameChunks.GetChunk<ImageBank>().Read(load,save);
};
worker.RunWorkerCompleted += (senderA, eA) =>
{
form.SetImageElements(false);

@ -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)
@ -31,6 +31,19 @@ namespace DotNetCTFDumper.Utils
return false;
}
public void SetFlag(String key, bool value)
{
if (value)
{
flag |= (uint) Math.Pow(2,Array.IndexOf(Keys,key));
}
else
{
flag &= (uint) Math.Pow(~2,Array.IndexOf(Keys,key));
}
}
public static string ToDebugString<TKey, TValue>(IDictionary<TKey, TValue> dictionary)
{
return string.Join(";", dictionary.Select(kv => kv.Key + "=" + kv.Value).ToArray());
@ -46,5 +59,7 @@ namespace DotNetCTFDumper.Utils
return ToDebugString(actualKeys);
}
}
}

@ -129,9 +129,9 @@ namespace DotNetCTFDumper.Utils
var r = ReadByte();
var g = ReadByte();
var b = ReadByte();
Skip(1);
var a = ReadByte();
return Color.FromArgb(r, g, b);
return Color.FromArgb(a,r, g, b);
}

@ -59,6 +59,8 @@ namespace DotNetCTFDumper.Utils
}
public void WriteInt8(byte value) => Write(value);
public void WriteUInt8(sbyte value) => Write(value);
public void WriteInt16(short value) => Write(value);
public void WriteInt32(int value) => Write(value);
public void WriteInt64(long value) => Write(value);
@ -96,7 +98,7 @@ namespace DotNetCTFDumper.Utils
WriteInt8(color.R);
WriteInt8(color.G);
WriteInt8(color.B);
WriteInt8(0);
WriteInt8(color.A);
}
public void WriteWriter(ByteWriter toWrite)

@ -40,6 +40,7 @@ namespace DotNetCTFDumper.Utils
Array.Resize<byte>(ref decompressedData, decompSize);
return decompressedData;
}
public static byte[] compress_block(byte[] data)
{

@ -7,9 +7,9 @@ using System.Runtime.InteropServices;
using System.Text.RegularExpressions;
using DotNetCTFDumper.GUI;
using DotNetCTFDumper.MMFParser;
using DotNetCTFDumper.MMFParser.ChunkLoaders.Events.Parameters;
using DotNetCTFDumper.MMFParser.ChunkLoaders.Objects;
using DotNetCTFDumper.MMFParser.Data;
using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.MMFParser.EXE.Loaders.Events.Parameters;
using DotNetCTFDumper.MMFParser.EXE.Loaders.Objects;
namespace DotNetCTFDumper.Utils
{
@ -52,6 +52,15 @@ namespace DotNetCTFDumper.Utils
return temp;
}
public static string FirstCharToUpper(this string input)
{
switch (input)
{
case null: throw new ArgumentNullException(nameof(input));
case "": throw new ArgumentException($"{nameof(input)} cannot be empty", nameof(input));
default: return input.First().ToString().ToUpper() + input.Substring(1);
}
}
public static string AutoReadUnicode(this ByteReader reader)
{
@ -208,6 +217,7 @@ namespace DotNetCTFDumper.Utils
public static string ActualName(this ChunkList.Chunk chunk)
{
return "Placeholder";
var constName = ((Constants.ChunkNames) chunk.Id).ToString();
int tempId = 0;
int.TryParse(constName, out tempId);

@ -1,11 +1,13 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
using DotNetCTFDumper.MMFParser.ChunkLoaders;
using DotNetCTFDumper.MMFParser.ChunkLoaders.Banks;
using DotNetCTFDumper.MMFParser.ChunkLoaders.Objects;
using DotNetCTFDumper.MMFParser.Data;
using DotNetCTFDumper.GUI;
using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.MMFParser.EXE.Loaders;
using DotNetCTFDumper.MMFParser.EXE.Loaders.Banks;
using DotNetCTFDumper.MMFParser.EXE.Loaders.Objects;
namespace DotNetCTFDumper.Utils
{
@ -13,14 +15,26 @@ namespace DotNetCTFDumper.Utils
{
public static void DumpImages()
{
Dump();
using (var worker = new BackgroundWorker())
{
worker.DoWork += (senderA, eA) => { Dump(); };
worker.RunWorkerCompleted += (senderA, eA) =>
{
};
worker.RunWorkerAsync();
}
}
public static MainForm.IncrementSortedProgressBar SortedImageSaved;
public static void Dump()
{
var rootFolder = $"{Settings.DumpPath}\\ImageBank\\Sorted";
var rootFolder = $"{Settings.ImagePath}\\Sorted";
var Bank = Exe.Instance.GameData.GameChunks.GetChunk<ImageBank>();
var NumberOfImgFrames = CalculateFrameCount();
foreach (var frame in Exe.Instance.GameData.Frames)
{
if (frame.Objects != null)
@ -31,7 +45,7 @@ namespace DotNetCTFDumper.Utils
{
var currentObjPath = currentFramePath + "\\" + Helper.CleanInput(item.Name);
Directory.CreateDirectory(currentObjPath);
//Directory.CreateDirectory(currentObjPath);
var frames = item.FrameItem.GetFrames();
foreach (var key in frames.Keys)
{
@ -43,9 +57,12 @@ namespace DotNetCTFDumper.Utils
var path =
$"{Settings.ImagePath}\\Sorted\\{frame.Name}\\{Helper.CleanInput(item.Name)}\\{name}";
Directory.CreateDirectory(Path.GetDirectoryName(path));
Logger.Log("Saving Image: "+path);
//Logger.Log("Saving Image: "+path);
actualFrame.Save(path);
SortedImageSaved.Invoke(NumberOfImgFrames);
}
catch (Exception e)
{
@ -60,6 +77,19 @@ namespace DotNetCTFDumper.Utils
}
Logger.Log("Sorted Images Done",true,ConsoleColor.Yellow);
}
public static int CalculateFrameCount()
{
int count = 0;
foreach (var frame in Exe.Instance.GameData.Frames)
{
foreach (ObjectInstance objectInstance in frame.Objects.Items)
{
count += objectInstance.FrameItem.GetFrames().Count;
}
}
return count;
}

@ -1,75 +0,0 @@
using System;
using System.Collections.Generic;
using DotNetCTFDumper.MMFParser.Data;
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.MFALoaders.mfachunks
{
class Movements : DataLoader
{
public List<Movement> Items = new List<Movement>();
public override void Write(ByteWriter Writer)
{
throw new NotImplementedException();
}
public override void Print()
{
throw new NotImplementedException();
}
public override void Read()
{
var count = Reader.ReadInt32();
for (int i = 0; i < count; i++)
{
var item = new Movement(Reader);
item.Read();
Items.Add(item);
}
}
public Movements(ByteReader reader) : base(reader) { }
}
class Movement : DataLoader
{
public string Name="ERROR";
public override void Write(ByteWriter Writer)
{
throw new NotImplementedException();
}
public override void Print()
{
throw new NotImplementedException();
}
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)
{
var newReader = new ByteReader(Reader.ReadBytes(dataSize));
}
else
{
var player = Reader.ReadInt16();
var type = Reader.ReadInt16();
var movingAtStart = Reader.ReadByte();
Reader.Skip(3);
var directionAtStart = Reader.ReadInt32();
//implement types, but i am tired, fuck this shit
}
}
public Movement(ByteReader reader) : base(reader) { }
}
}
Loading…
Cancel
Save