Fixes in Pame2MFA

master
1987kostya 4 years ago
parent 6eedbc24b5
commit a6c65e0986

@ -138,7 +138,7 @@ namespace DotNetCTFDumper.GUI
private void StartReading() private void StartReading()
{ {
var path = openFileDialog1.FileName; var path = openFileDialog1.FileName;
loadingLabel.Visible = true; //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;

@ -15,7 +15,7 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Banks
public bool SaveImages = false; 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 bool PreloadOnly=false;
public ImageBank(ByteReader reader) : base(reader) public ImageBank(ByteReader reader) : base(reader)
{ {
@ -355,6 +355,7 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Banks
chunk.WriteInt32(_checksum); chunk.WriteInt32(_checksum);
chunk.WriteInt32(_references); chunk.WriteInt32(_references);
byte[] compressedImg = null; byte[] compressedImg = null;
Flags["LZX"] = true;
if (Flags["LZX"]) if (Flags["LZX"])
{ {
compressedImg = Decompressor.compress_block(rawImg); compressedImg = Decompressor.compress_block(rawImg);
@ -362,7 +363,7 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Banks
} }
else else
{ {
chunk.WriteUInt32((uint) rawImg.Length); chunk?.WriteUInt32((uint) (rawImg?.Length??0));
} }
chunk.WriteInt16((short) _width); chunk.WriteInt16((short) _width);

@ -185,8 +185,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.WriteUInt8( (sbyte) Conditions.Count); newWriter.WriteInt8( NumberOfConditions);
newWriter.WriteUInt8((sbyte) Actions.Count); newWriter.WriteInt8(NumberOfActions);
newWriter.WriteUInt16(Flags); newWriter.WriteUInt16(Flags);
if (Settings.Build >= 284) if (Settings.Build >= 284)
{ {

@ -427,7 +427,7 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders
public override void Read() public override void Read()
{ {
Items = new List<Color>(); Items = new List<Color>();
for (int i = 0; i < 256; i++) for (int i = 0; i < 257; i++)
{ {
Items.Add(Reader.ReadColor()); Items.Add(Reader.ReadColor());
} }

@ -14,8 +14,8 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Objects
private ushort _movementsOffset; private ushort _movementsOffset;
private short _animationsOffset; private short _animationsOffset;
private short _systemObjectOffset; private short _systemObjectOffset;
private short _counterOffset; public short CounterOffset;
private short _extensionOffset; public short ExtensionOffset;
public Animations Animations; public Animations Animations;
private long _end; private long _end;
@ -114,7 +114,7 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Objects
_animationsOffset = Reader.ReadInt16(); _animationsOffset = Reader.ReadInt16();
} }
short version = Reader.ReadInt16(); short version = Reader.ReadInt16();
_counterOffset = (short) Reader.ReadUInt16(); CounterOffset = (short) Reader.ReadUInt16();
_systemObjectOffset = (short) Reader.ReadUInt16(); _systemObjectOffset = (short) Reader.ReadUInt16();
Flags.flag = Reader.ReadUInt32(); Flags.flag = Reader.ReadUInt32();
@ -127,7 +127,7 @@ namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Objects
} }
else else
{ {
_extensionOffset = Reader.ReadInt16(); ExtensionOffset = Reader.ReadInt16();
} }
_valuesOffset = Reader.ReadInt16(); _valuesOffset = Reader.ReadInt16();

@ -43,6 +43,9 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
public uint EventLineY; public uint EventLineY;
public byte[] Saved; public byte[] Saved;
public int EditorDataUnk; public int EditorDataUnk;
public uint EventDataLen;
public uint CommentDataLen;
private byte[] _cache;
public Events(ByteReader reader) : base(reader) public Events(ByteReader reader) : base(reader)
{ {
@ -63,10 +66,11 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
{ {
string name = Reader.ReadAscii(4); string name = Reader.ReadAscii(4);
Console.WriteLine(name);
if (name == EventData) if (name == EventData)
{ {
uint size = Reader.ReadUInt32(); EventDataLen = Reader.ReadUInt32();
uint end = (uint) (Reader.Tell() + size); uint end = (uint) (Reader.Tell() + EventDataLen);
while (true) while (true)
{ {
EventGroup evGrp = new EventGroup(Reader); EventGroup evGrp = new EventGroup(Reader);
@ -79,7 +83,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
{ {
try try
{ {
uint len = Reader.ReadUInt32(); CommentDataLen = Reader.ReadUInt32();
Comments = new List<Comment>(); Comments = new List<Comment>();
Comment comment = new Comment(Reader); Comment comment = new Comment(Reader);
comment.Read(); comment.Read();
@ -170,7 +174,11 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
EventLine = Reader.ReadUInt32(); EventLine = Reader.ReadUInt32();
EventLineY = Reader.ReadUInt32(); EventLineY = Reader.ReadUInt32();
} }
else if (name == EventEnd) break; else if (name == EventEnd)
{
_cache = Reader.ReadBytes(122);
break;
}
else throw new NotImplementedException("Fuck Something is Broken"); else throw new NotImplementedException("Fuck Something is Broken");
} }
@ -178,34 +186,35 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
public override void Write(ByteWriter Writer) public override void Write(ByteWriter Writer)
{ {
Writer.WriteUInt16(Version); Writer.WriteUInt16(Version);
Writer.WriteInt16((short) FrameType); Writer.WriteUInt16(FrameType);
if (Items != null) if (Items.Count>0)
{ {
/*Console.WriteLine("Writing EventData"); Console.WriteLine("Writing EventData");
Writer.WriteAscii(EventData); Writer.WriteAscii(EventData);
ByteWriter newWriter = new ByteWriter(new MemoryStream()); ByteWriter newWriter = new ByteWriter(new MemoryStream());
Writer.WriteUInt32(EventDataLen);
foreach (EventGroup eventGroup in Items) foreach (EventGroup eventGroup in Items)
{ {
eventGroup.Write(newWriter); eventGroup.Write(newWriter);
} }
Writer.WriteWriter(newWriter);*/ Writer.WriteWriter(newWriter);
} }
// if (Objects != null) if (Objects.Count>0)
// { {
// Console.WriteLine("Writing EventObjects"); Console.WriteLine("Writing EventObjects");
// Writer.WriteAscii(ObjectData); Writer.WriteAscii(ObjectData);
// Writer.WriteUInt32((uint) Objects.Count); Writer.WriteUInt32((uint) Objects.Count);
// foreach (EventObject eventObject in Objects) foreach (EventObject eventObject in Objects)
// { {
// eventObject.Write(Writer); eventObject.Write(Writer);
// } }
// } }
if (ObjectTypes != null) if (ObjectTypes != null)
{ {
@ -260,10 +269,10 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
Writer.Skip(12); Writer.Skip(12);
//Writer.Skip((4 + 2 * 2 + 4 * 3)-4);
Writer.WriteAscii(EventEnd); Writer.WriteAscii(EventEnd);
Writer.WriteBytes(_cache);
//TODO: Fix commented part //TODO: Fix commented part
// //

@ -65,12 +65,13 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
Writer.AutoWriteUnicode(UnkString); Writer.AutoWriteUnicode(UnkString);
Writer.WriteInt32(LastViewedX); Writer.WriteInt32(LastViewedX);
Writer.WriteInt32(LastViewedY); Writer.WriteInt32(LastViewedY);
Writer.WriteInt32(Palette.Count); //Writer.WriteInt32(Palette.Count);//WTF HELP
Palette[0] = Color.FromArgb(0, 0, 1, 0);
foreach (var item in Palette) foreach (var item in Palette)
{ {
Writer.WriteColor(item); Writer.WriteColor(item);
} }
Writer.WriteInt32(StampHandle); Writer.WriteInt32(StampHandle);
Writer.WriteInt32(ActiveLayer); Writer.WriteInt32(ActiveLayer);
Writer.WriteInt32(Layers.Count); Writer.WriteInt32(Layers.Count);
@ -78,7 +79,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
{ {
layer.Write(Writer); layer.Write(Writer);
} }
if (FadeIn != null) if (FadeIn != null)
{ {
Writer.WriteInt8(1); Writer.WriteInt8(1);
@ -92,25 +93,22 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
FadeOut.Write(Writer); FadeOut.Write(Writer);
} }
else Writer.Skip(1); else Writer.Skip(1);
Writer.WriteInt32(Items.Count); Writer.WriteInt32(Items.Count);
foreach (var item in Items) foreach (var item in Items)
{ {
item.Write(Writer); item.Write(Writer);
//Writer.Skip(4);
var bytes = new byte[] {0x01,0x01,0x00,0x00, 0x00,0x00,0x00,0x00, 0x80,0x01,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x32,0x00, 0x00,0x00,0x32,0x00, 0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00}; var bytes = new byte[] {0x01,0x01,0x00,0x00, 0x00,0x00,0x00,0x00, 0x80,0x01,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x32,0x00, 0x00,0x00,0x32,0x00, 0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00};
//Writer.WriteBytes(bytes);
//wtf help
} }
// Writer.WriteAscii("AA");
Writer.WriteInt32(Folders.Count); Writer.WriteInt32(Folders.Count);
foreach (var item in Folders) foreach (var item in Folders)
{ {
item.Write(Writer); item.Write(Writer);
} }
// Writer.WriteAscii("AF"); // Writer.WriteAscii("AA");
Writer.WriteInt32(Instances.Count); Writer.WriteInt32(Instances.Count);
foreach (var item in Instances) foreach (var item in Instances)
{ {
@ -130,6 +128,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
}*/ }*/
Events.Write(Writer); Events.Write(Writer);
Chunks.Write(Writer); Chunks.Write(Writer);
} }
@ -154,9 +153,9 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
LastViewedX = Reader.ReadInt32(); LastViewedX = Reader.ReadInt32();
LastViewedY = Reader.ReadInt32(); LastViewedY = Reader.ReadInt32();
var paletteSize = Reader.ReadInt32(); //var paletteSize = Reader.ReadInt32();
Palette = new List<Color>(); Palette = new List<Color>();
for (int i = 0; i < paletteSize; i++) for (int i = 0; i < 257; i++)
{ {
Palette.Add(Reader.ReadColor()); Palette.Add(Reader.ReadColor());
} }
@ -190,6 +189,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
{ {
var frameitem = new FrameItem(Reader); var frameitem = new FrameItem(Reader);
frameitem.Read(); frameitem.Read();
Items.Add(frameitem); Items.Add(frameitem);
} }

@ -34,9 +34,10 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
Writer.WriteInt32(Flags); Writer.WriteInt32(Flags);
Writer.WriteInt32(1); Writer.WriteInt32(1);
Writer.WriteInt32(IconHandle); Writer.WriteInt32(IconHandle);
Chunks.Write(Writer); Chunks.Write(Writer);
Loader.Write(Writer); Loader.Write(Writer);
} }
@ -71,6 +72,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
} }
Chunks = new ChunkList(Reader); Chunks = new ChunkList(Reader);
Chunks.Read(); Chunks.Read();
if (MFA.defaultObjChunks == null) MFA.defaultObjChunks = Chunks;
if(ObjectType>=32)//extension base if(ObjectType>=32)//extension base
{ {
//TODO: Nonactives //TODO: Nonactives

@ -8,7 +8,7 @@ using static DotNetCTFDumper.MMFParser.EXE.ChunkList;
namespace DotNetCTFDumper.MMFParser.MFA.Loaders namespace DotNetCTFDumper.MMFParser.MFA.Loaders
{ {
public class AgmiBank : DataLoader public class AGMIBank : DataLoader
{ {
private int GraphicMode; private int GraphicMode;
private int PaletteVersion; private int PaletteVersion;
@ -54,6 +54,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
public override void Write(ByteWriter writer) public override void Write(ByteWriter writer)
{ {
Logger.Log("TEX WRITE");
writer.WriteInt32(GraphicMode); writer.WriteInt32(GraphicMode);
writer.WriteInt16((short) PaletteVersion); writer.WriteInt16((short) PaletteVersion);
writer.WriteInt16((short) PaletteEntries); writer.WriteInt16((short) PaletteEntries);
@ -70,11 +71,11 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
} }
} }
public AgmiBank(ByteReader reader) : base(reader) public AGMIBank(ByteReader reader) : base(reader)
{ {
} }
public AgmiBank(Chunk chunk) : base(chunk) public AGMIBank(Chunk chunk) : base(chunk)
{ {
} }
} }

@ -46,19 +46,21 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
if (Name == null) if (Name == null)
{ {
Writer.WriteInt32(0x70000005); Writer.WriteInt32(0x70000005);
Writer.WriteInt32(3);
} }
else else
{ {
Writer.WriteInt32(0x70000004); Writer.WriteInt32(0x70000004);
Writer.AutoWriteUnicode(Name); Writer.AutoWriteUnicode(Name);
Writer.WriteInt32(Items.Count); Writer.WriteInt32(Items.Count);
foreach (var item in Items)
{
Writer.WriteUInt32(item);
}
} }
foreach (var item in Items)
{
Writer.WriteUInt32(item);
}
} }

@ -26,7 +26,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
public override void Write(ByteWriter Writer) public override void Write(ByteWriter Writer)
{ {
Writer.AutoWriteUnicode(Name); Writer.AutoWriteUnicode("");
Writer.WriteInt32((int) Flags.flag); Writer.WriteInt32((int) Flags.flag);
Writer.WriteSingle(XCoefficient); Writer.WriteSingle(XCoefficient);
Writer.WriteSingle(YCoefficient); Writer.WriteSingle(YCoefficient);

@ -12,6 +12,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
public override void Read() public override void Read()
{ {
base.Read(); base.Read();
if(Reader.ReadByte()!=0) if(Reader.ReadByte()!=0)
{ {
var animationCount = Reader.ReadUInt32(); var animationCount = Reader.ReadUInt32();
@ -41,7 +42,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
public class Animation : DataLoader public class Animation : DataLoader
{ {
public string Name = "Animation-UNKNOWN"; public string Name = "";
public List<AnimationDirection> Directions; public List<AnimationDirection> Directions;
public override void Write(ByteWriter Writer) public override void Write(ByteWriter Writer)

@ -10,6 +10,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
List<Behaviour> _items = new List<Behaviour>(); List<Behaviour> _items = new List<Behaviour>();
public override void Write(ByteWriter Writer) public override void Write(ByteWriter Writer)
{ {
Writer.WriteInt32(_items.Count);
foreach (Behaviour behaviour in _items) foreach (Behaviour behaviour in _items)
{ {
behaviour.Write(Writer); behaviour.Write(Writer);

@ -44,19 +44,18 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
{ {
public string Name="ERROR"; public string Name="ERROR";
public string Extension; public string Extension;
public int Identifier; public uint Identifier;
public short Player; public short Player;
public short Type; public short Type;
public byte MovingAtStart=1; public byte MovingAtStart=1;
public int DirectionAtStart; public int DirectionAtStart;
public int DataSize; public int DataSize;
public byte[] extData=new byte[0]; public byte[] extData=new byte[14];
public override void Write(ByteWriter Writer) public override void Write(ByteWriter Writer)
{ {
Writer.AutoWriteUnicode(Name); Writer.AutoWriteUnicode(Name);
Writer.AutoWriteUnicode(Extension); Writer.AutoWriteUnicode(Extension);
Writer.WriteInt32(Identifier); Writer.WriteUInt32(Identifier);
//
var newWriter = new ByteWriter(new MemoryStream()); var newWriter = new ByteWriter(new MemoryStream());
if (Extension.Length==0) if (Extension.Length==0)
{ {
@ -66,9 +65,10 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
newWriter.WriteInt8(MovingAtStart); newWriter.WriteInt8(MovingAtStart);
newWriter.Skip(3); newWriter.Skip(3);
newWriter.WriteInt32(DirectionAtStart); newWriter.WriteInt32(DirectionAtStart);
//newWriter.WriteBytes(extData); newWriter.WriteBytes(extData);
} }
//write loader //write loader
Writer.WriteInt32((int) newWriter.Size());
Writer.WriteWriter(newWriter); Writer.WriteWriter(newWriter);
@ -81,9 +81,9 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
public override void Read() public override void Read()
{ {
Name = Helper.AutoReadUnicode(Reader); Name = Reader.AutoReadUnicode();
Extension = Helper.AutoReadUnicode(Reader); Extension = Reader.AutoReadUnicode();
Identifier = (int) Reader.ReadUInt32(); Identifier = Reader.ReadUInt32();
DataSize = (int) Reader.ReadUInt32(); DataSize = (int) Reader.ReadUInt32();
if(Extension.Length>0) if(Extension.Length>0)
{ {

@ -23,20 +23,24 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders.mfachunks
Writer.WriteInt32(NewObjectFlags); Writer.WriteInt32(NewObjectFlags);
Writer.WriteColor(BackgroundColor); Writer.WriteColor(BackgroundColor);
for (int i = 0; i < 9; i++) /*for (int i = 0; i < 9; i++)
{ {
try try
{ {
//var value = _qualifiers[i]; var value = _qualifiers[i];
Writer.WriteInt16(-1); Writer.WriteInt16(-1);
break;
} }
catch catch
{ {
Writer.WriteInt16(-1);
break; break;
} }
}*/
for (int i = 0; i < 9; i++)
{
Writer.WriteInt16(-1);//WTF HELP
} }
Values.Write(Writer); Values.Write(Writer);

@ -24,7 +24,7 @@ namespace DotNetCTFDumper.MMFParser.MFA
public int MfaBuild; public int MfaBuild;
public int Product; public int Product;
public int BuildVersion; public int BuildVersion;
public int LangId; public int LangId=32;
public string Name; public string Name;
public string Description; public string Description;
@ -35,8 +35,8 @@ namespace DotNetCTFDumper.MMFParser.MFA
public FontBank Fonts; public FontBank Fonts;
public SoundBank Sounds; public SoundBank Sounds;
public MusicBank Music; public MusicBank Music;
public AgmiBank Icons; public AGMIBank Icons;
public AgmiBank Images; public AGMIBank Images;
public string Author; public string Author;
@ -118,6 +118,8 @@ namespace DotNetCTFDumper.MMFParser.MFA
public static Events emptyEvents; public static Events emptyEvents;
public static ChunkList emptyFrameChunks; public static ChunkList emptyFrameChunks;
public static ChunkList defaultObjChunks;
public override void Print() public override void Print()
@ -192,7 +194,6 @@ namespace DotNetCTFDumper.MMFParser.MFA
Controls.Write(Writer); Controls.Write(Writer);
if (Menu != null) if (Menu != null)
{ {
using (ByteWriter menuWriter = new ByteWriter(new MemoryStream())) using (ByteWriter menuWriter = new ByteWriter(new MemoryStream()))
@ -244,16 +245,16 @@ namespace DotNetCTFDumper.MMFParser.MFA
} }
Writer.WriteInt32(Frames.Count); //frame Writer.WriteInt32(Frames.Count); //frame
var startPos = Writer.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)
{ {
Pame2Mfa.Message("Writing Frame"); Pame2Mfa.Message("Writing Frame");
Writer.WriteUInt32((uint) (startPos+newWriter.Tell()+4)); Writer.WriteUInt32((uint) (startPos+newWriter.Tell()));
frame.Write(newWriter); frame.Write(newWriter);
} }
Writer.WriteUInt32((uint) (startPos+newWriter.Tell()+4)); Writer.WriteUInt32((uint) (startPos+newWriter.Tell()));
Writer.WriteWriter(newWriter); Writer.WriteWriter(newWriter);
Chunks.Write(Writer); Chunks.Write(Writer);
Console.WriteLine("Writing done"); Console.WriteLine("Writing done");
@ -290,11 +291,11 @@ namespace DotNetCTFDumper.MMFParser.MFA
Music.Read(); Music.Read();
if (Reader.ReadAscii(4) != "AGMI") throw new Exception("Invalid Icon Bank"); if (Reader.ReadAscii(4) != "AGMI") throw new Exception("Invalid Icon Bank");
Icons = new AgmiBank(Reader); Icons = new AGMIBank(Reader);
Icons.Read(); Icons.Read();
if (Reader.ReadAscii(4) != "AGMI") throw new Exception("Invalid Image Bank"); if (Reader.ReadAscii(4) != "AGMI") throw new Exception("Invalid Image Bank");
Images = new AgmiBank(Reader); Images = new AGMIBank(Reader);
Images.Read(); Images.Read();
Helper.CheckPattern(Helper.AutoReadUnicode(Reader), Name); Helper.CheckPattern(Helper.AutoReadUnicode(Reader), Name);

@ -8,7 +8,7 @@ namespace DotNetCTFDumper.MMFParser.Translation
public static class MFAGenerator public static class MFAGenerator
{ {
// public static readonly string TemplatePath = @"C:\Users\MED45\Downloads\OneObjOneFrame.mfa"; // public static readonly string TemplatePath = @"C:\Users\MED45\Downloads\OneObjOneFrame.mfa";
public static readonly string TemplatePath = @"C:\Users\ivani\Downloads\OneObjOneFrame.mfa"; public static readonly string TemplatePath = @"C:\Users\ivani\Desktop\CTFResearch\OneObjOneFrame.mfa";
public static MFA.MFA BuildMFA() public static MFA.MFA BuildMFA()
{ {
@ -22,7 +22,7 @@ namespace DotNetCTFDumper.MMFParser.Translation
var mfaWriter = var mfaWriter =
new ByteWriter( new ByteWriter(
Settings.GameName.Length > 0 ? $"{Settings.DumpPath}\\{Exe.Instance.GameData.Name}.mfa" : "out.mfa", Settings.GameName.Length > 0 ? $"{Settings.DumpPath}\\{Exe.Instance.GameData.Name}-decompiled.mfa" : "out.mfa",
FileMode.Create); //New writer for new MFA FileMode.Create); //New writer for new MFA
Pame2Mfa.Message(""); Pame2Mfa.Message("");
Pame2Mfa.Message("Writing MFA"); Pame2Mfa.Message("Writing MFA");
@ -36,7 +36,7 @@ namespace DotNetCTFDumper.MMFParser.Translation
public static void ReadTestMFA() public static void ReadTestMFA()
{ {
var output_path = Path.Combine(Path.GetDirectoryName(TemplatePath), "decompiled.mfa"); var outputPath = Path.Combine(Path.GetDirectoryName(TemplatePath), "decompiled.mfa");
var mfaReader = new ByteReader(TemplatePath, FileMode.Open); var mfaReader = new ByteReader(TemplatePath, FileMode.Open);
var template = new MFA.MFA(mfaReader); var template = new MFA.MFA(mfaReader);
Settings.DoMFA = true; Settings.DoMFA = true;
@ -45,7 +45,7 @@ namespace DotNetCTFDumper.MMFParser.Translation
//Add modifications //Add modifications
var mfaWriter = new ByteWriter(output_path, FileMode.Create); var mfaWriter = new ByteWriter(outputPath, FileMode.Create);
template.Write(mfaWriter); template.Write(mfaWriter);
} }
} }

@ -33,8 +33,8 @@ namespace DotNetCTFDumper.MMFParser.Translation
//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.LangId = 8192;
mfa.Description = $"Decompiled with {Settings.DumperVersion}"; mfa.Description = "";
mfa.Path = game.EditorFilename; mfa.Path = game.EditorFilename;
//mfa.Stamp = wtf; //mfa.Stamp = wtf;
@ -47,14 +47,14 @@ namespace DotNetCTFDumper.MMFParser.Translation
//} //}
mfa.Music = game.Music; mfa.Music = game.Music;
mfa.Images.Items = game.Images.Images; mfa.Images.Items = game.Images.Images;
// foreach (var key in mfa.Images.Items.Keys) foreach (var key in mfa.Images.Items.Keys)
// { {
// mfa.Images.Items[key].Debug = true; mfa.Images.Items[key].Debug = true;
// } }
mfa.Author = game.Author ?? "Kostya"; mfa.Author = game.Author ?? "";
mfa.Copyright = game.Copyright ??"CTFAN Team"; mfa.Copyright = game.Copyright ??"";
mfa.Company = "CTFAN Team"; mfa.Company = "";
mfa.Version = ""; mfa.Version = "";
//TODO:Binary Files //TODO:Binary Files
var displaySettings = mfa.DisplayFlags; var displaySettings = mfa.DisplayFlags;
@ -75,7 +75,7 @@ namespace DotNetCTFDumper.MMFParser.Translation
mfa.CommandLine = ""; mfa.CommandLine = "";
mfa.Aboutbox = game.AboutText?.Length > 0 mfa.Aboutbox = game.AboutText?.Length > 0
? game?.AboutText ? game?.AboutText
: "This game was decompiled with " + Settings.DumperVersion; : "";
//Object Section //Object Section
FrameItems = new Dictionary<int,FrameItem>(); FrameItems = new Dictionary<int,FrameItem>();
@ -83,110 +83,100 @@ namespace DotNetCTFDumper.MMFParser.Translation
{ {
var key = game.Frameitems.ItemDict.Keys.ToArray()[i]; var key = game.Frameitems.ItemDict.Keys.ToArray()[i];
var item = game.Frameitems.ItemDict[key]; var item = game.Frameitems.ItemDict[key];
if (item.ObjectType == 2) if (item.ObjectType != 2) continue;
var newItem = new FrameItem(null);
newItem.Name = item.Name;
newItem.ObjectType = item.ObjectType;
newItem.Handle = item.Handle;
newItem.Transparent = item.Transparent ? 1:0;
newItem.InkEffect = item.InkEffect;
newItem.InkEffectParameter = item.InkEffectValue;
newItem.AntiAliasing = item.Antialias ? 1 : 0;
newItem.Flags = (int) item.Flags; //32 TODO:Fix this
newItem.IconHandle = 12;
newItem.Chunks = new ChunkList(null);
var itemLoader = (ObjectCommon)item.Properties.Loader;
//Only actives
//TODO:Other types of objects
var newLoader = new Active(null);
newLoader.ObjectFlags = (int) itemLoader.Flags.flag;//820
newLoader.NewObjectFlags = (int) itemLoader.NewFlags.flag;//8
newLoader.BackgroundColor = Color.FromArgb(0x0, 0xff, 0xff, 0xff);
//newLoader.Qualifiers;
newLoader.Strings = ConvertStrings(itemLoader.Strings);
newLoader.Values = ConvertValue(itemLoader.Values);
newLoader.Movements=new MFA.Loaders.mfachunks.Movements(null);
for (int j = 0; j < itemLoader.Movements.Items.Count; j++)
{ {
var mov = itemLoader.Movements.Items[j];
var newMov = new Movement(null);
newMov.Name = $"Movement #{j}";
newMov.Extension = "";
newMov.Identifier = (uint) mov.Type;
newMov.Player = mov.Player;
newMov.MovingAtStart = mov.MovingAtStart;
newMov.DirectionAtStart = mov.DirectionAtStart;
newLoader.Movements.Items.Add(newMov);
}
newLoader.Behaviours=new Behaviours(null);
//TODO: Transitions
if (itemLoader.Animations != null)
{
var animHeader = itemLoader.Animations;
for (int j = 0; j < animHeader.AnimationDict.Count; j++)
{
var newAnimation = new Animation(null);
var newDirections = new List<AnimationDirection>();
EXE.Loaders.Objects.Animation animation = null;
try
{
if (animHeader.AnimationDict.ContainsKey(j)) animation = animHeader.AnimationDict[j];
else break;
}
var newItem = new FrameItem(null); catch (Exception e)
newItem.Name = item.Name;
newItem.ObjectType = item.ObjectType;
newItem.Handle = item.Handle;
newItem.Transparent = item.Transparent ? 1:0;
newItem.InkEffect = item.InkEffect;
newItem.InkEffectParameter = item.InkEffectValue;
newItem.AntiAliasing = item.Antialias ? 1 : 0;
newItem.Flags = (int) item.Flags;
newItem.IconHandle = 10;
newItem.Chunks=new ChunkList(null);
var itemLoader = (ObjectCommon)item.Properties.Loader;
//Only actives
//TODO:Other types of objects
var newLoader = new Active(null);
newLoader.ObjectFlags = (int) itemLoader.Flags.flag;
newLoader.NewObjectFlags = (int) itemLoader.NewFlags.flag;
newLoader.BackgroundColor = Color.FromArgb(itemLoader.BackColor.R,itemLoader.BackColor.G,itemLoader.BackColor.B);
//newLoader.Qualifiers;
newLoader.Strings = ConvertStrings(itemLoader.Strings);
newLoader.Values = ConvertValue(itemLoader.Values);
newLoader.Movements=new MFA.Loaders.mfachunks.Movements(null);
for (int j = 0; j < itemLoader.Movements.Items.Count; j++)
{
var mov = itemLoader.Movements.Items[j];
var newMov = new Movement(null);
newMov.Name = $"Movement {j+1}";
newMov.Extension = "";
newMov.Identifier = mov.Type;
newMov.Player = mov.Player;
newMov.MovingAtStart = mov.MovingAtStart;
newMov.DirectionAtStart = mov.DirectionAtStart;
newLoader.Movements.Items.Add(newMov);
}
newLoader.Behaviours=new Behaviours(null);
//TODO: Transitions
if (itemLoader.Animations != null)
{
var animHeader = itemLoader.Animations;
for (int j = 0; j < animHeader.AnimationDict.Count; j++)
{ {
Console.WriteLine(e);
//throw;
}
var newAnimation = new Animation(null); if (animation != null)
var newDirections = new List<AnimationDirection>(); {
EXE.Loaders.Objects.Animation animation = null; for (int n = 0; n < 1; n++)
try
{
animation = animHeader.AnimationDict[0];
}
catch (Exception e)
{ {
Console.WriteLine(e); var direction = animation.DirectionDict.ToArray()[n].Value;
//throw; var newDirection = new AnimationDirection(null);
newDirection.MinSpeed = direction.MinSpeed;
newDirection.MaxSpeed = direction.MaxSpeed;
newDirection.Index = n;
newDirection.Repeat = direction.Repeat;
newDirection.BackTo = direction.BackTo;
newDirection.Frames = direction.Frames;
newDirections.Add(newDirection);
} }
if (animation != null) newAnimation.Directions = newDirections;
{
for (int n = 0; n < 1; n++)
{
var direction = animation.DirectionDict.ToArray()[n].Value;
var newDirection = new AnimationDirection(null);
newDirection.MinSpeed = direction.MinSpeed;
newDirection.MaxSpeed = direction.MaxSpeed;
newDirection.Index = n;
newDirection.Repeat = direction.Repeat;
newDirection.BackTo = direction.BackTo;
newDirection.Frames = direction.Frames;
newDirections.Add(newDirection);
}
newAnimation.Directions = newDirections;
}
newLoader.Items.Add(newAnimation);
} }
}
newItem.Loader = newLoader; newLoader.Items.Add(newAnimation);
try
{
FrameItems.Add(newItem.Handle,newItem);
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
} }
} }
newItem.Loader = newLoader;
FrameItems.Add(newItem.Handle,newItem);
} }
mfa.Frames.Clear(); mfa.Frames.Clear();
foreach (Frame frame in game.Frames) foreach (Frame frame in game.Frames)
{ {
//if(frame.Name!="what day")continue;
var newFrame = new MFA.Loaders.Frame(null); var newFrame = new MFA.Loaders.Frame(null);
//FrameInfo //FrameInfo
newFrame.Handle = game.Frames.IndexOf(frame); newFrame.Handle = game.Frames.IndexOf(frame);
@ -198,6 +188,7 @@ namespace DotNetCTFDumper.MMFParser.Translation
newFrame.FadeOut = frame.FadeOut!=null? ConvertTransition(frame.FadeOut):null; newFrame.FadeOut = frame.FadeOut!=null? ConvertTransition(frame.FadeOut):null;
var mfaFlags = newFrame.Flags; var mfaFlags = newFrame.Flags;
var originalFlags = frame.Flags; var originalFlags = frame.Flags;
mfaFlags["GrabDesktop"] = originalFlags["GrabDesktop"]; mfaFlags["GrabDesktop"] = originalFlags["GrabDesktop"];
mfaFlags["KeepDisplay"] = originalFlags["KeepDisplay"]; mfaFlags["KeepDisplay"] = originalFlags["KeepDisplay"];
mfaFlags["BackgroundCollisions"] = originalFlags["TotalCollisionMask"]; mfaFlags["BackgroundCollisions"] = originalFlags["TotalCollisionMask"];
@ -205,12 +196,14 @@ namespace DotNetCTFDumper.MMFParser.Translation
mfaFlags["ForceLoadOnCall"] = originalFlags["ForceLoadOnCall"]; mfaFlags["ForceLoadOnCall"] = originalFlags["ForceLoadOnCall"];
mfaFlags["NoDisplaySurface"] = false; mfaFlags["NoDisplaySurface"] = false;
mfaFlags["TimerBasedMovements"] = originalFlags["TimedMovements"]; mfaFlags["TimerBasedMovements"] = originalFlags["TimedMovements"];
newFrame.MaxObjects = frame.Events?.MaxObjects ?? 10000; newFrame.Flags = mfaFlags;
newFrame.Flags.flag = 260;
newFrame.MaxObjects = frame.Events?.MaxObjects ?? 1000;
newFrame.Password = ""; newFrame.Password = "";
newFrame.LastViewedX = 320; newFrame.LastViewedX = 320;
newFrame.LastViewedY = 240; newFrame.LastViewedY = 240;
newFrame.Palette = frame.Palette.Items; newFrame.Palette = frame.Palette.Items;
newFrame.StampHandle = 12; newFrame.StampHandle = 13;
newFrame.ActiveLayer = 0; newFrame.ActiveLayer = 0;
//LayerInfo //LayerInfo
newFrame.Layers=new List<Layer>(); newFrame.Layers=new List<Layer>();
@ -233,42 +226,41 @@ namespace DotNetCTFDumper.MMFParser.Translation
var newInstances = new List<FrameInstance>(); var newInstances = new List<FrameInstance>();
if (frame.Objects != null) if (frame.Objects != null)
{ {
for (int i = 0; i < frame.Objects.Items.Count; i++) for (int i = 0; i < frame.Objects.Items.Count; i++)
{ {
var instance = frame.Objects.Items[i]; var instance = frame.Objects.Items[i];
if (instance.FrameItem.ObjectType == 2) FrameItem frameItem;
if (FrameItems.ContainsKey(instance.ObjectInfo))
{ {
FrameItem frameItem = null; frameItem = FrameItems[instance.ObjectInfo];
try
{
frameItem = FrameItems[instance.ObjectInfo];
}
catch
{
throw new NotImplementedException("ObjectInfo not found, this may cause errors");
}
if (frameItem != null)
{
newFrameItems.Add(frameItem); newFrameItems.Add(frameItem);
var newInstance = new FrameInstance((ByteReader) null); var newInstance = new FrameInstance((ByteReader) null);
newInstance.X = instance.X; newInstance.X = instance.X;
newInstance.Y = instance.Y; newInstance.Y = instance.Y;
newInstance.Handle = instance.Handle; newInstance.Handle = i;
newInstance.Flags = 0; newInstance.Flags = 1;
newInstance.ParentType = (uint) instance.ParentType; newInstance.ParentType = (uint) instance.ParentType;
newInstance.ItemHandle = instance.ObjectInfo; newInstance.ItemHandle = (uint) (instance.ObjectInfo + 3);
newInstance.ParentHandle = (uint) instance.ParentHandle; newInstance.ParentHandle = (uint) instance.ParentHandle; //0xffffffff;
newInstance.Layer = (uint) instance.Layer; newInstance.Layer = (uint) instance.Layer;
newInstances.Add(newInstance); newInstances.Add(newInstance);
}
break;
} }
} }
} }
newFrame.Items = newFrameItems; newFrame.Items = newFrameItems;
newFrame.Instances = newInstances; newFrame.Instances = newInstances;
newFrame.Folders=new List<ItemFolder>(); newFrame.Folders=new List<ItemFolder>();
@ -284,25 +276,27 @@ namespace DotNetCTFDumper.MMFParser.Translation
newFrame.Events = MFA.MFA.emptyEvents; newFrame.Events = MFA.MFA.emptyEvents;
newFrame.Events.Version = 1028;
foreach (var item in newFrame.Items) foreach (var item in newFrame.Items)
{ {
var newObject = new EventObject((ByteReader) null); var newObject = new EventObject((ByteReader) null);
newObject.Handle = (uint) item.Handle; newObject.Handle = (uint) item.Handle;
newObject.Name = item.Name; newObject.Name = item.Name ??"";
newObject.TypeName = ""; newObject.TypeName = "";
newObject.ItemType = (ushort) item.ObjectType; newObject.ItemType = (ushort) item.ObjectType;
newObject.ObjectType = 1; newObject.ObjectType = 2;
newObject.Flags = 0; newObject.Flags = 0;
newObject.ItemHandle = (uint) item.Handle; newObject.ItemHandle = (uint) item.Handle;
newObject.InstanceHandle = 0xFFFFFFFF; newObject.InstanceHandle = 0xFFFFFFFF;
//newFrame.Events.Objects.Add(newObject); // newFrame.Events.Objects.Add(newObject);
} }
newFrame.Chunks = new ChunkList(null); newFrame.Chunks = new ChunkList(null);
mfa.Frames.Add(newFrame); mfa.Frames.Add(newFrame);
} }
@ -360,7 +354,7 @@ namespace DotNetCTFDumper.MMFParser.Translation
public static void Message(string msg) public static void Message(string msg)
{ {
OnMessage.Invoke(msg); OnMessage?.Invoke(msg);
} }

@ -86,6 +86,7 @@ namespace DotNetCTFDumper
var currentExe = new Exe(); var currentExe = new Exe();
Exe.Instance = currentExe; Exe.Instance = currentExe;
currentExe.ParseExe(exeReader); currentExe.ParseExe(exeReader);
MFAGenerator.BuildMFA();
Logger.Log("Finished!", true, ConsoleColor.Yellow); Logger.Log("Finished!", true, ConsoleColor.Yellow);
return; return;
if (File.Exists(path)) if (File.Exists(path))
@ -96,13 +97,7 @@ namespace DotNetCTFDumper
} }
else if (path.EndsWith(".mfa"))
{
Settings.DoMFA = true;
Logger.Log("Reading mfa");
Logger.Log("DEBUG ONLY");
MFAGenerator.ReadTestMFA();
}
else else
{ {
Logger.Log($"File '{path}' is not a valid file", true, ConsoleColor.Red); Logger.Log($"File '{path}' is not a valid file", true, ConsoleColor.Red);

@ -0,0 +1,17 @@
using System;
using DotNetCTFDumper.MMFParser.EXE;
using DotNetCTFDumper.PluginAPI;
namespace ExamplePlugin
{
public class ExamplePlugin:IPlugin
{
public object Activate(object input)
{
var data = (GameData) input;
PluginAPI.Message(data.TargetFilename);
return null;
}
}
}

@ -0,0 +1,56 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{9A4499BF-534F-4397-AF0D-C663688A20E5}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>ExamplePlugin</RootNamespace>
<AssemblyName>ExamplePlugin</AssemblyName>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="DotNetCTFDumper, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
<HintPath>..\DotNetCTFDumper\bin\x64\Debug\DotNetCTFDumper.exe</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Class1.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

@ -0,0 +1,37 @@
using System.Reflection;
using System.Runtime.InteropServices;
using DotNetCTFDumper.PluginAPI;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("ExamplePlugin")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("ExamplePlugin")]
[assembly: AssemblyCopyright("Copyright © 2020")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: CTFDumperPlugin("PathLogger",PluginIOType.GameData)]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("9A4499BF-534F-4397-AF0D-C663688A20E5")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -1,69 +0,0 @@
@ECHO OFF
rem # set .NET version and output folder name
set net="v4, C:\Windows\Microsoft.NET\Framework\v4.0.30319"
set output=Output
rem # process arguments
set ILMergeSolution=%1ILMerge\ILMerge.exe
rem # determine programm files of x86 for 32 and 64 Platform
IF EXIST "%PROGRAMFILES(x86)%" set prorgammFiles=%PROGRAMFILES(x86)%
IF NOT EXIST "%PROGRAMFILES(x86)%" set prorgammFiles=%PROGRAMFILES%
rem # if ILMerge.exe not in the $(SolutionDir)ILMerge\
rem # then try to use installed in prorgammFiles
IF EXIST %ILMergeSolution% set ILMerge="%ILMergeSolution%"
IF NOT EXIST %ILMergeSolution% set ILMerge=%prorgammFiles%\Microsoft\ILMerge\ILMerge.exe
set target_path=%2
set target_file=%~nx2
set target_dir=%~dp2
set ConfigurationName=%3
rem # set output path and result file path
set outdir=%target_dir%%output%
set result=%outdir%\%target_file%
rem # print info
@echo Start %ConfigurationName% Merging %target_file%.
@echo Target: %target_path%
@echo target_dir: %target_dir%
@echo Config: %ConfigurationName%
rem # recreate outdir
IF EXIST "%outdir%" rmdir /S /Q "%outdir%"
md "%outdir%"
rem # run merge cmd
@echo Merging: '"%ILMerge%" /wildcards /targetplatform:%net% /out:"%result%" %target_path% "%target_dir%*.dll"'
"%ILMerge%" /wildcards /targetplatform:%net% /out:"%result%" %target_path% "%target_dir%*.dll"
rem # if succeded
IF %ErrorLevel% EQU 0 (
rem # clear real output folder and put there result assembly
IF %ConfigurationName%==Release (
del %target_dir%*.*
del %target_dir%*.dll
del %target_dir%*.pdb
del %target_dir%*.xml
del %target_dir%*.*
copy %result% %target_dir%
rmdir /S /Q %outdir%
set result=%target_path%
@echo Result: %target_file% "-> %target_path%"
) ELSE (
@echo Result: %target_file% "-> %result%" )
set status=succeded
set errlvl=0
) ELSE (
set status=failed
set errlvl=1
)
@echo Merge %status%
exit %errlvl%
Loading…
Cancel
Save