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