Pame2Mfa updates, MFA writing fixes

master
1987kostya 4 years ago
parent 6117ea4db6
commit 7b1572ea29

@ -217,6 +217,8 @@
<Compile Include="MMFParser\MFA\Loaders\mfachunks\Movements.cs" /> <Compile Include="MMFParser\MFA\Loaders\mfachunks\Movements.cs" />
<Compile Include="MMFParser\MFA\Loaders\mfachunks\ObjectLoader.cs" /> <Compile Include="MMFParser\MFA\Loaders\mfachunks\ObjectLoader.cs" />
<Compile Include="MMFParser\MFA\Loaders\ValueList.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" />

@ -226,9 +226,15 @@ namespace DotNetCTFDumper.MMFParser.EXE
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 13121:
loader = new Layers(chunk);
break;
case 26214: case 26214:
loader = new ImageBank(chunk); loader = new ImageBank(chunk);
break; break;

@ -201,8 +201,8 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Events
public void Write(ByteWriter Writer) public void Write(ByteWriter Writer)
{ {
ByteWriter newWriter = new ByteWriter(new MemoryStream()); ByteWriter newWriter = new ByteWriter(new MemoryStream());
newWriter.WriteInt8((byte) Conditions.Count); newWriter.WriteUInt8( (sbyte) Conditions.Count);
newWriter.WriteInt8((byte) Actions.Count); newWriter.WriteUInt8((sbyte) Actions.Count);
newWriter.WriteUInt16(Flags); newWriter.WriteUInt16(Flags);
if (Settings.Build >= 284) if (Settings.Build >= 284)
{ {

@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.Drawing.Imaging;
using DotNetCTFDumper.Utils; using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.EXE.Loaders namespace DotNetCTFDumper.MMFParser.EXE.Loaders
@ -43,6 +44,9 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders
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 override void Print(bool ext) public override void Print(bool ext)
@ -86,7 +90,21 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders
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;
@ -104,6 +122,8 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders
foreach (var item in Chunks.Chunks) foreach (var item in Chunks.Chunks)
{ {
//Directory.CreateDirectory($"{Program.DumpPath}\\CHUNKS\\FRAMES\\{this.name}"); //Directory.CreateDirectory($"{Program.DumpPath}\\CHUNKS\\FRAMES\\{this.name}");
@ -283,8 +303,51 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders
} }
} }
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 uint Flags;
public float XCoeff;
public float YCoeff;
public int NumberOfBackgrounds;
public int BackgroudIndex;
public Layer(ByteReader reader) : base(reader) public Layer(ByteReader reader) : base(reader)
{ {
} }
@ -295,7 +358,45 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders
public override void Read() public override void Read()
{ {
Flags = Reader.ReadUInt32();
XCoeff = Reader.ReadSingle();
YCoeff = Reader.ReadSingle();
NumberOfBackgrounds = Reader.ReadInt32();
BackgroudIndex = Reader.ReadInt32();
Name = Reader.ReadWideString();
Console.WriteLine(Name);
}
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)

@ -38,6 +38,7 @@ namespace DotNetCTFDumper.MMFParser.Decompiling
//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);
} }

@ -1,5 +1,12 @@
 
using System;
using System.Collections.Generic;
using System.Linq;
using DotNetCTFDumper.MMFParser.EXE; using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.MMFParser.MFA.Loaders;
using DotNetCTFDumper.Utils;
using Frame = DotNetCTFDumper.MMFParser.EXE.Loaders.Frame;
using Layer = DotNetCTFDumper.MMFParser.MFA.Loaders.Layer;
namespace DotNetCTFDumper.MMFParser.Decompiling namespace DotNetCTFDumper.MMFParser.Decompiling
{ {
@ -10,13 +17,14 @@ namespace DotNetCTFDumper.MMFParser.Decompiling
//mfa.MfaBuild = 4; //mfa.MfaBuild = 4;
//mfa.Product = (int) game.ProductVersion; //mfa.Product = (int) game.ProductVersion;
mfa.BuildVersion = 283; //mfa.BuildVersion = 283;
mfa.Name = game.Name; mfa.Name = game.Name;
mfa.LangId = 0;
mfa.Description = $"Decompiled with {Settings.DumperVersion}"; mfa.Description = $"Decompiled with {Settings.DumperVersion}";
mfa.Path = game.EditorFilename; mfa.Path = game.EditorFilename;
return;
//mfa.Stamp = wtf; //mfa.Stamp = wtf;
if (game.Fonts != null) mfa.Fonts = game.Fonts; /*if (game.Fonts != null) mfa.Fonts = game.Fonts;
mfa.Sounds = game.Sounds; mfa.Sounds = game.Sounds;
foreach (var item in mfa.Sounds.Items) foreach (var item in mfa.Sounds.Items)
@ -29,8 +37,8 @@ namespace DotNetCTFDumper.MMFParser.Decompiling
{ {
mfa.Images.Items[key].Debug = true; mfa.Images.Items[key].Debug = true;
} }
*/
mfa.Author = game.Author; mfa.Author = game.Author!=null? game.Author:"Kostya";
mfa.Copyright = game.Copyright; mfa.Copyright = game.Copyright;
mfa.Company = "CTFAN Team"; mfa.Company = "CTFAN Team";
mfa.Version = ""; mfa.Version = "";
@ -54,6 +62,43 @@ namespace DotNetCTFDumper.MMFParser.Decompiling
mfa.Aboutbox = game.AboutText?.Length > 0 mfa.Aboutbox = game.AboutText?.Length > 0
? game?.AboutText ? game?.AboutText
: "This game was decompiled with " + Settings.DumperVersion; : "This game was decompiled with " + Settings.DumperVersion;
mfa.Frames.Clear();
foreach (Frame gameFrame in game.Frames)
{
MFA.Loaders.Frame mfaFrame = new MFA.Loaders.Frame(null);
mfaFrame.Handle = game.Frames.IndexOf(gameFrame);
mfaFrame.Name = gameFrame.Name;
mfaFrame.SizeX = gameFrame.Width;
mfaFrame.SizeY = gameFrame.Height;
mfaFrame.Background = gameFrame.Background;
//TODO: Transitions
//TODO: Flags
mfaFrame.MaxObjects = gameFrame.Events?.MaxObjects ?? 1337;
mfaFrame.Password = gameFrame?.Password ?? "";
mfaFrame.LastViewedX = 320;
mfaFrame.LastViewedY = 240;
mfaFrame.Palette = gameFrame.Palette.Items;
mfaFrame.StampHandle = 12;
mfaFrame.ActiveLayer = 0;
mfaFrame.Layers = new List<Layer>();
mfaFrame.Layers.Add(new Layer(null){Name = "New Layer"});
/*foreach (EXE.Loaders.Layer gameLayer in gameFrame.Layers.Items)
{
Layer mfaLayer = new Layer(null);
mfaLayer.Name = gameLayer.Name;
mfaLayer.Flags = (int) gameLayer.Flags;
//TODO: Flags
mfaLayer.XCoefficient = gameLayer.XCoeff;
mfaLayer.YCoefficient = gameLayer.YCoeff;
mfaFrame.Layers.Add(mfaLayer);
}*/
mfaFrame.Events = MFA.MFA.emptyEvents;
mfaFrame.Chunks = MFA.MFA.emptyFrameChunks;
mfa.Frames.Add(mfaFrame);
}
} }

@ -2,6 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Security.AccessControl;
using System.Text; using System.Text;
using DotNetCTFDumper.MMFParser.EXE; using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.MMFParser.EXE.Loaders.Events; using DotNetCTFDumper.MMFParser.EXE.Loaders.Events;
@ -41,6 +42,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
public uint EventLine; public uint EventLine;
public uint EventLineY; public uint EventLineY;
public byte[] Saved; public byte[] Saved;
public int EditorDataUnk;
public Events(ByteReader reader) : base(reader) public Events(ByteReader reader) : base(reader)
{ {
@ -52,8 +54,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
public override void Read() public override void Read()
{ {
Saved = Reader.ReadBytes(92);
return;
Version = Reader.ReadUInt16(); Version = Reader.ReadUInt16();
FrameType = Reader.ReadUInt16(); FrameType = Reader.ReadUInt16();
Items = new List<EventGroup>(); Items = new List<EventGroup>();
@ -109,7 +110,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
} }
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);
@ -178,45 +179,42 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
public override void Write(ByteWriter Writer) public override void Write(ByteWriter Writer)
{ {
Writer.WriteBytes(Saved); //Writer.WriteBytes(Saved);
return; //return;
Writer.WriteUInt16(Version); using (ByteWriter debug = new ByteWriter(new MemoryStream()))
Writer.WriteInt16((short) FrameType);
Writer.WriteBytes(new byte[]{0x04,0x04,0x00,0x00});
if (Items != null)
{ {
Writer.WriteAscii(EventData);
ByteWriter newWriter = new ByteWriter(new MemoryStream()); //Writer = new ByteWriter(new MemoryStream());
foreach (EventGroup eventGroup in Items) Writer.WriteUInt16(Version);
{ Writer.WriteInt16((short) FrameType);
eventGroup.Write(newWriter);
}
Writer.WriteWriter(newWriter);
}
if (Comments != null)
{
Writer.WriteAscii(CommentData);
foreach (Comment comment in Comments)
{
comment.Write(Writer);
}
}
if (Objects != null) //Writer.WriteBytes(new byte[] {0x04, 0x04, 0x00, 0x00});
{ // if (Items != null)
Writer.WriteAscii(ObjectData); // {
Writer.WriteUInt32((uint) Objects.Count); // Console.WriteLine("Writing EventData");
foreach (EventObject eventObject in Objects) // Writer.WriteAscii(EventData);
{ //
eventObject.Write(Writer); // ByteWriter newWriter = new ByteWriter(new MemoryStream());
} // foreach (EventGroup eventGroup in Items)
} // {
Writer.WriteAscii(EventEditorData); // eventGroup.Write(newWriter);
Writer.Skip(4+2*2+4*3); // }
//
// 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) if (ObjectTypes != null)
{ {
Console.WriteLine("Writing ObjectTypes");
Writer.WriteAscii(ObjectListData); Writer.WriteAscii(ObjectListData);
Writer.WriteInt16(-1); Writer.WriteInt16(-1);
Writer.WriteInt16((short) ObjectTypes.Count); Writer.WriteInt16((short) ObjectTypes.Count);
@ -224,24 +222,26 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
{ {
Writer.WriteUInt16(objectType); Writer.WriteUInt16(objectType);
} }
foreach (ushort objectHandle in ObjectHandles) foreach (ushort objectHandle in ObjectHandles)
{ {
Writer.WriteUInt16(objectHandle); Writer.WriteUInt16(objectHandle);
} }
foreach (ushort objectFlag in ObjectFlags) foreach (ushort objectFlag in ObjectFlags)
{ {
Writer.WriteUInt16(objectFlag); Writer.WriteUInt16(objectFlag);
} }
Writer.WriteUInt16((ushort) Folders.Count); Writer.WriteUInt16((ushort) Folders.Count);
foreach (string folder in Folders) foreach (string folder in Folders)
{ {
Writer.AutoWriteUnicode(folder); Writer.AutoWriteUnicode(folder);
} }
} }
if (X != 0) if (X != 0)
{ {
Console.WriteLine("Writing X");
Writer.WriteAscii(EditorPositionData); Writer.WriteAscii(EditorPositionData);
Writer.WriteInt16(1); Writer.WriteInt16(1);
Writer.WriteInt32((int) X); Writer.WriteInt32((int) X);
@ -250,9 +250,9 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
Writer.WriteUInt32(CaretX); Writer.WriteUInt32(CaretX);
Writer.WriteUInt32(CaretY); Writer.WriteUInt32(CaretY);
} }
if (LineY != 0) if (LineY != 0)
{ {
Console.WriteLine("Writing LineY");
Writer.WriteAscii(EditorLineData); Writer.WriteAscii(EditorLineData);
Writer.WriteInt16(1); Writer.WriteInt16(1);
Writer.WriteUInt32(LineY); Writer.WriteUInt32(LineY);
@ -260,9 +260,49 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
Writer.WriteUInt32(EventLine); Writer.WriteUInt32(EventLine);
Writer.WriteUInt32(EventLineY); Writer.WriteUInt32(EventLineY);
} }
Console.WriteLine("Writing EventEditorData");
Writer.WriteAscii(EventEditorData);
Writer.WriteInt32(EditorDataUnk);
Writer.WriteInt16((short) ConditionWidth);
Writer.WriteInt16((short) ObjectHeight);
Writer.Skip(12);
//Writer.Skip((4 + 2 * 2 + 4 * 3)-4);
Writer.WriteAscii(EventEnd); Writer.WriteAscii(EventEnd);
//TODO: Fix commented part
//
//
// if (Comments != null)
// {
// Console.WriteLine("Writing Comments");
// Writer.WriteAscii(CommentData);
// foreach (Comment comment in Comments)
// {
// comment.Write(Writer);
// }
// }
var data = ((MemoryStream) Writer.BaseStream).GetBuffer();
Array.Resize(ref data,(int) Writer.Size());
File.WriteAllBytes("MyEvents.bin",data);
}

@ -13,12 +13,12 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
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 uint Flags; public uint Flags;
public string Password; public string Password;
public List<Color> Palette; public List<Color> Palette;
@ -33,6 +33,8 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
} }
public override void Write(ByteWriter Writer) public override void Write(ByteWriter Writer)
{ {
Writer.WriteInt32(Handle); Writer.WriteInt32(Handle);
@ -74,14 +76,17 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
{ {
item.Write(Writer); item.Write(Writer);
} }
if (Instances != null)
{
Writer.WriteInt32(Instances.Count); Writer.WriteInt32(Instances.Count);
foreach (var item in Instances) foreach (var item in Instances)
{ {
item.Write(Writer); item.Write(Writer);
} }
Console.WriteLine("BeforeEventsPos: "+Writer.Tell()); }
Events.Write(Writer); Events.Write(Writer);
Console.WriteLine("AfterEventsPos: "+Writer.Tell());
Chunks.Write(Writer); Chunks.Write(Writer);
@ -151,17 +156,21 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
} }
Instances = new List<FrameInstance>(); Instances = new List<FrameInstance>();
var instancesCount = 0;//Reader.ReadInt32(); var instancesCount = Reader.ReadInt32();
for (int i = 0; i < instancesCount; i++) for (int i = 0; i < instancesCount; i++)
{ {
var inst = new FrameInstance(Reader); var inst = new FrameInstance(Reader);
//inst.Read(); inst.Read();
Instances.Add(inst); Instances.Add(inst);
} }
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 = new ChunkList(Reader);
Chunks.Read(); Chunks.Read();
MFA.emptyEvents = Events;
MFA.emptyFrameChunks = Chunks;

@ -14,7 +14,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
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()
{ {

@ -115,6 +115,9 @@ namespace DotNetCTFDumper.MMFParser.MFA
public List<Frame> Frames; public List<Frame> Frames;
public ChunkList Chunks; public ChunkList Chunks;
public static Events emptyEvents;
public static ChunkList emptyFrameChunks;
public override void Print() public override void Print()
{ {
@ -162,7 +165,7 @@ namespace DotNetCTFDumper.MMFParser.MFA
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);

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

@ -24,8 +24,8 @@ namespace DotNetCTFDumper
var handle = Helper.GetConsoleWindow(); var handle = Helper.GetConsoleWindow();
Helper.ShowWindow(handle, Helper.SW_HIDE); Helper.ShowWindow(handle, Helper.SW_HIDE);
InitNativeLibrary(); InitNativeLibrary();
MFAGenerator.ReadTestMFA(); //MFAGenerator.ReadTestMFA();
Environment.Exit(0); //Environment.Exit(0);
var path = ""; var path = "";
var verbose = false; var verbose = false;

@ -31,6 +31,7 @@ namespace DotNetCTFDumper.Utils
return false; return false;
} }
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());

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

@ -98,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)

Loading…
Cancel
Save