/// <summary> /// Constructs a list of mini-animations from a file stream, starting with the beginning pointer table. /// </summary> /// <param name="stream">Stream to read from, starting with a pointer table to sub-mini anims.</param> public MiniAnimGroup(Stream stream) { Pointer = stream.Position; int firstAnimPointer = int.MaxValue; while (stream.Position < firstAnimPointer + Pointer) { int animationPointer = BNSAFile.ReadIntegerFromStream(stream); firstAnimPointer = Math.Min(firstAnimPointer, animationPointer); //should only be triggered by the first pointer as it goes ascending. long nextPosition = stream.Position; stream.Seek(Pointer + animationPointer, SeekOrigin.Begin); //Move cursor to start of minianim MiniAnim animation = new MiniAnim(stream, Pointer); IsValid &= animation.IsValid; if (!IsValid) { break; //Invalid data, stop caring and exit. } MiniAnimations.Add(animation); if (nextPosition < firstAnimPointer + Pointer) { //Read the next 4 bytes in the pointer table as its a new pointer stream.Seek(nextPosition, SeekOrigin.Begin); } } }
public Tileset(Stream stream, int index) { Pointer = stream.Position; Index = index; Console.WriteLine("Reading Tileset at 0x" + Pointer.ToString("X2")); BitmapSize = BNSAFile.ReadIntegerFromStream(stream); BitmapData = new byte[BitmapSize]; stream.Read(BitmapData, 0, BitmapSize); //Copy Export Memory stream.Seek(Pointer, SeekOrigin.Begin); Memory = new byte[BitmapSize + 4]; stream.Read(Memory, 0, BitmapSize + 4); }
/// <summary> /// Creates a new frame from the next 0x20 bytes of the given stream. /// </summary> /// <param name="stream">Stream to read a frame from</param> public Frame(Stream stream) { Pointer = stream.Position; TilesetPointer = BNSAFile.ReadIntegerFromStream(stream) + 0x4; PalettePointer = BNSAFile.ReadIntegerFromStream(stream) + 0x4; MiniAnimationPointer = BNSAFile.ReadIntegerFromStream(stream) + 0x4; OAMDataListPointer = BNSAFile.ReadIntegerFromStream(stream) + 0x4; FrameDelay = (byte)stream.ReadByte(); stream.ReadByte(); //constant 00? Flags = (byte)stream.ReadByte(); stream.ReadByte(); //constant 00 ? //Convenience Booleans EndFrame = (Flags & 0x80) != 0; Loops = (Flags & 0x40) != 0; //Copy Memory for Export stream.Seek(Pointer, SeekOrigin.Begin); Memory = new byte[20]; stream.Read(Memory, 0, 20); }
public OAMDataListGroup(Stream stream, int index) { Index = index; Pointer = stream.Position; Console.WriteLine("--Reading OAM Data List Pointer Table (Group) at 0x" + stream.Position.ToString("X2")); int firstOAMEntryPointer = int.MaxValue; while (stream.Position < firstOAMEntryPointer + Pointer) { int oamDataEntryPointer = BNSAFile.ReadIntegerFromStream(stream); firstOAMEntryPointer = Math.Min(firstOAMEntryPointer, oamDataEntryPointer); //should only be triggered by the first pointer as it goes ascending. long nextPosition = stream.Position; //Address of next pointer in the list stream.Seek(oamDataEntryPointer + Pointer, SeekOrigin.Begin); OAMDataList oamDataList = new OAMDataList(stream); OAMDataLists.Add(oamDataList); if (nextPosition < firstOAMEntryPointer + Pointer) { //Read the next 4 bytes in the pointer table as its a new pointer stream.Seek(nextPosition, SeekOrigin.Begin); } } }