EventReader fixes, parameter parser

master
1987kostya 4 years ago
parent d0f47a3ded
commit 919cda8a14

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

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.IO; using System.IO;
using CTFAK.MMFParser.EXE.Loaders; using CTFAK.MMFParser.EXE.Loaders;
using CTFAK.MMFParser.EXE.Loaders.Banks; using CTFAK.MMFParser.EXE.Loaders.Banks;
using CTFAK.MMFParser.EXE.Loaders.Events;
using CTFAK.Utils; using CTFAK.Utils;
namespace CTFAK.MMFParser.EXE namespace CTFAK.MMFParser.EXE
@ -264,7 +265,7 @@ namespace CTFAK.MMFParser.EXE
loader = new GlobalStrings(chunk); loader = new GlobalStrings(chunk);
break; break;
case 13117: case 13117:
// loader = new Events(chunk);//NOT WORKING loader = new Events(chunk);//NOT WORKING
break; break;
} }

@ -71,7 +71,9 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events
{ {
var eg = new EventGroup(Reader); var eg = new EventGroup(Reader);
eg.Read(); eg.Read();
if (Reader.Tell() >= endPosition) break;
} }
} }
else if (identifier == End) break; else if (identifier == End) break;
} }
@ -124,6 +126,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events
public int Size; public int Size;
public byte NumberOfConditions; public byte NumberOfConditions;
public byte NumberOfActions; public byte NumberOfActions;
public bool isMFA=false;
public EventGroup(Chunk chunk) : base(chunk) public EventGroup(Chunk chunk) : base(chunk)
{ {
@ -146,15 +149,25 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events
public override void Read() public override void Read()
{ {
var currentPosition = Reader.Tell(); var currentPosition = Reader.Tell();
Size = Reader.ReadInt16() * -1; Size = Reader.ReadInt16()*-1;
NumberOfConditions = Reader.ReadByte(); NumberOfConditions = Reader.ReadByte();
NumberOfActions = Reader.ReadByte(); NumberOfActions = Reader.ReadByte();
Flags = Reader.ReadUInt16(); Flags = Reader.ReadUInt16();
if (Settings.Build >= 284) if (Settings.Build >= 284)
{ {
var nop = Reader.ReadInt16(); if(isMFA)
IsRestricted = Reader.ReadInt32(); {
RestrictCpt = Reader.ReadInt32(); 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 else
{ {
@ -177,7 +190,6 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events
item.Read(); item.Read();
Actions.Add(item); Actions.Add(item);
} }
Reader.Seek(currentPosition + Size); Reader.Seek(currentPosition + Size);
} }
@ -190,9 +202,19 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events
newWriter.WriteUInt16(Flags); newWriter.WriteUInt16(Flags);
if (Settings.Build >= 284) if (Settings.Build >= 284)
{ {
newWriter.WriteInt16(0); if(isMFA)
newWriter.WriteInt32(IsRestricted); {
newWriter.WriteInt32(RestrictCpt); 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 else
{ {

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing;
using System.IO; using System.IO;
using CTFAK.Utils; using CTFAK.Utils;
@ -65,6 +66,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events
item.Read(); item.Read();
Items.Add(item); Items.Add(item);
} }
Logger.Log(this);
Reader.Seek(currentPosition + size); Reader.Seek(currentPosition + size);
@ -72,7 +74,7 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events
} }
public override string ToString() 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 ObjectInfo;
public int ObjectInfoList; public int ObjectInfoList;
public List<Parameter> Items = new List<Parameter>(); public List<Parameter> Items = new List<Parameter>();
public byte NumberOfParameters;
public Action(ByteReader reader) : base(reader) { } public Action(ByteReader reader) : base(reader) { }
public override void Write(ByteWriter Writer) public override void Write(ByteWriter Writer)
{ {
@ -124,14 +127,15 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events
ObjectInfoList = Reader.ReadInt16(); ObjectInfoList = Reader.ReadInt16();
Flags = Reader.ReadSByte(); Flags = Reader.ReadSByte();
OtherFlags = Reader.ReadSByte(); OtherFlags = Reader.ReadSByte();
var numberOfParameters=Reader.ReadByte(); NumberOfParameters = Reader.ReadByte();
DefType = Reader.ReadByte(); DefType = Reader.ReadByte();
for (int i = 0; i < DefType; i++) for (int i = 0; i < NumberOfParameters; i++)
{ {
var item = new Parameter(Reader); var item = new Parameter(Reader);
item.Read(); item.Read();
Items.Add(item); Items.Add(item);
} }
Logger.Log(this);
} }
@ -204,7 +208,11 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events
public override string ToString() public override string ToString()
{ {
if (Loader != null) return Loader.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;
using System.Windows.Forms.VisualStyles;
using CTFAK.Utils; using CTFAK.Utils;
namespace CTFAK.MMFParser.EXE.Loaders.Events.Expressions namespace CTFAK.MMFParser.EXE.Loaders.Events.Expressions
{ {
class Expression : DataLoader public class Expression : DataLoader
{ {
public Constants.ObjectType ObjectType; public Constants.ObjectType ObjectType;
public int Num; public int Num;
public int ObjectInfo; public int ObjectInfo;
public int ObjectInfoList; public int ObjectInfoList;
public object value;
public object floatValue;
public Expression(ByteReader reader) : base(reader) { } public Expression(ByteReader reader) : base(reader) { }
public override void Write(ByteWriter Writer) public override void Write(ByteWriter Writer)
{ {
@ -22,7 +25,66 @@ namespace CTFAK.MMFParser.EXE.Loaders.Events.Expressions
public override void Read() 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 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 namespace CTFAK.MMFParser.EXE.Loaders.Events.Parameters
{ {
class Position : ParameterCommon public class Position : ParameterCommon
{ {
public int ObjectInfoParent; public int ObjectInfoParent;
public int Flags; 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 EventDataLen;
public uint CommentDataLen; public uint CommentDataLen;
private byte[] _cache; private byte[] _cache;
public bool _ifMFA;
public Events(ByteReader reader) : base(reader) public Events(ByteReader reader) : base(reader)
{ {
@ -71,6 +72,7 @@ namespace CTFAK.MMFParser.MFA.Loaders
while (true) while (true)
{ {
EventGroup evGrp = new EventGroup(Reader); EventGroup evGrp = new EventGroup(Reader);
evGrp.isMFA = true;
evGrp.Read(); evGrp.Read();
Items.Add(evGrp); Items.Add(evGrp);
if (Reader.Tell() >= end) break; if (Reader.Tell() >= end) break;
@ -391,7 +393,8 @@ namespace CTFAK.MMFParser.MFA.Loaders
} }
else if (ObjectType == 2) else if (ObjectType == 2)
{ {
// Writer.WriteAscii(Code); Code = "OIC2";
Writer.WriteAscii(Code);
// if (Code == "OIC2") // if (Code == "OIC2")
// { // {
// Writer.AutoWriteUnicode(IconBuffer); // Writer.AutoWriteUnicode(IconBuffer);

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

@ -63,6 +63,7 @@ namespace CTFAK.MMFParser.Translation
var graphicSettings = mfa.GraphicFlags; var graphicSettings = mfa.GraphicFlags;
var flags = game.Header.Flags; var flags = game.Header.Flags;
var newFlags = game.Header.NewFlags; var newFlags = game.Header.NewFlags;
mfa.Extensions.Clear();
//TODO:Flags, no setter //TODO:Flags, no setter
mfa.WindowX = game.Header.WindowWidth; mfa.WindowX = game.Header.WindowWidth;
mfa.WindowY = game.Header.WindowHeight; mfa.WindowY = game.Header.WindowHeight;
@ -228,9 +229,9 @@ namespace CTFAK.MMFParser.Translation
newExt.ExtensionPrivate = itemLoader.ExtensionPrivate; newExt.ExtensionPrivate = itemLoader.ExtensionPrivate;
newExt.ExtensionData = itemLoader.ExtensionData; newExt.ExtensionData = itemLoader.ExtensionData;
newItem.Loader = newExt; newItem.Loader = newExt;
// var tuple = new Tuple<int, string, string, int, byte[]>(ext.Handle, ext.Name, "", var tuple = new Tuple<int, string, string, int, string>(ext.Handle, ext.Name, "",
// ext.MagicNumber, ext.SubType); ext.MagicNumber, ext.SubType);
// mfa.Extensions.Add(); // mfa.Extensions.Add(tuple);
} }
else if (item.ObjectType == 3) else if (item.ObjectType == 3)
@ -280,13 +281,13 @@ namespace CTFAK.MMFParser.Translation
newCount.Value = itemLoader.Counter.Initial; newCount.Value = itemLoader.Counter.Initial;
newCount.Maximum = itemLoader.Counter.Maximum; newCount.Maximum = itemLoader.Counter.Maximum;
newCount.Minimum = itemLoader.Counter.Minimum; newCount.Minimum = itemLoader.Counter.Minimum;
newCount.Images=new List<int>(){0};
if (counter == null) if (counter == null)
{ {
newCount.DisplayType = 0; newCount.DisplayType = 0;
newCount.CountType = 0; newCount.CountType = 0;
newCount.Width = 0; newCount.Width = 0;
newCount.Height = 0; newCount.Height = 0;
newCount.Images=new List<int>(){0};
newCount.Font = 0; newCount.Font = 0;
} }
else else
@ -413,14 +414,15 @@ namespace CTFAK.MMFParser.Translation
newFrame.Events = MFA.MFA.emptyEvents; newFrame.Events = MFA.MFA.emptyEvents;
newFrame.Events._ifMFA = true;
newFrame.Events.Version = 1028; newFrame.Events.Version = 1028;
foreach (var item in newFrame.Items) foreach (var item in newFrame.Items)
{ {
var newObject = new EventObject((ByteReader) null); 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.Name = item.Name ?? "";
newObject.TypeName = ""; newObject.TypeName = "";
newObject.ItemType = (ushort) item.ObjectType; newObject.ItemType = (ushort) item.ObjectType;
@ -428,7 +430,7 @@ namespace CTFAK.MMFParser.Translation
newObject.Flags = 0; newObject.Flags = 0;
newObject.ItemHandle = (uint) item.Handle; newObject.ItemHandle = (uint) item.Handle;
newObject.InstanceHandle = 0xFFFFFFFF; 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.Linq;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using System.Web.UI.Design.WebControls.WebParts;
using System.Windows.Forms; using System.Windows.Forms;
using CTFAK.GUI.GUIComponents; using CTFAK.GUI.GUIComponents;
using CTFAK.MMFParser.EXE; using CTFAK.MMFParser.EXE;
@ -107,12 +108,58 @@ namespace CTFAK.Utils
item = new Time(reader); 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 || 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) code == 43 || code == 57 || code == 58 || code == 60 || code == 61)
{ {
item = new Short(reader); 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; return item;
} }

Loading…
Cancel
Save