Ejemplo n.º 1
0
        public void SetActiveResource(IffChunk chunk, GameIffResource res)
        {
            GraphicChunk = (SPR2)chunk;
            ActiveIff    = res;

            FrameList.Items.Clear();
            for (int i = 0; i < GraphicChunk.Frames.Length / 3; i++)
            {
                FrameList.Items.Add("Rotation " + i);
            }

            bool hasFrames = (FrameList.Items.Count > 0);

            Graphics = null;
            if (hasFrames)
            {
                FrameList.SelectedIndex = 0;
            }
            else
            {
                SPRBox1.Image = null;
                SPRBox2.Image = null;
                SPRBox3.Image = null;
            }
            DeleteButton.Enabled = hasFrames;
            ImportButton.Enabled = hasFrames;
            ExportButton.Enabled = hasFrames;
            ImportAll.Enabled    = hasFrames;
            ExportAll.Enabled    = hasFrames;
        }
        public override void Draw(GraphicsDevice device, WorldState world)
        {
            if (_Dirty)
            {
                if (_Floor == null)
                {
                    _Floor = Content.Get().WorldFloors.Get((ulong)_FloorID);
                    if (_Floor != null)
                    {
                        _Sprite = new _2DSprite
                        {
                            RenderMode = _2DBatchRenderMode.NO_DEPTH
                        };
                    }
                }
                if (_DirtyTexture && _Floor != null)
                {
                    SPR2 sprite = null;
                    switch (world.Zoom)
                    {
                    case WorldZoom.Far:
                        sprite           = _Floor.Far;
                        _Sprite.DestRect = DESTINATION_FAR;
                        break;

                    case WorldZoom.Medium:
                        sprite           = _Floor.Medium;
                        _Sprite.DestRect = DESTINATION_MED;
                        break;

                    case WorldZoom.Near:
                        sprite           = _Floor.Near;
                        _Sprite.DestRect = DESTINATION_NEAR;
                        break;
                    }
                    if (world.Rotation == WorldRotation.TopRight || world.Rotation == WorldRotation.BottomRight)
                    {
                        _Sprite.FlipVertically = true;
                    }
                    if ((int)world.Rotation > 1)
                    {
                        _Sprite.FlipHorizontally = true;                          //todo - find out why these don't work (really it is a mystery)
                    }
                    _Sprite.Pixel   = world._2D.GetTexture(sprite.Frames[0]);
                    _Sprite.SrcRect = new Microsoft.Xna.Framework.Rectangle(0, 0, _Sprite.Pixel.Width, _Sprite.Pixel.Height);
                }

                _DirtyTexture = false;
                _Dirty        = false;
            }

            if (_Sprite != null)
            {
                world._2D.Draw(_Sprite);
            }
        }
Ejemplo n.º 3
0
        private _2DSprite GetFloorSprite(Floor pattern, int rotation, WorldState world)
        {
            var _Sprite = new _2DSprite()
            {
                RenderMode = _2DBatchRenderMode.Z_BUFFER
            };

            if (pattern == null)
            {
                return(_Sprite);
            }
            SPR2 sprite   = null;
            bool vertFlip = world.Rotation == WorldRotation.TopRight || world.Rotation == WorldRotation.BottomRight;
            int  bufOff   = (vertFlip) ? 3 : 0;

            switch (world.Zoom)
            {
            case WorldZoom.Far:
                sprite           = pattern.Far;
                _Sprite.DestRect = FLOORDEST_FAR;
                _Sprite.Depth    = ArchZBuffers[14 + bufOff];
                break;

            case WorldZoom.Medium:
                sprite           = pattern.Medium;
                _Sprite.DestRect = FLOORDEST_MED;
                _Sprite.Depth    = ArchZBuffers[13 + bufOff];
                break;

            case WorldZoom.Near:
                sprite           = pattern.Near;
                _Sprite.DestRect = FLOORDEST_NEAR;
                _Sprite.Depth    = ArchZBuffers[12 + bufOff];
                break;
            }
            if (sprite != null)
            {
                _Sprite.Pixel   = world._2D.GetTexture(sprite.Frames[rotation]);
                _Sprite.SrcRect = new Microsoft.Xna.Framework.Rectangle(0, 0, _Sprite.Pixel.Width, _Sprite.Pixel.Height);

                if (vertFlip)
                {
                    _Sprite.FlipVertically = true;
                }
                if ((int)world.Rotation > 1)
                {
                    _Sprite.FlipHorizontally = true;
                }
            }

            return(_Sprite);
        }
Ejemplo n.º 4
0
        private void PrintSPR2(SPR2 spr)
        {
            Printer.H2("#" + spr.ChunkID + " (" + spr.ChunkLabel + ")");
            var table      = Printer.CreateTable(new string[] { "Index", "Pixel" });
            var frameIndex = 0;

            foreach (var frame in spr.Frames)
            {
                table.AddRow(new object[] { frameIndex, frame });
                frameIndex++;
            }
            Printer.Add(table);
        }
Ejemplo n.º 5
0
        private void AutoOffset(DGRPSprite dgrpSpr, SPR2 spr, float zFactor)
        {
            dgrpSpr.Flip = false;
            var frameN = dgrpSpr.SpriteFrameIndex;

            //generate a default offset using the cage setup in the SPR2.
            //68 is half width of cage
            //348 is distance from baseline to top of cage;
            var frame = spr.Frames[frameN];

            dgrpSpr.SpriteOffset = new Microsoft.Xna.Framework.Vector2(
                (int)((-68 * zFactor) + frame.Position.X),
                (-348 * zFactor) + frame.Height + frame.Position.Y
                );
        }
Ejemplo n.º 6
0
        public override void Draw(GraphicsDevice device, WorldState world)
        {
            if (_Dirty)
            {
                if (_Floor == null)
                {
                    _Floor = Content.Get().WorldFloors.Get((ulong)_FloorID);
                    if (_Floor != null)
                    {
                        _Sprite = new _2DSprite
                        {
                            RenderMode = _2DBatchRenderMode.NO_DEPTH
                        };
                    }
                }
                if (_DirtyTexture && _Floor != null)
                {
                    SPR2 sprite = null;
                    switch (world.Zoom)
                    {
                    case WorldZoom.Far:
                        sprite           = _Floor.Far;
                        _Sprite.DestRect = DESTINATION_FAR;
                        break;

                    case WorldZoom.Medium:
                        sprite           = _Floor.Medium;
                        _Sprite.DestRect = DESTINATION_MED;
                        break;

                    case WorldZoom.Near:
                        sprite           = _Floor.Near;
                        _Sprite.DestRect = DESTINATION_NEAR;
                        break;
                    }
                    _Sprite.Pixel   = world._2D.GetTexture(sprite.Frames[0]);
                    _Sprite.SrcRect = new Microsoft.Xna.Framework.Rectangle(0, 0, _Sprite.Pixel.Width, _Sprite.Pixel.Height);
                }

                _DirtyTexture = false;
                _Dirty        = false;
            }

            if (_Sprite != null)
            {
                world._2D.Draw(_Sprite);
            }
        }
Ejemplo n.º 7
0
        public override void Draw(GraphicsDevice device, WorldState world)
        {
            if (ArchZBuffers == null)
            {
                ArchZBuffers = TextureGenerator.GetWallZBuffer(device);
            }

            var pxOffset     = world.WorldSpace.GetScreenOffset();
            var floorContent = Content.Content.Get().WorldFloors;

            Rectangle db;

            if (DrawBound == null)
            {
                db = new Rectangle(0, 0, blueprint.Width, blueprint.Height);
            }
            else
            {
                db = DrawBound.Value;
            }

            for (sbyte level = 1; level <= world.Level; level++)
            {
                for (short y = (short)db.Top; y < db.Bottom; y++)
                { //ill decide on a reasonable system for components when it's finished ok pls :(
                    for (short x = (short)db.Left; x < db.Right; x++)
                    {
                        var comp = blueprint.GetFloor(x, y, level);
                        if (comp.Pattern != 0)
                        {
                            ushort room         = (ushort)blueprint.RoomMap[level - 1][x + y * blueprint.Width];
                            var    tilePosition = new Vector3(x, y, (level - 1) * 2.95f);
                            world._2D.OffsetPixel(world.WorldSpace.GetScreenFromTile(tilePosition));
                            world._2D.OffsetTile(tilePosition);

                            if (comp.Pattern > 65533)
                            {
                                //determine adjacent pool tiles
                                int poolAdj = 0;
                                for (int i = 0; i < PoolDirections.Length; i++)
                                {
                                    var testTile = new Point(x, y) + PoolDirections[i];
                                    if ((testTile.X <= 0 || testTile.X >= blueprint.Width - 1) || (testTile.Y <= 0 || testTile.Y >= blueprint.Height - 1) ||
                                        blueprint.GetFloor((short)testTile.X, (short)testTile.Y, level).Pattern == comp.Pattern)
                                    {
                                        poolAdj |= 1 << i;
                                    }
                                }

                                var adj = RotatePoolSegs((PoolSegments)poolAdj, (int)world.Rotation);

                                //get and draw the base tile

                                int spriteNum = 0;
                                if ((adj & PoolSegments.TopRight) > 0)
                                {
                                    spriteNum |= 1;
                                }
                                if ((adj & PoolSegments.TopLeft) > 0)
                                {
                                    spriteNum |= 2;
                                }
                                if ((adj & PoolSegments.BottomLeft) > 0)
                                {
                                    spriteNum |= 4;
                                }
                                if ((adj & PoolSegments.BottomRight) > 0)
                                {
                                    spriteNum |= 8;
                                }

                                var _Sprite = world._2D.NewSprite(_2DBatchRenderMode.Z_BUFFER);

                                SPR2 sprite = null;

                                int baseSPR;
                                int frameNum = 0;
                                switch (world.Zoom)
                                {
                                case WorldZoom.Far:
                                    baseSPR          = (comp.Pattern == 65535) ? 0x400 : 0x800;
                                    frameNum         = (comp.Pattern == 65535) ? 0 : 2;
                                    sprite           = floorContent.GetGlobalSPR((ushort)(baseSPR + spriteNum));
                                    _Sprite.DestRect = FLOORDEST_FAR;
                                    _Sprite.Depth    = ArchZBuffers[14];
                                    break;

                                case WorldZoom.Medium:
                                    baseSPR          = (comp.Pattern == 65535) ? 0x410 : 0x800;
                                    frameNum         = (comp.Pattern == 65535) ? 0 : 1;
                                    sprite           = floorContent.GetGlobalSPR((ushort)(baseSPR + spriteNum));
                                    _Sprite.DestRect = FLOORDEST_MED;
                                    _Sprite.Depth    = ArchZBuffers[13];
                                    break;

                                case WorldZoom.Near:
                                    baseSPR          = (comp.Pattern == 65535) ? 0x420 : 0x800;
                                    sprite           = floorContent.GetGlobalSPR((ushort)(baseSPR + spriteNum));
                                    _Sprite.DestRect = FLOORDEST_NEAR;
                                    _Sprite.Depth    = ArchZBuffers[12];
                                    break;
                                }

                                _Sprite.Pixel   = world._2D.GetTexture(sprite.Frames[frameNum]);
                                _Sprite.SrcRect = new Microsoft.Xna.Framework.Rectangle(0, 0, _Sprite.Pixel.Width, _Sprite.Pixel.Height);
                                _Sprite.Room    = room;
                                _Sprite.Floor   = level;
                                world._2D.Draw(_Sprite);

                                //draw any corners on top
                                if (comp.Pattern == 65535)
                                {
                                    PoolSegments[] CornerChecks =
                                    {
                                        (PoolSegments.TopLeft | PoolSegments.TopRight),
                                        (PoolSegments.TopLeft | PoolSegments.BottomLeft),
                                        (PoolSegments.BottomLeft | PoolSegments.BottomRight),
                                        (PoolSegments.TopRight | PoolSegments.BottomRight)
                                    };


                                    if ((adj & CornerChecks[0]) == CornerChecks[0] && (adj & PoolSegments.Top) == 0)
                                    {
                                        //top corner
                                        var tcS = world._2D.NewSprite(_2DBatchRenderMode.Z_BUFFER);
                                        //base sprite position on base tile
                                        sprite       = floorContent.GetGlobalSPR((ushort)(0x430 + ((int)world.Zoom - 1) * 4));
                                        tcS.Pixel    = world._2D.GetTexture(sprite.Frames[0]);
                                        tcS.DestRect = new Rectangle(_Sprite.DestRect.Center.X - tcS.Pixel.Width / 2, _Sprite.DestRect.Y, tcS.Pixel.Width, tcS.Pixel.Height);
                                        tcS.SrcRect  = new Microsoft.Xna.Framework.Rectangle(0, 0, tcS.Pixel.Width, tcS.Pixel.Height);
                                        tcS.Depth    = ArchZBuffers[21 + (3 - (int)world.Zoom)];
                                        tcS.Room     = room;
                                        tcS.Floor    = level;
                                        world._2D.Draw(tcS);
                                    }

                                    if ((adj & CornerChecks[1]) == CornerChecks[1] && (adj & PoolSegments.Left) == 0)
                                    {
                                        //left corner
                                        var tcS = world._2D.NewSprite(_2DBatchRenderMode.Z_BUFFER);
                                        //base sprite position on base tile
                                        sprite       = floorContent.GetGlobalSPR((ushort)(0x431 + ((int)world.Zoom - 1) * 4));
                                        tcS.Pixel    = world._2D.GetTexture(sprite.Frames[0]);
                                        tcS.DestRect = new Rectangle(_Sprite.DestRect.X, _Sprite.DestRect.Center.Y + 1 - tcS.Pixel.Height / 2, tcS.Pixel.Width, tcS.Pixel.Height);
                                        tcS.SrcRect  = new Microsoft.Xna.Framework.Rectangle(0, 0, tcS.Pixel.Width, tcS.Pixel.Height);
                                        tcS.Depth    = ArchZBuffers[24 + (3 - (int)world.Zoom)];
                                        tcS.Room     = room;
                                        tcS.Floor    = level;
                                        world._2D.Draw(tcS);
                                    }

                                    if ((adj & CornerChecks[2]) == CornerChecks[2] && (adj & PoolSegments.Bottom) == 0)
                                    {
                                        //bottom corner
                                        var tcS = world._2D.NewSprite(_2DBatchRenderMode.Z_BUFFER);
                                        //base sprite position on base tile
                                        sprite       = floorContent.GetGlobalSPR((ushort)(0x432 + ((int)world.Zoom - 1) * 4));
                                        tcS.Pixel    = world._2D.GetTexture(sprite.Frames[0]);
                                        tcS.DestRect = new Rectangle(_Sprite.DestRect.Center.X - tcS.Pixel.Width / 2, _Sprite.DestRect.Bottom - tcS.Pixel.Height, tcS.Pixel.Width, tcS.Pixel.Height);
                                        tcS.SrcRect  = new Microsoft.Xna.Framework.Rectangle(0, 0, tcS.Pixel.Width, tcS.Pixel.Height);
                                        tcS.Depth    = ArchZBuffers[27 + (3 - (int)world.Zoom)];
                                        tcS.Room     = room;
                                        tcS.Floor    = level;
                                        world._2D.Draw(tcS);
                                    }

                                    if ((adj & CornerChecks[3]) == CornerChecks[3] && (adj & PoolSegments.Right) == 0)
                                    {
                                        //right corner
                                        var tcS = world._2D.NewSprite(_2DBatchRenderMode.Z_BUFFER);
                                        //base sprite position on base tile
                                        sprite       = floorContent.GetGlobalSPR((ushort)(0x433 + ((int)world.Zoom - 1) * 4));
                                        tcS.Pixel    = world._2D.GetTexture(sprite.Frames[0]);
                                        tcS.DestRect = new Rectangle(_Sprite.DestRect.Right - tcS.Pixel.Width, _Sprite.DestRect.Center.Y + 1 - tcS.Pixel.Height / 2, tcS.Pixel.Width, tcS.Pixel.Height);
                                        tcS.SrcRect  = new Microsoft.Xna.Framework.Rectangle(0, 0, tcS.Pixel.Width, tcS.Pixel.Height);
                                        tcS.Depth    = ArchZBuffers[24 + (3 - (int)world.Zoom)];
                                        tcS.Room     = room;
                                        tcS.Floor    = level;
                                        world._2D.Draw(tcS);
                                    }
                                }
                            }
                            else
                            {
                                var floor = GetFloorSprite(floorContent.Get(comp.Pattern), 0, world);
                                floor.Room  = room;
                                floor.Floor = level;
                                if (floor.Pixel != null)
                                {
                                    world._2D.Draw(floor);
                                }
                            }
                        }
                        else if (world.BuildMode > 1 && level > 1 && blueprint.Supported[level - 2][y * blueprint.Height + x])
                        {
                            var tilePosition = new Vector3(x, y, (level - 1) * 2.95f);
                            world._2D.OffsetPixel(world.WorldSpace.GetScreenFromTile(tilePosition));
                            world._2D.OffsetTile(tilePosition);

                            var floor = GetAirSprite(world);
                            floor.Room  = 65535;
                            floor.Floor = level;
                            if (floor.Pixel != null)
                            {
                                world._2D.Draw(floor);
                            }
                        }
                    }
                }
            }
        }
Ejemplo n.º 8
0
        public void ProcessSPR2(string Path)
        {
            List<IffChunk> SPR2s = new List<IffChunk>();

            foreach (IffChunk Chunk in m_Chunks)
            {
                if (Chunk.Type == "SPR2")
                    SPR2s.Add(Chunk);
            }

            foreach (IffChunk Chunk in SPR2s)
            {
                BinaryReader ChunkReader = new BinaryReader(new MemoryStream(Chunk.Data));

                SPR2 Spr = new SPR2();
                Spr.Version1 = ChunkReader.ReadInt16();

                if (Spr.Version1 == 0)
                    Spr.Version2 = ReadBigShort(ChunkReader);
                else
                    Spr.Version2 = ChunkReader.ReadInt16();

                Spr.FrameCount = ChunkReader.ReadInt32();
                MessageBox.Show("Framecount: " + Spr.FrameCount);
                Spr.PaletteID = ChunkReader.ReadInt32();
                Spr.OffsetTable = new int[Spr.FrameCount];

                for (int i = 0; i < Spr.FrameCount; i++ )
                    Spr.OffsetTable[i] = ChunkReader.ReadInt32();

                for (int i = 0; i < Spr.FrameCount; i++)
                {
                    SpriteFrame Frame = new SpriteFrame();
                    Frame.Width = ChunkReader.ReadInt16();
                    Frame.Height = ChunkReader.ReadInt16();
                    Frame.Flags = ChunkReader.ReadInt16();
                    Frame.Unknown = ChunkReader.ReadInt16();
                    Frame.PaletteID = ChunkReader.ReadInt16();
                    Frame.TransparentPixel = ChunkReader.ReadInt16();
                    Frame.XPos = ChunkReader.ReadInt16();
                    Frame.YPos = ChunkReader.ReadInt16();

                    BinaryWriter SpriteWriter = new BinaryWriter(Frame.SpriteData);

                    for (int l = 0; l <= Frame.Height; l++)
                    {
                        SpriteWriter.Write(ChunkReader.ReadBytes(2));
                        SpriteWriter.Write(ChunkReader.ReadBytes(Frame.Width));
                    }

                    SpriteWriter.Flush();
                    //SpriteWriter.Close();

                    Spr.AddFrame(Frame);

                    //Each SPR2 resource contains a reference to a PALT chunk/resource.
                    Spr.Pal = new Palette();
                    IffChunk TmpChunk = new IffChunk();

                    foreach (IffChunk C in m_Chunks)
                    {
                        if (C.TypeNum == Spr.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));
                    Spr.Pal.AlwaysOne = PaltReader.ReadInt32();
                    Spr.Pal.Always256 = PaltReader.ReadInt32();
                    PaltReader.ReadBytes(8); //The PALT header has 8 additional bytes of 0.

                    Spr.Pal.RGBTable = new Palette.RGB[Spr.Pal.Always256];

                    for (int l = 0; l < Spr.Pal.Always256; l++)
                    {
                        Spr.Pal.RGBTable[l] = new Palette.RGB();
                        Spr.Pal.RGBTable[l].Red = PaltReader.ReadByte();
                        Spr.Pal.RGBTable[l].Green = PaltReader.ReadByte();
                        Spr.Pal.RGBTable[l].Blue = PaltReader.ReadByte();
                    }

                    PaltReader.Close();
                }

                for (int i = 0; i < Spr.FrameCount; i++)
                {
                    SpriteFrame Frame = Spr.GetFrame(i);

                    BinaryReader SpriteReader = new BinaryReader(new MemoryStream(Frame.SpriteData.ToArray()));
                    int X = 0, Y = 0;
                    bool Stop = false;

                    Bitmap BM = new Bitmap(Frame.Width, Frame.Height);
                    Color Transparent = Color.FromArgb(Spr.Pal.RGBTable[Frame.TransparentPixel].Red,
                        Spr.Pal.RGBTable[Frame.TransparentPixel].Green,
                        Spr.Pal.RGBTable[Frame.TransparentPixel].Blue);

                    Graphics Gfx = Graphics.FromImage(BM);

                    while (SpriteReader.BaseStream.Position < (SpriteReader.BaseStream.Length - 1) && !Stop)
                    {
                        byte Opcode = SpriteReader.ReadByte();
                        byte Data = SpriteReader.ReadByte();

                        switch (Opcode)
                        {
                            case 1: //Transparent pixels.
                                for (int Dat = 0; Dat < Data; Dat++)
                                {
                                    if(X < Frame.Width)
                                        BM.SetPixel(X, Y, Transparent);
                                    
                                    X++;
                                }

                                break;
                            case 2:
                                byte Col = SpriteReader.ReadByte();

                                for (int Dat = 0; Dat < Data; Dat++)
                                {
                                    if (X < Frame.Width)
                                        BM.SetPixel(X, Y, GetColorFromPalette(Col, Spr));
                                    
                                    X++;
                                }
                                break;
                            case 3: //Pixels.
                                byte Pixel = SpriteReader.ReadByte();

                                for (int Dat = 0; Dat < Data; Dat++)
                                {
                                    if (X < Frame.Width && Y < Frame.Height)
                                        BM.SetPixel(X, Y, GetColorFromPalette(Pixel, Spr));
                                    
                                    X++;
                                }

                                break;
                            case 4: //New line.
                                for (; X < BM.Width; X++)
                                    BM.SetPixel(X, Y, Transparent);

                                Y++; //Next line.
                                X = 0;
                                break;
                            case 5: //End of sprite.
                                Stop = true;
                                break;
                            case 9: //Transparent rows.
                                Gfx.FillRectangle(Brushes.Transparent, 
                                    new Rectangle(0, Y, BM.Width, (Y + (Data - 1))));
                                X = 0;
                                Y = Y + (Data - 1);
                                break;
                        }
                    }

                    Random Rnd = new Random(DateTime.Now.Millisecond);

                    BM.Save(Path + "\\" + i.ToString() + Rnd.Next() + ".png", System.Drawing.Imaging.ImageFormat.Png);
                }
            }
        }
Ejemplo n.º 9
0
 private Color GetColorFromPalette(int PaletteIndex, SPR2 Sprite)
 {
     return Color.FromArgb(Sprite.Pal.RGBTable[PaletteIndex].Red,
         Sprite.Pal.RGBTable[PaletteIndex].Green, Sprite.Pal.RGBTable[PaletteIndex].Blue);
 }
Ejemplo n.º 10
0
        public void ProcessSPR2(string Path)
        {
            List <IffChunk> SPR2s = new List <IffChunk>();

            foreach (IffChunk Chunk in m_Chunks)
            {
                if (Chunk.Type == "SPR2")
                {
                    SPR2s.Add(Chunk);
                }
            }

            foreach (IffChunk Chunk in SPR2s)
            {
                BinaryReader ChunkReader = new BinaryReader(new MemoryStream(Chunk.Data));

                SPR2 Spr = new SPR2();
                Spr.Version1 = ChunkReader.ReadInt16();

                if (Spr.Version1 == 0)
                {
                    Spr.Version2 = ReadBigShort(ChunkReader);
                }
                else
                {
                    Spr.Version2 = ChunkReader.ReadInt16();
                }

                Spr.FrameCount = ChunkReader.ReadInt32();
                MessageBox.Show("Framecount: " + Spr.FrameCount);
                Spr.PaletteID   = ChunkReader.ReadInt32();
                Spr.OffsetTable = new int[Spr.FrameCount];

                for (int i = 0; i < Spr.FrameCount; i++)
                {
                    Spr.OffsetTable[i] = ChunkReader.ReadInt32();
                }

                for (int i = 0; i < Spr.FrameCount; i++)
                {
                    SpriteFrame Frame = new SpriteFrame();
                    Frame.Width            = ChunkReader.ReadInt16();
                    Frame.Height           = ChunkReader.ReadInt16();
                    Frame.Flags            = ChunkReader.ReadInt16();
                    Frame.Unknown          = ChunkReader.ReadInt16();
                    Frame.PaletteID        = ChunkReader.ReadInt16();
                    Frame.TransparentPixel = ChunkReader.ReadInt16();
                    Frame.XPos             = ChunkReader.ReadInt16();
                    Frame.YPos             = ChunkReader.ReadInt16();

                    BinaryWriter SpriteWriter = new BinaryWriter(Frame.SpriteData);

                    for (int l = 0; l <= Frame.Height; l++)
                    {
                        SpriteWriter.Write(ChunkReader.ReadBytes(2));
                        SpriteWriter.Write(ChunkReader.ReadBytes(Frame.Width));
                    }

                    SpriteWriter.Flush();
                    //SpriteWriter.Close();

                    Spr.AddFrame(Frame);

                    //Each SPR2 resource contains a reference to a PALT chunk/resource.
                    Spr.Pal = new Palette();
                    IffChunk TmpChunk = new IffChunk();

                    foreach (IffChunk C in m_Chunks)
                    {
                        if (C.TypeNum == Spr.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));
                    Spr.Pal.AlwaysOne = PaltReader.ReadInt32();
                    Spr.Pal.Always256 = PaltReader.ReadInt32();
                    PaltReader.ReadBytes(8); //The PALT header has 8 additional bytes of 0.

                    Spr.Pal.RGBTable = new Palette.RGB[Spr.Pal.Always256];

                    for (int l = 0; l < Spr.Pal.Always256; l++)
                    {
                        Spr.Pal.RGBTable[l]       = new Palette.RGB();
                        Spr.Pal.RGBTable[l].Red   = PaltReader.ReadByte();
                        Spr.Pal.RGBTable[l].Green = PaltReader.ReadByte();
                        Spr.Pal.RGBTable[l].Blue  = PaltReader.ReadByte();
                    }

                    PaltReader.Close();
                }

                for (int i = 0; i < Spr.FrameCount; i++)
                {
                    SpriteFrame Frame = Spr.GetFrame(i);

                    BinaryReader SpriteReader = new BinaryReader(new MemoryStream(Frame.SpriteData.ToArray()));
                    int          X = 0, Y = 0;
                    bool         Stop = false;

                    Bitmap BM          = new Bitmap(Frame.Width, Frame.Height);
                    Color  Transparent = Color.FromArgb(Spr.Pal.RGBTable[Frame.TransparentPixel].Red,
                                                        Spr.Pal.RGBTable[Frame.TransparentPixel].Green,
                                                        Spr.Pal.RGBTable[Frame.TransparentPixel].Blue);

                    Graphics Gfx = Graphics.FromImage(BM);

                    while (SpriteReader.BaseStream.Position < (SpriteReader.BaseStream.Length - 1) && !Stop)
                    {
                        byte Opcode = SpriteReader.ReadByte();
                        byte Data   = SpriteReader.ReadByte();

                        switch (Opcode)
                        {
                        case 1:     //Transparent pixels.
                            for (int Dat = 0; Dat < Data; Dat++)
                            {
                                if (X < Frame.Width)
                                {
                                    BM.SetPixel(X, Y, Transparent);
                                }

                                X++;
                            }

                            break;

                        case 2:
                            byte Col = SpriteReader.ReadByte();

                            for (int Dat = 0; Dat < Data; Dat++)
                            {
                                if (X < Frame.Width)
                                {
                                    BM.SetPixel(X, Y, GetColorFromPalette(Col, Spr));
                                }

                                X++;
                            }
                            break;

                        case 3:     //Pixels.
                            byte Pixel = SpriteReader.ReadByte();

                            for (int Dat = 0; Dat < Data; Dat++)
                            {
                                if (X < Frame.Width && Y < Frame.Height)
                                {
                                    BM.SetPixel(X, Y, GetColorFromPalette(Pixel, Spr));
                                }

                                X++;
                            }

                            break;

                        case 4:     //New line.
                            for (; X < BM.Width; X++)
                            {
                                BM.SetPixel(X, Y, Transparent);
                            }

                            Y++;     //Next line.
                            X = 0;
                            break;

                        case 5:     //End of sprite.
                            Stop = true;
                            break;

                        case 9:     //Transparent rows.
                            Gfx.FillRectangle(Brushes.Transparent,
                                              new Rectangle(0, Y, BM.Width, (Y + (Data - 1))));
                            X = 0;
                            Y = Y + (Data - 1);
                            break;
                        }
                    }

                    Random Rnd = new Random(DateTime.Now.Millisecond);

                    BM.Save(Path + "\\" + i.ToString() + Rnd.Next() + ".png", System.Drawing.Imaging.ImageFormat.Png);
                }
            }
        }
Ejemplo n.º 11
0
 private Color GetColorFromPalette(int PaletteIndex, SPR2 Sprite)
 {
     return(Color.FromArgb(Sprite.Pal.RGBTable[PaletteIndex].Red,
                           Sprite.Pal.RGBTable[PaletteIndex].Green, Sprite.Pal.RGBTable[PaletteIndex].Blue));
 }
Ejemplo n.º 12
0
 public void AddSprite(SPR2 Sprite)
 {
     m_Sprite = Sprite;
     m_Frame  = (SPR2Frame)m_Sprite.GetFrame(0); //Floors only have 1 frame.
 }