public bool CanExport(PSSFile file) { if (file == null) { return(false); } if (file.Platform != PSSFile.TargetPlatform.Gameboy && file.Platform != PSSFile.TargetPlatform.GameboyColor) { return(false); } return(true); }
public static void NewFile() { CloseFile(); Globals.CurrentFile = new PSSFile() { Filename = "Unnamed.pss", Platform = PSSFile.TargetPlatform.Gameboy, Version = 1 }; FileLoaded = false; FileChanged = true; Tile.Add(); CurrentFilename = "Unnamed.pss"; }
public static void SaveFile(string filename, bool exportTiles = true, bool exportMaps = true) { var exportFile = new PSSFile(); // hardcode for now exportFile.Platform = PSSFile.TargetPlatform.Gameboy; exportFile.Tiles = Tile.Tiles.Values.ToList(); exportFile.Maps = TileMap.TileMaps.Values.ToList(); exportFile.Save(filename); exportFile.FullPath = filename; exportFile.Filename = Path.GetFileName(filename); Globals.CurrentFile = exportFile; }
public static bool LoadFile(string filename, bool loadTiles = true, bool loadMaps = true) { var loadedFile = PSSFile.Load(filename); loadedFile.FullPath = filename; loadedFile.Filename = Path.GetFileName(filename); Globals.CurrentFile = loadedFile; if (loadTiles) { foreach (var tile in loadedFile.Tiles) { Tile.Tiles.Add(tile.Id, tile); } } if (loadMaps) { foreach (var map in loadedFile.Maps) { TileMap.TileMaps.Add(map.Index, map); } } if (loadTiles) { Globals.Events.OnTilesChanged(new ChangeEventArgs() { ChangeType = ChangeEventArgs.EventType.Added }); } if (loadMaps) { Globals.Events.OnMapsChanged(new ChangeEventArgs() { ChangeType = ChangeEventArgs.EventType.Added, MapIndex = -1 }); } return(true); }
public void Export(PSSFile file) { var folderSelector = new FolderBrowserDialog() { Description = "Select Output Directory...", ShowNewFolderButton = true }; if (folderSelector.ShowDialog() != DialogResult.OK) { return; } var outputDirectory = folderSelector.SelectedPath; var exportName = Path.GetFileNameWithoutExtension(file.Filename); var exportFilename = Path.Combine(outputDirectory, $"{exportName}.inc"); using (var header = File.CreateText(exportFilename)) { var sourceName = exportName; header.WriteLine($"; Exported from sourcefile: '{file.Filename}'"); header.WriteLine($"; Conversion: {DateTime.Now.ToString("s")}"); header.WriteLine(); if (true) // export tiles { header.WriteLine($"; {Tile.Tiles.Count} TILES"); header.WriteLine($"{sourceName}_tile_count EQU {Tile.Tiles.Count}"); header.WriteLine($"{sourceName}_tile_data_size EQU {Tile.Tiles.Count * 16}"); header.WriteLine($"{sourceName}_tile_data:"); foreach (var tile in Tile.Tiles.Values.OrderBy(t => t.Index)) { var bytestring = "DB "; foreach (var b in tile.TileImage.ToGameboyBytes()) { bytestring += "$" + b.ToString("X2") + ","; } header.WriteLine($"{bytestring.TrimEnd(',')} ; {(string.IsNullOrEmpty(tile.Label) ? "tile" : tile.Label)} {tile.Index}"); } header.WriteLine(); foreach (var tile in Tile.Tiles.Values.OrderBy(t => t.Index)) { if (!string.IsNullOrEmpty(tile.Label)) { header.WriteLine("TILEIDX_" + tile.Label.ToUpper() + " EQU " + tile.Index); } } if (true) { header.WriteLine(); // export maps } } if (true) // export maps { header.WriteLine($"; {TileMap.TileMaps.Count} MAPS"); foreach (var map in TileMap.TileMaps.Values.OrderBy(m => m.Index)) { header.WriteLine(); header.WriteLine($"; MAP {map.Index}: {map.Name} ({map.Width}x{map.Height})"); var safeMapName = map.Name.Replace(" ", ""); header.WriteLine(); header.WriteLine($"{safeMapName}_width EQU {map.Width}"); header.WriteLine($"{safeMapName}_height EQU {map.Height}"); header.WriteLine($"{safeMapName}_map_data_size EQU {map.Width * map.Height}"); header.WriteLine(); header.WriteLine($"{safeMapName}_map_data:"); for (var y = 0; y < map.Height; y++) { var line = "DB "; for (var x = 0; x < map.Width; x++) { line += "$" + map.Tiles[x + y * map.Width].ToString("X2") + ","; } header.WriteLine(line.TrimEnd(',')); } header.WriteLine(); if (map.Blocks.Any(b => b != 0)) { header.WriteLine($"{safeMapName}_map_block_data:"); for (var y = 0; y < map.Height; y++) { var line = "DB"; for (var x = 0; x < map.Width; x++) { line += " $" + map.Blocks[x + y * map.Width].ToString("X2") + ","; } header.WriteLine(line.TrimEnd(',')); } } } } header.Close(); } }
public void Export(PSSFile file) { var folderSelector = new FolderBrowserDialog() { Description = "Select Output Directory...", ShowNewFolderButton = true }; if (folderSelector.ShowDialog() != DialogResult.OK) { return; } var outputDirectory = folderSelector.SelectedPath; var exportName = Path.GetFileNameWithoutExtension(file.Filename); // show options dialog // pack maps by distinct tile count // export block maps var tileHeader = Path.Combine(outputDirectory, $"{exportName}_tiles.h"); using (var header = File.CreateText(tileHeader)) { header.WriteLine($"/* {exportName} tiles - exported by pewSpriteStudio on {DateTime.Now.ToString("s")} */"); header.WriteLine(); header.WriteLine($"#ifndef _{exportName.ToUpper()}_TILES_H"); header.WriteLine($"#define _{exportName.ToUpper()}_TILES_H"); header.WriteLine(); header.WriteLine($"// {file.Tiles.Count} tiles"); header.WriteLine(); header.WriteLine($"unsigned char {exportName}_tiles[] = {{"); foreach (var tile in file.Tiles.OrderBy(t => t.Index)) { var bytestring = ""; foreach (var b in tile.TileImage.ToGameboyBytes()) { bytestring += "0x" + b.ToString("X2") + ", "; } header.WriteLine($"{bytestring} // {tile.Index}"); } header.WriteLine("};"); header.WriteLine(); if (file.Tiles.Any(t => !string.IsNullOrEmpty(t.Label))) { header.WriteLine("// labels:"); header.WriteLine(); foreach (var tile in file.Tiles.Where(t => !string.IsNullOrEmpty(t.Label)).OrderBy(t => t.Index)) { header.WriteLine($"#define TILE_{tile.Label.ToUpper()} {tile.Index}"); } header.WriteLine(); } header.WriteLine($"#endif /* _{exportName.ToUpper()}_TILES_H */"); } foreach (var map in file.Maps.OrderBy(m => m.Index)) { var mapHeader = Path.Combine(outputDirectory, $"{exportName}_{map.Name}.h"); using (var header = File.CreateText(mapHeader)) { header.WriteLine($"/* {exportName} - {map.Name} - exported by pewSpriteStudio on {DateTime.Now.ToString("s")} */"); header.WriteLine(); header.WriteLine($"#ifndef _{exportName.ToUpper()}_{map.Name.ToUpper()}_H"); header.WriteLine($"#define _{exportName.ToUpper()}_{map.Name.ToUpper()}_H"); header.WriteLine(); header.WriteLine($"// MAP {map.Index}: {map.Name} ({map.Width}x{map.Height})"); header.WriteLine(); header.WriteLine($"#define {map.Name}_WIDTH {map.Width}u"); header.WriteLine($"#define {map.Name}_HEIGHT {map.Height}u"); var maxTile = map.Tiles.Max(); if (maxTile <= 4) { // back into 2 bit-nibbles header.WriteLine($"#define {map.Name}_PACKED 4u"); header.WriteLine(); header.WriteLine($"unsigned char {exportName}_{map.Name}_map[] = {{"); var packed = map.Tiles.Pack(2); header.WriteLine(string.Join(", ", packed.Select(p => "0x" + p.ToString("X2")).ToArray())); } else if (maxTile <= 15) { // back into words (4bit) header.WriteLine($"#define {map.Name}_PACKED 16u"); header.WriteLine(); header.WriteLine($"unsigned char {exportName}_{map.Name}_map[] = {{"); var packed = map.Tiles.Pack(4); header.WriteLine(string.Join(", ", packed.Select(p => "0x" + p.ToString("X2")).ToArray())); } else { //var distinctCount = map.Tiles.Distinct().Count(); header.WriteLine($"#define {map.Name}_PACKED 0u"); header.WriteLine(); header.WriteLine($"unsigned char {exportName}_{map.Name}_map[] = {{"); for (var y = 0; y < map.Height; y++) { for (var x = 0; x < map.Width; x++) { header.Write("0x" + map.Tiles[x + y * map.Width].ToString("X2") + ", "); } header.WriteLine(); } } header.WriteLine("};"); header.WriteLine(); // only export block if set if (map.Blocks.Any(b => b > 0)) { if (map.Blocks.Max() == 1) { // only block info header.WriteLine($"#define {exportName}_{map.Name}_BLOCKS_PACKED 1u"); header.WriteLine(); header.WriteLine($"unsigned char {exportName}_{map.Name}_blocks[] = {{"); /*var packedBuffer = new List<byte>(); * * byte mask = 128; * byte current = 0; * bool more = false; * * for (var i = 0; i < map.Blocks.Length; i++) * { * // set current bit * if (map.Blocks[i] > 0) * { * current |= (byte)(mask >> (i & 0x07)); * more = true; * } * * if ((i & 0x07) == 0x07) * { * packedBuffer.Add(current); * current = 0; * more = false; * } * } * * if (more) * { * packedBuffer.Add(current); * }*/ var packed = map.Blocks.Pack(1); header.WriteLine(string.Join(", ", packed.Select(p => "0x" + p.ToString("X2")).ToArray())); } else { // full properties header.WriteLine($"#define {exportName}_{map.Name}_BLOCKS_PACKED 0u"); header.WriteLine(); header.WriteLine($"unsigned char {exportName}_{map.Name}_blocks[] = {{"); for (var y = 0; y < map.Height; y++) { for (var x = 0; x < map.Width; x++) { header.Write("0x" + map.Blocks[x + y * map.Width].ToString("X2") + ", "); } header.WriteLine(); } } header.WriteLine("};"); header.WriteLine(); } header.WriteLine($"#endif /* _{exportName.ToUpper()}_{map.Name.ToUpper()}_H */"); } } var exportHeader = Path.Combine(outputDirectory, $"{exportName}.h"); using (var header = File.CreateText(exportHeader)) { header.WriteLine($"/* {exportName} - exported by pewSpriteStudio on {DateTime.Now.ToString("s")} */"); header.WriteLine(); header.WriteLine($"#ifndef _{exportName.ToUpper()}_H"); header.WriteLine($"#define _{exportName.ToUpper()}_H"); header.WriteLine(); header.WriteLine($"#include \"{exportName}_tiles.h\""); foreach (var map in file.Maps.OrderBy(m => m.Index)) { header.WriteLine($"#include \"{exportName}_{map.Name}.h\""); } header.WriteLine(); header.WriteLine($"#endif /* _{exportName.ToUpper()}_H */"); } }