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

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

@ -33,12 +33,12 @@ namespace DotNetCTFDumper.GUI
private void InitializeComponent() private void InitializeComponent()
{ {
this.components = new System.ComponentModel.Container(); 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.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
this.infoMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.infoMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.nameMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.nameMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.positionMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.positionMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.deleteObjBtn = new System.Windows.Forms.ToolStripMenuItem(); this.deleteObjBtn = new System.Windows.Forms.ToolStripMenuItem();
this.scrollableControl1 = new System.Windows.Forms.ScrollableControl();
this.contextMenuStrip1.SuspendLayout(); this.contextMenuStrip1.SuspendLayout();
this.SuspendLayout(); this.SuspendLayout();
// //
@ -74,22 +74,13 @@ namespace DotNetCTFDumper.GUI
this.deleteObjBtn.Size = new System.Drawing.Size(107, 22); this.deleteObjBtn.Size = new System.Drawing.Size(107, 22);
this.deleteObjBtn.Text = "Delete"; 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 // FrameViewer
// //
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.AutoScroll = true;
this.ClientSize = new System.Drawing.Size(1008, 733); 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.Name = "FrameViewer";
this.Text = "FrameViewer"; this.Text = "FrameViewer";
this.contextMenuStrip1.ResumeLayout(false); this.contextMenuStrip1.ResumeLayout(false);
@ -101,7 +92,6 @@ namespace DotNetCTFDumper.GUI
private System.Windows.Forms.ToolStripMenuItem infoMenuItem; private System.Windows.Forms.ToolStripMenuItem infoMenuItem;
private System.Windows.Forms.ToolStripMenuItem nameMenuItem; private System.Windows.Forms.ToolStripMenuItem nameMenuItem;
private System.Windows.Forms.ToolStripMenuItem positionMenuItem; private System.Windows.Forms.ToolStripMenuItem positionMenuItem;
private System.Windows.Forms.ScrollableControl scrollableControl1;
#endregion #endregion
} }

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

File diff suppressed because it is too large Load Diff

@ -11,8 +11,6 @@ namespace DotNetCTFDumper.GUI
{ {
public byte[] parsedData; public byte[] parsedData;
public byte[] rawData; public byte[] rawData;
private ByteViewer _viewer;
public HexViewForm(byte[] parsedData, byte[] rawData,Color color) public HexViewForm(byte[] parsedData, byte[] rawData,Color color)
{ {
@ -74,7 +72,7 @@ namespace DotNetCTFDumper.GUI
private void hexBox1_Click(object sender, EventArgs e) 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.musicsButton = new System.Windows.Forms.Button();
this.musicBar = new System.Windows.Forms.ProgressBar(); this.musicBar = new System.Windows.Forms.ProgressBar();
this.musicLabel = new System.Windows.Forms.Label(); this.musicLabel = new System.Windows.Forms.Label();
this.SortedProgressBar = new System.Windows.Forms.ProgressBar();
this.ChunkCombo.SuspendLayout(); this.ChunkCombo.SuspendLayout();
this.SuspendLayout(); this.SuspendLayout();
// //
@ -100,20 +101,20 @@
// //
// listBox1 // 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.BackColor = System.Drawing.Color.Black;
this.listBox1.BorderStyle = System.Windows.Forms.BorderStyle.None; 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.ForeColor = System.Drawing.Color.FromArgb(((int) (((byte) (255)))), ((int) (((byte) (128)))), ((int) (((byte) (0)))));
this.listBox1.FormattingEnabled = true; this.listBox1.FormattingEnabled = true;
this.listBox1.IntegralHeight = false; this.listBox1.IntegralHeight = false;
this.listBox1.ItemHeight = 14; this.listBox1.ItemHeight = 17;
this.listBox1.Location = new System.Drawing.Point(459, 12); this.listBox1.Location = new System.Drawing.Point(342, 9);
this.listBox1.Margin = new System.Windows.Forms.Padding(0); 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.MinimumSize = new System.Drawing.Size(180, 234);
this.listBox1.Name = "listBox1"; 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; this.listBox1.TabIndex = 5;
// //
// GameInfo // GameInfo
@ -268,7 +269,7 @@
this.loadingLabel.ForeColor = System.Drawing.Color.FromArgb(((int) (((byte) (255)))), ((int) (((byte) (128)))), ((int) (((byte) (0))))); 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.Location = new System.Drawing.Point(119, 12);
this.loadingLabel.Name = "loadingLabel"; 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.TabIndex = 16;
this.loadingLabel.Text = "Loading..."; this.loadingLabel.Text = "Loading...";
// //
@ -403,12 +404,22 @@
this.musicLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; this.musicLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.musicLabel.Visible = false; 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 // MainForm
// //
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.Black; this.BackColor = System.Drawing.Color.Black;
this.ClientSize = new System.Drawing.Size(943, 507); this.ClientSize = new System.Drawing.Size(943, 507);
this.Controls.Add(this.SortedProgressBar);
this.Controls.Add(this.musicLabel); this.Controls.Add(this.musicLabel);
this.Controls.Add(this.musicBar); this.Controls.Add(this.musicBar);
this.Controls.Add(this.musicsButton); this.Controls.Add(this.musicsButton);
@ -440,6 +451,8 @@
this.PerformLayout(); this.PerformLayout();
} }
private System.Windows.Forms.ProgressBar SortedProgressBar;
private System.Windows.Forms.Button button1; private System.Windows.Forms.Button button1;
private System.Windows.Forms.ContextMenuStrip ChunkCombo; private System.Windows.Forms.ContextMenuStrip ChunkCombo;
private System.Windows.Forms.Button cryptKeyBtn; private System.Windows.Forms.Button cryptKeyBtn;

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

@ -1,5 +1,5 @@
using System.Windows.Forms; using System.Windows.Forms;
using DotNetCTFDumper.MMFParser.ChunkLoaders; using DotNetCTFDumper.MMFParser.EXE.Loaders;
namespace DotNetCTFDumper.GUI 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.BackColor = System.Drawing.Color.FromArgb(((int) (((byte) (64)))), ((int) (((byte) (64)))), ((int) (((byte) (64)))));
this.dumpButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat; 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.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.Location = new System.Drawing.Point(204, 105);
this.dumpButton.Name = "dumpButton"; 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.BackColor = System.Drawing.Color.FromArgb(((int) (((byte) (64)))), ((int) (((byte) (64)))), ((int) (((byte) (64)))));
this.dumpAllButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat; 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.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.Location = new System.Drawing.Point(204, 148);
this.dumpAllButton.Name = "dumpAllButton"; 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.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.Location = new System.Drawing.Point(204, 14);
this.infoLabel.Name = "infoLabel"; 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.TabIndex = 3;
this.infoLabel.Text = "Name: PackFile1.mvx\r\nSize: 5 MB\r\n"; this.infoLabel.Text = "Name: PackFile1.mvx\r\nSize: 5 MB\r\n";
// //

@ -3,7 +3,7 @@ using System.ComponentModel;
using System.Drawing; using System.Drawing;
using System.IO; using System.IO;
using System.Windows.Forms; using System.Windows.Forms;
using DotNetCTFDumper.MMFParser.Data; using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.Utils; using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.GUI 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;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Xml.Linq; using DotNetCTFDumper.MMFParser.EXE.Loaders;
using DotNetCTFDumper.MMFParser.ChunkLoaders; using DotNetCTFDumper.MMFParser.EXE.Loaders.Banks;
using DotNetCTFDumper.MMFParser.ChunkLoaders.Banks;
using DotNetCTFDumper.Utils; using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.Data namespace DotNetCTFDumper.MMFParser.EXE
{ {
public class ChunkList public class ChunkList
{ {
@ -63,7 +62,7 @@ namespace DotNetCTFDumper.MMFParser.Data
{ {
Id = exeReader.ReadInt16(); Id = exeReader.ReadInt16();
Name = this.ActualName(); Name = _chunkList.GetNameByID(Id);
Flag = (ChunkFlags) exeReader.ReadInt16(); Flag = (ChunkFlags) exeReader.ReadInt16();
Size = exeReader.ReadInt32(); Size = exeReader.ReadInt32();
@ -227,9 +226,21 @@ namespace DotNetCTFDumper.MMFParser.Data
case 13108: case 13108:
loader = new FrameHeader(chunk); loader = new FrameHeader(chunk);
break; break;
case 13111:
loader = new FramePalette(chunk);
break;
case 13112: case 13112:
loader = new ObjectInstances(chunk); loader = new ObjectInstances(chunk);
break; break;
case 13115:
loader = new Transition(chunk);
break;
case 13116:
loader = new Transition(chunk);
break;
case 13121:
loader = new Layers(chunk);
break;
case 26214: case 26214:
loader = new ImageBank(chunk); loader = new ImageBank(chunk);
break; break;
@ -290,6 +301,105 @@ namespace DotNetCTFDumper.MMFParser.Data
//Logger.Log($"ChunkLoader {typeof(T).Name} not found", true, ConsoleColor.Red); //Logger.Log($"ChunkLoader {typeof(T).Name} not found", true, ConsoleColor.Red);
return null; return null;
} }
public T PopChunk<T>() where T : ChunkLoader
{
for(int i=0;i<Chunks.Count;i++)
{
var chunk = Chunks[i];
if (chunk.Loader != null)
{
if (chunk.Loader.GetType().Name == typeof(T).Name)
{
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 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 public abstract class DataLoader
{ {

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

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

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

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

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

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

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

@ -3,9 +3,9 @@ using System.Collections.Generic;
using System.IO; using System.IO;
using DotNetCTFDumper.GUI; using DotNetCTFDumper.GUI;
using DotNetCTFDumper.Utils; 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 public class SoundBank : ChunkLoader
{ {
@ -36,7 +36,6 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Banks
public event MainForm.SaveHandler OnSoundSaved; public event MainForm.SaveHandler OnSoundSaved;
public override void Read() 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 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 DotNetCTFDumper.Utils; using static DotNetCTFDumper.MMFParser.EXE.ChunkList;
using static DotNetCTFDumper.MMFParser.Data.ChunkList;
namespace DotNetCTFDumper.MMFParser.ChunkLoaders namespace DotNetCTFDumper.MMFParser.EXE.Loaders
{ {
public abstract class ChunkLoader public abstract class ChunkLoader
{ {

@ -1,10 +1,10 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Security.Cryptography.X509Certificates; using System.IO;
using DotNetCTFDumper.Utils; 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 public class Events : ChunkLoader
{ {
@ -50,12 +50,12 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Events
NumberOfConditions.Add(Reader.ReadInt16()); 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]; Quailifers = new Quailifer[qualifierCount + 1];
for (int i = 0; i < qualifierCount; i++) for (int i = 0; i < qualifierCount; i++)
{ {
var newQualifier = new Quailifer(Reader); var newQualifier = new Quailifer(Reader);
QualifiersList.Add(newQualifier); //fucking python types QualifiersList.Add(newQualifier); //i dont understand python types
//THIS IS NOT DONE //THIS IS NOT DONE
} }
} }
@ -114,13 +114,16 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Events
public class EventGroup : ChunkLoader public class EventGroup : ChunkLoader
{ {
public int Flags; public ushort Flags;
public int IsRestricted; public int IsRestricted;
public int RestrictCpt; public int RestrictCpt;
public int Identifier; public int Identifier;
public int Undo; public int Undo;
public List<Condition> Conditions = new List<Condition>(); public List<Condition> Conditions = new List<Condition>();
public List<Action> Actions = new List<Action>(); public List<Action> Actions = new List<Action>();
public int Size;
public byte NumberOfConditions;
public byte NumberOfActions;
public EventGroup(Chunk chunk) : base(chunk) public EventGroup(Chunk chunk) : base(chunk)
{ {
@ -143,10 +146,10 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Events
public override void Read() public override void Read()
{ {
var currentPosition = Reader.Tell(); var currentPosition = Reader.Tell();
var size = Reader.ReadInt16() * -1; Size = Reader.ReadInt16() * -1;
var numberOfConditions = Reader.ReadByte(); NumberOfConditions = Reader.ReadByte();
var numberOfActions = Reader.ReadByte(); NumberOfActions = Reader.ReadByte();
var flags = Reader.ReadUInt16(); Flags = Reader.ReadUInt16();
if (Settings.Build >= 284) if (Settings.Build >= 284)
{ {
var nop = Reader.ReadInt16(); var nop = Reader.ReadInt16();
@ -161,21 +164,21 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Events
Undo = Reader.ReadInt16(); Undo = Reader.ReadInt16();
} }
for (int i = 0; i < numberOfConditions; i++) for (int i = 0; i < NumberOfConditions; i++)
{ {
var item = new Condition(Reader); var item = new Condition(Reader);
item.Read(); item.Read();
Conditions.Add(item); Conditions.Add(item);
} }
for (int i = 0; i < numberOfActions; i++) for (int i = 0; i < NumberOfActions; i++)
{ {
var item = new Action(Reader); var item = new Action(Reader);
item.Read(); item.Read();
Actions.Add(item); Actions.Add(item);
} }
Reader.Seek(currentPosition + size); Reader.Seek(currentPosition + Size);
Console.WriteLine("IF:"); Console.WriteLine("IF:");
if (Conditions != null) if (Conditions != null)
{ {
@ -197,6 +200,39 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Events
public void Write(ByteWriter Writer) 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;
using System.Collections.Generic; using System.Collections.Generic;
using DotNetCTFDumper.MMFParser.Data; using System.IO;
using DotNetCTFDumper.Utils; using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Events namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Events
{ {
public class Condition : DataLoader public class Condition : DataLoader
{ {
@ -17,10 +17,28 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Events
public int Identifier; public int Identifier;
public int ObjectInfoList; public int ObjectInfoList;
public List<Parameter> Items = new List<Parameter>(); public List<Parameter> Items = new List<Parameter>();
public Condition(ByteReader reader) : base(reader) { } public Condition(ByteReader reader) : base(reader) { }
public override void Write(ByteWriter Writer) 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() public override void Print()
@ -54,7 +72,7 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Events
} }
public override string ToString() 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 Action(ByteReader reader) : base(reader) { }
public override void Write(ByteWriter Writer) 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( ) public override void Print( )
@ -104,7 +138,7 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Events
public override string ToString() 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 System;
using DotNetCTFDumper.MMFParser.Data;
using DotNetCTFDumper.Utils; using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Events.Expressions namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Events.Expressions
{ {
class Expression : DataLoader class Expression : DataLoader
{ {

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

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

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

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

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

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

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

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

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

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

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

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

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

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

@ -1,7 +1,7 @@
using System; 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 class ExtData : ChunkLoader
{ {

@ -1,11 +1,10 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using DotNetCTFDumper.MMFParser.Data; using System.Drawing.Imaging;
using DotNetCTFDumper.Utils; using DotNetCTFDumper.Utils;
using ChunkList = DotNetCTFDumper.MMFParser.Data.ChunkList;
namespace DotNetCTFDumper.MMFParser.ChunkLoaders namespace DotNetCTFDumper.MMFParser.EXE.Loaders
{ {
class FrameName : StringChunk class FrameName : StringChunk
{ {
@ -45,6 +44,11 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders
public ChunkList Chunks; public ChunkList Chunks;
public FrameHeader Header; public FrameHeader Header;
public ObjectInstances Objects; 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) public override void Print(bool ext)
@ -76,7 +80,6 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders
Chunks.Verbose = false; Chunks.Verbose = false;
Chunks.Read(frameReader); Chunks.Read(frameReader);
//return;
var name = Chunks.GetChunk<FrameName>(); var name = Chunks.GetChunk<FrameName>();
if (name != null) //Just to be sure if (name != null) //Just to be sure
{ {
@ -89,7 +92,21 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders
this.Password = password.Value; 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>(); Header = Chunks.GetChunk<FrameHeader>();
Width = Header.Width; Width = Header.Width;
Height = Header.Height; Height = Header.Height;
@ -101,6 +118,9 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders
CountOfObjs = Objects.CountOfObjects; CountOfObjs = Objects.CountOfObjects;
} }
FadeIn = Chunks.PopChunk<Transition>();
FadeOut = Chunks.PopChunk<Transition>();
@ -213,7 +233,7 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders
public override void Read() public override void Read()
{ {
CountOfObjects = (int)Reader.ReadUInt32(); CountOfObjects = Reader.ReadInt32();
for (int i = 0; i < CountOfObjects; i++) for (int i = 0; i < CountOfObjects; i++)
{ {
var item = new ObjectInstance(Reader); var item = new ObjectInstance(Reader);
@ -264,6 +284,7 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders
{ {
get get
{ {
if (Exe.Instance.GameData.GameChunks.GetChunk<FrameItems>() == null) return null;
return Exe.Instance.GameData.GameChunks.GetChunk<FrameItems>().FromHandle(ObjectInfo); return Exe.Instance.GameData.GameChunks.GetChunk<FrameItems>().FromHandle(ObjectInfo);
} }
} }
@ -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) public Layer(ByteReader reader) : base(reader)
{ {
} }
@ -298,7 +379,44 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders
public override void Read() 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) public override void Print(bool ext)

@ -1,10 +1,9 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using DotNetCTFDumper.MMFParser.Data;
using DotNetCTFDumper.Utils; 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 public class FrameItems : ChunkLoader
{ {
@ -36,7 +35,7 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders
item.Read(); item.Read();
ItemDict.Add(item.Handle, item); ItemDict.Add(item.Handle, item);
Names.Add(item.Name); 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; GameData.TestItems = this;

@ -1,9 +1,9 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using DotNetCTFDumper.Utils; 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 public class GlobalValues : ChunkLoader
{ {

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

@ -1,8 +1,8 @@
using System; using System;
using DotNetCTFDumper.Utils; 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 class ObjectNames : ChunkLoader//Fucking trash
{ {

@ -1,9 +1,8 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using DotNetCTFDumper.MMFParser.Data;
using DotNetCTFDumper.Utils; using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Objects namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Objects
{ {
public class Animations:ChunkLoader public class Animations:ChunkLoader
{ {
@ -130,7 +129,7 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Objects
{ {
var handle = Reader.ReadInt16(); var handle = Reader.ReadInt16();
Frames.Add(handle); 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 public enum Obstacle
{ {

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

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

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

@ -1,8 +1,8 @@
using System; using System;
using DotNetCTFDumper.Utils; 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 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.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.Drawing.Imaging; using System.Drawing.Imaging;
using System.IO;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using DotNetCTFDumper.Utils; 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 public class AppIcon : ChunkLoader
{ {

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

@ -1,17 +1,25 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using DotNetCTFDumper.MMFParser.Data; using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.Utils; 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>(); List<DataLoader> _items = new List<DataLoader>();
public byte[] Saved;
public override void Write(ByteWriter Writer) public override void Write(ByteWriter Writer)
{ {
throw new NotImplementedException(); if (Saved != null)
{
Writer.WriteBytes(Saved);
}
else
{
Writer.WriteInt8(0);
}
} }
public override void Print() public override void Print()
@ -28,12 +36,11 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders
if(id==0) break; if(id==0) break;
var data = new ByteReader(Reader.ReadBytes((int) Reader.ReadUInt32())); var data = new ByteReader(Reader.ReadBytes((int) Reader.ReadUInt32()));
} }
var size = Reader.Tell() - start;
Reader.Seek(start);
Saved = Reader.ReadBytes((int) size);
} }

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

@ -1,13 +1,14 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data;
using System.IO; using System.IO;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using DotNetCTFDumper.MMFParser.ChunkLoaders.Events; using System.Security.AccessControl;
using DotNetCTFDumper.MMFParser.Data; using System.Text;
using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.MMFParser.EXE.Loaders.Events;
using DotNetCTFDumper.Utils; using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.MFALoaders namespace DotNetCTFDumper.MMFParser.MFA.Loaders
{ {
public class Events:DataLoader public class Events:DataLoader
{ {
@ -40,17 +41,20 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders
public uint LineItemType; public uint LineItemType;
public uint EventLine; public uint EventLine;
public uint EventLineY; public uint EventLineY;
public byte[] Saved;
public int EditorDataUnk;
public Events(ByteReader reader) : base(reader) 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() public override void Read()
{ {
Version = Reader.ReadUInt16(); Version = Reader.ReadUInt16();
FrameType = Reader.ReadUInt16(); FrameType = Reader.ReadUInt16();
Items = new List<EventGroup>(); Items = new List<EventGroup>();
@ -59,6 +63,7 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders
{ {
string name = Reader.ReadAscii(4); string name = Reader.ReadAscii(4);
Console.WriteLine("Group: "+name+" "+Encoding.ASCII.GetBytes(name).GetHex()+", Position: "+Reader.Tell());
if (name == EventData) if (name == EventData)
{ {
uint size = Reader.ReadUInt32(); uint size = Reader.ReadUInt32();
@ -105,7 +110,7 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders
} }
else if (name == EventEditorData) else if (name == EventEditorData)
{ {
Reader.Skip(4); EditorDataUnk = Reader.ReadInt32();
ConditionWidth = Reader.ReadUInt16(); ConditionWidth = Reader.ReadUInt16();
ObjectHeight = Reader.ReadUInt16(); ObjectHeight = Reader.ReadUInt16();
Reader.Skip(12); Reader.Skip(12);
@ -174,85 +179,128 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders
public override void Write(ByteWriter Writer) public override void Write(ByteWriter Writer)
{ {
Writer.WriteUInt16(Version); //Writer.WriteBytes(Saved);
Writer.WriteInt16((short) FrameType); //return;
if (Items != null) 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 = new ByteWriter(new MemoryStream());
{ Writer.WriteUInt16(Version);
Writer.WriteAscii(CommentData); Writer.WriteInt16((short) FrameType);
foreach (Comment comment in Comments)
// 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) foreach (ushort objectHandle in ObjectHandles)
{ {
Writer.WriteAscii(ObjectData); Writer.WriteUInt16(objectHandle);
Writer.WriteUInt32((uint) Objects.Count); }
foreach (EventObject eventObject in Objects)
{ foreach (ushort objectFlag in ObjectFlags)
eventObject.Write(Writer); {
} Writer.WriteUInt16(objectFlag);
} }
Writer.WriteAscii(EventEditorData);
Writer.Skip(4+2*2+4*3); Writer.WriteUInt16((ushort) Folders.Count);
if (ObjectTypes != null) foreach (string folder in Folders)
{ {
Writer.WriteAscii(ObjectListData); Writer.AutoWriteUnicode(folder);
Writer.WriteInt16(-1); }
Writer.WriteInt16((short) ObjectTypes.Count);
foreach (ushort objectType in ObjectTypes)
{
Writer.WriteUInt16(objectType);
}
foreach (ushort objectHandle in ObjectHandles)
{
Writer.WriteUInt16(objectHandle);
} }
foreach (ushort objectFlag in ObjectFlags) 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); if (LineY != 0)
foreach (string folder in Folders)
{ {
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);
}
if (X != 0) //Writer.Skip((4 + 2 * 2 + 4 * 3)-4);
{
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(EventEnd);
{
Writer.WriteAscii(EditorLineData);
Writer.WriteInt16(1); //TODO: Fix commented part
Writer.WriteUInt32(LineY); //
Writer.WriteUInt32(LineItemType);
Writer.WriteUInt32(EventLine); //
Writer.WriteUInt32(EventLineY); // if (Comments != null)
// {
// Console.WriteLine("Writing Comments");
// Writer.WriteAscii(CommentData);
// foreach (Comment comment in Comments)
// {
// comment.Write(Writer);
// }
// }
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;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using DotNetCTFDumper.MMFParser.Data; using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.Utils; using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.MFALoaders namespace DotNetCTFDumper.MMFParser.MFA.Loaders
{ {
public class Frame : DataLoader public class Frame : DataLoader
{ {
@ -13,12 +13,12 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders
public int SizeY; public int SizeY;
public Color Background; public Color Background;
public int MaxObjects; public int MaxObjects;
public List<FrameItem> Items; public List<FrameItem> Items=new List<FrameItem>();
public int Handle; public int Handle;
public int LastViewedX; public int LastViewedX;
public int LastViewedY; public int LastViewedY;
public List<ItemFolder> Folders; public List<ItemFolder> Folders=new List<ItemFolder>();
public List<FrameInstance> Instances; public List<FrameInstance> Instances=new List<FrameInstance>();
public BitDict Flags = new BitDict(new string[] public BitDict Flags = new BitDict(new string[]
{ {
@ -41,12 +41,17 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders
public int ActiveLayer; public int ActiveLayer;
public List<Layer> Layers; public List<Layer> Layers;
public Events Events; public Events Events;
public ChunkList Chunks;
public Transition FadeIn;
public Transition FadeOut;
public Frame(ByteReader reader) : base(reader) public Frame(ByteReader reader) : base(reader)
{ {
} }
public override void Write(ByteWriter Writer) public override void Write(ByteWriter Writer)
{ {
Writer.WriteInt32(Handle); Writer.WriteInt32(Handle);
@ -73,10 +78,20 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders
{ {
layer.Write(Writer); layer.Write(Writer);
} }
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);
//TODO: Do transitions
Writer.WriteInt8(0);
Writer.WriteInt8(0);
Writer.WriteInt32(Items.Count); Writer.WriteInt32(Items.Count);
foreach (var item in Items) foreach (var item in Items)
@ -94,9 +109,18 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders
foreach (var item in Instances) foreach (var item in Instances)
{ {
item.Write(Writer); item.Write(Writer);
if (Instances != null)
{
Writer.WriteInt32(Instances.Count);
foreach (var item in Instances)
{
item.Write(Writer);
}
} }
Events.Write(Writer); Events.Write(Writer);
Chunks.Write(Writer);
} }
public override void Print() public override void Print()
@ -127,11 +151,8 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders
{ {
Palette.Add(Reader.ReadColor()); Palette.Add(Reader.ReadColor());
} }
StampHandle = Reader.ReadInt32(); StampHandle = Reader.ReadInt32();
ActiveLayer = Reader.ReadInt32(); ActiveLayer = Reader.ReadInt32();
int layersCount = Reader.ReadInt32(); int layersCount = Reader.ReadInt32();
Layers = new List<Layer>(); Layers = new List<Layer>();
for (int i = 0; i < layersCount; i++) for (int i = 0; i < layersCount; i++)
@ -139,20 +160,20 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders
var layer = new Layer(Reader); var layer = new Layer(Reader);
layer.Read(); layer.Read();
Layers.Add(layer); Layers.Add(layer);
} }
//fadein if (Reader.ReadByte() == 1)
if (Reader.ReadByte() != 0)
{ {
throw new NotImplementedException(); FadeIn = new Transition(Reader);
FadeIn.Read();
} }
//fadeout if (Reader.ReadByte() == 1)
if (Reader.ReadByte() != 0)
{ {
throw new NotImplementedException(); FadeOut = new Transition(Reader);
FadeOut.Read();
} }
Items = new List<FrameItem>(); Items = new List<FrameItem>();
var frameItemsCount = Reader.ReadInt32(); var frameItemsCount = Reader.ReadInt32();
for (int i = 0; i < frameItemsCount; i++) for (int i = 0; i < frameItemsCount; i++)
@ -182,7 +203,19 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders
} }
Reader.Skip(96); Reader.Skip(96);
Events = new Events(Reader); Events = new Events(Reader);
Console.WriteLine("BeforeEventsPos: "+Reader.Tell());
Events.Read(); 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; using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.MFALoaders namespace DotNetCTFDumper.MMFParser.MFA.Loaders
{ {
public class FrameInstance:DataLoader 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 System;
using DotNetCTFDumper.MMFParser.Data; using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.MMFParser.MFALoaders.mfachunks; using DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks;
using DotNetCTFDumper.Utils; using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.MFALoaders namespace DotNetCTFDumper.MMFParser.MFA.Loaders
{ {
public class FrameItem : DataLoader public class FrameItem : DataLoader
{ {
@ -16,6 +16,9 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders
public int AntiAliasing; public int AntiAliasing;
public int Flags; public int Flags;
public int IconType; public int IconType;
public int IconHandle;
public ChunkList Chunks;
public Active Loader;
public override void Write(ByteWriter Writer) public override void Write(ByteWriter Writer)
{ {
@ -25,6 +28,12 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders
Writer.WriteInt32(Transparent); Writer.WriteInt32(Transparent);
Writer.WriteInt32(InkEffect); Writer.WriteInt32(InkEffect);
Writer.WriteInt32(InkEffectParameter); 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(); AntiAliasing = Reader.ReadInt32();
Flags = Reader.ReadInt32(); Flags = Reader.ReadInt32();
IconType = Reader.ReadInt32(); IconType = Reader.ReadInt32();
if(IconType==1) if(IconType==1)
{ {
var iconHandle = Reader.ReadInt32(); IconHandle = Reader.ReadInt32();
} }
else else
{ {
throw new NotImplementedException("invalid icon"); throw new NotImplementedException("invalid icon");
} }
var chunks = new ChunkList(Reader); Chunks = new ChunkList(Reader);
chunks.Read(); Chunks.Read();
if(ObjectType>=32)//extension base if(ObjectType>=32)//extension base
{ {
//TODO: Nonactives //TODO: Nonactives
} }
else else if(ObjectType==2)
{ {
var loader = new Active(Reader); Loader = new Active(Reader);
loader.Read(); Loader.Read();
} }

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

@ -1,8 +1,8 @@
using System.Collections.Generic; using System.Collections.Generic;
using DotNetCTFDumper.MMFParser.Data; using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.Utils; using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.MFALoaders namespace DotNetCTFDumper.MMFParser.MFA.Loaders
{ {
public class ItemFolder:DataLoader 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 System;
using DotNetCTFDumper.MMFParser.Data; using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.Utils; using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.MFALoaders namespace DotNetCTFDumper.MMFParser.MFA.Loaders
{ {
public class Layer : DataLoader public class Layer : DataLoader
{ {
public string Name="ERROR"; public string Name="ERROR";
public float XCoefficient; public float XCoefficient;
public float YCoefficient; public float YCoefficient;
public int Flags;
public BitDict Flags = new BitDict(new string[]
{
"Visible",
"Locked",
"Obsolete",
"HideAtStart",
"NoBackground",
"WrapHorizontally",
"WrapVertically",
"PreviousEffect"
}
);
public override void Write(ByteWriter Writer) public override void Write(ByteWriter Writer)
{ {
Helper.AutoWriteUnicode(Writer,Name); Writer.AutoWriteUnicode(Name);
Writer.WriteInt32(Flags); Writer.WriteInt32((int) Flags.flag);
Writer.WriteSingle(XCoefficient); Writer.WriteSingle(XCoefficient);
Writer.WriteSingle(YCoefficient); Writer.WriteSingle(YCoefficient);
} }
@ -27,13 +39,14 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders
public override void Read() public override void Read()
{ {
Name = Helper.AutoReadUnicode(Reader); Name = Reader.AutoReadUnicode();
Flags = Reader.ReadInt32(); Flags.flag = (uint) Reader.ReadInt32();
XCoefficient = Reader.ReadSingle(); XCoefficient = Reader.ReadSingle();
YCoefficient = Reader.ReadSingle(); YCoefficient = Reader.ReadSingle();
} }
public Layer(ByteReader reader):base(reader) public Layer(ByteReader reader):base(reader)
{ {

@ -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;
using System.Collections.Generic; using System.Collections.Generic;
using DotNetCTFDumper.MMFParser.Data; using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.Utils; using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.MFALoaders namespace DotNetCTFDumper.MMFParser.MFA.Loaders
{ {
public class ValueList : DataLoader public class ValueList : DataLoader
{ {

@ -1,8 +1,8 @@
using DotNetCTFDumper.Utils; 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() public override void Print()
{ {
@ -14,6 +14,12 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders.mfachunks
{ {
base.Read(); base.Read();
} }
public override void Write(ByteWriter Writer)
{
base.Write(Writer);
}
public Active(ByteReader reader) : base(reader) { } public Active(ByteReader reader) : base(reader) { }
} }
} }

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

@ -1,16 +1,19 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using DotNetCTFDumper.MMFParser.Data; using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.Utils; 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>(); List<Behaviour> _items = new List<Behaviour>();
public override void Write(ByteWriter Writer) public override void Write(ByteWriter Writer)
{ {
throw new NotImplementedException(); foreach (Behaviour behaviour in _items)
{
behaviour.Write(Writer);
}
} }
public override void Print() public override void Print()
@ -36,7 +39,8 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders.mfachunks
public ByteReader Data; public ByteReader Data;
public override void Write(ByteWriter Writer) public override void Write(ByteWriter Writer)
{ {
throw new NotImplementedException(); Writer.AutoWriteUnicode(Name);
Writer.WriteBytes(Data.ReadBytes((int) Data.Size()));
} }
public override void Print() public override void Print()
@ -46,7 +50,8 @@ namespace DotNetCTFDumper.MMFParser.MFALoaders.mfachunks
public override void Read() public override void Read()
{ {
Name = Reader.ReadAscii(Reader.ReadInt32()); Name = Reader.AutoReadUnicode();
Data = new ByteReader(Reader.ReadBytes(Reader.ReadInt32())); Data = new ByteReader(Reader.ReadBytes(Reader.ReadInt32()));
} }

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

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

@ -1,20 +1,20 @@
using System; using System;
using System.IO; using System.IO;
using DotNetCTFDumper.MMFParser.Data; using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.Utils; using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.Decompiling namespace DotNetCTFDumper.MMFParser.Translation
{ {
public static class MFAGenerator public static class MFAGenerator
{ {
//public static readonly string TemplatePath = @"C:\Users\MED45\Downloads\testNoFrames.mfa"; //public static readonly string TemplatePath = @"C:\Users\MED45\Downloads\testNoFrames.mfa";
public static readonly string TemplatePath = @"C:\Users\ivani\Desktop\CTFResearch\testNoFrames.mfa"; public static readonly string TemplatePath = @"C:\Users\ivani\Desktop\CTFResearch\testNoFrames.mfa";
public static void BuildMFA() public static MFA.MFA BuildMFA()
{ {
Settings.DoMFA = true; Settings.DoMFA = true;
var mfaReader = new ByteReader(TemplatePath, FileMode.Open); var mfaReader = new ByteReader(TemplatePath, FileMode.Open);
var template = new MFA(mfaReader); var template = new MFA.MFA(mfaReader);
template.Read(); //Loading template template.Read(); //Loading template
@ -26,18 +26,21 @@ namespace DotNetCTFDumper.MMFParser.Decompiling
FileMode.Create); //New writer for new MFA FileMode.Create); //New writer for new MFA
template.Write(mfaWriter); //Writing new MFA template.Write(mfaWriter); //Writing new MFA
mfaWriter.Dispose(); mfaWriter.Dispose();
return template;
Logger.Log("MFA Done",true,ConsoleColor.Yellow); Logger.Log("MFA Done",true,ConsoleColor.Yellow);
} }
public static void ReadTestMFA() public static void ReadTestMFA()
{ {
var mfaReader = new ByteReader(TemplatePath, FileMode.Open); var mfaReader = new ByteReader(@"C:\Users\ivani\Desktop\CTFResearch\ObjTEST.mfa", FileMode.Open);
var template = new MFA(mfaReader); var template = new MFA.MFA(mfaReader);
Settings.DoMFA = true; Settings.DoMFA = true;
template.Read(); template.Read();
//Add modifications //Add modifications
var mfaWriter = new ByteWriter("outTest.mfa", FileMode.Create); var mfaWriter = new ByteWriter("outTest.mfa", FileMode.Create);
template.Write(mfaWriter); 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.Runtime.InteropServices;
using System.Windows.Forms; using System.Windows.Forms;
using DotNetCTFDumper.GUI; using DotNetCTFDumper.GUI;
using DotNetCTFDumper.MMFParser.Data; using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.MMFParser.Decompiling; using DotNetCTFDumper.MMFParser.Translation;
using DotNetCTFDumper.Utils; using DotNetCTFDumper.Utils;
using Joveler.Compression.ZLib; using Joveler.Compression.ZLib;
namespace DotNetCTFDumper namespace DotNetCTFDumper
{ {
internal class Program public class Program
{ {
//public static string path = @"H:\fnaf-world.exe";//test
//public static string path = @"D:\SteamLibrary\steamapps\common\Five Nights at Freddy's Sister Location\SisterLocation.exe";
//public static string Path = ""; //TODO: Make Selectable
public static MainForm MyForm; public static MainForm MyForm;
public delegate void DumperEvent(object obj);
[STAThread] [STAThread]
@ -24,12 +22,12 @@ namespace DotNetCTFDumper
var handle = Helper.GetConsoleWindow(); var handle = Helper.GetConsoleWindow();
Helper.ShowWindow(handle, Helper.SW_HIDE); Helper.ShowWindow(handle, Helper.SW_HIDE);
InitNativeLibrary(); InitNativeLibrary();
MFAGenerator.ReadTestMFA(); // MFAGenerator.ReadTestMFA();
Environment.Exit(0); // Environment.Exit(0);
var path = ""; var path = "";
var verbose = false; var verbose = false;
var dumpImages = false; var dumpImages = true;
var dumpSounds = true; var dumpSounds = true;
if (args.Length == 0) if (args.Length == 0)

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

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

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

@ -129,9 +129,9 @@ namespace DotNetCTFDumper.Utils
var r = ReadByte(); var r = ReadByte();
var g = ReadByte(); var g = ReadByte();
var b = 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 WriteInt8(byte value) => Write(value);
public void WriteUInt8(sbyte value) => Write(value);
public void WriteInt16(short value) => Write(value); public void WriteInt16(short value) => Write(value);
public void WriteInt32(int value) => Write(value); public void WriteInt32(int value) => Write(value);
public void WriteInt64(long value) => Write(value); public void WriteInt64(long value) => Write(value);
@ -96,7 +98,7 @@ namespace DotNetCTFDumper.Utils
WriteInt8(color.R); WriteInt8(color.R);
WriteInt8(color.G); WriteInt8(color.G);
WriteInt8(color.B); WriteInt8(color.B);
WriteInt8(0); WriteInt8(color.A);
} }
public void WriteWriter(ByteWriter toWrite) public void WriteWriter(ByteWriter toWrite)

@ -41,6 +41,7 @@ namespace DotNetCTFDumper.Utils
return decompressedData; return decompressedData;
} }
public static byte[] compress_block(byte[] data) public static byte[] compress_block(byte[] data)
{ {
ZLibCompressOptions compOpts = new ZLibCompressOptions(); ZLibCompressOptions compOpts = new ZLibCompressOptions();

@ -7,9 +7,9 @@ using System.Runtime.InteropServices;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using DotNetCTFDumper.GUI; using DotNetCTFDumper.GUI;
using DotNetCTFDumper.MMFParser; using DotNetCTFDumper.MMFParser;
using DotNetCTFDumper.MMFParser.ChunkLoaders.Events.Parameters; using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.MMFParser.ChunkLoaders.Objects; using DotNetCTFDumper.MMFParser.EXE.Loaders.Events.Parameters;
using DotNetCTFDumper.MMFParser.Data; using DotNetCTFDumper.MMFParser.EXE.Loaders.Objects;
namespace DotNetCTFDumper.Utils namespace DotNetCTFDumper.Utils
{ {
@ -52,6 +52,15 @@ namespace DotNetCTFDumper.Utils
return temp; 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) public static string AutoReadUnicode(this ByteReader reader)
{ {
@ -208,6 +217,7 @@ namespace DotNetCTFDumper.Utils
public static string ActualName(this ChunkList.Chunk chunk) public static string ActualName(this ChunkList.Chunk chunk)
{ {
return "Placeholder";
var constName = ((Constants.ChunkNames) chunk.Id).ToString(); var constName = ((Constants.ChunkNames) chunk.Id).ToString();
int tempId = 0; int tempId = 0;
int.TryParse(constName, out tempId); int.TryParse(constName, out tempId);

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