unsafe public static Bitmap[] GetEnemySprite(int index)
        {
            Bitmap[] ret = new Bitmap[2];

            // Get gfx stuff
            int gfxPointer = GetPointer(index + 8) + 12;

            byte[] gfxData;
            if (LZ77.Decompress(Rom, gfxPointer, out gfxData) == -1)
            {
                return(null);
            }

            // Bug with MOTHER 3: for the second Mole Cricket (index 0x3D),
            // it uses tiles that are out of bounds in the tile data!
            // So let's resize the tile buffer to 32KB (max addressable size)
            Array.Resize(ref gfxData, 0x8000);

            // Get pal stuff
            var palette = GetPals(index);

            // Get OAM stuff
            int oamPointer = GetPointer(index + 0x2A4);
            var oam        = new OamSprite[2][];

            for (int i = 0; i < 2; i++)
            {
                // Get the front/back sprite pointer
                int subPointer = Rom.ReadUShort(oamPointer + 8 + (i << 1)) + oamPointer;

                // Get the number of sub-sprites
                ushort numSubSprites = Rom.ReadUShort(subPointer + 2);
                oam[i] = new OamSprite[numSubSprites];

                // Get the OAM data
                for (int j = 0; j < numSubSprites; j++)
                {
                    oam[i][j] = Rom.ReadOam(subPointer + 4 + (j << 3));

                    // Filter out the palette -- each enemy only has one palette, regardless of what the OAM entry says
                    // This is only an issue with enemy #0 anyway
                    oam[i][j].Palette = 0;
                }

                // Render the sprites
                Bitmap bmp = GfxProvider.RenderSprites(oam[i], gfxData, palette);
                ret[i] = bmp;
            }

            return(ret);
        }
        public static Bitmap GetOam(int bank, int index, int subindex, int oam, int palnum = -1, bool transparent = true)
        {
            // Get the palette
            var pal = SpritePalettes.GetPalette(index, palnum);

            // Get the graphics pointer
            int gfxpointer = SpriteGfx.GetPointer(bank, index);

            // Get the sprite info
            var si = SpriteInfo.InfoEntries[bank][index].Sprites[subindex].Sprites[oam];

            // Bail out if we need to
            if ((pal == null) || (gfxpointer == -1) || (si == null))
            {
                return(null);
            }

            return(GfxProvider.RenderSprites(new OamSprite[] { si }, Rom, gfxpointer, pal, transparent));
        }
示例#3
0
        public static Bitmap GetSprites(int canvas0Width, int canvas0Height, int room, CheckBox[] chkTable, out Bitmap Enemies, out Bitmap Enemies2)
        {
            var rInfo   = RoomInfo.RoomInfoEntries[room];
            var rGfxPal = SpritePalettes.DefaultPals;

            // Get the width and height (in 16*16 tiles)
            int w = rInfo.Width;
            int h = rInfo.Height;

            // Create the bitmap
            Bitmap bmp = new Bitmap(canvas0Width, canvas0Height, PixelFormat.Format8bppIndexed);

            Enemies  = new Bitmap(canvas0Width, canvas0Height, PixelFormat.Format8bppIndexed);
            Enemies2 = new Bitmap(canvas0Width, canvas0Height, PixelFormat.Format8bppIndexed);
            Enemies.CopyPalette(rGfxPal, true);
            Enemies2.CopyPalette(rGfxPal, true);
            int        Last = 0, palettenum = 0;
            List <int> Palettenum = new List <int>();
            BitmapData bd         = bmp.LockBits(ImageLockMode.WriteOnly);
            BitmapData be         = Enemies.LockBits(ImageLockMode.WriteOnly);
            BitmapData be2        = Enemies2.LockBits(ImageLockMode.WriteOnly);

            bmp.CopyPalette(rGfxPal, true);
            for (int j = 0; j <= 4; j++)
            {
                if (chkTable[j].Checked == true)
                {
                    for (int i = 0; i < RoomSprites.Sprites[(room * 5) + j].Count; i++)
                    {
                        var rs = RoomSprites.Sprites[(room * 5) + j][i];
                        if (!((rs.Sprite <= 0xFF) || (rs.Sprite >= 0x26C)))
                        {
                            MPalette[] NewestPalette;
                            MPalette[] NewestPalette2;
                            RenderPalette(SpritePalettes.GetPalette(rs.Sprite), Enemies.Palette, Enemies2.Palette, Last, out NewestPalette, out Last, out NewestPalette2, out palettenum);
                            Palettenum.Add(palettenum);
                            Enemies.CopyPalette(NewestPalette, true);
                            Enemies2.CopyPalette(NewestPalette2, true);
                        }
                    }
                }
            }
            int count = 0;

            for (int j = 0; j <= 4; j++)
            {
                if (chkTable[j].Checked == true)
                {
                    for (int i = 0; i < RoomSprites.Sprites[(room * 5) + j].Count; i++)
                    {
                        var rs = RoomSprites.Sprites[(room * 5) + j][i];
                        var si = SpriteInfo.InfoEntries[0][rs.Sprite];
                        if ((rs.Sprite == 0) || (rs.Sprite == 0xC0))
                        {
                            continue;
                        }
                        if ((rs.Sprite >= 0x2D0) && (rs.Sprite < 0x3D0))
                        {
                            // All item images are stored nice and linearly
                            // Each item image is 3x3 tiles
                            var index = rs.Sprite - 0x2D0;
                            RenderItems(bd, index, rs.X, rs.Y, SpritePalettes.GetPalNum(rs.Sprite));
                        }
                        else
                        {
                            var s = si.Sprites[rs.Direction % si.Sprites.Length];
                            if ((rs.Sprite <= 0xFF) || (rs.Sprite >= 0x26C))
                            {
                                GfxProvider.RenderSprites(bd, rs.X, rs.Y, s.Sprites,
                                                          Rom, SpriteGfx.GetPointer(0, rs.Sprite),
                                                          SpritePalettes.GetPalNum(rs.Sprite));
                            }
                            else
                            {
                                RenderEnemies(be, be2, rs.X, rs.Y, s.Sprites,
                                              Rom, SpriteGfx.GetPointer(0, rs.Sprite),
                                              Palettenum[count]);
                                count++;
                            }
                        }
                    }
                }
            }
            Enemies2.UnlockBits(be2);
            Enemies.UnlockBits(be);
            bmp.UnlockBits(bd);
            return(bmp);
        }