EventReader fixes, parameter parser

master
1987kostya 4 years ago
parent d0f47a3ded
commit 919cda8a14

@ -161,6 +161,10 @@
<Compile Include="GUI\MainForm.Designer.cs">
<DependentUpon>MainForm.cs</DependentUpon>
</Compile>
<Compile Include="MMFParser\EXE\Loaders\Events\Parameters\Click.cs" />
<Compile Include="MMFParser\EXE\Loaders\Events\Parameters\ExpressionParameter.cs" />
<Compile Include="MMFParser\EXE\Loaders\Events\Parameters\KeyParameter.cs" />
<Compile Include="MMFParser\EXE\Loaders\Events\Parameters\Shoot.cs" />
<Compile Include="MMFParser\EXE\Loaders\Extensions.cs" />
<Compile Include="MMFParser\EXE\Loaders\Objects\Movements.cs" />
<Compile Include="MMFParser\EXE\Loaders\Objects\Text.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;
}

@ -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,16 +149,26 @@ 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)
{
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
{
IsRestricted = Reader.ReadInt16();
@ -177,7 +190,6 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events
item.Read();
Actions.Add(item);
}
Reader.Seek(currentPosition + Size);
}
@ -189,11 +201,21 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events
newWriter.WriteInt8(NumberOfActions);
newWriter.WriteUInt16(Flags);
if (Settings.Build >= 284)
{
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
{
newWriter.WriteInt16((short) IsRestricted);

@ -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<Parameter> Items = new List<Parameter>();
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}";
}
}
}

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

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

@ -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<Expression> Items;
public ExpressionParameter(ByteReader reader) : base(reader)
{
}
public override void Read()
{
base.Read();
var comparsion = Reader.ReadInt16();
Items = new List<Expression>();
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() : " ")}";;
}
}
}

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

@ -3,7 +3,7 @@ using CTFAK.Utils;
namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters
{
class ParameterCommon : DataLoader
public class ParameterCommon : DataLoader
{

@ -2,7 +2,7 @@
namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters
{
class Position : ParameterCommon
public class Position : ParameterCommon
{
public int ObjectInfoParent;
public int Flags;

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

@ -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);

@ -64,11 +64,15 @@ namespace CTFAK.MMFParser.MFA.Loaders.mfachunks
Writer.WriteInt32(CountType);
Writer.WriteInt32(Width);
Writer.WriteInt32(Height);
Writer.WriteInt32(Images.Count);
Writer.WriteInt32(Images?.Count ?? 0);
if (Images != null)
{
foreach (var item in Images)
{
Writer.WriteUInt32((uint) item);
}
}
else Writer.WriteInt32(0);
Writer.WriteUInt32(Font);
}
}

@ -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<int, string, string, int, byte[]>(ext.Handle, ext.Name, "",
// ext.MagicNumber, ext.SubType);
// mfa.Extensions.Add();
var tuple = new Tuple<int, string, string, int, string>(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<int>(){0};
if (counter == null)
{
newCount.DisplayType = 0;
newCount.CountType = 0;
newCount.Width = 0;
newCount.Height = 0;
newCount.Images=new List<int>(){0};
newCount.Font = 0;
}
else
@ -415,12 +416,13 @@ 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);
}

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

Loading…
Cancel
Save