Exemplo n.º 1
0
 private void UpdateCurrentSprite(SpriteLibrary.PlayerSprite loadedSprite)
 {
     currentSprite = loadedSprite;
     if (loadedSprite != null)
     {
         currentSprite.SetAnimation(currentAnimation);
         currentSprite.SetAnimationPalette(paletteComboBox.SelectedIndex);
         BuildPalette(paletteComboBox.SelectedIndex);
     }
 }
Exemplo n.º 2
0
        public SpriteForm()
        {
            InitializeComponent();

            loadedSprite = new SpriteLibrary.PlayerSprite();
            this.Text    = loadedSprite.DisplayText;
            this.Icon    = ZSpriteTools.Properties.Resources.main;

            UpdateForm();
        }
Exemplo n.º 3
0
        public SpriteForm(string Filename, SpriteLibrary.PlayerSprite sprite)
        {
            InitializeComponent();

            loadedSprite  = sprite;
            this.Icon     = ZSpriteTools.Properties.Resources.main;
            this.Filename = Filename;

            this.Text = Filename;

            UpdateForm();
        }
Exemplo n.º 4
0
        // INJECT SPR TO ROM
        //  Select ROM
        private void InjectSPRopenDialog_FileOk(object sender, CancelEventArgs e)
        {
            SpriteLibrary.PlayerSprite sprite = new SpriteLibrary.PlayerSprite(File.ReadAllBytes(InjectSPRopenDialog.FileName));

            ////filestream open .spr file
            //FileStream fs = new FileStream(InjectSPRopenDialog.FileName, FileMode.Open, FileAccess.Read);
            //fs.Read(sprite_data,0,0x7078);
            //fs.Close();
            Array.Copy(sprite.PixelData, sprite_data, 0x7000);
            Array.Copy(sprite.PaletteData, sprite_data, 0x78); // TODO: fix this to load gloves

            InjectROMsaveDialog.ShowDialog();
        }
Exemplo n.º 5
0
        public void LoadFile(string fileName)
        {
            try
            {
                var spriteFile   = File.ReadAllBytes(fileName);
                var loadedSprite = new SpriteLibrary.PlayerSprite(spriteFile);
                if (loadedSprite.Version == 0)
                {
                    loadedSprite.DisplayText = Path.GetFileNameWithoutExtension(fileName);
                }

                SpriteForm newMDI = new SpriteForm(fileName, loadedSprite);
                newMDI.MdiParent = this;
                newMDI.Show();

                UpdateCurrentSprite(newMDI.loadedSprite);
            }
            catch (Exception ex)
            {
                logger.Error(ex);
                MessageBox.Show($"Failed to load file {fileName}. Make sure it's a sprite file.", "Error");
            }
        }
Exemplo n.º 6
0
        // IMPORT SPR
        private void ImportSPRopenDialog_FileOk(object sender, CancelEventArgs e)
        {
            var sprBytes = File.ReadAllBytes(ImportSPRopenDialog.FileName);

            SpriteLibrary.PlayerSprite spr = new SpriteLibrary.PlayerSprite(sprBytes);
            loadedSprite = spr;

            if (spr.IsValidPlayerSprite == false)
            {
                MessageBox.Show("Invalid sprite file.");
                return;
            }

            if (spr.Version != 0 && !spr.HasValidChecksum)
            {
                if (DialogResult.No == MessageBox.Show("Selected spr file does not have a valid checksum. Do you want to continue?", "Invalid file", MessageBoxButtons.YesNo))
                {
                    return;
                }
            }

            tempFolders[1] = Path.GetDirectoryName(ImportSPRopenDialog.FileName);
            ROM_DATA       = new byte[2097152];
            //data = new byte[spr.PixelDataLength + spr.PaletteDataLength];

            Array.Copy(spr.PixelData, 0, ROM_DATA, 0x80000, spr.PixelDataLength);

            // TODO: remove "data"
            Array.Copy(spr.PixelData, data, spr.PixelDataLength);

            CopySpritePaletteToColorArray(spr.GreenMailPalette, palette);
            CopySpritePaletteToColorArray(spr.BlueMailPalette, palette2);
            CopySpritePaletteToColorArray(spr.RedMailPalette, palette3);
            CopySpritePaletteToColorArray(spr.BunnyPalette, palette4);

            refreshEverything();
        }
Exemplo n.º 7
0
        void ExportPng(SpriteLibrary.PlayerSprite sprite, string filename)
        {
            int rows = sprite.Tiles.Length / 16;

            if (sprite.Tiles.Length % 16 != 0)
            {
                rows++;
            }

            Bitmap   tempBitmap = new Bitmap(128, 448);
            Graphics gg         = Graphics.FromImage(tempBitmap);

            for (int i = 0; i < sprite.Tiles.Length; i++)
            {
                var x = i * 8 % 128;
                var y = i * 8 / 128 * 8;

                sprite.Tiles[i].Draw(gg, sprite.Palette, x, y);
            }

            sprite.DrawPNGto4BPPPalette(gg, 120, 440);

            tempBitmap.Save(filename, System.Drawing.Imaging.ImageFormat.Png);
        }
Exemplo n.º 8
0
        private void importPNGToolStripMenuItem_Click(object sender, EventArgs e)
        {
            using (OpenFileDialog ofd = new OpenFileDialog())
            {
                ofd.Filter = "PNG File (*.png)|*.png|All Files (*.*)|*.*";
                ofd.Title  = "Select a PNG File";

                var invalidPixelsFound = false;

                var result = ofd.ShowDialog();
                if (result == DialogResult.OK)
                {
                    Bitmap tempBitmap = (Bitmap)Image.FromFile(ofd.FileName);
                    if (tempBitmap.PixelFormat != System.Drawing.Imaging.PixelFormat.Format32bppArgb)
                    {
                        var clone = new Bitmap(tempBitmap.Width, tempBitmap.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
                        using (Graphics gr = Graphics.FromImage(clone))
                        {
                            gr.DrawImage(tempBitmap, new Rectangle(0, 0, tempBitmap.Width, tempBitmap.Height));
                        }
                        tempBitmap = clone;
                    }
                    if (tempBitmap.Width != 128 || tempBitmap.Height != 448)
                    {
                        MessageBox.Show("Invalid PNG image. Must be 128 x 448 pixels", "Error");
                        return;
                    }
                    var sprite = new SpriteLibrary.PlayerSprite();
                    sprite.DisplayText = Path.GetFileNameWithoutExtension(ofd.FileName);

                    var bitmapData = tempBitmap.LockBits(new Rectangle(0, 0, tempBitmap.Width, tempBitmap.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, tempBitmap.PixelFormat);
                    var totalBytes = bitmapData.Stride * bitmapData.Height;
                    var pixels     = new byte[totalBytes];
                    Marshal.Copy(bitmapData.Scan0, pixels, 0, totalBytes);
                    tempBitmap.UnlockBits(bitmapData);

                    // load palette from png
                    int xoffset = 120;
                    int yoffset = 440;

                    var colors = new Color[8 * 8];

                    for (int y = 0; y < 8; y++)
                    {
                        for (int x = 0; x < 8; x++)
                        {
                            int pixelPosition = (y + yoffset) * bitmapData.Stride + ((x + xoffset) * 4);

                            int b = pixels[pixelPosition + 0];
                            int g = pixels[pixelPosition + 1];
                            int r = pixels[pixelPosition + 2];
                            int a = pixels[pixelPosition + 3];

                            colors[x + y * 8] = Color.FromArgb(a, r, g, b);
                        }
                    }

                    var palette = new Color[62];
                    for (int i = 0; i < 15; i++)
                    {
                        palette[i] = colors[i + 1];
                    }
                    for (int i = 15; i < 30; i++)
                    {
                        palette[i] = colors[i + 2];
                    }
                    for (int i = 30; i < 45; i++)
                    {
                        palette[i] = colors[i + 3];
                    }
                    for (int i = 45; i < 60; i++)
                    {
                        palette[i] = colors[i + 4];
                    }
                    palette[60] = colors[16];
                    palette[61] = colors[32];

                    sprite.SetPalette(palette);

                    // load pixel data
                    var pixelBytes   = new byte[128 * 448];
                    var greenPalette = new Dictionary <int, Color>();
                    for (int i = 0; i < 16; i++)
                    {
                        greenPalette[i] = colors[i];
                    }

                    for (int y = 0; y < 448; y++)
                    {
                        for (int x = 0; x < 128; x++)
                        {
                            int pixelPosition = y * bitmapData.Stride + (x * 4);

                            int b = pixels[pixelPosition + 0];
                            int g = pixels[pixelPosition + 1];
                            int r = pixels[pixelPosition + 2];
                            int a = pixels[pixelPosition + 3];

                            var pixel = Color.FromArgb(a, r, g, b);

                            if (y >= 440 && x >= 120)
                            {
                                // palette data, skip it
                                pixelBytes[x + y * 128] = 0;
                                continue;
                            }

                            if (a == 0 || greenPalette[0] == pixel)
                            {
                                pixelBytes[x + y * 128] = 0;
                            }
                            else
                            {
                                var pixelValue = greenPalette.FirstOrDefault(c => c.Value == pixel);
                                if (pixelValue.Key > 0)
                                {
                                    pixelBytes[x + y * 128] = (byte)pixelValue.Key;
                                }
                                else
                                {
                                    invalidPixelsFound = true;
                                    //logger.Debug($"Import PNG: Bad pixel value found. File: {ofd.FileName}, Pixel: [{x + y * 128}] {pixel.ToString()}");
                                }
                            }
                        }
                    }

                    List <byte[]> tiles = new List <byte[]>();

                    for (int yTile = 0; yTile < 56; yTile++)
                    {
                        for (int xTile = 0; xTile < 16; xTile++)
                        {
                            var currentTile = new byte[8 * 8];

                            for (int y = 0; y < 8; y++)
                            {
                                for (int x = 0; x < 8; x++)
                                {
                                    currentTile[x + y * 8] = pixelBytes[(xTile * 8 + x) + (yTile * 8 + y) * 128];
                                }
                            }

                            tiles.Add(currentTile);
                        }
                    }

                    byte[] pixels4bpp = new byte[0x7000];

                    int offset = 0;
                    foreach (var tile in tiles)
                    {
                        var four = SpriteLibrary.Utilities.Tile8x8To4Bpp(tile);
                        Array.Copy(four, 0, pixels4bpp, offset, 32);
                        offset += 32;
                    }

                    sprite.Set4bppPixelData(pixels4bpp);

                    if (invalidPixelsFound)
                    {
                        MessageBox.Show("PNG contains pixels that do not use the first 16 colors of the embedded palette. Pixels have been made transparent. Please verify your source file.", "Error");
                    }
                    SpriteForm newMDI = new SpriteForm(ofd.FileName, sprite);
                    newMDI.MdiParent = this;
                    newMDI.Show();

                    UpdateCurrentSprite(newMDI.loadedSprite);
                }
            }
        }
Exemplo n.º 9
0
        private void batchConvertToolStripMenuItem_Click(object sender, EventArgs e)
        {
            var sourceFolder      = "";
            var destinationFolder = "";

            using (var fbd = new FolderBrowserDialog())
            {
                fbd.Description = "Select Source Folder";
                //fbd.SelectedPath = @"D:\Projects\Zelda\Sprites";
                //if (!String.IsNullOrEmpty(config.DefaultFolder) && Directory.Exists(config.DefaultFolder))
                //{
                //    fbd.SelectedPath = config.DefaultFolder;
                //}
                //else
                //{
                //    fbd.SelectedPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
                //}

                var result = fbd.ShowDialog();
                if (result == DialogResult.OK)
                {
                    sourceFolder = fbd.SelectedPath;
                    //config.DefaultFolder = fbd.SelectedPath;

                    //var fileName = fbd.SelectedPath;

                    //MessageBox.Show($"{fileName} has been created!", "Enemizer Rom Created");
                }
            }

            using (var fbd = new FolderBrowserDialog())
            {
                fbd.Description  = "Select Destination Folder";
                fbd.SelectedPath = sourceFolder;
                //if (!String.IsNullOrEmpty(config.DefaultFolder) && Directory.Exists(config.DefaultFolder))
                //{
                //    fbd.SelectedPath = config.DefaultFolder;
                //}
                //else
                //{
                //    fbd.SelectedPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
                //}

                var result = fbd.ShowDialog();
                if (result == DialogResult.OK)
                {
                    destinationFolder = fbd.SelectedPath;
                    //config.DefaultFolder = fbd.SelectedPath;

                    //var fileName = fbd.SelectedPath;

                    //MessageBox.Show($"{fileName} has been created!", "Enemizer Rom Created");
                }
            }

            if (String.IsNullOrEmpty(sourceFolder) || String.IsNullOrEmpty(destinationFolder))
            {
                return;
            }

            var files = Directory.GetFiles(sourceFolder, "*.spr");

            foreach (var file in files)
            {
                try
                {
                    var destFilename = Path.Combine(destinationFolder, Path.GetFileNameWithoutExtension(file) + ".zspr");

                    var spriteFile   = File.ReadAllBytes(file);
                    var loadedSprite = new SpriteLibrary.PlayerSprite(spriteFile);
                    if (loadedSprite.Version == 0)
                    {
                        loadedSprite.DisplayText = Path.GetFileNameWithoutExtension(file);
                    }

                    var spriteData = loadedSprite.ToByteArray();
                    FileUtilities.WriteAllBytes(destFilename, spriteData);
                }
                catch (Exception ex)
                {
                    MessageBox.Show($"Failed to convert file {file}. {ex.ToString()}.");
                }
            }

            MessageBox.Show("Done converting sprites");
        }
Exemplo n.º 10
0
        // INJECT SPR TO ROM
        //  Select SPR
        private void injectROM_Click(object sender, EventArgs e)
        {
            //MessageBox.Show("1. Load SPR\n2. Load ROM\n3. Windows will warn you that the ROM exists. This app will NOT overwrite your ROM file.", "Sprite Injection", MessageBoxButtons.OK, MessageBoxIcon.Information);

            //InjectSPRopenDialog.ShowDialog();

            OpenFileDialog sprDialog = new OpenFileDialog();

            sprDialog.Title  = "Select Sprite File to Inject";
            sprDialog.Filter = SpriteLibrary.Sprite.OpenFileDialogFilter;
            if (sprDialog.ShowDialog() != DialogResult.OK)
            {
                return;
            }

            SpriteLibrary.PlayerSprite sprite = new SpriteLibrary.PlayerSprite(File.ReadAllBytes(sprDialog.FileName));
            if (sprite.IsValidPlayerSprite == false)
            {
                MessageBox.Show("Invalid sprite file");
                return;
            }

            OpenFileDialog romDialog = new OpenFileDialog();

            sprDialog.Title  = "Select ROM File to Inject";
            romDialog.Filter = "Rom (*.sfc)|*.sfc|All Files (*.*)|*.*";
            if (romDialog.ShowDialog() != DialogResult.OK)
            {
                return;
            }

            var spriteName = Path.GetFileNameWithoutExtension(sprDialog.FileName);
            var romName    = Path.GetFileNameWithoutExtension(romDialog.FileName);
            var romPath    = Path.GetFullPath(romDialog.FileName);

            var newRomName = $"{spriteName}-{romName}{Path.GetExtension(romDialog.FileName)}";

            SaveFileDialog newRomDialog = new SaveFileDialog();

            newRomDialog.Title    = "Select ROM File to Save Injected ROM";
            newRomDialog.FileName = newRomName;
            newRomDialog.Filter   = romDialog.Filter;
            if (newRomDialog.ShowDialog() != DialogResult.OK)
            {
                return;
            }

            FileStream srcFs  = new FileStream(romDialog.FileName, FileMode.Open, FileAccess.Read);
            FileStream destFs = new FileStream(newRomDialog.FileName, FileMode.OpenOrCreate, FileAccess.Write);

            int fileLength = (int)srcFs.Length;

            var romBytes = new byte[srcFs.Length];

            srcFs.Read(romBytes, 0, fileLength);
            srcFs.Close();

            Array.Copy(sprite.PixelData, 0, romBytes, 0x80000, sprite.PixelDataLength);
            Array.Copy(sprite.PaletteData, 0, romBytes, 0x0DD308, 0x78);
            Array.Copy(sprite.PaletteData, 0x78, romBytes, 0xDEDF5, 4);

            destFs.Write(romBytes, 0, fileLength);
            destFs.Close();

            MessageBox.Show($"Wrote file\r\n{newRomDialog.FileName}");
        }