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;
}