Fixes for MFA event parser

master
1987kostya 4 years ago
parent 2cd7175b6e
commit 876ee58a29

@ -19,6 +19,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events
public List<Quailifer> QualifiersList = new List<Quailifer>();
public Quailifer[] Quailifers;
public List<int> NumberOfConditions = new List<int>();
public List<EventGroup> Items = new List<EventGroup>();
public Events(Chunk chunk) : base(chunk)
@ -71,6 +72,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events
{
var eg = new EventGroup(Reader);
eg.Read();
Items.Add(eg);
if (Reader.Tell() >= endPosition) break;
}
@ -80,7 +82,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events
}
}
public class Quailifer : ChunkLoader
public class Quailifer : DataLoader
{
public int ObjectInfo;
public int Type;
@ -95,15 +97,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events
{
}
public override void Print(bool ext)
{
throw new NotImplementedException();
}
public override string[] GetReadableData()
{
throw new NotImplementedException();
}
public override void Read()
{
@ -111,6 +105,17 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events
Type = Reader.ReadInt16();
Qualifier = this;
}
public override void Write(ByteWriter Writer)
{
Writer.WriteUInt16((ushort) ObjectInfo);
Writer.WriteInt16((short) Type);
}
public override void Print()
{
throw new NotImplementedException();
}
}
@ -197,7 +202,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events
public void Write(ByteWriter Writer)
{
ByteWriter newWriter = new ByteWriter(new MemoryStream());
newWriter.WriteInt8( NumberOfConditions);
newWriter.WriteInt8(NumberOfConditions);
newWriter.WriteInt8(NumberOfActions);
newWriter.WriteUInt16(Flags);
if (Settings.Build >= 284)
@ -223,15 +228,18 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events
newWriter.WriteInt16((short) Identifier);
newWriter.WriteInt16((short) Undo);
}
foreach (Condition condition in Conditions)
{
condition.Write(newWriter);
}
foreach (Action action in Actions)
{
action.Write(newWriter);
}
Writer.WriteInt16((short) ((newWriter.Size()+2)*-1));
Writer.WriteWriter(newWriter);

@ -107,7 +107,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events
{
parameter.Write(newWriter);
}
Writer.WriteInt16((short) (newWriter.BaseStream.Position+2));
Writer.WriteUInt16((ushort) (newWriter.BaseStream.Position+2));
Writer.WriteWriter(newWriter);
}
@ -156,7 +156,13 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events
public override void Write(ByteWriter Writer)
{
throw new NotImplementedException();
var newWriter = new ByteWriter(new MemoryStream());
newWriter.WriteInt16((short) Code);
Loader.Write(newWriter);
Writer.WriteUInt16((ushort) (newWriter.BaseStream.Position+2));
Writer.WriteWriter(newWriter);
}
public override void Print()
@ -180,7 +186,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events
}
else
{
//throw new Exception("Loader is null");
throw new Exception("Loader is null");
}
Reader.Seek(currentPosition+size);

@ -1,4 +1,5 @@
using System;
using System.IO;
using System.Windows.Forms.VisualStyles;
using CTFAK.Utils;
@ -15,7 +16,62 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Expressions
public Expression(ByteReader reader) : base(reader) { }
public override void Write(ByteWriter Writer)
{
throw new NotImplementedException();
Writer.WriteInt16((short) ObjectType);
Writer.WriteInt16((short) Num);
if (ObjectType == 0 && Num == 0) return;
var dataWriter = new ByteWriter(new MemoryStream());
switch (ObjectType)
{
case Constants.ObjectType.System:
switch (Num)
{
//Long
case 0:
{
dataWriter.WriteInt32((int) value);
break;
}
//String
case 3:
{
dataWriter.WriteUnicode(((string) value),true);
break;
}
//Double
case 23:
{
dataWriter.WriteSingle((float) value);
dataWriter.WriteSingle((float) value);
break;
}
//GlobalString
case 24:
break;
//GlobalValue
case 50:
break;
default:
{
if ((int)ObjectType >= 2 || (int)ObjectType == 7)
{
dataWriter.WriteInt16((short) ObjectInfo);
dataWriter.WriteInt16((short) ObjectInfoList);
// if self.num in extensionLoaders:
// loader = extensionLoaders[self.num]
// self.loader = self.new(loader, reader)
}
break;
}
}
break;
}
Writer.WriteInt16((short) (dataWriter.Size()+6));
Writer.WriteWriter(dataWriter);
}
public override void Print()

@ -12,7 +12,6 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters
{
var bytes = Reader.ReadBytes(4);
Value = Color.FromArgb(bytes[0], bytes[1], bytes[2]);
}
}

@ -15,9 +15,17 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters
Position.Read();
ObjectInstances = Reader.ReadUInt16();
ObjectInfo = Reader.ReadUInt16();
// Reader.Skip(4);
}
public override void Write(ByteWriter Writer)
{
Position.Write(Writer);
Writer.WriteUInt16((ushort) ObjectInstances);
Writer.WriteUInt16((ushort) ObjectInfo);
// Writer.Skip(4);
}
public override string ToString()
{
return $"Create obj instance:{ObjectInstances} info:{ObjectInfo} pos:({Position.ToString()})";

@ -1,4 +1,5 @@
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using CTFAK.MMFParser.EXE.Loaders.Events.Expressions;
using CTFAK.Utils;
@ -7,6 +8,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters
public class ExpressionParameter:ParameterCommon
{
public List<Expression> Items;
public short Comparsion;
public ExpressionParameter(ByteReader reader) : base(reader)
{
@ -15,14 +17,15 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters
public override void Read()
{
base.Read();
var comparsion = Reader.ReadInt16();
Comparsion = Reader.ReadInt16();
Items = new List<Expression>();
while (true)
{
var expression = new Expression(Reader);
expression.Read();
if (expression.ObjectType == 0) break;
Items.Add(expression);
if (expression.ObjectType == 0) break;
}
}
@ -30,6 +33,13 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters
public override void Write(ByteWriter Writer)
{
base.Write(Writer);
Writer.WriteInt16(Comparsion);
foreach (Expression item in Items)
{
item.Write(Writer);
}
}
public override string ToString()

@ -10,7 +10,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters
public ParameterCommon(ByteReader reader) : base(reader) { }
public override void Write(ByteWriter Writer)
{
throw new NotImplementedException();
}
public override void Print()

@ -5,7 +5,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters
public class Position : ParameterCommon
{
public int ObjectInfoParent;
public int Flags;
public ushort Flags;
public int X;
public int Y;
public int Slope;
@ -28,9 +28,22 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters
TypeParent = Reader.ReadInt16();
ObjectInfoList = Reader.ReadInt16();
Layer = Reader.ReadInt16();
}
public override void Write(ByteWriter Writer)
{
Writer.WriteInt16((short) ObjectInfoParent);
Writer.WriteUInt16(Flags);
Writer.WriteInt16((short) X);
Writer.WriteInt16((short) Y);
Writer.WriteInt16((short) Slope);
Writer.WriteInt16((short) Angle);
Writer.WriteSingle(Direction);
Writer.WriteInt16((short) TypeParent);
Writer.WriteInt16((short) ObjectInfoList);
Writer.WriteInt16((short) Layer);
}
public override string ToString()
{
return $"Object X:{X} Y:{Y} Angle:{Angle} Direction:{Direction} Parent:{ObjectInfoList}";

@ -9,15 +9,15 @@ namespace CTFAK.MMFParser.MFA.Loaders
{
public class Events:DataLoader
{
public readonly string EventData = "Evts";
public readonly string CommentData = "Rems";
public readonly string ObjectData = "EvOb";
public readonly string EventEditorData = "EvCs";
public readonly string ObjectListData = "EvEd";
public readonly string TimeListData = "EvEd";
public readonly string EditorPositionData = "EvTs";
public readonly string EditorLineData = "EvLs";
public readonly string EventEnd ="!DNE";
public const string EventData = "Evts";
public const string CommentData = "Rems";
public const string ObjectData = "EvOb";
public const string EventEditorData = "EvCs";
public const string ObjectListData = "EvEd";
public const string TimeListData = "EvEd";
public const string EditorPositionData = "EvTs";
public const string EditorLineData = "EvLs";
public const string EventEnd ="!DNE";
public List<EventGroup> Items;
public ushort Version;
public ushort FrameType;
@ -188,23 +188,27 @@ namespace CTFAK.MMFParser.MFA.Loaders
Writer.WriteUInt16(Version);
Writer.WriteUInt16(FrameType);
if (Items.Count>0)
{
Console.WriteLine("Writing EventData");
Writer.WriteAscii(EventData);
ByteWriter newWriter = new ByteWriter(new MemoryStream());
Writer.WriteUInt32(EventDataLen);
//Writer.WriteUInt32(EventDataLen);
foreach (EventGroup eventGroup in Items)
{
eventGroup.isMFA = true;
eventGroup.Write(newWriter);
}
Writer.WriteUInt32((uint) newWriter.BaseStream.Position);
Writer.WriteWriter(newWriter);
}
if (Objects.Count>0)
{
Console.WriteLine("Writing EventObjects");
@ -215,7 +219,6 @@ namespace CTFAK.MMFParser.MFA.Loaders
eventObject.Write(Writer);
}
}
if (ObjectTypes != null)
{
Writer.WriteAscii(ObjectListData);
@ -243,7 +246,11 @@ namespace CTFAK.MMFParser.MFA.Loaders
}
}
//if (X != 0)
// if (X != 0)
{
Writer.WriteAscii(EditorPositionData);
Writer.WriteInt16(1);
@ -253,7 +260,7 @@ namespace CTFAK.MMFParser.MFA.Loaders
Writer.WriteUInt32(CaretX);
Writer.WriteUInt32(CaretY);
}
//if (LineY != 0)
// if (LineY != 0)
{
Writer.WriteAscii(EditorLineData);
Writer.WriteInt16(1);
@ -263,6 +270,7 @@ namespace CTFAK.MMFParser.MFA.Loaders
Writer.WriteUInt32(EventLineY);
}
Writer.WriteAscii(EventEditorData);
// Writer.Skip(4+2*2+4*3);
Writer.WriteInt32(EditorDataUnk);
Writer.WriteInt16((short) ConditionWidth);
Writer.WriteInt16((short) ObjectHeight);
@ -393,12 +401,12 @@ namespace CTFAK.MMFParser.MFA.Loaders
}
else if (ObjectType == 2)
{
Code = "OIC2";
// Code = "OIC2";
Writer.WriteAscii(Code);
// if (Code == "OIC2")
// {
// Writer.AutoWriteUnicode(IconBuffer);
// }
if (Code == "OIC2")
{
Writer.AutoWriteUnicode(IconBuffer);
}
}
if (ObjectType == 3)
{

@ -65,8 +65,8 @@ namespace CTFAK.MMFParser.MFA.Loaders
Writer.AutoWriteUnicode(UnkString);
Writer.WriteInt32(LastViewedX);
Writer.WriteInt32(LastViewedY);
//Writer.WriteInt32(Palette.Count);//WTF HELP
Palette[0] = Color.FromArgb(0, 0, 1, 0);
// Writer.WriteInt32(Palette.Count);//WTF HELP
foreach (var item in Palette)
{
Writer.WriteColor(item);

@ -237,12 +237,13 @@ namespace CTFAK.MMFParser.MFA
foreach(var extension in Extensions)
{
Writer.WriteInt32(extension.Item1);
Writer.AutoWriteUnicode(extension.Item2);
Writer.AutoWriteUnicode(extension.Item3);
Writer.AutoWriteUnicode(extension.Item2);
Writer.WriteInt32(extension.Item4);
Writer.WriteInt16((short) (extension.Item5.Length-1));
Writer.Skip(1);
Writer.WriteInt8(0x80);
//Writer.WriteInt8(0x01);
Writer.Skip(2);
Writer.WriteUnicode(extension.Item5, false);
@ -384,8 +385,8 @@ namespace CTFAK.MMFParser.MFA
for (int i = 0; i < extCount; i++) //extensions
{
var handle = Reader.ReadInt32();
var filename = Helper.AutoReadUnicode(Reader);
var name = Helper.AutoReadUnicode(Reader);
var filename = Helper.AutoReadUnicode(Reader);
var magic = Reader.ReadInt32();
var subType = Reader.ReadWideString(Reader.ReadInt32());
var tuple = new Tuple<int, string, string, int, string>(handle, filename, name, magic, subType);

@ -4,6 +4,7 @@ using System.Drawing;
using System.Linq;
using CTFAK.MMFParser.EXE;
using CTFAK.MMFParser.EXE.Loaders;
using CTFAK.MMFParser.EXE.Loaders.Events;
using CTFAK.MMFParser.EXE.Loaders.Objects;
using CTFAK.MMFParser.MFA.Loaders;
using CTFAK.MMFParser.MFA.Loaders.mfachunks;
@ -119,7 +120,7 @@ namespace CTFAK.MMFParser.Translation
var newObject = new ObjectLoader(null);
newObject.ObjectFlags = (int) (itemLoader?.Flags?.flag ?? 820);
newObject.NewObjectFlags =(int) (itemLoader?.NewFlags?.flag ?? 8);
newObject.BackgroundColor = Color.FromArgb(0x0, 0xff, 0xff, 0xff);
newObject.BackgroundColor = Color.Black;//itemLoader.BackColor;
//newLoader.Qualifiers;
newObject.Strings = ConvertStrings(itemLoader.Strings);
newObject.Values = ConvertValue(itemLoader.Values);
@ -130,7 +131,8 @@ namespace CTFAK.MMFParser.Translation
var newMov = new Movement(null);
newMov.Name = $"Movement #{j}";
newMov.Extension = "";
newMov.Identifier = (uint) mov.Type;
newMov.Identifier = 0;//(uint) mov.Type;
if(newMov.Identifier!=0)throw new Exception("Unknown Movement: "+newMov.Identifier);
newMov.Player = mov.Player;
newMov.MovingAtStart = mov.MovingAtStart;
newMov.DirectionAtStart = mov.DirectionAtStart;
@ -352,7 +354,6 @@ namespace CTFAK.MMFParser.Translation
{
var newLayer = new Layer(null);
newLayer.Name = layer.Name;
var layerFlags = layer.Flags;
newLayer.Flags["HideAtStart"] = originalFlags["ToHide"];
newLayer.Flags["Visible"] = true;
newLayer.Flags["NoBackground"] = originalFlags["DoNotSaveBackground"];
@ -361,6 +362,8 @@ namespace CTFAK.MMFParser.Translation
newLayer.XCoefficient = layer.XCoeff;
newLayer.YCoefficient = layer.YCoeff;
newFrame.Layers.Add(newLayer);
if(frame.Layers.Items.IndexOf(layer)==1)break;
}
Message("Translating frame: " + newFrame.Name);
@ -378,8 +381,6 @@ namespace CTFAK.MMFParser.Translation
if (FrameItems.ContainsKey(instance.ObjectInfo))
{
frameItem = FrameItems[instance.ObjectInfo];
// if (frameItem.ObjectType >= 32) break;
if(!newFrameItems.Contains(frameItem)) newFrameItems.Add(frameItem);
var newInstance = new FrameInstance((ByteReader) null);
newInstance.X = instance.X;
@ -388,11 +389,10 @@ namespace CTFAK.MMFParser.Translation
newInstance.Flags = instance.FrameItem.Flags;
newInstance.ParentType = (uint) instance.ParentType;
newInstance.ItemHandle = (uint) (instance.ObjectInfo);
newInstance.ParentHandle = 0xffffffff;
newInstance.Layer = (uint) instance.Layer;
newInstance.ParentHandle = (uint) instance.ParentHandle;
newInstance.Layer = 0;//(uint) instance.Layer;
newInstances.Add(newInstance);
Logger.Log($"{instance.FrameItem.Name} - {i}");
// if(i==52) break;
}
}
@ -414,7 +414,7 @@ namespace CTFAK.MMFParser.Translation
List<DataLoader> quailifers = new List<DataLoader>();
newFrame.Events = MFA.MFA.emptyEvents;
newFrame.Events._ifMFA = true;
newFrame.Events.Version = 1028;
@ -422,11 +422,11 @@ namespace CTFAK.MMFParser.Translation
{
var newObject = new EventObject((ByteReader) null);
newObject.Handle = (uint) newFrame.Items.IndexOf(item);//(uint) item.Handle;
newObject.Handle = (uint) item.Handle;
newObject.Name = item.Name ?? "";
newObject.TypeName = "";
newObject.ItemType = (ushort) item.ObjectType;
newObject.ObjectType = (ushort) item.ObjectType;
newObject.ObjectType = 1;
newObject.Flags = 0;
newObject.ItemHandle = (uint) item.Handle;
newObject.InstanceHandle = 0xFFFFFFFF;
@ -434,6 +434,30 @@ namespace CTFAK.MMFParser.Translation
}
for (int i = 0; i < frame.Events.Quailifers.Length; i++)
{
var item = frame.Events.Quailifers[i];
if (quailifers.Contains(item))
{
}
else
{
var newObject = new EventObject((ByteReader) null);
quailifers.Add(newObject);
var newHandle = 0;
while (true)
{
}
}
}
newFrame.Chunks = new ChunkList(null);
mfa.Frames.Add(newFrame);

@ -33,8 +33,8 @@ namespace CTFAK
LoadableSettings.FromFile("settings.sav");
//
// MFAGenerator.ReadTestMFA();
// Environment.Exit(0);
MFAGenerator.ReadTestMFA();
Environment.Exit(0);
AppDomain.CurrentDomain.FirstChanceException += (sender, eventArgs) =>
{

Loading…
Cancel
Save