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.
228 lines
7.2 KiB
C#
228 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"
|
|
}
|
|
);
|
|
|
|
private 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"
|
|
}
|
|
);
|
|
|
|
private BitDict new_flags = 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 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();
|
|
new_flags.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);
|
|
AlterableValues values = new AlterableValues(Reader);
|
|
values.Read();
|
|
// Console.WriteLine("Values done");
|
|
}
|
|
|
|
|
|
if (_stringsOffset != 0)
|
|
{
|
|
Reader.Seek(currentPosition + _stringsOffset);
|
|
AlterableStrings 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();
|
|
}
|
|
}
|
|
} |