diff options
Diffstat (limited to 'crawl-ref/source/rltiles/tool/dcqv.c')
-rw-r--r-- | crawl-ref/source/rltiles/tool/dcqv.c | 847 |
1 files changed, 847 insertions, 0 deletions
diff --git a/crawl-ref/source/rltiles/tool/dcqv.c b/crawl-ref/source/rltiles/tool/dcqv.c new file mode 100644 index 0000000000..88fe9cbbc1 --- /dev/null +++ b/crawl-ref/source/rltiles/tool/dcqv.c @@ -0,0 +1,847 @@ +#include "bm.h" + +/** Some global **/ +int corpse=0, mesh =0,slant=0; +int rim=0; +int exp_wall; +int dsize; +int sx32 = 16; +int sy32 = 24; +int end_normal = 0; + +FILE *mfp,*sfp; +char outname[1024], ctgname[100], subsname[100]; +char sdir[300]; + + +/*** BUFFER MEMORY ***/ +#define XX 16 +int xx0; +#define YY 30 +#define LX (XX) + +/*** tmp buffer, floor , final output, final queue ***/ +unsigned char *tbuf[3],fbuf[3][128*64], + *obuf[3],dbuf[3][128*64]; + + +unsigned char wallbuf[4][3][32*48]; +unsigned char wall2buf[3][128*64]; + + +int f_wx; + +/*** normal floor*/ +#define WOADR(x,y,xx,yy) \ +((x)*64+xx+ xx0*64*((y)*64+yy)) + + +#define ADR32(x,y) ((x)+(y)*32) +#define ADR64(x,y) ((x)+(y)*64) + + +/*** output width/height in block ***/ +int bx,by; + + +/**************************/ +/* Wrapper routines *******/ +/**************************/ + +int load_it(char *fnam, int *wx, int *wy) +{ + char fn[100]; + sprintf(fn,"%s%s%c%s.bmp",cpath,sdir,PATHSEP,fnam); + if(bmread(fn,wx,wy,tbuf)==0) return 0; + + sprintf(fn,"%s%s.bmp",cpath,fnam); + if(bmread(fn,wx,wy,tbuf)==0) return 0; + + if(subsname[0]){ + sprintf(fn,"%s%s%c%s.bmp",cpath,sdir,PATHSEP,subsname); + if(bmread(fn,wx,wy,tbuf)==0) return 0; + + sprintf(fn,"%s%s.bmp",cpath,subsname); + if(bmread(fn,wx,wy,tbuf)==0) return 0; + } + +return 1; +} + + +void clr_dbuf() { +int xx,yy; + +for(xx=0;xx<64;xx++){ +for(yy=0;yy<64;yy++){ +dbuf[0][ ADR64(xx,yy) ]=0x47; +dbuf[1][ ADR64(xx,yy) ]=0x6c; +dbuf[2][ ADR64(xx,yy) ]=0x6c; +}} +} + +#define TILEX 64 +#define TILEY 64 +void make_rim(){ +static unsigned char dflag[TILEX][TILEY]; +int x,y,c,dd[3],ad; +int n0,n1,n2; + +for(y=0;y<TILEY;y++){ +for(x=0;x<TILEX;x++){ + dflag[x][y]=1; + ad=x + y *TILEX; + for(c=0;c<3;c++)dd[c]=dbuf[c][ad]; + if( (dd[0]==0x47)&&(dd[1]==0x6c)&& (dd[2]==0x6c)) dflag[x][y]=0; + if( (dd[0]==0)&&(dd[1]==0)&& (dd[2]==0)) dflag[x][y]=2; +} +} + +for(x=0;x<TILEX;x++){ +for(y=0;y<TILEY;y++){ + ad=x+y*TILEX; +if(dflag[x][y]==2 || dflag[x][y]==0){ +n0=n1=n2=0; +if(x>0){ + if(dflag[x-1][y]==0) n0++; + if(dflag[x-1][y]==1) n1++; + if(dflag[x-1][y]==2) n2++; +} + +if(y>0){ + if(dflag[x][y-1]==0) n0++; + if(dflag[x][y-1]==1) n1++; + if(dflag[x][y-1]==2) n2++; +} + +if(x<TILEX-1){ + if(dflag[x+1][y]==0) n0++; + if(dflag[x+1][y]==1) n1++; + if(dflag[x+1][y]==2) n2++; +} +if(y<TILEY-1){ + if(dflag[x][y+1]==0) n0++; + if(dflag[x][y+1]==1) n1++; + if(dflag[x][y+1]==2) n2++; +} + +if(n1!=0 ) +dbuf[0][x+y*TILEX]=dbuf[1][x+y*TILEX]=dbuf[2][x+y*TILEX]=0x10; + + +}}} + +} + +void cp_floor_64(){ +int xx,yy,c; +for(xx=0;xx<64;xx++) +for(yy=0;yy<64;yy++) +for(c=0;c<3;c++) +dbuf[c][ ADR64(xx,yy) ]=fbuf[c][ ADR64(xx,yy)]; +} + +void cp_floor_32(){ +int xx,yy,c; +for(xx=0;xx<32;xx++) +for(yy=0;yy<32;yy++) +for(c=0;c<3;c++) +dbuf[c][ ADR64(32+xx-yy,32+(xx+yy)/2) ]=fbuf[c][ ADR32(xx,yy)]; +} + + +void cp_monst_32(){ +int xx,yy,c,dd[3],ad; +char dflag[32][32]; +int xmin,xmax,ymin,ymax; +int ox=0; +int oy=0; + +if(corpse==1 ){ + xmin=ymin=31; + xmax=ymax=0; + for(xx=0;xx<32;xx++){ + for(yy=0;yy<32;yy++){ + ad=ADR32(xx,yy); + for(c=0;c<3;c++)dd[c]=tbuf[c][ad]; + if( (dd[0]==0x47)&&(dd[1]==0x6c)&& (dd[2]==0x6c))continue; + if( (dd[0]==0)&&(dd[1]==0)&& (dd[2]==0))continue; + if(xx<xmin)xmin=xx; + if(xx>xmax)xmax=xx; + if(yy<ymin)ymin=yy; + if(yy>ymax)ymax=yy; + }}/*xy**/ + ox=(xmax+xmin)/2-16; + oy=(ymax+ymin)/2-16; +} + +if(slant==1){ + for(xx=0;xx<32;xx++){ + for(yy=0;yy<32;yy++){ + int x1 = xx-yy+32; + int y1= 32+(xx+yy)/2; + ad = ADR32(xx,yy); + for(c=0;c<3;c++){dd[c]=tbuf[c][ad];} + if(mesh==2){ + if( (dd[0]!=0x47)||(dd[1]!=0x6c)|| (dd[2]!=0x6c)){ + if( ((x1+y1)&1) ==0)dd[0]=dd[1]=dd[2]=0; + } + } + if(mesh==1){ + if( (((x1/2)+(y1/2))&1) ==1)dd[0]=dd[1]=dd[2]=0; + } + if( (dd[0]==0x47)&&(dd[1]==0x6c)&& (dd[2]==0x6c))continue; + for(c=0;c<3;c++) {dbuf[c][ADR64(x1,y1)]=dd[c];} + }} +return; +} + +if(dsize==1){ + for(xx=0;xx<32;xx++){ + for(yy=0;yy<32;yy++){ + int x1 = xx*2; + int y1= yy*2; + ad = ADR32(xx,yy); + for(c=0;c<3;c++){dd[c]=tbuf[c][ad];} + if(mesh==2){ + if( (dd[0]!=0x47)||(dd[1]!=0x6c)|| (dd[2]!=0x6c)){ + if( ((x1+y1)&1) ==0)dd[0]=dd[1]=dd[2]=0; + } + } + if(mesh==1){ + if( (((x1/2)+(y1/2))&1) ==1)dd[0]=dd[1]=dd[2]=0; + } + if( (dd[0]==0x47)&&(dd[1]==0x6c)&& (dd[2]==0x6c))continue; + for(c=0;c<3;c++) + { + dbuf[c][ADR64(x1,y1)]=dd[c]; + dbuf[c][ADR64(x1+1,y1)]=dd[c]; + dbuf[c][ADR64(x1,y1+1)]=dd[c]; + dbuf[c][ADR64(x1+1,y1+1)]=dd[c]; + } + }} +return; +} + + +for(xx=0;xx<32;xx++){ +for(yy=0;yy<32;yy++){ + dflag[xx][yy]=0; + ad=ADR32(xx,yy); + + if(corpse==1){ + int x1=xx+ox; + int y1=(yy+oy)*2-16; + int cy=18; + if(xx<4 || xx>=28)cy+=2;else + if(xx<12 || xx>=20) cy+=1; + + if(yy>=cy-1 && yy<=cy+0)continue; + x1 += (y1-16)/4; + if(y1>=cy){y1-=2;x1-=3;}else {y1 +=2;x1+=3;} + if(x1<0 || x1>=32 || y1<0 || y1>=32)continue; + ad=ADR32(x1,y1); + } + + /*** normal***/ + for(c=0;c<3;c++){dd[c]=tbuf[c][ad];} + if(mesh==2) + { + if( (dd[0]!=0x47)||(dd[1]!=0x6c)|| (dd[2]!=0x6c)) + { + if( ((xx+yy)&1) ==0)dd[0]=dd[1]=dd[2]=0; + } + } + else if(mesh==1) + { + if( (((xx/2)+(yy/2))&1) ==1)dd[0]=dd[1]=dd[2]=0; + } + + if( (dd[0]==0x47)&&(dd[1]==0x6c)&& (dd[2]==0x6c))continue; + if( (corpse==1) &&(dd[0]==0)&&(dd[1]==0)&& (dd[2]==0))continue; + + for(c=0;c<3;c++) {dbuf[c][ADR64(sx32+xx,sy32+yy)]=dd[c];} + dflag[xx][yy]=1; +}} + + +#if 1 +if(corpse==1){ +for(xx=0;xx<32;xx++){ +int cy=18; +if(xx<4 || xx>=28)cy+=2;else +if(xx<12 || xx>=20) cy+=1; +if(dflag[xx][cy-2]==1 && dflag[xx][cy+1]==1 ){ +for(yy=cy-1;yy<=cy-0;yy++){ dbuf[0][ADR64(16+xx,32+yy)]=32; +dbuf[1][ADR64(16+xx,32+yy)]=0;dbuf[2][ADR64(16+xx,32+yy)]=0; +dflag[xx][yy]=1; +}} +} + +/** shade**/ +for(xx=1;xx<32;xx++){ +for(yy=1;yy<32;yy++){ +if(dflag[xx][yy]==0 && dflag[xx-1][yy-1]==1){ +dbuf[0][ADR64(xx,yy)]=0; +dbuf[1][ADR64(xx,yy)]=0; +dbuf[2][ADR64(xx,yy)]=0; +} +}} + +for(xx=3;xx<32;xx++){ +for(yy=3;yy<32;yy++){ +if(dflag[xx][yy]==0 && dflag[xx-1][yy-1]==0 + && dflag[xx-2][yy-2]==1 && dflag[xx-3][yy-3]==1){ +dbuf[0][ADR64(xx,yy)]=0; +dbuf[1][ADR64(xx,yy)]=0; +dbuf[2][ADR64(xx,yy)]=0; +} +}} + +} +#endif +} + +void cp_monst_64(){ +int xx,yy,c,dd[3],ad; +int dflag[64][64]; + +for(xx=0;xx<64;xx++){ +for(yy=0;yy<64;yy++){ + dflag[xx][yy]=0; + ad=ADR64(xx,yy); + + if(corpse==1) + { + int y1=2*(yy-26); + int x1=32+(xx-32)*5/4+(y1-32)*3/4; + + y1 -= (xx-32)/3; + if(x1<0 || x1>=64 || y1<0 || y1>=64)continue; + ad=ADR64(x1,y1); + } + + /*** normal***/ + for(c=0;c<3;c++){dd[c]=tbuf[c][ad];} + + if( (corpse==1) &&(dd[0]==0)&&(dd[1]==0)&& (dd[2]==0))continue; + + if(mesh==2) + { + if( (dd[0]!=0x47)||(dd[1]!=0x6c)|| (dd[2]!=0x6c)) + if( ((xx+yy)&1) ==0)dd[0]=dd[1]=dd[2]=0; + } + + if(mesh==1) + if( (((xx/2)+(yy/2))&1) ==1)dd[0]=dd[1]=dd[2]=0; + + if( (dd[0]==0x47)&&(dd[1]==0x6c)&& (dd[2]==0x6c))continue; + + dflag[xx][yy]=1; + + for(c=0;c<3;c++) {dbuf[c][ADR64(xx,yy)]=dd[c];} +}} + +if (corpse == 1) +{ + for(yy=0;yy<64;yy++) + { + int thick=0; + for(xx=0;xx<64;xx++) + { + if(dflag[xx][yy]==1) + { + thick++; + if (thick>15) thick=15; + continue; + } + if (thick>0) + { + for(c=0;c<3;c++) {dbuf[c][ADR64(xx,yy)]=0;} + thick -= 3; + if (thick<0) thick=0; + } + } + } + + for(xx=0;xx<64;xx++) + { + int thick=0; + for(yy=0;yy<64;yy++) + { + if(dflag[xx][yy]==1) + { + thick++; + if (thick>15) thick=15; + continue; + } + if (thick>0) + { + for(c=0;c<3;c++) {dbuf[c][ADR64(xx,yy)]=0;} + thick -= 5; + if (thick<0) thick=0; + } + } + } + +} + + +} + + +void cp_monst_4864(){ +int xx,yy,c,dd[3],ad; +for(xx=0;xx<48;xx++){ +for(yy=0;yy<64;yy++){ + ad= xx+yy*48; + /*** normal***/ + for(c=0;c<3;c++){dd[c]=tbuf[c][ad];} + if(mesh==2) + { + if( (dd[0]!=0x47)||(dd[1]!=0x6c)|| (dd[2]!=0x6c)) + if( ((xx+yy)&1) ==0)dd[0]=dd[1]=dd[2]=0; + } + + if(mesh==1) + if( (((xx/2)+(yy/2))&1) ==1)dd[0]=dd[1]=dd[2]=0; + + if( (dd[0]==0x47)&&(dd[1]==0x6c)&& (dd[2]==0x6c))continue; + + for(c=0;c<3;c++) {dbuf[c][8+xx+yy*64]=dd[c];} +}} +} + +void bflush(){ +int xx,yy,c; +if(rim==1) make_rim(); + +for(xx=0;xx<64;xx++){ +for(yy=0;yy<64;yy++){ +for(c=0;c<3;c++){ +obuf[c][WOADR(bx,by,xx,yy)]= dbuf[c][ADR64(xx,yy)]; +}}} +} + + +void copy_wall(int wall_ix, int xofs, int yofs){ +int xx,yy,c; +unsigned char dd[3]; + for(xx=0;xx<64;xx++){ + for(yy=0;yy<64;yy++){ + int x=xx-xofs-16; + int y=yy-yofs-8; + int ad = x+y*32; + if(x<0 || y<0 || x>=32 || y>=48) continue; + for(c=0;c<3;c++){dd[c]=wallbuf[wall_ix][c][ad];} + if( (dd[0]==0x47)&&(dd[1]==0x6c)&& (dd[2]==0x6c))continue; + for(c=0;c<3;c++) {dbuf[c][ADR64(xx,yy)]=dd[c];} + }} +} + +void copy_wall_vert(int wall_ix, int xofs, int yofs){ +int xx,yy,c,ymax; +unsigned char dd[3]; + for(xx=0;xx<64;xx++){ + for(yy=0;yy<64;yy++){ + int x=xx-xofs-16; + int y=yy-yofs-8; + int ad = x+y*32; + if(x<0 || y<0 || x>=32 || y>=48) continue; + + ymax= 8+x/2; + if(ymax> 8+(31-x)/2) ymax=8+(31-x)/2; + if(y<ymax) continue; + + for(c=0;c<3;c++){dd[c]=wallbuf[wall_ix][c][ad];} + if( (dd[0]==0x47)&&(dd[1]==0x6c)&& (dd[2]==0x6c))continue; + + //Mesh +// if( ((x/2+y/2)&1) == 0) dd[0]=dd[1]=dd[2]=0; + + for(c=0;c<3;c++) {dbuf[c][ADR64(xx,yy)]=dd[c];} + }} +} + +void expand_wall(){ +//unsigned char wallbuf[4][3][32*48]; +int xx,yy,c,ix; +exp_wall=1; +for(ix=0;ix<4;ix++){ +for(xx=0;xx<32;xx++){ +for(yy=0;yy<48;yy++){ +wallbuf[ix][0][xx+yy*32]=0x47; +wallbuf[ix][1][xx+yy*32]=0x6c; +wallbuf[ix][2][xx+yy*32]=0x6c; +}}} + +//decompose wall bmp +for(xx=0;xx<32;xx++){ + int ymax= 8+xx/2; + if(ymax> 8+(31-xx)/2) ymax=8+(31-xx)/2; + for(yy=0;yy<ymax;yy++){ + ix=0; + if(2*yy+xx >=32)ix +=1; + if(2*yy-xx >=0 )ix +=2; + for(c=0;c<3;c++)wallbuf[ix][c][xx+yy*32]=tbuf[c][xx+yy*32]; + } + + for(yy=ymax;yy<48;yy++){ + if(xx<8) ix=2;else if(xx<24) ix=3; else ix=1; + for(c=0;c<3;c++)wallbuf[ix][c][xx+yy*32]=tbuf[c][xx+yy*32]; + } +}//xx + +/* + 0 +1 1 2 2 + 3 4 5 + 6 7 8 9 + A B C +4 D E 8 + F +*/ + +for(ix=0;ix<16;ix++){ + clr_dbuf(); + if(f_wx==32)cp_floor_32(); else cp_floor_64(); + + if((ix&3)==3) copy_wall(3,0,-16); + + if(ix&1) copy_wall(1,-16,-8); + if(ix&2) copy_wall(2,16,-8); + + if(ix&1) copy_wall(3,-16,-8); + copy_wall(0, 0,0); + if(ix&2) copy_wall(3,16,-8); + + if((ix&5)==5) {copy_wall(1,-32,0);copy_wall_vert(2,-16,0);} + copy_wall(2,0,0); + copy_wall(1,0,0); + if((ix&10)==10) {copy_wall(2,32,0);copy_wall_vert(1,16,0);} + + if(ix&4) {copy_wall(0,-16,8);copy_wall_vert(3,-16,0);} + copy_wall(3,0,0); + if(ix&8) {copy_wall(0,16,8);copy_wall_vert(3,16,0);} + + if(ix&4) {copy_wall(1,-16,8);copy_wall_vert(2,0,8);} + if(ix&8) {copy_wall(2,16,8); copy_wall_vert(1,0,8);} + if((ix&12)==12) {copy_wall(0,0,16);copy_wall_vert(3,0,8);} + + bflush(); + bx++;if(bx==xx0){bx=0;by++;} + }/*ix*/ +}
+ +
+static void copy_wall2_h1(int ix, int xofs, int yofs){ +int xx,yy,c,ad; +
+unsigned char dd[3]; + for(xx=0;xx<64;xx++){ + for(yy=0;yy<64;yy++){ + int x=xx-xofs; + int y=yy-yofs;; + ad = x+64+y*128; + if (x<0 || y<0 || x>63 || y>63)continue;
+ if(2*y>=x+32) continue;
+ if(2*y>=95-x) continue;
+ if((ix%3)==0) if (2*y>=47-x)continue;
+ if((ix%3)==1) if ((2*y<47-x) || (2*y>=79-x))continue;
+ if((ix%3)==2) if(2*y<79-x)continue;
+
+ if((ix/3)==0) if(2*y>=x-16)continue;
+ if((ix/3)==1) if((2*y<x-16) || (2*y>=x+16))continue;
+ if((ix/3)==2) if(2*y<x+16) continue;
+
+ for(c=0;c<3;c++){dd[c]=tbuf[c][ad];} + if( (dd[0]==0x47)&&(dd[1]==0x6c)&& (dd[2]==0x6c))continue; + + for(c=0;c<3;c++) {dbuf[c][ADR64(xx,yy)]=dd[c];} + }} +} +
+void copy_wall2_h2(int ix, int xofs, int yofs){ +int xx,yy,c,ad; +
+unsigned char dd[3]; + for(xx=0;xx<64;xx++){ + for(yy=0;yy<64;yy++){ + int x=xx-xofs; + int y=yy-yofs;; + ad = x+y*128; + if (x<0 || y<0 || x>63 || y>63)continue;
+ if(2*y>=x+32) continue;
+ if(2*y>=95-x) continue;
+
+ if ((ix%2)==0)if (2*y>=63-x)continue;
+ if((ix%2)==1) if (2*y<63-x)continue;
+
+ if((ix/2)==0)if(2*y>=x)continue;
+ if((ix/2)==1)if(2*y<x)continue;
+
+
+ for(c=0;c<3;c++){dd[c]=tbuf[c][ad];} + if( (dd[0]==0x47)&&(dd[1]==0x6c)&& (dd[2]==0x6c))continue; + + for(c=0;c<3;c++) {dbuf[c][ADR64(xx,yy)]=dd[c];} + }} +}
+
+
+void copy_wall_v2(int ix, int kind, int xofs, int yofs){ +int xx,yy,c,ymax,ad; +unsigned char dd[3]; + for(xx=0;xx<64;xx++){ + for(yy=0;yy<64;yy++){ + int x=xx-xofs; + int y=yy-yofs; + ad = x+kind*64+y*128; + if(x<0 || y<0 || x>=64 || y>=64) continue; + + ymax= 16+x/2; + if(x>=32) ymax=16+(63-x)/2; + if(y<ymax) continue; + if(y>ymax+32)continue;
+
+ if(ix==0) if(x>=8)continue;
+ if(ix==1) if(x<8 || x>=24)continue;
+ if(ix==2) if(x<24 || x>=40)continue;
+ if(ix==3) if(x<40 || x>=56)continue;
+ if(ix==4) if(x<56)continue;
+ + for(c=0;c<3;c++){dd[c]=tbuf[c][ad];} + if( (dd[0]==0x47)&&(dd[1]==0x6c)&& (dd[2]==0x6c))continue; + for(c=0;c<3;c++) {dbuf[c][ADR64(xx,yy)]=dd[c];} + }} +}
+void expand_wall2(){
+//void copy_wall2_h(int kind, int ix, int xofs, int yofs) +int ix; +exp_wall=1; +
+for(ix=0;ix<16;ix++){ + clr_dbuf(); + if(f_wx==32)cp_floor_32(); else cp_floor_64(); +
+if((ix&3)==0) copy_wall2_h1(0, 0, 8);
+if((ix&3)==1) copy_wall2_h1(1, -16, 0);
+if((ix&3)==2) copy_wall2_h1(3, 16, 0);
+if((ix&3)==3) copy_wall2_h2(0, 0, 0);
+
+if((ix&5)==0) copy_wall2_h1(6, 16, 0);
+if((ix&5)==1) copy_wall2_h1(7, 0, -8);
+if((ix&5)==4) copy_wall2_h1(3, 0, 8);
+if((ix&5)==5) copy_wall2_h2(2, 0, 0);
+
+
+if((ix&10)==0) copy_wall2_h1(2, -16, 0);
+if((ix&10)==2) copy_wall2_h1(5, 0, -8);
+if((ix&10)==8) copy_wall2_h1(1, 0, 8);
+if((ix&10)==10) copy_wall2_h2(1, 0, 0);
+
+if((ix&12)==0) copy_wall2_h1(8, 0, -8);
+if((ix&12)==4) copy_wall2_h1(5, -16, 0);
+if((ix&12)==8) copy_wall2_h1(7, 16, 0);
+if((ix&12)==12) copy_wall2_h2(3, 0, 0); +
+
+if((ix&5)==5) copy_wall_v2(0, 0, 0, 0);
+if((ix&10)==10) copy_wall_v2(4, 0, 0, 0);
+
+if((ix&4)!=0) copy_wall_v2(1, 0, 0, 0);
+if((ix&8)!=0) copy_wall_v2(3, 0, 0, 0);
+
+
+if((ix&12)==12) copy_wall_v2(2, 0, 0, 0);
+
+if((ix&5)==1) copy_wall_v2(1, 1, 0, -8);
+if((ix&12)==8) copy_wall_v2(1, 1, 16, 0);
+
+if((ix&10)==2) copy_wall_v2(3, 1, 0, -8);
+if((ix&12)==4) copy_wall_v2(3, 1, -16, 0);
+
+if((ix&5)==0) copy_wall_v2(0, 1, 16, 0);
+if((ix&10)==0) copy_wall_v2(4, 1, -16, 0);
+if((ix&12)==0) copy_wall_v2(2, 1, 0, -8);
+
+ bflush(); + bx++;if(bx==xx0){bx=0;by++;} +} +} + + +void load_monst(fnam) char *fnam;{ +int wx, wy; + if( load_it(fnam, &wx, &wy)) + { + printf("no file %s.bmp\n",fnam); + getchar(); + exit(1); + } + exp_wall=0; + if(wx==128 && wy==64) expand_wall2(); + else if(wx==48 && wy==64) cp_monst_4864(); + else if(wx==32 && wy==48) expand_wall(); + else if(wx==32)cp_monst_32(); + else if(wx==64)cp_monst_64(); + bflush(); +} + +void process_config(char *fname) +{ + int i,j; + char tmp[100],st[1024]; + char *nuke; + FILE *fp=fopen(fname,"r"); + if(fp==NULL){ + printf("Error no config file %s\nHit return",fname); + getchar(); + exit(1); + } + + +while(1){ + int dummy; + fgets(tmp,99,fp); + if(feof(fp))break; + i=0;while(i<99 && tmp[i]>=32)i++; + tmp[i]=0; + +fprintf(stderr,"[%s]\n",tmp); + + if(getname(tmp,"back",st)) + { + /*** Set Background BMP (format "%back bmpname") ***/ + if(strncmp(st,"none",4)==0) + { + /** clear **/ + for(i=0;i<32*32;i++){fbuf[0][i]=0x47;fbuf[1][i]=fbuf[2][i]=0x6c;} + f_wx=64; + } + else + { + int wy; + load_it(st, &f_wx, &wy); + for(i=0;i<f_wx*wy;i++)for(j=0;j<3;j++)fbuf[j][i]=tbuf[j][i]; + } + continue; + } + + if (getname(tmp,"include",st)){ + char fn2[200]; + sprintf(fn2,"%s%s",cpath, st); + if(strcmp(fname,fn2)!=0) process_config(fn2); + continue; + } + + if (getval(tmp,"slant",&slant)) continue; + if (getval(tmp,"corpse",&corpse)) continue; + if (getval(tmp,"dsize",&dsize)) continue; + if (getval(tmp,"mesh",&mesh)) continue; + if (getval(tmp,"rim",&rim)) continue; + if (getname(tmp,"ctg",ctgname)) continue; + if (getname(tmp,"subst",subsname)) continue; + if (getname(tmp,"sdir",sdir)) continue; + if (getname(tmp,"name", outname)) continue; + if (getval(tmp,"width",&xx0)) continue; + if (getval(tmp,"sx",&sx32)) continue; + if (getval(tmp,"sy",&sy32)) continue; + if (getval(tmp,"end_normal",&dummy)) + { + fprintf(sfp,"-1, -1 };\n"); + end_normal = 1; + continue; + } + + if (tmp[0]=='#' || tmp[0]<32) + { + if(tmp[0]=='#')fprintf(sfp,"//%s\n",tmp); + if(tmp[0]<32) fprintf(sfp,"\n"); + continue; + } + + /*** normal bitmap ***/ + + clr_dbuf(); + if(f_wx==32)cp_floor_32(); else cp_floor_64(); + i=0;while(i<99 && tmp[i]>32)i++; + tmp[i]=0; strcpy(st, &tmp[i+1]); + load_monst(tmp); + if(!strstr(st,"IGNORE_COMMENT")) + { + nuke=strstr(st,"/*");if(nuke)*nuke=0; + if(exp_wall) + fprintf(sfp,"TILE_%s, (TILE_TOTAL+%d),\n",st,bx+by*xx0-16); + else + if(end_normal) + fprintf(sfp,"#define TILE_%s %d\n",st,bx+by*xx0); + else + fprintf(sfp,"TILE_%s, (TILE_TOTAL+%d),\n",st,bx+by*xx0); + } + + if(!exp_wall){bx++;if(bx==xx0){bx=0;by++;}} + +}/* while */ + + fclose(fp); +} + +int main(argc,argv) +int argc; +char *argv[]; +{ + + int i; + char fn[100]; + + fixalloc(tbuf,256*256); + + slant=corpse=mesh=dsize=0; + + bx=by=0; + process_cpath(argv[0]); + fixalloc(obuf, LX*64*(YY)*64); + + + xx0=XX; + ctgname[0]=0; + subsname[0]=0; + sdir[0]=0; + + stdpal(); + + strcpy(outname,"tile"); + +sprintf(fn,"%stiledef-qv.h",cpath); +sfp=fopen(fn,"w"); +if(sfp==NULL){ + printf("Error could not open %s\nHit return",fn); + getchar(); + exit(1); +} + +fprintf(sfp,"/* Automatically generated by tile generator. */\n"); +fprintf(sfp,"const int tile_qv_pair_table[] ={\n"); + + printf("%s\ncpath=%s\n",argv[0],cpath); + if(argc==1) + sprintf(fn,"%sdc-3d.txt",cpath); + else strcpy(fn,argv[1]); + process_config(fn); + + +if(end_normal == 0)fprintf(sfp,"-1, -1 };\n"); + +fprintf(sfp,"\n#define TILE_TOTAL_EX %d\n",bx+by*xx0); +fprintf(sfp,"#define TILE_PER_ROW_EX %d\n",xx0); + + +fclose(sfp); +i=by*64;if(bx!=0)i+=64; + +sprintf(fn,"%s%s.bmp",cpath,outname); +bmwrite(fn,xx0*64,i,obuf); + +return 0; +} |