1 #include "compat.h"
2
3 #define MAXNUMTILES 256
4
5 int artversion, numtiles;
6 int localtilestart, localtileend;
7 short tilesizx[MAXNUMTILES], tilesizy[MAXNUMTILES];
8 int picanm[MAXNUMTILES];
9
openartfile(char * fn)10 FILE * openartfile(char *fn)
11 {
12 FILE *fh;
13
14 fh = fopen(fn,"rb");
15 if (!fh) return NULL;
16
17 fread(&artversion,4,1,fh); if (artversion != 1) { puts("Bad art version"); goto fail; }
18 fread(&numtiles,4,1,fh);
19 fread(&localtilestart,4,1,fh);
20 fread(&localtileend,4,1,fh);
21 numtiles = localtileend-localtilestart+1;
22 if (numtiles > MAXNUMTILES) { puts("Too many tiles"); goto fail; }
23 fread(tilesizx,2,numtiles,fh);
24 fread(tilesizy,2,numtiles,fh);
25 fread(picanm,4,numtiles,fh);
26
27 return fh;
28 fail:
29 fclose(fh);
30 return NULL;
31 }
32
main(int argc,char ** argv)33 int main(int argc, char **argv)
34 {
35 char const * palfile = "palette.dat", * voxfile = "output.vox";
36 int tilenum;
37 int depth;
38 FILE *artfh, *voxfh, *palfh;
39 int tilesz;
40 unsigned char palette[768];
41 unsigned char *tiledata;
42 int i;
43
44 if (argc < 4) {
45 puts("givedepth <artfile.art> <tilenum> <depth> [palette.dat] [output.vox]");
46 return 0;
47 }
48
49 tilenum = atoi(argv[2]);
50 depth = atoi(argv[3]);
51 if (argc >= 4) palfile = argv[4];
52 if (argc >= 5) voxfile = argv[5];
53
54 palfh = fopen(palfile,"rb");
55 if (!palfh) {
56 puts("Failure opening palette file");
57 return 1;
58 }
59 fread(palette,768,1,palfh);
60 fclose(palfh);
61
62 artfh = openartfile(argv[1]);
63 if (!artfh) {
64 puts("Failure opening art file");
65 return 1;
66 }
67
68 if (tilenum < 0 || tilenum > numtiles) {
69 puts("Tilenum out of range in art file");
70 fclose(artfh);
71 return 1;
72 }
73 for (i=0; i<tilenum; i++) fseek(artfh, tilesizx[i] * tilesizy[i], SEEK_CUR);
74
75 tilesz = tilesizx[tilenum]*tilesizy[tilenum];
76 tiledata = (unsigned char *)malloc(tilesz);
77 if (!tiledata) {
78 puts("Could not allocate memory for tile");
79 fclose(artfh);
80 return 1;
81 }
82
83 fread(tiledata, tilesz, 1, artfh);
84 fclose(artfh);
85
86 voxfh = fopen(voxfile,"wb");
87 if (!voxfh) {
88 puts("Could not create output file");
89 free(tiledata);
90 return 1;
91 }
92 fwrite(&depth,4,1,voxfh);
93 fwrite(&tilesizx[tilenum],4,1,voxfh);
94 fwrite(&tilesizy[tilenum],4,1,voxfh);
95 for (i=0; i<depth; i++) {
96 fwrite(tiledata,tilesz,1,voxfh);
97 }
98 fwrite(palette,768,1,voxfh);
99
100 free(tiledata);
101
102 return 0;
103 }
104