summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Huderle <huderlem@gmail.com>2018-10-14 13:23:48 -0500
committerMarcus Huderle <huderlem@gmail.com>2018-10-14 13:23:48 -0500
commit67af64e101b23e6e0e3de8e642719810882b5ce2 (patch)
tree8769b4f816944d564e3cd8c5a86f8aa78734f891
parent051a218980ba5bd3540ba1f3a47295de6f5cf6c7 (diff)
Add -pinball-hatch-sprite option to gbagfx because it's a non-generalizable format
-rwxr-xr-xtools/gbagfx/gfx.c50
-rwxr-xr-xtools/gbagfx/gfx.h4
-rwxr-xr-xtools/gbagfx/main.c40
-rwxr-xr-xtools/gbagfx/options.h2
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