Ejemplo n.º 1
0
        PrtFile LoadImageHeader(Stream s, out Dictionary <int, uint[]> palettes)
        {
            var spriteCount = s.ReadUInt32();
            var h           = new PrtFile()
            {
                ImageCount  = (int)spriteCount,
                ImageHeader = new Op2Image[spriteCount]
            };

            palettes = new Dictionary <int, uint[]>();
            var rawFrames = h.ImageHeader;

            for (var f = 0; f < rawFrames.Length; f++)
            {
                var paddedWidth = s.ReadUInt32();
                var dataOffset  = s.ReadUInt32();
                var height      = s.ReadUInt32();
                var width       = s.ReadUInt32();
                var type        = s.ReadUInt16();
                var palette     = s.ReadUInt16();
                palettes.Add(f, framePalettes[palette]);

                var img = new Op2Image
                {
                    PaddedWidth = paddedWidth,
                    DataOffset  = dataOffset,
                    Height      = height,
                    Width       = width,
                    ImageType   = type,
                    Palette     = palette,
                };

                h.ImageHeader[f] = img;
            }

            h.AllGroupCount   = s.ReadInt32();
            h.AllFrameCount   = s.ReadInt32();
            h.AllPicCount     = s.ReadInt32();
            h.AllExtInfoCount = s.ReadInt32();
            return(h);
        }
Ejemplo n.º 2
0
        private bool IsPrt(Stream s)
        {
            var start = s.Position;
            var h     = new PrtFile()
            {
                ID       = s.ReadASCII(4),
                PalCount = s.ReadInt32(),
            };

            if (h.ID != "CPAL")
            {
                s.Position = start;
                return(false);
            }

            h.PalData = new Ppal[h.PalCount];

            // Parse palettes
            for (var i = 0; i < h.PalCount; i++)
            {
                var ppal = new Ppal
                {
                    ID            = s.ReadASCII(4),
                    Size          = s.ReadInt32(),
                    HeadID        = s.ReadASCII(4),
                    BytesPerEntry = s.ReadInt32(),
                    Unknown       = s.ReadInt32(),
                    DataID        = s.ReadASCII(4),
                    PalSize       = s.ReadInt32()
                };

                if (ppal.ID != "PPAL" || ppal.HeadID != "head" || ppal.DataID != "data")
                {
                    s.Position = start;
                    return(false);
                }

                var numPaletteEntries = ppal.PalSize / ppal.BytesPerEntry;

                ppal.PaletteData = new RgbQuad[numPaletteEntries];

                // Populate palette
                for (var j = 0; j < numPaletteEntries; j++)
                {
                    var rgba = new RgbQuad
                    {
                        Red      = s.ReadByte(),
                        Green    = s.ReadByte(),
                        Blue     = s.ReadByte(),
                        Reserved = s.ReadByte(),
                    };

                    ppal.PaletteData[j] = rgba;
                }

                h.PalData[i] = ppal;
            }

            h.ImageCount  = s.ReadInt32();
            h.ImageHeader = new Op2Image[h.ImageCount];

            for (var i = 0; i < h.ImageCount; i++)
            {
                var img = new Op2Image
                {
                    SizeScanline = s.ReadInt32(),
                };

                img.ImgData      = s.ReadBytes(img.SizeScanline);
                img.SizeX        = s.ReadInt32();
                img.SizeY        = s.ReadInt32();
                img.Unknown      = s.ReadInt16();
                img.Palette      = s.ReadInt16();
                h.ImageHeader[i] = img;
            }

            h.AllGroupCount   = s.ReadInt32();
            h.AllFrameCount   = s.ReadInt32();
            h.AllPicCount     = s.ReadInt32();
            h.AllExtInfoCount = s.ReadInt32();
            h.Groups          = new ImageGroup[h.AllGroupCount];

            for (var i = 0; i < h.AllGroupCount; i++)
            {
                var img = new ImageGroup
                {
                    Unknown1   = s.ReadInt32(),
                    SelLeft    = s.ReadInt32(),
                    SelTop     = s.ReadInt32(),
                    SelRight   = s.ReadInt32(),
                    SelBottom  = s.ReadInt32(),
                    CenterX    = s.ReadInt32(),
                    CenterY    = s.ReadInt32(),
                    Unknown8   = s.ReadInt32(),
                    FrameCount = s.ReadInt32()
                };

                img.Frames = new Op2Frame[img.FrameCount];

                for (var j = 0; j < img.FrameCount; j++)
                {
                    var frame = new Op2Frame
                    {
                        PicCount = s.ReadUInt8(),
                        Unknown  = s.ReadUInt8(),
                    };

                    frame.ExtUnknown1 = new BytePair[frame.PicCount >> 7];
                    for (var k = 0; k < frame.PicCount >> 7; k++)
                    {
                        var bp = new BytePair
                        {
                            Byte1 = s.ReadUInt8(),
                            Byte2 = s.ReadUInt8(),
                        };

                        frame.ExtUnknown1[k] = bp;
                    }

                    frame.ExtUnknown2 = new BytePair[frame.Unknown >> 7];
                    for (var k = 0; k < frame.Unknown >> 7; k++)
                    {
                        var bp = new BytePair
                        {
                            Byte1 = s.ReadUInt8(),
                            Byte2 = s.ReadUInt8(),
                        };

                        frame.ExtUnknown2[k] = bp;
                    }

                    frame.Pictures = new Op2Picture[frame.PicCount & 0x7F];
                    for (var k = 0; k < frame.Pictures.Length; k++)
                    {
                        var pic = new Op2Picture
                        {
                            ImgNumber = s.ReadInt16(),
                            Reserved  = s.ReadUInt8(),
                            PicOrder  = s.ReadUInt8(),
                            PosX      = s.ReadInt16(),
                            PosY      = s.ReadInt16()
                        };

                        frame.Pictures[k] = pic;
                    }

                    img.Frames[j] = frame;
                }

                img.GroupExtCount = s.ReadInt32();
                img.Extended      = new GroupExt[img.GroupExtCount];

                for (var j = 0; j < img.GroupExtCount; j++)
                {
                    var ext = new GroupExt
                    {
                        Unknown1 = s.ReadInt32(),
                        Unknown2 = s.ReadInt32(),
                        Unknown3 = s.ReadInt32(),
                        Unknown4 = s.ReadInt32(),
                    };

                    img.Extended[j] = ext;
                }

                h.Groups[i] = img;
            }

            file = h;

            return(true);
        }