diff options
author | Marcus Huderle <huderlem@gmail.com> | 2018-10-14 13:23:48 -0500 |
---|---|---|
committer | Marcus Huderle <huderlem@gmail.com> | 2018-10-14 13:23:48 -0500 |
commit | 67af64e101b23e6e0e3de8e642719810882b5ce2 (patch) | |
tree | 8769b4f816944d564e3cd8c5a86f8aa78734f891 | |
parent | 051a218980ba5bd3540ba1f3a47295de6f5cf6c7 (diff) |
Add -pinball-hatch-sprite option to gbagfx because it's a non-generalizable format
-rwxr-xr-x | tools/gbagfx/gfx.c | 50 | ||||
-rwxr-xr-x | tools/gbagfx/gfx.h | 4 | ||||
-rwxr-xr-x | tools/gbagfx/main.c | 40 | ||||
-rwxr-xr-x | tools/gbagfx/options.h | 2 |
4 files changed, 83 insertions, 13 deletions
diff --git a/tools/gbagfx/gfx.c b/tools/gbagfx/gfx.c index f927dee..04ee19c 100755 --- a/tools/gbagfx/gfx.c +++ b/tools/gbagfx/gfx.c @@ -35,6 +35,32 @@ static void AdvanceMetatilePosition(int *subTileX, int *subTileY, int *metatileX } } +static void AdvancePinballHatchSpriteMetatilePosition(int *subTileX, int *subTileY, int *metatileX, int *metatileY, int metatilesWide) +{ + int subTileCoords[9][2] = { + {1, 0}, + {0, 1}, + {2, 1}, + {1, 1}, + {2, 0}, + {0, 2}, + {1, 2}, + {2, 2}, + {0, 0}, + }; + + int tileIndex = *subTileX + (*subTileY) * 3; + *subTileX = subTileCoords[tileIndex][0]; + *subTileY = subTileCoords[tileIndex][1]; + if (tileIndex == 8) { + (*metatileX)++; + if (*metatileX == metatilesWide) { + *metatileX = 0; + (*metatileY)++; + } + } +} + static void ConvertFromTiles1Bpp(unsigned char *src, unsigned char *dest, int numTiles, int metatilesWide, int metatileWidth, int metatileHeight, bool invertColors) { int subTileX = 0; @@ -61,7 +87,7 @@ static void ConvertFromTiles1Bpp(unsigned char *src, unsigned char *dest, int nu } } -static void ConvertFromTiles4Bpp(unsigned char *src, unsigned char *dest, int numTiles, int metatilesWide, int metatileWidth, int metatileHeight, bool invertColors) +static void ConvertFromTiles4Bpp(unsigned char *src, unsigned char *dest, int numTiles, int metatilesWide, int metatileWidth, int metatileHeight, bool pinballHatchSprite, bool invertColors) { int subTileX = 0; int subTileY = 0; @@ -88,7 +114,11 @@ static void ConvertFromTiles4Bpp(unsigned char *src, unsigned char *dest, int nu } } - AdvanceMetatilePosition(&subTileX, &subTileY, &metatileX, &metatileY, metatilesWide, metatileWidth, metatileHeight); + if (pinballHatchSprite) { + AdvancePinballHatchSpriteMetatilePosition(&subTileX, &subTileY, &metatileX, &metatileY, metatilesWide); + } else { + AdvanceMetatilePosition(&subTileX, &subTileY, &metatileX, &metatileY, metatilesWide, metatileWidth, metatileHeight); + } } } @@ -145,7 +175,7 @@ static void ConvertToTiles1Bpp(unsigned char *src, unsigned char *dest, int numT } } -static void ConvertToTiles4Bpp(unsigned char *src, unsigned char *dest, int numTiles, int metatilesWide, int metatileWidth, int metatileHeight, bool invertColors) +static void ConvertToTiles4Bpp(unsigned char *src, unsigned char *dest, int numTiles, int metatilesWide, int metatileWidth, int metatileHeight, bool pinballHatchSprite, bool invertColors) { int subTileX = 0; int subTileY = 0; @@ -172,7 +202,11 @@ static void ConvertToTiles4Bpp(unsigned char *src, unsigned char *dest, int numT } } - AdvanceMetatilePosition(&subTileX, &subTileY, &metatileX, &metatileY, metatilesWide, metatileWidth, metatileHeight); + if (pinballHatchSprite) { + AdvancePinballHatchSpriteMetatilePosition(&subTileX, &subTileY, &metatileX, &metatileY, metatilesWide); + } else { + AdvanceMetatilePosition(&subTileX, &subTileY, &metatileX, &metatileY, metatilesWide, metatileWidth, metatileHeight); + } } } @@ -203,7 +237,7 @@ static void ConvertToTiles8Bpp(unsigned char *src, unsigned char *dest, int numT } } -void ReadImage(char *path, int tilesWidth, int bitDepth, int metatileWidth, int metatileHeight, struct Image *image, bool invertColors) +void ReadImage(char *path, int tilesWidth, int bitDepth, int metatileWidth, int metatileHeight, bool pinballHatchSprite, struct Image *image, bool invertColors) { int tileSize = bitDepth * 8; @@ -235,7 +269,7 @@ void ReadImage(char *path, int tilesWidth, int bitDepth, int metatileWidth, int ConvertFromTiles1Bpp(buffer, image->pixels, numTiles, metatilesWide, metatileWidth, metatileHeight, invertColors); break; case 4: - ConvertFromTiles4Bpp(buffer, image->pixels, numTiles, metatilesWide, metatileWidth, metatileHeight, invertColors); + ConvertFromTiles4Bpp(buffer, image->pixels, numTiles, metatilesWide, metatileWidth, metatileHeight, pinballHatchSprite, invertColors); break; case 8: ConvertFromTiles8Bpp(buffer, image->pixels, numTiles, metatilesWide, metatileWidth, metatileHeight, invertColors); @@ -245,7 +279,7 @@ void ReadImage(char *path, int tilesWidth, int bitDepth, int metatileWidth, int free(buffer); } -void WriteImage(char *path, int numTiles, int bitDepth, int metatileWidth, int metatileHeight, struct Image *image, bool invertColors) +void WriteImage(char *path, int numTiles, int bitDepth, int metatileWidth, int metatileHeight, bool pinballHatchSprite, struct Image *image, bool invertColors) { int tileSize = bitDepth * 8; @@ -284,7 +318,7 @@ void WriteImage(char *path, int numTiles, int bitDepth, int metatileWidth, int m ConvertToTiles1Bpp(image->pixels, buffer, numTiles, metatilesWide, metatileWidth, metatileHeight, invertColors); break; case 4: - ConvertToTiles4Bpp(image->pixels, buffer, numTiles, metatilesWide, metatileWidth, metatileHeight, invertColors); + ConvertToTiles4Bpp(image->pixels, buffer, numTiles, metatilesWide, metatileWidth, metatileHeight, pinballHatchSprite, invertColors); break; case 8: ConvertToTiles8Bpp(image->pixels, buffer, numTiles, metatilesWide, metatileWidth, metatileHeight, invertColors); diff --git a/tools/gbagfx/gfx.h b/tools/gbagfx/gfx.h index 5355ced..4c9f546 100755 --- a/tools/gbagfx/gfx.h +++ b/tools/gbagfx/gfx.h @@ -27,8 +27,8 @@ struct Image { bool hasTransparency; }; -void ReadImage(char *path, int tilesWidth, int bitDepth, int metatileWidth, int metatileHeight, struct Image *image, bool invertColors); -void WriteImage(char *path, int numTiles, int bitDepth, int metatileWidth, int metatileHeight, struct Image *image, bool invertColors); +void ReadImage(char *path, int tilesWidth, int bitDepth, int metatileWidth, int metatileHeight, bool pinballHatchSprite, struct Image *image, bool invertColors); +void WriteImage(char *path, int numTiles, int bitDepth, int metatileWidth, int metatileHeight, bool pinballHatchSprite, struct Image *image, bool invertColors); void FreeImage(struct Image *image); void ReadGbaPalette(char *path, struct Palette *palette); void WriteGbaPalette(char *path, struct Palette *palette); diff --git a/tools/gbagfx/main.c b/tools/gbagfx/main.c index 86b0afa..d6550ad 100755 --- a/tools/gbagfx/main.c +++ b/tools/gbagfx/main.c @@ -34,7 +34,7 @@ void ConvertGbaToPng(char *inputPath, char *outputPath, struct GbaToPngOptions * image.hasPalette = false; } - ReadImage(inputPath, options->width, options->bitDepth, options->metatileWidth, options->metatileHeight, &image, !image.hasPalette); + ReadImage(inputPath, options->width, options->bitDepth, options->metatileWidth, options->metatileHeight, options->pinballHatchSprite, &image, !image.hasPalette); image.hasTransparency = options->hasTransparency; @@ -51,7 +51,7 @@ void ConvertPngToGba(char *inputPath, char *outputPath, struct PngToGbaOptions * ReadPng(inputPath, &image); - WriteImage(outputPath, options->numTiles, options->bitDepth, options->metatileWidth, options->metatileHeight, &image, !image.hasPalette); + WriteImage(outputPath, options->numTiles, options->bitDepth, options->metatileWidth, options->metatileHeight, options->pinballHatchSprite, &image, !image.hasPalette); FreeImage(&image); } @@ -66,6 +66,7 @@ void HandleGbaToPngCommand(char *inputPath, char *outputPath, int argc, char **a options.width = 1; options.metatileWidth = 1; options.metatileHeight = 1; + options.pinballHatchSprite = 0; for (int i = 3; i < argc; i++) { @@ -123,15 +124,36 @@ void HandleGbaToPngCommand(char *inputPath, char *outputPath, int argc, char **a if (options.metatileHeight < 1) FATAL_ERROR("metatile height must be positive.\n"); } + else if (strcmp(option, "-pinball-hatch-sprite") == 0) { + options.pinballHatchSprite = 1; + } else { FATAL_ERROR("Unrecognized option \"%s\".\n", option); } } + if (options.pinballHatchSprite) { + if (options.metatileWidth != 1 || options.metatileHeight != 1) { + FATAL_ERROR("Cannot specify metatile dimensions for pinball hatch sprites.\n"); + } + + if (options.width == 1) { + options.width = 3; + } + + if (options.width % 3 != 0) { + FATAL_ERROR("Pinball hatch sprite width must be a multiple of 3."); + } + + options.metatileWidth = 3; + options.metatileHeight = 3; + } + if (options.metatileWidth > options.width) options.width = options.metatileWidth; + ConvertGbaToPng(inputPath, outputPath, &options); } @@ -144,11 +166,11 @@ void HandlePngToGbaCommand(char *inputPath, char *outputPath, int argc, char **a options.bitDepth = bitDepth; options.metatileWidth = 1; options.metatileHeight = 1; + options.pinballHatchSprite = 0; for (int i = 3; i < argc; i++) { char *option = argv[i]; - if (strcmp(option, "-num_tiles") == 0) { if (i + 1 >= argc) @@ -188,12 +210,24 @@ void HandlePngToGbaCommand(char *inputPath, char *outputPath, int argc, char **a if (options.metatileHeight < 1) FATAL_ERROR("metatile height must be positive.\n"); } + else if (strcmp(option, "-pinball-hatch-sprite") == 0) { + options.pinballHatchSprite = 1; + } else { FATAL_ERROR("Unrecognized option \"%s\".\n", option); } } + if (options.pinballHatchSprite) { + if (options.metatileWidth != 1 || options.metatileHeight != 1) { + FATAL_ERROR("Cannot specify metatile dimensions for pinball hatch sprites.\n"); + } + + options.metatileWidth = 3; + options.metatileHeight = 3; + } + ConvertPngToGba(inputPath, outputPath, &options); } diff --git a/tools/gbagfx/options.h b/tools/gbagfx/options.h index 2ff3967..b4738cd 100755 --- a/tools/gbagfx/options.h +++ b/tools/gbagfx/options.h @@ -12,6 +12,7 @@ struct GbaToPngOptions { int width; int metatileWidth; int metatileHeight; + bool pinballHatchSprite; }; struct PngToGbaOptions { @@ -19,6 +20,7 @@ struct PngToGbaOptions { int bitDepth; int metatileWidth; int metatileHeight; + bool pinballHatchSprite; }; #endif // OPTIONS_H |