160 lines
4.2 KiB
C
160 lines
4.2 KiB
C
/* NetHack 3.6 tile2img.c $NHDT-Date: 1432512809 2015/05/25 00:13:29 $ $NHDT-Branch: master $:$NHDT-Revision: 1.6 $ */
|
|
/* Copyright (c) NetHack PC Development Team 1995 */
|
|
/* NetHack may be freely redistributed. See license for details. */
|
|
|
|
/*
|
|
* Edit History:
|
|
*
|
|
* Initial Creation M.Allison 94/01/11
|
|
* Marvin was here Marvin 97/01/11
|
|
*
|
|
*/
|
|
|
|
/* #include <stdlib.h> */
|
|
#include "hack.h"
|
|
#include "tile.h"
|
|
#include "bitmfile.h"
|
|
|
|
/* #define COLORS_IN_USE MAXCOLORMAPSIZE /* 256 colors */
|
|
#define COLORS_IN_USE 16 /* 16 colors */
|
|
|
|
extern char *tilename(int, int);
|
|
static void build_ximgtile(pixel(*) [TILE_X]);
|
|
void get_color(unsigned int colind, struct RGB *rgb);
|
|
void get_pixel(int x, int y, unsigned int *colind);
|
|
|
|
#if COLORS_IN_USE == 16
|
|
#define MAX_X 320 /* 2 per byte, 4 bits per pixel */
|
|
#else
|
|
#define MAX_X 640
|
|
#endif
|
|
#define MAX_Y 1200
|
|
|
|
FILE *tibfile2;
|
|
|
|
pixel tilepixels[TILE_Y][TILE_X];
|
|
|
|
char *tilefiles[] = { "..\\win\\share\\monsters.txt",
|
|
"..\\win\\share\\objects.txt",
|
|
"..\\win\\share\\other.txt" };
|
|
|
|
unsigned int **Bild_daten;
|
|
int num_colors = 0;
|
|
int tilecount;
|
|
int max_tiles_in_row = 40;
|
|
int tiles_in_row;
|
|
int filenum;
|
|
int initflag;
|
|
int yoffset, xoffset;
|
|
char bmpname[128];
|
|
FILE *fp;
|
|
|
|
int
|
|
main(argc, argv)
|
|
int argc;
|
|
char *argv[];
|
|
{
|
|
int i;
|
|
|
|
if (argc != 2) {
|
|
Fprintf(stderr, "usage: tile2img outfile.img\n");
|
|
exit(EXIT_FAILURE);
|
|
} else
|
|
strcpy(bmpname, argv[1]);
|
|
|
|
#ifdef OBSOLETE
|
|
bmpfile2 = fopen(NETHACK_PACKED_TILEFILE, WRBMODE);
|
|
if (bmpfile2 == (FILE *) 0) {
|
|
Fprintf(stderr, "Unable to open output file %s\n",
|
|
NETHACK_PACKED_TILEFILE);
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
#endif
|
|
|
|
tilecount = 0;
|
|
xoffset = yoffset = 0;
|
|
initflag = 0;
|
|
filenum = 0;
|
|
fp = fopen(bmpname, "wb");
|
|
if (!fp) {
|
|
printf("Error creating tile file %s, aborting.\n", bmpname);
|
|
exit(1);
|
|
}
|
|
fclose(fp);
|
|
|
|
Bild_daten = (unsigned int **) malloc(MAX_Y * sizeof(unsigned int *));
|
|
for (i = 0; i < MAX_Y; i++)
|
|
Bild_daten[i] = (unsigned int *) malloc(MAX_X * sizeof(unsigned int));
|
|
|
|
while (filenum < 3) {
|
|
if (!fopen_text_file(tilefiles[filenum], RDTMODE)) {
|
|
Fprintf(stderr, "usage: tile2img (from the util directory)\n");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
num_colors = colorsinmap;
|
|
if (num_colors > 62) {
|
|
Fprintf(stderr, "too many colors (%d)\n", num_colors);
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
while (read_text_tile(tilepixels)) {
|
|
build_ximgtile(tilepixels);
|
|
tilecount++;
|
|
xoffset += TILE_X;
|
|
if (xoffset >= MAX_X) {
|
|
yoffset += TILE_Y;
|
|
xoffset = 0;
|
|
}
|
|
}
|
|
(void) fclose_text_file();
|
|
++filenum;
|
|
}
|
|
Fprintf(stderr, "Total of %d tiles in memory.\n", tilecount);
|
|
|
|
bitmap_to_file(XIMG, MAX_X, (tilecount / 20 + 1) * 16, 372, 372, 4, 16,
|
|
bmpname, get_color, get_pixel);
|
|
|
|
Fprintf(stderr, "Total of %d tiles written to %s.\n", tilecount, bmpname);
|
|
|
|
exit(EXIT_SUCCESS);
|
|
/*NOTREACHED*/
|
|
return 0;
|
|
}
|
|
|
|
void
|
|
get_color(unsigned int colind, struct RGB *rgb)
|
|
{
|
|
rgb->r = (1000L * (long) ColorMap[CM_RED][colind]) / 0xFF;
|
|
rgb->g = (1000L * (long) ColorMap[CM_GREEN][colind]) / 0xFF;
|
|
rgb->b = (1000L * (long) ColorMap[CM_BLUE][colind]) / 0xFF;
|
|
}
|
|
|
|
void
|
|
get_pixel(int x, int y, unsigned int *colind)
|
|
{
|
|
*colind = Bild_daten[y][x];
|
|
}
|
|
|
|
static void
|
|
build_ximgtile(pixels)
|
|
pixel (*pixels)[TILE_X];
|
|
{
|
|
int cur_x, cur_y, cur_color;
|
|
int x, y;
|
|
|
|
for (cur_y = 0; cur_y < TILE_Y; cur_y++) {
|
|
for (cur_x = 0; cur_x < TILE_X; cur_x++) {
|
|
for (cur_color = 0; cur_color < num_colors; cur_color++) {
|
|
if (ColorMap[CM_RED][cur_color] == pixels[cur_y][cur_x].r
|
|
&& ColorMap[CM_GREEN][cur_color] == pixels[cur_y][cur_x].g
|
|
&& ColorMap[CM_BLUE][cur_color] == pixels[cur_y][cur_x].b)
|
|
break;
|
|
}
|
|
if (cur_color >= num_colors)
|
|
Fprintf(stderr, "color not in colormap!\n");
|
|
y = cur_y + yoffset;
|
|
x = cur_x + xoffset;
|
|
Bild_daten[y][x] = cur_color;
|
|
}
|
|
}
|
|
}
|