Ejemplo n.º 1
0
        /// <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);
                        }
                    }
                }
            }
        }
Ejemplo n.º 2
0
        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();
        }
Ejemplo n.º 3
0
        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;
            }
        }