private void UpdateCurrentSprite(SpriteLibrary.PlayerSprite loadedSprite) { currentSprite = loadedSprite; if (loadedSprite != null) { currentSprite.SetAnimation(currentAnimation); currentSprite.SetAnimationPalette(paletteComboBox.SelectedIndex); BuildPalette(paletteComboBox.SelectedIndex); } }
public SpriteForm() { InitializeComponent(); loadedSprite = new SpriteLibrary.PlayerSprite(); this.Text = loadedSprite.DisplayText; this.Icon = ZSpriteTools.Properties.Resources.main; UpdateForm(); }
public SpriteForm(string Filename, SpriteLibrary.PlayerSprite sprite) { InitializeComponent(); loadedSprite = sprite; this.Icon = ZSpriteTools.Properties.Resources.main; this.Filename = Filename; this.Text = Filename; UpdateForm(); }
// 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(); }
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"); } }
// 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(); }
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); }
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); } } }
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"); }
// 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}"); }