/// <summary> /// paint the positions into the given bitmap (full level, for instance) /// </summary> public static void Draw(Bitmap bmp, EIBFile eib) { using (var g = Graphics.FromImage(bmp)) { var font = new Font("Arial", 10); var sfmnt = StringFormat.GenericDefault; sfmnt.Alignment = StringAlignment.Center; int bls = 256; // draw a grid /* * for (var i = 0; i < eib.Height; ++i) * for(int j = 0; j < eib.Width; ++j) * g.DrawRectangle(new Pen(Color.AliceBlue), j * bls, i * bls, bls, bls); */ // draw points for (var i = 0; i < eib.Height; ++i) { for (int j = 0; j < eib.Width; ++j) { var region = eib.Regions[i, j]; foreach (var point in region.Points) { var r = new Rectangle(point.LocalX * 8 + j * bls, point.LocalY * 8 + i * bls, 0, 0); r.Inflate(8, 8); var rnd = new Random(point.ID); // 255, 0, 100 g.FillEllipse(new SolidBrush(Color.FromArgb(rnd.Next(256), rnd.Next(20), rnd.Next(100))), r); g.DrawString(point.ID.ToString(), font, new SolidBrush(Color.White), r, sfmnt); } } } } }
private void fileSelected(TOCListItem item) { selectedItem = item; applyChangesButton.Visible = false; var hidePages = new TabPage[] { txtPage, imgPage, infoPage, mapPage, tfmxPage, tilesPage, entitiesPage }; foreach (TabPage page in hidePages) { if (previewTabs.TabPages.Contains(page)) { previewTabs.TabPages.Remove(page); } } currentBitmapIndex = 0; if (currentBitmaps != null) { foreach (Bitmap bmp in currentBitmaps) { bmp.Dispose(); } currentBitmaps = null; } mapMaker?.Cancel(); if (mapPictureBox.Image != null) { var img = mapPictureBox.Image; mapPictureBox.Image = null; img.Dispose(); } hexBox.ByteProvider = new DynamicByteProvider(item.Entry.Data); bool preview = true; Description description = game.Descriptions?.ByName(item.Entry.Name); if (description != null && description.NoPreview) { preview = false; } if (preview) { switch (item.Entry.Type) { case TOCEntryType.Text: case TOCEntryType.Language: txtOutput.Text = Encoding.GetEncoding("437").GetString(item.Entry.Data); previewTabs.TabPages.Add(txtPage); previewTabs.SelectedTab = txtPage; break; case TOCEntryType.StaticSprite: PCXFile img = new PCXFile(); img.Load(item.Entry.Data); currentImgZoom = 3; imgZoomInput.Value = currentImgZoom; currentBitmaps = new Bitmap[] { img.Bitmap }; imgPage.Text = "Sprite"; previewTabs.TabPages.Add(imgPage); previewTabs.SelectedTab = imgPage; bitmapControlsPanel.Visible = false; updateImagePreview(); break; case TOCEntryType.AnimatedSprite: BOBFile bobFile = new BOBFile(item.Entry.Data); BOBDecoder decoder = new BOBDecoder(); var vgaBitmaps = decoder.DecodeFrames(bobFile); currentBitmaps = new Bitmap[vgaBitmaps.Count]; imgPage.Text = "Sprite Animation"; for (int i = 0; i < vgaBitmaps.Count; i++) { currentBitmaps[i] = VGABitmapConverter.ToRGBA(vgaBitmaps[i]); } currentImgZoom = 10; imgZoomInput.Value = currentImgZoom; previewTabs.TabPages.Add(imgPage); previewTabs.SelectedTab = imgPage; bitmapControlsPanel.Visible = true; updateImagePreview(); break; case TOCEntryType.Palette: currentImgZoom = 14; imgZoomInput.Value = currentImgZoom; currentBitmaps = new Bitmap[] { Palette.ToBitmap(item.Entry.Data) }; imgPage.Text = "Palette"; previewTabs.TabPages.Add(imgPage); previewTabs.SelectedTab = imgPage; bitmapControlsPanel.Visible = false; updateImagePreview(); break; case TOCEntryType.Tileset: case TOCEntryType.CollisionInfo: tilesCollisionsCheckbox.Checked = item.Entry.Type == TOCEntryType.CollisionInfo; Bitmap tilesetBitmap = tilemapMaker.MakeTilesetBitmap(item.Entry, tilesCollisionsCheckbox.Checked); if (tilesetBitmap != null) { tilesPictureBox.Image = tilesetBitmap; previewTabs.TabPages.Add(tilesPage); previewTabs.SelectedTab = tilesPage; } else { MessageBox.Show("Error: Failed to generate tileset preview!"); } break; case TOCEntryType.Map: previewTabs.TabPages.Add(mapPage); previewTabs.SelectedTab = mapPage; mapMakerProgressBar.Value = 0; mapMakerProgressPanel.Visible = true; mapMaker = new MapMaker(game.Assets, mapProgress, mapComplete); if (!mapMaker.Make(item.Entry)) { MessageBox.Show("Error: " + mapMaker.Error, "Failed to generate preview!", MessageBoxButtons.OK, MessageBoxIcon.Error); } break; case TOCEntryType.Music: previewTabs.TabPages.Add(tfmxPage); previewTabs.SelectedTab = tfmxPage; playSelectedTFM(); break; case TOCEntryType.EntitiesList: previewTabs.TabPages.Add(entitiesPage); previewTabs.SelectedTab = entitiesPage; entitiesList.Items.Clear(); try { EIBFile eibFile = new EIBFile(item.Entry.Data); foreach (var entry in eibFile.Regions) { foreach (var point in entry.Points) { entitiesList.Items.Add(new EntityListItem(point)); } } entityFileInfo.Text = $"Unknown variables in file: D={eibFile.D}, E={eibFile.E}, F={eibFile.F}"; } catch (Exception ex) { MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } break; case TOCEntryType.PixelFont: case TOCEntryType.Sound: case TOCEntryType.DIR: case TOCEntryType.DAT: case TOCEntryType.Executable: case TOCEntryType.Unknown: default: break; } } if (description != null && !string.IsNullOrEmpty(description.Info)) { infoOutput.Text = description.Info; previewTabs.TabPages.Add(infoPage); if (previewTabs.TabPages.Count == 1) { previewTabs.SelectedTab = infoPage; } } sectionsPanel.Invalidate(); }
private void make(object sender, DoWorkEventArgs e) { try { worker.ReportProgress(0); Map = new PCMFile(mapEntry.Data); COLFile colFile = new COLFile(collisionsEntry.Data); EIBFile entitiesFile = entitiesEntry != null ? new EIBFile(entitiesEntry.Data) : null; worker.ReportProgress(10); if (worker.CancellationPending) { return; } // get tileset bitmaps Bitmap[] tiles = PICConverter.PICToBitmaps(tilesetEntry.Data, paletteEntry.Data); worker.ReportProgress(40); if (worker.CancellationPending) { return; } TilesBitmap = new Bitmap(Game.TileSize * Map.Width, Game.TileSize * Map.Height); CollisionsBitmap = new Bitmap(Game.TileSize * Map.Width, Game.TileSize * Map.Height); EntitiesBitmap = new Bitmap(Game.TileSize * Map.Width, Game.TileSize * Map.Height); GridBitmap = new Bitmap(Game.TileSize * Map.Width, Game.TileSize * Map.Height); // draw map tiles and collisions Graphics tilesGfx = Graphics.FromImage(TilesBitmap); Graphics collGfx = Graphics.FromImage(CollisionsBitmap); int total = Map.Width * Map.Height; for (int y = 0; y < Map.Height; y++) { for (int x = 0; x < Map.Width; x++) { int id = x + y * Map.Width; int tileId = Map.TilesIndices[y, x]; // draw cell Bitmap tile = tiles[tileId]; tilesGfx.DrawImage(tile, x * Game.TileSize, y * Game.TileSize, Game.TileSize, Game.TileSize); CollisionDrawer.Draw(collGfx, colFile, tileId, x, y); worker.ReportProgress(40 + (int)Math.Round(50f * id / total)); if (worker.CancellationPending) { Error = "Cancelled"; goto end; } } } // draw entity info if (entitiesFile != null) { EntityDrawer.Draw(EntitiesBitmap, entitiesFile); } // draw grid Graphics gridGfx = Graphics.FromImage(GridBitmap); Pen pen = new Pen(Color.FromArgb(100, 200, 200, 0), 1); for (int x = 0; x < Map.Width; x++) { gridGfx.DrawLine(pen, x * Game.TileSize, 0, x * Game.TileSize, Map.Height * Game.TileSize); } for (int y = 0; y < Map.Height; y++) { gridGfx.DrawLine(pen, 0, y * Game.TileSize, Map.Width * Game.TileSize, y * Game.TileSize); } gridGfx.Dispose(); end: tilesGfx.Dispose(); collGfx.Dispose(); } catch (Exception ex) { Error = ex.Message; return; } }