private List <NesPalette> GetTile16Palettes(Level level) { var localTileDataPointer = gameRom.PrgRom.WordAtAddress((ushort)(0xaf10 + level.World * 2)); var localTile16Count = gameRom.PrgRom.ByteAtAddress(localTileDataPointer++); var localTile32Count = gameRom.PrgRom.ByteAtAddress(localTileDataPointer++); localTileDataPointer += (ushort)(localTile16Count * 4); // skip tile16 corner data localTileDataPointer += (ushort)((localTile16Count + 0x4c + 3) / 4); // skip tile16 palette data localTileDataPointer += (ushort)(localTile32Count * 4); // skip tile32 corner data var palettesPointer = localTileDataPointer; var bitBuffer = new BitBuffer(i => gameRom.PrgRom.ByteAtAddress((ushort)(palettesPointer + i))); var palettes = new List <NesPalette>(); for (var paletteId = 0; paletteId < 4; paletteId++) { var palette = new NesPalette() { BgColor = new NesColor(0xf), Color1 = new NesColor((byte)bitBuffer.Get(6)), Color2 = new NesColor((byte)bitBuffer.Get(6)), Color3 = new NesColor((byte)bitBuffer.Get(6)), }; palettes.Add(palette); } return(palettes); }
public Bitmap AsBitmap(NesPalette palette, NesColorMapping colorMapping, bool alpha = false) { var bitmap = new Bitmap(PIXEL_WIDTH, PIXEL_HEIGHT); for (int y = 0; y < PIXEL_HEIGHT; y++) { for (int x = 0; x < PIXEL_WIDTH; x++) { Color color; switch (Pattern[y][x]) { case 0: default: color = alpha ? Color.Transparent : palette.BgColor.AsArgbColor(colorMapping); break; case 1: color = palette.Color1.AsArgbColor(colorMapping); break; case 2: color = palette.Color2.AsArgbColor(colorMapping); break; case 3: color = palette.Color3.AsArgbColor(colorMapping); break; } bitmap.SetPixel(x, y, color); } } return(bitmap); }
public Form1() { InitializeComponent(); pictureBox1.Paint += new PaintEventHandler(pictureBox1_Paint); theNesPalette = new NesPalette(); theNesPalette.GenerateNTSC(0, 50); comboBox1.SelectedIndex = 0; }
/// <summary> /// Applies the current currentLevelIndex's (specified by the Level property) paletteIndex /// to a Bitmap, generally the Bitmap that is being rendered to. /// </summary> /// <param name="dest">The indexed brush to apply a color table to.</param> /// <param name="alt">If true, the currentLevelIndex's alternate background paletteIndex will be used instead of the normal paletteIndex.</param> public void ApplyPalette(Bitmap dest, bool alt) { NesPalette pal = alt ? _Level.BgAltPalette : _Level.BgPalette; ColorPalette destPal = dest.Palette; pal.ApplyTable(destPal.Entries); dest.Palette = destPal; }
public Bitmap AsBitmap(NesPalette palette, NesColorMapping colorMapping) { var bitmap = Level.SpriteTiles[Id].AsBitmap(palette, colorMapping, true); if (FlipX && FlipY) { bitmap.RotateFlip(RotateFlipType.RotateNoneFlipXY); } else if (FlipX) { bitmap.RotateFlip(RotateFlipType.RotateNoneFlipX); } else if (FlipY) { bitmap.RotateFlip(RotateFlipType.RotateNoneFlipY); } return(bitmap); }
public override void DoWork() { ColorPalette bitmapPalette = dest.Palette; NesPalette bgPalette = display._Level.BgPalette; NesPalette spritePalette = display._Level.SpritePalette; // Todo: alt pal support //if (display..UseAltPalette && (display._Level.LevelIdentifier == LevelIndex.Brinstar || LevelData.LevelIdentifier == LevelIndex.Norfair)) // bgPalette = display._Level.BgAltPalette; // Load palettes twice bgPalette.ApplyTable(bitmapPalette.Entries); bgPalette.ApplyTable(bitmapPalette.Entries, 16); spritePalette.ApplyTable(bitmapPalette.Entries, 32); spritePalette.ApplyTable(bitmapPalette.Entries, 48); // Invert second paletteIndex for selections ApplyHighlightFilter(bitmapPalette); dest.Palette = bitmapPalette; bitmapPalette.Entries[NesPalette.HighlightEntry] = SystemColors.Highlight; b.Begin(display.Level.Patterns.PatternImage, dest); if (showPhysics) { display.RenderPhysics(b); display.RederEnemies(b, sprites); } else { for (int x = 0; x < 32; x++) { for (int y = 0; y < 30; y++) { int tile = display.tiles[x, y]; b.BlitTile(tile, x, y, display.colors[x, y]); } } display.RederEnemies(b, sprites); if (doors != null) { foreach (DoorInstance d in doors) { byte pal = 9; if (d.Type == DoorType.Missile) { pal = 8; } else if (d.Type == DoorType.TenMissile) { pal = 10; } if (d.Side == DoorSide.Left) { Graphic.SpriteDefinition.LeftDoor.Draw(b, 2, 0xA, pal); } else { Graphic.SpriteDefinition.RightDoor.Draw(b, 0x1D, 0xA, pal); } } } } if (!showPhysics) { ////if (display.gameItem != null) //// display.gameItem.Draw(b); for (int i = 0; i < display._sprites.Count; i++) { SpriteListItem item = display._sprites[i]; item.SpriteDefinition.Draw(b, item.Location.X, item.Location.Y, (byte)(item.PaletteIndex)); } } b.End(); }