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);
        }
Example #2
0
        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);
        }
Example #3
0
 public Form1()
 {
     InitializeComponent();
     pictureBox1.Paint += new PaintEventHandler(pictureBox1_Paint);
     theNesPalette      = new NesPalette();
     theNesPalette.GenerateNTSC(0, 50);
     comboBox1.SelectedIndex = 0;
 }
Example #4
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;
        }
Example #5
0
            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();
            }