Dumper refactor, GUI fix

master
1987kostya 5 years ago
parent e171a46eac
commit fa799f94ec

@ -80,8 +80,8 @@
<HintPath>..\packages\Be.Windows.Forms.HexBox.1.6.1\lib\net40\Be.Windows.Forms.HexBox.dll</HintPath> <HintPath>..\packages\Be.Windows.Forms.HexBox.1.6.1\lib\net40\Be.Windows.Forms.HexBox.dll</HintPath>
<Private>True</Private> <Private>True</Private>
</Reference> </Reference>
<Reference Include="Ionic.Zlib, Version=1.9.1.5, Culture=neutral, PublicKeyToken=edbe51ad942a3f5c"> <Reference Include="DotNetZip, Version=1.15.0.0, Culture=neutral, PublicKeyToken=6583c7c814667745">
<HintPath>..\packages\Ionic.Zlib.1.9.1.5\lib\Ionic.Zlib.dll</HintPath> <HintPath>..\packages\DotNetZip.1.15.0\lib\net40\DotNetZip.dll</HintPath>
<Private>True</Private> <Private>True</Private>
</Reference> </Reference>
<Reference Include="System" /> <Reference Include="System" />
@ -106,6 +106,12 @@
<Compile Include="GUI\CryptoKeyForm.Designer.cs"> <Compile Include="GUI\CryptoKeyForm.Designer.cs">
<DependentUpon>CryptoKeyForm.cs</DependentUpon> <DependentUpon>CryptoKeyForm.cs</DependentUpon>
</Compile> </Compile>
<Compile Include="GUI\FrameViewer.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="GUI\FrameViewer.Designer.cs">
<DependentUpon>FrameViewer.cs</DependentUpon>
</Compile>
<Compile Include="GUI\HexViewForm.cs"> <Compile Include="GUI\HexViewForm.cs">
<SubType>Form</SubType> <SubType>Form</SubType>
</Compile> </Compile>
@ -118,6 +124,7 @@
<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\ObjectBox.cs" />
<Compile Include="GUI\PackDataForm.cs"> <Compile Include="GUI\PackDataForm.cs">
<SubType>Form</SubType> <SubType>Form</SubType>
</Compile> </Compile>
@ -180,6 +187,7 @@
<Compile Include="MMFParser\ChunkLoaders\yves.cs" /> <Compile Include="MMFParser\ChunkLoaders\yves.cs" />
<Compile Include="MMFParser\Constants.cs" /> <Compile Include="MMFParser\Constants.cs" />
<Compile Include="Settings.cs" /> <Compile Include="Settings.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" />
@ -216,6 +224,9 @@
<EmbeddedResource Include="GUI\CryptoKeyForm.resx"> <EmbeddedResource Include="GUI\CryptoKeyForm.resx">
<DependentUpon>CryptoKeyForm.cs</DependentUpon> <DependentUpon>CryptoKeyForm.cs</DependentUpon>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="GUI\FrameViewer.resx">
<DependentUpon>FrameViewer.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="GUI\HexViewForm.resx"> <EmbeddedResource Include="GUI\HexViewForm.resx">
<DependentUpon>HexViewForm.cs</DependentUpon> <DependentUpon>HexViewForm.cs</DependentUpon>
</EmbeddedResource> </EmbeddedResource>

@ -0,0 +1,103 @@
using System;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
using DotNetCTFDumper.MMFParser.ChunkLoaders;
using DotNetCTFDumper.MMFParser.ChunkLoaders.Banks;
using DotNetCTFDumper.MMFParser.ChunkLoaders.Objects;
using DotNetCTFDumper.MMFParser.Data;
using DotNetCTFDumper.MMFParser.MFALoaders;
using Frame = DotNetCTFDumper.MMFParser.ChunkLoaders.Frame;
namespace DotNetCTFDumper.GUI
{
public partial class FrameViewer : Form
{
private ImageBank images;
private ObjectBox _lastSelectedObject;
public FrameViewer()
{
InitializeComponent();
}
public FrameViewer(Frame frame, ImageBank imgs)
{
InitializeComponent();
this.Width = frame.Width;
this.Height = frame.Height;
this.BackColor = frame.Background;
this.Text = "Frame Viewer: "+frame.Name;
images = imgs;
contextMenuStrip1.ItemClicked+= new ToolStripItemClickedEventHandler(MenuItemSelected);
LoadObjects(frame);
}
public void CreateImage(ObjectInstance obj)
{
var pictureBox1 = new ObjectBox(obj);
var img = obj.FrameItem.GetPreview();
if (img != null)
{
pictureBox1.Anchor = AnchorStyles.None;
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
pictureBox1.Location = new Point(obj.X-obj.FrameItem.GetPreview().XHotspot, obj.Y-obj.FrameItem.GetPreview().YHotspot);
pictureBox1.ClientSize = new Size(img.Bitmap.Width, img.Bitmap.Height);
pictureBox1.Image = img.Bitmap;
pictureBox1.MouseClick += new MouseEventHandler(OnObjectSelected);
scrollableControl1.Controls.Add(pictureBox1);
}
}
private void OnObjectSelected(object sender, MouseEventArgs e)
{
if ((e.Button & MouseButtons.Right) != 0)
{
_lastSelectedObject = (ObjectBox) sender;
nameMenuItem.Text = "Name: " + _lastSelectedObject.Obj.Name;
positionMenuItem.Text = $"Position: {_lastSelectedObject.Obj.X}x{_lastSelectedObject.Obj.Y}";
contextMenuStrip1.Show(Cursor.Position);
}
else
{
}
}
private void LoadObjects(Frame frame)
{
var size = new Size(Exe.Instance.GameData.Header.WindowWidth,Exe.Instance.GameData.Header.WindowHeight);
scrollableControl1.Size = new Size(frame.Width,frame.Height);;
ClientSize = size;
var list = frame.Objects.Items.OrderBy(x=>x.Handle);
foreach (var obj in list)
{
//TODO:Layers
CreateImage(obj);
}
}
private void MenuItemSelected(object sender, ToolStripItemClickedEventArgs e)
{
if (e.ClickedItem.Name == "deleteObjBtn")
{
Controls.Remove(_lastSelectedObject);
_lastSelectedObject.Dispose();
}
}
private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
{
}
}
}

@ -51,6 +51,7 @@
this.ChunkCombo = new System.Windows.Forms.ContextMenuStrip(this.components); this.ChunkCombo = new System.Windows.Forms.ContextMenuStrip(this.components);
this.saveChunkBtn = new System.Windows.Forms.ToolStripMenuItem(); this.saveChunkBtn = new System.Windows.Forms.ToolStripMenuItem();
this.viewHexBtn = new System.Windows.Forms.ToolStripMenuItem(); this.viewHexBtn = new System.Windows.Forms.ToolStripMenuItem();
this.previewFrameBtn = new System.Windows.Forms.ToolStripMenuItem();
this.packDataBtn = new System.Windows.Forms.Button(); this.packDataBtn = new System.Windows.Forms.Button();
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();
@ -114,7 +115,7 @@
this.listBox1.Name = "listBox1"; this.listBox1.Name = "listBox1";
this.listBox1.Size = new System.Drawing.Size(180, 281); this.listBox1.Size = new System.Drawing.Size(180, 281);
this.listBox1.TabIndex = 5; this.listBox1.TabIndex = 5;
this.listBox1.SelectedIndexChanged += new System.EventHandler(this.listBox1_SelectedIndexChanged);
// //
// GameInfo // GameInfo
// //
@ -271,7 +272,6 @@
this.loadingLabel.Size = new System.Drawing.Size(335, 91); this.loadingLabel.Size = new System.Drawing.Size(335, 91);
this.loadingLabel.TabIndex = 16; this.loadingLabel.TabIndex = 16;
this.loadingLabel.Text = "Loading..."; this.loadingLabel.Text = "Loading...";
this.loadingLabel.Click += new System.EventHandler(this.loadingLabel_Click);
// //
// cryptKeyBtn // cryptKeyBtn
// //
@ -302,7 +302,7 @@
this.showHexBtn.Text = "Show hex"; this.showHexBtn.Text = "Show hex";
this.showHexBtn.UseVisualStyleBackColor = false; this.showHexBtn.UseVisualStyleBackColor = false;
this.showHexBtn.Visible = false; this.showHexBtn.Visible = false;
this.showHexBtn.Click += new System.EventHandler(this.ShowHex_Click);
// //
// dumpSortedBtn // dumpSortedBtn
// //
@ -322,24 +322,30 @@
// //
// ChunkCombo // ChunkCombo
// //
this.ChunkCombo.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {this.saveChunkBtn, this.viewHexBtn}); this.ChunkCombo.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {this.saveChunkBtn, this.viewHexBtn, this.previewFrameBtn});
this.ChunkCombo.Name = "Save"; this.ChunkCombo.Name = "Save";
this.ChunkCombo.Size = new System.Drawing.Size(124, 48); this.ChunkCombo.Size = new System.Drawing.Size(152, 70);
this.ChunkCombo.Opening += new System.ComponentModel.CancelEventHandler(this.ChunkCombo_Opening);
this.ChunkCombo.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.ChunkCombo_ItemSelected); this.ChunkCombo.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.ChunkCombo_ItemSelected);
// //
// saveChunkBtn // saveChunkBtn
// //
this.saveChunkBtn.Name = "saveChunkBtn"; this.saveChunkBtn.Name = "saveChunkBtn";
this.saveChunkBtn.Size = new System.Drawing.Size(123, 22); this.saveChunkBtn.Size = new System.Drawing.Size(151, 22);
this.saveChunkBtn.Text = "Save"; this.saveChunkBtn.Text = "Save";
// //
// viewHexBtn // viewHexBtn
// //
this.viewHexBtn.Name = "viewHexBtn"; this.viewHexBtn.Name = "viewHexBtn";
this.viewHexBtn.Size = new System.Drawing.Size(123, 22); this.viewHexBtn.Size = new System.Drawing.Size(151, 22);
this.viewHexBtn.Text = "View Hex"; this.viewHexBtn.Text = "View Hex";
// //
// previewFrameBtn
//
this.previewFrameBtn.Name = "previewFrameBtn";
this.previewFrameBtn.Size = new System.Drawing.Size(151, 22);
this.previewFrameBtn.Text = "Preview Frame";
//
// packDataBtn // packDataBtn
// //
this.packDataBtn.Anchor = ((System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.packDataBtn.Anchor = ((System.Windows.Forms.AnchorStyles) ((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
@ -437,6 +443,8 @@
this.PerformLayout(); this.PerformLayout();
} }
private System.Windows.Forms.ToolStripMenuItem previewFrameBtn;
private System.Windows.Forms.Button musicsButton; private System.Windows.Forms.Button musicsButton;
private System.Windows.Forms.ProgressBar imageBar; private System.Windows.Forms.ProgressBar imageBar;

@ -42,6 +42,8 @@ namespace DotNetCTFDumper.GUI
saveChunkBtn.BackColor=Color.Black; saveChunkBtn.BackColor=Color.Black;
viewHexBtn.ForeColor = ColorTheme; viewHexBtn.ForeColor = ColorTheme;
viewHexBtn.BackColor=Color.Black; viewHexBtn.BackColor=Color.Black;
previewFrameBtn.ForeColor = ColorTheme;
previewFrameBtn.BackColor=Color.Black;
//Labels //Labels
label1.ForeColor = ColorTheme; label1.ForeColor = ColorTheme;
label1.Text = Settings.DumperVersion; label1.Text = Settings.DumperVersion;
@ -141,6 +143,15 @@ namespace DotNetCTFDumper.GUI
break; break;
case "viewHexBtn": case "viewHexBtn":
ShowHex(); ShowHex();
break;
case "previewFrameBtn":
var selected = ((ChunkNode) treeView1.SelectedNode).loader;
if (selected is Frame frm)
{
var viewer = new FrameViewer(frm,Exe.Instance.GameData.GameChunks.GetChunk<ImageBank>());
viewer.Show();
}
break; break;
} }
} }
@ -289,71 +300,59 @@ namespace DotNetCTFDumper.GUI
{ {
if (!IsDumpingSounds) if (!IsDumpingSounds)
{ {
soundBar.Visible = true; SetSoundElements(true);
soundLabel.Visible = true; Backend.DumpSounds(this,true,true);
soundsButton.Text = "Cancel";
soundBar.Value = 0;
IsDumpingSounds = true;
BreakSounds = false;
var worker = new BackgroundWorker();
worker.DoWork += (senderA, eA) =>
{
Exe.Instance.GameData.GameChunks.GetChunk<SoundBank>().Read(true);
};
worker.RunWorkerCompleted += (senderA, eA) =>
{
soundBar.Visible = false;
soundLabel.Visible = false;
Logger.Log("Sounds done");
soundsButton.Text = "Dump Sounds";
};
worker.RunWorkerAsync();
} }
else else
{ {
BreakSounds = true; BreakSounds = true;
soundBar.Visible = false;
soundLabel.Visible = false;
soundsButton.Text = "Dump Sounds";
IsDumpingSounds = false; IsDumpingSounds = false;
SetSoundElements(false);
} }
} }
private void imagesButton_Click(object sender, EventArgs e) private void imagesButton_Click(object sender, EventArgs e)
{ {
if (!IsDumpingImages) if (!IsDumpingImages)
{ {
imageBar.Visible = true; SetImageElements(true);
imageLabel.Visible = true; Backend.DumpImages(this,true,true);
imagesButton.Text = "Cancel";
imageBar.Value = 0;
IsDumpingImages = true;
BreakImages = false;
var worker = new BackgroundWorker();
worker.DoWork += (senderA, eA) =>
{
Exe.Instance.GameData.GameChunks.GetChunk<ImageBank>().Read(true,true);
};
worker.RunWorkerCompleted += (senderA, eA) =>
{
imageBar.Visible = false;
imageLabel.Visible = false;
Logger.Log("Images done",true,ConsoleColor.Yellow);
imagesButton.Text = "Dump Images";
};
worker.RunWorkerAsync();
} }
else else
{ {
BreakImages = true; BreakImages = true;
imageBar.Visible = false;
imageLabel.Visible = false;
imagesButton.Text = "Dump Images";
IsDumpingImages = false; IsDumpingImages = false;
SetImageElements(false);
} }
} }
public void SetSoundElements(bool state)
{
soundBar.Visible = state;
soundLabel.Visible = state;
soundsButton.Text = state ? "Cancel":"Dump Sounds";
soundBar.Value = 0;
}
public void SetImageElements(bool state)
{
imageBar.Visible = state;
imageLabel.Visible = state;
imagesButton.Text = state ? "Cancel":"Dump Images";
imageBar.Value = 0;
}
public void SetMusicElements(bool state)
{
musicBar.Visible = state;
musicLabel.Visible = state;
musicsButton.Text = state ? "Cancel":"Dump Musics";
musicBar.Value = 0;
}
private void cryptKeyBtn_Click(object sender, EventArgs e) private void cryptKeyBtn_Click(object sender, EventArgs e)
@ -377,11 +376,7 @@ namespace DotNetCTFDumper.GUI
KeyForm.Show(); KeyForm.Show();
} }
private void ShowHex_Click(object sender, EventArgs e)
{
ShowHex();
}
private void ShowHex() private void ShowHex()
{ {
@ -390,17 +385,15 @@ namespace DotNetCTFDumper.GUI
var node = ((ChunkNode) treeView1.SelectedNode); var node = ((ChunkNode) treeView1.SelectedNode);
HexViewForm hexform = null; HexViewForm hexform = null;
hexform = new HexViewForm(node.chunk.ChunkData,node.chunk.RawData,ColorTheme,$"Hew View: {node.chunk.Name}"); hexform = new HexViewForm(node.chunk.ChunkData, node.chunk.RawData, ColorTheme,
$"Hew View: {node.chunk.Name}");
hexform.Show(); hexform.Show();
} }
} }
private void loadingLabel_Click(object sender, EventArgs e)
{
throw new NotImplementedException();
}
private void dumpSortedBtn_Click(object sender, EventArgs e) private void dumpSortedBtn_Click(object sender, EventArgs e)
{ {
@ -409,7 +402,6 @@ namespace DotNetCTFDumper.GUI
var worker = new BackgroundWorker(); var worker = new BackgroundWorker();
worker.DoWork += (senderA, eA) => worker.DoWork += (senderA, eA) =>
{ {
Settings.DumpImages = true; Settings.DumpImages = true;
var bank = Exe.Instance.GameData.GameChunks.GetChunk<ImageBank>(); var bank = Exe.Instance.GameData.GameChunks.GetChunk<ImageBank>();
bank.SaveImages=false; bank.SaveImages=false;
@ -420,25 +412,13 @@ namespace DotNetCTFDumper.GUI
{ {
imageBar.Visible = false; imageBar.Visible = false;
imageLabel.Visible = false; imageLabel.Visible = false;
ImageDumper.DumpImages(); ImageDumper.DumpImages();
}; };
worker.RunWorkerAsync(); worker.RunWorkerAsync();
} }
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
//throw new System.NotImplementedException();
}
private void ChunkCombo_Opening(object sender, CancelEventArgs e)
{
}
private void tabPage1_Click(object sender, EventArgs e) private void tabPage1_Click(object sender, EventArgs e)
{ {
throw new System.NotImplementedException(); throw new System.NotImplementedException();
@ -452,39 +432,19 @@ namespace DotNetCTFDumper.GUI
private void musicsButton_Click(object sender, EventArgs e) private void musicsButton_Click(object sender, EventArgs e)
{ {
var bank = Exe.Instance.GameData.GameChunks.GetChunk<MusicBank>();
if (bank == null) return;
if (!IsDumpingMusics) if (!IsDumpingMusics)
{ {
musicBar.Visible = true; Backend.DumpMusics(this,true,true);
musicLabel.Visible = true;
musicsButton.Text = "Cancel";
musicBar.Value = 0;
IsDumpingMusics = true;
BreakMusics = false;
var worker = new BackgroundWorker();
worker.DoWork += (senderA, eA) =>
{
Exe.Instance.GameData.GameChunks.GetChunk<MusicBank>().Read(true);
};
worker.RunWorkerCompleted += (senderA, eA) =>
{
musicBar.Visible = false;
musicLabel.Visible = false;
Logger.Log("Musics done",true,ConsoleColor.Yellow);
musicsButton.Text = "Dump Musics";
};
worker.RunWorkerAsync();
} }
else else
{ {
BreakMusics = true; BreakMusics = true;
musicBar.Visible = false;
musicLabel.Visible = false;
musicsButton.Text = "Dump Musics";
IsDumpingMusics = false; IsDumpingMusics = false;
SetMusicElements(false);
} }
} }
} }
} }

@ -0,0 +1,15 @@
using System.Windows.Forms;
using DotNetCTFDumper.MMFParser.ChunkLoaders;
namespace DotNetCTFDumper.GUI
{
public class ObjectBox:PictureBox
{
public ObjectInstance Obj;
public ObjectBox(ObjectInstance obj)
{
this.Obj = obj;
}
}
}

@ -139,7 +139,7 @@ namespace DotNetCTFDumper.MMFParser.Data
//I am not an asshole lol //I am not an asshole lol
writer.WriteAscii(ImageBankId); writer.WriteAscii(ImageBankId);
Icons.Write(writer); Icons.Write(writer);
return;
writer.WriteAscii(ImageBankId); writer.WriteAscii(ImageBankId);
Images.Write(writer); Images.Write(writer);

@ -0,0 +1,58 @@
using System.ComponentModel;
using DotNetCTFDumper.GUI;
using DotNetCTFDumper.MMFParser.ChunkLoaders.Banks;
using static DotNetCTFDumper.MMFParser.Data.Exe;
namespace DotNetCTFDumper.Utils
{
public static class Backend
{
public static void DumpSounds(MainForm form,bool load,bool save)
{
using (var worker = new BackgroundWorker())
{
if (Instance.GameData.GameChunks.GetChunk<SoundBank>() == null) return;
form.SetSoundElements(true);
worker.DoWork += (senderA, eA) => { Instance.GameData.GameChunks.GetChunk<SoundBank>().Read(save); };
worker.RunWorkerCompleted += (senderA, eA) =>
{
form.SetSoundElements(false);
MainForm.IsDumpingSounds = false;
};
worker.RunWorkerAsync();
}
}
public static void DumpImages(MainForm form,bool load,bool save)
{
using (var worker = new BackgroundWorker())
{
if (Instance.GameData.GameChunks.GetChunk<ImageBank>() == null) return;
form.SetImageElements(true);
worker.DoWork += (senderA, eA) => { Instance.GameData.GameChunks.GetChunk<ImageBank>().Read(load,save); };
worker.RunWorkerCompleted += (senderA, eA) =>
{
form.SetImageElements(false);
MainForm.IsDumpingImages = false;
};
worker.RunWorkerAsync();
}
}
public static void DumpMusics(MainForm form,bool load,bool save)
{
using (var worker = new BackgroundWorker())
{
if (Instance.GameData.GameChunks.GetChunk<MusicBank>() == null) return;
form.SetMusicElements(true);
worker.DoWork += (senderA, eA) => { Instance.GameData.GameChunks.GetChunk<MusicBank>().Read(save); };
worker.RunWorkerCompleted += (senderA, eA) =>
{
form.SetMusicElements(false);
MainForm.IsDumpingMusics = false;
};
worker.RunWorkerAsync();
}
}
}
}

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing;
using DotNetCTFDumper.MMFParser.Data; using DotNetCTFDumper.MMFParser.Data;
using DotNetCTFDumper.Utils; using DotNetCTFDumper.Utils;
using ChunkList = DotNetCTFDumper.MMFParser.Data.ChunkList; using ChunkList = DotNetCTFDumper.MMFParser.Data.ChunkList;
@ -34,7 +35,7 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders
public string Password; public string Password;
public int Width; public int Width;
public int Height; public int Height;
public byte[] Background; public Color Background;
public int Flags; public int Flags;
public int CountOfObjs; public int CountOfObjs;
int _top; int _top;
@ -146,7 +147,7 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders
"ToShow" "ToShow"
}); });
public byte[] Background; public Color Background;
public FrameHeader(ByteReader reader) : base(reader) public FrameHeader(ByteReader reader) : base(reader)
{ {
} }
@ -174,7 +175,7 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders
{ {
Width = Reader.ReadInt32(); Width = Reader.ReadInt32();
Height = Reader.ReadInt32(); Height = Reader.ReadInt32();
Background = Reader.ReadBytes(4); Background = Reader.ReadColor();
Flags.flag = Reader.ReadUInt32(); Flags.flag = Reader.ReadUInt32();
@ -244,9 +245,8 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders
public override void Read() public override void Read()
{ {
ObjectInfo = (ushort) Reader.ReadInt16();
Handle = (ushort) Reader.ReadInt16(); Handle = (ushort) Reader.ReadInt16();
ObjectInfo = (ushort) Reader.ReadInt16();
X = Reader.ReadInt32(); X = Reader.ReadInt32();
Y = Reader.ReadInt32(); Y = Reader.ReadInt32();
ParentType = Reader.ReadInt16(); ParentType = Reader.ReadInt16();
@ -264,7 +264,7 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders
{ {
get get
{ {
return Exe.Instance.GameData.GameChunks.GetChunk<FrameItems>().FromHandle(Handle); return Exe.Instance.GameData.GameChunks.GetChunk<FrameItems>().FromHandle(ObjectInfo);
} }
} }

@ -1,5 +1,8 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using DotNetCTFDumper.MMFParser.ChunkLoaders.Banks;
using DotNetCTFDumper.MMFParser.ChunkLoaders.Objects; using DotNetCTFDumper.MMFParser.ChunkLoaders.Objects;
using DotNetCTFDumper.MMFParser.Data; using DotNetCTFDumper.MMFParser.Data;
using DotNetCTFDumper.Utils; using DotNetCTFDumper.Utils;
@ -83,9 +86,36 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders
if (Properties != null) if (Properties != null)
{ {
//Properties.ReadNew(ObjectType,this); Properties.ReadNew(ObjectType,this);
} }
} }
public ImageItem GetPreview()
{
ImageItem bmp=null;
var images = Exe.Instance.GameData.GameChunks.GetChunk<ImageBank>();
if (ObjectType == 2)
{
var anims = ((ObjectCommon) (Properties.Loader)).Animations;
if (anims != null)
{
anims.AnimationDict.TryGetValue(0,
out Animation anim);
anim.DirectionDict.TryGetValue(0, out AnimationDirection direction);
var firstFrameHandle = direction.Frames[0];
bmp = images.Images[firstFrameHandle];
}
}
else if (ObjectType == 1)
{
images.Images.TryGetValue(((Backdrop) Properties.Loader).Image, out var img);
bmp = img;
}
return bmp;
}
} }
public class ObjectName : StringChunk public class ObjectName : StringChunk

@ -90,10 +90,10 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Banks
int _width; int _width;
int _height; int _height;
int _graphicMode; int _graphicMode;
int _xHotspot; public int XHotspot;
int _yHotspot; public int YHotspot;
int _actionX; public int ActionX;
int _actionY; public int ActionY;
BitDict Flags = new BitDict(new string[] BitDict Flags = new BitDict(new string[]
{ {
@ -119,6 +119,7 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Banks
public bool Debug = false; public bool Debug = false;
public int Debug2 = 1; public int Debug2 = 1;
private Bitmap _bitmap;
public override void Read() public override void Read()
{ {
@ -138,6 +139,7 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Banks
public void Load() public void Load()
{ {
_bitmap = null;
Reader.Seek(Position); Reader.Seek(Position);
ByteReader imageReader; ByteReader imageReader;
@ -157,16 +159,15 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Banks
_width = imageReader.ReadInt16(); _width = imageReader.ReadInt16();
_height = imageReader.ReadInt16(); _height = imageReader.ReadInt16();
_graphicMode = imageReader.ReadByte(); //Graphic mode is always 4 for SL _graphicMode = imageReader.ReadByte(); //Graphic mode is always 4 for SL
Console.WriteLine("COLORMODE: "+_graphicMode);
Flags.flag = imageReader.ReadByte(); Flags.flag = imageReader.ReadByte();
imageReader.Skip(2); imageReader.Skip(2);
_xHotspot = imageReader.ReadInt16(); XHotspot = imageReader.ReadInt16();
_yHotspot = imageReader.ReadInt16(); YHotspot = imageReader.ReadInt16();
_actionX = imageReader.ReadInt16(); ActionX = imageReader.ReadInt16();
_actionY = imageReader.ReadInt16(); ActionY = imageReader.ReadInt16();
_transparent = imageReader.ReadBytes(4); _transparent = imageReader.ReadBytes(4);
Logger.Log($"Loading image {Handle.ToString(),4} Size: {_width,4}x{_height,4}"); //Logger.Log($"Loading image {Handle.ToString(),4} Size: {_width,4}x{_height,4}");
byte[] imageData; byte[] imageData;
if (Flags["LZX"]) if (Flags["LZX"])
{ {
@ -227,6 +228,7 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Banks
public void Save(string filename) public void Save(string filename)
{ {
using (var bmp = new Bitmap(_width, _height, PixelFormat.Format32bppArgb)) using (var bmp = new Bitmap(_width, _height, PixelFormat.Format32bppArgb))
{ {
BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0,
@ -239,11 +241,40 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Banks
Marshal.Copy(_colorArray, 0, pNative, _colorArray.Length); Marshal.Copy(_colorArray, 0, pNative, _colorArray.Length);
bmp.UnlockBits(bmpData); bmp.UnlockBits(bmpData);
bmp.Save(filename); bmp.Save(filename);
} }
}
public Bitmap Bitmap
{
get
{
if (_bitmap == null)
{
_bitmap = new Bitmap(_width, _height, PixelFormat.Format32bppArgb);
BitmapData bmpData = _bitmap.LockBits(new Rectangle(0, 0,
_bitmap.Width,
_bitmap.Height),
ImageLockMode.WriteOnly,
_bitmap.PixelFormat);
IntPtr pNative = bmpData.Scan0;
Marshal.Copy(_colorArray, 0, pNative, _colorArray.Length);
_bitmap.UnlockBits(bmpData);
}
return _bitmap;
} }
}
public void Write(ByteWriter writer) public void Write(ByteWriter writer)
{ {
ByteWriter chunk = new ByteWriter(new MemoryStream()); ByteWriter chunk = new ByteWriter(new MemoryStream());
@ -263,10 +294,10 @@ namespace DotNetCTFDumper.MMFParser.ChunkLoaders.Banks
} }
chunk.Skip(2); chunk.Skip(2);
chunk.WriteInt16((short) _xHotspot); chunk.WriteInt16((short) XHotspot);
chunk.WriteInt16((short) _yHotspot); chunk.WriteInt16((short) YHotspot);
chunk.WriteInt16((short) _actionX); chunk.WriteInt16((short) ActionX);
chunk.WriteInt16((short) _actionY); chunk.WriteInt16((short) ActionY);
chunk.WriteBytes(_transparent); chunk.WriteBytes(_transparent);
chunk.WriteBytes(rawImg); chunk.WriteBytes(rawImg);

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="Be.Windows.Forms.HexBox" version="1.6.1" targetFramework="net472" /> <package id="Be.Windows.Forms.HexBox" version="1.6.1" targetFramework="net472" />
<package id="DotNetZip" version="1.15.0" targetFramework="net472" />
<package id="Ionic.Zlib" version="1.9.1.5" targetFramework="net472" /> <package id="Ionic.Zlib" version="1.9.1.5" targetFramework="net472" />
<package id="SharpZipLib" version="1.3.0" targetFramework="net472" /> <package id="SharpZipLib" version="1.3.1" targetFramework="net472" />
</packages> </packages>
Loading…
Cancel
Save