예제 #1
0
        public static PatternTable LoadNewTableForExpandedRom(bool linear, PatternTableType type, Level level)
        {
            PatternTable result = new PatternTable(linear);

            result.type = type;

            result.rom    = level.Rom;
            result.groups = null;

            result.BeginWrite();
            if (type == PatternTableType.sprite)
            {
                // These sprites should be loaded for every level's sprites
                result.loadExpandoGroup(ExpandoPatternOffsets.GlobalGameplaySprites);
                result.loadExpandoGroup(ExpandoPatternOffsets.DigitSprites);

                result.loadExpandoGroup(ExpandoPatternOffsets.GetSpriteEntry(level.Index));
            }
            else if (type == PatternTableType.background)
            {
                result.loadExpandoGroup(ExpandoPatternOffsets.GetBackgroundEntry(level.Index));
            }
            else
            {
                throw new ArgumentException("Invalid pattern table type specified.");
            }
            result.EndWrite();

            return(result);
        }
예제 #2
0
        private void DrawLevelPatterns(LevelIndex level)
        {
            spritePatterns.Clear();
            bgPatterns.Clear();

            PatternGroupIndexTable groups = GetLevelPatterns(level);

            spritePatterns.BeginWrite();
            bgPatterns.BeginWrite();
            for (int i = 0; i < groups.Count; i++)
            {
                PatternGroupOffsets offsets = rom.PatternGroupOffsets[groups[i]];

                if (offsets.IsPage0)
                {
                    spritePatterns.LoadTiles(offsets);
                }
                else
                {
                    bgPatterns.LoadTiles(offsets);
                }
            }
            spritePatterns.EndWrite();
            bgPatterns.EndWrite();

            ApplyPalette(level);

            SpritePatternBox.Image     = spritePatterns.PatternImage;
            BackgroundPatternBox.Image = bgPatterns.PatternImage;
        }
예제 #3
0
        private void RenderBgFrame(ChrAnimationFrame frame)
        {
            bgGfxLoader.BeginWrite();

            LoadGfxSlot(bgGfxLoader, 0, frame.Bank0);
            LoadGfxSlot(bgGfxLoader, 1, frame.Bank1);
            LoadGfxSlot(bgGfxLoader, 2, frame.Bank2);
            LoadGfxSlot(bgGfxLoader, 3, frame.Bank3);

            bgGfxLoader.EndWrite();

            bgGfxLoader.LoadColors((SelectedLevel ?? rom.Brinstar).BgPalette, 0);
            BgImage = bgGfxLoader.PatternImage;
        }
예제 #4
0
        private void RenderSprites()
        {
            UpdateJustinBaileyLabel();

            sprGfxLoader.BeginWrite();

            int justinBaileyAdjust = chkJustinBailey.Checked ? 4 : 0;

            LoadGfxSlot(sprGfxLoader, 0, justinBaileyAdjust + SelectedLevelData.SprBank0 & 0xFE);
            LoadGfxSlot(sprGfxLoader, 1, 1 + justinBaileyAdjust + (SelectedLevelData.SprBank0 & 0xFE));
            LoadGfxSlot(sprGfxLoader, 2, SelectedLevelData.SprBank1 & 0xFE);
            LoadGfxSlot(sprGfxLoader, 3, 1 + (SelectedLevelData.SprBank1 & 0xFE));

            sprGfxLoader.EndWrite();

            sprGfxLoader.LoadColors((SelectedLevel ?? rom.Brinstar).SpritePalette, 0);
            SprImage = sprGfxLoader.PatternImage;
        }
예제 #5
0
        private void picTiles_Paint(object sender, PaintEventArgs e)
        {
            int firstRow = e.ClipRectangle.Top / RowHeight;
            int lastRow  = e.ClipRectangle.Bottom / RowHeight;

            if (lastRow >= _RowCount)
            {
                lastRow = _RowCount - 1;
            }

            int RenderY = firstRow * RowHeight;

            gfxLoader.LoadColors(_Palette, 0);
            e.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
            e.Graphics.PixelOffsetMode   = System.Drawing.Drawing2D.PixelOffsetMode.Half;

            for (int i = firstRow; i <= lastRow; i += RowsPerPage)
            {
                // Draw up to 16 rows
                int rowCount = Math.Min(RowsPerPage, lastRow - i + 1);

                int dataStart = i * bytesPerRow + _DataStart;
                int dataEnd   = dataStart + bytesPerRow * rowCount - 1;

                if (dataEnd >= tileData.Length)
                {
                    System.Diagnostics.Debug.Fail("Attempted to draw tiles beyond end of ROM");
                }
                else
                {
                    gfxLoader.BeginWrite();
                    gfxLoader.LoadTiles(tileData, dataStart, 0, rowCount * TilePerRow);
                    gfxLoader.EndWrite();

                    Rectangle source = new Rectangle(0, 0, RawTileSheetSize, RawTileSize * rowCount);
                    Rectangle dest   = new Rectangle(0, RenderY, RowWidth, RowHeight * rowCount);
                    e.Graphics.DrawImage(gfxLoader.PatternImage, dest, source, GraphicsUnit.Pixel);

                    RenderY += rowCount * RowHeight;
                }
            }

            DrawSelection(e.Graphics);
        }