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