You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

245 lines
6.5 KiB
C#

using System;
using System.IO;
using System.Windows.Forms.VisualStyles;
using CTFAK.Utils;
namespace CTFAK.MMFParser.EXE.Loaders.Events.Expressions
{
public class Expression : DataLoader
{
public Constants.ObjectType ObjectType;
public int Num;
public int ObjectInfo;
public int ObjectInfoList;
public object value;
public object floatValue;
public DataLoader Loader;
public int Unk1;
public ushort Unk2;
public Expression(ByteReader reader) : base(reader) { }
public override void Write(ByteWriter Writer)
{
Writer.WriteInt16((short) ObjectType);
Writer.WriteInt16((short) Num);
if (ObjectType == 0 && Num == 0) return;
var newWriter = new ByteWriter(new MemoryStream());
if (ObjectType == Constants.ObjectType.System &&
(Num == 0 || Num == 3 || Num == 23 || Num == 24 || Num == 50))
{
if(Loader==null) throw new NotImplementedException("Broken expression: "+Num);
Loader.Write(newWriter);
}
else if ((int) ObjectType >= 2 || (int) ObjectType == -7)
{
newWriter.WriteInt16((short) ObjectInfo);
newWriter.WriteInt16((short) ObjectInfoList);
if(Num==16||Num==19)Loader.Write(newWriter);
}
newWriter.WriteInt32(0);
newWriter.WriteUInt16(0);
Writer.WriteInt16((short) ((newWriter.Size())));
Writer.WriteWriter(newWriter);
}
public override void Print()
{
throw new NotImplementedException();
}
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.ReadInt16();
if (ObjectType == Constants.ObjectType.System)
{
if(Num==0) Loader=new LongExp(Reader);
else if(Num==3) Loader= new StringExp(Reader);
else if (Num == 23) Loader = new DoubleExp(Reader);
else if (Num == 24) Loader = new GlobalCommon(Reader);
else if (Num == 50) Loader = null;
else if((int)ObjectType>=2|| (int)ObjectType==-7)
{
ObjectInfo = Reader.ReadUInt16();
ObjectInfoList = Reader.ReadInt16();
if (Num == 16 || Num == 19)
{
Loader = new ExtensionExp(Reader);
}
}
}
else if((int)ObjectType>=2|| (int)ObjectType==-7)
{
ObjectInfo = Reader.ReadUInt16();
ObjectInfoList = Reader.ReadInt16();
if (Num == 16 || Num == 19)
{
Loader = new ExtensionExp(Reader);
}
}
Loader?.Read();
// Unk1 = Reader.ReadInt32();
// Unk2 = Reader.ReadUInt16();
Reader.Seek(currentPosition+size);
}
public override string ToString()
{
return $"Expression {ObjectType}=={Num}: {((ExpressionLoader)Loader)?.Value}";
}
}
public class ExpressionLoader:DataLoader
{
public object Value;
public ExpressionLoader(ByteReader reader) : base(reader)
{
}
public ExpressionLoader(ChunkList.Chunk chunk) : base(chunk)
{
}
public override void Read()
{
throw new NotImplementedException();
}
public override void Write(ByteWriter Writer)
{
throw new NotImplementedException();
}
public override void Print()
{
throw new NotImplementedException();
}
}
public class StringExp:ExpressionLoader
{
public StringExp(ByteReader reader) : base(reader)
{
}
public StringExp(ChunkList.Chunk chunk) : base(chunk)
{
}
public override void Read()
{
Value = Reader.ReadWideString();
}
public override void Write(ByteWriter Writer)
{
Writer.WriteUnicode((string) Value,true);
}
public override void Print()
{
throw new NotImplementedException();
}
}
public class LongExp:ExpressionLoader
{
public int Val1;
public LongExp(ByteReader reader) : base(reader)
{
}
public LongExp(ChunkList.Chunk chunk) : base(chunk)
{
}
public override void Read()
{
Value = Reader.ReadInt32();
}
public override void Write(ByteWriter Writer)
{
Writer.WriteInt32((int) Value);
}
}
public class ExtensionExp:ExpressionLoader
{
public ExtensionExp(ByteReader reader) : base(reader)
{
}
public ExtensionExp(ChunkList.Chunk chunk) : base(chunk)
{
}
public override void Read()
{
Value = Reader.ReadInt16();
}
public override void Write(ByteWriter Writer)
{
Writer.WriteInt16((short) Value);
}
}
public class DoubleExp:ExpressionLoader
{
public float FloatValue;
public DoubleExp(ByteReader reader) : base(reader)
{
}
public DoubleExp(ChunkList.Chunk chunk) : base(chunk)
{
}
public override void Read()
{
Value = Reader.ReadDouble();
FloatValue = Reader.ReadSingle();
}
public override void Write(ByteWriter Writer)
{
Writer.WriteDouble((double) Value);
Writer.WriteSingle(FloatValue);
}
}
public class GlobalCommon:ExpressionLoader
{
public GlobalCommon(ByteReader reader) : base(reader)
{
}
public GlobalCommon(ChunkList.Chunk chunk) : base(chunk)
{
}
public override void Read()
{
Reader.ReadInt32();
Value = Reader.ReadInt32();
}
public override void Write(ByteWriter Writer)
{
Writer.WriteInt32(0);
Writer.WriteInt32((int) Value);
}
}
}