home *** CD-ROM | disk | FTP | other *** search
/ Fun CD 26 / OTACD26.ISO / archive / game / nextk / nextk.lzh / NEXTK.C next >
C/C++ Source or Header  |  1997-07-07  |  4KB  |  169 lines

  1. /******************************
  2.  * ネクストキング BMP変換 *
  3.  * Programmed By Melody-Yoshi *
  4.  ******************************/
  5. #include<stdio.h>
  6. #include<string.h>
  7. #include<stdlib.h>
  8. unsigned char *mem,*by,*bz,pal[512];
  9. FILE *fp,*fo;
  10. struct tbs{
  11.     int p,size,f;
  12. };
  13. typedef struct tbs* tb;
  14. tb tbp;
  15. int xwide,ywide,xseek,xpad;
  16. void writebmphead08(short);
  17. void writelong(long),writeshort(short);
  18. void analyze(char *,int),copyn88(int,int,int,int);
  19. int decode(int,int);
  20. void main(int argc,char *argv[])
  21. {
  22.     char fn[64],fz[64];
  23.     int i,fsize;
  24.     if(argc<2){
  25.         printf("nextk [file].bin\n");exit(1);
  26.     }
  27.     strcpy(fn,argv[1]);for(i=0;fn[i];i++)if(fn[i]=='.')break;
  28.     strcpy(&fn[i],".bin");
  29.     if((fp=fopen(fn,"rb"))==0){
  30.         printf("file open error![%s]\n",fn);exit(1);
  31.     }
  32.     strcpy(fz,fn);
  33.     for(fz[i]=0;i>=0;i--)if(fz[i]==':' || fz[i]=='\\')break;
  34.     strcpy(fn,&fz[i+1]);
  35.     fseek(fp,0L,2);fsize=ftell(fp);fseek(fp,0L,0);
  36.     bz=(unsigned char *)malloc(0x28000);
  37.     by=(unsigned char *)malloc(0x28000);
  38.     mem=(unsigned char *)malloc(fsize+16);
  39.     if(mem==NULL || bz==NULL || by==NULL){
  40.         printf("insufficient memory!\n");exit(1);
  41.     }
  42.     fread(mem,1,fsize,fp);fclose(fp);
  43.     analyze(fn,fsize);
  44.     exit(0);
  45. }
  46. void analyze(char *fn,int fsize)
  47. {
  48.     int cnt,i,j,k,q,s,dx,dy,sx,sy;
  49.     char fz[64],fs[4];
  50.     fs[2]=0;cnt=mem[0]|(mem[1]<<8);
  51.     tbp=(tb)malloc(sizeof(struct tbs)*cnt);
  52.     for(q=4,i=0;i<cnt;i++,q+=4){
  53.         tbp[i].f=0;tbp[i].p=mem[q]|(mem[q+1]<<8)|(mem[q+2]<<16);
  54.     }
  55.     for(i=0;i<cnt-1;i++)tbp[i].size=tbp[i+1].p-tbp[i].p;
  56.     tbp[i].size=fsize-tbp[i].p;
  57.     for(i=0;i<cnt;i++)if(tbp[i].size==0x204)tbp[i].f=1;
  58.     xwide=320;
  59.     for(i=j=0;i<cnt;i++){
  60. #ifdef DEBUG
  61. for(s=0;s<8;s++)fprintf(stderr,"%2X ",mem[tbp[i].p+s]);
  62. fprintf(stderr,"\n");
  63. #endif
  64.         if(tbp[i].f)continue;
  65.         q=tbp[i].p;dx=(mem[q]|(mem[q+1]<<8))*2;dy=mem[q+2]+((mem[q+3]&1)<<8);
  66.         if((mem[q+3]&0xFC)!=0x40)continue;
  67.         sx=(mem[q+4]|(mem[q+5]<<8));sy=(mem[q+6]|(mem[q+7]<<8));
  68.         if(sx>320)sx=0;
  69.         if(sy>256)sy=0;
  70.         ywide=(sy+dy>240)?sy+dy:240;
  71.         decode(q+8,dx*dy);
  72.         for(s=0;s<cnt;s++)if(tbp[s].f)break;
  73.         if(dx==320 && dy>=240 && j){
  74.             for(s++;s<cnt;s++)if(tbp[s].f)break;
  75.         }
  76.         if(s==cnt)continue;
  77.         copyn88(sx,sy,dx,dy);
  78.         for(k=0,q=tbp[s].p+4;k<512;k++,q++)pal[k]=mem[q];
  79.         fs[0]=j/16+'0';if(fs[0]>0x39)fs[0]+=7;
  80.         fs[1]=(j&15)+'0';j++;if(fs[1]>0x39)fs[1]+=7;
  81.         xseek=xwide;xpad=(4-(xseek&3))&3;xseek+=xpad;
  82.         strcpy(fz,fn);strcat(fz,fs);strcat(fz,".BMP");
  83.         if((fo=fopen(fz,"wb"))==0){
  84.             printf("file create error![%s]\n",fz);exit(1);
  85.         }
  86.         writebmphead08(256);
  87.         for(s=ywide-1;s>=0;s--){
  88.             fwrite(&by[s*xwide],1,xwide,fo);
  89.             for(k=0;k<xpad;k++)fputc(0,fo);
  90.         }
  91.         fclose(fo);
  92.     }
  93.     free(tbp);
  94. }
  95. int decode(int r,int dl)
  96. {
  97.     int k,m,p,cnt,dist;
  98.     for(p=k=0;p<dl;k>>=1){
  99.         if((k&0xFF00)==0)k=mem[r++]|0xFF00;
  100.         if(k&1)bz[p++]=mem[r++];
  101.         else{
  102.             k>>=1;if((k&0xFF00)==0)k=mem[r++]|0xFF00;
  103.             m=mem[r++];
  104.             if(k&1){
  105.                 cnt=((m&0xC0)>>6)+2;dist=(m&0x3F)-64;
  106.             }
  107.             else{
  108.                 m=(m<<8)|mem[r++];cnt=((m&0xF000)>>12)+2;dist=(m&0xFFF)-4096;
  109.                 if(cnt==2){
  110.                     cnt=mem[r++]+2;if(cnt==2)k=cnt=0;
  111.                 }
  112.             }
  113.             for(m=0;m<cnt;m++,p++)bz[p]=bz[p+dist];
  114.         }
  115.     }
  116.     return(p);
  117. }
  118. void copyn88(int sx,int sy,int dx,int dy)
  119. {
  120.     int i,j,k,m;
  121.     for(i=xwide*ywide-1;i>=0;i--)by[i]=0;
  122.     for(i=k=0;i<dy;i++){
  123.         m=(sy+i)*xwide+sx;
  124.         for(j=0;j<dx;j++,k++)by[m+j]=bz[k];
  125.     }
  126. }
  127. /* WRITE BMP HEADER */
  128. void writebmphead08(short c)
  129. {
  130.     short i;
  131.     unsigned short k;
  132.     fputc('B',fo);fputc('M',fo);    /* ID */
  133.     writelong((long)c*4L+54L+(long)(xwide+xpad)*(long)ywide);    /* FILE SIZE */
  134.     writelong(0L);                    /* RESERVED */
  135.     writelong((long)c*4L+54L);        /* IMAGE OFFSET */
  136.     writelong(40L);                    /* INFO SIZE */
  137.     writelong((long)xwide);            /* dx */
  138.     writelong((long)ywide);            /* dy */
  139.     writeshort(1);                    /* PLAIN */
  140.     if(c==256)writeshort(8);        /* DEPTH */
  141.     else writeshort(4);    
  142.     writelong(0L);                    /* COMPRESS TYPE */
  143.     writelong(0L);
  144.     writelong(0L);                    /* x per meter */
  145.     writelong(0L);                    /* y per meter */
  146.     writelong((long)c);                /* COLOR */
  147.     writelong(0L);
  148.     for(i=0;i<c;i++){
  149.         k=pal[i*2]+(pal[i*2+1]<<8);
  150.         fputc((k&0x7c00)>>7,fo);        /* BLUE */
  151.         fputc((k&0x3e0)>>2,fo);            /* GREEN */
  152.         fputc((k&0x1f)<<3,fo);            /* RED */
  153.         fputc(0,fo);
  154.     }
  155. }
  156. /* WRITE SHORT VALUE */
  157. void writeshort(short n)
  158. {
  159.     fputc(n&255,fo);fputc((n>>8)&255,fo);
  160. }
  161. /* WRITE LONG VALUE */
  162. void writelong(long n)
  163. {
  164.     fputc((int)(n&255),fo);n/=256L;
  165.     fputc((int)(n&255),fo);n/=256L;
  166.     fputc((int)(n&255),fo);n/=256L;
  167.     fputc((int)(n&255),fo);
  168. }
  169.