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.

230 lines
7.2 KiB
C#

using System;
using System.Drawing;
using DotNetCTFDumper.Utils;
namespace DotNetCTFDumper.MMFParser.EXE.Loaders.Objects
{
public class ObjectCommon : ChunkLoader
{
private short _valuesOffset;
private short _stringsOffset;
private byte[] Identifier;
private int _fadeinOffset;
private int _fadeoutOffset;
private ushort _movementsOffset;
private short _animationsOffset;
private short _systemObjectOffset;
private short _counterOffset;
private short _extensionOffset;
public Animations Animations;
private long _end;
private BitDict preferences = new BitDict(new string[]
{
"Backsave",
"ScrollingIndependant",
"QuickDisplay",
"Sleep",
"LoadOnCall",
"Global",
"BackEffects",
"Kill",
"InkEffects",
"Transitions",
"FineCollisions",
"AppletProblems"
}
);
public BitDict Flags = new BitDict(new string[]
{
"DisplayInFront",
"Background",
"Backsave",
"RunBeforeFadeIn",
"Movements",
"Animations",
"TabStop",
"WindowProc",
"Values",
"Sprites",
"InternalBacksave",
"ScrollingIndependant",
"QuickDisplay",
"NeverKill",
"NeverSleep",
"ManualSleep",
"Text",
"DoNotCreateAtStart",
"FakeSprite",
"FakeCollisions"
}
);
public BitDict NewFlags = new BitDict(new string[]
{
"DoNotSaveBackground",
"SolidBackground",
"CollisionBox",
"VisibleAtStart",
"ObstacleSolid",
"ObstaclePlatform",
"AutomaticRotation"
}
);
public Color BackColor;
public ObjectInfo Parent;
public Counters Counters;
public byte[] ExtensionData;
public int ExtensionPrivate;
public int ExtensionId;
public int ExtensionVersion;
public AlterableValues Values;
public AlterableStrings Strings;
public ObjectCommon(ByteReader reader) : base(reader)
{
}
public ObjectCommon(ByteReader reader,ObjectInfo parent) : base(reader)
{
Parent = parent;
}
public ObjectCommon(ChunkList.Chunk chunk) : base(chunk)
{
}
public override void Read()
{
if (Parent.ObjectType != 2) return;
long currentPosition = Reader.Tell();
int size = Reader.ReadInt32();
bool newobj = Settings.Build >= 284;
if (newobj)
{
_animationsOffset = (short) Reader.ReadUInt16();
_movementsOffset = Reader.ReadUInt16();
}
else
{
_movementsOffset = Reader.ReadUInt16();
_animationsOffset = Reader.ReadInt16();
}
short version = Reader.ReadInt16();
_counterOffset = (short) Reader.ReadUInt16();
_systemObjectOffset = (short) Reader.ReadUInt16();
Flags.flag = Reader.ReadUInt32();
var end = Reader.Tell() + 16;
Reader.Seek(end);
if (newobj)
{
_systemObjectOffset = Reader.ReadInt16();
}
else
{
_extensionOffset = Reader.ReadInt16();
}
_valuesOffset = Reader.ReadInt16();
_stringsOffset = Reader.ReadInt16();
NewFlags.flag = Reader.ReadUInt16();
preferences.flag = Reader.ReadUInt16();
byte[] identifier = Reader.ReadFourCc();
BackColor = Reader.ReadColor();
_fadeinOffset = Reader.ReadInt32();
_fadeoutOffset = Reader.ReadInt32();
if (_movementsOffset != 0)
{
//Reader.Seek(currentPosition+_movementsOffset);
//var movements = new Movements(Reader);
//movements.Read();
// Console.WriteLine("Movements done");
}
if (_valuesOffset != 0)
{
Reader.Seek(currentPosition + _valuesOffset);
Values = new AlterableValues(Reader);
Values.Read();
// Console.WriteLine("Values done");
}
if (_stringsOffset != 0)
{
Reader.Seek(currentPosition + _stringsOffset);
Strings = new AlterableStrings(Reader);
Strings.Read();
// Console.WriteLine("Strings done");
}
if (_animationsOffset != 0&& Parent.ObjectType==2)
{
Reader.Seek(currentPosition + _animationsOffset);
Animations = new Animations(Reader);
Animations.Read();
// Console.WriteLine("Animations done");
}
/*if (_counterOffset != 0)
{
Reader.Seek(currentPosition + _counterOffset);
var counter = new Counter(Reader);
counter.Read();
Console.WriteLine("Counters done");
}
if (_extensionOffset != 0)
{
var dataSize = Reader.ReadInt32() - 20;
ExtensionVersion = Reader.ReadInt32();
ExtensionId = Reader.ReadInt32();
ExtensionPrivate = Reader.ReadInt32();
if (dataSize != 0)
ExtensionData = Reader.ReadBytes(dataSize);
Console.WriteLine("Extensions Done");
}*/
if (_systemObjectOffset > 0)
{
Console.WriteLine("Reading System Object");
Reader.Seek(currentPosition+_systemObjectOffset);
if (Parent.ObjectType == ((int) Constants.ObjectType.Text) ||
Parent.ObjectType == ((int) Constants.ObjectType.Question))
{
//TODO; Text.read();
}
else if (Parent.ObjectType == ((int) Constants.ObjectType.Score) ||
Parent.ObjectType == ((int) Constants.ObjectType.Lives)||
Parent.ObjectType == ((int) Constants.ObjectType.Counter))
{
Counters = new Counters(Reader);
Counters.Read();
}
}
// Console.WriteLine("SysObjOff: " + _systemObjectOffset);
// Console.WriteLine("ExtOff: " + _extensionOffset);
}
public override void Print(bool ext)
{
throw new System.NotImplementedException();
}
public override string[] GetReadableData()
{
throw new System.NotImplementedException();
}
}
}