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.
399 lines
10 KiB
C#
399 lines
10 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Drawing;
|
|
using CTFAK.Utils;
|
|
|
|
namespace CTFAK.MMFParser.EXE.Loaders
|
|
{
|
|
class FrameName : StringChunk
|
|
{
|
|
public FrameName(ByteReader reader) : base(reader)
|
|
{
|
|
}
|
|
|
|
public FrameName(ChunkList.Chunk chunk) : base(chunk)
|
|
{
|
|
}
|
|
}
|
|
|
|
class FramePassword : StringChunk
|
|
{
|
|
public FramePassword(ByteReader reader) : base(reader)
|
|
{
|
|
}
|
|
|
|
public FramePassword(ChunkList.Chunk chunk) : base(chunk)
|
|
{
|
|
}
|
|
}
|
|
|
|
public class Frame : ChunkLoader
|
|
{
|
|
public BitDict Flags=new BitDict(new string[]
|
|
{
|
|
"XCoefficient",
|
|
"YCoefficient",
|
|
"DoNotSaveBackground",
|
|
"Wrap",
|
|
"Visible",
|
|
"WrapHorizontally",
|
|
"WrapVertically",
|
|
"","","","","","","","","",
|
|
"Redraw",
|
|
"ToHide",
|
|
"ToShow"
|
|
});
|
|
|
|
public ChunkList Chunks;
|
|
private FrameHeader _header;
|
|
private FrameName _name;
|
|
private FramePassword _password;
|
|
private FramePalette _palette;
|
|
private Layers _layers;
|
|
private ObjectInstances _objects;
|
|
private Events.Events _events;
|
|
private Transition _fadeIn;
|
|
private Transition _fadeOut;
|
|
|
|
|
|
public override void Print(bool ext)
|
|
{
|
|
Logger.Log($"Frame: {_name}", true, ConsoleColor.Green);
|
|
Logger.Log($" Password: {Password}", true, ConsoleColor.Green);
|
|
Logger.Log($" Size: {Width}x{Height}", true, ConsoleColor.Green);
|
|
Logger.Log($" Objects: {_objects.CountOfObjects}", true, ConsoleColor.Green);
|
|
Logger.Log($"-------------------------", true, ConsoleColor.Green);
|
|
}
|
|
|
|
public override string[] GetReadableData()
|
|
{
|
|
return new string[]
|
|
{
|
|
$"Name: {_name}",
|
|
$"Size: {Width}x{Height}",
|
|
$"Objects: {_objects.CountOfObjects}"
|
|
|
|
};
|
|
}
|
|
|
|
public override void Read()
|
|
{
|
|
var frameReader = new ByteReader(Chunk.ChunkData);
|
|
Chunks = new ChunkList();
|
|
Chunks.Read(frameReader);
|
|
|
|
Logger.Log(Properties.GlobalStrings.readingFrame+" "+_name,true,ConsoleColor.Green);
|
|
|
|
_header = Chunks.GetChunk<FrameHeader>();
|
|
_name = Chunks.GetChunk<FrameName>();
|
|
_password = Chunks.GetChunk<FramePassword>();
|
|
_palette = Chunks.GetChunk<FramePalette>();
|
|
_layers = Chunks.GetChunk<Layers>();
|
|
_objects = Chunks.GetChunk<ObjectInstances>();
|
|
_events = Chunks.GetChunk<Events.Events>();
|
|
|
|
_fadeIn = Chunks.PopChunk<Transition>();
|
|
_fadeOut = Chunks.PopChunk<Transition>();
|
|
|
|
Flags.flag = _header.Flags.flag;
|
|
}
|
|
|
|
public int Width => _header.Width;
|
|
public int Height => _header.Height;
|
|
public string Name => _name.Value;
|
|
public string Password => _password.Value;
|
|
public Color Background => _header.Background;
|
|
public List<ObjectInstance> Objects => _objects?.Items ?? null;
|
|
public List<Color> Palette => _palette.Items;
|
|
public Events.Events Events => _events;
|
|
public List<Layer> Layers => _layers.Items;
|
|
|
|
|
|
public Frame(ByteReader reader) : base(reader){}
|
|
public Frame(ChunkList.Chunk chunk) : base(chunk){}
|
|
|
|
}
|
|
|
|
public class FrameHeader : ChunkLoader
|
|
{
|
|
public int Width;
|
|
public int Height;
|
|
public BitDict Flags = new BitDict(new string[]
|
|
{
|
|
"XCoefficient",
|
|
"YCoefficient",
|
|
"DoNotSaveBackground",
|
|
"Wrap",
|
|
"Visible",
|
|
"WrapHorizontally",
|
|
"WrapVertically","","","","","","","","","",
|
|
"Redraw",
|
|
"ToHide",
|
|
"ToShow"
|
|
|
|
});
|
|
public Color Background;
|
|
public FrameHeader(ByteReader reader) : base(reader)
|
|
{
|
|
}
|
|
|
|
public FrameHeader(ChunkList.Chunk chunk) : base(chunk)
|
|
{
|
|
}
|
|
|
|
public override void Print(bool ext)
|
|
{
|
|
|
|
}
|
|
|
|
public override string[] GetReadableData()
|
|
{
|
|
return new string[]
|
|
{
|
|
$"Size: {Width}x{Height}",
|
|
$"Flags:;{Flags.ToString()}"
|
|
|
|
};
|
|
}
|
|
|
|
public override void Read()
|
|
{
|
|
Width = Reader.ReadInt32();
|
|
Height = Reader.ReadInt32();
|
|
Background = Reader.ReadColor();
|
|
Flags.flag = Reader.ReadUInt32();
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
public class ObjectInstances : ChunkLoader
|
|
{
|
|
|
|
public int CountOfObjects=0;
|
|
public List<ObjectInstance> Items = new List<ObjectInstance>();
|
|
|
|
public ObjectInstances(ByteReader reader) : base(reader)
|
|
{
|
|
}
|
|
|
|
public ObjectInstances(ChunkList.Chunk chunk) : base(chunk)
|
|
{
|
|
}
|
|
|
|
public override void Print(bool ext)
|
|
{
|
|
|
|
}
|
|
|
|
public override string[] GetReadableData()
|
|
{
|
|
return new string[]
|
|
{
|
|
$"Number of objects: {CountOfObjects}"
|
|
};
|
|
}
|
|
|
|
public override void Read()
|
|
{
|
|
|
|
CountOfObjects = Reader.ReadInt32();
|
|
for (int i = 0; i < CountOfObjects; i++)
|
|
{
|
|
var item = new ObjectInstance(Reader);
|
|
item.Read();
|
|
Items.Add(item);
|
|
}
|
|
Reader.Skip(4);
|
|
}
|
|
}
|
|
|
|
public class ObjectInstance : ChunkLoader
|
|
{
|
|
public ushort Handle;
|
|
public ushort ObjectInfo;
|
|
public int X;
|
|
public int Y;
|
|
public short ParentType;
|
|
public short Layer;
|
|
public string Name;
|
|
public short ParentHandle;
|
|
|
|
public ObjectInstance(ByteReader reader) : base(reader)
|
|
{
|
|
}
|
|
|
|
public ObjectInstance(ChunkList.Chunk chunk) : base(chunk)
|
|
{
|
|
}
|
|
|
|
public override void Read()
|
|
{
|
|
Handle = (ushort) Reader.ReadInt16();
|
|
ObjectInfo = (ushort) Reader.ReadInt16();
|
|
X = Reader.ReadInt32();
|
|
Y = Reader.ReadInt32();
|
|
ParentType = Reader.ReadInt16();
|
|
ParentHandle = Reader.ReadInt16();
|
|
Layer = Reader.ReadInt16();
|
|
var reserved = Reader.ReadInt16();
|
|
|
|
//-------------------------
|
|
if (FrameItem != null) Name = FrameItem.Name;
|
|
else Name = $"UNKNOWN-{Handle}";
|
|
|
|
}
|
|
|
|
public ObjectInfo FrameItem
|
|
{
|
|
get
|
|
{
|
|
if (Exe.Instance.GameData.GameChunks.GetChunk<FrameItems>() == null) return null;
|
|
return Exe.Instance.GameData.GameChunks.GetChunk<FrameItems>().FromHandle(ObjectInfo);
|
|
}
|
|
}
|
|
|
|
public override void Print(bool ext)
|
|
{
|
|
throw new NotImplementedException();
|
|
}
|
|
|
|
public override string[] GetReadableData()
|
|
{
|
|
return new string[]
|
|
{
|
|
$"Name: {Name}",
|
|
$"Type:{(Constants.ObjectType)FrameItem.ObjectType} - {FrameItem.ObjectType}",
|
|
$"Position: {X,5}x{Y,5}",
|
|
$"Size: NotImplementedYet"
|
|
|
|
};
|
|
}
|
|
}
|
|
|
|
public class Layers : ChunkLoader
|
|
{
|
|
public List<Layer> Items;
|
|
|
|
public Layers(ByteReader reader) : base(reader)
|
|
{
|
|
}
|
|
|
|
public Layers(ChunkList.Chunk chunk) : base(chunk)
|
|
{
|
|
}
|
|
|
|
public override void Read()
|
|
{
|
|
Items = new List<Layer>();
|
|
var count = Reader.ReadUInt32();
|
|
for (int i = 0; i < count; i++)
|
|
{
|
|
Layer item = new Layer(Reader);
|
|
item.Read();
|
|
Items.Add(item);
|
|
}
|
|
|
|
}
|
|
|
|
public override void Print(bool ext)
|
|
{
|
|
throw new NotImplementedException();
|
|
}
|
|
|
|
public override string[] GetReadableData()
|
|
{
|
|
throw new NotImplementedException();
|
|
}
|
|
}
|
|
|
|
public class Layer : ChunkLoader
|
|
{
|
|
public string Name;
|
|
public BitDict Flags = new BitDict(new string[]
|
|
{
|
|
"XCoefficient",
|
|
"YCoefficient",
|
|
"DoNotSaveBackground",
|
|
"",
|
|
"Visible",
|
|
"WrapHorizontally",
|
|
"WrapVertically",
|
|
"", "", "", "",
|
|
"", "", "", "", "",
|
|
"Redraw",
|
|
"ToHide",
|
|
"ToShow"
|
|
}
|
|
|
|
);
|
|
public float XCoeff;
|
|
public float YCoeff;
|
|
public int NumberOfBackgrounds;
|
|
public int BackgroudIndex;
|
|
|
|
|
|
public Layer(ByteReader reader) : base(reader)
|
|
{
|
|
}
|
|
|
|
public Layer(ChunkList.Chunk chunk) : base(chunk)
|
|
{
|
|
}
|
|
|
|
public override void Read()
|
|
{
|
|
Flags.flag = Reader.ReadUInt32();
|
|
XCoeff = Reader.ReadSingle();
|
|
YCoeff = Reader.ReadSingle();
|
|
NumberOfBackgrounds = Reader.ReadInt32();
|
|
BackgroudIndex = Reader.ReadInt32();
|
|
Name = Reader.ReadWideString();
|
|
}
|
|
|
|
public override void Print(bool ext)
|
|
{
|
|
throw new NotImplementedException();
|
|
}
|
|
|
|
public override string[] GetReadableData()
|
|
{
|
|
throw new NotImplementedException();
|
|
}
|
|
}
|
|
|
|
public class FramePalette : ChunkLoader
|
|
{
|
|
public List<Color> Items;
|
|
|
|
public FramePalette(ByteReader reader) : base(reader)
|
|
{
|
|
}
|
|
|
|
public FramePalette(ChunkList.Chunk chunk) : base(chunk)
|
|
{
|
|
}
|
|
|
|
public override void Read()
|
|
{
|
|
Items = new List<Color>();
|
|
for (int i = 0; i < 257; i++)
|
|
{
|
|
Items.Add(Reader.ReadColor());
|
|
}
|
|
}
|
|
|
|
public override void Print(bool ext)
|
|
{
|
|
throw new NotImplementedException();
|
|
}
|
|
|
|
public override string[] GetReadableData()
|
|
{
|
|
throw new NotImplementedException();
|
|
}
|
|
}
|
|
|
|
|
|
} |