home *** CD-ROM | disk | FTP | other *** search
/ Fun CD 26 / OTACD26.ISO / archive / game / tmspcv00 / tmspcv00.lzh / TMSPCV.C next >
Text File  |  1997-02-15  |  9KB  |  334 lines

  1. /*****************************************
  2.  *    ときめきメモリアル 対戦ぱずる玉    *<<Saturn版>>
  3.  *  画像コンバートプログラム  ver0.02β  *
  4.  * Programmed by Melody-Yoshi 1997/02/15 *
  5.  *****************************************/
  6. #include<stdio.h>
  7. #include<string.h>
  8. #include<stdlib.h>
  9. #define    MAXCHR 43
  10. static char *name[MAXCHR]={
  11. "FUJISAKI","KISARAGI","HIMOO","KATAGIRI","NIJINO",
  12. "KOSHIKI","KAGAMI","ASAHINA","MIKIHARA",
  13. "YUMI","KOARA","IJUIN","YOSHIO",
  14. "FUJ_INS","KIS_INS","HIM_INS","KAT_INS","NIJ_INS",
  15. "KOS_INS","KAG_INS","ASA_INS","MIK_INS",
  16. "YUM_INS","KOA_INS",
  17. "END_FUJI","END_KISA","END_HIMO","END_KATA","END_NIJI",
  18. "END_KOSI","END_KIYO","END_ASA","END_MIKI",
  19. "END_YUMI",
  20. "OPTION","OHAYOU","OPENING","STF_TIBI","END_PHOT",
  21. "START","RANKING","SELECT1","SELECT2"
  22. };
  23. static int ww[MAXCHR*2]={
  24. 200,240,200,240,200,240,200,240,200,240,
  25. 200,240,200,240,200,240,200,240,
  26. 200,240,200,240,200,240,200,240,
  27. 200,240,200,240,200,240,200,240,200,240,
  28. 200,240,200,240,200,240,200,240,
  29. 200,240,200,240,
  30. 320,240,320,240,320,240,320,240,320,240,
  31. 320,240,320,240,320,240,320,240,
  32. 320,240,
  33. 320,240,320,240,320,240,208, 96,320,240,
  34. 264,168,192, 64,320,160,160,200
  35. };
  36. static int ofs[MAXCHR*2]={
  37.  96,144, 96,144, 96,144, 96,144, 96,144,
  38.  96,144, 96,144, 96,144, 96,144,
  39.  96,144, 96,144, 96,144, 96,144,
  40.  96,144, 96,144, 96,144, 96,144, 96,144,
  41.  96,144, 96,144, 96,144, 96,144,
  42.  96,144, 96,144,
  43. 160,112,160,112,160,112,160,112,160,112,
  44. 160,112,160,112,160,112,160,112,
  45. 160,112,
  46. 144, 32, 80,144,192, 96, 48,24, 96,144,
  47. 128,112, 96, 32,152, 80, 72,160
  48. };
  49. unsigned char *by,*bf,*bz;
  50. int minp;
  51. unsigned adr[320];
  52. unsigned short dx[320],dy[320];
  53. short f16,nm;
  54. int wx,wy;
  55. FILE *fp;
  56. int readbeta(int,int),readbeta16(int,int),slidec1(int,int),slidec2(int,int);
  57. void writemem(short,short,int,int);
  58. void writelong(long),writeshort(short),writebmpdata(char *);
  59. main(int argc,char *argv[])
  60. {
  61.     int i,j,k,m,n,p,q,r,s,t;
  62.     short x,y;
  63.     char fn[64],fz[64];
  64.     if(argc<2){
  65.         printf("tmspcv file[.BIN]\n");exit(1);
  66.     }
  67.     strcpy(fn,argv[1]);
  68.     for(t=0;fn[t];t++)if(fn[t]=='.')break;
  69.     fn[t]=0;for(i=0;i<t;i++)if(fn[i]>='a' && fn[i]<='z')fn[i]-=0x20;
  70.     strcpy(fz,fn);strcat(fz,".BIN");
  71.     for(nm=0;nm<MAXCHR;nm++)if(strcmp(fn,name[nm])==0)break;
  72.     if(nm==MAXCHR){
  73.         printf("file cannot convert![%s]\n",fz);exit(1);
  74.     }
  75.     if((fp=fopen(fz,"rb"))==0){
  76.         printf("file open error.[%s]\n",fz);exit(1);
  77.     }
  78.     fseek(fp,0L,2);s=(int)ftell(fp);fseek(fp,0L,0);
  79.     bz=(unsigned char *)malloc(s);
  80.     if(bz==NULL){
  81.         printf("insufficient memory!\n");exit(1);
  82.     }
  83.     fread(bz,1,s,fp);fclose(fp);
  84.     by=(unsigned char *)malloc(0x44000);bf=(unsigned char *)malloc(0x1c000);
  85.     if(by==NULL || bf==NULL){
  86.         printf("insufficient memory!\n");exit(1);
  87.     }
  88.     for(i=0;i<t;i++)if(fn[i]>='A' && fn[i]<='Z')fn[i]+=0x20;
  89.     strcpy(fz,fn);strcat(fz,"000.bmp");
  90.     if(nm!=38){
  91.         p=bz[0]*256+bz[1];
  92.         if((p<16 || p>0x7FF)|| (!(bz[2]==0 && bz[3]==0 && bz[4]==0))){
  93.             printf("cannot convert this file.[%X]\n",p);exit(1);
  94.         }
  95.         p=p*2+12;
  96.         for(q=r=0;q<20;q++){
  97.             f16=bz[p+3];p+=4;
  98.             m=bz[p+26]*256+bz[p+27];                /* The number of Object */
  99.             j=bz[p+29]*65536+bz[p+30]*256+bz[p+31]+p;    /* DATA */
  100.             k=bz[p+33]*65536+bz[p+34]*256+bz[p+35];        /* DATA LENGTH*/
  101.             j-=m*2;if(j&3)j-=2;
  102.             for(i=n=0;i<m;i++,j+=2){
  103.                 adr[i]=n;dx[i]=bz[j];dy[i]=bz[j+1];n+=(bz[j] * bz[j+1]);
  104.             }
  105.             if(j&3)j+=2;
  106.             switch(f16){
  107.                 case 0:k=(nm!=37)?readbeta(j,k):readbeta16(j,k);break;    /*BETA*/
  108.                 case 1:k=slidec1(j,k);break;        /* 256press */
  109.                 case 2:k=slidec2(j,k);break;        /* 16press */
  110.                 default: printf("Illegal ID![%d]\n",f16);break;
  111.             }
  112.             n=bz[p+5]*65536+bz[p+6]*256+bz[p+7]+p;        /* TOC Start */
  113.             m=bz[p+9]*65536+bz[p+10]*256+bz[p+11]+p;    /* TOC End */
  114.             wx=ww[nm*2];wy=ww[nm*2+1];
  115.             for(;n!=m;n+=4){
  116.                 for(j=0;j<0x1c000;j++)bf[j]=0;
  117.                 for(minp=0xF00,j=bz[n+1]*65536+bz[n+2]*256+bz[n+3]+p;bz[j]!=0xFF;j+=8){
  118.                     i=(bz[j+2]*256+bz[j+3])&0x7FF;
  119.                     if(minp>i)minp=i;
  120.                 }
  121.                 if(nm==35 && r>0)minp+=0x100;        /* (--; */
  122.                 else if(nm==36 && r<34)minp+=0x400;
  123.                 else if(nm==40 && r>94)minp+=0x600;
  124.                 else if(nm==40 && r>44)minp+=0x400;
  125.                 else if(nm==41 && r>174)minp+=0x700;
  126.                 else if(nm==41 && r>151)minp+=0x600;
  127.                 else if(nm==41 && r>101)minp+=0x400;
  128.                 for(i=0,j=bz[n+1]*65536+bz[n+2]*256+bz[n+3]+p;bz[j]!=0xFF;j+=8,i++){
  129.                     x=(short)(bz[j+4]*256+bz[j+5]);y=(short)(bz[j+6]*256+bz[j+7]);
  130.                     writemem(x,y,bz[j]*256+bz[j+1],((bz[j+2]*256+bz[j+3])&0x7FF)-minp);
  131.                 }
  132.                 if(i==0)continue;
  133.                 if(nm==42)minp+=0x80*q;
  134.                 i=r;fz[t]=i/100+'0';i%=100;fz[t+1]=i/10+'0';fz[t+2]=i%10+'0';
  135.                 writebmpdata(fz);r++;
  136.             }
  137.             for(p=k+1;p<s;p++)if(bz[p]==0x2c)break;
  138.             if(p>=s)break;
  139.             else p-=7;
  140.         }
  141.     }
  142.     else{
  143.         for(wx=320,wy=240,r=p=0;r<23;r++,p+=0x13000){
  144.             for(y=i=0;y<240;y+=8){
  145.                 for(x=0;x<320;x+=8){
  146.                     for(n=0;n<8;n++){
  147.                         for(m=0;m<8;m++,i++)bf[y*320+x + m+n*320]=bz[i+p];
  148.                     }
  149.                 }
  150.             }
  151.             minp=(p+i-8)/2;
  152.             i=r;fz[t]=i/100+'0';i%=100;fz[t+1]=i/10+'0';fz[t+2]=i%10+'0';
  153.             writebmpdata(fz);
  154.         }
  155.     }
  156.     free(by);free(bf);free(bz);
  157.     exit(0);
  158. }
  159. int readbeta(int p,int e)
  160. {
  161.     int i;
  162.     for(i=0;i<e;i++,p++)by[i]=bz[p];
  163.     return(p);
  164. }
  165. int readbeta16(int p,int e)
  166. {
  167.     int i;
  168.     for(i=0;i<e;i++,p++){
  169.         by[i<<1]=bz[p]>>4;by[(i<<1)+1]=bz[p]&15;
  170.     }
  171.     return(p);
  172. }
  173. int slidec1(int p,int e)
  174. {
  175.     int i,j,w;
  176.     w=0;
  177.     while(e>w){
  178.         i=bz[p++];
  179.         if(i&0x80){
  180.             by[w++]=i&0x1F;
  181.             j=bz[p++];
  182.             by[w++]=((i&0x40)>>2)|(j&0x0F);by[w++]=((i&0x20)>>1)|(j>>4);
  183.         }
  184.         else{
  185.             switch(i&0x70){
  186.                 case 0x00:
  187.                 case 0x10:
  188.                         j=i&0x1F;by[w++]=j;
  189.                         break;
  190.                 case 0x20:
  191.                 case 0x30:
  192.                 case 0x40:
  193.                 case 0x50:
  194.                         j=i&0x1F;
  195.                         for(i=(i>>6)+2;i>0;i--,w++)by[w]=j;
  196.                         break;
  197.                 case 0x60:
  198.                 case 0x70:
  199.                         j=i&0x1F;
  200.                         for(i=bz[p++]+1;i>0;i--,w++)by[w]=j;
  201.                         break;
  202.             }
  203.         }
  204.     }
  205.     return(p);
  206. }
  207. int slidec2(int p,int e)
  208. {
  209.     int i,j,w;
  210.     w=0;
  211.     while(e>w){
  212.         i=bz[p++];
  213.         if((i&0x80)==0x80){
  214.             for(i=(i&0x7F)+1;i>0;i--,w++,p++)by[w]=bz[p];
  215.         }
  216.         else{
  217.             j=i&0x0F;j|=(j<<4);
  218.             if((i&0x70)==0x70){
  219.                 for(i=0;i<9;i++,w++)by[w]=j;
  220.                 for(i=bz[p++]-8;i>0;i--,w++)by[w]=j;
  221.             }
  222.             else{
  223.                 for(i=(i>>4)+2;i>0;i--,w++)by[w]=j;
  224.             }
  225.         }
  226.     }
  227.     return(p);
  228. }
  229. void writemem(short x,short y,int n,int m)
  230. {
  231.     int i,j,k,r,plus;
  232.     x+=ofs[nm*2];y+=ofs[nm*2+1];
  233.     r=n&0x6000;n&=0x3FF;
  234. #ifdef    DEBUG
  235.     if(x<0)fprintf(stderr,"<<%d>>",x);
  236.     if(y<0)fprintf(stderr,"[[%d]]",y);
  237.     if(x+dx[n]>wx)fprintf(stderr,"<<%d %d>>",x,dx[n]);
  238.     if(y+dy[n]>wy)fprintf(stderr,"[[%d %d]]",y,dy[n]);
  239. #endif
  240.     if(f16<2){        /* 256color */
  241.         if(r&0x4000){
  242.             for(i=j=0;j<dy[n];j++){
  243.                 if(y+j<0 || y+j>=wy)continue;
  244.                 for(k=0,i+=dx[n]-1;k<dx[n];k++,i--){
  245.                     if(x+k<0 || x+k>=wx)continue;
  246.                     if(by[adr[n]+i])bf[(y+j)*wx+k+x]=by[adr[n]+i]+m;
  247.                 }
  248.                 i+=dx[n]+1;
  249.             }
  250.         }
  251.         else{
  252.             for(i=j=0;j<dy[n];j++){
  253.                 if(y+j<0 || y+j>=wy)continue;
  254.                 for(k=0;k<dx[n];k++,i++){
  255.                     if(x+k<0 || x+k>=wx)continue;
  256.                     if(by[adr[n]+i])bf[(y+j)*wx+k+x]=by[adr[n]+i]+m;
  257.                 }
  258.             }
  259.         }
  260.     }
  261.     else{
  262.         if(r&0x2000){
  263.             for(i=0,j=dy[n]-1;j>=0;j--){
  264.                 if(y+j<0 || y+j>=wy)continue;
  265.                 for(k=0;k<dx[n];k+=2,i++){
  266.                     if(x+k<0 || x+k>=wx)continue;
  267.                     if(by[adr[n]/2+i]>>4)bf[(y+j)*wx+k+x]=(by[(adr[n]/2+i)]>>4)+m;
  268.                     if(by[adr[n]/2+i]&15)bf[(y+j)*wx+k+1+x]=(by[(adr[n]/2+i)]&15)+m;
  269.                 }
  270.             }
  271.         }
  272.         else{
  273.             for(i=j=0;j<dy[n];j++){
  274.                 if(y+j<0 || y+j>=wy)continue;
  275.                 for(k=0;k<dx[n];k+=2,i++){
  276.                     if(x+k<0 || x+k>=wx)continue;
  277.                     if(by[adr[n]/2+i]>>4)bf[(y+j)*wx+k+x]=(by[(adr[n]/2+i)]>>4)+m;
  278.                     if(by[adr[n]/2+i]&15)bf[(y+j)*wx+k+1+x]=(by[(adr[n]/2+i)]&15)+m;
  279.                 }
  280.             }
  281.         }
  282.     }
  283. }
  284. /* WRITE BMP DATA */
  285. void writebmpdata(char *fn)
  286. {
  287.     short i;
  288.     unsigned short k;
  289.     if((fp=fopen(fn,"wb"))==0){
  290.         printf("file create error![%s]",fn);exit(1);
  291.     }
  292.     fputc('B',fp);fputc('M',fp);    /* ID */
  293.     writelong(1078L+(long)wx*(long)wy);    /* FILE SIZE */
  294.     writelong(0L);                    /* RESERVED */
  295.     writelong(1078L);                /* IMAGE OFFSET */
  296.     writelong(40L);                    /* INFO SIZE */
  297.     writelong((long)wx);            /* dx */
  298.     writelong((long)wy);            /* dy */
  299.     writeshort(1);                    /* PLAIN */
  300.     writeshort(8);                    /* DEPTH */
  301.     writelong(0L);                    /* COMPRESS TYPE */
  302.     writelong(0L);
  303.     writelong(0L);                    /* x per meter */
  304.     writelong(0L);                    /* y per meter */
  305.     writelong(256L);                /* COLOR */
  306.     writelong(0L);
  307.     for(i=0;i<256;i++){
  308.         k=(bz[i*2+minp*2+8]<<8)+bz[i*2+minp*2+9];
  309.         fputc((k&0x7c00)>>7,fp);        /* BLUE */
  310.         fputc((k&0x3e0)>>2,fp);            /* GREEN */
  311.         fputc((k&0x1f)<<3,fp);            /* RED */
  312.         fputc(0,fp);
  313.     }
  314.     for(i=wy-1;i>=0;i--){
  315.         if(fwrite(&bf[i*wx],1,wx,fp)!=wx){
  316.             printf("file write error!\n");exit(1);
  317.         }
  318.     }
  319.     fclose(fp);
  320. }
  321. /* WRITE SHORT VALUE */
  322. void writeshort(short n)
  323. {
  324.     fputc(n&255,fp);fputc((n>>8)&255,fp);
  325. }
  326. /* WRITE LONG VALUE */
  327. void writelong(long n)
  328. {
  329.     fputc((int)(n&255),fp);n/=256L;
  330.     fputc((int)(n&255),fp);n/=256L;
  331.     fputc((int)(n&255),fp);n/=256L;
  332.     fputc((int)(n&255),fp);
  333. }
  334.