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; public short CounterOffset; public 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 Movements Movements; 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); 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(); } } }