diff --git a/CTFAK/CTFAK.csproj b/CTFAK/CTFAK.csproj index 65f7304..9c978b3 100644 --- a/CTFAK/CTFAK.csproj +++ b/CTFAK/CTFAK.csproj @@ -161,6 +161,10 @@ MainForm.cs + + + + diff --git a/CTFAK/MMFParser/EXE/ChunkList.cs b/CTFAK/MMFParser/EXE/ChunkList.cs index 11431ec..5f95b58 100644 --- a/CTFAK/MMFParser/EXE/ChunkList.cs +++ b/CTFAK/MMFParser/EXE/ChunkList.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.IO; using CTFAK.MMFParser.EXE.Loaders; using CTFAK.MMFParser.EXE.Loaders.Banks; +using CTFAK.MMFParser.EXE.Loaders.Events; using CTFAK.Utils; namespace CTFAK.MMFParser.EXE @@ -264,7 +265,7 @@ namespace CTFAK.MMFParser.EXE loader = new GlobalStrings(chunk); break; case 13117: - // loader = new Events(chunk);//NOT WORKING + loader = new Events(chunk);//NOT WORKING break; } diff --git a/CTFAK/MMFParser/EXE/Loaders/Events/Events.cs b/CTFAK/MMFParser/EXE/Loaders/Events/Events.cs index b3fab91..459ec08 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Events/Events.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Events/Events.cs @@ -71,7 +71,9 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events { var eg = new EventGroup(Reader); eg.Read(); + if (Reader.Tell() >= endPosition) break; } + } else if (identifier == End) break; } @@ -124,6 +126,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events public int Size; public byte NumberOfConditions; public byte NumberOfActions; + public bool isMFA=false; public EventGroup(Chunk chunk) : base(chunk) { @@ -146,15 +149,25 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events public override void Read() { var currentPosition = Reader.Tell(); - Size = Reader.ReadInt16() * -1; + Size = Reader.ReadInt16()*-1; NumberOfConditions = Reader.ReadByte(); NumberOfActions = Reader.ReadByte(); Flags = Reader.ReadUInt16(); if (Settings.Build >= 284) { - var nop = Reader.ReadInt16(); - IsRestricted = Reader.ReadInt32(); - RestrictCpt = Reader.ReadInt32(); + if(isMFA) + { + IsRestricted = Reader.ReadInt16(); //For MFA + RestrictCpt = Reader.ReadInt16(); + Identifier = Reader.ReadInt16(); + Undo = Reader.ReadInt16(); + } + else + { + var nop = Reader.ReadInt16(); + IsRestricted = Reader.ReadInt32(); + RestrictCpt = Reader.ReadInt32(); + } } else { @@ -177,7 +190,6 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events item.Read(); Actions.Add(item); } - Reader.Seek(currentPosition + Size); } @@ -190,9 +202,19 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events newWriter.WriteUInt16(Flags); if (Settings.Build >= 284) { - newWriter.WriteInt16(0); - newWriter.WriteInt32(IsRestricted); - newWriter.WriteInt32(RestrictCpt); + if(isMFA) + { + newWriter.WriteInt16((short) IsRestricted); //For MFA + newWriter.WriteInt16((short) RestrictCpt); + newWriter.WriteInt16((short) Identifier); + newWriter.WriteInt16((short) Undo); + } + else + { + newWriter.WriteInt16(0); + newWriter.WriteInt32(IsRestricted); + newWriter.WriteInt32(RestrictCpt); + } } else { diff --git a/CTFAK/MMFParser/EXE/Loaders/Events/EventsParts.cs b/CTFAK/MMFParser/EXE/Loaders/Events/EventsParts.cs index 6212e1b..771e278 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Events/EventsParts.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Events/EventsParts.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Drawing; using System.IO; using CTFAK.Utils; @@ -65,6 +66,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events item.Read(); Items.Add(item); } + Logger.Log(this); Reader.Seek(currentPosition + size); @@ -72,7 +74,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events } public override string ToString() { - return $"Condition {ObjectType}-{Num}{(Items.Count > 0 ? "-"+Items[0].ToString() : " ")}"; + return $"Condition {ObjectType}=={Num}{(Items.Count > 0 ? "-"+Items[0].ToString() : " ")}"; } } @@ -87,6 +89,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events public int ObjectInfo; public int ObjectInfoList; public List Items = new List(); + public byte NumberOfParameters; public Action(ByteReader reader) : base(reader) { } public override void Write(ByteWriter Writer) { @@ -124,14 +127,15 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events ObjectInfoList = Reader.ReadInt16(); Flags = Reader.ReadSByte(); OtherFlags = Reader.ReadSByte(); - var numberOfParameters=Reader.ReadByte(); + NumberOfParameters = Reader.ReadByte(); DefType = Reader.ReadByte(); - for (int i = 0; i < DefType; i++) + for (int i = 0; i < NumberOfParameters; i++) { var item = new Parameter(Reader); item.Read(); Items.Add(item); } + Logger.Log(this); } @@ -204,7 +208,11 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events public override string ToString() { if (Loader != null) return Loader.ToString(); - else return "UNK-PARAMETER"; + else + { + throw new NotImplementedException($"Unkown Parameter: {Code} "); + return $"UNK-{Code}"; + } } } diff --git a/CTFAK/MMFParser/EXE/Loaders/Events/Expressions/Expression.cs b/CTFAK/MMFParser/EXE/Loaders/Events/Expressions/Expression.cs index e3498bb..caec6b1 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Events/Expressions/Expression.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Events/Expressions/Expression.cs @@ -1,14 +1,17 @@ using System; +using System.Windows.Forms.VisualStyles; using CTFAK.Utils; namespace CTFAK.MMFParser.EXE.Loaders.Events.Expressions { - class Expression : DataLoader + public class Expression : DataLoader { public Constants.ObjectType ObjectType; public int Num; public int ObjectInfo; public int ObjectInfoList; + public object value; + public object floatValue; public Expression(ByteReader reader) : base(reader) { } public override void Write(ByteWriter Writer) { @@ -22,7 +25,66 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Expressions public override void Read() { - + var currentPosition = Reader.Tell(); + ObjectType = (Constants.ObjectType) Reader.ReadInt16(); + Num = Reader.ReadInt16(); + if (ObjectType == 0 & Num == 0) return; + var size = Reader.ReadUInt16(); + switch (ObjectType) + { + case Constants.ObjectType.System: + switch (Num) + { + //Long + case 0: + { + value = Reader.ReadInt32(); + break; + } + //String + case 3: + { + value = Reader.ReadWideString(); + break; + } + //Double + case 23: + { + value = Reader.ReadDouble(); + floatValue = Reader.ReadSingle(); + break; + } + //GlobalString + case 24: + break; + //GlobalValue + case 50: + break; + default: + { + if ((int)ObjectType >= 2 || (int)ObjectType == 7) + { + ObjectInfo = Reader.ReadUInt16(); + ObjectInfoList = Reader.ReadUInt16(); + // if self.num in extensionLoaders: + // loader = extensionLoaders[self.num] + // self.loader = self.new(loader, reader) + } + + break; + } + + } + + break; + } + Reader.Seek(currentPosition+size); + + } + + public override string ToString() + { + return $"Expression {ObjectType}=={Num}: {value}"; } } } diff --git a/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Click.cs b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Click.cs new file mode 100644 index 0000000..4ba8503 --- /dev/null +++ b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Click.cs @@ -0,0 +1,34 @@ +using CTFAK.Utils; + +namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters +{ + public class Click:ParameterCommon + { + public byte IsDouble; + public byte Button; + + public Click(ByteReader reader) : base(reader) + { + } + + public override void Read() + { + base.Read(); + Button = Reader.ReadByte(); + IsDouble = Reader.ReadByte(); + } + + public override void Write(ByteWriter Writer) + { + base.Write(Writer); + Writer.WriteInt8(Button); + Writer.WriteInt8(IsDouble); + + } + + public override string ToString() + { + return $"{Button}-{IsDouble}"; + } + } +} \ No newline at end of file diff --git a/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/ExpressionParameter.cs b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/ExpressionParameter.cs new file mode 100644 index 0000000..da0f0f1 --- /dev/null +++ b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/ExpressionParameter.cs @@ -0,0 +1,40 @@ +using System.Collections.Generic; +using CTFAK.MMFParser.EXE.Loaders.Events.Expressions; +using CTFAK.Utils; + +namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters +{ + public class ExpressionParameter:ParameterCommon + { + public List Items; + + public ExpressionParameter(ByteReader reader) : base(reader) + { + } + + public override void Read() + { + base.Read(); + var comparsion = Reader.ReadInt16(); + Items = new List(); + while (true) + { + var expression = new Expression(Reader); + expression.Read(); + if (expression.ObjectType == 0) break; + Items.Add(expression); + } + + } + + public override void Write(ByteWriter Writer) + { + base.Write(Writer); + } + + public override string ToString() + { + return $"{(Items.Count > 0 ? "=="+Items[0].ToString() : " ")}";; + } + } +} \ No newline at end of file diff --git a/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/KeyParameter.cs b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/KeyParameter.cs new file mode 100644 index 0000000..e6051f0 --- /dev/null +++ b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/KeyParameter.cs @@ -0,0 +1,31 @@ +using System.Runtime.InteropServices; +using CTFAK.Utils; + +namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters +{ + public class KeyParameter:ParameterCommon + { + public short Key; + + public KeyParameter(ByteReader reader) : base(reader) + { + } + + public override void Read() + { + base.Read(); + Key = Reader.ReadInt16(); + } + + public override void Write(ByteWriter Writer) + { + base.Write(Writer); + Writer.WriteInt16(Key); + } + + public override string ToString() + { + return "Key-" + Key; + } + } +} \ No newline at end of file diff --git a/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/ParameterCommon.cs b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/ParameterCommon.cs index 0b3cbad..99a6830 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/ParameterCommon.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/ParameterCommon.cs @@ -3,7 +3,7 @@ using CTFAK.Utils; namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters { - class ParameterCommon : DataLoader + public class ParameterCommon : DataLoader { diff --git a/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Position.cs b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Position.cs index 00e9544..b6fa233 100644 --- a/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Position.cs +++ b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Position.cs @@ -2,7 +2,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters { - class Position : ParameterCommon + public class Position : ParameterCommon { public int ObjectInfoParent; public int Flags; diff --git a/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Shoot.cs b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Shoot.cs new file mode 100644 index 0000000..26a24a9 --- /dev/null +++ b/CTFAK/MMFParser/EXE/Loaders/Events/Parameters/Shoot.cs @@ -0,0 +1,42 @@ +using CTFAK.Utils; + +namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters +{ + public class Shoot:ParameterCommon + { + public Position ShootPos; + public ushort ObjectInstance; + public ushort ObjectInfo; + public short ShootSpeed; + + public Shoot(ByteReader reader) : base(reader) + { + } + + public override void Read() + { + base.Read(); + ShootPos = new Position(Reader); + ShootPos.Read(); + ObjectInstance = Reader.ReadUInt16(); + ObjectInfo = Reader.ReadUInt16(); + Reader.Skip(4); + ShootSpeed = Reader.ReadInt16(); + } + + public override void Write(ByteWriter Writer) + { + base.Write(Writer); + ShootPos.Write(Writer); + Writer.WriteUInt16(ObjectInstance); + Writer.WriteUInt16(ObjectInfo); + Writer.Skip(4); + Writer.WriteInt16(ShootSpeed); + } + + public override string ToString() + { + return $"Shoot {ShootPos.X}x{ShootPos.Y}"; + } + } +} \ No newline at end of file diff --git a/CTFAK/MMFParser/MFA/Loaders/Events.cs b/CTFAK/MMFParser/MFA/Loaders/Events.cs index 24f871d..5e4b892 100644 --- a/CTFAK/MMFParser/MFA/Loaders/Events.cs +++ b/CTFAK/MMFParser/MFA/Loaders/Events.cs @@ -43,6 +43,7 @@ namespace CTFAK.MMFParser.MFA.Loaders public uint EventDataLen; public uint CommentDataLen; private byte[] _cache; + public bool _ifMFA; public Events(ByteReader reader) : base(reader) { @@ -71,6 +72,7 @@ namespace CTFAK.MMFParser.MFA.Loaders while (true) { EventGroup evGrp = new EventGroup(Reader); + evGrp.isMFA = true; evGrp.Read(); Items.Add(evGrp); if (Reader.Tell() >= end) break; @@ -391,7 +393,8 @@ namespace CTFAK.MMFParser.MFA.Loaders } else if (ObjectType == 2) { - // Writer.WriteAscii(Code); + Code = "OIC2"; + Writer.WriteAscii(Code); // if (Code == "OIC2") // { // Writer.AutoWriteUnicode(IconBuffer); diff --git a/CTFAK/MMFParser/MFA/Loaders/mfachunks/Counter.cs b/CTFAK/MMFParser/MFA/Loaders/mfachunks/Counter.cs index ff67285..34b0b75 100644 --- a/CTFAK/MMFParser/MFA/Loaders/mfachunks/Counter.cs +++ b/CTFAK/MMFParser/MFA/Loaders/mfachunks/Counter.cs @@ -64,11 +64,15 @@ namespace CTFAK.MMFParser.MFA.Loaders.mfachunks Writer.WriteInt32(CountType); Writer.WriteInt32(Width); Writer.WriteInt32(Height); - Writer.WriteInt32(Images.Count); - foreach (var item in Images) + Writer.WriteInt32(Images?.Count ?? 0); + if (Images != null) { - Writer.WriteUInt32((uint) item); + foreach (var item in Images) + { + Writer.WriteUInt32((uint) item); + } } + else Writer.WriteInt32(0); Writer.WriteUInt32(Font); } } diff --git a/CTFAK/MMFParser/Translation/PAME2MFA.cs b/CTFAK/MMFParser/Translation/PAME2MFA.cs index 8c41120..1bb7935 100644 --- a/CTFAK/MMFParser/Translation/PAME2MFA.cs +++ b/CTFAK/MMFParser/Translation/PAME2MFA.cs @@ -63,6 +63,7 @@ namespace CTFAK.MMFParser.Translation var graphicSettings = mfa.GraphicFlags; var flags = game.Header.Flags; var newFlags = game.Header.NewFlags; + mfa.Extensions.Clear(); //TODO:Flags, no setter mfa.WindowX = game.Header.WindowWidth; mfa.WindowY = game.Header.WindowHeight; @@ -228,9 +229,9 @@ namespace CTFAK.MMFParser.Translation newExt.ExtensionPrivate = itemLoader.ExtensionPrivate; newExt.ExtensionData = itemLoader.ExtensionData; newItem.Loader = newExt; - // var tuple = new Tuple(ext.Handle, ext.Name, "", - // ext.MagicNumber, ext.SubType); - // mfa.Extensions.Add(); + var tuple = new Tuple(ext.Handle, ext.Name, "", + ext.MagicNumber, ext.SubType); + // mfa.Extensions.Add(tuple); } else if (item.ObjectType == 3) @@ -280,13 +281,13 @@ namespace CTFAK.MMFParser.Translation newCount.Value = itemLoader.Counter.Initial; newCount.Maximum = itemLoader.Counter.Maximum; newCount.Minimum = itemLoader.Counter.Minimum; + newCount.Images=new List(){0}; if (counter == null) { newCount.DisplayType = 0; newCount.CountType = 0; newCount.Width = 0; newCount.Height = 0; - newCount.Images=new List(){0}; newCount.Font = 0; } else @@ -413,14 +414,15 @@ namespace CTFAK.MMFParser.Translation - + newFrame.Events = MFA.MFA.emptyEvents; + newFrame.Events._ifMFA = true; newFrame.Events.Version = 1028; foreach (var item in newFrame.Items) { var newObject = new EventObject((ByteReader) null); - newObject.Handle = (uint) item.Handle; + newObject.Handle = (uint) newFrame.Items.IndexOf(item);//(uint) item.Handle; newObject.Name = item.Name ?? ""; newObject.TypeName = ""; newObject.ItemType = (ushort) item.ObjectType; @@ -428,7 +430,7 @@ namespace CTFAK.MMFParser.Translation newObject.Flags = 0; newObject.ItemHandle = (uint) item.Handle; newObject.InstanceHandle = 0xFFFFFFFF; - //newFrame.Events.Objects.Add(newObject); + newFrame.Events.Objects.Add(newObject); } diff --git a/CTFAK/Utils/Helper.cs b/CTFAK/Utils/Helper.cs index 146cfa6..faafa2b 100644 --- a/CTFAK/Utils/Helper.cs +++ b/CTFAK/Utils/Helper.cs @@ -6,6 +6,7 @@ using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Text.RegularExpressions; +using System.Web.UI.Design.WebControls.WebParts; using System.Windows.Forms; using CTFAK.GUI.GUIComponents; using CTFAK.MMFParser.EXE; @@ -107,12 +108,58 @@ namespace CTFAK.Utils item = new Time(reader); } + if (code == 50) + { + item = new AlterableValue(reader); + } + + if (code == 32) + { + item = new Click(reader); + } + + if (code == 16) + { + item=new Position(reader); + } + + if (code == 18) + { + item=new Shoot(reader); + } + + if (code == 9 || code == 21) + { + item = new Create(reader); + } + + if (code == 14 || code == 44) + { + item = new KeyParameter(reader); + } + + + if (code == 6 || code == 7 || code == 35 || code == 36) + { + item = new Sample(reader); + } + if (code == 3 || code == 10 || code == 11 || code == 12 || code == 17 || code == 26 || code == 31 || code == 43 || code == 57 || code == 58 || code == 60 || code == 61) { item = new Short(reader); } + if (code == 15||code == 22||code == 23||code == 27||code == 28||code == 45||code == 46||code == 59||code == 62) + { + item = new ExpressionParameter(reader); + } + + if (code == 5 || code == 25 || code == 29 || code == 34 || code == 48 || code == 56) + { + item = new Int(reader); + } + return item; }