fix actual problem of #955 by counting the tiles

This commit is contained in:
nhmall
2023-01-12 08:51:59 -05:00
parent a7756a1327
commit a22b56174f
4 changed files with 64 additions and 48 deletions
-2
View File
@@ -1,6 +1,4 @@
# monsters.txt - tile defintions for monsters # monsters.txt - tile defintions for monsters
# Note: if the number of monster tiles, object tiles, or other tiles
# changes, 'MAGICTILENO' in tile2bmp.c needs to be updated to match!
# Note too: lines beginning with '# tile ' are not comments; other # Note too: lines beginning with '# tile ' are not comments; other
# lines beginning with '#' are. # lines beginning with '#' are.
. = (71, 108, 108) . = (71, 108, 108)
-2
View File
@@ -1,6 +1,4 @@
# objects.txt - tile defintions for objects # objects.txt - tile defintions for objects
# Note: if the number of monster tiles, object tiles, or other tiles
# changes, 'MAGICTILENO' in tile2bmp.c needs to be updated to match!
# Note too: lines beginning with '# tile ' are not comments; other # Note too: lines beginning with '# tile ' are not comments; other
# lines beginning with '#' are. # lines beginning with '#' are.
. = (71, 108, 108) . = (71, 108, 108)
-2
View File
@@ -1,6 +1,4 @@
# other.txt - tile defintions for 'other' (walls, furniture, explosions) # other.txt - tile defintions for 'other' (walls, furniture, explosions)
# Note: if the number of monster tiles, object tiles, or other tiles
# changes, 'MAGICTILENO' in tile2bmp.c needs to be updated to match!
# Note too: lines beginning with '# tile ' are not comments; other # Note too: lines beginning with '# tile ' are not comments; other
# lines beginning with '#' are. # lines beginning with '#' are.
. = (71, 108, 108) . = (71, 108, 108)
+64 -42
View File
@@ -20,6 +20,7 @@
#include "tile.h" #include "tile.h"
extern void monst_globals_init(void); extern void monst_globals_init(void);
extern void objects_globals_init(void); extern void objects_globals_init(void);
static void examine_tilefiles(void);
#include <stdint.h> #include <stdint.h>
#if defined(UINT32_MAX) && defined(INT32_MAX) && defined(UINT16_MAX) #if defined(UINT32_MAX) && defined(INT32_MAX) && defined(UINT16_MAX)
@@ -53,24 +54,6 @@ extern void objects_globals_init(void);
extern char *tilename(int, int); extern char *tilename(int, int);
/* The numbers in the following calculation are the
count of tiles present in:
monsters.txt objects.txt other.txt monsters.txt */
#define MAGICTILENO (789 + 477 + 240 + 789)
#if BITCOUNT == 4
#define MAX_X 320 /* 2 per byte, 4 bits per pixel */
#define MAX_Y 480
#else
#if (TILE_X == 32)
#define MAX_X (32 * 40)
#define MAX_Y ((MAGICTILENO * 32) / 40) * 2
#else
#define MAX_X (16 * 40)
#define MAX_Y (((16 * MAGICTILENO) / 40) + 16)
#endif
#endif
/* GCC fix by Paolo Bonzini 1999/03/28 */ /* GCC fix by Paolo Bonzini 1999/03/28 */
#ifdef __GNUC__ #ifdef __GNUC__
#define PACK __attribute__((packed)) #define PACK __attribute__((packed))
@@ -154,17 +137,10 @@ struct tagBMP {
#endif #endif
RGBQUAD bmaColors[RGBQUAD_COUNT]; RGBQUAD bmaColors[RGBQUAD_COUNT];
#endif #endif
#if (COLORS_IN_USE == 16) uchar packtile; /* start */
uchar packtile[MAX_Y][MAX_X]; } PACK bmp, *newbmp;
#else
uchar packtile[MAX_Y][MAX_X];
/* uchar packtile[TILE_Y][TILE_X]; */
#endif
} PACK bmp;
#pragma pack() #pragma pack()
#define BMPFILESIZE (sizeof(struct tagBMP))
FILE *tibfile2; FILE *tibfile2;
pixel tilepixels[TILE_Y][TILE_X]; pixel tilepixels[TILE_Y][TILE_X];
@@ -173,6 +149,7 @@ static void build_bmfh(BITMAPFILEHEADER *);
static void build_bmih(UNALIGNED_POINTER BITMAPINFOHEADER *); static void build_bmih(UNALIGNED_POINTER BITMAPINFOHEADER *);
static void build_bmptile(pixel(*) [TILE_X]); static void build_bmptile(pixel(*) [TILE_X]);
/* monsters.txt must be first */
const char *tilefiles[] = { const char *tilefiles[] = {
#if (TILE_X == 32) #if (TILE_X == 32)
"../win/share/mon32.txt", "../win/share/obj32.txt", "../win/share/mon32.txt", "../win/share/obj32.txt",
@@ -183,6 +160,9 @@ const char *tilefiles[] = {
#endif #endif
}; };
int tilecnt[SIZE(tilefiles)];
int max_x, max_y;
int magictileno = 0, bmpsize;
int num_colors = 0; int num_colors = 0;
int tilecount; int tilecount;
int max_tiles_in_row = 40; int max_tiles_in_row = 40;
@@ -200,6 +180,7 @@ int
main(int argc, char *argv[]) main(int argc, char *argv[])
{ {
int i, j; int i, j;
uchar *c;
if (argc != 2) { if (argc != 2) {
Fprintf(stderr, "usage: %s outfile.bmp\n", argv[0]); Fprintf(stderr, "usage: %s outfile.bmp\n", argv[0]);
@@ -219,6 +200,20 @@ main(int argc, char *argv[])
objects_globals_init(); objects_globals_init();
monst_globals_init(); monst_globals_init();
examine_tilefiles();
for (i = 0; i < SIZE(tilecnt); ++i)
magictileno += tilecnt[i];
/* count monsters twice for grayscale variation */
magictileno += tilecnt[0];
max_x = 16 * 40;
max_y = ((16 * magictileno) / 40) + 16;
bmpsize = (sizeof bmp - sizeof bmp.packtile) + (max_y * (max_x * sizeof(uchar)));
newbmp = malloc(bmpsize);
if (!newbmp) {
printf("memory allocation failure, %d %d, aborting.\n",
bmpsize, magictileno);
}
tilecount = 0; tilecount = 0;
xoffset = yoffset = 0; xoffset = yoffset = 0;
initflag = 0; initflag = 0;
@@ -246,23 +241,26 @@ main(int argc, char *argv[])
build_bmfh(&bmp.bmfh); build_bmfh(&bmp.bmfh);
bmih = &bmp.bmih; bmih = &bmp.bmih;
build_bmih(bmih); build_bmih(bmih);
for (i = 0; i < MAX_Y; ++i)
for (j = 0; j < MAX_X; ++j)
bmp.packtile[i][j] = (uchar) 0;
for (i = 0; i < num_colors; i++) { for (i = 0; i < num_colors; i++) {
bmp.bmaColors[i].rgbRed = ColorMap[CM_RED][i]; bmp.bmaColors[i].rgbRed = ColorMap[CM_RED][i];
bmp.bmaColors[i].rgbGreen = ColorMap[CM_GREEN][i]; bmp.bmaColors[i].rgbGreen = ColorMap[CM_GREEN][i];
bmp.bmaColors[i].rgbBlue = ColorMap[CM_BLUE][i]; bmp.bmaColors[i].rgbBlue = ColorMap[CM_BLUE][i];
bmp.bmaColors[i].rgbReserved = 0; bmp.bmaColors[i].rgbReserved = 0;
} }
*newbmp = bmp;
for (i = 0; i < max_y; ++i)
for (j = 0; j < max_x; ++j) {
c = &newbmp->packtile + ((i * max_x) + j);
*c = (uchar) 0;
}
initflag = 1; initflag = 1;
} }
set_grayscale(pass == 3); set_grayscale(pass == 3);
/* printf("Colormap initialized\n"); */ /* printf("Colormap initialized\n"); */
while (read_text_tile(tilepixels)) { while (read_text_tile(tilepixels)) {
if (tilecount >= MAGICTILENO) { if (tilecount >= magictileno) {
Fprintf(stderr, "tile2bmp: more than %d tiles!\n", Fprintf(stderr, "tile2bmp: more than %d tiles!\n",
MAGICTILENO); magictileno);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
build_bmptile(tilepixels); build_bmptile(tilepixels);
@@ -272,7 +270,7 @@ main(int argc, char *argv[])
#else #else
xoffset += TILE_X; xoffset += TILE_X;
#endif #endif
if (xoffset >= MAX_X) { if (xoffset >= max_x) {
yoffset += TILE_Y; yoffset += TILE_Y;
xoffset = 0; xoffset = 0;
} }
@@ -280,7 +278,7 @@ main(int argc, char *argv[])
(void) fclose_text_file(); (void) fclose_text_file();
++pass; ++pass;
} }
fwrite(&bmp, sizeof bmp, 1, fp); fwrite(newbmp, bmpsize, 1, fp);
fclose(fp); fclose(fp);
Fprintf(stderr, "Total of %d tiles written to %s.\n", tilecount, bmpname); Fprintf(stderr, "Total of %d tiles written to %s.\n", tilecount, bmpname);
@@ -295,10 +293,10 @@ static void
build_bmfh(BITMAPFILEHEADER* pbmfh) build_bmfh(BITMAPFILEHEADER* pbmfh)
{ {
pbmfh->bfType = leshort(0x4D42); pbmfh->bfType = leshort(0x4D42);
pbmfh->bfSize = lelong(BMPFILESIZE); pbmfh->bfSize = lelong(bmpsize);
pbmfh->bfReserved1 = (UINT32) 0; pbmfh->bfReserved1 = (UINT32) 0;
pbmfh->bfReserved2 = (UINT32) 0; pbmfh->bfReserved2 = (UINT32) 0;
pbmfh->bfOffBits = lelong(sizeof(bmp.bmfh) + sizeof(bmp.bmih) pbmfh->bfOffBits = lelong(sizeof bmp.bmfh + sizeof bmp.bmih
+ (RGBQUAD_COUNT * sizeof(RGBQUAD))); + (RGBQUAD_COUNT * sizeof(RGBQUAD)));
} }
@@ -309,11 +307,11 @@ build_bmih(UNALIGNED_POINTER BITMAPINFOHEADER* pbmih)
int w, h; int w, h;
pbmih->biSize = lelong(sizeof(bmp.bmih)); pbmih->biSize = lelong(sizeof(bmp.bmih));
#if BITCOUNT == 4 #if BITCOUNT == 4
pbmih->biWidth = lelong(w = MAX_X * 2); pbmih->biWidth = lelong(w = max_x * 2);
#else #else
pbmih->biWidth = lelong(w = MAX_X); pbmih->biWidth = lelong(w = max_x);
#endif #endif
pbmih->biHeight = lelong(h = MAX_Y); pbmih->biHeight = lelong(h = max_y);
pbmih->biPlanes = leshort(1); pbmih->biPlanes = leshort(1);
#if BITCOUNT == 4 #if BITCOUNT == 4
pbmih->biBitCount = leshort(4); pbmih->biBitCount = leshort(4);
@@ -358,6 +356,7 @@ build_bmptile(pixel(*pixels)[TILE_X])
{ {
int cur_x, cur_y, cur_color, apply_color; int cur_x, cur_y, cur_color, apply_color;
int x, y; int x, y;
uchar *c;
for (cur_y = 0; cur_y < TILE_Y; cur_y++) { for (cur_y = 0; cur_y < TILE_Y; cur_y++) {
for (cur_x = 0; cur_x < TILE_X; cur_x++) { for (cur_x = 0; cur_x < TILE_X; cur_x++) {
@@ -370,19 +369,42 @@ build_bmptile(pixel(*pixels)[TILE_X])
if (cur_color >= num_colors) if (cur_color >= num_colors)
Fprintf(stderr, "color not in colormap! (tile #%d)\n", Fprintf(stderr, "color not in colormap! (tile #%d)\n",
tilecount); tilecount);
y = (MAX_Y - 1) - (cur_y + yoffset); y = (max_y - 1) - (cur_y + yoffset);
apply_color = cur_color; apply_color = cur_color;
#if BITCOUNT == 4 #if BITCOUNT == 4
x = (cur_x / 2) + xoffset; x = (cur_x / 2) + xoffset;
bmp.packtile[y][x] = (cur_x % 2 != 0) newbmp.packtile[y][x] = (cur_x % 2 != 0)
? (uchar) (bmp.packtile[y][x] | cur_color) ? (uchar) (bmp.packtile[y][x] | cur_color)
: (uchar) (cur_color << 4); : (uchar) (cur_color << 4);
#else #else
x = cur_x + xoffset; x = cur_x + xoffset;
bmp.packtile[y][x] = (uchar) apply_color; c = &newbmp->packtile + ((y * max_x) + x);
*c = (uchar) apply_color;
#endif #endif
} }
} }
} }
static void
examine_tilefiles(void)
{
FILE *fp2;
int i, tiles_in_file;
for (i = 0; i < SIZE(tilefiles); ++i) {
tiles_in_file = 0;
fp2 = fopen(tilefiles[i], "r");
if (fp2) {
char line[256];
while (fgets(line, sizeof line, fp2)) {
if (!strncmp(line, "# tile ", 7))
tiles_in_file++;
}
(void) fclose(fp2);
tilecnt[i] = tiles_in_file;
}
}
}
/*tile2bmp.c*/ /*tile2bmp.c*/