summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/rltiles/tool/dcpl.c
diff options
context:
space:
mode:
Diffstat (limited to 'crawl-ref/source/rltiles/tool/dcpl.c')
-rw-r--r--crawl-ref/source/rltiles/tool/dcpl.c581
1 files changed, 581 insertions, 0 deletions
diff --git a/crawl-ref/source/rltiles/tool/dcpl.c b/crawl-ref/source/rltiles/tool/dcpl.c
new file mode 100644
index 0000000000..ef9b59fb31
--- /dev/null
+++ b/crawl-ref/source/rltiles/tool/dcpl.c
@@ -0,0 +1,581 @@
+#include "bm.h"
+
+/** Some global **/
+//Flags
+int corpse, mesh, slant,rim;
+// Files
+FILE *mfp,*sfp;
+//Strings
+char outname[1024], subsname[200], sdir[200];
+char realname[1024];
+
+/** Parts related **/
+int parts_n;
+#define MAXPARTS 20
+int parts_nx[MAXPARTS], parts_ny[MAXPARTS];
+int parts_ox[MAXPARTS], parts_oy[MAXPARTS];
+int parts_start[MAXPARTS], parts_number[MAXPARTS];
+
+char parts_names[MAXPARTS][64];
+
+int parts_comment_ofs[MAXPARTS];
+int n_comments, pos_comment;
+#define MAXTOTAL 1000
+int part_comment_ofs[MAXTOTAL];
+char comment[MAXTOTAL*60];
+
+int part_x,part_y;
+int part_n;
+int part_nx,part_ny;
+char part_name[32];
+int part_wx, part_wy, part_ox, part_oy;
+
+/*** BUFFER MEMORY ***/
+#define XX 30
+int xx0;
+#define LX (XX)
+
+
+/*** tmp buffer, floor , final output, final queue ***/
+unsigned char *tbuf[3],*fbuf[3],*dbuf[3], *obuf[3];
+
+/*** normal floor*/
+#define WOADR(x,y,xx,yy) \
+((x)*32+xx+ xx0*32*((y)*32+yy))
+
+#define ADR(x,y) ((x)+(y)*32)
+
+/*** output width/height in block ***/
+int bx,by;
+
+/****************************/
+/* Wrapper routines ********/
+/**************************/
+int load_pxxx(fnam)
+ char *fnam;
+{
+ int x,y;
+
+ sprintf(realname,"%s%s%c%s.bmp",cpath,sdir,PATHSEP,fnam);
+ if(bmread(realname,&x,&y,tbuf)==0) return 0;
+
+ sprintf(realname,"%s%s.bmp",cpath,fnam);
+ if(bmread(realname,&x,&y,tbuf)==0) return 0;
+
+ if(subsname[0])
+ {
+ sprintf(realname,"%s%s%c%s.bmp",cpath,sdir,PATHSEP,subsname);
+ if(bmread(realname,&x,&y,tbuf)==0) return 0;
+
+ sprintf(realname,"%s%s.bmp",cpath,subsname);
+ if(bmread(realname,&x,&y,tbuf)==0) return 0;
+ }
+
+ return 1;
+}
+
+
+void clr_buf()
+{
+int xx,yy;
+
+ for(xx=0;xx<32;xx++)
+ {
+ for(yy=0;yy<32;yy++)
+ {
+ dbuf[0][ ADR(xx,yy) ]=0x47;
+ dbuf[1][ ADR(xx,yy) ]=0x6c;
+ dbuf[2][ ADR(xx,yy) ]=0x6c;
+ }
+ }
+}
+
+void cp_floor()
+{
+ int xx,yy,c;
+ for(xx=0;xx<32;xx++)
+ for(yy=0;yy<32;yy++)
+ for(c=0;c<3;c++)
+ dbuf[c][ ADR(xx,yy) ]=fbuf[c][ ADR(xx,yy)];
+}
+
+void cp_monst_32()
+{
+ int xx,yy,c,dd[3],ad;
+ char dflag[33][32];
+ int xmin,xmax,ymin,ymax,ox,oy;
+
+ if(corpse==1 )
+ {
+ xmin=ymin=31;
+ xmax=ymax=0;
+ for(xx=0;xx<32;xx++){
+ for(yy=0;yy<32;yy++){
+ ad=ADR(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;
+ }
+ }
+ ox=(xmax+xmin)/2-16;
+ oy=(ymax+ymin)/2-16;
+ }
+
+ /** copy loop **/
+ for(xx=0;xx<32;xx++){
+ for(yy=0;yy<32;yy++){
+ dflag[xx][yy]=0;
+ ad=ADR(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=ADR(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;
+ }
+ }
+ 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][ADR(xx,yy)]=dd[c];}
+ dflag[xx][yy]=1;
+ }
+ }/*XY*/
+
+#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][ADR(xx,yy)]=32;
+ dbuf[1][ADR(xx,yy)]=0;
+ dbuf[2][ADR(xx,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][ADR(xx,yy)]=0;
+ dbuf[1][ADR(xx,yy)]=0;
+ dbuf[2][ADR(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][ADR(xx,yy)]=0;
+ dbuf[1][ADR(xx,yy)]=0;
+ dbuf[2][ADR(xx,yy)]=0;
+ }
+ }
+ }
+
+ }
+#endif
+}
+
+
+void bflush()
+{
+ int xx,yy,c;
+ for(xx=part_ox;xx<part_ox+part_wx;xx++){
+ for(yy=part_oy;yy<part_oy+part_wy;yy++){
+ for(c=0;c<3;c++){
+ obuf[c][WOADR(bx,by,part_x*part_wx+xx-part_ox,part_y*part_wy+yy-part_oy)]
+ = dbuf[c][ADR(xx,yy)];
+ }
+ }
+ }
+}
+
+
+void load_monst(fnam) char *fnam;{
+ if( load_pxxx(fnam)){
+ printf("no file %s.bmp\n",fnam);
+ getchar();
+ exit(1);
+ }
+ cp_monst_32();
+ bflush();
+}
+
+void flush_part()
+{
+
+ if(part_x!=0 || part_y!=0)
+ {
+ part_x=part_y=0;
+ bx++;if(bx==xx0){bx=0;by++;;}
+ }
+ parts_number[parts_n]=part_n;
+ parts_n++;
+
+}
+
+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){
+ fgets(tmp,99,fp);
+ if(feof(fp))break;
+ i=0;
+ while(i<99 && tmp[i]>=32) i++;
+ tmp[i]=0;
+
+ 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;}
+ }
+ else
+ {
+ load_pxxx(st);
+ for(i=0;i<32*32;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,"rim",&rim)) continue;
+ if (getval(tmp,"mesh",&mesh)) continue;
+ if (getval(tmp,"corpse",&corpse)) 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 (getname(tmp,"parts_ctg",part_name))
+ {
+ if(part_n!=0)
+ flush_part();
+ part_n=0;
+ strcpy(parts_names[parts_n],part_name);
+ parts_comment_ofs[parts_n] = n_comments;
+ parts_start[parts_n]=bx+by*xx0;
+ fprintf(sfp,"#define TILEP_PART_%s %d\n",part_name, parts_n);
+ fprintf(sfp,"enum %s {\n",part_name);
+ fprintf(sfp," TILEP_%s_000,\n",part_name);
+
+ continue;
+ }
+
+ if (getval(tmp,"parts_wx",&part_wx))
+ {
+ parts_nx[parts_n]=part_nx=32/part_wx;
+ continue;
+ }
+
+ if (getval(tmp,"parts_wy",&part_wy))
+ {
+ parts_ny[parts_n]=part_ny=32/part_wy;
+ continue;
+ }
+
+ if (getval(tmp,"parts_ox", &part_ox))
+ {
+ parts_ox[parts_n]=part_ox;
+ continue;
+ }
+
+ if (getval(tmp,"parts_oy", &part_oy))
+ {
+ parts_oy[parts_n]=part_oy;
+ continue;
+ }
+
+ /****/
+ if (tmp[0]=='#' || tmp[0]<32){
+ if(tmp[0]=='#') fprintf(sfp,"//%s\n",tmp);
+ continue;
+ }
+
+ if (strcmp(tmp, "%end") == 0)
+ {
+ fprintf(sfp," N_PART_%s};\n\n",part_name);
+ continue;
+ }
+ /*** normal bitmap ***/
+#define WID 32
+ clr_buf();
+ cp_floor();
+
+ i=0;
+ while(i<99 && tmp[i]>32)i++;
+ tmp[i]=0; strcpy(st, &tmp[i+1]);
+ load_monst(tmp);
+
+ fprintf(mfp,
+ "<area shape=\"rect\" coords=\"%d,%d,%d,%d\" alt=\"%s\" href=%s>\n",
+ bx*WID + part_x*part_wx,
+ by*WID + part_y*part_wy,
+ bx*WID + part_x*part_wx + part_wx-1,
+ by*WID + part_y*part_wy + part_wy-1,
+ st, realname);
+
+ if(!strstr(st,"IGNORE_COMMENT")){
+ nuke=strstr(st,"/*");if(nuke)*nuke=0;
+ if (st && strcmp(st,"") != 0 && strcmp(st, "\n") != 0)
+ {
+ fprintf(sfp," TILEP_%s_%s,\n", part_name, st);
+ }
+ else
+ {
+ fprintf(sfp," FILLER_%s_%d,\n", part_name, part_n);
+ }
+
+ i=strlen(st);
+ strncpy(&comment[pos_comment],st,i);
+ part_comment_ofs[n_comments]=pos_comment;
+ pos_comment += i;
+ n_comments++;
+
+ // n_comments = pos_comment=0;
+ //int parts_comment_ofs[];
+ //int part_comment_ofs[MAXTOTAL];
+ //char comment[MAXTOTAL*60];
+ }
+ else
+ {
+ i=0;
+ part_comment_ofs[n_comments]=pos_comment;
+ pos_comment += i;
+ n_comments++;
+ }
+
+ part_n++;
+ part_x++;
+ if(part_x==part_nx)
+ {
+ part_x=0;
+ part_y++;
+ if(part_y==part_ny)
+ {
+ part_y=0;
+ bx++;
+ if(bx==xx0)
+ {
+ bx=0;
+ by++;
+ }
+ }
+ }
+
+ /* normal */
+
+ }/* while */
+ fclose(fp);
+}
+
+/********************************************/
+
+int main(int argc, char **argv)
+{
+
+ int i,j,k,l,m,n,fl;
+ char fn[100],st2[100];
+
+ slant=corpse=mesh=rim=0;
+
+ bx=by=0;
+
+ /* parts related */
+ parts_n=0;
+
+ part_x=part_y=0;
+ part_n=0;
+ part_wx=part_wy=32;
+ part_ox=part_oy=0;
+
+ /* comments */
+ n_comments = pos_comment=0;
+ //int parts_comment_ofs[];
+ //int part_comment_ofs[MAXTOTAL];
+ //char comment[MAXTOTAL*60];
+
+
+ process_cpath(argv[0]);
+
+ xx0=XX;
+ subsname[0]=0;
+ sdir[0]=0;
+ realname[0]=0;
+
+ stdpal();
+ fixalloc(tbuf,64*64);
+ fixalloc(dbuf,64*64);
+ fixalloc(fbuf,64*64);
+ fixalloc(obuf, 32*64*(64)*64);
+
+
+ strcpy(outname,"tile");
+
+ sprintf(fn,"%smap.htm",cpath);
+ mfp=fopen(fn,"w");
+ if(mfp==NULL){
+ printf("Error could not open %s\nHit return",fn);
+ getchar();
+ exit(1);
+ }
+
+ sprintf(fn,"%stiledef-p.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(mfp,"<HTML>\n");
+ fprintf(mfp,"<MAP NAME=\"nhmap\">\n");
+
+ printf("%s\ncpath=%s\n",argv[0],cpath);
+ if(argc==1)
+ sprintf(fn,"%sdc-pl.txt",cpath);
+ else
+ strcpy(fn,argv[1]);
+ process_config(fn);
+
+ if(part_n!=0)flush_part();
+
+ fprintf(sfp,"\n#define TILEP_TOTAL %d\n",bx+by*xx0);
+ fprintf(sfp,"#define TILEP_PER_ROW %d\n\n",xx0);
+
+ fprintf(sfp,"#define TILEP_PARTS_TOTAL %d\n\n",parts_n);
+
+ fprintf(sfp,"const int tilep_parts_start[TILEP_PARTS_TOTAL]=\n {");
+ for(i=0;i<parts_n-1;i++)fprintf(sfp," %d,",parts_start[i]);
+ fprintf(sfp," %d};\n",parts_start[parts_n-1]);
+
+ fprintf(sfp,"const int tilep_parts_total[TILEP_PARTS_TOTAL]=\n {");
+ for(i=0;i<parts_n-1;i++)fprintf(sfp," %d,",parts_number[i]);
+ fprintf(sfp," %d};\n",parts_number[parts_n-1]);
+
+ fprintf(sfp,"const int tilep_parts_ox[TILEP_PARTS_TOTAL]=\n {");
+ for(i=0;i<parts_n-1;i++)fprintf(sfp," %d,",parts_ox[i]);
+ fprintf(sfp," %d};\n",parts_ox[parts_n-1]);
+
+ fprintf(sfp,"const int tilep_parts_oy[TILEP_PARTS_TOTAL]=\n {");
+ for(i=0;i<parts_n-1;i++)fprintf(sfp," %d,",parts_oy[i]);
+ fprintf(sfp," %d};\n",parts_oy[parts_n-1]);
+
+ fprintf(sfp,"const int tilep_parts_nx[TILEP_PARTS_TOTAL]=\n {");
+ for(i=0;i<parts_n-1;i++)fprintf(sfp," %d,",parts_nx[i]);
+ fprintf(sfp," %d};\n",parts_nx[parts_n-1]);
+
+ fprintf(sfp,"const int tilep_parts_ny[TILEP_PARTS_TOTAL]=\n {");
+ for(i=0;i<parts_n-1;i++)fprintf(sfp," %d,",parts_ny[i]);
+ fprintf(sfp," %d};\n",parts_ny[parts_n-1]);
+
+ fclose(sfp);
+
+ sprintf(fn,"%stilep-cmt.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,"static const char *tilep_parts_name[%d]={\n",parts_n);
+ for(i=0;i<parts_n-1;i++)
+ {
+ fprintf(sfp," \"%s\",\n",parts_names[i]);
+ }
+ i=parts_n-1;
+ fprintf(sfp," \"%s\"\n};\n",parts_names[i]);
+
+
+ fprintf(sfp,"const int tilep_comment_ofs[TILEP_PARTS_TOTAL]= {\n");
+ for(i=0;i<parts_n-1;i++)fprintf(sfp," %d,",parts_comment_ofs[i]);
+ fprintf(sfp," %d};\n",parts_comment_ofs[parts_n-1]);
+
+ fprintf(sfp,"static const char *tilep_comment[%d]={\n",n_comments);
+ for(i=0;i<n_comments-1;i++)
+ {
+ int len=part_comment_ofs[i+1]-part_comment_ofs[i];
+ strncpy(st2, &comment[part_comment_ofs[i]],len);
+ st2[len]=0;
+ fprintf(sfp," \"%s\",\n",st2);
+ }
+ i=pos_comment-part_comment_ofs[n_comments-1];
+ strncpy(st2, &comment[part_comment_ofs[n_comments-1]],i);
+ st2[i]=0;
+ fprintf(sfp," \"%s\" };\n",st2);
+ fclose(sfp);
+
+ fprintf(mfp,"<IMG SRC=%s.bmp USEMAP=\"#nhmap\" >\n", outname);
+
+
+ fclose(mfp);
+ i=by*32;if(bx!=0)i+=32;
+
+ sprintf(fn,"%s%s.bmp",cpath,outname);
+ bmwrite(fn,xx0*32,i,obuf);
+
+}