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