diff --git a/CTFAK/MMFParser/EXE/Loaders/Events/Events.cs b/CTFAK/MMFParser/EXE/Loaders/Events/Events.cs index 459ec08..f662841 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Events/Events.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Events/Events.cs @@ -19,6 +19,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events public List QualifiersList = new List(); public Quailifer[] Quailifers; public List NumberOfConditions = new List(); + public List Items = new List(); 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,21 +97,24 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events { } - public override void Print(bool ext) + + + public override void Read() { - throw new NotImplementedException(); + ObjectInfo = Reader.ReadUInt16(); + Type = Reader.ReadInt16(); + Qualifier = this; } - public override string[] GetReadableData() + public override void Write(ByteWriter Writer) { - throw new NotImplementedException(); + Writer.WriteUInt16((ushort) ObjectInfo); + Writer.WriteInt16((short) Type); } - public override void Read() + public override void Print() { - ObjectInfo = Reader.ReadUInt16(); - Type = Reader.ReadInt16(); - Qualifier = this; + 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); diff --git a/CTFAK/MMFParser/EXE/Loaders/Events/EventsParts.cs b/CTFAK/MMFParser/EXE/Loaders/Events/EventsParts.cs index 771e278..08e8943 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Events/EventsParts.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Events/EventsParts.cs @@ -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); diff --git a/CTFAK/MMFParser/EXE/Loaders/Events/Expressions/Expression.cs b/CTFAK/MMFParser/EXE/Loaders/Events/Expressions/Expression.cs index caec6b1..c97f941 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Events/Expressions/Expression.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Events/Expressions/Expression.cs @@ -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() diff --git a/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Colour.cs b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Colour.cs index 1f596c3..954b1f3 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Colour.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Colour.cs @@ -11,8 +11,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters public override void Read() { var bytes = Reader.ReadBytes(4); - Value = Color.FromArgb(bytes[0], bytes[1], bytes[2]); - + Value = Color.FromArgb(bytes[0], bytes[1], bytes[2]); } } diff --git a/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Create.cs b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Create.cs index c674dec..59cb7af 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Create.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Create.cs @@ -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()})"; diff --git a/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/ExpressionParameter.cs b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/ExpressionParameter.cs index da0f0f1..d0b53e0 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/ExpressionParameter.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/ExpressionParameter.cs @@ -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 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(); 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() diff --git a/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/ParameterCommon.cs b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/ParameterCommon.cs index 99a6830..df14e06 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/ParameterCommon.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/ParameterCommon.cs @@ -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() diff --git a/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Position.cs b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Position.cs index b6fa233..687ee0f 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Position.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Position.cs @@ -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}"; diff --git a/CTFAK/MMFParser/MFA/Loaders/Events.cs b/CTFAK/MMFParser/MFA/Loaders/Events.cs index 5e4b892..1820356 100644 --- a/CTFAK/MMFParser/MFA/Loaders/Events.cs +++ b/CTFAK/MMFParser/MFA/Loaders/Events.cs @@ -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 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); @@ -242,8 +245,12 @@ namespace CTFAK.MMFParser.MFA.Loaders Writer.AutoWriteUnicode(folder); } } + + + + - //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) { diff --git a/CTFAK/MMFParser/MFA/Loaders/Frame.cs b/CTFAK/MMFParser/MFA/Loaders/Frame.cs index cd56bfa..14662ac 100644 --- a/CTFAK/MMFParser/MFA/Loaders/Frame.cs +++ b/CTFAK/MMFParser/MFA/Loaders/Frame.cs @@ -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); diff --git a/CTFAK/MMFParser/MFA/MFA.cs b/CTFAK/MMFParser/MFA/MFA.cs index 15d260b..faa57a5 100644 --- a/CTFAK/MMFParser/MFA/MFA.cs +++ b/CTFAK/MMFParser/MFA/MFA.cs @@ -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(handle, filename, name, magic, subType); diff --git a/CTFAK/MMFParser/Translation/PAME2MFA.cs b/CTFAK/MMFParser/Translation/PAME2MFA.cs index 1bb7935..6f6656b 100644 --- a/CTFAK/MMFParser/Translation/PAME2MFA.cs +++ b/CTFAK/MMFParser/Translation/PAME2MFA.cs @@ -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 quailifers = new List(); 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); diff --git a/CTFAK/Program.cs b/CTFAK/Program.cs index 1aee361..cd6ec4a 100644 --- a/CTFAK/Program.cs +++ b/CTFAK/Program.cs @@ -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) => {