-/* NetHack 3.5 tile2bmp.c $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ */
-/* NetHack 3.5 tile2bmp.c $Date: 2009/05/06 10:59:00 $ $Revision: 1.6 $ */
-/* SCCS Id: @(#)tile2bmp.c 3.5 2002/03/14 */
+/* NetHack 3.5 tile2bmp.c $NHDT-Date: 1429464667 2015/04/19 17:31:07 $ $NHDT-Branch: master $:$NHDT-Revision: 1.10 $ */
/* Copyright (c) NetHack PC Development Team 1995 */
/* NetHack may be freely redistributed. See license for details. */
* Edit History:
*
* Initial Creation M.Allison 1994/01/11
+ * 256 colour bmp and statue support M.Allison 2015/04/19
*
*/
#include "win32api.h"
#endif
-/* #define COLORS_IN_USE MAXCOLORMAPSIZE /* 256 colors */
#if (TILE_X==32)
#define COLORS_IN_USE 256
#else
-#define COLORS_IN_USE 16 /* 16 colors */
+/*#define COLORS_IN_USE 16 */ /* 16 colors */
+#define COLORS_IN_USE 256 /* 256 colors */
#endif
#define BITCOUNT 8
extern char *FDECL(tilename, (int, int));
+#define MAGICTILENO (340 + 440 + 231 + 340)
+
#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 960
+#define MAX_Y ((MAGICTILENO * 32) / 40) * 2
# else
-#define MAX_X 640 /* 1 per byte, 8 bits per pixel */
-#define MAX_Y 480
+#define MAX_X (16 * 40)
+#define MAX_Y ((MAGICTILENO * 16) / 40) * 2
# endif
#endif
#if (TILE_X==32)
#define RGBQUAD_COUNT 256
#else
-#define RGBQUAD_COUNT 16
+/*#define RGBQUAD_COUNT 16 */
+#define RGBQUAD_COUNT 256
#endif
RGBQUAD bmaColors[RGBQUAD_COUNT];
#endif
#if (TILE_X == 32)
"../win/share/mon32.txt",
"../win/share/obj32.txt",
- "../win/share/oth32.txt"
+ "../win/share/oth32.txt",
#else
"../win/share/monsters.txt",
"../win/share/objects.txt",
- "../win/share/other.txt"
+ "../win/share/other.txt",
#endif
};
int tiles_in_row;
int filenum;
int initflag;
+int pass;
int yoffset,xoffset;
char bmpname[128];
FILE *fp;
xoffset = yoffset = 0;
initflag = 0;
filenum = 0;
+ pass = 0;
fp = fopen(bmpname,"wb");
if (!fp) {
printf("Error creating tile file %s, aborting.\n",bmpname);
exit(1);
}
- while (filenum < (sizeof(tilefiles) / sizeof(char *))) {
+ while (pass < 4) {
+ filenum =pass % (sizeof(tilefiles) / sizeof(char *));
if (!fopen_text_file(tilefiles[filenum], RDTMODE)) {
Fprintf(stderr,
"usage: tile2bmp (from the util directory)\n");
}
}
(void) fclose_text_file();
- ++filenum;
+ ++pass;
}
fwrite(&bmp, sizeof(bmp), 1, fp);
fclose(fp);
#endif
#if (TILE_X==16)
- pbmih->biSizeImage = lelong(0);
+ /* pbmih->biSizeImage = lelong(0); */
+ pbmih->biSizeImage = lelong(((w * cClrBits +31) & ~31) /8 * h);
#else
pbmih->biSizeImage = lelong(((w * cClrBits +31) & ~31) /8 * h);
#endif
pbmih->biClrImportant = (DWORD)0;
}
+static int graymappings[] = {
+ /*A B C D E F G H I J K L M N O P*/
+ 0, 16, 17, 18, 19, 12, 21, 22, 23, 24, 25, 14, 12, 13, 13, 13};
+
static void
build_bmptile(pixels)
pixel (*pixels)[TILE_X];
{
- int cur_x, cur_y, cur_color;
+ int cur_x, cur_y, cur_color, apply_color;
int x,y;
for (cur_y = 0; cur_y < TILE_Y; cur_y++) {
if (cur_color >= num_colors)
Fprintf(stderr, "color not in colormap!\n");
y = (MAX_Y - 1) - (cur_y + yoffset);
+ apply_color = cur_color;
+ if (pass == 3) {
+ /* map to shades of gray */
+ if (cur_color > (SIZE(graymappings)-1))
+ Fprintf(stderr, "Gray mapping issue %d %d.\n",
+ cur_color, SIZE(graymappings)-1);
+ else
+ apply_color = graymappings[cur_color];
+ }
#if BITCOUNT==4
x = (cur_x / 2) + xoffset;
bmp.packtile[y][x] = cur_x%2 ?
(uchar)(cur_color<<4);
#else
x = cur_x + xoffset;
- bmp.packtile[y][x] = (uchar)cur_color;
+ bmp.packtile[y][x] = (uchar)apply_color;
#endif
}
}
-/* NetHack 3.5 tilemap.c $NHDT-Date: 1425082379 2015/02/28 00:12:59 $ $NHDT-Branch: master $:$NHDT-Revision: 1.12 $ */
-/* NetHack 3.5 tilemap.c $Date: 2009/05/06 10:59:02 $ $Revision: 1.7 $ */
+/* NetHack 3.5 tilemap.c $NHDT-Date: 1429464668 2015/04/19 17:31:08 $ $NHDT-Branch: master $:$NHDT-Revision: 1.18 $ */
/* SCCS Id: @(#)tilemap.c 3.5 2000/06/04 */
/* NetHack may be freely redistributed. See license for details. */
#endif
short tilemap[MAX_GLYPH];
-int lastmontile, lastobjtile, lastothtile;
+int lastmontile, lastobjtile, lastothtile, laststatuetile;
/* Number of tiles for invisible monsters */
#define NUM_INVIS_TILES 1
tilenum++;
}
- /* statue patch: statues still use the same glyph as in vanilla */
-
- for ( i = 0; i < NUMMONS; i++) {
- tilemap[GLYPH_STATUE_OFF+i] = tilemap[GLYPH_OBJ_OFF+STATUE];
- }
-
lastothtile = tilenum - 1;
+
+ /* skip over the substitutes to get to the grayscale statues */
+ for (i = 0; i < SIZE(substitutes); i++) {
+ tilenum += substitutes[i].last_glyph - substitutes[i].first_glyph + 1;
+ }
+
+ /* statue patch: statues look more like the monster */
+ condnum = 0; /* doing monsters again, so reset */
+ for (i = 0; i < NUMMONS; i++) {
+ tilemap[GLYPH_STATUE_OFF+i] = tilenum;
+ tilenum++;
+ while (conditionals[condnum].sequence == MON_GLYPH &&
+ conditionals[condnum].predecessor == i) {
+ condnum++;
+ tilenum++;
+ }
+ }
+ laststatuetile = tilenum - 1;
}
const char *prolog[] = {