home *** CD-ROM | disk | FTP | other *** search
/ Fun CD 26 / OTACD26.ISO / archive / game / yunaiw / yunaiw.lzh / YUNAIW.C next >
C/C++ Source or Header  |  1996-12-21  |  3KB  |  133 lines

  1. /******************************
  2.  *     銀河お嬢様伝説ユナ     *
  3.  * Mika Akitaka・イラストワークス 変換 *
  4.  * Programmed By Melody-Yoshi *
  5.  ******************************/
  6. #include<stdio.h>
  7. #include<string.h>
  8. #include<stdlib.h>
  9. unsigned char *bz,*bf,*tb;
  10. char fn[32],fz[32];
  11. int xwide,ywide;
  12. FILE *fp,*fo;
  13. long getlong(void);
  14. void outbmp(void),writeshort(short),writelong(long);
  15. void slidec(void),outcg(void),cgxtofrm(void);
  16.  
  17. void main(int argc,char *argv[])
  18. {
  19.     int i,j,k;
  20.     if(argc<2){
  21.         printf("yunaiw <cd-drive>\n");exit(1);
  22.     }
  23.     fn[0]=argv[1][0];strcpy(&fn[1],":\\yuna.fat");
  24.     if((fp=fopen(fn,"rb"))==0){
  25.         printf("file open error![%s]\n",fn);exit(1);
  26.     }
  27.     fseek(fp,0L,2);i=(int)ftell(fp);fseek(fp,0L,0);
  28.     tb=(unsigned char *)malloc(i);fread(tb,1,i,fp);fclose(fp);
  29.         if((bz=(unsigned char *)malloc(640*480*2))==NULL){
  30.         printf("insufficient memory!\n");exit(1);
  31.     }
  32.     if((bf=(unsigned char *)malloc(640*480*2))==NULL){
  33.         printf("insufficient memory!\n");exit(1);
  34.     }
  35.     for(j=0;j<i;j+=32){
  36.         for(k=0;tb[j+k];k++)fn[k+3]=tb[j+k];
  37.         fn[k+3]=0;xwide=tb[j+19]<<3;ywide=tb[j+21]<<3;
  38.         if(xwide<1 || ywide<1 || tb[j+7])continue;
  39.         if((fp=fopen(fn,"rb"))==0){
  40.             printf("file open error.[%s]\n",fn);exit(1);
  41.         }
  42.         if(tb[j+5]==tb[j+9] && tb[j+6]==tb[j+10])fread(bf,1,xwide*ywide*2,fp);
  43.         else slidec();
  44.         fclose(fp);cgxtofrm();for(k=0;tb[j+k];k++)fz[k]=tb[j+k];
  45.         fz[k]=0;outbmp();
  46.     }
  47.     free(bf);free(bz);free(tb);exit(0);
  48. }
  49. void slidec(void)
  50. {
  51.     int i,k,m,p,cnt,dist;
  52.     i=(xwide*ywide)<<1;
  53.     for(p=k=0;p<i;k>>=1){
  54.         if((k&0xFF00)==0){
  55.             k=fgetc(fp);if(k==EOF)break;
  56.             k|=0xFF00;
  57.         }
  58.         if(k&1)bf[p++]=fgetc(fp);
  59.         else{
  60.             m=fgetc(fp);m+=fgetc(fp)*256;
  61.             cnt=((m&0xF800)>>11)+1;dist=(m&0x7FF)-0x800+p;
  62.             for(m=0;m<cnt;m++)bf[p++]=bf[dist++];
  63.         }
  64.     }
  65. }
  66. void cgxtofrm(void)
  67. {
  68.     int i,j,x,y,z;
  69.     for(y=z=0;y<ywide;y+=8){
  70.         for(x=0;x<xwide;x+=8){
  71.             for(j=0;j<8;j++){
  72.                 for(i=0;i<8;i++){
  73.                     bz[((y+j)*xwide+x+i)*2]=bf[z++];
  74.                     bz[((y+j)*xwide+x+i)*2+1]=bf[z++];
  75.                 }
  76.             }
  77.         }
  78.     }
  79. }
  80. void outbmp(void)
  81. {
  82.     int i,k,x,y,r1,g1,b1,r2,g2,b2;
  83.     strcat(fz,".bmp");
  84.     if((fo=fopen(fz,"wb"))==0){
  85.         printf("file create errror.[%s]\n",fz);exit(1);
  86.     }
  87.     fputc('B',fo);fputc('M',fo);    /* ID */
  88.     writelong(54L+(long)(xwide*ywide*3));
  89.     writelong(0L);                    /* RESERVED */
  90.     writelong(54L);                    /* IMAGE OFFSET */
  91.     writelong(40L);                    /* INFO SIZE */
  92.     writelong((long)xwide);
  93.     writelong((long)ywide);            /* dy */
  94.     writeshort(1);                    /* PLAIN */
  95.     writeshort(24);                    /* DEPTH */
  96.     writelong(0L);                    /* COMPRESS TYPE */
  97.     writelong(0L);
  98.     writelong(0L);                    /* x per meter */
  99.     writelong(0L);                    /* y per meter */
  100.      writelong(0L);
  101.      writelong(0L);
  102.     for(y=ywide-1;y>=0;y--){
  103.         for(x=0,k=y*xwide*2;x<xwide;x++,k+=2){
  104.             i=bz[k]*256+bz[k+1];
  105.             fputc((i&0x7C00)>>7,fo);
  106.             fputc((i&0x3E0)>>2,fo);
  107.             fputc((i&0x1f)<<3,fo);
  108.         }
  109.     }
  110.     fclose(fo);
  111. }
  112. /* READ LONG VALUE */
  113. long getlong(void)
  114. {
  115.     long i;
  116.     i=(long)fgetc(fp);i+=(long)fgetc(fp)*0x100L;
  117.     i+=(long)fgetc(fp)*0x10000L;i+=(long)fgetc(fp)*0x1000000L;
  118.     return(i);
  119. }
  120. /* WRITE SHORT VALUE */
  121. void writeshort(short n)
  122. {
  123.     fputc(n&255,fo);fputc((n>>8)&255,fo);
  124. }
  125. /* WRITE LONG VALUE */
  126. void writelong(long n)
  127. {
  128.     fputc((int)(n&255),fo);n/=256L;
  129.     fputc((int)(n&255),fo);n/=256L;
  130.     fputc((int)(n&255),fo);n/=256L;
  131.     fputc((int)(n&255),fo);
  132. }
  133.