Fixes in Pame2MFA

master
1987kostya 4 years ago
parent 6eedbc24b5
commit a6c65e0986

@ -138,7 +138,7 @@ namespace DotNetCTFDumper.GUI
private void StartReading()
{
var path = openFileDialog1.FileName;
loadingLabel.Visible = true;
//loadingLabel.Visible = true;
Program.ReadFile(path, Settings.Verbose, Settings.DumpImages, Settings.DumpSounds);
imageBar.Value = 0;

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

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

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

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

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

@ -65,7 +65,8 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
Writer.AutoWriteUnicode(UnkString);
Writer.WriteInt32(LastViewedX);
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)
{
Writer.WriteColor(item);
@ -93,24 +94,21 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
}
else Writer.Skip(1);
Writer.WriteInt32(Items.Count);
foreach (var item in Items)
{
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};
//Writer.WriteBytes(bytes);
//wtf help
}
// Writer.WriteAscii("AA");
Writer.WriteInt32(Folders.Count);
foreach (var item in Folders)
{
item.Write(Writer);
}
// Writer.WriteAscii("AF");
// Writer.WriteAscii("AA");
Writer.WriteInt32(Instances.Count);
foreach (var item in Instances)
{
@ -130,6 +128,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
}*/
Events.Write(Writer);
Chunks.Write(Writer);
}
@ -154,9 +153,9 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
LastViewedX = Reader.ReadInt32();
LastViewedY = Reader.ReadInt32();
var paletteSize = Reader.ReadInt32();
//var paletteSize = Reader.ReadInt32();
Palette = new List<Color>();
for (int i = 0; i < paletteSize; i++)
for (int i = 0; i < 257; i++)
{
Palette.Add(Reader.ReadColor());
}
@ -190,6 +189,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
{
var frameitem = new FrameItem(Reader);
frameitem.Read();
Items.Add(frameitem);
}

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

@ -8,7 +8,7 @@ using static DotNetCTFDumper.MMFParser.EXE.ChunkList;
namespace DotNetCTFDumper.MMFParser.MFA.Loaders
{
public class AgmiBank : DataLoader
public class AGMIBank : DataLoader
{
private int GraphicMode;
private int PaletteVersion;
@ -54,6 +54,7 @@ namespace DotNetCTFDumper.MMFParser.MFA.Loaders
public override void Write(ByteWriter writer)
{
Logger.Log("TEX WRITE");
writer.WriteInt32(GraphicMode);
writer.WriteInt16((short) PaletteVersion);
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)
{
Writer.WriteInt32(0x70000005);
Writer.WriteInt32(3);
}
else
{
Writer.WriteInt32(0x70000004);
Writer.AutoWriteUnicode(Name);
Writer.WriteInt32(Items.Count);
}
foreach (var item in Items)
{
Writer.WriteUInt32(item);
}
}
}

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

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

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

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

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

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

@ -8,7 +8,7 @@ namespace DotNetCTFDumper.MMFParser.Translation
public static class MFAGenerator
{
// 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()
{
@ -22,7 +22,7 @@ namespace DotNetCTFDumper.MMFParser.Translation
var mfaWriter =
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
Pame2Mfa.Message("");
Pame2Mfa.Message("Writing MFA");
@ -36,7 +36,7 @@ namespace DotNetCTFDumper.MMFParser.Translation
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 template = new MFA.MFA(mfaReader);
Settings.DoMFA = true;
@ -45,7 +45,7 @@ namespace DotNetCTFDumper.MMFParser.Translation
//Add modifications
var mfaWriter = new ByteWriter(output_path, FileMode.Create);
var mfaWriter = new ByteWriter(outputPath, FileMode.Create);
template.Write(mfaWriter);
}
}

@ -33,8 +33,8 @@ namespace DotNetCTFDumper.MMFParser.Translation
//mfa.Product = (int) game.ProductVersion;
//mfa.BuildVersion = 283;
mfa.Name = game.Name;
mfa.LangId = 0;
mfa.Description = $"Decompiled with {Settings.DumperVersion}";
mfa.LangId = 8192;
mfa.Description = "";
mfa.Path = game.EditorFilename;
//mfa.Stamp = wtf;
@ -47,14 +47,14 @@ namespace DotNetCTFDumper.MMFParser.Translation
//}
mfa.Music = game.Music;
mfa.Images.Items = game.Images.Images;
// foreach (var key in mfa.Images.Items.Keys)
// {
// mfa.Images.Items[key].Debug = true;
// }
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.Author = game.Author ?? "";
mfa.Copyright = game.Copyright ??"";
mfa.Company = "";
mfa.Version = "";
//TODO:Binary Files
var displaySettings = mfa.DisplayFlags;
@ -75,7 +75,7 @@ namespace DotNetCTFDumper.MMFParser.Translation
mfa.CommandLine = "";
mfa.Aboutbox = game.AboutText?.Length > 0
? game?.AboutText
: "This game was decompiled with " + Settings.DumperVersion;
: "";
//Object Section
FrameItems = new Dictionary<int,FrameItem>();
@ -83,11 +83,7 @@ namespace DotNetCTFDumper.MMFParser.Translation
{
var key = game.Frameitems.ItemDict.Keys.ToArray()[i];
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;
@ -96,17 +92,17 @@ namespace DotNetCTFDumper.MMFParser.Translation
newItem.InkEffect = item.InkEffect;
newItem.InkEffectParameter = item.InkEffectValue;
newItem.AntiAliasing = item.Antialias ? 1 : 0;
newItem.Flags = (int) item.Flags;
newItem.IconHandle = 10;
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;
newLoader.NewObjectFlags = (int) itemLoader.NewFlags.flag;
newLoader.BackgroundColor = Color.FromArgb(itemLoader.BackColor.R,itemLoader.BackColor.G,itemLoader.BackColor.B);
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);
@ -115,9 +111,9 @@ namespace DotNetCTFDumper.MMFParser.Translation
{
var mov = itemLoader.Movements.Items[j];
var newMov = new Movement(null);
newMov.Name = $"Movement {j+1}";
newMov.Name = $"Movement #{j}";
newMov.Extension = "";
newMov.Identifier = mov.Type;
newMov.Identifier = (uint) mov.Type;
newMov.Player = mov.Player;
newMov.MovingAtStart = mov.MovingAtStart;
newMov.DirectionAtStart = mov.DirectionAtStart;
@ -136,7 +132,9 @@ namespace DotNetCTFDumper.MMFParser.Translation
EXE.Loaders.Objects.Animation animation = null;
try
{
animation = animHeader.AnimationDict[0];
if (animHeader.AnimationDict.ContainsKey(j)) animation = animHeader.AnimationDict[j];
else break;
}
catch (Exception e)
{
@ -168,17 +166,8 @@ namespace DotNetCTFDumper.MMFParser.Translation
}
newItem.Loader = newLoader;
try
{
FrameItems.Add(newItem.Handle,newItem);
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
}
}
@ -187,6 +176,7 @@ namespace DotNetCTFDumper.MMFParser.Translation
mfa.Frames.Clear();
foreach (Frame frame in game.Frames)
{
//if(frame.Name!="what day")continue;
var newFrame = new MFA.Loaders.Frame(null);
//FrameInfo
newFrame.Handle = game.Frames.IndexOf(frame);
@ -198,6 +188,7 @@ namespace DotNetCTFDumper.MMFParser.Translation
newFrame.FadeOut = frame.FadeOut!=null? ConvertTransition(frame.FadeOut):null;
var mfaFlags = newFrame.Flags;
var originalFlags = frame.Flags;
mfaFlags["GrabDesktop"] = originalFlags["GrabDesktop"];
mfaFlags["KeepDisplay"] = originalFlags["KeepDisplay"];
mfaFlags["BackgroundCollisions"] = originalFlags["TotalCollisionMask"];
@ -205,12 +196,14 @@ namespace DotNetCTFDumper.MMFParser.Translation
mfaFlags["ForceLoadOnCall"] = originalFlags["ForceLoadOnCall"];
mfaFlags["NoDisplaySurface"] = false;
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.LastViewedX = 320;
newFrame.LastViewedY = 240;
newFrame.Palette = frame.Palette.Items;
newFrame.StampHandle = 12;
newFrame.StampHandle = 13;
newFrame.ActiveLayer = 0;
//LayerInfo
newFrame.Layers=new List<Layer>();
@ -238,37 +231,36 @@ namespace DotNetCTFDumper.MMFParser.Translation
{
var instance = frame.Objects.Items[i];
if (instance.FrameItem.ObjectType == 2)
{
FrameItem frameItem = null;
try
FrameItem frameItem;
if (FrameItems.ContainsKey(instance.ObjectInfo))
{
frameItem = FrameItems[instance.ObjectInfo];
}
catch
{
throw new NotImplementedException("ObjectInfo not found, this may cause errors");
}
if (frameItem != null)
{
newFrameItems.Add(frameItem);
var newInstance = new FrameInstance((ByteReader) null);
newInstance.X = instance.X;
newInstance.Y = instance.Y;
newInstance.Handle = instance.Handle;
newInstance.Flags = 0;
newInstance.Handle = i;
newInstance.Flags = 1;
newInstance.ParentType = (uint) instance.ParentType;
newInstance.ItemHandle = instance.ObjectInfo;
newInstance.ParentHandle = (uint) instance.ParentHandle;
newInstance.ItemHandle = (uint) (instance.ObjectInfo + 3);
newInstance.ParentHandle = (uint) instance.ParentHandle; //0xffffffff;
newInstance.Layer = (uint) instance.Layer;
newInstances.Add(newInstance);
}
break;
}
}
}
newFrame.Items = newFrameItems;
newFrame.Instances = newInstances;
newFrame.Folders=new List<ItemFolder>();
@ -284,15 +276,16 @@ namespace DotNetCTFDumper.MMFParser.Translation
newFrame.Events = MFA.MFA.emptyEvents;
newFrame.Events.Version = 1028;
foreach (var item in newFrame.Items)
{
var newObject = new EventObject((ByteReader) null);
newObject.Handle = (uint) item.Handle;
newObject.Name = item.Name;
newObject.Name = item.Name ??"";
newObject.TypeName = "";
newObject.ItemType = (ushort) item.ObjectType;
newObject.ObjectType = 1;
newObject.ObjectType = 2;
newObject.Flags = 0;
newObject.ItemHandle = (uint) item.Handle;
newObject.InstanceHandle = 0xFFFFFFFF;
@ -301,6 +294,7 @@ namespace DotNetCTFDumper.MMFParser.Translation
}
newFrame.Chunks = new ChunkList(null);
mfa.Frames.Add(newFrame);
}
@ -360,7 +354,7 @@ namespace DotNetCTFDumper.MMFParser.Translation
public static void Message(string msg)
{
OnMessage.Invoke(msg);
OnMessage?.Invoke(msg);
}

@ -86,6 +86,7 @@ namespace DotNetCTFDumper
var currentExe = new Exe();
Exe.Instance = currentExe;
currentExe.ParseExe(exeReader);
MFAGenerator.BuildMFA();
Logger.Log("Finished!", true, ConsoleColor.Yellow);
return;
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
{
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