public void ExtractFrames(string Path) { foreach (DrawGroup DGRP in m_DGRPs) { for (int i = 0; i < DGRP.NumberOfImages; i++) { DGRPImg Img = DGRP.GetImage(i); for (int j = 0; j < Img.SpriteInfoCount; j++) { SpriteInfo SprInfo = Img.GetSpriteInfo(j); for (int k = 0; k < SprInfo.Sprite.FrameCount; k++) { SpriteFrame Frame = SprInfo.Sprite.GetFrame(k); Bitmap BM = new Bitmap(Frame.Width, Frame.Height); Color Transparent = Color.FromArgb(SprInfo.Sprite.Pal.RGBTable[255].Red, SprInfo.Sprite.Pal.RGBTable[255].Green, SprInfo.Sprite.Pal.RGBTable[255].Blue); BinaryReader SpriteReader = new BinaryReader(Frame.SpriteData); for (int Y = 0; Y < Frame.Height; Y++) { byte Opcode = SpriteReader.ReadByte(); byte Data = SpriteReader.ReadByte(); switch (Opcode) { case 1: //Transparent pixels for (int X = 0; X < Frame.Width; X++) { BM.SetPixel(X, Y, Transparent); } break; case 2: byte Col = SpriteReader.ReadByte(); for (int X = 0; X < Frame.Width; X++) { BM.SetPixel(X, Y, GetColorFromPalette(Col, SprInfo)); } break; case 3: //Pixels byte Pixel = SpriteReader.ReadByte(); for (int X = 0; X < Frame.Width; X++) { BM.SetPixel(X, Y, GetColorFromPalette(Pixel, SprInfo)); } break; } } BM.Save(Path + "\\" + k.ToString() + ".bmp"); MessageBox.Show("Saved: " + Path + "\\" + k.ToString() + ".bmp!"); } } } } }
public void ProcessDGRPs() { List<IffChunk> DGRPs = new List<IffChunk>(); foreach (IffChunk Chunk in m_Chunks) { if (Chunk.Type == "DGRP") DGRPs.Add(Chunk); } foreach (IffChunk Chunk in DGRPs) { BinaryReader ChunkReader = new BinaryReader(new MemoryStream(Chunk.Data)); DrawGroup DGRP = new DrawGroup(); DGRP.Version = ChunkReader.ReadInt16(); if (DGRP.Version == 20000 || DGRP.Version == 20001) { DGRP.Count = Convert.ToInt32(ChunkReader.ReadBytes(2)); for (int i = 0; i < DGRP.Count; i++) { DGRPImg Img = new DGRPImg(); Img.SpriteInfoCount = Convert.ToInt32(ChunkReader.ReadBytes(2)); Img.DirFlags = ChunkReader.ReadByte(); Img.ZoomFactor = ChunkReader.ReadByte(); for (int j = 0; j < Img.SpriteInfoCount; j++) { SpriteInfo SInfo = new SpriteInfo(); SInfo.Tag = ChunkReader.ReadInt16(); SInfo.SprID = Convert.ToInt32(ChunkReader.ReadBytes(2)); SInfo.SprFrame = Convert.ToInt32(ChunkReader.ReadBytes(2)); SInfo.Flags = Convert.ToInt32(ChunkReader.ReadBytes(2)); SInfo.PixelX = Convert.ToInt32(ChunkReader.ReadBytes(2)); SInfo.PixelY = Convert.ToInt32(ChunkReader.ReadBytes(2)); if (DGRP.Version == 20001) SInfo.ZOffset = ChunkReader.ReadInt32(); SInfo.Sprite = new SPR2(); IffChunk TmpChunk = new IffChunk(); foreach (IffChunk C in m_Chunks) { if (C.TypeNum == SInfo.SprID) { if (C.Type == "SPR2") { TmpChunk = C; break; } } } BinaryReader SpriteReader = new BinaryReader(new MemoryStream(TmpChunk.Data)); SInfo.Sprite.Version1 = SpriteReader.ReadInt16(); if (SInfo.Sprite.Version1 == 0) SInfo.Sprite.Version2 = ReadBigShort(SpriteReader); else SInfo.Sprite.Version2 = SpriteReader.ReadInt16(); SInfo.Sprite.FrameCount = SpriteReader.ReadInt32(); SInfo.Sprite.PaletteID = SpriteReader.ReadInt32(); SInfo.Sprite.OffsetTable = new int[SInfo.Sprite.FrameCount]; for (int k = 0; k < SInfo.Sprite.FrameCount; k++) SInfo.Sprite.OffsetTable[k] = SpriteReader.ReadInt32(); for (int k = 0; k < SInfo.Sprite.FrameCount; k++) { SpriteFrame Frame = new SpriteFrame(); Frame.Width = SpriteReader.ReadInt16(); Frame.Height = SpriteReader.ReadInt16(); Frame.Flags = SpriteReader.ReadInt16(); Frame.Unknown = SpriteReader.ReadInt16(); Frame.PaletteID = SpriteReader.ReadInt16(); Frame.TransparentPixel = SpriteReader.ReadInt16(); Frame.XPos = SpriteReader.ReadInt16(); Frame.YPos = SpriteReader.ReadInt16(); BinaryWriter SpriteWriter = new BinaryWriter(Frame.SpriteData); for (int l = 0; l <= Frame.Height; l++) { SpriteWriter.Write(SpriteReader.ReadBytes(2)); SpriteWriter.Write(SpriteReader.ReadBytes(Frame.Width)); } SInfo.Sprite.AddFrame(Frame); SpriteWriter.Close(); } SpriteReader.Close(); //Each SPR2 resource contains a reference to a PALT chunk/resource. SInfo.Sprite.Pal = new Palette(); foreach (IffChunk C in m_Chunks) { if (C.TypeNum == SInfo.Sprite.PaletteID) { //Guess what? The typenumber of each chunk is //NOT unique, so you have to check on type as //well! if (C.Type == "PALT") { TmpChunk = C; break; } } } BinaryReader PaltReader = new BinaryReader(new MemoryStream(TmpChunk.Data)); SInfo.Sprite.Pal.AlwaysOne = PaltReader.ReadInt32(); SInfo.Sprite.Pal.Always256 = PaltReader.ReadInt32(); PaltReader.ReadBytes(8); //The PALT header has 8 additional bytes of 0. SInfo.Sprite.Pal.RGBTable = new Palette.RGB[SInfo.Sprite.Pal.Always256]; for (int l = 0; l < SInfo.Sprite.Pal.Always256; l++) { SInfo.Sprite.Pal.RGBTable[l] = new Palette.RGB(); SInfo.Sprite.Pal.RGBTable[l].Red = PaltReader.ReadByte(); SInfo.Sprite.Pal.RGBTable[l].Green = PaltReader.ReadByte(); SInfo.Sprite.Pal.RGBTable[l].Blue = PaltReader.ReadByte(); } PaltReader.Close(); Img.AddSpriteInfo(SInfo); } DGRP.AddImage(Img); } } else if (DGRP.Version == 20003 || DGRP.Version == 20004) { DGRP.Count = ChunkReader.ReadInt32(); for (int i = 0; i < DGRP.Count; i++) { DGRPImg Img = new DGRPImg(); Img.DirFlags = ChunkReader.ReadInt32(); Img.ZoomFactor = ChunkReader.ReadInt32(); Img.SpriteInfoCount = ChunkReader.ReadInt32(); //Each DrawGroup Image contains a number of SpriteInfo resources. for (int j = 0; j < Img.SpriteInfoCount; j++) { SpriteInfo SInfo = new SpriteInfo(); SInfo.SprID = ChunkReader.ReadInt32(); SInfo.SprFrame = ChunkReader.ReadInt32(); SInfo.PixelX = ChunkReader.ReadInt32(); SInfo.PixelY = ChunkReader.ReadInt32(); SInfo.ZOffset = ChunkReader.ReadInt32(); SInfo.Flags = ChunkReader.ReadInt32(); SInfo.XOffset = ChunkReader.ReadInt32(); SInfo.YOffset = ChunkReader.ReadInt32(); //Each SpriteInfo resource contains a reference to a SPR2 chunk/resource. SInfo.Sprite = new SPR2(); IffChunk TmpChunk = new IffChunk(); foreach (IffChunk C in m_Chunks) { if (C.TypeNum == SInfo.SprID) { //Guess what? The typenumber of each chunk is //NOT unique, so you have to check on type as //well! if (C.Type == "SPR2") { TmpChunk = C; break; } } } BinaryReader SpriteReader = new BinaryReader(new MemoryStream(TmpChunk.Data)); SInfo.Sprite.Version1 = SpriteReader.ReadInt16(); if (SInfo.Sprite.Version1 == 0) SInfo.Sprite.Version2 = ReadBigShort(SpriteReader); else SInfo.Sprite.Version2 = SpriteReader.ReadInt16(); SInfo.Sprite.FrameCount = SpriteReader.ReadInt32(); SInfo.Sprite.PaletteID = SpriteReader.ReadInt32(); SInfo.Sprite.OffsetTable = new int[SInfo.Sprite.FrameCount]; for (int k = 0; k < SInfo.Sprite.FrameCount; k++) SInfo.Sprite.OffsetTable[k] = SpriteReader.ReadInt32(); for (int k = 0; k < SInfo.Sprite.FrameCount; k++) { SpriteFrame Frame = new SpriteFrame(); Frame.Width = ReadBigShort(SpriteReader); MessageBox.Show("Frame.Width: " + Frame.Width.ToString()); Frame.Height = ReadBigShort(SpriteReader); MessageBox.Show("Frame.Height: " + Frame.Height.ToString()); Frame.Flags = SpriteReader.ReadInt16(); Frame.Unknown = ReadBigShort(SpriteReader); MessageBox.Show("Unknown: " + Frame.Unknown.ToString()); Frame.PaletteID = SpriteReader.ReadInt16(); Frame.TransparentPixel = SpriteReader.ReadInt16(); Frame.XPos = SpriteReader.ReadInt16(); Frame.YPos = SpriteReader.ReadInt16(); BinaryWriter SpriteWriter = new BinaryWriter(Frame.SpriteData); for (int l = 0; l <= Frame.Height; l++) { SpriteWriter.Write(SpriteReader.ReadBytes(2)); SpriteWriter.Write(SpriteReader.ReadBytes(Frame.Width)); } SInfo.Sprite.AddFrame(Frame); SpriteWriter.Close(); } SpriteReader.Close(); //Each SPR2 resource contains a reference to a PALT chunk/resource. SInfo.Sprite.Pal = new Palette(); foreach (IffChunk C in m_Chunks) { if (C.TypeNum == SInfo.Sprite.PaletteID) { //Guess what? The typenumber of each chunk is //NOT unique, so you have to check on type as //well! if (C.Type == "PALT") { TmpChunk = C; break; } } } BinaryReader PaltReader = new BinaryReader(new MemoryStream(TmpChunk.Data)); SInfo.Sprite.Pal.AlwaysOne = PaltReader.ReadInt32(); SInfo.Sprite.Pal.Always256 = PaltReader.ReadInt32(); PaltReader.ReadBytes(8); //The PALT header has 8 additional bytes of 0. SInfo.Sprite.Pal.RGBTable = new Palette.RGB[SInfo.Sprite.Pal.Always256]; for (int l = 0; l < SInfo.Sprite.Pal.Always256; l++) { SInfo.Sprite.Pal.RGBTable[l] = new Palette.RGB(); SInfo.Sprite.Pal.RGBTable[l].Red = PaltReader.ReadByte(); SInfo.Sprite.Pal.RGBTable[l].Green = PaltReader.ReadByte(); SInfo.Sprite.Pal.RGBTable[l].Blue = PaltReader.ReadByte(); } PaltReader.Close(); Img.AddSpriteInfo(SInfo); } DGRP.AddImage(Img); } } m_DGRPs.Add(DGRP); } }
public void ProcessDGRPs() { List <IffChunk> DGRPs = new List <IffChunk>(); foreach (IffChunk Chunk in m_Chunks) { if (Chunk.Type == "DGRP") { DGRPs.Add(Chunk); } } foreach (IffChunk Chunk in DGRPs) { BinaryReader ChunkReader = new BinaryReader(new MemoryStream(Chunk.Data)); DrawGroup DGRP = new DrawGroup(); DGRP.Version = ChunkReader.ReadInt16(); if (DGRP.Version == 20000 || DGRP.Version == 20001) { DGRP.Count = Convert.ToInt32(ChunkReader.ReadBytes(2)); for (int i = 0; i < DGRP.Count; i++) { DGRPImg Img = new DGRPImg(); Img.SpriteInfoCount = Convert.ToInt32(ChunkReader.ReadBytes(2)); Img.DirFlags = ChunkReader.ReadByte(); Img.ZoomFactor = ChunkReader.ReadByte(); for (int j = 0; j < Img.SpriteInfoCount; j++) { SpriteInfo SInfo = new SpriteInfo(); SInfo.Tag = ChunkReader.ReadInt16(); SInfo.SprID = Convert.ToInt32(ChunkReader.ReadBytes(2)); SInfo.SprFrame = Convert.ToInt32(ChunkReader.ReadBytes(2)); SInfo.Flags = Convert.ToInt32(ChunkReader.ReadBytes(2)); SInfo.PixelX = Convert.ToInt32(ChunkReader.ReadBytes(2)); SInfo.PixelY = Convert.ToInt32(ChunkReader.ReadBytes(2)); if (DGRP.Version == 20001) { SInfo.ZOffset = ChunkReader.ReadInt32(); } SInfo.Sprite = new SPR2(); IffChunk TmpChunk = new IffChunk(); foreach (IffChunk C in m_Chunks) { if (C.TypeNum == SInfo.SprID) { if (C.Type == "SPR2") { TmpChunk = C; break; } } } BinaryReader SpriteReader = new BinaryReader(new MemoryStream(TmpChunk.Data)); SInfo.Sprite.Version1 = SpriteReader.ReadInt16(); if (SInfo.Sprite.Version1 == 0) { SInfo.Sprite.Version2 = ReadBigShort(SpriteReader); } else { SInfo.Sprite.Version2 = SpriteReader.ReadInt16(); } SInfo.Sprite.FrameCount = SpriteReader.ReadInt32(); SInfo.Sprite.PaletteID = SpriteReader.ReadInt32(); SInfo.Sprite.OffsetTable = new int[SInfo.Sprite.FrameCount]; for (int k = 0; k < SInfo.Sprite.FrameCount; k++) { SInfo.Sprite.OffsetTable[k] = SpriteReader.ReadInt32(); } for (int k = 0; k < SInfo.Sprite.FrameCount; k++) { SpriteFrame Frame = new SpriteFrame(); Frame.Width = SpriteReader.ReadInt16(); Frame.Height = SpriteReader.ReadInt16(); Frame.Flags = SpriteReader.ReadInt16(); Frame.Unknown = SpriteReader.ReadInt16(); Frame.PaletteID = SpriteReader.ReadInt16(); Frame.TransparentPixel = SpriteReader.ReadInt16(); Frame.XPos = SpriteReader.ReadInt16(); Frame.YPos = SpriteReader.ReadInt16(); BinaryWriter SpriteWriter = new BinaryWriter(Frame.SpriteData); for (int l = 0; l <= Frame.Height; l++) { SpriteWriter.Write(SpriteReader.ReadBytes(2)); SpriteWriter.Write(SpriteReader.ReadBytes(Frame.Width)); } SInfo.Sprite.AddFrame(Frame); SpriteWriter.Close(); } SpriteReader.Close(); //Each SPR2 resource contains a reference to a PALT chunk/resource. SInfo.Sprite.Pal = new Palette(); foreach (IffChunk C in m_Chunks) { if (C.TypeNum == SInfo.Sprite.PaletteID) { //Guess what? The typenumber of each chunk is //NOT unique, so you have to check on type as //well! if (C.Type == "PALT") { TmpChunk = C; break; } } } BinaryReader PaltReader = new BinaryReader(new MemoryStream(TmpChunk.Data)); SInfo.Sprite.Pal.AlwaysOne = PaltReader.ReadInt32(); SInfo.Sprite.Pal.Always256 = PaltReader.ReadInt32(); PaltReader.ReadBytes(8); //The PALT header has 8 additional bytes of 0. SInfo.Sprite.Pal.RGBTable = new Palette.RGB[SInfo.Sprite.Pal.Always256]; for (int l = 0; l < SInfo.Sprite.Pal.Always256; l++) { SInfo.Sprite.Pal.RGBTable[l] = new Palette.RGB(); SInfo.Sprite.Pal.RGBTable[l].Red = PaltReader.ReadByte(); SInfo.Sprite.Pal.RGBTable[l].Green = PaltReader.ReadByte(); SInfo.Sprite.Pal.RGBTable[l].Blue = PaltReader.ReadByte(); } PaltReader.Close(); Img.AddSpriteInfo(SInfo); } DGRP.AddImage(Img); } } else if (DGRP.Version == 20003 || DGRP.Version == 20004) { DGRP.Count = ChunkReader.ReadInt32(); for (int i = 0; i < DGRP.Count; i++) { DGRPImg Img = new DGRPImg(); Img.DirFlags = ChunkReader.ReadInt32(); Img.ZoomFactor = ChunkReader.ReadInt32(); Img.SpriteInfoCount = ChunkReader.ReadInt32(); //Each DrawGroup Image contains a number of SpriteInfo resources. for (int j = 0; j < Img.SpriteInfoCount; j++) { SpriteInfo SInfo = new SpriteInfo(); SInfo.SprID = ChunkReader.ReadInt32(); SInfo.SprFrame = ChunkReader.ReadInt32(); SInfo.PixelX = ChunkReader.ReadInt32(); SInfo.PixelY = ChunkReader.ReadInt32(); SInfo.ZOffset = ChunkReader.ReadInt32(); SInfo.Flags = ChunkReader.ReadInt32(); SInfo.XOffset = ChunkReader.ReadInt32(); SInfo.YOffset = ChunkReader.ReadInt32(); //Each SpriteInfo resource contains a reference to a SPR2 chunk/resource. SInfo.Sprite = new SPR2(); IffChunk TmpChunk = new IffChunk(); foreach (IffChunk C in m_Chunks) { if (C.TypeNum == SInfo.SprID) { //Guess what? The typenumber of each chunk is //NOT unique, so you have to check on type as //well! if (C.Type == "SPR2") { TmpChunk = C; break; } } } BinaryReader SpriteReader = new BinaryReader(new MemoryStream(TmpChunk.Data)); SInfo.Sprite.Version1 = SpriteReader.ReadInt16(); if (SInfo.Sprite.Version1 == 0) { SInfo.Sprite.Version2 = ReadBigShort(SpriteReader); } else { SInfo.Sprite.Version2 = SpriteReader.ReadInt16(); } SInfo.Sprite.FrameCount = SpriteReader.ReadInt32(); SInfo.Sprite.PaletteID = SpriteReader.ReadInt32(); SInfo.Sprite.OffsetTable = new int[SInfo.Sprite.FrameCount]; for (int k = 0; k < SInfo.Sprite.FrameCount; k++) { SInfo.Sprite.OffsetTable[k] = SpriteReader.ReadInt32(); } for (int k = 0; k < SInfo.Sprite.FrameCount; k++) { SpriteFrame Frame = new SpriteFrame(); Frame.Width = ReadBigShort(SpriteReader); MessageBox.Show("Frame.Width: " + Frame.Width.ToString()); Frame.Height = ReadBigShort(SpriteReader); MessageBox.Show("Frame.Height: " + Frame.Height.ToString()); Frame.Flags = SpriteReader.ReadInt16(); Frame.Unknown = ReadBigShort(SpriteReader); MessageBox.Show("Unknown: " + Frame.Unknown.ToString()); Frame.PaletteID = SpriteReader.ReadInt16(); Frame.TransparentPixel = SpriteReader.ReadInt16(); Frame.XPos = SpriteReader.ReadInt16(); Frame.YPos = SpriteReader.ReadInt16(); BinaryWriter SpriteWriter = new BinaryWriter(Frame.SpriteData); for (int l = 0; l <= Frame.Height; l++) { SpriteWriter.Write(SpriteReader.ReadBytes(2)); SpriteWriter.Write(SpriteReader.ReadBytes(Frame.Width)); } SInfo.Sprite.AddFrame(Frame); SpriteWriter.Close(); } SpriteReader.Close(); //Each SPR2 resource contains a reference to a PALT chunk/resource. SInfo.Sprite.Pal = new Palette(); foreach (IffChunk C in m_Chunks) { if (C.TypeNum == SInfo.Sprite.PaletteID) { //Guess what? The typenumber of each chunk is //NOT unique, so you have to check on type as //well! if (C.Type == "PALT") { TmpChunk = C; break; } } } BinaryReader PaltReader = new BinaryReader(new MemoryStream(TmpChunk.Data)); SInfo.Sprite.Pal.AlwaysOne = PaltReader.ReadInt32(); SInfo.Sprite.Pal.Always256 = PaltReader.ReadInt32(); PaltReader.ReadBytes(8); //The PALT header has 8 additional bytes of 0. SInfo.Sprite.Pal.RGBTable = new Palette.RGB[SInfo.Sprite.Pal.Always256]; for (int l = 0; l < SInfo.Sprite.Pal.Always256; l++) { SInfo.Sprite.Pal.RGBTable[l] = new Palette.RGB(); SInfo.Sprite.Pal.RGBTable[l].Red = PaltReader.ReadByte(); SInfo.Sprite.Pal.RGBTable[l].Green = PaltReader.ReadByte(); SInfo.Sprite.Pal.RGBTable[l].Blue = PaltReader.ReadByte(); } PaltReader.Close(); Img.AddSpriteInfo(SInfo); } DGRP.AddImage(Img); } } m_DGRPs.Add(DGRP); } }