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)); }
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); }